Skip to content

test(scripts): release-rehearsal-clone's C2 green line is stable — the measured timing prints only on failure (#15400) - #15433

Merged
baozhoutao merged 1 commit into
mainfrom
claude/issue-15400-c2-stable-green-line
Sep 4, 2026
Merged

test(scripts): release-rehearsal-clone's C2 green line is stable — the measured timing prints only on failure (#15400)#15433
baozhoutao merged 1 commit into
mainfrom
claude/issue-15400-c2-stable-green-line

Conversation

@baozhoutao

Copy link
Copy Markdown
Contributor

Fixes #15400

What changed

One line in scripts/pm/release-rehearsal-clone.mjs. The C2 case interpolated the
measured wall-clock figure into its own label, so the line carried a value that
differs from run to run:

  ✓ C2 a healthy tree is not slowed (107 ms < 10000)

The figure now goes through the failure sink t() / report() already carry — the
third argument, printed only when the condition is false — and the label states the
threshold only:

  ✓ C2 a healthy tree is not slowed (< 10000 ms)

Per the ruling on #15400 (option 1). The assertion condition (healthyMs < 10_000)
and the threshold are unchanged, C2 still registers exactly once through t, and the
roster ('release-rehearsal-clone self-test': 30), SELF_TEST_BATTERY_FLOOR and the
tConditional split from #15399 are untouched. No other case, condition, message or
argument changes.

The proof the card asks for: two runs, twelve minutes apart

node scripts/pm/release-rehearsal-clone.mjs --self-test run twice, 15:18:31Z and
15:30:31Z, stdout and stderr captured separately and cmpd.

This branch — byte-identical:

--- BRANCH: stdout cmp ---
CMP_BR_OUT_EXIT=0
--- BRANCH: stderr cmp ---
CMP_BR_ERR_EXIT=0
--- combined stdout+stderr cmp (branch) ---
CMP_BR_ALL_EXIT=0

Control, the same pair on the base pin 52d5a52d5 (a second detached worktree at
the same commit) — differs, on exactly the C2 line and nothing else:

--- CONTROL: base stdout cmp ---
base-run1.out base-run2.out differ: char 501, line 10
CMP_BASE_OUT_EXIT=1
--- CONTROL differing lines ---
10c10   (line 10, run 1 vs run 2)
  run 1:   ✓ C2 a healthy tree is not slowed (107 ms < 10000)
  run 2:   ✓ C2 a healthy tree is not slowed (94 ms < 10000)

A red run still names the timing

Forced-slow ablation — the condition's threshold mutated to healthyMs < -1, proven on
disk before the run (injected spelling present 1×, removed spelling 0×, blob hash moved
ef88cbc… -> ce605ec…), restored under an EXIT INT TERM trap and the restore proven
by hash equality plus an empty git diff HEAD:

MUTATION-ON-DISK: injected='healthyMs < -1' count=1 ; removed='healthyMs < 10_000' count=0
ABL_A_EXIT=1
10:  ✗ C2 a healthy tree is not slowed (< 10000 ms)
11-      measured 112 ms
RESTORE-PROVEN: hash==ef88cbcec9433e2833ca4cf57798be81a6e1dc2c, git diff HEAD empty, status clean

The floor is untouched

Roster pin ablated 30 -> 9999, same mutation/restore discipline — C2 still registers,
and the count the floor sees is still exactly 30:

✗ self-test battery "release-rehearsal-clone self-test" registered 30 case(s), below its pinned floor of 9999
RESTORE-PROVEN: hash==ef88cbcec9433e2833ca4cf57798be81a6e1dc2c, git diff HEAD empty, status clean

node scripts/measure-self-test-floor.mjs --json before and after the edit is
byte-identical (170 rows, ROSTER 164 / NONE 5 / COUNT 1); this file stays
{"file":"scripts/pm/release-rehearsal-clone.mjs","floor":"ROSTER","defs":["selfTest"]}.

Gates

All at 023dcd71d, the final commit; exit codes captured before any pipe.

  • The derived family, node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack
    — 23 commands, every one run, all EXIT=0. The heavy leg (13 pnpm check:*, including
    check:pm-dispatch-gates at 403s) ran in the foreground under
    scripts/pm/os-verify-lock.sh: VERDICT command-exit 0.
  • The always-runs tail: check-self-test-workflow-commands.mjs and its --self-test,
    check:declared-population-live, check-self-test-wired.mjs, check:ratchet-remedy-authority,
    check:nul-bytes, check:watch-hint-literal — all EXIT=0.
  • This file's own --self-test, the lint.yml step: EXIT=0, ✓ self-test passed.
  • Whole-repo pnpm lint (eslint . --no-inline-config) under the verify lock:
    LINT_EXIT=0, no findings. Not a narrowed run.
  • Control-character self-scan over the changed file: no matches.

No changeset: this changes a repo-internal PM script and publishes nothing from any
package, so skip-changeset applies.

🤖 Generated with Claude Code

https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk


Generated by Claude Code

The C2 case interpolated the measured wall-clock figure into its label, so
the `✓` line carried a value that differs from run to run and the "green
lines byte-identical" comparison could never pass unnormalised.

The figure now prints through the failure sink `t()`/`report()` already
carry, so a red run still names the timing while the green line is stable.
Condition, threshold, roster, floor and registration are unchanged.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_012zGPuVVX3deAx9LdjK8jCk
@baozhoutao baozhoutao added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Sep 4, 2026 — with Claude
@baozhoutao
baozhoutao marked this pull request as ready for review September 4, 2026 15:39
@baozhoutao
baozhoutao enabled auto-merge September 4, 2026 15:39
@baozhoutao
baozhoutao added this pull request to the merge queue Sep 4, 2026
Merged via the queue into main with commit 6ed4b81 Sep 4, 2026
36 checks passed
@baozhoutao
baozhoutao deleted the claude/issue-15400-c2-stable-green-line branch September 4, 2026 16:08
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

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

Projects

None yet

2 participants