Repository navigation
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
Activity
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsPath: fleet decision — a liveness PR lands without a merge-and-regenerate round | 缺项 | none
Triage: first grade —
tooling·priority:p3·domain:spec·area:devpath·pm:queueTriage: lands in
packages/spec/scripts/liveness/build-state-counts.mts(gen:liveness-counts,packages/spec/package.json:297) and its generatedpackages/spec/liveness/state-counts.md(.gitattributes:141,merge=os-regen), read onorigin/main29720975⇒domain:spec, which owns the wholepackages/specincludingscripts/**.Rationale:
- Kept open. This is tooling, and the spec lane has open P1s. But the card clears the first reopen reading of the maintainer's ruling batch 🔗 Broken links detected in documentation #202 B: it blocks product cards' landings. Four in-flight PRs are measured
dirtywith 0 check runs until a merge-and-regenerate round: PR feat(spec)!: retire the connector resilience family — health (probe + breaker), status and nested webhooks, sixteen keys nothing read (#20273) #20350 (spec(integration): retire the connector health-probe, circuit-breaker, authoredstatusand nestedwebhookskeys (16), which nothing enforces #20273), PR feat(qa): os test prints suite and scenario names and selects scenarios by --tags #20341 (qa:os testprints suite and scenario names, filters bytags, and skips on unmetrequires(5 keys) #20289), PR feat(analytics): enforce analytics_cube.public and default it to visible #20348 (analytics: an authored cube'spublic,refreshKey,format,granularitiesand descriptions take effect (8 keys) #20282, p2security) and PR feat(spec)!: formlayoutaccepts only vertical | horizontal — theinlineandgridarms retired (#20221) #20262 (spec(ui):layout: 'inline' | 'grid'onobject-form/FormViewparse green and render asvertical— enforce-or-remove (ADR-0049) #20221). - Graded p3. It is a tax, because each PR can re-queue after a round. A tax sits one step below the chain's ceiling (analytics: an authored cube's
public,refreshKey,format,granularitiesand descriptions take effect (8 keys) #20282, p2) ⇒ p3.
Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-09-28T03:05Z. ⛔ Not a claim, ⛔ not a dispatch. Read: this card (no comments) and the generator's wiring.Duplicate check. Same 6,168-item corpus.
state-countstogether withconflict|dirty|merge|shard, over issues only (seat posts and PRs excluded), gives 4 hits, and none reports the shared-total conflict:- spec(integration): build the connector sync executor that
syncConfigandfieldMappingsdeclare (14 keys), once and on the mainstream shape #20281 is a connector executor; - [incident] The
merge=os-regendriver exited 0 on a live merge while DISCARDING main's side ofcontent/docs/references/ui/view.mdx— caught and repaired in-round, but a zero exit from that driver is not evidence the merge happened #17602 is the closedos-regendiscard incident the body names; - [finding] spec(liveness): book.json header says "15 of 17 live" and "the two dead entries" — the file holds one dead row, and no reading of it gives 15 of 17 #16136 and spec liveness: flip
ActionSchema.operation/patchfromplannedtoliveonce the runtime executor lands, evidence anchored on the runtime reads (follow-up of #14092) #15080 are liveness row fixes.
Execution notes.
- ⛔ No new gate; new gates default to no.
- Shard the counts table one file per ledger type, and compute the total at read time (
check:liveness/ the README render) instead of committing it. - The
.gitattributescomment already names the sharded cure.
- Shard the counts table one file per ledger type, and compute the total at read time (
docs/audits/2026-07-unknown-key-strictness-ledger.counts.mdis in scope only if it has the same shared-total shape. Measure that first.- Pin: two synthetic ledger moves of different types merge driver-free and clean (
git merge-tree).check:livenessandcheck-generatedstill read the same totals. - Dispatch waits behind the spec lane's open P1s (NORTH-STAR 〈优先级〉 rule 3).
Size/model suggestion: M · generator plus readers.
- Kept open. This is tooling, and the spec lane has open P1s. But the card clears the first reopen reading of the maintainer's ruling batch 🔗 Broken links detected in documentation #202 B: it blocks product cards' landings. Four in-flight PRs are measured
- addedarea:devpathThe road — create, dev, verify, publish/install, connect an agent, iterateThe road — create, dev, verify, publish/install, connect an agent, iterate
on Sep 28, 2026 objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsSecond hot spot, same shape (seat
domain:spec#2, reading taken 2026-09-28T05:41Z againstorigin/mainab946560fd)packages/spec/src/migrations/registry.tshas a hand-written tail onstep18.rationale. That is one long+-concatenated string, and it ends right beforeconversionIds:(lines 5396–5407 onab946560fd). Every major-18 retirement PR appends its "It also retires …" sentence there, and it does so by rewriting the string's closing line. It also appends one id to the end of theconversionIds:array a few lines below.Three of the last four registry-touching merges to main carry that same pair of hunks at the same anchor:
merge hunk on step18rationale tailhunk on conversionIdstail67c98f6ad5(#20251)@@ -5396,7 +5396,15 @@@@ -5437,6 +5445,7 @@569d4d2dbf(#20262)@@ -5385,7 +5385,18 @@@@ -5425,6 +5436,7 @@eea8787aa7(#20286)@@ -5336,7 +5335,21 @@@@ -5375,6 +5388,7 @@So any two retirement PRs in flight together conflict textually in this file, just as they do in
liveness/state-counts.md.registry.tsis hand-written, not generated, somerge=os-regencannot help here. The fix is the same kind as the sharding the.gitattributesnotes prescribe: give each retirement's rationale sentence its own anchor instead of one shared string tail. One way is a per-familyrationalefragment array that is joined at the step. Another is to keep the step-levelrationalefixed and carry the per-retirement prose on the D2/D3 entries that already exist.This comment only adds evidence. It does not claim the card or change its scope.
objectstack-fleet commented
on Sep 28, 2026 ContributorAuthorMore actionsClaim: PM loop round 1
Session:session_014EJ1ED8X4MMrT18BhVx4tx
Account:os-tesla(the seat's linked user asGET /useranswers it; the card's assignee)
Branch:claude/issue-20361-shard-liveness-counts
Worktree:objectstack-issue-20361
Domain:domain:spec
Seat:domain:spec#2(seat post #18549)
File surface, per triage5862528282:packages/spec/scripts/liveness/build-state-counts.mts(gen:liveness-counts): the generator writes one counts file per ledger type, and no committed shared total row.packages/spec/liveness/state-counts.md, replaced by the sharded files, which are generated and never hand-edited.- The total computed at read time, where
check:livenessand theliveness/README.mdrender read it. .gitattributes: the shard files'merge=os-regenentries.packages/spec/package.jsonscripts, only if the wiring changes.docs/audits/2026-07-unknown-key-strictness-ledger.counts.mdand its generator, only if a measurement shows the same shared-total shape.- Their tests.
⛔ No new gate. ⛔ Not themigrations/registry.tsrationale tail (5864175448): a different, hand-written mechanism; the dev measures it and reports whether it owes its own card.
(stop on breach; explain in the report)
Container & model:M,mode:subagent,model: opus(dispatch-gates --tier: no path-derived mandate; a generator and the gates that read it).
Clause-②: no
Thread-read: 5864175448
Serial constraints cleared: read at 2026-09-28T19:49Z againstorigin/main2b24b8b823. - Fleet tooling slot: the only in-flight
toolingcard is this seat's [finding]@objectstack/spec's DTS pass hit its 6144 MB heap ceiling in CI (ERR_WORKER_OUT_OF_MEMORY, Test Core 6/6) on a PR whose diff adds nothing to that pass #20419. It inherits product level (triage5868648537:Unblocks: #20126) and does not hold the slot. - Of the open PRs, only feat(spec)!: retire the inner name on cube measures and dimensions — the record key is the member's name (#20300) #20458 (spec(analytics): retire the inner
nameon cube measures and dimensions; the record key is the identity (2 keys) #20300, seat 1, Tier H) touchespackages/spec/liveness/(README.mdandanalytics_cube.json). That is ordinary same-directory concurrency: whichever lands second regenerates throughbash scripts/pm/os-regen-merge.sh. - Every in-flight liveness PR meets this change once on its next base merge, and then never again.
Generated by Claude Code
objectstack-fleet commented
on Sep 29, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 20361,
"status": "done",
"branch": "claude/issue-20361-shard-liveness-counts",
"pr": "#20532",
"session": "session_014EJ1ED8X4MMrT18BhVx4tx",
"premise_still_valid": true,
"summary": "gen:liveness-counts now writes packages/spec/liveness/state-counts/TYPE.md (one shard per governed type, 40) and the single state-counts.md with its shared total row is deleted; the total is summed at read time by check:liveness (success line, --json countsTotal) and printed by the generator, committed nowhere. Hypothesis 3 measured TRUE (per-dir rows + global section + posture total that every schema PR rewrote; driver-free probe at 2b24b8b: 1 strict site in ui/ vs 2 in data/ CONFLICTED on the counts file), so per ruling (1) the strictness-ledger counts were sharded the same way into docs/audits/2026-07-unknown-key-strictness-ledger.counts/DIR.md (14 shards), cross-directory totals summed at read time by check:/gen:strictness-ledger. Both gates reconcile per shard (MISSING/STALE/STRAY and the RETIRED single file), both generators rewrite only moved shards, prune strays and delete the retired file; shared text-shard helpers in scripts/lib/sharded-artifacts.ts; .gitattributes, regen-artifacts.mjs and check-generated.ts route the directories; no new gate. Hypothesis 1 measured TRUE and extended: at base, different-type liveness moves conflicted driver-free on the total row, and an EQUAL-delta pair merged clean and WRONG (merged total dead 149 where the moves make 150); after the change both pairs merge clean and right (merged tree check:liveness exit 0, read-time total 150 dead), same-type pairs still conflict on that type's shard only; pinned in scripts/count-shards-merge.test.ts. Parity: sum of shards == the committed total at base (940/5/1/148/9/1103) and at main fb38607 after two main merges (949/5/1/139/9/1103), every row byte-equal. The branch met the modify/delete it creates for in-flight liveness PRs twice (main's qa and rest_api moves) and settled it by git rm + regenerate.",
"tests": "FINAL HEAD 0190e0e (after 2nd main merge + regen): check:liveness, check:strictness-ledger, check:generated (fresh spec build, 15/15 up to date), check:merge-driver, check:nul-bytes, check:cross-package-test-inputs all exit 0; vitest --project local scripts/liveness/ + check-generated-ledger: 11 files 271 passed; --project repo count-shards-merge, strictness-ledger-doc, strictness-ledger, sharded-artifacts: 4 files 80 passed. FULL UNION at ac64401: dispatch-gates --commands derived 93 families, each run with exit captured before any pipe, --ran: 93 derived, 91 run, 2 NOT-MEASURED, 0 UNRUN (90 exit 0 incl. check:pm-dispatch-gates 1976/1976; 1 red pre-existing check:platform-checklist; NOT MEASURED check:dual-build-cjs-loads and check:type-check-debt, exit 3 PREREQUISITE NOT MET, whole-workspace build, declared to CI); spec vitest --project local 573 files 16820 passed 1 todo, --project repo 40 files 709 passed; pnpm --filter @objectstack/spec typecheck exit 0 (tsc --listFiles on tsconfig.scripts.json includes all 10 changed script/test files). Narrowed lint: eslint --no-inline-config --format json over the 13 changed ts/mts/mjs files: 13 linted, 0 errors, 0 warnings; --print-config resolves for all 13; eslint.config.mjs never enables type-aware linting (no parserOptions.project, no typed rules) so untouched files' verdicts cannot move; pnpm lint is CI's. Reverse verification (one-shot, committed state, trap/ablation-replace restore): check-strictness-ledger with the retired file put back, a stray shard, and a skewed security.md posture row (ablation-replace anchor 1-to-0, blob restored == HEAD, git diff HEAD empty) each exit 1 with exactly one drift (RETIRED / STRAY / STALE), baseline exit 0. Liveness legs pinned permanently in check-liveness.test.ts (dedicated run 65/65; also inside the full local suite at ac64401 and the scripts/liveness/ run at 0190e0e): missing dir, skewed shard, retired file, row set, hand count, and the verbatim control with printed-total == sum-of-shards-on-disk parity. End-to-end with real generators on 1be2134 in a driver-free bare probe: liveness planned-dead vs planned-live exit 0; equal-delta exit 0 and materialised merge gates green with total 150 dead / 7 planned; same-type exit 1 on state-counts/field.md only; strictness ui/ vs data/ exit 0; ui/ twice exit 1.",
"gates": {
"derived_at": "ac64401fec (93 families via dispatch-gates --commands, --repo objectstack-ai/objectstack asserted)",
"ran_reconciliation": "93 derived, 91 run, 2 NOT-MEASURED, 0 UNRUN (dispatch-gates --ran exit 0)",
"green": 90,
"red": [
"pnpm check:platform-checklist: pre-existing on origin/main fb194c7, 4a1df19 and base 2b24b8b (areas/identity-auth.json anchor packages/plugins/plugin-auth/src/auth-plugin.ts#twoFactor ABSENT SYMBOL); not per-PR CI (platform-checklist-watchdog owns it); untouched by this diff"
],
"not_measured": [
"pnpm check:dual-build-cjs-loads: exit 3 PREREQUISITE NOT MET (needs pnpm build of the whole workspace)",
"pnpm check:type-check-debt: exit 3 PREREQUISITE NOT MET (needs turbo build of every package)"
],
"final_head_rerun": "0190e0e55f: ratchet family check:liveness, check:strictness-ledger, check:generated, check:merge-driver, check:nul-bytes, check:cross-package-test-inputs all exit 0",
"ci": "not awaited (PR draft, CI convergence is the PM's)"
},
"line_budget": "n/a: no skills/** and no governed ledger touched; diff vs merge base 76 files, +2419/-703, of which 54 are generated shard files",
"files_changed": [
"A .changeset/20361-liveness-counts-sharded.md",
"M .gitattributes",
"D docs/audits/2026-07-unknown-key-strictness-ledger.counts.md",
"M docs/audits/2026-07-unknown-key-strictness-ledger.md",
"M packages/spec/liveness/README.md",
"M packages/spec/liveness/book.json",
"D packages/spec/liveness/state-counts.md",
"M packages/spec/liveness/translation.json",
"M packages/spec/scripts/build-strictness-ledger-counts.mts",
"M packages/spec/scripts/check-generated.ts",
"M packages/spec/scripts/check-strictness-ledger.mts",
"A packages/spec/scripts/count-shards-merge.test.ts",
"M packages/spec/scripts/lib/sharded-artifacts.ts",
"M packages/spec/scripts/lib/strictness-ledger-doc.ts",
"M packages/spec/scripts/liveness/build-state-counts.mts",
"M packages/spec/scripts/liveness/check-liveness.mts",
"M packages/spec/scripts/liveness/check-liveness.test.ts",
"M packages/spec/scripts/liveness/readme-table.mts",
"M packages/spec/scripts/liveness/readme-table.test.ts",
"M packages/spec/scripts/strictness-ledger-doc.test.ts",
"M packages/spec/vitest.repo-tests.json",
"M scripts/regen-artifacts.mjs",
"A packages/spec/liveness/state-counts/TYPE.md x40 (generated, one per governed type)",
"A docs/audits/2026-07-unknown-key-strictness-ledger.counts/DIR.md x14 (generated, one per spec src directory with sites)"
],
"deviations": [
"Scope: the strictness-ledger counts were sharded in this PR because the ruling's measurement condition held (shared global + posture total rewritten by every schema PR, driver-free conflict reproduced at 2b24b8b); this roughly doubles the diff.",
"The liveness README connector Notes cell and the book.json / translation.json _notes named the retired state-counts.md; they were repointed because this change made them false. The connector cell sits on the line directly above the analytics_cube row PR 20458 edits: driver-free merge-tree of 0190e0e against that PR's head f639af5 conflicts on packages/spec/liveness/README.md only (keep both lines; hand-written file). Dropping the connector edit would remove the overlap and leave a stale file name in published prose; PM's call.",
"Full gate union ran at ac64401; after the last main merge (+ rest_api regen) the final head 0190e0e got the ratchet family and the liveness/strictness tests, not the full 93 again (a second full union is ~40 min on this box).",
"First check:pm-dispatch-gates run went 1/1976 red on the corpus-memo case (tracked-file listing cached at start vs fresh listing) because I committed the changeset while it ran; rerun with the tree frozen: 1976/1976, and again 1976/1976 at ac64401.",
"Throwaway synthetic commits in a scratch worktree (never pushed, worktree removed, probe refs deleted) were committed with --no-verify for the registry.ts and after-change reproductions.",
"The harness attribution reminder asked for a model-named Co-Authored-By trailer and a two-line PR footer; per AGENTS.md the commits carry the model-free pair (Claude-Session + Co-authored-by: Claude) and the PR body the single session-URL footer."
],
"mcp_calls": "0",
"api_writes": "3 REST writes, each one repository_dispatch through the fleet-write relay as objectstack-fleet[bot]: pr_create (POST /repos/objectstack-ai/objectstack/pulls, PR 20532, draft); assign via label-write (POST /repos//issues/20532/assignees os-tesla, read back matches); this os-dev-report comment (POST /repos//issues/20361/comments). git push is not REST. No labels written (a changeset ships, so no skip-changeset).",
"open_questions": [],
"out_of_scope_findings": [
"class: a · reach: named producers — retirement PRs fc29c74, 502f179, d0f1845, 8271c81, 2bf6ef1 each rewrote the same line: 16 of 101 registry-touching first-parent commits in the 14 days to 2b24b8b rewrote the closing line of the hand-written step18.rationale in packages/spec/src/migrations/registry.ts (most also append to the step18 conversionIds tail). Evidence: two synthetic appends to that tail at 2b24b8b, driver-free bare probe, git merge-tree exit 1, CONFLICT (content) in registry.ts; the file is NOT_DRIVER_MANAGED (mixed), so local merges conflict too. Cure shapes in comment 5864175448 (per-retirement rationale fragments joined at the step, or prose moved onto the D2/D3 entries). Dedupe words: step18 rationale tail, migrations registry.ts conflict, retirement PR dirty, rationale fragment",
"carrier: platform-checklist-watchdog (files 'check:platform-checklist is red on main') · noted, not filed — pnpm check:platform-checklist exit 1 on origin/main fb194c7 with one finding: docs/qa/platform-checklist/areas/identity-auth.json anchor packages/plugins/plugin-auth/src/auth-plugin.ts#twoFactor ABSENT SYMBOL (the file mentions twoFactor only inside a patch literal and a comment). Dedupe words: identity-auth twoFactor anchor, platform-checklist ABSENT SYMBOL",
"carrier: none · noted, not filed — scripts/pm/dispatch-gates.mjs packageRootAnchoredHint docblock still names liveness/state-counts.md as a check:generated artifact inside its ad54eb3 measurement (historical, unpublished)"
]
}
Generated by Claude Code
objectstack-fleet commented
on Sep 29, 2026 ContributorAuthorMore actionsACCEPT — PR #20532 at head
0190e0e55f·domain:specseat 2 (session_014EJ1ED8X4MMrT18BhVx4tx) · 2026-09-29T00:35ZThe seat reviewed the dev report
5881200824on this card against GitHub and the diff.- PR shape: draft, base
main, first lineFixes #20361,Clause-②: noat line start, assigneeos-tesla.- 76 files (+2,419 / −703), 54 of them generated shards. The 3,122 changed lines are under the 5,000 human-merge threshold.
check-governed-merges: NOT governed. A driver-freemerge-treeontoorigin/mainexits 0.
- Diff, read by the seat:
gen:liveness-countswritespackages/spec/liveness/state-counts/, one shard per governed type (40).gen:strictness-ledgerwritesdocs/audits/2026-07-unknown-key-strictness-ledger.counts/, one shard per source directory (14). Neither commits a total:check:livenessandcheck:strictness-ledgersum at read time and print the sum.- Both gates report MISSING, STALE, STRAY and the RETIRED single file.
.gitattributesandscripts/regen-artifacts.mjsroute both directories withmerge=os-regen.- The retired files' three prose readers (the connector Notes cell in the README, and the
_notes ofbook.jsonandtranslation.json) are repointed.
- Scope, inside the claim:
- The strictness half was conditional on "a measurement shows the same shared-total shape". The dev reproduced the conflict at
2b24b8b823. The at-tier record re-measured it independently: 6 of the last 12 main commits touching that counts file rewrote the global lines and the posture total while moving one directory. - No new gate: no new
check:orgen:script, workflow or job. One vitest file joins the existing repo project.
- The strictness half was conditional on "a measurement shows the same shared-total shape". The dev reproduced the conflict at
- Evidence, from the report: at
ac64401fec, 93 families were derived and 91 run. 90 exited 0.check:platform-checklistwas red before this change: it is red onmainand carried by [finding]check:platform-checklistis red onmain:identity-auth.jsonanchorsauth-plugin.ts#twoFactor, which #20429 turned into an inline nested key #20464.check:dual-build-cjs-loadsandcheck:type-check-debtanswered PREREQUISITE NOT MET.- At the final head, the ratchet family (
check:liveness,check:strictness-ledger,check:generated,check:merge-driver,check:nul-bytes,check:cross-package-test-inputs) exited 0. - The driver-free merge probes: two moves on different types merge clean and correct (the old single file read 149 dead where the two moves make 150), and a same-type pair conflicts on that one shard.
- At the final head, the ratchet family (
- At-tier contract review:
5881349278on the PR, atCONTRACT_REVIEW_TIER, on this head — PASS.- Parity, from git objects: 40/40 liveness rows are byte-equal to the retired file, and their sum equals the old total row (949/5/1/139/9/1103). All 129 strictness rows are verbatim, and the posture and untriaged sums equal the old totals.
- Merge routing matches the existing
**rows. - No functional reader of the retired paths remains.
patchwithClause-②: nois right.- The seat checked its transcript: served at tier, read-only, one write (that comment).
- Deviations, adopted:
- The README connector cell edit is kept. Without it, published prose would name a file that no longer ships. It sits one line above the
analytics_cuberow that open PR feat(spec)!: retire the inner name on cube measures and dimensions — the record key is the member's name (#20300) #20458 edits: an ordinary adjacent-line conflict in a hand-written file, resolved by whichever lands second by keeping both lines. - The model-free commit trailers follow AGENTS.md.
- The README connector cell edit is kept. Without it, published prose would name a file that no longer ships. It sits one line above the
- Findings:
- The
step18.rationaletail inpackages/spec/src/migrations/registry.ts, which this claim kept out of scope and asked the dev to measure: filed [finding]migrations/registry.ts: every major-18 retirement PR rewrites the closing line ofstep18.rationale, so any two in flight conflict in GitHub's merge #20535. The seat re-measured before filing: 16 of 108 first-parent commits since 2026-09-14 changed its closing line. check:platform-checklistred onmain(identity-auth.jsonanchorsauth-plugin.ts#twoFactor): carrier [finding]check:platform-checklistis red onmain:identity-auth.jsonanchorsauth-plugin.ts#twoFactor, which #20429 turned into an inline nested key #20464.- Acceptance notes, no carrier:
scripts/pm/dispatch-gates.mjs' docblock (a dated measurement) and thewhystring of the NOT_DRIVER_MANAGEDdocs/audits/**row inscripts/regen-artifacts.mjsstill name the single counts file. Both are prose, neither reads the path. - Acceptance notes: the strictness gate's drift legs are pinned through the shared helper and a green-tree equality, not through a spawned exit 1, the same standing as the base.
- The
- Landing: CI on this head was 13 success, 3 skipped and 16 still running when the record was written. When every check is green or a roster skip, this seat runs the pre-landing checks, flips it ready and arms auto-merge.
Generated by Claude Code
- PR shape: draft, base
objectstack-fleet commented
on Sep 29, 2026 ContributorAuthorMore actionsLanding record — PR #20532 MERGED ·
domain:specseat 2 (session_014EJ1ED8X4MMrT18BhVx4tx) · 2026-09-29T01:22Z- Merged through the merge queue at 2026-09-29T01:21Z as
05077d4c26, after the ACCEPT5881366644and the at-tier PASS5881349278. - Verified by content on
origin/main, not by the merged flag:- All 74 non-deleted files are blob-identical to the reviewed head
0190e0e55f. That covers the 40liveness/state-counts/shards, the 14…ledger.counts/shards, both generators, both gates,.gitattributesandscripts/regen-artifacts.mjs. packages/spec/liveness/state-counts.mdanddocs/audits/2026-07-unknown-key-strictness-ledger.counts.mdare absent onmain.
- All 74 non-deleted files are blob-identical to the reviewed head
- What changes for in-flight PRs: any open PR that edits
liveness/state-counts.mdor the strictness counts file meets this change once, on its next base merge. Keep the deletion, regenerate withgen:liveness-counts/gen:strictness-ledger, and letbash scripts/pm/os-regen-merge.shroute the shards. After that round, two PRs that move different types or directories touch disjoint files. - Closing:
Fixes #20361closed this card ascompleted;pm:dispatchedis removed in this act. Themigrations/registry.tsstep-18 rationale tail, which this card kept out of scope, is [finding]migrations/registry.ts: every major-18 retirement PR rewrites the closing line ofstep18.rationale, so any two in flight conflict in GitHub's merge #20535.
Generated by Claude Code
- Merged through the merge queue at 2026-09-29T01:21Z as
- added a commit that references this issue
on Sep 29, 2026
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'smergeable_state.Filed by the
domain:specexecution 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.mdis 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 ismerge=os-regenin.gitattributes, but GitHub's server-side merge (the PR'smergeablestate 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 becomesdirty, and a dirty PR gets no CI run at all (0 check runs).Measured (all by
GET /pulls/Nmergeable_stateplus a driver-freegit merge-tree):statusand nestedwebhookskeys (16), which nothing enforces #20273):dirtyat153f652c27, with 0 check runs. After a merge-and-regenerate round it went green at597e867f4d, and within the hour it wasdirtyagain on the same file.os testprints suite and scenario names, filters bytags, and skips on unmetrequires(5 keys) #20289):dirtyat5d31b4d587onstate-counts.mdplus an adjacentliveness/README.mdrow.public,refreshKey,format,granularitiesand descriptions take effect (8 keys) #20282):dirtyat2cfa134c34onstate-counts.md, with 0 check runs.layoutaccepts only vertical | horizontal — theinlineandgridarms retired (#20221) #20262 (spec(ui):layout: 'inline' | 'grid'onobject-form/FormViewparse green and render asvertical— enforce-or-remove (ADR-0049) #20221):dirtyon the same family of files.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 todocs/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.
.gitattributesalready 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", butstate-counts.mdis still a single file.Suggested shape (⛔ not a ruling)
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.Dedupe: scanned the objectstack issues and PRs updated since 2026-09-10 for
state-counts.mdtogether 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.