Skip to content

workflow-ci-contract Skill Restates D1.6's uv.lock Guard and D7.3's Unscoped Boolean Rule #1240

Description

@ptr727

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.

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions