Skip to content

tooling(pm): re-pin the measured closed-issue update rate at 415.1/day - #16423

Queued
claude[bot] wants to merge 1 commit into
mainfrom
claude/issue-16419-repin-closed-update-rate
Queued

tooling(pm): re-pin the measured closed-issue update rate at 415.1/day#16423
claude[bot] wants to merge 1 commit into
mainfrom
claude/issue-16419-repin-closed-update-rate

Conversation

@claude

@claude claude Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor

Fixes #16419

H22's pinned divisor MEASURED_CLOSED_ISSUE_UPDATES_PER_DAY was measured 2026-08-31 at 188.3/day. The staleness alarm that landed with PR #16406 read a factor of ~2.1 against it on its first live run and named this act. ⛔ A sweep never writes the pin (H8's rule): the re-measure below is by hand, and the sweep's own closedRateObserved appears only as the CONTROL beside it, never as its source.

The measurement

By hand, over the endpoint the constant's own docblock prescribes and no other — GET /repos/{repo}/issues?state=closed&sort=updated&direction=desc&per_page=100, on objectstack-ai/objectstack, in pages of 100. All three depths are computed from ONE read of 12 pages (HTTP 200 on every page), started 2026-09-06T21:59Z and finished 22:00Z.

The rate is rows READ divided by the updated_at span they cover — the raw stream, pull requests included, which is the population this pin has always been measured over (570 of the 1,200 rows are PRs).

depth rows updated_at span rate
400 rows — the pin's own window 400 2026-09-05T22:47:54Z … 2026-09-06T21:55:40Z = 0.964 d 415.1/day
800 rows (depth re-read) 800 2026-09-04T20:42:55Z … 2026-09-06T21:55:40Z = 2.051 d 390.1/day
1200 rows (depth re-read) 1200 2026-09-03T19:42:36Z … 2026-09-06T21:55:40Z = 3.092 d 388.0/day

The three depths agree to within 7% (415.1 / 388.0 = 1.07), far inside the 2x band, so there is nothing to adjudicate between them. The pin takes the 400-row window, the docblock's own convention; the deeper reads are recorded beside it exactly as that block has always recorded them.

CONTROL, not instrument. The read-only sweep on this board observed ~388.0/day over the 12 pages its own closed pass read — an independent agreement with the 1,200-row depth above, to one decimal. It is quoted, never assigned.

The alarm, before and after

Read-only sweep, objectstack-ai/objectstack, H22's window clause:

Before (at 0ea5f9d9f7, 2026-09-06T21:5xZ):

⚠️ RATE PREMISE DRIFTED — this sweep observed ~388.0 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.06, outside the 2x band.

After (at 5d60e2aea5, 2026-09-06T22:0xZ):

rate premise OK — observed ~388.0/day against pinned MEASURED_CLOSED_ISSUE_UPDATES_PER_DAY = 415.1/day, measured 2026-09-06 (1d ago) (factor 0.93, band 2x).

The census clause moves with it by construction, since it interpolates the constant: "the stream is consumed by closed-issue ACTIVITY (~415.1/day, measured 2026-09-06), not by closures (~11/day)".

Sibling board, afterobjectstack-ai/objectui swept with THIS file (its own installed copy is older and carries none of this machinery):

⚠️ RATE PREMISE DRIFTED — this sweep observed ~174.9 closed-issue updates/day against a pinned MEASURED_CLOSED_ISSUE_UPDATES_PER_DAY = 415.1/day, measured 2026-09-06 (1d ago): a factor of 0.42, outside the 2x band.

That is a reading, not a regression this PR can avoid: the two boards measured 2.2x apart within the same hour (388.0 vs 174.9), so no single pinned divisor is in band on both. It is recorded under acceptance notes below rather than acted on here.

What changed, and why the diff is larger than two literals

  • The constant (188.3 → 415.1), its _AT ('2026-08-31''2026-09-06'), and the measurement block above them (read time, endpoint, window, rate, the two depth re-reads). The paragraph stating WHY the rate is carried as data, and the ⛔ updates-not-closures warning, are byte-identical — ruled, and verified in the diff.

  • Self-test cases that pinned 188.3, named as the ruling requires. Case count unchanged at 2,636; 14 cases were red on the constant alone and are repaired in place:

    • the two window-arithmetic cases that divide by the pin (windowCoverageDays(400, pin) 2.12 → 0.96 d; pin / 10.7 17.6 → 38.8);
    • the synthetic-stream fixtures, whose steps encode "2x the pin" and "1x the pin". The drifted stream moves to 0.11-day steps (28 pages, 2,800 rows over 2.97 d = ~942.8/day, factor 2.27); the in-band stream takes the drifted one's old 0.25-day steps (13 pages, 1,300 rows over 3.0 d = ~433.3/day, factor 1.04). ⚖️ The fixture that ran 2x the pin last week is the one that now reads AT it — the board moved that far, and the generator's page bound grew 20 → 30 to reach the new horizon;
    • the wording pins that quote the rendered numbers (a factor of 2.302.27, observed ~433.3~942.8, = 188.3/day= 415.1/day), and the pair asserting a drifted sweep does NOT rewrite the pin, which pins the literals themselves.
  • Three prose sites that stated the old divisor in the present tense and would have been false the moment this landed. Each is a clause, each is named here because a silent one is unreviewable:

    • CLOSED_ISSUE_WINDOW_DAYS cost note: "the divisor below still reads 188.3 and this note states the disagreement instead of quietly editing it" — now states that the disagreement was closed by the hand re-measure, which is what H8's rule prescribes;
    • CLOSED_ISSUE_WINDOW_PAGE_CEILING: "the divisor is a factor of ~2.2 light" — now past tense, with the re-pin named;
    • the closed pager's own comment, which quotes the pin's measurement window (400 rows / 2.125 days400 rows / 0.964 days).

    Every remaining 188.3 in the file is dated history and reads as such (the 2026-08-31 measurement table, the retired ceiling's derivation, the alarm's origin narrative).

Gates — every exit captured before any pipe, at 5d60e2aea5

  • node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 36 commands from the real change set (1 path, three-dot vs merge base 0ea5f9d9f); all 36 were run, and --ran reconciles: ✓ dispatch-gates --ran: 36 derived famil(ies) accounted for — 36 run, 0 NOT-MEASURED. One of them, pnpm check:pm-dispatch-gates, needs ~9 minutes (1,534 cases pass).
  • node scripts/pm/check-half-states.mjs --self-test✓ check-half-states self-test: 2636 cases pass. (exit 0; same count as before the change).
  • node scripts/pm/check-clause2-carriers.mjs --self-test✓ check-clause2-carriers self-test: 190 cases pass (exit 0).
  • node scripts/pm/check-governed-merges.mjs --test scripts/pm/check-half-states.mjs → exit 0, ✅ NOT governed — ordinary queue landing applies to a PR with exactly this file list.
  • node scripts/check-nul-bytes.mjscheck-nul-bytes: OK (scanned 8057 text file(s) … no raw ASCII control bytes).
  • Whole-repo pnpm lint (eslint . --no-inline-config) through scripts/pm/os-verify-lock.sh (slot issue-16419, acquired first try): VERDICT command-exit 0 · held the lock 70s · waited 0s. Not a narrowed run — the whole tree, no eslint output.
  • Also run, because the derivation marks their rosters as sitting under a directory this path is in and their silence as evidence in neither direction: check-published-list-mirrors (and its self-test), check:console-injection, check:engine-double-contract, check:i18n-stale-fill, check:pm-label-desc-cap — all exit 0. check:published-readme-exports exits 3 = PREREQUISITE NOT MET (it needs built dist/*.d.ts for 37+ packages): NOT MEASURED, not a finding, and unrelated to a diff that touches no package.

skip-changeset: no package publishes anything from this diff — one PM tooling script.

验收备注 (acceptance notes — observations, not cards, per #16351)

  1. One pinned divisor, two boards 2.2x apart. Measured this hour: objectstack ~388.0/day, objectui ~174.9/day. The file's adoption note ([finding] The half-state patrol sweeps objectstack ONLY — 37 blocked cards in objectui/cloud/objectos have never been machine-swept, and 7 stale blocks were sitting in the gap #11217) says the only per-repo input of a verbatim copy is the repository variable naming that install's anchor issue; this divisor is measurably a second one. Nothing breaks today — objectui's installed copy predates this machinery, and when it is refreshed the alarm will say so loudly on day one, which is the alarm working. Noted for the seat rather than filed: it is an observation about an accurate note going stale, not a reproducible defect, a contract violation, or a metadata-authoring trap.
  2. The ⛔ warning's ~17x is now ~39x, and it was ruled byte-identical. The preserved paragraph says update events and closures "differ by ~17x on this board" — true of 188.3 against the 10.7 closures/day measured 2026-08-31, and ~38.8x of the new pin against that same recorded closure rate. The self-test case that computes exactly that ratio had to move (17.6 → 38.8), so the file now states two multipliers. I did not touch the paragraph: it was ruled byte-identical, and writing a new multiplier there honestly needs a closure-rate measurement this card did not commission. One line for the seat, either way it goes.

Generated by Claude Code


Generated by Claude Code

`MEASURED_CLOSED_ISSUE_UPDATES_PER_DAY` was measured 2026-08-31 at 188.3/day
and the divisor staleness alarm now reads a factor of ~2.1 against it on this
board. Re-measured by hand over the endpoint the constant's own docblock
prescribes (`GET /repos/{repo}/issues?state=closed&sort=updated`, read
2026-09-06T21:59Z): 400 rows / 0.964d = 415.1/day, re-read at depth 800 rows /
2.051d = 390.1/day and 1200 rows / 3.092d = 388.0/day.

The pin takes the 400-row window, the docblock's own convention. Self-test
cases that pinned 188.3 — the window arithmetic, the synthetic stream fixtures
and the clause wording — move with it; three prose sites that quoted the old
divisor in the present tense are corrected in place.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
@github-actions github-actions Bot added the size/s label Sep 6, 2026
@claude claude Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 6, 2026
@claude

claude Bot commented Sep 6, 2026

Copy link
Copy Markdown
Contributor Author

Verdict: ACCEPT

Implemented-by: os-dev flight S (opus), branch claude/issue-16419-repin-closed-update-rate, head 5d60e2aea5
Reviewed-by: pm-dispatch skills seat (contract-tier read in a detached compare worktree at 5d60e2aea5, merge-base 0ea5f9d9f7; origin/main has moved five commits since and none touch this file)

What was checked

  • Diff is exactly one file, scripts/pm/check-half-states.mjs, +53/-46, no logic change: the pin MEASURED_CLOSED_ISSUE_UPDATES_PER_DAY 188.3 -> 415.1, its _AT 2026-08-31 -> 2026-09-06, the docblock measurement block rewritten from the hand read (12 pages at 2026-09-06T21:59Z: 400 rows / 0.964 d = 415.1; 800 / 2.051 d = 390.1; 1200 / 3.092 d = 388.0), the three prose sites that quoted the old pin as current now quote it as the pin of its day, and the 14 self-test cases that derive from the constant.
  • The ruled-protected bytes are untouched: the ~17x warning paragraph (line 12660 in this head) and the H8 "CHECKED, never overwritten" rule both read byte-identical against origin/main.
  • Self-test fixtures were re-derived, not re-tuned: the 2x stream (0.11-day steps, 30 pages) stops at page 28, 2800 rows over 2.97 d = 942.76/day, factor 2.27 -> drifted; the 1x stream is the former 2x stream (0.25-day steps, page 13, 433.33/day, factor 1.04 -> ok). Both agree with the arithmetic in the fixture comments.
  • Gates in the compare worktree: node scripts/pm/check-half-states.mjs --self-test = 2636 cases pass (count unchanged); node scripts/pm/check-governed-merges.mjs --test scripts/pm/check-half-states.mjs = exit 0, NOT governed. CI on 5d60e2aea5: 35 check runs, 24 success / 11 skipped / 0 failure (skip-changeset applied by the changeset gate).
  • The before/after pair on the live H22 clause is the reverse verification for a constant change and both legs are quoted in the PR body (DRIFTED factor 2.06 -> OK factor 0.93).

Rulings

  • Open question (the ~17x multiplier in the protected paragraph): A for this PR, as shipped. C is the durable form and is ruled now in one line: the next PR that opens that docblock for any reason replaces the numeric multiplier with "more than an order of magnitude" so the paragraph survives every re-pin. No card: a stale derived reading in a comment is below the finding admission threshold; it rides as a ## 验收备注 item here and in #16388's rider list is not needed (different file).
  • Wording that names the card number inside a code comment (#16419) follows this file's established style (#16393, #13606) and is fine; the no-issue-numbers rule binds operational skill text, not code comments.

验收备注 (noted, not filed)

  • One pinned divisor cannot describe two boards: measured in the same hour with this head, objectstack ~388.0/day and objectui ~174.9/day, so the sweep reads objectui as DRIFTED at factor 0.42. Nothing breaks today because objectui's installed copy predates the rate machinery entirely; the alarm will say so on the day that copy is refreshed, which is the alarm working. The adoption note's claim that the anchor-issue variable is the only per-repo input of a verbatim copy is stale by one input (the divisor). Recorded here for whoever next refreshes objectui's copy.
  • The summary line's H22 clause (line 9768 in this head) still says the retired 4-page cap "covered a ragged 2.1 days of update-recency". That is the reading of the old cap at the old divisor and reads as history in place; at the new pin the same 400 rows buy ~0.96 d. Left alone deliberately; flagged so the next re-pin does not inherit it silently.
  • The ~17x multiplier (ruled above) is the third item; it and the 2.1-day clause are the two derived readings in this file that a re-pin cannot refresh without opening protected or out-of-scope bytes.

Landing

Not governed, ordinary queue landing: the seat flips the draft to ready and arms auto-merge (SQUASH). On merge the seat strips pm:dispatched and clears the assignee on #16419.


Generated by Claude Code

@os-steve
os-steve marked this pull request as ready for review September 6, 2026 23:25
@os-steve
os-steve enabled auto-merge September 6, 2026 23:25
@os-steve
os-steve added this pull request to the merge queue Sep 6, 2026
Any commits made after this event will not be merged.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

1 participant