tooling(pm): give H22's pinned closed-update divisor the staleness alarm H8 carries - #16406
Merged
Merged
Conversation
…arm H8 carries H22's page budget converts to a coverage-in-days by dividing by MEASURED_CLOSED_ISSUE_UPDATES_PER_DAY, a hand measurement carrying its own date and nothing else. Re-measured on 2026-09-06 the board ran ~312 closed-issue updates/day over 40 pages and ~414 over the leading 12, against a pin of 188.3 -- a factor of 1.66 to 2.2 accumulated in six days, announced by no run. H8 has carried a mechanical alarm for exactly this shape since #13499. Apply it rather than copy it: the observed-rate reader becomes generic over the stamp it counts (observedMergeRatePerDay delegates to it, byte-identical), classifyRatePremise takes a premise descriptor so the band, the horizon and the three verdicts are shared by construction, and the closed pass reports the update rate it observed from the pages it already read. The census clause states the pinned rate, the observed one, the factor and the act, on every run and in every state. The pin is CHECKED, never overwritten -- H8's rule. The act it names is a hand re-measure and re-pin. Self-test: 2588 -> 2636 cases, exit 0. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
Contributor
|
ACCEPT — in-seat review of PR #16406, head Implemented-by: Verified in a detached compare worktree at the PR head, not from the report:
Landing regime: pure code ⇒ the seat flips ready and arms SQUASH auto-merge in this same act; the merge is read on the PR object, never inferred. On the merge #16393 closes by Generated by Claude Code |
os-steve
marked this pull request as ready for review
September 6, 2026 20:01
os-steve
enabled auto-merge
September 6, 2026 20:01
This was referenced Sep 6, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #16393
H22's closed-card page budget converts to a coverage in DAYS by dividing by
MEASURED_CLOSED_ISSUE_UPDATES_PER_DAY— a hand measurement carrying its own date andnothing else. H8 has carried a mechanical staleness alarm for exactly that shape since
#13499. H22's divisor had none, so it drifted by a factor of 1.66–2.2 in six days and no
run said a word. PR #16391 landed the acute half in prose; this is the mechanical half.
Before → After
Before — the census clause quoted the pin and stopped there:
After — the same clause additionally states what THIS sweep observed, the factor, and
the act, on every run and in every state (see the live clauses below).
What changed — one file,
scripts/pm/check-half-states.mjsApplied by REUSE, not by copy, at three seams:
observedMergeRatePerDaybecomes the H8-named wrapper over ageneric
observedRatePerDay(rows, field). The stamp is the only thing that differs:H8 counts
merged_aton its merged window, H22 countsupdated_aton the pages itsclosed pass already reads.
classifyRatePremisetakes a premise descriptor(
MERGE_RATE_PREMISE,CLOSED_UPDATE_RATE_PREMISE) carrying the constant name, thequantity counted, the stamp and the two prose halves.
RATE_PREMISE_BANDandRATE_PREMISE_STALE_DAYSare therefore shared by construction rather than by twoauthors remembering to keep them equal.
closedRateObservedfrom the pages it alreadyholds, so it costs no request, and it rides the enumerated
SWEEP_COUNT_KEYScontract.⛔ The pin is checked, never overwritten — H8's rule.
MEASURED_CLOSED_ISSUE_UPDATES_PER_DAY(188.3) and its
_AT(2026-08-31) are untouched by this PR, and the act the alarm names isa hand re-measure and re-pin.
H8's output is byte-identical, and that is measured rather than asserted
Parameterising a shared classifier can quietly reword the caller that was already using it.
The pre-change module was imported beside the new one and both were driven over nine premise
inputs covering all four states, in both media, plus the reader's four degenerate shapes:
0 differences in
state,message,pinned,ratio,ageDaysor the rendered lines.The one design decision worth a reviewer's eye
The rate is measured over the rows the pass READ, not the rows it ADMITTED. The pin
was measured over the raw stream (400 rows / 2.125 days), while the returned list holds only
the in-window closures — a strictly smaller population over a strictly shorter span. Rating
those two against each other reports the difference between two quantities as drift in one
of them. Pinned in both directions, and ablation leg B below moves the observed number from
433.33 to 436.36 by making exactly that mistake.
Live sweeps — read-only, at
31c6278237objectstack — the alarm FIRES, as flight N's re-measure predicted:
objectui — silent:
Worth the seat's attention: the pin was measured on objectstack, and it now describes
objectui (factor 0.93) better than the board it was taken on (factor 2.11). That is a
reading, not a re-pin — this PR changes no constant.
Self-test
2588 → 2636 cases (+48), exit 0. Every new case is named
#16393 …; all 48 wereobserved running in the passing output, not inferred from the total.
Coverage: the shared instrument (delegation identity, stamp selection, the three
unmeasurable shapes); H22's premise through its descriptor in both directions (it names
H22's constant and quantity, never H8's, and H8's own defaults are unmoved); the three
verdicts plus the band edge; the calendar leg firing past the horizon at any rate; two
synthetic streams driven through the real pager (2.30x fires, 1.06x stays silent); and
the clause in both loud and quiet form.
h22RatePremiseClausewith a fixednowMs. The summaryline reads the real clock, so a case asserting a verdict through it would go red on a
calendar date rather than on a defect — the permanently-red gate this repo retires. The
cases that do run through
summaryLineassert only time-independent properties.Ablation — three legs on the new predicate
Each leg: mutate → prove the mutation reached the disk by hash → run → restore against
HEAD→ prove the restore by hash and an emptygit diff HEAD. An absent or unchangedhash is read as FAILURE, never as "nothing to compare". No build leg applies: this module is
run directly by node, so there is no
dist/between the edit and the run.0671dc4f→9ae383a80671dc4f→e7b729d9classifyRatePremiseignorespremise0671dc4f→6158c444All three restored to
0671dc4f(the HEAD blob),git diff HEADempty, and the self-testre-ran green at 2636 afterwards.
Gates — every exit captured before any pipe, at
31c6278237dispatch-gates --commands --repo objectstack-ai/objectstackon the final file list →36 commands; all 36 run, all exit 0.
dispatch-gates --ranreconciliation →✓ 36 derived famil(ies) accounted for — 36 run, 0 NOT-MEASURED, 0 UNRUN.check-half-states --self-test→ exit 0 (2636 cases).check-clause2-carriers --self-test→ exit 0 (190 cases).check-governed-merges --test scripts/pm/check-half-states.mjs→ exit 0:✅ NOT governed — ordinary queue landing applies to a PR with exactly this file list.check:nul-bytes→ exit 0; plus an independent control-byte scan of the changed file, 0 hits.pnpm lint(eslint . --no-inline-config) throughos-verify-lock.sh(slot
issue-16393) →VERDICT command-exit 0 · held the lock 80s · waited 0s. The fullrepo scan, not a narrowed one.
skip-changeset: this diff publishes nothing from any released package — it is onepatrol-tooling script under
scripts/pm/.Generated by Claude Code