Operations · 7. Daily operation
A Crux daemon fails slowly and predictably: disk fills, journals grow, an ingest valve trips, a queue stops draining. None of those are sudden. This chapter is a how-to: what to look at, how often, what normal looks like, and which numbers move before something breaks.
7.1 The five-minute morning check
In this order. If any step is not normal, stop and go to chapter 8.
1. Is it ready.
curl -s -o /dev/null -w '%{http_code}\n' http://127.0.0.1:14800/readyz
200. A 503 names the failing gate in its body, read it before doing anything else.
2. Open the console and read one widget. The status pill in the rail. You want Connected · Local or Connected · Platform. Degraded means the daemon answered but the console summary did not; Offline means it did not answer at all.
3. Rings › Activity, left column. The Needs you panel. This is the whole point of the console: everything that is waiting on a human is here, in three flavours, a gate awaiting approval, a plan that is blocked, and a session whose intent note suggests it is waiting for you. Clear the first, read the second, judge the third.
Remember the third is inferred, not reported, the coordination plane has no structured waiting-for-input field, so those cards carry an inferred from intent chip (render.js:2018).
4. Same screen, right column. The Fleet panel's four chips: coord, punchcards, sessions, orchestrators, each reading on, off or n/a. A chip that changed from on to n/a overnight is a feed that started erroring.
5. Disk.
df -h /path/to/data_dir
Below 15% free is your warning line. Below 10% the data_dir_capacity readiness gate takes the daemon out of rotation and the capacity guard pauses ingest on its own. §7.5 covers why that specific failure is so confusing when it happens.
7.2 What normal looks like, screen by screen
Knowing what normal looks like is most of the value of a console. Here is the reference.
| Screen | Normal | Not normal |
|---|---|---|
| Status pill | Connected · …, and · read-only only if you expect customer posture | Degraded persisting past a page reload |
| Rings ring | data-src="live" on the root once you have ≥50 qualifying ExecPlan items | Plans you do not recognise; you are on the built-in snapshot |
| Rings › Live board | Sessions you can account for, each with a recent "seen Ns ago" | A session announcing a plan you retired |
| Rings › Punchcards | Leases whose holders are current | Leases held by a passport with no live session, a crashed agent |
| Work › ExecPlans | Blocked column short and moving | Blocked column growing week on week |
| Work › Activity | Rows arriving; Go live shows new ones | Live (reconnecting) persisting |
| Work › Sessions | The allocation panel's identity and plan-link shares steady or rising | Either share falling, agents stopped binding |
| Memory › Facts | shown of visible · stored all moving together | stored climbing much faster than visible, churn, or a stateless client writing session bindings |
| Memory › Review | Live contradictions near zero | A rising contradiction count on one entity |
| Trust › Gates | Empty, or short and moving | A gate older than your review cadence |
| Trust › Receipts | New receipts appearing | None since a known write |
| System › Settings › Runtime capabilities | Every row you rely on available | Any row you rely on flipping to degraded |
7.3 The weekly pass
Five things, none of which is urgent on any given day and all of which are urgent eventually.
1. Growth. Six artefacts have no automatic reclamation path at all: observation journals, shard quarantine directories, the routing shard-map history, the integrations audit journal, the activity journal and the cost report journal. Several other journals have no compaction equivalent to the fact journal's. Check their sizes against last week.
2. Fact-store churn. In Memory › Facts, compare visible against stored. A large and growing gap means retired facts accumulating. The single most common cause of unexpected growth is a stateless MCP bridge that re-initialises on every poll: each initialisation writes one durable session-binding fact, and without the ephemeral GC that population is unbounded.
The fix is CORECRUXD_EPHEMERAL_GC=1, which sweeps hourly, caps session bindings at 32 per passport and drops reverify receipts older than 30 days. It is read once at boot, so it needs a restart, and it never touches user facts (ephemeral_gc.rs:23).
3. The blocked column. Work › ExecPlans, Blocked. For each card, decide: is this waiting on a gate (go approve it), waiting on information (answer it), or dead (close it)? A blocked column nobody triages becomes a blocked column nobody reads.
4. Session allocation. Work › Sessions, the allocation panel. If the passport-binding or plan-link share is falling, your agents have stopped identifying themselves, and every downstream attribution, receipts, cost, gates, degrades with it. The daemon prints its own why string under the stats.
5. Tool surface. Rings › Agent, in Professional mode. Look at two columns: tools with a high error percentage (friction to fix) and tools marked never offered or ignored (candidates to demote from the surface). The 30-day window makes this a weekly-cadence read, not a daily one.
7.4 The monthly pass
| Task | Why |
|---|---|
| Verify a backup restores | A restore that has never been tested is a hope. Chapter 9 §9.4 |
| Compact the fact journal | Operator-triggered only. Rewrites the journal, dropping deleted values entirely |
| Reap quarantine and old observation journals | Nothing else will |
| Review the trusted keyring | Studio › Integrations › Trusted keys. Every signed manifest verifies against it |
| Re-read Runtime capabilities | System › Settings, top card. Capability availability changes with configuration you may not have made |
| Check route-auth mode | If it is still shadow, decide whether the soak is over |
7.5 The six signals that come before a failure
These are ordered by how often they actually precede an incident.
1. corecrux_data_dir_free_ratio falling below 0.15. The data_dir_capacity readiness gate flips at 0.10 by default, so 0.15 gives you warning before readiness does.
This is the single most confusing failure in the system, because of how it presents. A full data partition takes an otherwise-healthy daemon out of rotation, and downstream tooling reports it as a bare timeout with empty stderr, every integration test failing at once, across unrelated changes, with no useful message. df -h on the data partition is the first command, not the fifth.
2. corecrux_valve_pause_ingest at 1 when you did not pause it. Read CONTROL.json. If valves.pauseIngest.actor is capacity_guard, the background guard paused ingest on disk pressure and will resume at CORECRUXD_CAPACITY_RESUME_FREE_RATIO (config.rs:1112). It will not stomp an operator-set pause. Treat it as signal one with a different name.
3. corecrux_segment_corrupt_total increasing. Sets a flag that fails readiness gate seven until an operator clears it. One increment is a hardware or filesystem question, not an application one.
4. corecrux_log_redactions_total increasing while redaction is in audit mode. This is the pre-flight signal before switching redaction on: it tells you redactable material is passing through the logger and is currently only being counted (redaction.rs:26).
5. The Blocked column growing. Not a metric, a screen. Work is arriving faster than a human is unblocking it.
6. The Gates queue ageing. A gate older than your review cadence means an agent is stalled and nobody has noticed. The card shows its age in words for exactly this reason.
7.6 Five alerts that earn their place
| Alert | Signal | Why it earns its place |
|---|---|---|
| Disk approaching the gate | corecrux_data_dir_free_ratio below 0.15 | Warns before readiness does |
| Corruption detected | corecrux_segment_corrupt_total increasing | Fails readiness until cleared |
| Ingest auto-paused | corecrux_valve_pause_ingest at 1 | If the actor is capacity_guard, look at disk, not at your own actions |
| Redactable material in logs | corecrux_log_redactions_total increasing in audit mode | Tells you what switching redaction on would remove |
| Unwitnessed heads | crux_witness_unwitnessed_heads growing | Only meaningful when witnessing is enabled |
Restrict /metrics at the network layer. It is unauthenticated, it is not covered by the minimal-probes flag, and its labels carry shard ids, node topology, valve state and hashed tenant ids.
7.7 The habits that make the console tell the truth
Four things you can do that cost nothing and make every later question answerable.
Bind a passport on every browser you use. Trust › Pending mints, Bound approver. Without it, every gated write refuses, and, more importantly; nothing you approve is attributable.
Ask your agents to set a title and a summary at save_session. Work › Sessions leads with the agent-given title when there is one; without it, the list is a column of ids. The empty row says so explicitly: no state summary, agents: set title/summary in save_session state.
Post cost reports. Both Meters pages are empty until corecruxctl session cost --post runs. Nothing computes them for you.
Set CRUX_EXECPLANS_ROOT in the daemon's process environment. Without it, the work board is only the kanban table, the ExecPlan projection has no files to read, and half the console's most useful joins have nothing to join to.
7.8 What the console will not tell you
Stated as plainly as the rest, because a routine built on a false assumption is worse than no routine.
- The console does not alert. It has no notification, no sound, no badge count that follows you. Rings › Activity is a screen you have to look at.
- A "may need input" card is inferred from free text. It is a prompt to look, not a report.
- A coordination heartbeat is passport-level, not session-level. Sibling sessions of one identity share it, so "fresh" means that identity is around (render.js:1975).
- A
window-inferredcost attribution is not a link. It means those plans were open at the same time. - A receipt is a verifiable record of what was stored and retrieved. It is tamper-evidence, not attestation of what an agent did.
- Three Explore surfaces are demo fixtures, Signals, Sourcing and Reverse. They carry a
demochip and have no endpoint behind them.
Sources
- crates/corecruxd/src/http/health.rs:276, the nine readiness gates
- crates/corecruxd/src/config.rs:1112,
CORECRUXD_CAPACITY_RESUME_FREE_RATIO - crates/corecruxd/src/config.rs:1089, the capacity guard's enable flag and interval
- crates/corecruxd/src/ephemeral_gc.rs:23,
CORECRUXD_EPHEMERAL_GC, default off - crates/corecruxd/src/metrics.rs:258,
corecrux_valve_pause_ingest - crates/corecruxd/src/redaction.rs:26,
corecrux_log_redactions_total - crates/corecruxd/console/v2/render.js:1989, the attention-zone classifier
- crates/corecruxd/console/v2/render.js:10936, the session allocation panel

