Skip to content

test(pm): pin the clause-② reader POSITION rule against the merged #17819 specimen - #18071

Merged
os-project-manager merged 2 commits into
mainfrom
claude/issue-17959-clause2-declaration-legibility
Sep 13, 2026
Merged

os-project-manager merged 2 commits into
mainfrom
claude/issue-17959-clause2-declaration-legibility

Conversation

@claude

@claude claude Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor

Fixes #17959

Clause-②: no — comments, one self-test battery and its roster floor; the reader and the accept set are byte-identical.

Measured, not assumed

One reader, two gates. readClause2Line is exported here and applied to the card's claim comment; scripts/check-changeset-no-major.mjs imports the same function and applies it to github.event.pull_request.body — that is the Check Changeset step the ruling named. The fixed spelling is a POSITION rule: the key opens its own line modulo decoration (spaces, one blockquote mark, one list bullet, bold, backticks), the value token is first after the colon and is exactly yes or no, and trailing prose after the token is accepted by design. WHICH line is never consulted.

It ran, and it fired. Two Check Changeset runs on the same merged head b280ae29:

So the card's question 2 answers PRESENT, bold admitted. check:pm-clause2-carriers owed nothing: the lint.yml step runs --self-test only, and the queue guard carries no clause-② leg.

Outcome (a), and it needs no widening. The bold form was already admitted; the quoted-and-continued form was already refused. Widening the spelling to clear that red would have refused the very form this file's own remedy sentence prescribes. Declared and enforced agree, so what lands is the PIN and the sentence that says so.

What landed

  • Docblock: POSITION means LINE-INITIAL, never TOP-OF-BODY, with the fix(spec): guard three data lookups against Object.prototype fall-through #17819 evidence. No accept set, no exported symbol and no reader line is touched.
  • One self-test battery, 10 cases, holding both shapes of one sentence from one measured PR; roster floor 20 to 21.
  • references/contract-review.md unchanged: it states no spelling and no placement convention, so there is no convention line to correct.

Evidence

  • self-test: 588 to 598 cases, exit 0 (pnpm check:pm-clause2-carriers), before and after.
  • ablation, from the committed state: the position walk truncated to the top three lines, proved on disk by marker count and blob hash, restored to the HEAD blob with git diff HEAD empty. Self-test exit 1, 9 of the 10 new cases red — the tenth is the deliberate single-line CONTROL — plus 5 pre-existing cases that read the same rule.
  • gates at head 7e185157: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack derived 35 families; all 35 run in the foreground with exit codes captured before any pipe, all 0; --ran reconciles 35 derived / 35 run / 0 NOT-MEASURED (derived).
  • pnpm lint over the whole repo (eslint . --no-inline-config): exit 0.
  • the eight roster families whose roster sits under a path this diff is in: six exit 0; check:published-readme-exports and check:dts-closure exit 3 — PREREQUISITE NOT MET, no dist/. NOT MEASURED, not a red; both judge built package type surfaces and this diff touches no package.

skip-changeset: scripts/pm/** publishes nothing — no published package's files[] names scripts, and the root manifest is private.


Generated by Claude Code

…17819 specimen

`readClause2Line` decides "is this a declaration?" by position, and position has
always meant LINE-INITIAL modulo decoration — never TOP-OF-BODY. Nothing said
so and nothing pinned it, so a census read a merged PR whose body carries
`**Clause-②: no**` on line 4 as carrying no declaration at all.

Measured on PR #17819's merged head b280ae2: this reader answers declared/`no`,
and so does the other gate that reads the limb — `check-changeset-no-major.mjs`
imports this same function and applies it to the PR body, which is the
`Check Changeset` step the ruling named. That gate DID fire on this pair: it
refused the shape the PR was opened with (the key inside a backtick span the
line talks on outside of — the #17098 QUOTED-AND-CONTINUED tell) at exit 1, the
seat rewrote the span as bold, and the `edited` re-run on the same head read it.

No accept set moves: the bold form was already admitted and the
quoted-and-continued form was already refused. What lands is the pin — one
battery holding both shapes of one sentence from one measured PR — and the
docblock paragraph that states the position rule.

Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8
Co-authored-by: Claude <noreply@anthropic.com>
…symmetry

A symmetry assertion between two undefined readings is vacuously true, which is
exactly the shape an ablation must be able to break.

Claude-Session: https://claude.ai/code/session_01DAcomhvR9kKizeYgg89Vo8
Co-authored-by: Claude <noreply@anthropic.com>
@claude claude Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 13, 2026
@claude

claude Bot commented Sep 13, 2026

Copy link
Copy Markdown
Contributor Author
  • Served-tier: 1288/1288 claude-fable-5-1 — harness model stamp counted over this seat's own transcript (non-sidechain assistant messages a model served; <synthetic> harness notices excluded) at 2026-09-13T16:59Z; get_session external_metadata.last_served_model read claude-fable-5-1 at 2026-09-13T16:59Z.

Contract review

Head: 7e185157 (PR #18071, card #17959) — read at 2026-09-13T16:59Z by the skills seat at the contract-review tier. NOT GOVERNED, measured: scripts/pm/check-clause2-carriers.mjs only (+56 −3: one docblock paragraph, one self-test battery, the roster floor 20 → 21; the reader and its accept set byte-identical) ⇒ in-seat review, then ready + auto-merge by this seat.

① derived judgments — the card's enforce-or-remove question is answered by measurement, and declared and enforced already agree:

  1. Q1 (which gate, which spelling): one reader, readClause2Line, exported here and imported by scripts/check-changeset-no-major.mjs — this file applies it to the card's claim comment, the Check Changeset step applies it to the PR body. The fixed spelling is a POSITION rule (key line-initial modulo decoration — whitespace, one blockquote mark, one bullet, bold, backticks — value first after the colon, exactly yes/no); WHICH line is never consulted. The docblock's 「It relaxes no spelling」 already said so; the paragraph landed here states it in one place.
  2. Q2 (did it fire on fix(spec): guard three data lookups against Object.prototype fall-through #17819): it fired TWICE on the merged head — run 34684118255 refused the shape the PR was OPENED with (a backtick span that opens before the key and talks on: the quoted-and-continued near miss, exit 1), the author rewrote the span as bold, and run 34684357221 (the edited event, same head) read declared / no. So the ruling's binary (「did not fire, or the shape did not owe one」) has a third answer, and the census line 「正文无顶格 clause 行」 is falsified: line 4 IS line-initial, merely bold. Neither check:pm-clause2-carriers (self-test only in lint.yml) nor the queue guard (no clause-② leg) read fix(spec): guard three data lookups against Object.prototype fall-through #17819; the dev's two get_job_logs reads are the evidence and are named.
  3. Q3 (outcome): no accept-set change is warranted in either direction — widening would admit nothing new, refusing would refuse the very form this file's own remedy sentence prescribes. What lands is the pin: the merged fix(spec): guard three data lookups against Object.prototype fall-through #17819 body in both shapes (bold ⇒ declared no; backtick-span-and-continue ⇒ near miss describing), the same line at the top and five lines down reading identically, the carrier-agnostic control on the claim comment, and a single-line control. references/contract-review.md is unchanged, correctly: it states no spelling or placement convention (the value set lives in SKILL.md 恰这两种拼写).
  4. Ablation is non-vacuous: truncating the walk to the top three lines reds 9 of the 10 new cases plus 5 pre-existing ones (the single-line control stays green, as it should); restored by blob hash. The first attempt (one line) starved a fixture and is reported NOT MEASURED, not as a result.
  5. Two 「noted, not filed」 items stand as notes with 承接者:无 (the sibling gate discards nearMissReason in its log line; its remedy sentence under-promises backticks) — observations, not defects.

Seat measurements on the head tree (git archive 7e185157): check-clause2-carriers.mjs --self-test → 598 cases pass, exit 0 (base 588). --pair 18071 → exit 0 at 2026-09-13T16:59Z. Checks on 7e185157 at 2026-09-13T16:59Z: 33 runs, 0 red, 3 running (Lint & Repo Gates, Test Core (1/6), Type Check · consumer gates) — the queue's own gate holds the merge until they are green.

② semver: scripts/pm/** publishes nothing; skip-changeset is right.

③ boundary flags: open_questions empty. Landing consequence: the card closes on the measured answer; the seat corrects the census reading on #17915's thread only if a successor relies on it (none does today).

Implemented-by: claude/issue-17959-clause2-declaration-legibility
Reviewed-by: session_01DAcomhvR9kKizeYgg89Vo8

Verdict: PASS — the question is answered with evidence, the reader is pinned in both directions, nothing widened, nothing refused.


Generated by Claude Code

@os-project-manager
os-project-manager marked this pull request as ready for review September 13, 2026 16:59
@os-project-manager
os-project-manager added this pull request to the merge queue Sep 13, 2026
Merged via the queue into main with commit 4e3a496 Sep 13, 2026
37 checks passed
@os-project-manager
os-project-manager deleted the claude/issue-17959-clause2-declaration-legibility branch September 13, 2026 17:44
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

2 participants