Dated: 2026-08-20. Implements STAGE2-CORPUS-DESIGN-2026-08-20.md (the Captain-approved Stage-2 design) on the frozen E2 script families, validates it through the design's wave gate, and runs the registered slope test against the new corpus with the filed machinery. No git commit made; the frozen E2 corpus (S1–S7 nights, wave-1 manifest, e2-field results, slope-regression results) is untouched and byte-verified. The only doc change is the dated registration addendum appended to research/topic.md (zeroclaw-dissertation repo; annotate-only).
| File | Change |
|---|---|
scripts/e2_personas.py |
NEW_NAMES extended with new-1..new-6; the filed eight are drawn from the committed 20260819 stream (bit-identical, asserted), the six wave-2 draws from a fresh documented stream, seed 20260820 (wave date), same procedure |
data/e2/e2-personas.json |
Regenerated: 14 new_personas; the filed 8 entries bit-identical (asserted by diff); w2_seed recorded; archetypes: new-1=drifter, new-2=essayist, new-3=writer, new-4=engineer, new-5=engineer, new-6=writer |
scripts/e2_nights.py |
scripts() now returns the 9 T-tags (T1=S1, T2=S2, T3=A, T4a=S4a, T4b=S4b, T5=D, T5c=D-cold, T8=S3, T9=S5 — one log per ladder family); ATTENDANCE = the design §2 matrix (session-open rosters); staged drifter on T4a/T4b/T5/T5c (cold entry at first drifter speak, DRIFTER_LINES text preserved); generate() refuses overwrite (append-only), rebuilds the full manifest from disk, determinism-checked (all 9 byte-identical on re-run) |
data/nights/night-T1..T9.jsonl |
The 9 wave-2 logs (generated, ~5.5 s; deterministic) |
data/e2/e2-nights-manifest-w2.json |
New wave-2 manifest (the filed wave-1 manifest is untouched — design names no manifest file, append-only doctrine) |
scripts/e2_instrument.py |
Adds W2_NIGHTS (T-tags → filenames + strata mirroring the mapped families), W2_NIGHT_LIST, FIELD_NIGHTS_W2 (the §2 matrix), COLD_ENTRY_W2 (drifter: T4a, T4b); Night falls back to W2_NIGHTS. PRIMARY_NIGHTS/FIELD_NIGHTS untouched |
scripts/stage2_wave_gate.py |
New — the design §5.5 generation-time wave gate + the §3.1 precondition assertions (see §3) |
scripts/slope_regression_w2.py |
New — wave-2 runner importing the unmodified scripts/slope_regression.py machinery (design §5.4's wiring change, implemented as an external runner so the filed script stays byte-identical); adds the §6-FM4 class-residual tripwire to the verdict |
scripts/slope_regression.py |
UNMODIFIED (byte-identical; the working-tree state the Captain left it in) |
research/topic.md (dissertation repo) |
Dated addendum appended verbatim from design §3 (see §5) |
PRIMARY (wave-2): slope = −0.3588, bootstrap 95% CI [−0.9354, +0.2817]; intercept 1.0690 [0.6773, 1.4110]; permutation null two-sided p = 0.2682. CI contains 0, excludes 1. All 21 readers pass the registered inclusion rule (n_nights ≥ 3 — the design's whole point; the wave-1 run had 7 of 15).
Per-reader points land exactly where the design's a priori x-table predicts (cold ≈0.465–0.507, mid ≈0.630–0.643, warm ≈0.697–0.718; 15 distinct x). y = baseline warmth-cos 0.515–0.999.
Sensitivities (labeled; the registered primary stands):
- (a) actual-presence instrument: −0.2366 [−0.8071, +0.3645]
- (b) class-residual y, E5-clean, 21 readers: −0.1261 [−0.2408, −0.0376]
- (c) raw z-projection (units variant): −0.2198 [−1.2073, +0.7747]
- (d) session-close room warmth: −0.2934 [−0.7270, +0.1254]
No variant contains 1 anywhere; all six readings sit at or near 0 (range −0.36…+0.03), small-negative.
Verdict: INDETERMINATE — leaning alignment; no collapse signal anywhere. The primary alone satisfies the registered alignment branch (CI contains 0, excludes 1, §3.1 preconditions hold), but the design's class-residual tripwire (§6 failure mode 4) fires: primary CI contains 0 while the class-residual CI [−0.2408, −0.0376] excludes 0 (upper bound −0.038, a knife-edge) — a CI-disposition divergence → per design, report both and make no alignment declaration on the primary. Both slopes are small-negative and exclude 1; the tripwire firing does not signal the imbalance pathology it guards against (the bands are balanced, no archetype majority; the residual slope is nearer zero than the primary, not spurious). Epistemic posture mirrors the wave-1 run: leaning alignment, not declared alignment — now with a 21-reader, Sxx = 0.197 corpus whose x-side is decisive (design power 0.95/0.80 at σ 0.117/0.15; SE = 0.264/0.338).
Guard re-file (attendance-dependent, new numbers per design §1/§5.5): wave-2 drift = 0.8084, E-cont spread = 0.4960 (wave-1 filed 0.7483/0.4556 — new rosters, new measurements, same mechanism). ICC re-measured before the slope was read: 0.9076, bootstrap CI [0.7832, 0.9112] — above the filed 0.7714 CI [0.667, 0.810], so failure mode 6 (baseline instability) does not fire; baselines are stable reader constants under the new rosters.
python3 scripts/stage2_wave_gate.py → data/slope/stage2-wave-gate.json, ALL CHECKS PASS:
- Logged rosters == designed ATTENDANCE — 9/9 T-nights (session-open rosters match the §2 matrix exactly).
- corpus_sd reproduces 0.2367 (roster-invariant room side; engine-drift guard).
- Per-night warmth reproduces the filed ladder to 4 decimals — T1 +0.6551, T2 +0.3187, T3 +0.6551, T4a +0.4465, T4b +0.6319, T5 +0.6293, T5c +0.6293, T8 +0.7409, T9 +0.7589 — all exact.
- Band means within ±0.02 of targets — cold 0.4792 (0.48), mid 0.6384 (0.64), warm 0.7094 (0.71).
- All 21 readers ≥ 3 logged nights (attrition guard; mid band's 4-night buffer intact).
Task preconditions (design §3.1, void-by-rule), all PASS:
- 21/21 unique visited-room sets — PASS (21 unique)
- ≥ 3 distinct x — PASS (15 distinct; design claimed 15)
- Sxx ≥ 0.19 — PASS (0.1971; design filed 0.1971, exact)
- x-range ≥ 0.15 — PASS (0.2535; design filed 0.2535, exact)
- no archetype majority per band — PASS (cold max 2/7, mid max 3/7, warm max 2/7)
Guard reproduction (engine undrifted): ran the filed scripts/slope_regression.py unmodified against the wave-1 corpus — its internal asserts reproduced corpus_sd 0.2367, E-cont spread 0.4556, drift 0.7483 exactly, and the results JSON was byte-identical before/after (sha256 374bcee9…), proving both the engine and the wave-1 artifacts are untouched.
- T3 mapping (§5.1 text says "T3 = S3"). The design's own verified numbers force T3 ∈ {A, S1} (warmth +0.6551): tinker's a priori x = 0.4734 requires (0.3187+0.4465+T3)/3 = 0.4734 → T3 = 0.6551; T8 = S3 (+0.7409) is confirmed by essayist/captain/fiddler rows. With T3 = A (the A↔S1 warmth-identical pair, sanctioned by the design), every registered aggregate reproduces exactly (Sxx 0.1971, x-range 0.2535, 15 distinct x, band means). T3 and T1 are logs of the same canonical composition (SEG1+SEG2) under different tags/rosters.
- Three cosmetic typos in the design's x table (new-2 filed 0.5060 vs computed 0.5066; singer filed 0.6399 vs 0.6422; new-4 filed 0.6399 vs 0.6379). All registered aggregates (Sxx, range, band means, 15 distinct) reproduce exactly from correct arithmetic; the tabled cells are unused in any guard.
- Staged drifter on T5/T5c. The D/D-cold families contain DRIFTER_LINES by construction (night_d_script), and the ladder lists D/D-cold as +0.6293 — the lines are part of the family warmth (design's own T4a note). The drifter is not in the T5/T5c measurement matrix, so he is staged (cold entry @24) exactly as on S4a/S4b: text preserved, session-open rosters match the matrix, and
FIELD_NIGHTS_W2keeps drifter = {T4a, T4b, T2} per design (his staged T5/T5c readings are warmth content, not attendance). - Persona draw seed. Seed-continuation (20260819 stream) drew new-3 = critic, giving the mid band critic 4/7 — a violation of the design's no-majority precondition (void-by-rule). The six wave-2 draws therefore use a fresh, documented seed 20260820 (the wave date; same procedure;
w2_seedrecorded in the JSON): new-1=drifter, new-2=essayist, new-3=writer, new-4=engineer, new-5=engineer, new-6=writer — 2/2/2 across bands, no majority. The filed eight remain bit-identical. - slope_regression.py wiring. Design §5.4 names a
--wavearg or wave-2 entry constant; the task rule keeps the filed script unmodified. The wiring is implemented as an external runner (slope_regression_w2.py) that imports the filed module unchanged — both constraints satisfied. - Roster transcription errors caught during implementation (my first ATTENDANCE draft had critic on T1, missed blacksmith on T4b, and had engineer instead of new-4 on T5). All corrected to the design matrix; the gate asserts logged == designed, and it passes — the filed corpus reflects the design exactly.
- Manifest file. The design names no manifest file for wave-2; a new
e2-nights-manifest-w2.jsonis used so the filed wave-1 manifest stays byte-identical (append-only doctrine). - Class-residual tripwire in the verdict machinery (design §6 FM4, not §3): implemented as the design states — on divergence in sign or CI disposition, both slopes are reported and no alignment declaration is made on the primary. It fired (see §2); the verdict is INDETERMINATE, leaning alignment.
### ADDENDUM 2026-08-20 (Stage-2 corpus wave — resolves the run's committee-open items; nothing above is altered)
- Corpus-design requirement (replaces the de-facto attendance degeneracy). Before analysis, the included set (n_nights ≥ 3) must satisfy: (i) no two readers share the same visited-room set; (ii) ≥ 3 distinct x values and Sxx ≥ 0.19; (iii) readers stratified into three x-bands (targets ≈ 0.48/0.64/0.71) with no archetype majority in any band. If (i)–(iii) fail, the run is VOID — INDETERMINATE BY RULE, and no branch reading is taken.
- Committee-open §1 (scalarization) — registered: PRIMARY = direction cosine of the z-standardized reliable-subspace baseline against the subspace-restricted, renormalized
vmf.WARM(the run's choice; unit commensurability withwarmth_vmfis what gives "slope ≈ 1" its meaning). Raw z-projection remains a labeled sensitivity.- Committee-open §2 (room-warmth aggregation) — registered: PRIMARY = unweighted per-night mean of logged per-speak
warmth_vmf. Exposure-weighting is rejected: night lengths are schedule-determined, and the registered object is the warmth of the rooms visited, not per-speak exposure.session_closefinal-window fit remains a labeled sensitivity.- Committee-open §3 (x-side degeneracy) — resolved by design: inclusion rule unchanged (n_nights ≥ 3); the registration-relaxed all-readers variant remains a labeled sensitivity only. The corpus, not the rule, guarantees x-variance.
- Committee-open §6 (branch thresholds) — registered: ≈0 = bootstrap CI contains 0; ≈1 = CI contains 1. Alignment declared iff CI contains 0 AND excludes 1 AND §1 preconditions hold; collapse iff CI contains 1 AND excludes 0 AND preconditions hold; else INDETERMINATE.
- Power target (filed): n = 21 readers (7 per band), design Sxx = 0.197, x-range = 0.254; inference unchanged (bootstrap over readers, B = 2000; permutation null, 10,000).
- Adjudication of the class-residual tripwire firing (knife-edge: residual CI upper −0.038): whether the primary's alignment-lean becomes a declared alignment under the addendum's branch rules, or stays INDETERMINATE-leaning-alignment. Committee decision; the design's letter says no declaration, which this run honors.
- The design's own regeneration checks (
e2_nights.py --verifydeterminism re-run) are green; a finalgit diffreview ofe2_personas.py/e2_nights.py/e2_instrument.pybefore commit. - The dissertation-side addendum in
research/topic.mdis uncommitted (annotate-only, no commit per rules). - Nothing in the frozen E2 corpus or the filed reports was modified; the wave-1 slope run remains the filed INDETERMINATE run under the original registration.
cd /home/eileen/projects/elephant
python3 scripts/e2_nights.py --verify # determinism (all 9 T-nights)
python3 scripts/stage2_wave_gate.py # wave gate + preconditions (<1 min)
python3 scripts/slope_regression_w2.py # wave-2 slope + verdict (<1 min)
python3 scripts/slope_regression.py # filed wave-1 run, guards re-asserted