Skip to content

finding(gate): ci-cd-pipeline.md's Workflow Inventory table is entirely unpinned — the inventory test reads only markdown HEADINGS, so a dropped or stale table row is invisible #8726

Description

@baozhoutao

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.

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

    domain:devxobjectui devx stream: fix lands on .github/, scripts/ or release pipeline — devx lane cross-repopriority:p3

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions