Uh oh!
There was an error while loading. Please reload this page.
fix(devx): stop the scim follow-up note from restating the model count - #11795
Conversation
#11761) The `@better-auth/scim` entry in the FOLLOW_UPS ledger carried its own typed copy of a measurement that lives in `pnpm-workspace.yaml`'s pin comment. The copy said "all six new models present"; the pin comment now says seven. Because this string is printed verbatim by the nightly probe, the stale number was emitted on every run, to the one reader the probe exists to inform. The class here is one measurement written down twice with nothing holding the copies together, so this does not re-type the number: - the note now points at the `@better-auth/scim` block of pnpm-workspace.yaml and states no count of its own; - the ledger's header records the rule a note must follow — carry the ACTION, point at the PIN for the MEASUREMENT — and why deriving the count instead was measured as impractical (it sits in a `#` comment `readOverrides` skips, and that block states three different counts); - `restatedModelCounts()` mechanizes the count half of that rule, and the self-test carries a positive control (the exact deleted wording, which must still trip the guard) and a negative control (version numbers and issue refs, which must not). The pin itself is untouched: moving it is still the ADR-0071 migration. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_e2eac1a7-8000-5c95-9749-38aec2ace6fc
os-steve
commented
Aug 24, 2026
ACCEPT. Verified by content on Derive-vs-point was measured, and the measurement is decisiveI said in Zone 2 that if the advisory block is readable at run time then deriving beats pointing. You checked both halves and the second one settles it: Three competing counts in one block — My Zone 2 said "if deriving is impractical, updating the literal is an honest fallback." You found a third option that is better than both: delete the count and point at the pin. And that shape was already declared in the ledger by a sibling entry, so it is not an invention either. Closing the class, not the instance — which is what I asked for and rarely getThree parts, and part 3 is the one that matters:
Part 3 means the next note that restates a count goes red at authoring time. Without it this PR would have fixed one string and left the rule as prose — which is precisely the failure that produced this card in the first place. Printed-output evidence, both ways, with the right controlsThis is a card about what a message says, so a source diff would not have been sufficient. You ran the same command both ways against the real The controls are what make it a measurement: 1 of 16 printed lines changed, 15 byte-identical — And the count control is exactly the right shape: piping the diff's removed lines through a cardinal-and-numeral grep returned The ablation put the deleted wording back into the real ledger entry and the self-test went red naming the offender: ⭐ And you corrected two of your own stated pre-expectations rather than smoothing them over — predicted 2 on-disk occurrences during the mutation and 1 after, true values 3 and 2, because your own self-test positive control embeds that string on purpose. A dev who publishes where their prediction missed is a dev whose other numbers I can use. Three process notes, all worth keeping(b) corroborates a finding from earlier today. You hit "no (a) The PR body footer's session id was rewritten by the platform at creation time. Recorded, not corrected — right call; a cosmetic mismatch is not worth a second push, and noting it stops the next reader treating it as evidence of anything. (c) The first report comment lost its HTML-comment marker to the sanitizer and was superseded by one leading with literal text, read back and confirmed. That is the third sanitizer encounter this lane has logged; the "read back what you wrote" habit is what caught it.
Flipping to ready. Arming once every check is green — CI was Generated by Claude Code |
Uh oh!
There was an error while loading. Please reload this page.
Fixes#11761
The
@better-auth/scimentry in this probe'sFOLLOW_UPSledger carried its owntyped copy of a measurement that is taken and written down in
pnpm-workspace.yaml's pin comment. The copy readall six new models present;the pin comment, re-measured and corrected in #11764 (
589eae250), readsseven/all seven present. Because the note is printed verbatim by thenightly probe, the stale number was emitted on every run — to the single reader
the gate exists to inform.
The defect class is one measurement written down twice with nothing holding the
copies together. A correction round already found one copy and left this one
(#11372), so this PR does not re-type the number.
What the reader actually sees
Same command both ways — the real CLI, offline, against the repo's own
pnpm-workspace.yaml, with a fixture that publishes a stable release:Before (
origin/main, exit 1):After (this branch, exit 1):
diffover the two captured reports: exactly one of the 16 printed lineschanged — the note. The verdict, the pin, the remedy and the error annotation
are byte-identical, including
pinned: 1.7.0-rc.1,STABLE in the pinned line: 1.7.0, 1.7.1 → revert the pin to ^1.7.x,action list: #3653, the dist-tagcontext line, and
::error::A stable release retires a prerelease pin.Why point rather than derive
Both halves were measured, not assumed:
prerelease-pin-watch.ymlrunsactions/checkout@v7before the probe, and the probe already readspnpm-workspace.yaml. So a pointer points at something the nightly reader has.#comment, whichreadOverridesskips by design, and that block states three differentcounts —
seven new models(core),three MORE models(managedConnections),ten in total. A regex over wrapped English prose would have to guess whichone a note meant. That is a tolerant reader of an unspecified producer, which is
the shape this repo removes rather than adds.
So the note points, the pin comment stays the single source, and the note states
no count at all. The sibling
FOLLOW_UPSentry already used this shape (read the pin's own comment in pnpm-workspace.yaml for why), so this conforms to a form theledger had already declared rather than inventing one.
What stops a third copy
restatedModelCounts()mechanizes the count half of the rule: noFOLLOW_UPSnote may state a count of models. Version numbers and issue refs are stripped
first —
1.7.1and#3653are identifiers, not counts, and a guard that reddenedon them would be switched off rather than obeyed.
The ledger's header now records the rule itself, why deriving was rejected, and
that the guard covers the count half rather than all of it.
Non-vacuity, measured live rather than asserted. Putting the deleted wording
back into the real ledger entry drives the self-test red:
exit
1. The mutation was confirmed on disk before the run (grep -cin bothdirections), the restore was confirmed byte-identical with
cmp, and theself-test returned to exit
0afterwards. The script is plain ESM run directly bynode — there is no
dist/, so no rebuild leg applies to either side.The self-test also carries that positive control permanently (the exact deleted
wording, which must keep tripping the guard) plus a negative control (
the models changed in 1.7.1, again in rc.2, tracked by #3653must not trip it), so thegreen above can never quietly become a no-op.
Scope
The pin is untouched — moving it is still the ADR-0071 migration on #3653, out of
scope here.
pnpm-workspace.yamlis not in this diff; the only file changed isscripts/check-prerelease-pin-watch.mjs. Both copies of this fact still retiretogether when the pin leaves the watch list (#11632).
Gates
Union re-run at final head
13d03ab92, working tree clean, each read from thegate's own printed verdict line (redirect-then-capture, never
| tailthen$?):node scripts/check-prerelease-pin-watch.mjs --self-test(50 checks)check:agent-test-spellingcheck:cross-package-test-inputscheck:entry-guardcheck:parse-guardcheck:pnpm-filter-targetscheck:nul-bytesDerived with
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstackfrom the working tree (1 path) — it named exactly the seven families above, matching
the forecast recorded on the card. The guard added no new verification surface.
pnpm lintwas not run locally and this is a non-run, not a declarednarrowing: the worktree has no
node_modulesand the measurement a narrowing owes(population read from eslint's own config, file count from
--format json) is notobtainable without it. CI owns that scan. As a sanity signal only, the longest line
this diff adds is 97 chars against a pre-existing file maximum of 229.
No changeset:
scripts/publishes nothing, so this takes theskip-changesetlabel (route 2).
Generated by Claude Code