Skip to content

Phase 2 numbers: exact int64 and IEEE doubles (#1758) - #1776

Draft
InauguralPhysicist wants to merge 198 commits into
mainfrom
phase2-numbers
Draft

InauguralPhysicist wants to merge 198 commits into
mainfrom
phase2-numbers

Conversation

@InauguralPhysicist

Copy link
Copy Markdown
Collaborator

Integration branch for #1758, Phase 2 numbers: an exact int64 kind beside IEEE 754 doubles, while keeping the observer and deterministic replay. This is a draft; it lands when every round is done and the #1758 Done-when holds.

The plan is docs/design/phase2-numbers.md. Two blind critics reviewed it over three design rounds. Rounds:

Landed on this branch so far:

  • The design: docs/design/phase2-numbers.md; a 1,798-site inventory checked by tools/phase2_inventory.py; tests/phase2/MAP.md, with tier-witnessed rows per round.
  • R1.1, the slot layer.
    • The SMI tag 0xFFFA and its API exist; nothing produces an SMI yet.
    • slot_is_num, SLOT_NUM_RAW and slot_from_num are renamed, and slot_is_numeric and slot_as_double are deleted, so every old reader stopped compiling until given an explicit int decision.
    • New tools: the C slot test (section [0fk]), tools/phase2_check.sh --through <round>, the int-source check, and a corpus differential against main.
    • Local results: suite 4268/4268; differential 0 diffs over 441 programs; calibration 27/27; plant 1 killed.

Related: #1763 and #1774 (float-to-int casts that silently misbehave on large values, which N5 covers); ouroboros#301 (the AOT runtime follows the renames at its EIGS_REF bump).

Closes #1758

🤖 Generated with Claude Code

https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF

InauguralPhysicist and others added 6 commits October 14, 2026 10:13
Round 0 of #1758 (exact int64 kind and IEEE doubles): the design a blind
critic reviews before round 1 builds. No src/ change.

- tools/phase2_inventory.py classifies every numeric site in src/*.c and
  src/*.h (comments and literals stripped) into one of the ten categories
  and writes docs/design/phase2-inventory.txt:
  examined=1773 classified=1773 unclassified=0. Two derived checks keep
  "unclassified" live: a new double-returning payload accessor, or a
  VAL_NUM in an unrecognized position, is unclassified. It also derives the
  builtin registration table (311 names; equal to `eigenscript --api
  --json` both ways) and checks the design doc's classification table
  against the 229 numeric builtins, both directions, with closed class and
  loss tokens.
- docs/design/phase2-numbers.md chooses Alt 1R: VAL_INT beside a renamed
  VAL_FLOAT, with the ambiguous accessors deleted, so 1,488 of 1,773 sites
  stop compiling until visited. A shared-tag subtype (Lua's TValue shape)
  or a double shadow leaves 445 type tests and 484 checked reads
  compiling with a widened or lossy meaning, and three JIT emitters that
  would misread a boxed int. Also: the JIT guard table (every consuming
  guard bails on 0xFFFA; four producer emitters must change), the N12/SMI
  NaN-space argument, the builtin table (39 LOSS rows), the
  semantics-to-sites map, the round 1/2 plan, the check/plant/Lua-diff
  tool designs, and six open questions left to the owner.
- tests/phase2/MAP.md maps N1-N14, N4b, (A), (B), T1 and O1-O4 to 78
  tag-failing rows, 5 controls and 2 oracle gates.

Measured prototype (standalone C, callgrind Ir/op): today's double ADD 38;
float-first SMI arm 40 on floats, 44 on ints (shifted add); boxing every
int 77. The interpreter spends 685 Ir per counter-loop iteration and the
JIT 402, so int loops bailing in round 1 cost up to ~1.7x until round 5.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
…red compile count (#1758)

Design round 2 of #1758, after the blind critic's FAIL on round 0. Still no
src/ change.

- The third numeric evaluator, vm_leaf_accessor_exec (vm.c:1856; scanner
  chunk.c:1072, #366), is in the inventory (dispatcher arms, an executor
  matrix that requires the leaf scanner and evaluator to admit the same
  opcodes), in design §4.5 and §7 with every arm, and gets a gate: a
  `trace` tier in phase2_check.sh (EIGS_TRACE switches the leaf off) that is
  the leaf-on/leaf-off differential over every row.
- Every meaning change coincides with a token change (§2.7): int literals
  get new appended opcodes (OP_INT_ZERO/ONE/CONST); OP_NUM_ZERO/ONE keep
  their float meaning in all three executors; slot_as_double is deleted in
  R1.1; buffer_read_byte and finite_num_to_byte are deleted with Q1.
- The compile count is re-measured with clang's `unavailable` attribute in
  a scratch copy under server-db, release and freestanding: 1,416 of 1,798
  sites stop compiling, 44 sit inside deleted definitions, and each of the
  338 others is classified with its reason.
- Slot classifiers are derived (D1 forced; 43 D2/D3 entries each carry a
  reviewed disposition the inventory checks both ways), and raw union-member
  reads are vocabulary, so the critic's e_blind_member plant now fails the
  run. Inventory plants A-R all turn red.
- The canonical form is corrected: the lifts box on purpose, so equality
  compares by value whenever a box is involved; plant 1's check is the C
  slot test.
- The builtin table follows the decided Q1 (16 rows move to int-requiring,
  ppu_render_frame added) and gains the #1762 LOSS rows (store_put,
  db_execute, db_query_json); §11 records Q1-Q6 as decided, and parks Q7
  (out-of-range continuous parameters) and Q8 (NaN order).
- tests/phase2/MAP.md gains 35 shaped rows (leaf, function JIT, OSR) with
  tier witnesses read from EIGS_JIT_HOT/STATS/STOPS, covering all 20 numeric
  JIT and leaf arms, and the record-twice tape rows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
…, landed-round filter (#1758)

Design round 3 of #1758, after the round-2 critic's FAIL. Still no src/
change.

- The osr witness proves the loop body ran natively: every OSR row is a
  `loop while true:` whose only exit is a return right after the claimed
  ops, and the witness requires the OSR record to reach the return sentinel
  (oadv == len). Every witness kind (leaf, leaf-gen, fn, fn-stop, osr,
  osr-stop) was calibrated on main against a negative plant: the honest row
  holds, the plant is VACUOUS. The critic's osr plant (0 native INDEX_SET
  calls under gdb) passed the round-2 rule and fails the new one. The two
  truthiness controls now end on the int call.
- R1.2 is behaviour-preserving: the builtin readers and producers are a
  named bridge that R1.6 deletes, so every builtin behaviour change lands
  with a token change; a per-builtin behaviour table gates R1.6. The first
  int value appears at R1.3 (make_int is introduced there; an int-source
  check guards R1.1-R1.2), and every int consumer is converted in that
  commit.
- `phase2_check.sh --through <commit>` checks a round against exactly its
  landed rows; R1.1, R1.2 and R2.1 are mechanical rounds with named gates.
- The observer's boxed-int path is mapped (observer_slot_update's number
  arm) and routed at R1.3, with a MAP row for an int of 2^47 and up.
- buffer_read_num is renamed in R1.6 (index reads in gather/scatter_add and
  byte reads such as buf_from_pcm16le are re-decided); the compile count is
  re-measured under the Makefile's exact flags and attributed per commit:
  1,488 of 1,798 sites stop compiling (R1.1 223, R1.2 464, R1.3 11,
  R1.6 743, R2.2 47); the 257 others are classified.
- Q7 and Q8 are folded in as decided: a validated q7 column in the builtin
  table, a geometry reader that clips the whole shape, IEEE totalOrder for
  sorting and NaN propagation through min/max. Inventory plants A-T all red.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
…lassifier decided (#1758)

Round R1.1 of docs/design/phase2-numbers.md section 8: the SMI exists as an
encoding, every slot reader decided what an int does there, and nothing in
the runtime produces an int yet, so no program behaves differently.

- value_slot.h: TAG_SMI (0xFFFA) and the SMI range; slot_is_smi,
  slot_smi_val (bit-47 sign extension without a right shift),
  slot_from_int (an SMI in range; the VAL_INT box arm is unwired until
  R1.3), slot_f64_value (floats only; replaces vm.c's slot_as_double),
  slot_int_value. Tokens: slot_is_num -> slot_is_f64, SLOT_NUM_RAW ->
  SLOT_F64_RAW, slot_from_num -> slot_from_f64; slot_is_numeric and
  slot_as_double deleted. slot_as_double's 15 calls now read through
  slot_f64_value: the arithmetic, compare, negation and bitwise arms send
  an int to their slow path or type error (R1.3 gives them int
  semantics), and the leaf evaluator's INDEX_GET and ADD/SUB/MUL arms bail.
- Refusals: eigs_slot_refuse (a broken caller contract) in eigs_slot_ref,
  obs_slot_observable, slot_type_name, slot_truthy, slot_to_value,
  vm_slot_lift, write_slot, and slot_as_ptr under ASan or
  -DEIGS_SLOT_CHECKED. The readers that turned an unknown tag into null or
  `<unknown>` now refuse it.
- eigs_int_unwired: the arms whose int answer needs the int Value kind or
  tape v7 (slot_to_value, the one SMI boxer; slot_type; slot_view;
  write_slot; slot_from_int's box arm). R1.3 deletes it, so each one stops
  compiling in the commit that makes ints reachable.
- Final int arms where R1.1 can write them: truthiness (not 0), the type
  name "num", the bridge readers (an int converts to its double until
  R1.6), list_get_ref/dict_value_get_ref (NULL for a number), the observer's
  numeric channel (obs_slot_num: an int as its exact double until round 3),
  the store encoder and the SIGUSR1 dump (exact digits), dispatch keys and
  slice bounds (the int, range-checked into a C int); the four return-to-C
  conversions now share slot_bridge_unwrap's int arm.
- tools/phase2_inventory.py: the renamed vocabulary; every D1, D2 and D3
  slot classifier now needs a reviewed disposition row (98 in the design
  doc's table, with a fifth disposition, `unwired`); --slot-population
  prints the C slot test's population (33 entries).
- tools/num_read_check.sh and its allowlist follow SLOT_F64_RAW.

Gates (this commit): make -> 29 units, 0 compiler warnings;
make jit-smoke -> "JIT smoke: all cases passed."; make embed-smoke ->
"embed_smoke: OK"; tools/phase2_inventory.py -> "slot classifiers: D1=56
D2=19 D3=23 T=67 dispositions=98 missing=0 stale=0", "phase2-inventory:
PASS"; tools/num_read_check.sh -> "num-read: PASS".

Behaviour unchanged, measured on this source (the three R1.1 commits leave
src/ as this one does):
- the full release suite, env -u XAUTHORITY DISPLAY=:99 make test:
  "RESULTS: 4268/4268 passed, 0 failed, 9 skipped" (the skips: extensions
  not built, ASan-only checks, an archived bench asset, no ouroboros
  checkout beside the tree);
- tools/phase2_corpus_diff.sh against main 0740af0, every .eigs under
  tests/: "corpus-diff: examined=441 same=433 same_under_replay=6 nondet=2
  diff=0 new=14 deleted=0 crash_both=0 timeout_both=1" (new = the
  calibration fixtures; the timeout is _runaway_guard_selftest.eigs on
  both binaries).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
tests/phase2/slot_layer.c (design 2.5) includes the single-file
amalgamation, so the static slot classifiers are reachable, and drives them
with hand-built SMI slots (the literal tag, never slot_from_int):
- Part A: every entry of `tools/phase2_inventory.py --slot-population`
  (every slot classifier whose first parameter is an EigsSlot, 33 today)
  with the SMI boundary values 0, 1, -1, 2^47-1, -2^47. An entry returns the
  int's answer or aborts through a named refusal; an abort runs in a forked
  child and its FATAL line must name the expected reader.
- Part B: the predicates and the deciding readers against a double, the
  canonical NaN, -0.0, null, both bools, an SMI, a heap pointer, the three
  reserved tags and the sentinel.
- Part C, plant 1's named check: slot_from_int over the boundary values must
  give the SMI bits (inside the range) or refuse (outside it, until R1.3).
tests/phase2/slot_layer.sh builds it (make phase2-slot-test; release CFLAGS
plus -DEIGS_SLOT_CHECKED, or ASan) and compares the entries it examined with
the derived population both ways. Suite section [0fk] runs it in the
variant the suite binary is.

tools/phase2_plants.sh (design 9.3) holds the plants that have landed:
plant 1 (slot_from_int tags an int that fits as a heap pointer), killed by
its named check and shown transverse (the same plant with that one
assertion deleted passes).

Results on this tree:
- bash tests/phase2/slot_layer.sh release:
    slot-layer-test: examined=33 smi_values=5 calls=165 tag_rows=156 from_int_rows=11 failures=0
    slot-layer-population: derived=33 examined=33 entries=33 missing=0 extra=0 test_rc=0
    slot-layer: PASS
- the ASan/UBSan build (make PHASE2_SLOT_VARIANT=asan phase2-slot-test,
  run with ASAN_OPTIONS=detect_leaks=1): the same four lines, rc 0, no
  sanitizer report.
- suite section [0fk] in the full release suite: the same lines, PASS
  (297 s on the 4 GB box, most of it the -O2 compile of the amalgamation).
- bash tools/phase2_plants.sh:
    red: slot-layer-test: FAIL slot_from_int(0): bits 0xfffb000000000000 (tag 0xfffb), want the SMI 0xfffa000000000000
    plant 1: KILLED transverse=TRANSVERSE
    plants=1 killed=1 survived=0 broken=0 transverse=1

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
…ck and its calibration (#1758)

tools/phase2_check.sh (design 9.2; the work is in tools/phase2_check.py):
- the MAP's rows, controls and gates; `--through Rk` selects what has landed
  by Rk (R1.1 < R1.2 < ... < R2.6 < R3), and a mechanical round (R1.1, R1.2,
  R2.1) runs its gates instead of failing on zero rows: the token gate (the
  tokens a landed round deleted occur in no code line), the int-source
  check (before R1.3 nothing outside the canonicalizing writers calls
  slot_from_int or make_int, and make_int does not exist), the C slot test,
  and the corpus differential against --baseline;
- four tiers (off, default, osr, trace = the leaf differential), the
  verdicts tag_fail / branch_pass / vacuous / TIMEOUT / SIGNAL, and the tier
  witnesses exactly as design 9.1 defines them, the osr rule being
  oadv == len (the return sentinel);
- plan checks: every item has a row, every numeric JIT-emitter and leaf arm
  is exercised by an L/F/O row of its role, every round has rows or gates.
tools/phase2_corpus_diff.sh: the behaviour differential of a mechanical
round. A file whose baseline disagrees with itself is adjudicated by
replaying the baseline's tape on both binaries.

Calibration, `phase2_check.sh --calibrate --build-plants <v0.46.0>
<branch>` on tests/phase2/calib/ (each fixture ends in `5.5 & 1`, which
raises on the branch and truncates on the tag):
  calibration: cases=27 as-expected=27 unexpected=0
including: honest rows tag_fail=7 branch_pass=7 in every tier with 6/6
witnesses holding (osr fill oadv=123 len=123 oent=37; osr-stop g oent=33
oadv=20, ADD); the tag passed as both binaries -> branch_pass=0; a
corrupted .out, an empty rows directory, a MAP id with no file and a file
with no MAP id each fail by name; each witness kind's negative plant (and
the fn row called 10 times) -> vacuous=1, named; a build whose leaf scanner
returns early -> vacuous; a build whose leaf MUL adds 1 -> the trace tier
alone passes; the int-source plant (slot_from_int(count) in trace.c) fails
naming its caller; a reintroduced slot_is_num fails the token gate.

bash tools/phase2_check.sh --through R1.1 --baseline <main 0740af0>
<v0.46.0> <branch>:
  tier=default examined=0 rows tag_fail=0 branch_pass=0 vacuous=0 (all four tiers alike)
  controls=0 both_pass=0 witnessed=0 mapped=0 gates=0 through=R1.1
  tokens: rounds<=R1.1 tokens=5 files=89 hits=0
  int-source: files=64 slot_from_int_defs=1 make_int_defs=0 calls=0 outside_writers=0
  slot-layer: PASS
  corpus-diff: examined=441 same=433 same_under_replay=6 nondet=2 diff=0 new=14 deleted=0 crash_both=0 timeout_both=1
  phase2-check: PASS

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
Comment thread tools/phase2_check.py Fixed
Comment thread tools/phase2_check.py Fixed
Comment thread tools/phase2_check.py Fixed
Comment thread tools/phase2_check.py Fixed
Comment thread tools/phase2_check.py Fixed
Comment thread tools/phase2_check.py Fixed
Comment thread tools/phase2_check.py Fixed
Comment thread tools/phase2_check.py Fixed
Comment thread tools/phase2_check.py Fixed
Comment thread tools/phase2_check.py Fixed
@codspeed

codspeed Bot commented Oct 14, 2026 •

Copy link
Copy Markdown

Merging this PR will degrade performance by 50.08%

1 warning

⚠️ Base and head ran on different runner types

Some benchmarks with significant performance changes were compared across different runner types, so the changes might not come from the code. Run base and head on the same runner type, or use CodSpeed Macro Runners for more stable results.

Learn more about Macro Runners

Open the report in CodSpeed to investigate

❌ 10 regressed benchmarks
✅ 3 untouched benchmarks
🆕 6 new benchmarks

Warning

Please fix the performance issues or acknowledge them on CodSpeed.

Performance Changes

Benchmark BASE HEAD Efficiency
❌ bench_idxset 37 ms 199.5 ms -81.43%
❌ bench_dmg_shape 499.1 ms 1,618.2 ms -69.16%
❌ scalar_loop 12.6 ms 38.5 ms -67.17%
❌ scalar_loop (vm-tier) 18.4 ms 40.2 ms -54.33%
❌ bench_dmg_shape (vm-tier) 959.6 ms 1,606.9 ms -40.28%
❌ dmg cpu_instrs 2M cycles 1.7 s 2.8 s -40.12%
❌ unobserved armed loop 216.3 ms 357.5 ms -39.52%
❌ dmg cpu_instrs 2M cycles (vm-tier) 1.9 s 2.8 s -32.61%
❌ bench_perf 99.4 ms 113.7 ms -12.57%
❌ string_build 29.1 ms 33.1 ms -12.14%
🆕 alloc_heavy N/A 3.2 s N/A
🆕 bench_buf_mix N/A 1.2 s N/A
🆕 bench_buf_resample N/A 5.5 s N/A
🆕 bench_pcm_codec N/A 14.7 s N/A
🆕 conservative_observed_loop N/A 31.2 ms N/A
🆕 conservative_unobserved_loop N/A 25.9 ms N/A

Tip

Investigate this regression by commenting @codspeedbot fix this regression on this PR, or directly use the CodSpeed MCP with your agent.


Comparing phase2-numbers (21a8818) with main (b7c5f61)

Open in CodSpeed

InauguralPhysicist and others added 4 commits October 14, 2026 21:48
… build; #1775's warnings (#1758)

The R1.1 critic found that NUM_CMP, INT_BINOP_R, NEG and BNOT met an SMI
with the type error naming `num`, which a `try` turned into a wrong value
(`r is xs[0] < 6` with an SMI 5 gave false). Each now refuses through
eigs_int_unwired, so R1.3, which deletes that token, cannot compile until
each has its int arm. All four are tied to R1.3, bitwise included: R1.3's
int literals reach `&` at once (tests/bench_dmg_shape.eigs:21), and design
section 8 gives bitwise exact int64 operands at R1.3. The design's rows for
the four arms change from guarded to unwired.

The dynamic half of the int-source check: built with -DEIGS_SMI_TRAP
(`make smi-trap`), every slot predicate and accessor aborts on an SMI and
slot_from_int aborts on any call, so a producer that writes the tag bits
itself dies at its first reader.

#1775: builtin_tensor_gather ends in an explicit return, and the bitwise,
compare, equality and index locals are initialised where they are declared.
The amalgamation compiles with no warning at -O0 and -O1 (it had 1 and 7 on
main 0740af0). The slot test now builds at -O0 with -Wall -Wextra (ASan's
flavour at -O1), and its runner fails on any build warning.

tools/phase2_inventory.py passes re.split's maxsplit by keyword: the
positional form is a DeprecationWarning on Python 3.13.

Closes #1775

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
…riant (#1758)

The C slot test:
- Part B, the tag matrix, now runs every one of the 33 population entries
  against all twelve slot kinds (a double, the canonical NaN, -0.0, null,
  both bools, an SMI, a heap pointer, the three reserved tags and the
  sentinel), each with its expected value, refusal or raise; before, only
  the six predicates and seven deciding readers saw more than an SMI.
- Part D drives the operator arms through the VM: a host builtin writes an
  SMI into a list, and each refusing operator must abort naming its arm,
  plain and inside a try, while the float control computes the value.
- A child expected to abort is made non-dumpable, so a crash reporter on
  the core pipe (apport here) is not run for each one: 224 s became 0.4 s.

Its runner reads each tool on its own channel: the population scan and
the test each have a grammar, and a line outside it or any stderr is a
FAIL that prints the line (the critic's largest gap: Python 3.13's
DeprecationWarning on the scan's stderr was read as two classifiers). The
scan runs under python3 -W error; a build warning fails (#1775).

[0ff] and [0fk] find the variant the suite binary is (asan or asan-server
in the CI ASan shards) through one shared predicate, tests/suite_variant.sh,
which asks the Makefile whether that variant builds with ASan; both ran
their release flavour in the shards (#1783).

tests/section_weights.txt is refreshed from the ASan shard logs of run
38652383231 (head 6fe6f0a) plus [0fk]'s measured 53.33 s, so the planner
no longer assumes 0.5 s for it (#1784).

test_system.eigs draws random_int 300 times against its bounds: one draw
let a lo+1..hi+1 random_int pass five times in six (the critic's plant D).

Closes #1783
Closes #1784

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
…er self-tests (#1758)

The corpus differential (tools/phase2_corpus_diff.sh), after the critic's
plants B and D passed it:
- each binary runs each file twice; a file is deterministic when the
  baseline's two runs agree, and then any branch run that differs is a
  DIFF (a branch wrong on alternate runs read NONDET before);
- randomness runs live: the runtime has no seed flag or variable, so an
  LD_PRELOAD shim pins the clock^pid self-seed to one constant and passes
  small explicit seeds through (test_numerics and test_optimize are now
  compared live); two pinned draws must agree or the run fails;
- a tape is the last resort, for files whose baseline disagrees with
  itself even pinned (timings, threads); each is listed as REPLAYED, since
  a builtin's own behaviour is invisible there;
- no blanket memory cap: only gfx/ui/audio files run under ulimit -v
  (handles_full.eigs varied only because of the old cap);
- a restricted run (the calibration's file list) prints RESTRICTED and
  exits 3, never PASS.

The int-source check fails on TAG_SMI or the SMI bit pattern anywhere
outside its value_slot.h definitions (the critic's P3 and P5), and the
mechanical gates of R1.1/R1.2 add `smi-trap`: the corpus differential
against a `make smi-trap` build (P4, an int made inside an allowed writer).

phase2_check.py's tool() keeps a gate's stderr apart and fails on it; the
hot-table and bytecode readers accept only their own shapes, and the
bytecode dump is read from stderr alone; the checker runs under -W error.

The calibration and the plants run when their checkers change, as
tools/selftests.txt rows (docs/PRINCIPLES.md 5), never per suite or CI
run: `phase2_check.py --selftest` builds v0.46.0 and four planted binaries
and adds the differential's plants A, B (both phases) and D and the
int-source plants P1-P5, static and dynamic; `phase2_plants.sh` adds the
arm-refusal, stderr-noise, stdout-noise and #1775 return-type plants.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
…al's stderr (#1758)

The calibration's P4 case (a smi-trap build with a planted int producer)
showed the corpus differential writing bash's own report of a run killed
by SIGABRT ("line N: PID Aborted ...") to its stderr, which the gates now
refuse. A brace group's 2>/dev/null takes that report; each run's own
stderr still goes to its file and is compared.

The self-test rows take bounds from the dev-box measurements (calibration
662 s, plants 446 s) and pin the calibration's 42 cases. The design doc
records that the calibration and the plants run as self-test rows.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
@InauguralPhysicist

Copy link
Copy Markdown
Collaborator Author

Open by design: the integration draft for #1758 (Phase 2 numbers). R1.1, the slot layer, is in its critic fix round. Once #1785 lands, this branch takes main and gets a full-lane dispatch (ASan, TSan, macOS). It merges only when every round is done and #1758's Done-when holds.

Comment thread tools/phase2_check.py Fixed
InauguralPhysicist and others added 8 commits October 15, 2026 04:46
Brings in #1769, #1777 (the observer oracle's floor as a required CI
check), #1770, #1786 and #1785 (the on-demand full main lane).

One conflict, tools/selftests.txt: both sides appended rows at the end of
the registry. Resolved by keeping both: main's observer_oracle/plants.py
row, then this branch's two #1758 Phase 2 rows with their comment.
`tools/selftests.sh --changed origin/main --list` accepts the merged file
(enrolment 46/46). The Makefile merged cleanly.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
…ath cost (#1758)

The first fix round silenced -Wmaybe-uninitialized by initialising
`_ad`/`_bd` (5 sites) and the index `i` (4 sites) where they are declared,
in vm_run_ex's hot arms and the JIT index helpers. The second R1.1 critic
measured the cost against R1.1 (9ce8e0b) with callgrind: +2.07% Ir on the
DMG 500K canary and +4.17% on a JIT-off float loop, and reverting only the
initialisers restored R1.1's counts.

The initialisers are gone. The two readers that fill those locals write
their out-parameter on every path instead, so the extra store is on the
cold path: slot_f64_value writes 0.0 when it answers 0, and vm_index_is_int
writes the truncation before its round-trip test (no caller reads it when
the answer is 0). The amalgamation compiles with no warning at -O0 and -O1
(-Wall -Wextra), and the release build at -O2 has none.

The C slot test's slot_f64_value rows now expect the written 0.0 where
they expected the out-parameter untouched.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
…ff (#1758)

tests/suite_program_env.txt was the policy the suite and jit_diff.sh read
(#1395), but the suite still spelled five programs' conditions inline: four
EIGS_STRICT=0 runs (test_coalesce_legacy, test_audio, test_gfx_text,
test_gfx_argtypes, the last two with the SDL dummy drivers) and one
SDL_VIDEODRIVER=dummy run (test_ui_containment_gfx). They are rows now,
and those sites run through suite_program_run, so the table is the one
source. tools/replay_diff.sh ran every corpus program in default strict
mode; it now applies the same conditions, as jit_diff.sh does.

tests/suite_program_env.sh: the conditions are checked against a
whitelist of forms (EIGS_STRICT=0, SDL_VIDEODRIVER=dummy,
SDL_AUDIODRIVER=dummy), and a word outside it is refused by name;
suite_program_check validates without running. jit_diff.sh runs every arm
through suite_program_run instead of its own copy of the case, and its
completion pin and tests/test_jit_diff_env.sh's population follow the
table (10 -> 15 programs).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
… seed pin (#1758)

The second R1.1 critic: the corpus differential (and with it the smi-trap
gate) started every file in default strict mode. 14 fail-soft
numeric-boundary files died at an early strict raise on both binaries and
were counted `same`, about 394 asserts never ran, and two planted defects
passed the whole oracle (C: buffer equality reading raw elements, which the
suite's [42c] catches; B2: an int whose tag bits are spelled from
SLOT_QNAN_MASK). The class was already closed in jit_diff.sh (#1395).

- Each file runs under its conditions from the suite's loader
  (tests/suite_program_env.sh), read from the branch tree.
- jit_diff's rule: a file with conditions must complete (rc 0) on both
  baseline runs, or it is INCOMPLETE, never compared, and the run fails.
- tests/phase2/corpus_nonzero.txt declares, with code and reason, the 32
  files whose baseline exits nonzero standalone (deliberate errors,
  fixtures of other hosts, capabilities the release build lacks, the
  runaway guard's fixture). An undeclared nonzero exit is
  UNDECLARED-NONZERO and a row whose file exits otherwise is STALE; both
  fail the run, so a file that loses its conditions is red. The ledger's
  grammar is a whitelist: a malformed row is refused by name. Every
  declared file is listed (SAME-NONZERO) with its code.
- A timeout or crash all four runs agree on is counted as timeout_both or
  crash_both, no longer also as same (the old comment claimed this).
- The seed pin: the drand48 self-seed is recognised exactly (the shim
  records each thread's last CLOCK_MONOTONIC reading; a seed equal to
  tv_sec ^ tv_nsec ^ getpid() of it is pinned, whatever its value), where
  the first fix round pinned seeds >= 2^20 and let 5 of 3,000 self-seeds
  through; 3,000 of 3,000 are pinned now. Every srand call (main's
  srand(time(NULL)), behind audio_noise's rand()) is pinned. random_hex's
  /dev/urandom stays unpinned by design; the shim marks the runs that open
  it and those files are listed as UNPINNED with their verdicts.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
…ew plants (#1758)

Nothing ran tools/phase2_inventory.py's verdict, so a slot classifier with
no reviewed disposition row passed `phase2_check.sh --through R1.1`, and
the committed docs/design/phase2-inventory.txt had gone stale (it still
showed the four refusing arms as `guarded` and 98 dispositions).

- phase2_inventory.py --check writes nothing and fails when the committed
  file differs from the generated text; the file is regenerated.
- phase2_check runs two gates in every mode: the token gate (which the
  design already said ran in every mode, but ran only in the mechanical
  rounds) and the inventory gate (`--check` under -W error; PASS only for
  rc 0, no stderr and a last line `phase2-inventory: PASS`).
- The calibration adds: plants C and B2 (built from HEAD, the second on the
  smi-trap build), each of which must make the differential name a
  conditioned file DIFF; a removed policy row (UNDECLARED-NONZERO); a
  ledger row for a completing file (STALE); a conditioned file that does
  not complete (INCOMPLETE); the unplanted branch with conditioned files
  (all same); and the inventory gate on an unchanged copy, a stale
  committed copy, and the critic's `vm.c:critic_new_reader`.
- The design doc's claims about the seed pin, #1775's fix, the token gate
  and the differential are corrected.

Closes #1804

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
…lse (#1758)

Supersedes 176b3d6's mechanism, which callgrind refuted. Writing the
out-parameter in the readers cost what the initialisers did: against
R1.1 (9ce8e0b), the JIT-off float loop measured +3.84% with
slot_f64_value writing 0.0 on its failure path (+4.50% writing the slot's
bits instead) and +0.44% with vm_index_is_int writing on both paths alone.
The float loop executes neither failure path: any of these changed
vm_run_ex's generated code, not its executed stores.

Both readers are back to R1.1's form. The initialisation stays at exactly
the three declarations GCC flags at -O1 (INT_BINOP_R's _ad/_bd, the `i` of
CASE(INDEX_SET) and of jit_helper_index_set), with a comment at each.
Callgrind Ir against R1.1, same inputs as the critic's:

  JIT-off float loop  364,223,332 -> 364,223,042  (-0.0001%)
  float loop, JIT on  172,204,323 -> 172,204,413  (+0.0001%)
  DMG 500K canary     1,191,977,525 (mean of 3) -> 1,191,026,282  (-0.080%)

The amalgamation compiles with no warning at -O0 and -O1 (-Wall -Wextra),
and the release build at -O2 has none. The C slot test's slot_f64_value
rows expect the untouched out-parameter again; the inventory is
regenerated for the moved lines.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
…1758)

With #1775's initialisers back to the three sites GCC flags in release,
the smi-trap variant printed four -Wmaybe-uninitialized warnings in
vm_run_ex's compare arms: the trap's noreturn refusal inside every slot
predicate defeats GCC's flow analysis there (`_ad` is read only after
both reads succeeded). The variant builds with -Wno-maybe-uninitialized;
release compiles the same source with the warning on and has none.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
With its run conditions applied, test_audio.eigs reaches the capture test,
and a real capture device delivers samples or not by timing: on some runs
the file prints a SKIP line. The baseline's two runs agreed, so the file
was taken as deterministic, and one branch run that differed was reported
as a DIFF (the smi-trap differential of a full run under Python 3.12, a
false red: rc 0 on both sides). Every run now uses SDL_AUDIODRIVER=dummy,
like the display is Xvfb: six baseline runs of test_audio are identical,
and it compares live (`same`), where it was replay-adjudicated before.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
InauguralPhysicist and others added 9 commits October 24, 2026 20:57
R1.6d-D1 and R1.6z-D1. Six MAP rows red on base in off/default/osr/trace, strict 0/1; public getter C gate red on raw NaN/payload/inf bit round trips. Cold critic added iterator backedge and dynamic integer-index coverage; get_at exact diagnostic messages pinned. No frozen branch expectation amended. Release build rc=0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
R1.6d-D1/N13: all eight VM index/iter/JIT/leaf data reads use get_at semantics. Speculative leaf refuses to raise without a callee frame. VM MAP rows green in off/default/osr/trace, strict 0/1; exact kind/message/line. Float producers/metadata retain kind; no ownership change. Release build rc=0 warnings=0. Docs and legacy indexed-read expectations move with behavior.

Reviewed amendment under R1.6d-D1 point 3 / N13 and R1.6 plan rule 4: NG32 and NG35 assert a value refusal with unchanged flags. NG35 gather still copies the cell; its final [0] is the ruled scalar read. The nonfinite exact-output fixture changes its two sticky INVALID outputs from true to false because those legacy indexed reads no longer normalize NaN. Base/tip isolation receipts prove the cause; strict NaN keeps its first diagnostic and INVALID. Numeric flags 33/33; full release suite 4606/4606, failures=0, skipped=10, sections=304, rc0; embed-smoke rc0; completed strict differential rc0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF

Legacy strict-math buffer-index expectations updated in this same file-group commit; strict math gate rc=0.
R1.6z-D1: raw stored-double element equality, NaN unequal to itself, signed zeros equal, no errors or math flags. Runtime/compiler/task/tape float producers retain kinds. Six MAP rows green across four tiers, strict 0/1; exact diagnostic contract. Release build rc=0 warnings=0; executed docs updated with behavior and ruling/prior-art reasoning.

Reviewed amendment under R1.6z-D1 point 1 / N11 and R1.6 plan rule 4: NG38/NG39 assert false for NaN buffer equality and unchanged math flags, replacing the legacy INVALID-write expectations in this same behavior commit. Numeric flags 33/33; full release suite 4606/4606, failures=0, skipped=10, sections=304, rc0; embed-smoke rc0; completed strict differential rc0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
Three float boxes use the exact same make_float pool/guard. slot_view reads its already-proven float through slot_f64_value, preserving raw payload behavior for direct-C facades. No ownership or numeric-kind change. Bridge definitions remain solely for later fixture/final deletion groups. Release build rc=0 warnings=0.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
R1.6z-D1: getter preserves canonical/payload NaN, infinities and negative zero; valid reads never raise or change flags. Wrong-type/OOB behavior unchanged. Public header and embedding guide document contract. C getter gate checks=36 failures=0; release build rc=0 warnings=0.

Reviewed amendment under R1.6 plan rule 4, R1.6z-D1 point 2 / N11: the complete C/embed getter sweep found one legacy pin at embed_smoke.c:673 (stored INFINITY == EIGS_NUM_MAX). Replace it with memcmp against the stored double, no pending error, and unchanged seeded math flags. No other old NaN/inf getter pin found. Acceptance: release build 1/1 rc0; embed-smoke 1/1 rc0; embed-smoke-asan 1/1 rc0 with detect_leaks=1; old-assertion plant 1/1 killed at rc2, exactly one FAIL, then source restored. Original C getter gate 36/36 unchanged. No frozen expectation or runtime change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
Explicit double producers/readers retain float kind; make_float_permanent preserves no-state fixtures. Retire the three old bridge classifier entries (their raw-NaN behavior is intentionally not reinterpreted as a finite data-reader expectation). Final typed readers keep their independent matrix. Release build and container slot C test rc=0. Final deletion follows in its own commit.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
All 21 transitional tokens absent without aliases. Production and C-fixture meter measured zero before final removal (actual compiler diagnostics archived). Delete obsolete definitions, seven already-dead marked helpers and the matrix formatter whose last callers were removed in group6. Retired vocabulary is required absent. Remove five obsolete classifier dispositions; review embed smoke bool-slot classifier. Normal build warnings=0; num-read and slot-layer green; six MAP rows green in four tiers, strict 0/1. Declare R1.6z landed. Frozen branch files unchanged.

Reviewed legacy store pin: old clamped-index assertion is red on candidate, then updated under the pre-registered N13/R1.6d-D1 boundary; raw non-finite store round trip uses N11 IEEE buffer equality. Focused store gate green in interpreter/JIT-enabled and strict 0/1 (four runs). No frozen expectation change.

Preserve the legacy store assertion tally with assert_eq: Tests=184 Pass=184 Fail=0 in all four interpreter/JIT-enabled strict-mode runs.

Reviewed gate-pin amendment (brief lesson 6): builtin_exec_capture and builtin_tensor_load differ only by retired constructor spelling inside comments. Executable C and whole-argument helper closures are unchanged. Repin exactly those two exempt body/source hashes and record the reason. Each repinned check was independently planted red once (rc1, exactly its named source/helper error), then restored byte-for-byte; shape contract 268 candidates / 139 guarded / 129 exempt / 0 errors. Full release suite 4606/4606, failures=0, skipped=10, sections=304, rc0; completed strict differential rc0. No gate logic, runtime, frozen row or D2 change.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
R1.6z-D2 (#1758 comment 6385903088). Raw SGD NaN through list/dict/nested/cyclic self-comparison and membership; finite cycle and 40-level shared DAG controls. Strict 0/1. Before fix: RED 4/4 tiers (off/default/OSR/trace), each program exits 0 with wrong answers; existing d8a9d2c runtime unchanged.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
R1.6z-D2 (#1758 comment 6385903088), No silent wrong answers. Iterative borrowed-pointer walk with a visited hash set; buffers visited once, cycles terminate. Distinct-container pairwise traversal/depth cap unchanged; R2.2 extension documented. D2 MAP green 4/4 tiers, strict 0/1, finite 40-level shared DAG, nested/cyclic NaN, membership and flags. make: 0 warnings. Deleted-token comment removed.

Reviewed amendment: refresh the generated numeric inventory after line shifts; move the existing buffer-identity calibration match to the new block (the original identity plant proves it red). Independent critic found stale normalization prose in README/SPEC; reconcile it with D1/D2 and indexing/iteration. Runtime and preregistered fixture unchanged.

Reviewed gate-population amendment: the whole final Phase 2 check exposed a MAP reference written as a command span rather than a path. Name the existing getter C fixture and reader script explicitly; preserve the command arguments separately. The real getter passed 36/36 checks; all program tiers, token/inventory and other C gates were green. This changes no expectation, runtime or test executable. Full train receipts are invalidated and rerun.

Mechanical continuation amendment: regenerate the numeric inventory after the reviewed embed getter pin removes EIGS_NUM_MAX and shifts its later source anchors. No inventory-generator, runtime or D2 fixture change.

Reviewed continuation 4 cost amendment, original brief lesson10 / #1939: all 11 OVER rows profiled against make-built main dde78c5 and pre-R1.6z 2ba66cc in three serial arms. Raw per-function Ir accounts for final numeric readers, finite buffer-data boundaries and VM code-generation changes; constructor alias removal is accounted separately. Tighten all 11 STALE rows; recover_round remains R5. Independent critic reviewed raw profiles, formulas, CI exception and scope. Cost stage: workloads=15 rows=30 over_declared_max=0 stale_declarations=0 PASS, rc0; CI bench gate rc0, 9/9 declarations applied. All 22 changed rows are within 3% of allowed Ir; local margins and prior CI inference are recorded in declarations and evidence. No executable, frozen expectation or other source changes.

bench/conservative_observed_loop.eigs jit: max 27.2->26.5, local delta=26.09493323%, margin=0.40506677pp. R1.6z measured against pre-round2ba66cc8: old Ir=100175815, tip Ir=99685893, net -489922 Ir; shared VM dispatch/helper code-generation effect of bridge retirement -9999 Ir (vm_run_ex -9999 Ir); runtime/container bridge-retirement TU code-generation/inlining consequence in list_append -480022 Ir (source body unchanged; measured old/tip assembly drops three saved registers and stack adjustment, eight executed prologue/epilogue instructions per ordinary append); other-function residual +99 Ir (other runtime functions -8 Ir; external string/number-formatting/startup functions +107 Ir; every function delta preserved)
bench/conservative_observed_loop.eigs off: max 22.7->22.1, local delta=21.85575982%, margin=0.24424018pp. R1.6z measured against pre-round2ba66cc8: old Ir=116230547, tip Ir=115630461, net -600086 Ir; shared VM dispatch/helper code-generation effect of bridge retirement -119999 Ir (vm_run_ex -119999 Ir); runtime/container bridge-retirement TU code-generation/inlining consequence in list_append -480022 Ir (source body unchanged; measured old/tip assembly drops three saved registers and stack adjustment, eight executed prologue/epilogue instructions per ordinary append); other-function residual -65 Ir (other runtime functions -8 Ir; external string/number-formatting/startup functions -57 Ir; every function delta preserved)
bench/conservative_unobserved_loop.eigs jit: max 33.9->33.1, local delta=32.83859521%, margin=0.26140479pp. R1.6z measured against pre-round2ba66cc8: old Ir=83937756, tip Ir=83452788, net -484968 Ir; shared VM dispatch/helper code-generation effect of bridge retirement -4998 Ir (vm_run_ex -4998 Ir); runtime/container bridge-retirement TU code-generation/inlining consequence in list_append -480022 Ir (source body unchanged; measured old/tip assembly drops three saved registers and stack adjustment, eight executed prologue/epilogue instructions per ordinary append); other-function residual +52 Ir (other runtime functions -8 Ir; external string/number-formatting/startup functions +60 Ir; every function delta preserved)
bench/conservative_unobserved_loop.eigs off: max 27.2->26.5, local delta=26.29338019%, margin=0.20661981pp. R1.6z measured against pre-round2ba66cc8: old Ir=100157519, tip Ir=99617487, net -540032 Ir; shared VM dispatch/helper code-generation effect of bridge retirement -59998 Ir (vm_run_ex -59998 Ir); runtime/container bridge-retirement TU code-generation/inlining consequence in list_append -480022 Ir (source body unchanged; measured old/tip assembly drops three saved registers and stack adjustment, eight executed prologue/epilogue instructions per ordinary append); other-function residual -12 Ir (other runtime functions -8 Ir; external string/number-formatting/startup functions -4 Ir; every function delta preserved)
bench/observed_loop.eigs jit: max 48.2->47.1, local delta=46.85956630%, margin=0.24043370pp. R1.6z measured against pre-round2ba66cc8: old Ir=63796565, tip Ir=63311655, net -484910 Ir; shared VM dispatch/helper code-generation effect of bridge retirement -5001 Ir (vm_run_ex -5001 Ir); runtime/container bridge-retirement TU code-generation/inlining consequence in list_append -480022 Ir (source body unchanged; measured old/tip assembly drops three saved registers and stack adjustment, eight executed prologue/epilogue instructions per ordinary append); other-function residual +113 Ir (other runtime functions -8 Ir; external string/number-formatting/startup functions +121 Ir; every function delta preserved)
bench/observed_loop.eigs off: max 33.8->33.2, local delta=32.91914844%, margin=0.28085156pp. R1.6z measured against pre-round2ba66cc8: old Ir=82326014, tip Ir=81785998, net -540016 Ir; shared VM dispatch/helper code-generation effect of bridge retirement -60001 Ir (vm_run_ex -60001 Ir); runtime/container bridge-retirement TU code-generation/inlining consequence in list_append -480022 Ir (source body unchanged; measured old/tip assembly drops three saved registers and stack adjustment, eight executed prologue/epilogue instructions per ordinary append); other-function residual +7 Ir (other runtime functions -8 Ir; external string/number-formatting/startup functions +15 Ir; every function delta preserved)
bench/scalar_loop.eigs jit: max 89.3->88.1, local delta=87.89544429%, margin=0.20455571pp. R1.6z measured against pre-round2ba66cc8: old Ir=60675645, tip Ir=60315786, net -359859 Ir; shared VM dispatch/helper code-generation effect of bridge retirement -40001 Ir (vm_run_ex -40001 Ir); runtime/container bridge-retirement TU code-generation/inlining consequence in list_append -320022 Ir (source body unchanged; measured old/tip assembly drops three saved registers and stack adjustment, eight executed prologue/epilogue instructions per ordinary append); other-function residual +164 Ir (other runtime functions -8 Ir; external string/number-formatting/startup functions +172 Ir; every function delta preserved)
bench/scalar_loop.eigs off: max 43.7->43, local delta=42.70394338%, margin=0.29605662pp. R1.6z measured against pre-round2ba66cc8: old Ir=65641792, tip Ir=65281914, net -359878 Ir; shared VM dispatch/helper code-generation effect of bridge retirement -40001 Ir (vm_run_ex -40001 Ir); runtime/container bridge-retirement TU code-generation/inlining consequence in list_append -320022 Ir (source body unchanged; measured old/tip assembly drops three saved registers and stack adjustment, eight executed prologue/epilogue instructions per ordinary append); other-function residual +145 Ir (other runtime functions -8 Ir; external string/number-formatting/startup functions +153 Ir; every function delta preserved)
bench/unobserved_armed_loop.eigs off: max 9.0->9.4, local delta=9.10122491%, margin=0.29877509pp. R1.6z measured against pre-round2ba66cc8: old Ir=929245584, tip Ir=930445331, net +1199747 Ir; shared VM dispatch/helper code-generation effect of bridge retirement +1200001 Ir (vm_run_ex +1200001 Ir); other-function residual -254 Ir (other runtime functions -13 Ir; external string/number-formatting/startup functions -241 Ir; every function delta preserved)
bench/unobserved_loop.eigs jit: max 48.2->47.1, local delta=46.85050059%, margin=0.24949941pp. R1.6z measured against pre-round2ba66cc8: old Ir=63804716, tip Ir=63319820, net -484896 Ir; shared VM dispatch/helper code-generation effect of bridge retirement -5001 Ir (vm_run_ex -5001 Ir); runtime/container bridge-retirement TU code-generation/inlining consequence in list_append -480022 Ir (source body unchanged; measured old/tip assembly drops three saved registers and stack adjustment, eight executed prologue/epilogue instructions per ordinary append); other-function residual +127 Ir (other runtime functions -8 Ir; external string/number-formatting/startup functions +135 Ir; every function delta preserved)
bench/unobserved_loop.eigs off: max 33.8->33.2, local delta=32.91480511%, margin=0.28519489pp. R1.6z measured against pre-round2ba66cc8: old Ir=82334123, tip Ir=81794226, net -539897 Ir; shared VM dispatch/helper code-generation effect of bridge retirement -60001 Ir (vm_run_ex -60001 Ir); runtime/container bridge-retirement TU code-generation/inlining consequence in list_append -480022 Ir (source body unchanged; measured old/tip assembly drops three saved registers and stack adjustment, eight executed prologue/epilogue instructions per ordinary append); other-function residual +126 Ir (other runtime functions -8 Ir; external string/number-formatting/startup functions +134 Ir; every function delta preserved)
tests/bench_buf_mix.eigs jit: max 312.9->321.8, local delta=321.59468680%, margin=0.20531320pp. R1.6z measured against pre-round2ba66cc8: old Ir=3111202023, tip Ir=3178233059, net +67031036 Ir; final numeric-reader migration at VM buffer stores/mixed arithmetic +48951663 Ir (eigs_float_arg +18524210 Ir, eigs_number_arg +38810652 Ir, eigs_num_arg_slow -8383199 Ir); VM index/iteration/leaf helper migration including R1.6d-D1 finite-data boundary on buffers +15876000 Ir (buffer_read_f64 +21168000 Ir, jit_helper_index_get -5292000 Ir); shared VM dispatch/helper code-generation effect of bridge retirement +2203008 Ir (vm_run_ex +2203008 Ir); constructor alias retirement -2 Ir (make_num/make_float combined, avoiding a symbol-rename false cost); IEEE/structural-equality dispatch change +5 Ir (values_equal_impl +5 Ir); other-function residual +362 Ir (other runtime functions -27 Ir; external string/number-formatting/startup functions +389 Ir; every function delta preserved)
tests/bench_buf_mix.eigs off: max 98.7->103, local delta=102.70259655%, margin=0.29740345pp. R1.6z measured against pre-round2ba66cc8: old Ir=3127852086, tip Ir=3194883016, net +67030930 Ir; final numeric-reader migration at VM buffer stores/mixed arithmetic +48951663 Ir (eigs_float_arg +18524210 Ir, eigs_number_arg +38810652 Ir, eigs_num_arg_slow -8383199 Ir); VM index/iteration/leaf helper migration including R1.6d-D1 finite-data boundary on buffers +15876000 Ir (buffer_read_f64 +21168000 Ir, jit_helper_index_get -5292000 Ir); shared VM dispatch/helper code-generation effect of bridge retirement +2203008 Ir (vm_run_ex +2203008 Ir); constructor alias retirement -2 Ir (make_num/make_float combined, avoiding a symbol-rename false cost); IEEE/structural-equality dispatch change +5 Ir (values_equal_impl +5 Ir); other-function residual +256 Ir (other runtime functions -27 Ir; external string/number-formatting/startup functions +283 Ir; every function delta preserved)
tests/bench_buf_resample.eigs jit: max 202.1->207.4, local delta=207.17516274%, margin=0.22483726pp. R1.6z measured against pre-round2ba66cc8: old Ir=14578356573, tip Ir=14840872110, net +262515537 Ir; final numeric-reader migration at VM buffer stores/mixed arithmetic +207811659 Ir (eigs_float_arg +126290530 Ir, eigs_number_arg +216479136 Ir, eigs_num_arg_slow -134958007 Ir); VM index/iteration/leaf helper migration including R1.6d-D1 finite-data boundary on buffers +43200018 Ir (buffer_read_f64 +57600024 Ir, jit_helper_index_get -14400006 Ir); shared VM dispatch/helper code-generation effect of bridge retirement +11503643 Ir (vm_run_ex +11503643 Ir); IEEE/structural-equality dispatch change +5 Ir (values_equal_impl +5 Ir); other-function residual +212 Ir (other runtime functions -26 Ir; external string/number-formatting/startup functions +238 Ir; every function delta preserved)
tests/bench_buf_resample.eigs off: max 70.7->73.7, local delta=73.49685726%, margin=0.20314274pp. R1.6z measured against pre-round2ba66cc8: old Ir=14621999324, tip Ir=14884514976, net +262515652 Ir; final numeric-reader migration at VM buffer stores/mixed arithmetic +207811659 Ir (eigs_float_arg +126290530 Ir, eigs_number_arg +216479136 Ir, eigs_num_arg_slow -134958007 Ir); VM index/iteration/leaf helper migration including R1.6d-D1 finite-data boundary on buffers +43200018 Ir (buffer_read_f64 +57600024 Ir, jit_helper_index_get -14400006 Ir); shared VM dispatch/helper code-generation effect of bridge retirement +11503643 Ir (vm_run_ex +11503643 Ir); IEEE/structural-equality dispatch change +5 Ir (values_equal_impl +5 Ir); other-function residual +327 Ir (other runtime functions -26 Ir; external string/number-formatting/startup functions +353 Ir; every function delta preserved)
tests/bench_dmg_shape.eigs jit: max 230.1->231.1, local delta=230.89514065%, margin=0.20485935pp. R1.6z measured against pre-round2ba66cc8: old Ir=4215433176, tip Ir=4229812330, net +14379154 Ir; final numeric-reader migration at VM buffer stores/mixed arithmetic +196608 Ir (eigs_float_arg +655360 Ir, eigs_number_arg +786432 Ir, eigs_num_arg_slow -1245184 Ir); VM index/iteration/leaf helper migration including R1.6d-D1 finite-data boundary on buffers +9000000 Ir (buffer_read_f64 +12000000 Ir, jit_helper_index_get -3000000 Ir); shared VM dispatch/helper code-generation effect of bridge retirement +5187517 Ir (vm_run_ex +5187517 Ir); constructor alias retirement -4 Ir (make_num/make_float combined, avoiding a symbol-rename false cost); other-function residual -4967 Ir (other runtime functions -103 Ir; external string/number-formatting/startup functions -4864 Ir; every function delta preserved)
tests/bench_dmg_shape.eigs off: max 76.7->77.3, local delta=77.01532116%, margin=0.28467884pp. R1.6z measured against pre-round2ba66cc8: old Ir=4197227719, tip Ir=4211611742, net +14384023 Ir; final numeric-reader migration at VM buffer stores/mixed arithmetic +196608 Ir (eigs_float_arg +655360 Ir, eigs_number_arg +786432 Ir, eigs_num_arg_slow -1245184 Ir); VM index/iteration/leaf helper migration including R1.6d-D1 finite-data boundary on buffers +9000000 Ir (buffer_read_f64 +12000000 Ir, jit_helper_index_get -3000000 Ir); shared VM dispatch/helper code-generation effect of bridge retirement +5187517 Ir (vm_run_ex +5187517 Ir); constructor alias retirement -4 Ir (make_num/make_float combined, avoiding a symbol-rename false cost); other-function residual -98 Ir (other runtime functions -59 Ir; external string/number-formatting/startup functions -39 Ir; every function delta preserved)
tests/bench_idxset.eigs jit: max 457.5->459.2, local delta=458.93432994%, margin=0.26567006pp. R1.6z measured against pre-round2ba66cc8: old Ir=534010570, tip Ir=535405691, net +1395121 Ir; final numeric-reader migration at VM buffer stores/mixed arithmetic +300000 Ir (eigs_float_arg +1000000 Ir, eigs_number_arg +1200000 Ir, eigs_num_arg_slow -1900000 Ir); VM index/iteration/leaf helper migration including R1.6d-D1 finite-data boundary on buffers +18 Ir (buffer_read_f64 +24 Ir, jit_helper_index_get -6 Ir); shared VM dispatch/helper code-generation effect of bridge retirement +1100000 Ir (vm_run_ex +1100000 Ir); constructor alias retirement -4 Ir (make_num/make_float combined, avoiding a symbol-rename false cost); other-function residual -4893 Ir (other runtime functions -55 Ir; external string/number-formatting/startup functions -4838 Ir; every function delta preserved)
tests/bench_idxset.eigs off: max 127.8->128.5, local delta=128.26360227%, margin=0.23639773pp. R1.6z measured against pre-round2ba66cc8: old Ir=534004479, tip Ir=535404391, net +1399912 Ir; final numeric-reader migration at VM buffer stores/mixed arithmetic +300000 Ir (eigs_float_arg +1000000 Ir, eigs_number_arg +1200000 Ir, eigs_num_arg_slow -1900000 Ir); VM index/iteration/leaf helper migration including R1.6d-D1 finite-data boundary on buffers +18 Ir (buffer_read_f64 +24 Ir, jit_helper_index_get -6 Ir); shared VM dispatch/helper code-generation effect of bridge retirement +1100000 Ir (vm_run_ex +1100000 Ir); constructor alias retirement -4 Ir (make_num/make_float combined, avoiding a symbol-rename false cost); other-function residual -102 Ir (other runtime functions -13 Ir; external string/number-formatting/startup functions -89 Ir; every function delta preserved)
tests/bench_pcm_codec.eigs jit: max 376.8->383.8, local delta=383.52384573%, margin=0.27615427pp. R1.6z measured against pre-round2ba66cc8: old Ir=39023891158, tip Ir=39585491642, net +561600484 Ir; final numeric-reader migration at VM buffer stores/mixed arithmetic +468002880 Ir (eigs_float_arg +280809600 Ir, eigs_number_arg +483611520 Ir, eigs_num_arg_slow -296418240 Ir); VM index/iteration/leaf helper migration including R1.6d-D1 finite-data boundary on buffers +86400018 Ir (buffer_read_f64 +115200024 Ir, jit_helper_index_get -28800006 Ir); shared VM dispatch/helper code-generation effect of bridge retirement +7197108 Ir (vm_run_ex +7197108 Ir); IEEE/structural-equality dispatch change +5 Ir (values_equal_impl +5 Ir); other-function residual +473 Ir (other runtime functions -39 Ir; external string/number-formatting/startup functions +512 Ir; every function delta preserved)
tests/bench_pcm_codec.eigs off: max 98.5->101.4, local delta=101.13250999%, margin=0.26749001pp. R1.6z measured against pre-round2ba66cc8: old Ir=39206179064, tip Ir=39767779547, net +561600483 Ir; final numeric-reader migration at VM buffer stores/mixed arithmetic +468002880 Ir (eigs_float_arg +280809600 Ir, eigs_number_arg +483611520 Ir, eigs_num_arg_slow -296418240 Ir); VM index/iteration/leaf helper migration including R1.6d-D1 finite-data boundary on buffers +86400018 Ir (buffer_read_f64 +115200024 Ir, jit_helper_index_get -28800006 Ir); shared VM dispatch/helper code-generation effect of bridge retirement +7197108 Ir (vm_run_ex +7197108 Ir); IEEE/structural-equality dispatch change +5 Ir (values_equal_impl +5 Ir); other-function residual +472 Ir (other runtime functions -39 Ir; external string/number-formatting/startup functions +511 Ir; every function delta preserved)
tests/bench_perf.eigs off: max 19.2->18.8, local delta=18.55142783%, margin=0.24857217pp. R1.6z measured against pre-round2ba66cc8: old Ir=349488837, tip Ir=348433201, net -1055636 Ir; shared VM dispatch/helper code-generation effect of bridge retirement -220005 Ir (vm_run_ex -220005 Ir); runtime/container bridge-retirement TU code-generation/inlining consequence in list_append -816088 Ir (source body unchanged; measured old/tip assembly drops three saved registers and stack adjustment, eight executed prologue/epilogue instructions per ordinary append); constructor alias retirement -20 Ir (make_num/make_float combined, avoiding a symbol-rename false cost); other-function residual -19523 Ir (other runtime functions -213 Ir; external string/number-formatting/startup functions -19310 Ir; every function delta preserved)

Final acceptance counts:
precheck: selftests: enrolment 46/46; product-triggered rows 9 (bound <= 60s each); 7 self-tests selected; selftests: 7 passed, 0 failed; total 1180.26s; precheck: 19 passed, 0 failed, 0 skipped in 1237s
phase2-builtins-all-profiles: phase2-builtins: PASS rows=310 landed=R1.6b,R1.6c,R1.6d,R1.6e,R1.6f,R1.6g,R1.6z migrated=310 unchanged=0
phase2-check: phase2-check: PASS
phase2-ci: phase2-lib-diff: N4 source_functions=28 exported_functions=19 calls=4631 both_ok=2500 changed_functions=11; phase2-lib-diff: listed_functions=13 undeclared=0 stale=0 PASS; phase2-builtins: PASS rows=310 landed=R1.6b,R1.6c,R1.6d,R1.6e,R1.6f,R1.6g,R1.6z migrated=310 unchanged=0; phase2-ci: PASS (through=R1.6z)
lib-diff: phase2-lib-diff: range=[-3, 110] modules=78 importable=66 functions=889 via_reexport=95 no_params=24 calls=281423 examined=281423 unexamined=0 both_ok=124575 both_raise=156668 improved=0; phase2-lib-diff: N4 source_functions=28 exported_functions=19 calls=4631 both_ok=2500 changed_functions=11; phase2-lib-diff: listed_functions=13 undeclared=0 stale=0 PASS
full-release-make-test:   RESULTS: 4606/4606 passed, 0 failed, 10 skipped
extensions-suite:   RESULTS: 4849/4849 passed, 0 failed, 5 skipped
corpus-adjudication: Corpus adjudicated: 10 differences traced to R1.6z behavior/registration; sole expected runaway timeout; no other crash/timeout.
replay-diff: replay_diff: OK (267 programs record+replay; 27 at the documented boundary; 0 nondeterministic; 1 ledgered)
jit-diff: jit_diff: OBS examined=772 denied=13; jit_diff: OK (267 programs x {jit, osr} vs the interpreter; suite-env completed=16; OBS examined=772 denied=13; 32 arms adjudicated; 2 ledgered)
cost-measure: phase2-cost: workloads=15 rows=30 over_declared_max=0 stale_declarations=0 PASS
D2: red 4/4 tiers on d8a9d2c; green 4/4 tiers on release and ASan, strict 0/1. Three D2 plants killed (identity rc1, missing visited set rc124 at 30s, top-level-only rc1). Shared DAG true in 0.0072–0.0117 seconds.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
@InauguralPhysicist

Copy link
Copy Markdown
Collaborator Author

R1.6z LANDED on phase2-numbers: 21c56bae..db349464 (9 commits). The numeric bridge is gone. Full lane CI 40152618419 GREEN 26/26; phase2 40152617265 GREEN.

What the round did:

  • Deleted the bridge: all 21 tokens, about 213 sites, the R1.6a meter, and every helper left without a caller. No alias survives; the token gate and a -Wunused-function build prove it.
  • Pre-registered three ruled behaviours BEFORE migrating them, each red on base and green on tip, on every tier:
    • R1.6z-D1: IEEE buffer equality, and a raw-bits embed getter (a memcmp C gate);
    • R1.6d-D1 point 3: the VM data boundary at index, iteration, local-index and the JIT leaf;
    • R1.6z-D2 (comment 6385903088): structural container self-equality, behind a linear visited-set scan. The cost witness, a 2^40 shared DAG compared with itself, answers in 7-12 ms on every tier.
  • The blind critic (Codex Cloud, its own oracles) found the one substantive bug the builder's gates missed: l == l was true for a list holding a NaN buffer. D2 is its fix. Its other 1,100+ checks agreed: the equality grid, the bit-exact getter, the VM tiers, pre-registration order, and the 450-program corpus.

Gates (final fingerprint 8857c5ca):

  • the full table, 310 rows on every profile;
  • phase2_check --through R1.6z and phase2_ci;
  • the full release make test, 4606/4606 over 304 sections;
  • the extensions recipe, including the SDL UI-input build;
  • make embed-smoke and its ASan variant;
  • the lib, corpus (10 DIFFs, each attributed to a ruling), replay and jit differentials;
  • the plants, and cost.

Cost: 11 rows re-declared and 11 tightened, each attributed per component by Cachegrind. For example, bench_buf_mix adds 67.0M Ir: 49.0M from the final numeric readers, 15.9M from the R1.6d-D1 boundary and 2.2M from VM codegen. All keep recover_round=R5; every row sat within 3% of its bound, and CI agreed.

Legacy pins re-stated to the ruled behaviour, each in the group commit that changed it:

Closing #1919 (all five boxes) and #1920 (R1.6z-D1 is implemented, with both pre-registrations green).

Next: sync #8 (main 6352151b+ into phase2: the build lock, the #1947 shared-store guards, the #1943 replay dedup, the docs gates), then R1.7.

All required gates complete

Exact parents: db34946 + 3d8a14b
Resolved all nine conflicts; preserve Phase2 numeric kinds and validation ordering. Main tree locking, shared argument guards, replay helper, bool wording and release cut retained. Two Phase2 enrolment declarations integrate the new lock tools (Fixes #1968).

amalgamation-clang: actual rc=0; amalgamation-clang-a2.log
amalgamation-gcc: actual rc=0; amalgamation-gcc-a2.log
baseline-checkout: actual rc=0; baseline-checkout-a1.log
baseline-clone: actual rc=0; baseline-clone-a1.log
baseline-release-build: actual rc=0; baseline-release-build-a2.log
build-server-db: actual rc=0; build-server-db-a3.log
build-server: actual rc=0; build-server-a2.log
build-zlib: actual rc=0; build-zlib-a3.log
builtin-doc-examples: actual rc=1; builtin-doc-examples-a1.log
candidate-release-build: actual rc=0; candidate-release-build-a4.log
checkpoint-docs-phase2-and-bool-wording: actual rc=0; checkpoint-docs-phase2-and-bool-wording-a1.log
checkpoint-docs-union-complete: actual rc=0; checkpoint-docs-union-complete-a1.log
checkpoint-enrolment-integration: actual rc=0; checkpoint-enrolment-integration-a1.log
checkpoint-final-source: actual rc=0; checkpoint-final-source-a1.log
checkpoint-http-guards-and-int-results: actual rc=0; checkpoint-http-guards-and-int-results-a1.log
checkpoint-inventory: actual rc=0; checkpoint-inventory-a1.log
checkpoint-makefile-union: actual rc=0; checkpoint-makefile-union-a1.log
checkpoint-replay-helpers-and-readers: actual rc=0; checkpoint-replay-helpers-and-readers-a1.log
checkpoint-selftests-layout: actual rc=0; checkpoint-selftests-layout-a1.log
checkpoint-selftests-union: actual rc=0; checkpoint-selftests-union-a1.log
checkpoint-shape-conflicts-phase2-start: actual rc=0; checkpoint-shape-conflicts-phase2-start-a1.log
checkpoint-shape-reviewed: actual rc=0; checkpoint-shape-reviewed-a1.log
ci-bench-regression: actual rc=0; ci-bench-regression-a1.log
corpus-adjudication: actual rc=0; corpus-adjudication-a2.log
corpus-diff: actual rc=1; corpus-diff-a2.log
cost-measure: actual rc=0; cost-measure-a1.log
diffs-release-select: actual rc=0; diffs-release-select-a2.log
doc-examples: actual rc=0; doc-examples-a1.log
docs-claims-selftest: actual rc=0; docs-claims-selftest-a2.log
docs-claims: actual rc=0; docs-claims-a1.log
embed-smoke-asan-server: actual rc=0; embed-smoke-asan-server-a1.log
embed-smoke-asan: actual rc=0; embed-smoke-asan-a1.log
embed-smoke-gfx: actual rc=0; embed-smoke-gfx-a1.log
embed-smoke: actual rc=0; embed-smoke-a1.log
enrolment-declaration-plant: actual rc=1; enrolment-declaration-plant-a1.log
enrolment-declaration-restored: actual rc=0; enrolment-declaration-restored-a1.log
enrolment-integration-selftest: actual rc=0; enrolment-integration-selftest-a1.log
enrolment-integration: actual rc=0; enrolment-integration-a1.log
enrolment-selftest: actual rc=0; enrolment-selftest-a2.log
extensions-server-select: actual rc=0; extensions-server-select-a1.log
extensions-suite: actual rc=0; extensions-suite-a1.log
final-inventory: actual rc=0; final-inventory-a1.log
final-shape: actual rc=0; final-shape-a1.log
final-source-evidence: actual rc=0; final-source-evidence-a1.log
final-whitespace: actual rc=0; final-whitespace-a1.log
focus-release-restore: actual rc=0; focus-release-restore-a3.log
focus-server-select: actual rc=0; focus-server-select-a3.log
full-release-make-test: actual rc=0; full-release-make-test-a1.log
full-release-select: actual rc=0; full-release-select-a1.log
gcc-release-O0: actual rc=0; gcc-release-O0-a2.log
gcc-release-O1: actual rc=0; gcc-release-O1-a2.log
gcc-release-O2: actual rc=0; gcc-release-O2-a2.log
http-hs00: actual rc=0; http-hs00-a1.log
inventory-check: actual rc=0; inventory-check-a1.log
inventory-refresh: actual rc=0; inventory-refresh-a1.log
jit-diff: actual rc=0; jit-diff-a2.log
lib-diff: actual rc=0; lib-diff-a1.log
main-after-build: actual rc=0; main-after-build-a1.log
main-after-checkout: actual rc=0; main-after-checkout-a1.log
main-after-clone: actual rc=0; main-after-clone-a1.log
main-after-record-bench_dmg_shape: actual rc=0; main-after-record-bench_dmg_shape-a1.log
main-after-record-bench_idxset: actual rc=0; main-after-record-bench_idxset-a1.log
main-after-record-bench_perf: actual rc=0; main-after-record-bench_perf-a1.log
main-after-record-trace_mt_replay_workers: actual rc=0; main-after-record-trace_mt_replay_workers-a1.log
main-after-replay-bench_dmg_shape: actual rc=0; main-after-replay-bench_dmg_shape-a1.log
main-after-replay-bench_idxset: actual rc=0; main-after-replay-bench_idxset-a1.log
main-after-replay-bench_perf: actual rc=0; main-after-replay-bench_perf-a1.log
main-after-replay-trace_mt_replay_workers: actual rc=0; main-after-replay-trace_mt_replay_workers-a1.log
main-before-build: actual rc=0; main-before-build-a1.log
main-before-checkout: actual rc=0; main-before-checkout-a1.log
main-before-clone: actual rc=0; main-before-clone-a1.log
main-before-record-bench_dmg_shape: actual rc=0; main-before-record-bench_dmg_shape-a1.log
main-before-record-bench_idxset: actual rc=0; main-before-record-bench_idxset-a1.log
main-before-record-bench_perf: actual rc=0; main-before-record-bench_perf-a1.log
main-before-record-trace_mt_replay_workers: actual rc=0; main-before-record-trace_mt_replay_workers-a1.log
main-before-replay-bench_dmg_shape: actual rc=0; main-before-replay-bench_dmg_shape-a1.log
main-before-replay-bench_idxset: actual rc=0; main-before-replay-bench_idxset-a1.log
main-before-replay-bench_perf: actual rc=0; main-before-replay-bench_perf-a1.log
main-before-replay-trace_mt_replay_workers: actual rc=0; main-before-replay-trace_mt_replay_workers-a1.log
main-before-to-main-after-diagnostic-runtime-retag-bench_dmg_shape: actual rc=0; main-before-to-main-after-diagnostic-runtime-retag-bench_dmg_shape-a1.log
main-before-to-main-after-diagnostic-runtime-retag-bench_idxset: actual rc=0; main-before-to-main-after-diagnostic-runtime-retag-bench_idxset-a1.log
main-before-to-main-after-diagnostic-runtime-retag-bench_perf: actual rc=0; main-before-to-main-after-diagnostic-runtime-retag-bench_perf-a1.log
main-before-to-main-after-diagnostic-runtime-retag-trace_mt_replay_workers: actual rc=0; main-before-to-main-after-diagnostic-runtime-retag-trace_mt_replay_workers-a1.log
main-before-vs-main-after-cross-replay-bench_dmg_shape: actual rc=3; main-before-vs-main-after-cross-replay-bench_dmg_shape-a1.log
main-before-vs-main-after-cross-replay-bench_idxset: actual rc=3; main-before-vs-main-after-cross-replay-bench_idxset-a1.log
main-before-vs-main-after-cross-replay-bench_perf: actual rc=3; main-before-vs-main-after-cross-replay-bench_perf-a1.log
main-before-vs-main-after-cross-replay-trace_mt_replay_workers: actual rc=3; main-before-vs-main-after-cross-replay-trace_mt_replay_workers-a1.log
main-before-vs-main-after-header-only-bench_dmg_shape: actual rc=3; main-before-vs-main-after-header-only-bench_dmg_shape-a1.log
main-before-vs-main-after-header-only-bench_idxset: actual rc=3; main-before-vs-main-after-header-only-bench_idxset-a1.log
main-before-vs-main-after-header-only-bench_perf: actual rc=3; main-before-vs-main-after-header-only-bench_perf-a1.log
main-before-vs-main-after-header-only-trace_mt_replay_workers: actual rc=3; main-before-vs-main-after-header-only-trace_mt_replay_workers-a1.log
make-lock-selftest: actual rc=0; make-lock-selftest-a2.log
merged-record-bench_dmg_shape: actual rc=0; merged-record-bench_dmg_shape-a1.log
merged-record-bench_idxset: actual rc=0; merged-record-bench_idxset-a1.log
merged-record-bench_perf: actual rc=0; merged-record-bench_perf-a1.log
merged-record-trace_mt_replay_workers: actual rc=0; merged-record-trace_mt_replay_workers-a1.log
merged-replay-bench_dmg_shape: actual rc=0; merged-replay-bench_dmg_shape-a1.log
merged-replay-bench_idxset: actual rc=0; merged-replay-bench_idxset-a1.log
merged-replay-bench_perf: actual rc=0; merged-replay-bench_perf-a1.log
merged-replay-trace_mt_replay_workers: actual rc=0; merged-replay-trace_mt_replay_workers-a1.log
patch-reconstruction-apply: actual rc=0; patch-reconstruction-apply-a1.log
patch-reconstruction-check: actual rc=0; patch-reconstruction-check-a1.log
phase2-base-record-bench_dmg_shape: actual rc=0; phase2-base-record-bench_dmg_shape-a1.log
phase2-base-record-bench_idxset: actual rc=0; phase2-base-record-bench_idxset-a1.log
phase2-base-record-bench_perf: actual rc=0; phase2-base-record-bench_perf-a1.log
phase2-base-record-trace_mt_replay_workers: actual rc=0; phase2-base-record-trace_mt_replay_workers-a1.log
phase2-base-replay-bench_dmg_shape: actual rc=0; phase2-base-replay-bench_dmg_shape-a1.log
phase2-base-replay-bench_idxset: actual rc=0; phase2-base-replay-bench_idxset-a1.log
phase2-base-replay-bench_perf: actual rc=0; phase2-base-replay-bench_perf-a1.log
phase2-base-replay-trace_mt_replay_workers: actual rc=0; phase2-base-replay-trace_mt_replay_workers-a1.log
phase2-base-to-merged-diagnostic-runtime-retag-bench_dmg_shape: actual rc=0; phase2-base-to-merged-diagnostic-runtime-retag-bench_dmg_shape-a1.log
phase2-base-to-merged-diagnostic-runtime-retag-bench_idxset: actual rc=0; phase2-base-to-merged-diagnostic-runtime-retag-bench_idxset-a1.log
phase2-base-to-merged-diagnostic-runtime-retag-bench_perf: actual rc=0; phase2-base-to-merged-diagnostic-runtime-retag-bench_perf-a1.log
phase2-base-to-merged-diagnostic-runtime-retag-trace_mt_replay_workers: actual rc=0; phase2-base-to-merged-diagnostic-runtime-retag-trace_mt_replay_workers-a1.log
phase2-base-vs-merged-cross-replay-bench_dmg_shape: actual rc=3; phase2-base-vs-merged-cross-replay-bench_dmg_shape-a1.log
phase2-base-vs-merged-cross-replay-bench_idxset: actual rc=3; phase2-base-vs-merged-cross-replay-bench_idxset-a1.log
phase2-base-vs-merged-cross-replay-bench_perf: actual rc=3; phase2-base-vs-merged-cross-replay-bench_perf-a1.log
phase2-base-vs-merged-cross-replay-trace_mt_replay_workers: actual rc=3; phase2-base-vs-merged-cross-replay-trace_mt_replay_workers-a1.log
phase2-base-vs-merged-header-only-bench_dmg_shape: actual rc=3; phase2-base-vs-merged-header-only-bench_dmg_shape-a1.log
phase2-base-vs-merged-header-only-bench_idxset: actual rc=3; phase2-base-vs-merged-header-only-bench_idxset-a1.log
phase2-base-vs-merged-header-only-bench_perf: actual rc=3; phase2-base-vs-merged-header-only-bench_perf-a1.log
phase2-base-vs-merged-header-only-trace_mt_replay_workers: actual rc=3; phase2-base-vs-merged-header-only-trace_mt_replay_workers-a1.log
phase2-blocked-driver: actual rc=2; phase2-blocked-driver-a1.log
phase2-builtins-all-profiles: actual rc=0; phase2-builtins-all-profiles-a1.log
phase2-builtins-primary-server-db: actual rc=0; phase2-builtins-primary-server-db-a1.log
phase2-builtins-primary-server: actual rc=0; phase2-builtins-primary-server-a1.log
phase2-builtins-primary-zlib: actual rc=0; phase2-builtins-primary-zlib-a1.log
phase2-check: actual rc=0; phase2-check-a1.log
phase2-ci: actual rc=0; phase2-ci-a1.log
phase2-select-release: actual rc=0; phase2-select-release-a1.log
postgres-create: actual rc=0; postgres-create-a1.log
postgres-db-exists: actual rc=0; postgres-db-exists-a2.log
postgres-init: actual rc=0; postgres-init-a1.log
postgres-prepare-for-tests: actual rc=0; postgres-prepare-for-tests-a1.log
postgres-prepare: actual rc=0; postgres-prepare-a1.log
postgres-start: actual rc=0; postgres-start-a1.log
postgres-status: actual rc=0; postgres-status-a2.log
postgres-witness: actual rc=0; postgres-witness-a2.log
replay-diff: actual rc=0; replay-diff-a2.log
selftests-registry: actual rc=0; selftests-registry-a1.log
shape-before: actual rc=1; shape-before-a1.log
shape-final: actual rc=0; shape-final-a1.log
shape-live-plant: actual rc=1; shape-live-plant-a1.log
shape-repinned: actual rc=0; shape-repinned-a1.log
shape-restored: actual rc=0; shape-restored-a1.log
tape-kinds: actual rc=0; tape-kinds-a1.log
tests-release-restore: actual rc=0; tests-release-restore-a1.log
trace-header-record: actual rc=0; trace-header-record-a2.log
trace-header-replay: actual rc=0; trace-header-replay-a2.log
verification-clone: actual rc=0; verification-clone-a1.log

Actual gate counts:
amalgamation-clang: Results: 7 passed, 0 failed
amalgamation-gcc: Results: 7 passed, 0 failed
cost-measure: phase2-cost: source=codspeed.yml workloads=15 tiers=2 undeclared_max=+0.3% declarations=30 stale_below_max=0.5 logs=/tmp/phase2-cost-_pj3jx63
cost-measure: phase2-cost: workloads=15 rows=30 over_declared_max=0 stale_declarations=0 PASS
doc-examples: Doc populations pinned: 12 of 12 row(s) applied
doc-examples: Doc examples: 238 checked, 238 passed, 0 failed, 5 skipped, 0 unreadable fence(s)
docs-claims-selftest: SELFTEST: control: PASS
docs-claims-selftest: SELFTEST: path: PASS
docs-claims-selftest: SELFTEST: flag: PASS
docs-claims-selftest: SELFTEST: target: PASS
docs-claims-selftest: SELFTEST: name: PASS
docs-claims-selftest: SELFTEST: contract-name: PASS
docs-claims-selftest: SELFTEST: count: PASS
docs-claims-selftest: SELFTEST: stale-concurrency: PASS
docs-claims-selftest: SELFTEST: bool-result: PASS
docs-claims-selftest: SELFTEST: strict-intro: PASS
docs-claims-selftest: SELFTEST: strict-later-gfx: PASS
docs-claims-selftest: SELFTEST: strict-audio: PASS
docs-claims-selftest: SELFTEST: strict-core-row: PASS
docs-claims-selftest: SELFTEST: strict-audio-short: PASS
docs-claims-selftest: SELFTEST: strict-section-missing: PASS
docs-claims-selftest: SELFTEST: strict-gfx-section-missing: PASS
docs-claims-selftest: SELFTEST: strict-explicit-setting: PASS
docs-claims-selftest: SELFTEST: enrolment: PASS
docs-claims-selftest: SELFTEST: declared-set: PASS
docs-claims-selftest: SELFTEST: 19 case(s) run, 19 passed, 0 failed
docs-claims:   BOOL RESULT WORDING: 32 constructor-derived bool builtin(s), 64 documented row/hover entrie(s), 0 hit(s)
enrolment-selftest:   checks=7
extensions-suite: examined=303
extensions-suite:   PASS: test-enrolment: examined=129 enrolled=128 exempt=1; tools examined=76 enrolled=56 exempt=20
extensions-suite:   RESULTS: 4850/4850 passed, 0 failed, 5 skipped
final-inventory: examined=2120 classified=2120 unclassified=0
final-shape: SHAPE_CONTRACT: candidates=268 guarded=139 exempt=129 errors=0
full-release-make-test: examined=303
full-release-make-test:   PASS: test-enrolment: examined=129 enrolled=128 exempt=1; tools examined=76 enrolled=56 exempt=20
full-release-make-test:   RESULTS: 4606/4606 passed, 0 failed, 10 skipped
http-hs00: HTTP_SERVER: 46 passed, 0 failed
jit-diff: jit_diff: OBS examined=772 denied=13
jit-diff: jit_diff: OK (267 programs x {jit, osr} vs the interpreter; suite-env completed=16; OBS examined=772 denied=13; 32 arms adjudicated; 2 ledgered)
lib-diff: phase2-lib-diff: range=[-3, 110] modules=78 importable=66 functions=889 via_reexport=95 no_params=24 calls=281423 examined=281423 unexamined=0 both_ok=124575 both_raise=156668 improved=0
lib-diff: phase2-lib-diff: N4 source_functions=28 exported_functions=19 calls=4631 both_ok=2500 changed_functions=11
lib-diff: phase2-lib-diff: listed_functions=13 undeclared=0 stale=0 PASS
make-lock-selftest: make-lock selftest: 8/8 passed
phase2-builtins-all-profiles: examined=310 section6=310 inventory=310 rowmeta=310 cases=312
phase2-builtins-all-profiles: phase2-builtins: PASS rows=310 landed=R1.6b,R1.6c,R1.6d,R1.6e,R1.6f,R1.6g,R1.6z migrated=310 unchanged=0
phase2-builtins-primary-server-db: examined=310 section6=310 inventory=310 rowmeta=310 cases=312
phase2-builtins-primary-server-db: phase2-builtins: PASS rows=310 landed=R1.6b,R1.6c,R1.6d,R1.6e,R1.6f,R1.6g,R1.6z migrated=310 unchanged=0
phase2-builtins-primary-server: examined=310 section6=310 inventory=310 rowmeta=310 cases=312
phase2-builtins-primary-server: phase2-builtins: PASS rows=310 landed=R1.6b,R1.6c,R1.6d,R1.6e,R1.6f,R1.6g,R1.6z migrated=310 unchanged=0
phase2-builtins-primary-zlib: examined=310 section6=310 inventory=310 rowmeta=310 cases=312
phase2-builtins-primary-zlib: phase2-builtins: PASS rows=310 landed=R1.6b,R1.6c,R1.6d,R1.6e,R1.6f,R1.6g,R1.6z migrated=310 unchanged=0
phase2-check:   examined=2120 classified=2120 unclassified=0
phase2-check:   phase2-builtins: PASS rows=310 landed=R1.6b,R1.6c,R1.6d,R1.6e,R1.6f,R1.6g,R1.6z migrated=310 unchanged=0
phase2-check: phase2-check: PASS
phase2-ci: phase2-ci: through=R1.6z (the complete declared prefix of MAP rounds)
phase2-ci:   examined=2120 classified=2120 unclassified=0
phase2-ci:   phase2-builtins: PASS rows=310 landed=R1.6b,R1.6c,R1.6d,R1.6e,R1.6f,R1.6g,R1.6z migrated=310 unchanged=0
phase2-ci: phase2-check: PASS
phase2-ci: phase2-lib-diff: range=[-3, 110] modules=78 importable=66 functions=889 via_reexport=95 no_params=24 calls=281423 examined=281423 unexamined=0 both_ok=124575 both_raise=156668 improved=0
phase2-ci: phase2-lib-diff: N4 source_functions=28 exported_functions=19 calls=4631 both_ok=2500 changed_functions=11
phase2-ci: phase2-lib-diff: listed_functions=13 undeclared=0 stale=0 PASS
phase2-ci: examined=310 section6=310 inventory=310 rowmeta=310 cases=312
phase2-ci: phase2-builtins: PASS rows=310 landed=R1.6b,R1.6c,R1.6d,R1.6e,R1.6f,R1.6g,R1.6z migrated=310 unchanged=0
phase2-ci: phase2-readers: PASS variant=release checks=4389
phase2-ci: phase2-readers: PASS variant=asan checks=4389
phase2-ci: phase2-ci: PASS (through=R1.6z)
replay-diff: replay_diff: OK (267 programs record+replay; 27 at the documented boundary; 0 nondeterministic; 1 ledgered)
shape-final: SHAPE_CONTRACT: candidates=268 guarded=139 exempt=129 errors=0

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
Comment thread src/eigenscript.c
if (av != bv) return 0;
/* R1.6z-D1: total IEEE equality on stored doubles. No
* scalar boundary, normalization, error or math-flag write. */
if (!(a->data.buffer.data[i] == b->data.buffer.data[i])) return 0;
@InauguralPhysicist

Copy link
Copy Markdown
Collaborator Author

Sync #8 landed and is GREEN: db349464..b6f9db38, a two-parent merge of main 3d8a14b4 (v0.47.0). Full lane CI 40202469588 26/26; phase2 40202468904.

Next: R1.7 (N6, float text).

InauguralPhysicist and others added 5 commits October 25, 2026 10:26
R1.7-D3/D4: 43/43 CHANGE tier observations red on b6f9db3; 8/8 invariant observations green. D1 direct literal already prints Python repr on the actual base (15..17 writer), so D3 general rule classifies it invariant. T1 includes0.1. Direct constant-pool probe base:8 checks,3 failures; DB:11 passed,3 failed,14 declared. Invariant wrong-output plant red; fresh critic7/7 controls and51/51 independent tier classification. No runtime source or frozen expectation changes.

Continuation 6, R1.7-D7 (#1758, N6): change ctl.N8.refuse-mod's observable from print r (legacy 0 vs N6 0.0) to print (r == 0), true on both. The hot f, float operands, MOD body, warm-up and fn-stop f MOD witness are unchanged. MAP.md records D7. Derived all-18-control sweep: the only other float-output controls are leaf-float 2.25 and osr-float 150.5, already byte-stable under N6; no other stale control pin.
D7 narrow checkpoint proofs (all requested commands rc=0):
tier=off examined=111 rows tag_fail=111 branch_pass=111 vacuous=0 tag_timeout=0 tag_signal=0
tier=default examined=111 rows tag_fail=111 branch_pass=111 vacuous=0 tag_timeout=0 tag_signal=0
tier=osr examined=111 rows tag_fail=111 branch_pass=111 vacuous=0 tag_timeout=0 tag_signal=0
tier=trace examined=105 rows tag_fail=105 branch_pass=105 vacuous=0 tag_timeout=0 tag_signal=0
controls=18 both_pass=18 witnessed=31 mapped=113 gates=8 through=R1.7
controls_witnessed=13 controls_vacuous=0
invariants=2 branch_pass=2
phase2-check: PASS
RESULTS: 2/2 passed, 0 failed, 0 skipped
Corpus attribution: 55 observed row explanations; 0 require judgment. Full evidence retained.
Corpus adjudicated: 55 differences traced to R1.7 behavior/registration; sole expected runaway timeout; no other crash/timeout.
Evidence: continue6-checks.json; sweep: continue6-sweep.json/.md; six clean-apply clones and verified extracted bundle: continue6-checkpoint-proof.json. Full train pending; not launched in continuation 6. Source fingerprint: ba0bd12bbd1a933ddf8540411388e5b4f1a78211cd78014d64f12a45923a859f

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
Python repr actual C oracle42579/42579 patterns;54 pinned cases1038checks green; independent critic4202/4202 extra boundary cases. D2:7 frozen probes,6 amendments,16floatpayloads; live base/tip kind witnesses and11negative checker controls green. All238 doc examples green;34 observed output blocks and legacy MAP/suite text pins move with N6. Fixed-decimal format.fmt_num preserves3.14. Shared-writer census beforeedit; shape closure reviewed and planted; freestanding exact writer oracle green. Cost explicit --n6-text comparator has6positive/15negativecontrols; corpus remains exact. First full release inventory red is retained; final full train follows all runtime groups.

Reviewed amendment (continuation 2, #1758): preserve the changelog entry on one line, prefix it with "- ", and retain its final newline. D2 is a one-time frozen-text proof; list the checker as local-only and remove its existing recurring phase2 dispatch. The frozen bar continues to SHA-pin the accepted amendments; future amendments need a new ruling.
Requested checks in the checkpoint bank (all rc=0):
PASS: test-enrolment: examined=129 enrolled=128 exempt=1; tools examined=77 enrolled=56 exempt=21
changelog: examined 99 changed path(s) against b6f9db3; 1 fragment(s) added; cut=0
checks=7
Only these three checks ran; the orchestrator owns train.py.
Source fingerprint: 32340700adaf48890a9884b2e61acee2336b7be2677ab6f5e6f9bcfdbcfb5e55

Continuation 3 calibration repair (#1758, N6): float ADD 1.5+2.5 prints 4.0; change only cal.fnstop-cat-plant.out from 4 to 4.0. The stale output failed all four tiers before the unchanged fn-stop ADD witness could run. Real row check before: vacuous=0, named=false, branch_pass=0/4; after: vacuous=1 in each tier, named=true, branch_pass=4/4. Native RETURN remains the deliberate wrong witness; the calibration still requires (1, True). No check or witness weakened.
Requested public selftest rows in /tmp/es-r17-checkpoints, actual rc=0:
make-lock selftest: 8/8 passed
calibration: cases=54 as-expected=54 unexpected=0
All six clean-apply/tree/manifest checkpoint proofs and refreshed bundle extraction recorded in continue3-checkpoint-proof.json. The post-check amendment changes commit metadata only; tested trees are identical.
Source fingerprint: 596b197d7775d094297d85265323f5ee14b8c8df73d76287843f612fa3c97152

Continuation 4, R1.7-D5 (#1758): json_build/json_encode close in R1.7; their and str changes_vs_pre derive yes (exactly five builtins.tsv cells). R1.7 closures reuse D2 source-bound kinds and check_pair on every pre/branch line; earlier A2 closures still require pre==branch. Declare R1.7 landed and check its closures against branch independently of their R1.6 group. No probe or expectation changed.
Mandatory STOP: only the first tools/phase2_builtins.sh invocation ran, with release primary, matched extension binaries and PostgreSQL. The metadata/closure phase examined=310 section6=310 inventory=310 rowmeta=310 cases=312; guarded=217 yes=199 closed_in=18 pending_profile=0 vacuous=0; closure-r17 cases=2 floats=4; ran=312 requested=312 empty_or_hookless=62 hook_runs=14 pending_profile=0. Actual live gate rc=2 with 62 additional .branch output differences (empty_or_hookless=62), including acos 0 -> 0.0, add buffer 2 -> 2.0 and num integral floats. These are outside D5. No other frozen expectation was amended. Remaining three primary profiles and both planned public-entry plants were NOT RUN because the ruling says any other flag is a STOP. No precheck, suite, broad gate or final train launched. Receipts: continue4-checks.json. Six fresh clean-apply checkpoint trees and refreshed bundle extraction: continue4-checkpoint-proof.json. This commit is a checkpoint-only candidate, not green acceptance. Final acceptance remains pending.
Source fingerprint: 78f076b25442a0577801ec1859f62dd6fb58c1cda2820c23f34203978ca4bb9d

Continuation 5, R1.7-D6 (#1758), supersedes the historical D5 STOP above. Derive the union from the public gate's own four-profile transcripts: each profile examined 312 cases and found the same 62 new differences; cumulative D2/D6 population=68. Remove NAMES; prove every line, same double bits, integer spelling, all non-number bytes. 205 float tokens; source-bound kinds run on pre-N6 and all four tips; numeric-looking input strings have source-bound str witnesses and stay byte-identical. Frozen programs unchanged. All 68 cumulative amendments are SHA-pinned under D6, historical numeric rulings retained. Metadata: 33 derived changes_vs_pre cells; no additional already-closed rows among the new 62, so the two D5 R1.7 closures remain. D5 A2 scope retained. Public gate now checks every amended row with the shared D2 comparator, including unclosed rows. Flush parent stdout before launching the probe child so expanded SHA records cannot splice the runner summary; final profile logs each have one complete anchored ran= line.
Actual public gate results: four profiles rc=0; each examined=310 section6=310 inventory=310 rowmeta=310 cases=312; guard guarded=217 yes=199 closed_in=18 pending_profile=0 vacuous=0; closure-r17 cases=2 floats=4; ran=312 requested=312 empty_or_hookless=0 hook_runs=14 pending_profile=0; phase2-builtins PASS rows=310 migrated=310 unchanged=0. Three isolated public-entry plants each actual rc=1 and only the named failure: json_build.pre a->z rejected as non-float text; abs.pre integer->float (derived flag synced) rejected by A2; acos.branch 0.0->1.0 (accepted SHA synced) rejected as changed double bits. Checker calibration positive=1 rejected=11 PASS. Receipts: continue5-population.json, continue5-amendment-proof.json, continue5-checks.json. Six fresh clean-apply trees and verified/extracted bundle: continue5-checkpoint-proof.json. This is checkpoint acceptance for D6; the complete final train remains pending and was NOT RUN.
Source fingerprint: cdb82bb25958a59b981dd5c5d20d2f09bb2a6a7b68b6f356fef515b1f3408beb

Continuation 6, R1.7-D7 (#1758, N6): explicitly attribute two retained corpus process-exit changes to this group's own expectation migration (historical abd76f98). test_boxed_int_containers.eigs: base Error line 13 ASSERT FAIL: sort exact order, module line 102; moved float spellings 140737488355328.0 and 9007199254740992.0. test_json_hard.eigs: base Error line 417 ASSERT FAIL: JH97 json_build renders huge values compactly; moved expectation {"v": 1230000000000000.0}. Each retained base arm exits 1, each tip arm exits 0. corpus-attribution-reviewed.json records the D7 authority, exact assertions, baseline diagnostics, original expectation diff and evidence hashes; the existing reviewed-attribution hook produces corpus-attribution-extra.json. General automatic refusal of process-exit changes is untouched.
D7 narrow checkpoint proofs (all requested commands rc=0):
tier=off examined=111 rows tag_fail=111 branch_pass=111 vacuous=0 tag_timeout=0 tag_signal=0
tier=default examined=111 rows tag_fail=111 branch_pass=111 vacuous=0 tag_timeout=0 tag_signal=0
tier=osr examined=111 rows tag_fail=111 branch_pass=111 vacuous=0 tag_timeout=0 tag_signal=0
tier=trace examined=105 rows tag_fail=105 branch_pass=105 vacuous=0 tag_timeout=0 tag_signal=0
controls=18 both_pass=18 witnessed=31 mapped=113 gates=8 through=R1.7
controls_witnessed=13 controls_vacuous=0
invariants=2 branch_pass=2
phase2-check: PASS
RESULTS: 2/2 passed, 0 failed, 0 skipped
Corpus attribution: 55 observed row explanations; 0 require judgment. Full evidence retained.
Corpus adjudicated: 55 differences traced to R1.7 behavior/registration; sole expected runaway timeout; no other crash/timeout.
Evidence: continue6-checks.json; sweep: continue6-sweep.json/.md; six clean-apply clones and verified extracted bundle: continue6-checkpoint-proof.json. Full train pending; not launched in continuation 6. Source fingerprint: ba0bd12bbd1a933ddf8540411388e5b4f1a78211cd78014d64f12a45923a859f

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
N14/#1762 routes all finite record scalar/slot/buffer and DB float parameters through N6; exact int64 digits through eigs_int_text. N14 MAP8/8 tier checks green; DB14 passed,0 failed(14 declared); release/DB builds0 warnings. N13 nonfinite policies unchanged.

Continuation 6, R1.7-D7 (#1758, N6/N14): [0fc] pins the db harness's own 14 passed, 0 failed (14 declared), accounting for this group's seven added numeric rows. The slot-layer store encoder matrix expects f64 -0.0 -> s:-0.0, replacing old s:0. Derived C-source/population/matrix sweep found no additional stale pins; existing num_text, const_dedup_bits, native_fn, sandbox-key and slot tape/operator expectations already agree.
D7 narrow checkpoint proofs (all requested commands rc=0):
tier=off examined=111 rows tag_fail=111 branch_pass=111 vacuous=0 tag_timeout=0 tag_signal=0
tier=default examined=111 rows tag_fail=111 branch_pass=111 vacuous=0 tag_timeout=0 tag_signal=0
tier=osr examined=111 rows tag_fail=111 branch_pass=111 vacuous=0 tag_timeout=0 tag_signal=0
tier=trace examined=105 rows tag_fail=105 branch_pass=105 vacuous=0 tag_timeout=0 tag_signal=0
controls=18 both_pass=18 witnessed=31 mapped=113 gates=8 through=R1.7
controls_witnessed=13 controls_vacuous=0
invariants=2 branch_pass=2
phase2-check: PASS
RESULTS: 2/2 passed, 0 failed, 0 skipped
Corpus attribution: 55 observed row explanations; 0 require judgment. Full evidence retained.
Corpus adjudicated: 55 differences traced to R1.7 behavior/registration; sole expected runaway timeout; no other crash/timeout.
Evidence: continue6-checks.json; sweep: continue6-sweep.json/.md; six clean-apply clones and verified extracted bundle: continue6-checkpoint-proof.json. Full train pending; not launched in continuation 6. Source fingerprint: ba0bd12bbd1a933ddf8540411388e5b4f1a78211cd78014d64f12a45923a859f

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
T1 keeps the existing tape version and kind markers; shortest shared text for scalar,buffer and observer config records. T1 twice-float3/3 tiers green; each records twice and strictly replays identical output. Release0 warnings.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
R1.7-D4 preserves signed-zero constant keys in hash and equality. Direct probe8/8 checks green;13 R1.7 programs51/51 tier observations green. Dedup-by-value plant belongs to final plant train. Release0 warnings.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
Record D2 seven-probe/six-amendment boundary, D3 measured two invariants and11change rows, D4 direct constant-pool witness; all51 final MAP tier observations green. N6 shortest writer and N14/T1 sites covered by actual C/ASan/freestanding/fulltrain gates. Corpus retains full raw/comparer evidence without changing counts or normalizing differences;12 ownership/capture helpercontrols green. Cost comparison remains byte-strict by default; N6 opt-in calibrated6positive/15negativecontrols. Consumer candidate-call census16repos recorded. Final acceptance counts appended after complete train.

Continuation 3 gate maintenance: apply main PR #1970's exact comment and unset EIGS_TREE_LOCK_HELD after ROOT in tools/make_lock_check.sh. Entire script blob matches #1970: c0afa51. Train #2 under make inherited the recursive-lock bypass and failed case 1, 0/8 cases passed. The selftest now clears it; case 3 still sets it explicitly.
Requested public selftest rows in /tmp/es-r17-checkpoints, actual rc=0:
make-lock selftest: 8/8 passed
calibration: cases=54 as-expected=54 unexpected=0
All six clean-apply/tree/manifest checkpoint proofs and refreshed bundle extraction recorded in continue3-checkpoint-proof.json. The post-check amendment changes commit metadata only; tested trees are identical.
Source fingerprint: 596b197d7775d094297d85265323f5ee14b8c8df73d76287843f612fa3c97152

Final acceptance counts:
phase2-check: tier=off examined=111 rows tag_fail=111 branch_pass=111 vacuous=0 tag_timeout=0 tag_signal=0; tier=default examined=111 rows tag_fail=111 branch_pass=111 vacuous=0 tag_timeout=0 tag_signal=0; tier=osr examined=111 rows tag_fail=111 branch_pass=111 vacuous=0 tag_timeout=0 tag_signal=0; tier=trace examined=105 rows tag_fail=105 branch_pass=105 vacuous=0 tag_timeout=0 tag_signal=0; phase2-check: PASS
phase2-ci: phase2-check: PASS; phase2-lib-diff: range=[-3, 110] modules=78 importable=66 functions=889 via_reexport=95 no_params=24 calls=281423 examined=281423 unexamined=0 both_ok=124575 both_raise=156668 improved=0; phase2-lib-diff: N4 source_functions=28 exported_functions=19 calls=4631 both_ok=2500 changed_functions=11; phase2-lib-diff: listed_functions=13 undeclared=0 stale=0 PASS; phase2-ci: PASS (through=R1.7)
full-release-make-test: RESULTS: 4606/4606 passed, 0 failed, 10 skipped
extensions-suite: RESULTS: 4850/4850 passed, 0 failed, 5 skipped
lib-diff: phase2-lib-diff: range=[-3, 110] modules=78 importable=66 functions=889 via_reexport=95 no_params=24 calls=281423 examined=281423 unexamined=0 both_ok=124575 both_raise=156668 improved=0; phase2-lib-diff: N4 source_functions=28 exported_functions=19 calls=4631 both_ok=2500 changed_functions=11; phase2-lib-diff: listed_functions=13 undeclared=0 stale=0 PASS
corpus-adjudication: Corpus adjudicated: 54 differences traced to R1.7 behavior/registration; sole expected runaway timeout; no other crash/timeout.
replay-diff: replay_diff: OK (267 programs record+replay; 27 at the documented boundary; 0 nondeterministic; 1 ledgered)
jit-diff: jit_diff: OBS examined=783 denied=13; jit_diff: OK (267 programs x {jit, osr} vs the interpreter; suite-env completed=16; OBS examined=783 denied=13; 32 arms adjudicated; 2 ledgered)
cost-measure: phase2-cost: source=codspeed.yml workloads=15 tiers=2 undeclared_max=+0.3% declarations=30 stale_below_max=0.5 logs=/tmp/phase2-cost-rul4mqfr; phase2-cost: output_compare=n6-text (exact values/bits, exact integer digits, Python repr); phase2-cost: n6-text workload=tests/bench_idxset.eigs tier=jit changed_tokens=1; phase2-cost: n6-text workload=tests/bench_idxset.eigs tier=off changed_tokens=1; phase2-cost: workloads=15 rows=30 over_declared_max=0 stale_declarations=0 PASS

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01KC99CmwatKssQYggkBCgwF
@InauguralPhysicist

Copy link
Copy Markdown
Collaborator Author

R1.7 pushed: phase2-numbers b6f9db3..20f9d86 (6 commits: N6 shortest float text, N14's writers, T1 trace text, the binary64 constant dedup, and the pre-registration).

The full lane failed (run 40271709027, 18/26). It found five CI-only failures; the local train does not run these lanes:

  1. the observer cross-repo corpus: 7 goldens diverge, expected to be N6 text, to be proven per line;
  2. the TSan gate replay-workers pin;
  3. macOS sort exact order: an unstable platform qsort at int/float ties that N6 made visible. Ruled: sort and sort_by are stable on every platform;
  4. a -Wformat-truncation buffer in eigs_num_text at -O1;
  5. the observer oracle harness reading 11.0 as text.

A fix-forward round is running (Sol). Sync #9, the merge of main dffac84, is prepared and waits for this lane to go green.

N6 float-kind text only: D2/D6 check_pair proved 19 changed lines / 21 float tokens across seven programs; binary64 bits, runtime kinds before/after and every other byte match. Source-bound probes preserve the original program output. Observer corpus red: 7 match, 7 diverge (rc=1); green: 14 match, 0 diverge (rc=0). Evidence: r1-7-ff/corpus-proof.json.
N6: both workers sum 3000 taped random=0.5 draws, so their exact 1500 results are floats and print 1500.0. Preserve the exact two-worker byte check and all race/rc checks. Actual local gate red rc=1 at the replay row, green rc=0; built with make tsan and every invocation uses setarch -R. See r1-7-ff/tsan-before-a1.log and tsan-after-a1.log for counts.

Actual TSan gate counts: before 61 passed / 1 failed (rc=1); after 62 passed / 0 failed (rc=0).

Literal-match correction: use grep -F so the N6 decimal points are literal bytes. The previous regex accepts a=1500x0 b=1500y0 (rc=0); corrected command accepts the exact output and rejects wildcard, wrong-value and old-kind controls (positive=1 / rejected=3). Actual make tsan + full setarch -R gate on final source: 62 passed / 0 failed, rc=0.
N6: uint64 significand (20 digits), e, signed int32 exponent (11 bytes), NUL require up to 33 bytes by the format types; use 40. The reported CI warning is at -O1; this machine GCC 13.3 runs the unmodified CI script at rc=0 (7/0), so local baseline warning reproduction is unavailable. cc alone in a fresh directory at -O0, -O1 and -O2 now yields zero warnings, 8 passed / 0 failed (rc=0). The script now checks all three levels with -Wall -Wextra; runtime number text is unchanged.

Continuation 1 precheck fix: Prefix this commit's one-line changelog fragment with "- " so the fragment parser recognizes it.
Reproduced the original docs-claims and changelog checks at rc=1. On the corrected final source, PRECHECK_BASE=20f9d86c21276ddc8d1a1ebf027f8756360afd68 make precheck: 19 passed / 0 failed / 0 skipped, rc=0; docs-claims: OK — PATHS 285, FLAGS 47, MAKE TARGETS 52, NAMES 527, DOC ENROLMENT 12, rc=0; changelog: examined 24 changed path(s) against 20f9d86; 2 fragment(s) added; cut=0, rc=0. Actual logs and source-bound receipts: continuation1-precheck, continuation1-docs-after, continuation1-changelog-after in r1-7-ff/.
Orchestrator sort ruling / principle Determinism is a guarantee with a stated boundary: sort and sort_by are stable. Replace list_sort libc qsort with a stable bottom-up merge, borrowing scratch slots without reference changes. sort_by already has an original-index tie-break; retain it. Document both contracts in BUILTINS, SPEC, COMPARISON, README and llms. New 257-element tests check mixed boxed-int/float ties, signed zero, strings, sort_by record identities, input mutation and key-call count. Actual regression suite: 10 passed / 0 failed; boxed containers: 10 checks. Forced quicksort without the stable merge fails sort and the original boxed order; removing sort_by tiebreak fails its record-order checks; restoring the real merge and tiebreak passes under that same forced quicksort. Freestanding runtime linked with actual mini-libc qsort passes, with equal qsort/eigs_qsort symbol addresses; mini-libc differential green. Counts and rc in r1-7-ff receipts.

Refresh the generated LSP builtin description from the stable-sort comment (bash tools/gen_lsp_builtin_index.sh rc=0, regeneration is idempotent). This is the only generated-header delta; inventory counts remain unchanged.

Continuation 1 precheck fix: Begin the SPEC sort sentence with "`sort` sorts" so the preceding output ending in 15 is not parsed as a builtin count; preserve both stable-order guarantees. The suggested "The builtin" still fails because the detector permits two intervening words after the number. Prefix this commit's one-line changelog fragment with "- ".
Reproduced the original docs-claims and changelog checks at rc=1. On the corrected final source, PRECHECK_BASE=20f9d86c21276ddc8d1a1ebf027f8756360afd68 make precheck: 19 passed / 0 failed / 0 skipped, rc=0; docs-claims: OK — PATHS 285, FLAGS 47, MAKE TARGETS 52, NAMES 527, DOC ENROLMENT 12, rc=0; changelog: examined 24 changed path(s) against 20f9d86; 2 fragment(s) added; cut=0, rc=0. Actual logs and source-bound receipts: continuation1-precheck, continuation1-docs-after, continuation1-changelog-after in r1-7-ff/.
N6: when returns an integral float and prints 11.0. Parse printed indices/counts using exact Decimal value, requiring finite integral values; no float rounding, truncation or tolerance. All runtime values retain check_value binary64/NaN/signed-zero checks; labels, tier witnesses and floor are unchanged. Actual parser calibration: complete positive transcript accepted; 6 wrong/fractional/nonfinite/malformed count plants rejected; exact int64 and value/sign controls green. Actual CI lane before rc=1 (issue1891_row63), after rc=0 (all floor verdicts checked, 0 lost).

Actual oracle lane: floor 1872 verdicts checked / 0 lost, rc=0. Count calibration: 1 complete positive transcript, 6 rejected counter plants, 5 exact representation controls and 3 value/sign controls, rc=0.
@InauguralPhysicist

Copy link
Copy Markdown
Collaborator Author

R1.7 COMPLETE: phase2-numbers @ f406359. The full lane is GREEN 26/26 (run 40298764953), and so is the phase2 workflow (run 40298747712).

The fix-forward (5 commits on top of 20f9d86) closed the five CI-only failures of the first lane:

  • the observer cross-repo corpus goldens moved to N6 text, proven per line (19 lines, 21 floats; bit-identical doubles, same kinds);
  • the TSan replay-workers pin now matches literally;
  • sort/sort_by are STABLE on every platform (merge sort with an index tie-break, libc-independent, freestanding eigs_qsort included). macOS's unstable qsort had exposed this at int/float ties. Main has the same instability, tracked in sort/sort_by order equal elements by the platform qsort: unstable on macOS, stable on glibc (fixed on phase2 f7191b7e) #1982;
  • eigs_num_text's scratch buffer is sized for the format (-Wformat-truncation at -O1 with plain cc);
  • the observer oracle harness compares printed counts by value: 1,872 floor verdicts, 0 lost.

The local final train was green: precheck, make test, the full ASan suite (4599/4599, leaks on), phase2_check through R1.7, phase2_ci, jit/replay, and freestanding.

Next: sync #9 (main dffac84, 9 commits including #1962's re-pin of every row, #1969's FP-environment boundary, #1903-#1905's binder analysis, #1908's E006 and #1907's fragment gate), then R1.8.

This branch has not been deployed

No deployments
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Decision: an exact int64 value kind and IEEE-faithful doubles (#1644 phase 2), with the observer signal (#1667) in the same tape bump

3 participants