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>
Full toolchain port. Numerical equivalence verified against MATLAB:
- main_mode_sweep.jl: every mode's final state matches MATLAB to 3-4 dp
- reach_operation.jl: per-halfspace margins match MATLAB exactly
- barrier_lyapunov.jl: per-halfspace bounds match (best Qbar from sweep
yields max|dT_c| = 33.228 K either side)
- barrier_compare_OL_CL.jl: OL gamma 1.038e13, CL gamma 1.848e4
matching the MATLAB result; LQR helps by ~20,000x on every halfspace.
Phase summary:
Phase 1: pke_solver.jl, plot_pke_results.jl (Plots.jl), main_mode_sweep.jl
Phase 2: reach_linear.jl, reach_operation.jl, barrier_lyapunov.jl,
barrier_compare_OL_CL.jl, load_predicates.jl
Phase 3 (this commit): delete plant-model/ entirely, delete reach
code from reachability/ keeping predicates.json + docs,
git mv julia-port/ -> code/, update root README + CLAUDE,
write code/CLAUDE.md and code/README.md, update reach
README + WALKTHROUGH file paths, journal preamble note
that pre-port entries reference MATLAB paths.
Why now: prompt-neutron stiffness in nonlinear reach made it clear we
need TMJets, which is Julia. Already had the Julia plant model
working and matching MATLAB. Two languages = two sources of truth =
two places to drift. One language, one truth.
Manifest.toml gitignored. .mat results gitignored.
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>