Multi-session work bundle on a draft branch. Splits into a clean
sequence of commits later; pushed here so it isn't lost on a reboot.
Reach work
- code/scripts/reach/reach_scram_pj.jl: shutdown_margin halfspace
X_exit (replaces "n <= 1e-4 AND T_f bound" framing); per-step
envelope extraction added.
- code/scripts/reach/reach_scram_pj_fat.jl: per-step envelope
extraction added; shutdown_margin discharge logic mirrored from the
tight scram script. 3 probes (10/30/60s) all discharge from the
fat union polytope.
- code/scripts/reach/reach_scram_full_fat.jl (NEW): full nonlinear
PKE scram reach with fat entry. Hits the stiffness wall at
~1.5 s plant time as expected; saves NaN-tolerant per-step
envelopes. Demonstrates concretely why PJ is the right tool for
the longer-horizon proof.
- code/scripts/reach/reach_heatup_pj.jl: T_REF_START_C constant
(entry-conditioned ramp) replaces T_STANDBY-init that was making
the FL controller command cooling at t=0. Per-step extraction
already in place.
- code/configs/heatup/tight.toml: bumped maxsteps; probe horizon
parameterized.
Hot-standby SOS barrier
- code/scripts/barrier/barrier_sos_2d_shutdown.jl (NEW): mirrors the
operation SOS machinery on the hot-standby thermal projection.
Includes the eps-slack pattern (so feasibility doesn't silently
collapse to B == 0).
- code/scripts/barrier/barrier_sos_2d.jl: refactored to use the same
helper.
- code/src/sos_barrier.jl (NEW): solve_sos_barrier_2d helper module
factoring out the SOS construction; eps-slack with eps_cap=1.0 to
avoid unbounded primal.
Library
- code/src/pke_states.jl (NEW): single source of truth for canonical
initial-condition vectors per DRC mode (op, shutdown, heatup) keyed
off plant + predicates.
- code/scripts/sim/{main_mode_sweep,validate_pj}.jl, code/CLAUDE.md:
migrated to pke_states.
Predicates + invariants
- reachability/predicates.json: new shutdown_margin predicate (1%
dk/k tech-spec floor, expressed as alpha_f*T_f + alpha_c*T_c
halfspace). Used as scram X_exit.
Plot script
- code/scripts/plot/plot_reach_tubes.jl: plot_tubes_scram_pj() with
variant=:fat|:tight knob; plot_tubes_scram_full() for full-PKE
3-panel (T_c, T_f, rho); plot_tubes_heatup_pj() reads results/
not reachability/.
Journal + memory
- journal/entries/2026-04-27-shutdown-sos-and-scram-X_exit.tex (NEW):
long-form entry on the SOS hot-standby barrier and the scram X_exit
refactor.
- journal/journal.tex: input chain updated.
- claude_memory/ — three new session notes:
* 2026-04-27-scram-X_exit-shutdown-margin.md
* 2026-04-28-DICE-2026-conference-intel.md (people, sessions,
strategic notes for the May 12 talk)
* 2026-04-28-path1-sos-pj-sketch.md (sketch of nonlinear-SOS via
polynomial multiply-through; saved for an overnight session)
Docs
- docs/model_cheatsheet.md (NEW): one-page reference of state vector,
dynamics, constants, modes, predicates, sanity numbers — the talk
prep cheatsheet Dane asked for.
- docs/figures/reach_*_tubes.png: regenerated with the new mat data.
- presentations/prelim-presentation/outline.md: revised arc per the
April-28 review pass (cuts: Lyapunov-fails standalone slide,
operation-tube standalone slide, SOS standalone; adds: scopes-of-
control framing, scram on the headline result slide).
- app/predicate_explorer.jl: minor.
Hacker-Split: end-of-session scratch bundle
Morning-review point 3 result: tight-entry heatup PJ reach with
Q_sg in [0, 5% P0] as a bounded parameter (augmented state x[10]).
T=60s: 7042 sets in 394s — T_c in [270.97, 291.0] — low-trip × loose
T=300s: 100k sets budget exhausted in 5400s —
T_c in [219.4, 316.3] — low-trip × loose
Compared to the no-disturbance tight-entry run (all 6 halfspaces at
300s, T_c in [281.05, 291.0]), the bounded steam-dump disturbance
costs the low-T_avg-trip discharge even at 60s. Physically correct
— steam dump pulls heat through secondary, cascades into cold-leg
and T_avg. The reach tube accurately captures this coupling.
Thesis-relevant finding: without modeled disturbance bounds, reach
tubes are over-optimistic. Quantifies how much of the prior
"all 6 halfspaces" result came from Q_sg=0 simplification vs.
actual controller robustness.
Results saved to results/reach_heatup_pj_with_steam_dump.mat.
Journal entry updated with the per-horizon table + decision box on
what this means for thesis claims.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Scram PJ reach from the bounding-box union of:
- hot-standby box (mode_boundaries.q_shutdown)
- heatup-tight reach envelope (results/reach_heatup_pj_tight.mat)
- operation-LQR reach envelope (results/reach_operation_result.mat)
- LOCA operation envelope (results/reach_loca_operation.mat, 3s)
with precursor + temperature outliers clamped to physical bounds.
Results at probe horizons:
T=10s: 10890 sets in 480s wall — n ∈ [-8e-4, 0.047] T_c [231, 362]
T=30s: 16925 sets in 2892s wall — n ∈ [-4e-4, 0.021] T_c [229, 361]
T=60s: 23919 sets in 705s wall — n ∈ [-2e-4, 0.009] T_c [226, 359]
Monotone n decay, factor-of-5-per-minute even from the wide union.
This is the defensible scram-obligation version: starts from anywhere
the plant could plausibly be (including LOCA-perturbed operation
state), proves n decays. X_exit(scram)=n≤1e-4 still not reached in
60s — same T_max-vs-plant-decay mismatch previously flagged.
Fixed: missing Printf import that had failed the summary block on the
first run (results still computed correctly, just the final print
errored; the matwrite is after the print so the mat file wasn't
saved on that run).
Journal entry for 2026-04-21 extended with the fat-entry result +
the LOCA-reach 3s-horizon numerical-looseness apass. 38 pages.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
New entry 2026-04-21-polytopic-sos-tikhonov.tex covering:
- Polytopic barrier attempt (naive Nagumo check), why it fails
(safety polytope too large for LQR contraction from anywhere),
and the Blanchini pre-image algorithm as the right fix.
- SOS polynomial barrier success on the 2-state reduced projection:
CSDP returns OPTIMAL on a degree-4 polynomial B(x1, x2). First
non-quadratic barrier artifact for this plant. Full polynomial
coefficients embedded.
- Tikhonov singular-perturbation theorem derivation for the PJ
reduction. Writes the 10-state PKE in slow-fast form with
eps=Lambda, identifies the quasi-steady manifold h(x) = PJ
formula, shows fast subsystem exponentially stable under the
prompt_critical_margin_heatup invariant. Error bound:
|x(t) - x_PJ(t)| <= C*Lambda = O(1e-4) in state units, uniform
after boundary layer. Empirical validation data (0.1% max) is
consistent with K_1 ~ 40, K_3 ~ 70 problem constants.
- apass markers for remaining open items: scram entry expansion,
heatup steam-dump Q_sg, heatup controller-ref mismatch.
The Tikhonov derivation upgrades "we ran it and 0.1% error" to
"bounded by C*Lambda where C depends on problem properties bounded
by the safety halfspaces." Rigorous rate.
Journal: 38 pages, clean build.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Second heatup PJ probe with tightened X_entry (T_c width 6K vs
baseline 14K) gives:
T=60s: 5710 sets in 101s — T_c envelope [281.05, 291.0] ✅
T=300s: 12932 sets in 206s — T_c envelope [281.05, 291.0] ✅
T_c envelope STABLE (identical at 60s and 300s) — the tube reached
steady shape and stopped growing. Low-T_avg trip (280) cleared at
lower bound 281.05, ~1K margin.
**First sound nonlinear reach-avoid proof for any mode of this plant:**
for the tightened entry and T = 300s, every inv1_holds halfspace
holds along the tube. Sound w.r.t. PJ dynamics (<= 0.1% error vs
full state).
The baseline wider-entry run was loose on T_c low bound (272.4),
confirming that the looseness was entry-box-width driven (14K too
wide for TMJets + orderQ=2) rather than intrinsic to the method.
Entry splitting / refinement is the path to the full baseline set.
Also: LaTeX preamble now has the unicode-to-math literate map
attached to the listing STYLES themselves (not just global \lstset),
so terminal-output listings pasted from Julia with Δ, ≥, °, ✅ etc.
render correctly. Journal 34 pages, clean build.
OVERNIGHT_NOTES.md updated with tight-entry win.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Scram reach via PJ model runs cleanly through all three probe
horizons:
T=10s: 6919 sets in 118s — n ∈ [0.0347, 0.0355]
T=30s: 9900 sets in 156s — n ∈ [0.0153, 0.0156]
T=60s: 12340 sets in 198s — n ∈ [0.00682, 0.00698]
Factor-of-two power decay per 30s matches the delayed-neutron group
structure (lambda_1=0.0124, half-life ~56s). At t=0 the algebraic n
drops from 1.0 → 0.15 (prompt jump captured as an instantaneous
algebraic adjustment); then tails off on precursor timescales.
Scram reach is completely sound across the full 60s horizon — no
step-budget truncation, unlike heatup beyond 300s.
HOWEVER: X_exit(scram) = n ≤ 1e-4 is not reached in 60s (current
n ~ 7e-3). This is a T_max vs plant-decay-rate mismatch, not a
control failure. Options documented in journal: redefine X_exit in
terms of shutdown margin (industry standard), extend T_max to 600s,
or loosen to n ≤ 0.05. Flagged for Dane's review.
Scram envelope summaries saved to reach_scram_pj_result.mat.
Journal now 33 pages, still compiles clean.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Results from the overnight TMJets run with the prompt-jump model:
T=60s: PASSES (10,044 reach-sets, 205 s wall)
T=300s: PASSES (27,375 reach-sets, 591 s wall)
T=1800s+: partial — exhausts 100k step budget past ~300s
At T=300s the envelope is:
n: [-0.00156, 0.0103] (slightly negative = sound overapprox)
T_c: [272.4, 295.0] C
T_f: [261.2, 302.7] C
T_cold: [270.0, 289.5] C
Discharges 5/6 inv1_holds safety halfspaces at 300s:
fuel_centerline: +897 K margin ✓
t_avg_high_trip: +25 K margin ✓
t_avg_low_trip: VIOLATED (tube dips to 272.4, limit 280)
n_high_trip: huge margin ✓
cold_leg_subcooled: +15 K margin ✓
The low_trip violation is TUBE looseness, not physical — nominal sim
only dips to ~280 transiently. Fixable by tighter X_entry, higher
orderQ, or refinement. Open item.
Journal updated with full results table + limitation box. scram PJ
reach ready to run but not yet executed (structure similar, simpler).
Fix: siunitx \degreeFahrenheit, \degree, \microsecond now work via
\DeclareSIUnit in preamble. UTF-8 passthrough in listings via
literate= map for Δ, λ, μ, α, β, ρ, Σ, Λ, ≤, ≥, →, ±, °, ×, ε.
Journal now compiles clean: 32 pages, 0 errors.
App v2 Pluto cells land under §§9b–9d: live reach-result ingestion
with computed per-halfspace margins, 2D projection chooser, PJ-reach
overlay placeholder.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Singular-perturbation reduction of the PKE+T/H system: set dn/dt=0,
solve algebraically n = Λ·Σλ_i·C_i / (β-ρ). State drops 10 -> 9 (no
n), removes Λ⁻¹ stiffness. Validated against full state on the heatup
scenario:
t [s] |Δn|/n_full T_c err [K]
60 3.7e-5 4e-6
300 3.8e-4 1.9e-4
1200 1.0e-3 2.2e-3
3000 5.0e-4 7.2e-3
Maximum relative error 0.1% on n, peak 7 mK on temperatures over
50 minutes. PJ approximation is excellent for slow heatup transients
(sub-prompt-critical regime).
Files:
- code/src/pke_th_rhs_pj.jl: reduced 9-state RHS
- code/scripts/validate_pj.jl: side-by-side sim
- code/scripts/reach_heatup_pj.jl: TMJets reach with PJ model
(probing T = 60, 300, 1800, 5400 s)
App v2 (Pluto):
- §9b: live ingestion of reach_operation_result.mat with per-
halfspace margins computed from JSON-defined inv2_holds.
- §9c: 2D projection chooser (n, T_f, T_c, T_cold) with reach
tube envelope overlay.
- §9d: PJ heatup reach summary (placeholder until first run lands).
Journal:
- Added 2026-04-20-overnight-prompt-jump.tex with PJ derivation,
validation table, soundness ledger update. apass markers for
the in-progress reach results.
This commit captures state mid-run; next commit will add the
populated reach results once TMJets returns.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Two fixes for clean local builds:
1. journal/.latexmkrc — sets pdf_mode=1, max_repeat=5,
silence_logfile_warnings=1, force_mode=1. Without this, latexmk
bails on first-pass undefined-reference errors before getting to
the second pass that would resolve them. Standard issue with
pdfLaTeX in nonstopmode.
2. Replaced the literal U+1F98E lizard glyph in
2026-04-20-evening-mega-session.tex with a textual description.
pdfLaTeX with default inputenc can't render U+1F98E; XeLaTeX or
LuaLaTeX could but switching toolchains is a bigger change than
the issue warrants. The lizard stays in markdown / Pluto where
it works fine.
Final state: 26 pages, 744 KB, no Reference/LaTeX/Unicode errors in
the log.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
Records the journal scaffold + retroactive-entries + Julia migration
+ Pluto app work, with \apass{} markers for content that should be
expanded in a later A-pass. Keeps the discipline going from the
night the journal stood up.
Easter eggs:
- ASCII reactor + primary loop in journal/README.md (subtle, shows
where Q_sg flows in as a disturbance).
- Garden-lyric reference embedded in pke_params.jl docstring
("looks ordinary on the surface but is something else underneath")
— same lyric as the preamble.tex comment, referencing the name
behind Split. Hacker-Split's signature.
- 🦎 in the Pluto notebook header + closer.
Nothing functional, nothing that clutters the substance.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
journal/ directory, LaTeX-based, dated entries, callout boxes for
derivations / decisions / dead ends / limitations, plus an \apass{}
macro for in-line markers when a later deep-pass is needed.
Retroactive A-style entries for 2026-04-17 (controllers, linearization,
LQR, operation-mode linear reach, Lyapunov barrier) and 2026-04-20
(predicates restructure into deadbands+safety+invariants, OL-vs-CL
barrier analysis, mode-obligation taxonomy, heatup-rate-as-halfspace,
mode_boundaries, first Julia nonlinear reach attempt).
Both entries include derivations written out in math, dead-ends I
hit, code snippets with commentary, figure embeds, and terminal
output where it changed what we did next. The goal is invention-log
depth — readable 4 years from now without the git history to help.
journal/README.md documents the conventions. journal.tex aggregates
all entries into one PDF via latexmk.
Kept claude_memory/ separate as per earlier agreement — those are
short AI-context notes, different audience.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>