Skip to content

bug(setup paseo): skill bridge can never reach a clean --check against Paseo desktop 0.4.0 (hardcoded allowlist + missing ~/.agents/skills) #4638

Description

@lotgood

Summary

On a machine where Paseo is installed as the desktop app (Paseo.app 0.4.0), gjc setup paseo --check can never reach a clean verdict. The skill bridge assumes (a) a hardcoded skill-name allowlist and (b) ~/.agents/skills as the only source directory. Neither holds for an app install, so every reachable state reports drift and exits 1.

The ACP provider itself works — this is only the skills bridge and its --check verdict.

Environment

  • gjc/0.14.0 (compiled binary, ~/.local/bin/gjc)
  • macOS 27.0.0, arm64
  • Paseo desktop app 0.4.0 (/Applications/Paseo.app), daemon 0.4.0; no paseo CLI on PATH
  • ~/.paseo/config.json (app config), provider agents.providers.gjc installed by gjc setup paseo

What GJC expects vs. what Paseo 0.4.0 ships

GJC's allowlist is hardcoded in the binary:

$ strings -a ~/.local/bin/gjc | grep -o 'eq_=\["paseo".*'
eq_=["paseo","paseo-advisor","paseo-committee","paseo-handoff","paseo-loop"]

The installed Paseo app ships its skills inside the bundle, and the set does not match:

$ ls /Applications/Paseo.app/Contents/Resources/skills
paseo  paseo-advisor  paseo-committee  paseo-handoff  paseo-help

$ ls ~/.agents/skills
ls: /Users/<me>/.agents/skills: No such file or directory
  • paseo-loop — in GJC's allowlist, not shipped by Paseo 0.4.0
  • paseo-help — shipped by Paseo 0.4.0, not in GJC's allowlist
  • ~/.agents/skills — GJC's only bridge source, does not exist for a desktop-app install

Reproduction: every reachable state is drift

1. Fresh app install (~/.agents/skills absent)gjc setup paseo still creates 5 symlinks into a directory that does not exist:

$ gjc setup paseo
✓ GJC registered with Paseo
  updated ~/.gjc/agent/paseo-skills
  updated config.yml skills.customDirectories

$ gjc setup paseo --check
✘ Paseo setup has drifted
  orphan-skill: ~/.gjc/agent/paseo-skills/paseo-loop -- bridge symlink target no longer exists
  orphan-skill: ~/.gjc/agent/paseo-skills/paseo -- bridge symlink target no longer exists
  orphan-skill: ~/.gjc/agent/paseo-skills/paseo-committee -- bridge symlink target no longer exists
  orphan-skill: ~/.gjc/agent/paseo-skills/paseo-handoff -- bridge symlink target no longer exists
  orphan-skill: ~/.gjc/agent/paseo-skills/paseo-advisor -- bridge symlink target no longer exists
# exit 1

2. Provide the source directory from the app bundle (~/.agents/skills/<name> -> /Applications/Paseo.app/Contents/Resources/skills/<name> for all 5 shipped skills):

$ gjc setup paseo --check
✘ Paseo setup has drifted
  orphan-skill: ~/.gjc/agent/paseo-skills/paseo-loop -- bridge symlink target no longer exists
  unlinked-skill: ~/.agents/skills/paseo-help -- Paseo skill is outside GJC's locked bridge allowlist
# exit 1

3. Delete the un-satisfiable paseo-loop link — the check flips to the opposite complaint:

$ rm ~/.gjc/agent/paseo-skills/paseo-loop && gjc setup paseo --check
✘ Paseo setup has drifted
  missing-bridge-link: ~/.gjc/agent/paseo-skills/paseo-loop -- bridge symlink is missing
  unlinked-skill: ~/.agents/skills/paseo-help -- Paseo skill is outside GJC's locked bridge allowlist
# exit 1

~/.gjc/agent/paseo/provenance.json pins the same list, so re-running gjc setup paseo restores the dangling paseo-loop link:

{
  "bridgePath": "/Users/<me>/.gjc/agent/paseo-skills",
  "bridgeEntries": ["paseo", "paseo-advisor", "paseo-committee", "paseo-handoff", "paseo-loop"],
  "bridgeDirCreated": false
}

There is no --no-skills / bridge-only opt-out; the only escape is gjc setup paseo --remove, which also removes the provider registration.

Expected

gjc setup paseo --check should be able to report pass on a supported, unmodified Paseo installation.

Suggested fix

  1. Derive bridge entries from what the source actually contains instead of a compiled-in name list — a Paseo release that adds or drops an orchestration skill must not turn --check permanently red.
  2. Discover the desktop app's skill directory. For app installs the skills live at /Applications/Paseo.app/Contents/Resources/skills ($PASEO_APP/Contents/Resources/skills), not ~/.agents/skills. Today GJC silently creates dangling symlinks into a non-existent directory, which is worse than skipping the bridge.
  3. Do not create symlinks whose target does not exist — if the source is missing, skip the bridge and say so once.
  4. Downgrade unlinked-skill to informational. A Paseo skill that GJC does not bridge is not drift in GJC's own installation; the allowlist should not make a newer Paseo version look broken.

Impact

Cosmetic but misleading: after a fully successful gjc setup paseo the verification command a user is told to run reports failure with exit code 1, and there is no action that makes it pass. It also makes --check useless for detecting real drift on these machines.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions