Runbook: governance break-glass¶
What to do when Tower (the Govern plane) is unreachable, or denies what it shouldn't. Also how to put a decision kind
back from enforce to shadow or off. The design is spec 0015.
hangar enforces, Tower decides whether a person or a policy allows something, and nothing that goes wrong on the way
is ever an allow.
Break-glass is hangar governance local (the procedure). Read what is built
today first. With every
kind off (the code's default), hangar never asks Tower. GKE's deploy/k8s/config.yaml sets shadow: hangar's rules
decide and Tower answers a dry run. The procedure covers a kind in enforce.
Today: hangar decides alone¶
What is built (spike #171, PR #208):
src/hangar/governance.py, the client side of thehangar.decision/v1contract. It has the request and decision models,LocalDecisionPoint(hangar's own rules) andHttpDecisionPoint(Tower over HTTP).HttpDecisionPointallows 2 s to connect and 5 s in all, with one retry on a 401 with a fresh token. Its circuit breaker opens after 5 failures in 30 s, for 30 s, and it carries the fail-closed table.GovernanceRoutersetsoff,shadoworenforceper kind. TheBreakGlassrecord needs two different admins, for at most 24 hours.tests/test_governance.py, the contract tests against a fake Tower: every failure fails closed for every kind, and shadow never changes an outcome. Break-glass needs two admins and lasts at most 24 hours.
Every approval path calls it through HANGAR_GOVERNANCE and HANGAR_GOVERNANCE_MODES:
govrelease.py: job release and landing.governed.py: governed approvals of flagged tool calls, egress and secret requests.govevents.py: Tower's signed events, which suspend and resume turns and stop runs.-
govhook.py: the managed Tower hook for Claude Code turns. -
hangar governance local(governance_cli.py,govrelease.py): break-glass, with a doctor warning while it is on.
What isn't built: replaying break-glass decisions to Tower as records.
With every kind off, every approval is decided by hangar's own rules, as before. That is an admin or a linked repo approver, never on
their own job (approvals.decide, #121), the taint gate (#130) and the self-approval rule (#160).
If every kind is off and Tower is down, or denies, there is nothing to do in hangar: nothing waits on Tower.
Tower's side (its outage behaviour, its decisions API) is in Tower's own docs.
Moved from this page¶
| Section | Now on |
|---|---|
| Once Tower decides (planned) | Once Tower decides |
| The modes | Once Tower decides: the modes |
| When Tower is unreachable | Once Tower decides |
| Putting a kind back from enforce | Once Tower decides |
| Break-glass | Once Tower decides: break-glass |
| When Tower denies what it shouldn't | Once Tower decides |