Repository navigation
Audit a Caller's workflow-model Input Against the Registry - #3466
Conversation
Add the interface.workflow-model check. It reports an operational registry entry whose test-pull-request.yml validate job passes no workflow-model: operational, and a release entry passing any value other than release. The registry's model resolution moves into one helper that the selectors, the rulesets check, and the sweep share. Advance the no-build caller snippet's validate-task.yml pin to 2.0.1166, the latest release carrying the input, and pass workflow-model: operational, since the snippet is the operational trigger shape. The adoption doc now says a release-model adopter drops the input along with the push trigger. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
A recorded local strict-review pass covers head |
|
Important
This repository does not receive automatic reviews because it has fewer than 10 stars.
|
There was a problem hiding this comment.
🔵 Needs a closer look
Structured workflow-model values can be incorrectly accepted as omitted inputs for release callers.
No open issues 🎉
What changed in this PR
This pull request adds registry-aware auditing for callers’ workflow-model inputs, updates the operational workflow snippet, and documents the release-versus-operational behavior.
Changes:
- Adds the
interface.workflow-modelaudit check and centralizes workflow-model resolution. - Adds focused tests for caller validation, fallbacks, and edge cases.
- Updates the operational snippet to use a compatible release and pass
workflow-model: operational. - Documents the new caller requirements and audit check.
An unresolved moderate [P1] issue remains: structured YAML values such as {} or [] may be treated as omitted inputs for release callers.
| File | Summary |
|---|---|
tests/test_audit_helpers.py |
Tests workflow-model caller validation, fallback behavior, edge cases, and the updated snippet. |
spec/checks.json |
Registers the new workflow-model interface audit check. |
spec/audit.py |
Implements caller-input auditing and centralizes workflow-model resolution. |
docs/reusable-workflows.md |
Documents release and operational caller behavior and the new audit check. |
catalog/snippets/workflows/test-pull-request.yml |
Pins the operational snippet to a compatible release and passes the operational model. |
Review effort: Lite
…itted A mapping or a sequence passed as the input read as no value, so a release caller passing one was accepted as using the default. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Codecov Report❌ Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## develop #3466 +/- ##
==========================================
Coverage ? 80.92%
==========================================
Files ? 23
Lines ? 8869
Branches ? 0
==========================================
Hits ? 7177
Misses ? 1692
Partials ? 0
Flags with carried forward coverage won't be shown. Click here to find out more. ☔ View full report in Codecov by Harness. 🚀 New features to boost your workflow:
|
|
A recorded local strict-review pass covers head |
|
Answering the review round on f987b38, whose headline named one finding (1) with no thread:
Fixed in 3426a19. A mapping or a sequence now reports as "passes a mapping or a sequence" for either model, rather than reading as the omitted default, and |
…nd Nine Fixes to Main (#3472) ## Summary Promotes the pull requests merged into develop since release 2.0.1166. - [#3444](#3444): keeps untracked files out of the pre-commit snippet's prose gate. - [#3446](#3446): exempts the BuildKit `check=` parser directive in the prose gate. - [#3448](#3448): compares intent staleness against the hub's own copy and names the moved canonical. - [#3450](#3450): says only the prose gate is diff-scoped in the commit hook. - [#3453](#3453): reclassifies HolidayLights as an operational config repository in the registry. - [#3455](#3455): classifies the remaining subprocess failures by status rather than by prose. - [#3464](#3464): splits the semicolon series in WORKFLOW.md's filesystem output-seam bullet. - [#3466](#3466): audits a caller's `workflow-model` input against the registry. - [#3469](#3469): emits one snapshot shape from the skills report's cannot-read paths. - [#3462](#3462): splits `pr_review.py`'s pure check and round readers into the leaf modules `pr_review_checks.py` and `pr_review_rounds.py`. - [#3470](#3470): holds a covered held `wait` while any workflow run on the head has not completed. - [#3473](#3473): answers this promotion's review. The `wait` help and `scripts/README.md` now say what a held head's exit `0` does not prove: a `CHECKS UNREADABLE` payload, the conditions the unregistered-required-check hold reads, and the reach of the completed-run read. The exit code itself stays for #3471. Closes #3370 Closes #3372 Closes #3371 Closes #3369 Closes #3378 Closes #3454 Closes #3332 Closes #1759 Closes #3451 ## Constituent coverage Each change this promotion carries had coverage on its own pull request into develop, at its merged head: | Pull request | Merged head | Coverage | | --- | --- | --- | | [#3444](#3444) | `a61d1e2a` | attested local pass at the merged head, base `develop` | | [#3446](#3446) | `0a0efea1` | attested local pass at the merged head, base `develop` | | [#3448](#3448) | `c2c71ea7` | attested local pass at the merged head, base `develop` | | [#3450](#3450) | `4ec37c34` | attested local pass at the merged head, base `develop` | | [#3453](#3453) | `f20a543c` | a Copilot round on the merged head, its one changed file, no open findings | | [#3455](#3455) | `85f0ce60` | attested local pass at the merged head, base `develop` | | [#3464](#3464) | `fcd48e2d` | attested local pass at the merged head, base `develop` | | [#3466](#3466) | `3426a19c` | attested local pass at the merged head, base `develop` | | [#3469](#3469) | `ea4b0bb7` | attested local pass at the merged head, base `develop` | | [#3462](#3462) | `236eceab` | attested local pass at the merged head, base `develop` | | [#3470](#3470) | `3545ba46` | attested local pass at the merged head, base `develop` | | [#3473](#3473) | `46010530` | attested local pass at the merged head, base `develop`, and a Copilot table on an earlier head naming exactly the changed files | 🤖 Generated with [Claude Code](https://claude.com/claude-code)
Adds an audit check for the
workflow-modelinput a caller passes tovalidate-task.yml. Also moves the no-build caller snippet onto a release that declares the input.interface.workflow-model(spec/audit.py,spec/checks.json) reads thevalidatejob'swith: workflow-modelin.github/workflows/test-pull-request.yml. It reports DRIFT in two cases: an operational registry entry that passes noworkflow-model: operational, and a release entry that passes any value other thanreleaseor nothing. An empty value counts as a value rather than as the default, because the validator treats any value other thanreleaseas operational.workflow_model_ofreplaces the three inlineworkflowModelfallbacks inspec/audit.py, used by the selectors, the rulesets check and the sweep header.catalog/snippets/workflows/test-pull-request.ymlmoves its pin from2.0.376to2.0.1166and passesworkflow-model: operational. The snippet is the operational trigger shape. Its only other job-level setting ispermissions: contents: read, which still matches every job in the pinnedvalidate-task.yml.docs/reusable-workflows.md"Adopting the Gates" now says a release-model adopter drops the input, along with the push trigger. It also names the new check.WorkflowModelCallerFindingsCasecovers an operational caller with the input, an operational caller without it, a release caller passing the wrong value, release callers that omit it or namerelease, an empty value, callers and jobs the check does not read, the real snippet, and the model fallback.Verification: I ran the full
OPERATIONS.md"Local Verification" block locally, and every gate passed (2919 tests). I also ran a livespec/audit.pyover the hub and the operational and release config repos. The new check reports exactly the three operational repos whose caller omits the input, and none of the release repos.Closes on promotion: #3332
Declined local-pass finding
spec/audit.pyworkflow_model_caller_findings,introduced: the local pass called the structured-value branch added in 3426a19 over-hardening. Declined, because the branch is not hardening against an input. The check exists to report a caller whose input disagrees with the registry. Reading a mapping as the omitted default would make the audit report a release caller as conformant when it is not, which is a false negative in the check's own output.Pre-existing findings, not filed
docs/reusable-workflows.md:300,pre-existing: the paragraph's first sentence is 40 words, oversentence-length's 25. The sentence predates this change. This change only appended a separate 13-word sentence to that line.Dropped findings
scripts/carry.pyselector_set()andrepo-config/configure.sh,pre-existingconsolidation: both keep their own copy of theworkflowModelfallback thatworkflow_model_ofnow holds forspec/audit.py. This change does not touch either file.🤖 Generated with Claude Code