Skip to content

Reading the output

Terraform can be red/green because its semantics are binary. Groundhold's are not — the whole system refuses to collapse "I don't know" into a boolean — so the output speaks a slightly richer, closed visual vocabulary. You can read it at a glance without understanding the system; this page is the whole glossary.

The banner: one word, always last

Every verb ends its human output with one word. It answers the only question you have at a glance: can I walk away?

banner color it means do
PROVEN green every hard constraint satisfied under accepted evidence
CONVERGED green reconciliation reached its proven fixed point
APPLIED green the sealed plan's mutations committed
SEALED green a hash-pinned plan exists and is executable
OK green the procedural verb completed
VIOLATED red something is proven false fix the world or the contract
INVALID red the input document does not parse/validate fix the document
BLOCKED yellow missing knowledge on a hard constraint — not a failure gather evidence: probe, observe
STALE yellow the world moved since the decision was made re-observe, re-plan
REFUSED <code> blue a gate held, deliberately follow the code (groundhold explain <code>)
DIED red apply failed mid-flight groundhold resume
CORRUPTED red inverse the ledger is damaged groundhold repair; nothing proceeds

Two deliberate oddities, both load-bearing:

  • A refusal is blue, never red. The gate holding is the system working. If refusals looked like errors, you would learn to resent and bypass the gate — so they look like a guard, not an accident.
  • A non-green banner always names its culprit: BLOCKED: c-rto unknown — recovery.rto requires probe verification, never the bare word.

Machine consumers ignore banners entirely and route on exit codes and the JSON code field — banners are explicitly not a machine interface. Verbs whose stdout is machine output (JSON, ndjson, plans) print the banner on stderr instead, one final line.

Verdict rows: shape first, color second

Everything stays readable with color stripped (CI logs, NO_COLOR, --color=never, color-blindness) because the SHAPE carries the meaning:

glyph ascii verdict next action
OK satisfied — proven true
X violated — proven false fix the world or the contract
? ? unknown — not known yet go look: probe, observe
NA unverifiable — not knowable this way change the contract or the method

? and are different shapes because their remedies differ: unknown is fixed by gathering evidence, unverifiable only by changing the question. The ASCII set appears automatically under non-UTF-8 locales or --ascii.

Provenance renders as brightness. A verdict resting on inferred/assumed values keeps its glyph and color but renders dim, with the [inferred] marker: green-but-dim means satisfied, standing on sand.

The output teaches as it blocks

When a constraint is in a friction state (violated, unknown, unverifiable), the row gains one indented line straight from the vocabulary — what the attribute means and why configuration alone may not prove it:

? c-rto   unknown   requires probe verification; not evaluable from the candidate alone
    recovery.rto — time to restore service after failure; probe-only —
    a value here is a claim until a restore test measures it

Satisfied rows stay terse — the happy path never lectures. And every noun the system emits has one place to ask about it:

groundhold explain recovery.rto        # vocabulary attribute
groundhold explain consent-required    # machine error code

Freshness is part of the claim

"Converged" is always "converged as of some observation". Human renderings carry the age of the evidence they rest on, and a downstream management console shows it on every green badge — a green state is only as fresh as its stalest proof.