bascule-shell loads /opt/substrate/posture/current.json
(BASCULE_POSTURE_FILE override) at session start and exports:
BASCULE_DEFCON_LEVEL numeric global level (1..5)
BASCULE_POSTURE_LEVEL alias (already shipped in M1)
BASCULE_CAPABILITY_CEILING CAP_NONE..CAP_GOVERN
BASCULE_CEREMONY_REQUIRED "0" / "1"
BASCULE_MAX_SESSION_TTL minutes, omitted when 0
Fail-soft: missing/malformed file degrades to peacetime defaults so
the shell exec path stays alive on misconfigured hosts.
The new posture.rs module is a tiny inline snapshot loader (60 LOC,
serde_json on top of an already-present dep) — bascule-oss does not
pull libgsh as a dep, so the JSON wire format produced by
substrate-operator is the contract. gsh and bascule-shell share that
contract, not Rust types.
Stacked on feat/m2-roles-export.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Signed-off-by: Claude Code <claude@guildhouse.dev>