_prim: a partial project-scope adapter copy is misreported as a capability boundary, silently ungating releases #416
Labels
No labels
component:adapters
component:lifecycle
component:qa
component:setup
component:shared
component:worktrees
phase/accepted
phase/backlog
phase/deployed
phase/developing
phase/integrating
phase/planning
phase/qa
phase/requirements
phase/uat
priority:critical
priority:critical
priority:high
priority:high
priority:low
priority:low
priority:medium
priority:medium
type:bug
type:chore
type:docs
type:feature
type:infra
type:tech-debt
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
jbr870/devwork-skills#416
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Deferred from #47 QA round 1, finding
CR-13(qa-report:v1domain=code phase=validate, comment 2201). Dispositiondefer-to-issue, decided by the operator on 2026-08-26.The gap
_priminplugin/skills/_shared/procedures/bin/_lib.shclassifies a missing primitive against$ADAPTER_BIN, which is resolved to the first candidate directory that exists (project scope → bundled → user). The classification itself is correct and well-tested (#47 AC-9/AC-10/AC-15); the question is what it is classifying against.A stale or partial project-scope copy of an adapter — say a vendored
glab-clipredating #47, missingpipeline_status.sh— shadows the complete bundled adapter._primthen finds no script, sees a capability-gated primitive, and reportsEXIT_UNSUPPORTED: "this forge cannot do that, and the adapter declares it by shipping no primitive for it."Why it matters
That is a broken install misread as a capability boundary — precisely the fail-open that #47's gated-but-not-executable branch (AC-15) was written to prevent, arriving by a different route. The consequence is not an error:
/dev:promoteprints the reassuring skip line and tags ungated, on every release for that project.The existing defences do not cover it. AC-15 catches a present-but-non-executable primitive. AC-10 catches an absent required primitive. Neither can tell "this adapter genuinely ships no pipeline reporting" from "this copy of the adapter is incomplete", because absence-on-disk is deliberately the declaration (contract §2.2).
Possible directions (not yet decided)
$ADAPTER_BINagainst the adapter's own declaredcapabilities:/operations:manifest: a primitive declared non-unsupportedbut absent on disk is a broken install, whatever scope it resolved from. This also subsumes the manifest-vs-disk parity gap already filed from #47 (see the sibling issue for findingF-PO-47-3-1) — consider folding the two.Why it was not fixed in #47
It touches adapter resolution, a surface #47 does not otherwise change, and its regression surface is every skill that dispatches a primitive rather than the pipeline path alone.
Filed by QA round 1 on issue #47. Component:
component:shared+component:adapters. Related: the sibling issue filed forF-PO-47-3-1(manifest-vs-disk parity) — these two may be one change.