The workflow-ci-contract skill restates two WORKFLOW.md rules that a change now in flight settles, and the skill's copies keep the pre-settlement wording. Filed rather than fixed in that change, because .claude-plugin/fleet-skills/.source-digest is one hash over every skill's bytes, so a concurrent edit under .agents/skills/ conflicts with whichever other change holds that tree.
1. D1.6's Python-leg guard names uv.lock as a precondition
.agents/skills/workflow-ci-contract/references/d-guarantees.md, the D1.6 bullet:
The hub validator's Python leg, which runs where that root carries pyproject.toml, tests/, and uv.lock, reds its test step when no such report was written.
The leg no longer requires a lockfile. It runs where the root carries pyproject.toml, tests/, and a dependency manifest it can install from, being a committed uv.lock or a root requirements*.txt, so a pip-based Python repo with tests is served rather than skipped. The same bullet's "a lint-only profile for that type excepted" is also now half the exemption: a repo carrying no tests for that type owes no coverage either, whatever its dependency mechanism.
2. D7.3's boolean rule is stated unscoped
.agents/skills/workflow-ci-contract/SKILL.md:
Boolean inputs are declared in both trigger blocks and compared against both forms, ${{ inputs.foo == true || inputs.foo == 'true' }}, since workflow_dispatch delivers strings.
.agents/skills/workflow-ci-contract/references/d-guarantees.md:
D7.3 Boolean inputs are declared in both trigger blocks and compared against both forms.
The inputs context preserves the declared boolean on the workflow_call and workflow_dispatch paths alike. Only github.event.inputs.<name> stringifies, so that is where the both-forms comparison belongs. D7.3 now scopes itself accordingly, and names smoke as the task-internal boolean that arrives only by workflow_call, which is why D1.3's !inputs.smoke is correct as written.
The SKILL.md sentence's trailing clause, "since workflow_dispatch delivers strings", is the false claim that made the unscoped rule look justified, and it is the same one #1197 item 3 raises against GOVERNANCE.md "Workflow YAML Conventions".
Scope
Both edits are under .agents/skills/workflow-ci-contract/, so they need a scripts/build_dist.py run and the generated trees committed with them. Whichever agent holds the skills tree next can take this on its own or fold it into a skills sweep.
The
workflow-ci-contractskill restates twoWORKFLOW.mdrules that a change now in flight settles, and the skill's copies keep the pre-settlement wording. Filed rather than fixed in that change, because.claude-plugin/fleet-skills/.source-digestis one hash over every skill's bytes, so a concurrent edit under.agents/skills/conflicts with whichever other change holds that tree.1. D1.6's Python-leg guard names
uv.lockas a precondition.agents/skills/workflow-ci-contract/references/d-guarantees.md, the D1.6 bullet:The leg no longer requires a lockfile. It runs where the root carries
pyproject.toml,tests/, and a dependency manifest it can install from, being a committeduv.lockor a rootrequirements*.txt, so a pip-based Python repo with tests is served rather than skipped. The same bullet's "a lint-only profile for that type excepted" is also now half the exemption: a repo carrying no tests for that type owes no coverage either, whatever its dependency mechanism.2. D7.3's boolean rule is stated unscoped
.agents/skills/workflow-ci-contract/SKILL.md:.agents/skills/workflow-ci-contract/references/d-guarantees.md:The
inputscontext preserves the declared boolean on theworkflow_callandworkflow_dispatchpaths alike. Onlygithub.event.inputs.<name>stringifies, so that is where the both-forms comparison belongs. D7.3 now scopes itself accordingly, and namessmokeas the task-internal boolean that arrives only byworkflow_call, which is why D1.3's!inputs.smokeis correct as written.The
SKILL.mdsentence's trailing clause, "sinceworkflow_dispatchdelivers strings", is the false claim that made the unscoped rule look justified, and it is the same one #1197 item 3 raises againstGOVERNANCE.md"Workflow YAML Conventions".Scope
Both edits are under
.agents/skills/workflow-ci-contract/, so they need ascripts/build_dist.pyrun and the generated trees committed with them. Whichever agent holds the skills tree next can take this on its own or fold it into a skills sweep.