Found while resolving the merge conflict on PR #8700 (branch for objectui#8326). ⛔ Not fixed there — that PR resolves a conflict and does not widen its diff.
The gap
scripts/__tests__/ci-cd-pipeline-doc.test.ts, describe block ci-cd-pipeline.md — workflow inventory, builds its documented set like this:
const documented = new Set(
doc
.split('\n')
.filter((line) => /^#{1,6}\s/.test(line))
.flatMap((line) => [...line.matchAll(/([a-z0-9][a-z0-9-]*\.yml)\b/g)].map((m) => m[1])),
);
The filter keeps only lines that start with a markdown heading marker. ⇒ the "Workflow Inventory" table is never read by this pin at all. A workflow satisfies gives every workflow in .github/workflows/ its own section purely by having a ## heading somewhere on the page; its table row can be absent, duplicated, or say the opposite of the truth.
⭐ The sharpest part is that the test's own failure message instructs contributors to add the row:
Add a section to that page — a heading that contains the file name (e.g. "### Stale Issues (stale.yml)"), what triggers it, and whether it can block a merge — and a row in the "Workflow Inventory" table.
⇒ that last clause is advice the assertion does not enforce. A contributor who adds the heading and forgets the row gets a green test and a message telling them they did both.
Measured, two ablations on the merged tree
Both mutations were proven on disk (occurrence counts plus a changed git hash-object blob), each restored to the HEAD blob afterwards with git diff HEAD empty.
| ablation |
mutation |
expected if the table were pinned |
observed |
| A |
rewrite the live-e2e.yml row's trailing cell back to the stale "informational lane, continue-on-error" wording that objectui#8692 had just removed |
red |
⭐ green — 58 passed |
| B |
delete the lockfile-integrity.yml inventory row outright, keeping its ## section |
red |
⭐ green — 58 passed |
Ablation A is the one that matters, because that exact wording is a claim the page is elsewhere careful about: the test does assert the continue-on-error claim in the structural-claims bullet near line 1254, and objectui#8084 removed the property from the workflow. So the page can carry a contradiction with itself — a corrected bullet and an uncorrected table row — and stay green.
Ablation B is the live risk this was found through: the objectui#8326 conflict was a new row inserted immediately above a row main had rewritten. Dropping either side is a plausible resolution, and nothing in the suite would have said so.
Why this is not objectui#8420
objectui#8420 is about each workflow's prose section being unpinned against what its job actually runs. This is a different axis: the inventory table's row existing at all, and its "can it block a merge?" cell agreeing with the YAML. Neither pin covers the other. objectui#4170 (closed) touched one bullet's claim, not the table.
Suggested shape, not a decision
Parse the inventory table rows and assert, in both directions, that the set of NAME.yml values in column 1 equals the non-exempt contents of .github/workflows/. The "can it block a merge?" cell is a second, larger step — it would want deriving from REQUIRED_CONTEXTS in scripts/dependabot-merge-gate.mjs rather than hand-matching prose, and that is worth its own triage.
Refs: objectui#8326 · PR #8700 · objectui#8692 (the row rewrite) · objectui#8084 (the continue-on-error removal) · objectui#8420 (adjacent, different axis).
Filed unassigned by the objectui#8326 execution seat as an out-of-scope finding. Generated by Claude Code, session session_01FhBNJcLRZLe8M87VcUgpKr.
Found while resolving the merge conflict on PR #8700 (branch for objectui#8326). ⛔ Not fixed there — that PR resolves a conflict and does not widen its diff.
The gap
scripts/__tests__/ci-cd-pipeline-doc.test.ts, describe blockci-cd-pipeline.md — workflow inventory, builds itsdocumentedset like this:The filter keeps only lines that start with a markdown heading marker. ⇒ the "Workflow Inventory" table is never read by this pin at all. A workflow satisfies
gives every workflow in .github/workflows/ its own sectionpurely by having a##heading somewhere on the page; its table row can be absent, duplicated, or say the opposite of the truth.⭐ The sharpest part is that the test's own failure message instructs contributors to add the row:
⇒ that last clause is advice the assertion does not enforce. A contributor who adds the heading and forgets the row gets a green test and a message telling them they did both.
Measured, two ablations on the merged tree
Both mutations were proven on disk (occurrence counts plus a changed
git hash-objectblob), each restored to theHEADblob afterwards withgit diff HEADempty.live-e2e.ymlrow's trailing cell back to the stale "informational lane,continue-on-error" wording that objectui#8692 had just removedlockfile-integrity.ymlinventory row outright, keeping its##sectionAblation A is the one that matters, because that exact wording is a claim the page is elsewhere careful about: the test does assert the
continue-on-errorclaim in the structural-claims bullet near line 1254, and objectui#8084 removed the property from the workflow. So the page can carry a contradiction with itself — a corrected bullet and an uncorrected table row — and stay green.Ablation B is the live risk this was found through: the objectui#8326 conflict was a new row inserted immediately above a row
mainhad rewritten. Dropping either side is a plausible resolution, and nothing in the suite would have said so.Why this is not objectui#8420
objectui#8420 is about each workflow's prose section being unpinned against what its job actually runs. This is a different axis: the inventory table's row existing at all, and its "can it block a merge?" cell agreeing with the YAML. Neither pin covers the other. objectui#4170 (closed) touched one bullet's claim, not the table.
Suggested shape, not a decision
Parse the inventory table rows and assert, in both directions, that the set of
NAME.ymlvalues in column 1 equals the non-exempt contents of.github/workflows/. The "can it block a merge?" cell is a second, larger step — it would want deriving fromREQUIRED_CONTEXTSinscripts/dependabot-merge-gate.mjsrather than hand-matching prose, and that is worth its own triage.Refs: objectui#8326 · PR #8700 · objectui#8692 (the row rewrite) · objectui#8084 (the
continue-on-errorremoval) · objectui#8420 (adjacent, different axis).Filed unassigned by the objectui#8326 execution seat as an out-of-scope finding. Generated by Claude Code, session
session_01FhBNJcLRZLe8M87VcUgpKr.