PWR-HYBRID-3/fret-pipeline/specs/synthesis_config_v3.json
Dane Sabo cebf8c167a Initial umbrella repo: thesis + FRET pipeline + plant model with first controllers
Folds three previously-separate pieces into one preliminary-example repo
for the HAHACS thesis:

- thesis/ (submodule) → gitea Thesis.git — the PhD proposal
- fret-pipeline/ — FRET requirements to AIGER controller (was
  ~/Documents/fret_processing/; prior single-commit history abandoned
  per user decision)
- plant-model/ — 10-state PKE + lumped T/H PWR model (was
  ~/Documents/PKE_Playground/; never version-controlled before)
- presentations/2026DICE/ (submodule) → gitea 2026DICE.git
- reachability/, hardware/ — empty placeholders for Thrust 3 and HIL
- docs/architecture.md — how the discrete and continuous layers compose
- claude_memory/ — session notes and scratch knowledge pattern

Plant model refactored to thesis naming (x, plant, u, ref); pke_th_rhs
now takes u as an explicit arg instead of reading rho_ext from the
params struct. First two controllers built to the contract
u = ctrl_<mode>(t, x, plant, ref): ctrl_null (baseline) and
ctrl_operation (stabilizing, proportional on T_avg). Validated under a
100% -> 80% Q_sg step: ctrl_operation reduces steady-state T_avg drift
~47% vs. the unforced plant.

Root CLAUDE.md emphasizes that CLAUDE.md files are living documents and
that any knowledge not captured before a session ends is lost forever;
claude_memory/ holds the session-level notes that haven't stabilized
enough to graduate into a CLAUDE.md.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-16 16:24:11 -04:00

144 lines
9.9 KiB
JSON

{
"_comment": "Generated from pwr_hybrid_3.json by fret_to_synth.py. Boolean mode encoding with auto-discovered mode groups. Mutual exclusion constraints are synthesis artifacts \u2014 they enforce the single-valued semantics of control_* variables after decomposition into independent booleans. They are NOT needed in FRET itself, where control_mode = q_X is inherently single-valued.",
"spec_name": "PWR_HYBRID_3_DRC",
"source_file": "pwr_hybrid_3.json",
"mode_groups": {
"control_mode": {
"values": [
"q_heatup",
"q_operation",
"q_scram",
"q_shutdown"
],
"booleans": [
"in_mode_heatup",
"in_mode_operation",
"in_mode_scram",
"in_mode_shutdown"
]
}
},
"inputs": [
"inv1_holds",
"inv2_holds",
"manual_reset",
"p_above_crit",
"t_avg_above_min",
"t_avg_in_range"
],
"outputs": [
"in_mode_heatup",
"in_mode_operation",
"in_mode_scram",
"in_mode_shutdown"
],
"requirements": [
{
"req_id": "DRC_S004_SCRAM_STAY",
"fulltext": "Whenever control_mode = q_scram & !manual_reset DRC shall at the next timepoint satisfy control_mode = q_scram",
"project": "PWR_HYBRID_3",
"component": "DRC",
"ltl": "(G ((in_mode_scram & (! manual_reset)) -> (X in_mode_scram)))",
"ltl_original": "(G (((control_mode = q_scram) & (! manual_reset)) -> (X (control_mode = q_scram))))",
"condition_type": "holding"
},
{
"req_id": "DRC_T001_SHUTDOWN_TO_HEATUP",
"fulltext": "Upon control_mode = q_shutdown & t_avg_above_min DRC shall at the next timepoint satisfy control_mode = q_heatup",
"project": "PWR_HYBRID_3",
"component": "DRC",
"ltl": "((G (((! (in_mode_shutdown & t_avg_above_min)) & (X (in_mode_shutdown & t_avg_above_min))) -> (X (X in_mode_heatup)))) & ((in_mode_shutdown & t_avg_above_min) -> (X in_mode_heatup)))",
"ltl_original": "((G (((! ((control_mode = q_shutdown) & t_avg_above_min)) & (X ((control_mode = q_shutdown) & t_avg_above_min))) -> (X (X (control_mode = q_heatup))))) & (((control_mode = q_shutdown) & t_avg_above_min) -> (X (control_mode = q_heatup))))",
"condition_type": "regular"
},
{
"req_id": "DRC_T002_HEATUP_TO_OPERATION",
"fulltext": "Upon control_mode = q_heatup & t_avg_in_range & p_above_crit & inv1_holds DRC shall at the next timepoint satisfy control_mode = q_operation",
"project": "PWR_HYBRID_3",
"component": "DRC",
"ltl": "((G (((! (((in_mode_heatup & t_avg_in_range) & p_above_crit) & inv1_holds)) & (X (((in_mode_heatup & t_avg_in_range) & p_above_crit) & inv1_holds))) -> (X (X in_mode_operation)))) & ((((in_mode_heatup & t_avg_in_range) & p_above_crit) & inv1_holds) -> (X in_mode_operation)))",
"ltl_original": "((G (((! ((((control_mode = q_heatup) & t_avg_in_range) & p_above_crit) & inv1_holds)) & (X ((((control_mode = q_heatup) & t_avg_in_range) & p_above_crit) & inv1_holds))) -> (X (X (control_mode = q_operation))))) & (((((control_mode = q_heatup) & t_avg_in_range) & p_above_crit) & inv1_holds) -> (X (control_mode = q_operation))))",
"condition_type": "regular"
},
{
"req_id": "DRC_A001_MODE_VALID",
"fulltext": "DRC shall always satisfy control_mode = q_shutdown | control_mode = q_heatup | control_mode = q_operation | control_mode = q_scram",
"project": "PWR_HYBRID_3",
"component": "DRC",
"ltl": "(G (((in_mode_shutdown | in_mode_heatup) | in_mode_operation) | in_mode_scram))",
"ltl_original": "(G ((((control_mode = q_shutdown) | (control_mode = q_heatup)) | (control_mode = q_operation)) | (control_mode = q_scram)))",
"condition_type": "null"
},
{
"req_id": "DRC_T003_HEATUP_TO_SCRAM",
"fulltext": "Upon control_mode = q_heatup & !inv1_holds DRC shall at the next timepoint satisfy control_mode = q_scram",
"project": "PWR_HYBRID_3",
"component": "DRC",
"ltl": "((G (((! (in_mode_heatup & (! inv1_holds))) & (X (in_mode_heatup & (! inv1_holds)))) -> (X (X in_mode_scram)))) & ((in_mode_heatup & (! inv1_holds)) -> (X in_mode_scram)))",
"ltl_original": "((G (((! ((control_mode = q_heatup) & (! inv1_holds))) & (X ((control_mode = q_heatup) & (! inv1_holds)))) -> (X (X (control_mode = q_scram))))) & (((control_mode = q_heatup) & (! inv1_holds)) -> (X (control_mode = q_scram))))",
"condition_type": "regular"
},
{
"req_id": "DRC_T004_OPERATION_TO_SCRAM",
"fulltext": "Upon control_mode = q_operation & !inv2_holds DRC shall at the next timepoint satisfy control_mode = q_scram",
"project": "PWR_HYBRID_3",
"component": "DRC",
"ltl": "((G (((! (in_mode_operation & (! inv2_holds))) & (X (in_mode_operation & (! inv2_holds)))) -> (X (X in_mode_scram)))) & ((in_mode_operation & (! inv2_holds)) -> (X in_mode_scram)))",
"ltl_original": "((G (((! ((control_mode = q_operation) & (! inv2_holds))) & (X ((control_mode = q_operation) & (! inv2_holds)))) -> (X (X (control_mode = q_scram))))) & (((control_mode = q_operation) & (! inv2_holds)) -> (X (control_mode = q_scram))))",
"condition_type": "regular"
},
{
"req_id": "DRC_T005_SCRAM_TO_SHUTDOWN",
"fulltext": "Upon control_mode = q_scram & manual_reset DRC shall at the next timepoint satisfy control_mode = q_shutdown",
"project": "PWR_HYBRID_3",
"component": "DRC",
"ltl": "((G (((! (in_mode_scram & manual_reset)) & (X (in_mode_scram & manual_reset))) -> (X (X in_mode_shutdown)))) & ((in_mode_scram & manual_reset) -> (X in_mode_shutdown)))",
"ltl_original": "((G (((! ((control_mode = q_scram) & manual_reset)) & (X ((control_mode = q_scram) & manual_reset))) -> (X (X (control_mode = q_shutdown))))) & (((control_mode = q_scram) & manual_reset) -> (X (control_mode = q_shutdown))))",
"condition_type": "regular"
},
{
"req_id": "DRC_S001_SHUTDOWN_STAY",
"fulltext": "Whenever control_mode = q_shutdown & !t_avg_above_min DRC shall at the next timepoint satisfy control_mode = q_shutdown",
"project": "PWR_HYBRID_3",
"component": "DRC",
"ltl": "(G ((in_mode_shutdown & (! t_avg_above_min)) -> (X in_mode_shutdown)))",
"ltl_original": "(G (((control_mode = q_shutdown) & (! t_avg_above_min)) -> (X (control_mode = q_shutdown))))",
"condition_type": "holding"
},
{
"req_id": "DRC_S002_HEATUP_STAY",
"fulltext": "Whenever control_mode = q_heatup & inv1_holds & !(t_avg_in_range & p_above_crit) DRC shall at the next timepoint satisfy control_mode = q_heatup",
"project": "PWR_HYBRID_3",
"component": "DRC",
"ltl": "(G (((in_mode_heatup & inv1_holds) & (! (t_avg_in_range & p_above_crit))) -> (X in_mode_heatup)))",
"ltl_original": "(G ((((control_mode = q_heatup) & inv1_holds) & (! (t_avg_in_range & p_above_crit))) -> (X (control_mode = q_heatup))))",
"condition_type": "holding"
},
{
"req_id": "DRC_S003_OPERATION_STAY",
"fulltext": "Whenever control_mode = q_operation & inv2_holds DRC shall at the next timepoint satisfy control_mode = q_operation ",
"project": "PWR_HYBRID_3",
"component": "DRC",
"ltl": "(G ((in_mode_operation & inv2_holds) -> (X in_mode_operation)))",
"ltl_original": "(G (((control_mode = q_operation) & inv2_holds) -> (X (control_mode = q_operation))))",
"condition_type": "holding"
},
{
"req_id": "DRC_I001_INIT_SHUTDOWN",
"fulltext": "DRC shall immediately satisfy control_mode = q_shutdown",
"project": "PWR_HYBRID_3",
"component": "DRC",
"ltl": "in_mode_shutdown",
"ltl_original": "(control_mode = q_shutdown)",
"condition_type": "null"
}
],
"structural_constraints": [
{
"name": "mutex_control_mode",
"description": "Exactly one control_mode value active at all times",
"ltl": "G ((in_mode_heatup & (! in_mode_operation) & (! in_mode_scram) & (! in_mode_shutdown)) | ((! in_mode_heatup) & in_mode_operation & (! in_mode_scram) & (! in_mode_shutdown)) | ((! in_mode_heatup) & (! in_mode_operation) & in_mode_scram & (! in_mode_shutdown)) | ((! in_mode_heatup) & (! in_mode_operation) & (! in_mode_scram) & in_mode_shutdown))"
}
],
"conjoined_ltl": "((G ((in_mode_scram & (! manual_reset)) -> (X in_mode_scram)))) & (((G (((! (in_mode_shutdown & t_avg_above_min)) & (X (in_mode_shutdown & t_avg_above_min))) -> (X (X in_mode_heatup)))) & ((in_mode_shutdown & t_avg_above_min) -> (X in_mode_heatup)))) & (((G (((! (((in_mode_heatup & t_avg_in_range) & p_above_crit) & inv1_holds)) & (X (((in_mode_heatup & t_avg_in_range) & p_above_crit) & inv1_holds))) -> (X (X in_mode_operation)))) & ((((in_mode_heatup & t_avg_in_range) & p_above_crit) & inv1_holds) -> (X in_mode_operation)))) & ((G (((in_mode_shutdown | in_mode_heatup) | in_mode_operation) | in_mode_scram))) & (((G (((! (in_mode_heatup & (! inv1_holds))) & (X (in_mode_heatup & (! inv1_holds)))) -> (X (X in_mode_scram)))) & ((in_mode_heatup & (! inv1_holds)) -> (X in_mode_scram)))) & (((G (((! (in_mode_operation & (! inv2_holds))) & (X (in_mode_operation & (! inv2_holds)))) -> (X (X in_mode_scram)))) & ((in_mode_operation & (! inv2_holds)) -> (X in_mode_scram)))) & (((G (((! (in_mode_scram & manual_reset)) & (X (in_mode_scram & manual_reset))) -> (X (X in_mode_shutdown)))) & ((in_mode_scram & manual_reset) -> (X in_mode_shutdown)))) & ((G ((in_mode_shutdown & (! t_avg_above_min)) -> (X in_mode_shutdown)))) & ((G (((in_mode_heatup & inv1_holds) & (! (t_avg_in_range & p_above_crit))) -> (X in_mode_heatup)))) & ((G ((in_mode_operation & inv2_holds) -> (X in_mode_operation)))) & (in_mode_shutdown) & (G ((in_mode_heatup & (! in_mode_operation) & (! in_mode_scram) & (! in_mode_shutdown)) | ((! in_mode_heatup) & in_mode_operation & (! in_mode_scram) & (! in_mode_shutdown)) | ((! in_mode_heatup) & (! in_mode_operation) & in_mode_scram & (! in_mode_shutdown)) | ((! in_mode_heatup) & (! in_mode_operation) & (! in_mode_scram) & in_mode_shutdown)))"
}