fix(consumer): make the adoption skill runnable, and execute what .gds declares - #182
Merged
Merged
Conversation
…s declares ci-consumer-adoption says "This is the *caller* side" and then opened with .venv/bin/python and scripts/... -- paths inside this repository. An agent following it in a consumer repository got No such file or directory before its first decision. It also requires pinning to a released tag while scripts/resolve_profile.py does not exist in 0.13.3, so the two instructions could not both be obeyed. Both mirrored copies carried it identically: parity working as designed, and saying nothing about whether the mirrored thing is true. The block now checks the library out first, and check_consumer_skill_contract.py holds both halves -- library-local paths must be established by the block that uses them, and what the skill says about the newest release must match what that tag contains, in both directions, so the caveat must be removed once a release carries the resolver. .gds/repository.yaml is read across the submodule boundary and its verification.commands are run by the control plane. Nothing checked they worked, and after the launcher split they did not. The exemption shielding it carried four claims that had all become false, including that it is a generated projection -- bundle.lock.yaml lists one projection output and this is not it -- and that the issue was tracked upstream, when it closed on 2026-08-13. The exemption now states its one true reason, and check_gds_verification_commands.py executes what the file declares. aqtinstall.log, 5.7 KB of local Qt debug output, was tracked. Removed and named in .gitignore.
…in the sweep The release-version half needs SemVer tags, and the blocking job checks out without them, so core failed on its own environment rather than on the tree. That is the split check_release_ledger already makes: headings reconcile in core, tags reconcile in the advisory sweep. catalog/validation-tiers.yml records the git_tags requirement, and the tier contract now holds it -- which is how the mismatch was found.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Three findings that share a shape: a document telling somebody else how to verify
something, which was never itself verified.
1. The consumer skill could not be followed
ci-consumer-adoptionsays "This is the caller side", then opened with:Those paths are inside this repository. An agent following the skill in a consumer
repository gets
No such file or directorybefore making its first decision.Worse, the skill also requires pinning to a released tag, and
scripts/resolve_profile.pydoes not exist in0.13.3, the newest release. The twoinstructions could not both be obeyed.
Both mirrored copies carried it identically — mirror parity working exactly as
designed, and saying nothing about whether the mirrored thing is true.
Fix: the block checks the library out first and says plainly that the resolver is
newer than the last release.
check_consumer_skill_contract.pyholds both halves, andthe second is the one that will rot: what the skill says about the newest release must
match what that tag contains, in both directions — so the caveat has to be removed
once a release carries the resolver.
2.
.gds/repository.yamlwas exempt from workingIt is read across the submodule boundary by
github-device-sync, which runs what itfinds under
verification.commands. Nothing checked those commands worked, and forweeks after the launcher split they did not.
The exemption shielding it carried four claims, all false by now:
bundle.lock.yamllists exactly one projection output,compiled-policy.json; this file has no generated headergithub-device-sync#176".claude/CLAUDE.mdsays the opposite — a superproject cannot write into a submodule treeThat entry reproduced the exact misreading the repository brief warns about — the one
that left a broken command declared for weeks because the fix looked like somebody
else's to make.
Fix: the exemption states its one true reason — the commands must be the
portable
python3 -I -Bform, because the control plane runs them where thisrepository's
.venvdoes not exist — andcheck_gds_verification_commands.pyexecutes what the file declares. Exempt from the form rule is not exempt from
working.
validate_all.pyis checked for form only rather than executed, because running theaggregate validator from inside itself would recurse. That limit is stated in the file.
3.
aqtinstall.log5.7 KB of local Qt debug output, tracked since
12a5eeb. The review called itimmaterial and I agree on severity — but a build artifact in a supply-chain library's
published tree costs two lines to remove. Gone, and named in
.gitignore.Mutations
.gdsreverts to barepython3 scripts/validate_all.py(the original defect).gdsnames a script that does not exist.gdscommand exits non-zeroverification.requirednames an undefined commandNote on the role
The plan flagged the skill's
role: repository-launcherincatalog/python-execution.ymlas wrong for a consumer-facing document. It is nowaccurate rather than wrong: the block genuinely runs the launcher, inside a library
checkout. Appropriateness — the thing the role could not check — is covered by the new
contract instead.
Verification
validate_all— all tiers OK withGH_TOKENactionlint— clean · skill mirrors regenerated through the launcher,check_skillsOK