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
- 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.
- 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.
- Do not create symlinks whose target does not exist — if the source is missing, skip the bridge and say so once.
- 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.
Summary
On a machine where Paseo is installed as the desktop app (Paseo.app 0.4.0),
gjc setup paseo --checkcan never reach a clean verdict. The skill bridge assumes (a) a hardcoded skill-name allowlist and (b)~/.agents/skillsas the only source directory. Neither holds for an app install, so every reachable state reports drift and exits1.The ACP provider itself works — this is only the skills bridge and its
--checkverdict.Environment
gjc/0.14.0(compiled binary,~/.local/bin/gjc)/Applications/Paseo.app), daemon0.4.0; nopaseoCLI onPATH~/.paseo/config.json(app config), provideragents.providers.gjcinstalled bygjc setup paseoWhat GJC expects vs. what Paseo 0.4.0 ships
GJC's allowlist is hardcoded in the binary:
The installed Paseo app ships its skills inside the bundle, and the set does not match:
paseo-loop— in GJC's allowlist, not shipped by Paseo 0.4.0paseo-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 installReproduction: every reachable state is drift
1. Fresh app install (
~/.agents/skillsabsent) —gjc setup paseostill creates 5 symlinks into a directory that does not exist:2. Provide the source directory from the app bundle (
~/.agents/skills/<name> -> /Applications/Paseo.app/Contents/Resources/skills/<name>for all 5 shipped skills):3. Delete the un-satisfiable
paseo-looplink — the check flips to the opposite complaint:~/.gjc/agent/paseo/provenance.jsonpins the same list, so re-runninggjc setup paseorestores the danglingpaseo-looplink:{ "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 isgjc setup paseo --remove, which also removes the provider registration.Expected
gjc setup paseo --checkshould be able to reportpasson a supported, unmodified Paseo installation.Suggested fix
--checkpermanently red./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.unlinked-skillto 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 paseothe 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--checkuseless for detecting real drift on these machines.