Repository navigation
check-half-states: H22's pinned closed-update divisor has no staleness alarm (H8 has one for its rate premise) — the board now runs 1.7–2.2× the 2026-08-31 pin #16393
Description
Activity
Blocked-by: #16217
Same file and leg as PR #16391; dispatched after it merges.
Generated by Claude Code
Claim: PM loop round 8 (continued) — flight R, one pure-code card: H22's pinned divisor
MEASURED_CLOSED_ISSUE_UPDATES_PER_DAY(188.3, measured 2026-08-31) has drifted to ~312–414 rows/day on this board (a factor of 1.66–2.2, measured by flight N) with NO staleness alarm, while H8 carries one for exactly this shape (observedMergeRatePerDay+classifyRatePremise+RATE_PREMISE_BAND, firing past a factor of 2 or past the re-measure horizon). Ruled: apply H8's alarm shape to H22's divisor — observed closed-issue update rate from the pages the closed pass already reads, classified against the pinned premise with the same band and horizon, a report-only clause when it fires; the pinned constant is NOT overwritten by a sweep (H8's rule), and the alarm names the re-measure act. Unblocked by PR #16391 (flight N) merging at 18:29Z.
Session:session_019RfFHiRCSs3JXLK4cwcfox
Branch:claude/issue-16393-h22-divisor-staleness-alarm
Worktree:objectstack-issue-16393
Domain:domain:skills
File surface:scripts/pm/check-half-states.mjs(H22's leg, its premise constants, the census clause, the self-test). ⛔ No other file; no new H-row; family markers untouched.
Container & model: XS,mode:subagent, opus —dispatch-gates.mjs --tier: no path-derived mandate onscripts/pm/**.
Clause-②: no
Serial: no open PR touchescheck-half-states.mjs(PR #16391 merged 18:29Z). Pure code ⇒ in-seat review, then the seat flips ready and arms SQUASH auto-merge;skip-changeset. The PR carriesFixes #16393.
Generated by Claude Code
os-dev-report
{ "issue": 16393, "status": "done", "branch": "claude/issue-16393-h22-divisor-staleness-alarm", "pr": "https://github.com/objectstack-ai/objectstack/pull/16406", "premise_still_valid": true, "summary": "H22's pinned closed-update divisor now carries H8's staleness alarm, applied by REUSE rather than copy, in one file (scripts/pm/check-half-states.mjs). Three seams: observedMergeRatePerDay becomes the H8-named wrapper over a generic observedRatePerDay(rows, field); classifyRatePremise takes a premise descriptor (MERGE_RATE_PREMISE / CLOSED_UPDATE_RATE_PREMISE) so RATE_PREMISE_BAND and RATE_PREMISE_STALE_DAYS are shared by construction; and the closed pass reports closedRateObserved from the pages it already reads, riding SWEEP_COUNT_KEYS. The census clause states the pinned rate, the observed one, the factor and the act on every run and in every state. The pinned constant 188.3 and its _AT 2026-08-31 are NOT overwritten by this PR or by any sweep, per H8's rule; the act the alarm names is a hand re-measure and re-pin. H8's own rendered output was measured byte-identical (pre-change module imported beside the new one; nine premise inputs across all four states, both media, plus the reader's four degenerate shapes: 0 differences).", "tests": "SELF-TEST: node scripts/pm/check-half-states.mjs --self-test -> exit 0, 2588 -> 2636 cases (+48). All 48 new cases are named '#16393 ...' and were observed in the passing output (grep -c '#16393' = 48), not inferred from the total. GATES (each exit captured before any pipe, all at commit 31c6278237, tree clean): node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 36 commands from the final file list; all 36 were run and ALL exited 0; dispatch-gates --ran reconciliation printed '36 derived famil(ies) accounted for - 36 run, 0 NOT-MEASURED' (exit 0, 0 UNRUN). check-clause2-carriers --self-test -> exit 0 (190 cases). check-governed-merges --test scripts/pm/check-half-states.mjs -> exit 0, verdict line: 'NOT governed - ordinary queue landing applies to a PR with exactly this file list.' check:nul-bytes -> exit 0 ('OK (scanned 8046 text file(s) ... no raw ASCII control bytes)'), plus an independent control-byte scan of the changed file: 0 hits. Whole-repo pnpm lint (eslint . --no-inline-config) through scripts/pm/os-verify-lock.sh (slot issue-16393, acquired at 0s wait, one acquisition): VERDICT line 'command-exit 0 - held the lock 80s - waited 0s'. This is the FULL repo scan, not a narrowed one, so no narrowing declaration applies. ABLATION - three legs on the new predicate. NO REBUILD LEG APPLIES and this is stated rather than omitted: the module is a plain .mjs run directly by node, there is no dist/ between the edit and the run, so ablation-dist-preflight has nothing to check. Each leg: mutate -> PROVE the mutation reached the disk by git hash-object moving off the HEAD blob (an absent or unchanged hash is read as FAILURE, never as 'nothing to compare') -> run -> restore with 'git checkout HEAD -- ABS_PATH' -> prove the restore by hash equality AND an empty git diff HEAD. Absolute paths throughout; trap on EXIT/INT/TERM. Leg A (the clause never marks a fired premise loud): 0671dc4f -> 9ae383a8, self-test exit 1, 4 cases red. Leg B (rate the rows ADMITTED instead of the rows READ): 0671dc4f -> e7b729d9, self-test exit 1, 5 cases red, observed rate moved 433.33 -> 436.36. Leg C (classifyRatePremise ignores the premise descriptor): 0671dc4f -> 6158c444, self-test exit 1, 12 cases red. All three restored to the HEAD blob 0671dc4f with git diff HEAD empty, and the self-test re-ran green at 2636. LIVE SWEEPS (read-only, PM_SWEEP_REPO, both exit 0). objectstack - the alarm FIRES as flight N predicted: 'RATE PREMISE DRIFTED - this sweep observed ~397.9 closed-issue updates/day against a pinned MEASURED_CLOSED_ISSUE_UPDATES_PER_DAY = 188.3/day, measured 2026-08-31 (7d ago): a factor of 2.11, outside the 2x band.' (12 pages, horizon reached, back to 2026-09-03). objectui - silent: 'rate premise OK - observed ~175.5/day against pinned MEASURED_CLOSED_ISSUE_UPDATES_PER_DAY = 188.3/day, measured 2026-08-31 (7d ago) (factor 0.93, band 2x).' (6 pages, horizon reached). CI on the draft PR head 31c6278237: polled in the FOREGROUND to convergence - 35 check runs, ALL COMPLETE, 24 success / 11 skipped / 0 failures / 0 pending.", "mcp_calls": "1 - create_pull_request only; every other GitHub read and write went through repo-scoped REST (probed 200 first), and the card and its comments were read via REST rather than the payload channel because claim-bearing state is not authoritative there", "open_questions": [], "out_of_scope_findings": [] }
Generated by Claude Code
Promoted by the skills seat from flight N's
noted, not fileditem at PR #16391's ACCEPT.The reading
scripts/pm/check-half-states.mjspinsMEASURED_CLOSED_ISSUE_UPDATES_PER_DAY = 188.3(measured 2026-08-31) as the divisor behind H22's closed-card page budget. Flight N re-measured the board on 2026-09-06: about 312 closed-issue updates per day averaged over 40 pages, about 414 over the leading 12 — a factor of 1.66 to 2.2 above the pin. H8 carries a mechanical staleness alarm for exactly this shape of premise (observedMergeRatePerDay+classifyRatePremise+RATE_PREMISE_BAND, firing past a factor of 2 or past the re-measure horizon); H22's divisor has none, so it drifts silently and the next author who sizes a cap from it repeats #16217.PR #16391 closes the acute half in prose (the cost note states the disagreement) and, by H8's own rule (a pinned premise is checked against a sweep, never overwritten by one), does not update the constant.
What
Apply H8's alarm to H22's divisor: the sweep measures the observed closed-issue update rate from the pages it read anyway, classifies the pinned premise against it with the same band and re-measure horizon, and reports the drift in the census clause; a self-test pins the in-band, out-of-band and horizon-expired shapes. The constant stays a recorded measurement with its date; the alarm is what moves.
Acceptance
check-half-states --self-testexit 0 with the new cases named;check-clause2-carriers --self-test;check-governed-merges --testexit 0 (not governed); whole-repo lint.Serial
After PR #16391 merges (the same file and leg).
Refs #16217.
Generated by Claude Code