Repository navigation
tooling(pm): price a destination's ordinary ruled raise apart from its move's - #15266
Merged
Merged
Conversation
…s move's `CROSS_FILE_MOVES` computed a move's raise as `ceiling − was`, so an ORDINARY ruled raise later taken on the same destination was read as the move's: on this tree the platform-readings entry measured `314 → 358 = +44 against −11` and went red twice, for lines no source was ever asked to pay. The one lever available was carrying `was` forward past the ruling, which keeps the arithmetic right by making the field mean two things at once. A declaration may now carry `ruledRaises` — one record per ordinary ruled raise taken on the destination since the move, each quoting the ruling that authorised it and dated — subtracted before the move's raise is measured, and restored alongside `was` in the map-wide total. `was` goes back to one fact, so the reviewer's completeness check keeps the single shape it has always had. The live declaration migrates back to `was: 314` with the 2026-09-04 intake ruling's +34 recorded and its words copied from the ceiling comment beside it. The gate's whole output is unchanged but for that one verdict line. Because the subtraction is a licence to grow, it carries two bars of its own: a record quoting no ruling is red, and so is a set of records claiming more lines than the ceiling stands above `was` — which is what stops an inflated record from reading as paid down. Neither proves the maintainer said the words; that stays the reviewer's check, as it already is for every `was` here. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_019RfFHiRCSs3JXLK4cwcfox
This was referenced Sep 4, 2026
os-steve
marked this pull request as ready for review
September 4, 2026 08:00
os-steve
enabled auto-merge
September 4, 2026 08:00
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 #15191
CROSS_FILE_MOVESpriced a move's raise asceiling − was. When the samedestination later took an ORDINARY ruled raise, the gate read that raise as the
move's. On this tree the
platform-readings.mdentry measured314 → 358 = +44 against −11and went red twice — condition (a) and the map-wide total — forlines no source was ever asked to pay. The only lever available was carrying the
destination's
wasforward past the ruling, which keeps the arithmetic right bymaking one field mean two things.
The shape
A declaration may now carry
ruledRaises: one record per ordinary ruled raisetaken on the destination SINCE the move, each carrying the ruling's own words and
its date. Those lines are subtracted before the move's raise is measured, and
restored alongside
wasin the map-wide total.wasgoes back to meaning exactlyone thing — the destination's ceiling on the day the move landed — so the
reviewer's completeness check keeps the single shape it has always had: every
washere, destination and sources alike, is that participant's ceiling onorigin/mainat f3ae441.The record sits on the move declaration rather than in a new per-path ledger
deliberately. A ledger keyed by path would be a half-populated list of the ruled
raises the whole map has taken, and this file's own header warns that an entry's
absence from a map is read as a fact. A field on the declaration says something
precise and true when it is empty: this move has had no ordinary raise land on it.
Because the subtraction is a licence to grow — it removes lines from the move's
raise that no source paid for — it carries two bars of its own:
use (the corner-bracket form for the maintainer's own words, the double-quoted
form for the English a ruling adopts; both are present in the map today, so the
bar is the quotation and not the bracket);
wasis RED. That is what stops an inflated record from driving the arithmeticnegative and reading as PAID DOWN, which would pass forever.
Neither bar proves the maintainer said the words, and neither pretends to. That
stays the reviewer's completeness check — the same one every
wasin this map hasalways relied on.
Rules kept verbatim: a raise carrying no quoted ruling still reds, a re-wrap is
still never payment, a ceiling is still raised only by the maintainer, and the
gate is not edited out of a red. Every pre-existing refusal assertion is unchanged;
declarations with no
ruledRaisesbehave exactly as before, which is what theuntouched cases pin.
The data migration
The live declaration goes back to
was: 314, with the 2026-09-04 intake ruling's+34 recorded as a
ruledRaisesentry whose ruling text is copied — not paraphrased— from the comment beside the 358 ceiling row. The ceiling row itself stays 358 and
keeps its quoted ruling; no other ceiling or pin moves.
Gate output diff against
origin/mainFull output of
node scripts/pm/check-skill-line-ratchet.mjs, 60 lines on bothsides, diffed. Exactly one line changes — the move verdict — and every per-file
verdict is byte-identical:
The move's own verdict is still
+10against a net source decrease of11, andthe total still reads
declared cross-file moves: 1, total ceilings down 1 line.Per-file lines unchanged, including
AGENTS.md is 1160 lines (ceiling 1162),.claude/skills/pm-dispatch/SKILL.md is 970 lines (ceiling 1005)andplatform-readings.md is 358 lines (ceiling 358; headroom 0).Verification — all at
e69c9623pnpm check:pm-skill-ratchet— green. Self-test 136 → 155 cases; 19 new, everyprior case unchanged.
separation (
raise = grossand the total's baseline back to baremove.was)while KEEPING
was: 314reds the live gate twice with the same314→358 (+44) against a net source decrease of 11plusraise the map's total by 33 lines, and reds 5 of the 155 self-test cases.Mutation proved on disk by grep counts on both the removed and injected text and
by a changed blob hash; restored with
git checkout HEAD --, proved bygit diff HEADempty and the blob hash back at5fd99aef, and the restored treeruns green again. No build step is involved — the gate is a dependency-free node
script run from source, so there is no
dist/for a stale artifact to hide in.(
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack;14 by path + 2 by change KIND + 6 whole-tree) — green.
pnpm check:skill-frame-sync,pnpm check:ratchet-remedy-authority(this script still classifies
excluded: 202 swept, 182 hand out noratchet-expanding remedy — the new refusal messages introduce no offer verb),
scripts/check-skills-token-ratchet.mjsand its self-test, andscripts/check-published-list-mirrors.mjs.pnpm lintthrough the shared lock:VERDICT command-exit 0 · held the lock 81s · waited 26s. Not narrowed.skip-changeset: tooling only,scripts/pm/**, nothing published from a package.Generated by Claude Code
Generated by Claude Code