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
Lab Journal
___
,' `.
/ ___ \ n, C_i,
| ( UO2 ) | T_f, T_c, T_cold
\ ‾‾‾ / |
`.___,' v
||||| →→→→ [ controller ] →→→→ rods
|||||
‾‾‾‾‾‾‾‾‾‾‾‾‾ primary loop
___________
| SG | Q_sg(t) ∈ [Q_min, Q_max]
|____________|
The HAHACS invention log for the pwr-hybrid-3-demo preliminary
example. Each dated session gets an entry. The goal: a reader in 2030
should be able to rebuild the thesis work from this journal alone.
Structure
journal/
preamble.tex shared LaTeX setup (fonts, listings, callouts, macros)
journal.tex top-level aggregator (builds all entries into one PDF)
entries/ dated session entries, one file per session
YYYY-MM-DD-{topic-slug}.tex
figures/ journal-specific figures (referenced from entries)
README.md this file
Conventions
Filename
entries/YYYY-MM-DD-{topic-slug}.tex. One file per session. If a day has multiple distinct sessions, use time-of-day in the slug (e.g., 2026-04-20-morning-predicates.tex and 2026-04-20-evening-mega-session.tex).
Entry skeleton
\session{2026-04-17}{duration}{one-line summary}
\section{Session: ... (YYYY-MM-DD)}
\label{sec:YYYYMMDD}
\subsection*{Goal}
What I set out to do and why.
\subsection*{What landed}
...
\subsection*{Key decisions}
...
\subsection*{Dead ends}
...
\subsection*{Derivations}
...
\subsection*{Results}
...
\subsection*{Limitations recorded}
...
\subsection*{Open at close}
...
Entries compile standalone (each starts with \input{../preamble.tex} wrapped in a conditional so it only pulls preamble when not already loaded by journal.tex), or together via journal.tex.
Two entry styles
- A-style (deep / invention-log): full derivations, code commentary, dead-ends, embedded figures, terminal output where useful. Used for retroactive entries and sessions that land meaningful artifacts.
- B-style (narrative + pointers): end-of-session notes. Uses
\apass{...}callouts to flag spots that need a later A-pass.
Callout boxes
From preamble.tex:
| Environment | Use |
|---|---|
derivation |
Math derivations |
decision |
Design choices with rationale + alternatives |
deadend |
Paths that didn't work |
limitation |
Soundness gaps, known-approximate behavior |
Plus the inline \apass{text} marker for A-pass TODOs.
Code inclusion
\juliafile[options]{path/to/file.jl}— includes a Julia source file as a numbered listing.\matlabfile[...]{...}— for MATLAB sources.- Or inline with
lstlistingenvironment andlanguage=Juliafor snippets.
Always include the path as the listing caption so readers can find the file.
Figures
Figures live in ../docs/figures/ (shared with the thesis) or figures/ (journal-only). The preamble sets \graphicspath to check both.
Always include:
- A descriptive caption (what's on axes, what's being shown).
- A discussion in the surrounding prose — what the figure proves or illustrates. Figures without discussion are noise.
Terminal output
For a numerical result or an error that drove a decision, include the actual terminal text in a lstlisting block with style=terminal:
\begin{lstlisting}[style=terminal]
TMJets: 10583 reach-sets
T_c envelope: [274.45, 295.0] C
FAILED: AssertionError: radius must be nonnegative
\end{lstlisting}
Don't include full logs — only the lines that changed what you did next.
Build
cd journal
latexmk -pdf journal.tex # whole journal as one PDF
latexmk -pdf entries/2026-04-17-controllers-linear-reach.tex # one entry
Requires TeX Live with tcolorbox, listings, inconsolata, siunitx, cleveref, hyperref, fancyhdr. All in the standard distribution.
Not a replacement for
claude_memory/— short AI-context notes, Markdown, different audience.reachability/WALKTHROUGH.md— standalone doc summarizing current state of reach analysis.- Git commit messages — per-commit rationale for code changes.
The journal is the chronological narrative of the work. The others are snapshots, summaries, or pointers. They're all legitimate; they do different things.