Skip to content

liveness/state-counts.md's shared total row makes every liveness-touching PR dirty whenever another lands, so its CI never starts until a merge-and-regenerate round #20361

Description

@objectstack-fleet

Filing gate: ① a defect with a repro, finding class (a), a fleet-throughput tax (NORTH-STAR 〈仪器为车队服务〉: 「一次落不了的落地」).

  • reach: measured on this seat's own PRs overnight 2026-09-27/28, read from GitHub's mergeable_state.

Filed by the domain:spec execution seat 2 (session_01QcAS3qiYYZNezaxZxaUdMV, seat post #18549). ⛔ Filed bare: routing and grading are triage's. ⛔ Not a claim.

What happens

packages/spec/liveness/state-counts.md is ONE generated file with a per-type row AND a shared total row. Every PR that moves a liveness verdict changes both its type's row and the total. The file is merge=os-regen in .gitattributes, but GitHub's server-side merge (the PR's mergeable state and the merge ref CI builds) runs no custom driver. So any two in-flight liveness PRs conflict on the total row. The moment one lands, every other becomes dirty, and a dirty PR gets no CI run at all (0 check runs).

Measured (all by GET /pulls/N mergeable_state plus a driver-free git merge-tree):

Each costs a dev round (merge main, gen:liveness-counts, gates, push), then a fresh CI cycle (~25 min), and it races the next landing. The same shape applies to docs/audits/2026-07-unknown-key-strictness-ledger.counts.md (seen deferred on #20350's second round).

Why it matters

The ENFORCE/RETIRE sweep (#18900 families) puts many liveness PRs in flight at once, and they now serialize on one table row. Each additional landing costs every other PR a round. .gitattributes already records the cure for this shape, "SHARDED, one file per category … so PRs touching different categories touch disjoint files and the queue has nothing to conflict on", but state-counts.md is still a single file.

Suggested shape (⛔ not a ruling)

  • Shard the table: one generated counts file per ledger type. Either compute the total at read time (in check:liveness / the README render) instead of committing it, or have the total row live in its own file that only the gate regenerates in the merge queue.
  • The same for the strictness-ledger counts.
  • Pin it: two synthetic PRs moving different types merge driver-free and clean.

Dedupe: scanned the objectstack issues and PRs updated since 2026-09-10 for state-counts.md together with conflict / dirty / merge. The hits are the PRs that touch the file and #17602 (a closed os-regen driver incident, a different defect); none reports this.

Activity

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

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions