Category: improvement (operational)
Lane that hit it: triage
Triggering example
Autonomous triage lane invoked as /work-items:triage from a home directory (C:\Users\KyleSexton, not a git repo) targeting the remote melodic-software/claude-code-plugins. The provider mutations (label edits, comments, list) route fine through gh -R <repo>, but two skill steps assume a local project checkout that did not exist:
- Role-label resolution (
reference/tracker-seam.md "Role-label resolution is an action-entry invariant"): reads .work-item-tracker.json at the project root to resolve canonical roles from config.role_labels. With no checkout, there is no binding file — the action silently falls back to documented defaults (agent-ready/needs-human/recurring). Here the defaults happened to match the repo's live labels, but a repo that remapped roles would be queried under the wrong strings with no signal.
- Redundancy / rejected-concept check (triage workflow step 1): "search the codebase for an existing implementation" and match against
docs/out-of-scope/. Neither is possible without a working tree; I had to manually git clone the repo to run these, which the skill never instructs.
What happened vs. what should happen
- Happened: skill assumes it runs inside the consuming repo; a remote-only / no-checkout invocation degrades silently (role defaults) or is blocked (redundancy/codebase search) with no documented remediation. The operator improvises a clone.
- Should: either (a) document that these lanes require a local checkout and stop with a clear remediation when
CLAUDE_PROJECT_DIR/git-toplevel is absent (mirroring the existing jq/seam presence checks), or (b) define a remote-repo mode where the binding + codebase checks resolve against a fetched/target repo. Silent role-default fallback in particular should be an explicit warning, not silent.
Scope note
Affects triage (redundancy + role resolution) and work (frontier/claim also read the binding). track/decompose likely too. The seam presence-check pattern already exists for jq and the dispatcher — this is the same class of missing entry-invariant for "am I in a resolvable project context".
Category: improvement (operational)
Lane that hit it: triage
Triggering example
Autonomous triage lane invoked as
/work-items:triagefrom a home directory (C:\Users\KyleSexton, not a git repo) targeting the remotemelodic-software/claude-code-plugins. The provider mutations (label edits, comments, list) route fine throughgh -R <repo>, but two skill steps assume a local project checkout that did not exist:reference/tracker-seam.md"Role-label resolution is an action-entry invariant"): reads.work-item-tracker.jsonat the project root to resolve canonical roles fromconfig.role_labels. With no checkout, there is no binding file — the action silently falls back to documented defaults (agent-ready/needs-human/recurring). Here the defaults happened to match the repo's live labels, but a repo that remapped roles would be queried under the wrong strings with no signal.docs/out-of-scope/. Neither is possible without a working tree; I had to manuallygit clonethe repo to run these, which the skill never instructs.What happened vs. what should happen
CLAUDE_PROJECT_DIR/git-toplevel is absent (mirroring the existingjq/seam presence checks), or (b) define a remote-repo mode where the binding + codebase checks resolve against a fetched/target repo. Silent role-default fallback in particular should be an explicit warning, not silent.Scope note
Affects
triage(redundancy + role resolution) andwork(frontier/claim also read the binding).track/decomposelikely too. The seam presence-check pattern already exists forjqand the dispatcher — this is the same class of missing entry-invariant for "am I in a resolvable project context".