Skip to content

tooling(pm): price a destination's ordinary ruled raise apart from its move's - #15266

Merged
os-steve merged 1 commit into
mainfrom
claude/issue-15191-ratchet-ruled-raise-vs-move
Sep 4, 2026
Merged

os-steve merged 1 commit into
mainfrom
claude/issue-15191-ratchet-ruled-raise-vs-move

Conversation

@claude

@claude claude Bot commented Sep 4, 2026

Copy link
Copy Markdown
Contributor

Fixes #15191

CROSS_FILE_MOVES priced a move's raise as ceiling − was. When the same
destination later took an ORDINARY ruled raise, the gate read that raise as the
move's. On this tree the platform-readings.md entry measured 314 → 358 = +44 against −11 and went red twice — condition (a) and the map-wide total — for
lines no source was ever asked to pay. The only lever available was carrying the
destination's was forward past the ruling, which keeps the arithmetic right by
making one field mean two things.

The shape

A declaration may now carry ruledRaises: one record per ordinary ruled raise
taken 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 was in the map-wide total. was goes back to meaning exactly
one 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
was here, destination and sources alike, is that participant's ceiling on
origin/main at 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:

  • a record quoting no ruling is RED, in either spelling the ceilings above already
    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);
  • a set of records claiming more lines than the ceiling actually stands above
    was is RED. That is what stops an inflated record from driving the arithmetic
    negative 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 was in this map has
always 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 ruledRaises behave exactly as before, which is what the
untouched 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 ruledRaises entry 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/main

Full output of node scripts/pm/check-skill-line-ratchet.mjs, 60 lines on both
sides, diffed. Exactly one line changes — the move verdict — and every per-file
verdict is byte-identical:

59c59
< ✓ ... cross-file move into .claude/skills/pm-dispatch/references/platform-readings.md: +10 (348→358) against a net source decrease of 11 (... cli.md 35→31, ... services.md 30→28, ... rest-channel.md 93→88); authorised by #14685 item 5 (comment 5520452691).
---
> ✓ ... cross-file move into .claude/skills/pm-dispatch/references/platform-readings.md: +10 (314→358, less 34 lines of ordinary ruled raise) against a net source decrease of 11 (... cli.md 35→31, ... services.md 30→28, ... rest-channel.md 93→88); authorised by #14685 item 5 (comment 5520452691).

The move's own verdict is still +10 against a net source decrease of 11, and
the 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) and
platform-readings.md is 358 lines (ceiling 358; headroom 0).

Verification — all at e69c9623

  • pnpm check:pm-skill-ratchet — green. Self-test 136 → 155 cases; 19 new, every
    prior case unchanged.
  • Ablation from the committed state, restore trap on absolute paths: reverting the
    separation (raise = gross and the total's baseline back to bare move.was)
    while KEEPING was: 314 reds the live gate twice with the same
    314→358 (+44) against a net source decrease of 11 plus
    raise 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 by
    git diff HEAD empty and the blob hash back at 5fd99aef, and the restored tree
    runs 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.
  • All 22 derived families for the changed path
    (node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack;
    14 by path + 2 by change KIND + 6 whole-tree) — green.
  • Also green: pnpm check:skill-frame-sync, pnpm check:ratchet-remedy-authority
    (this script still classifies excluded: 202 swept, 182 hand out no
    ratchet-expanding remedy — the new refusal messages introduce no offer verb),
    scripts/check-skills-token-ratchet.mjs and its self-test, and
    scripts/check-published-list-mirrors.mjs.
  • Whole-repo pnpm lint through 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

…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
@claude claude Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 4, 2026
@github-actions github-actions Bot added the size/m label Sep 4, 2026
@os-steve
os-steve marked this pull request as ready for review September 4, 2026 08:00
@os-steve
os-steve enabled auto-merge September 4, 2026 08:00
@os-steve
os-steve added this pull request to the merge queue Sep 4, 2026
Merged via the queue into main with commit 0e24b0c Sep 4, 2026
36 checks passed
@os-steve
os-steve deleted the claude/issue-15191-ratchet-ruled-raise-vs-move branch September 4, 2026 08:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

2 participants