nightcrawler
NIGHTCRAWLER — Exception and Incidentwrites to the ledgerrecommendfully declaredException and incident. Detects failures, pages the right owner, contains, and runs the blameless postmortem. Every postmortem proposes at least one guard. Use for /incident, any live failure, and any alert.
What this agent is held to
Vercel, Supabase and PostHog alerts plus AI-HQ/Scars/What it reads about itself before making a new call
16 rows on the record, 0 of them forecasts still waiting to be settled. Nothing has been settled yet, so this agent says exactly that before it makes a new call rather than implying an accuracy it has not earned.
Routing and cost attribution
classification — this is what its runs get costed asplugins/org-os/agents/nightcrawler.md5 commands name this agent
/healing-factorRecover and scar over — the blameless postmortem and its guardpostmortem + guard/sniktClaws out — triage a live failure nowtriage/trackFollow the trail until it ends — root cause with an evidence chainevidence chain/incidentA live failure — detect, page the owner, contain, and the blameless postmortem with at least one guardincident triage/containContain a live incident — evidence first, timeline from observations, no external wordcontainment record
16 rows it wrote to the shared ledger
20260828-004scarvault-remote-leakthe full rowcloseSecond instance of 20260828-002, different path. run-phase-11.sh redirected TELEMETRY_STATE but not VAULT_LOCAL; voice-gate-guard.sh resolves the Bridge queue from vault.md independently, so two TEST denials landed in the LIVE pending queue reading as real asks waiting on a human, one of them an ad spend.
What was predicted—The range it committed to—How it gets settled—Settle by—Outcome—Settled on—Where this came fromfound at deploy when the vault was committed; removed in AI-HQ a1bd349; guard added to voice-gate-guard.sh and asserted in run-phase-11.shthe line exactly as it is stored20260828-004 | 2026-08-28 | nightcrawler | scar | vault-remote-leak | Second instance of 20260828-002, different path. run-phase-11.sh redirected TELEMETRY_STATE but not VAULT_LOCAL; voice-gate-guard.sh resolves the Bridge queue from vault.md independently, so two TEST denials landed in the LIVE pending queue reading as real asks waiting on a human, one of them an ad spend. | - | - | - | - | - | - | found at deploy when the vault was committed; removed in AI-HQ a1bd349; guard added to voice-gate-guard.sh and asserted in run-phase-11.sh20260828-003guardvault-remote-leakthe full rowcloseIsolating a local path does not isolate a remote. Any write path that resolves a destination from config must honour a local override on BOTH halves, or refuse to use the configured destination at all. Redirecting the local path means not the real target.
What was predicted—The range it committed to—How it gets settled—Settle by—Outcome—Settled on—Where this came fromderived from 20260828-002; enforced in scripts/vault-write.sh REDIRECTED guardthe line exactly as it is stored20260828-003 | 2026-08-28 | nightcrawler | guard | vault-remote-leak | Isolating a local path does not isolate a remote. Any write path that resolves a destination from config must honour a local override on BOTH halves, or refuse to use the configured destination at all. Redirecting the local path means not the real target. | - | - | - | - | - | - | derived from 20260828-002; enforced in scripts/vault-write.sh REDIRECTED guard20260828-002scarvault-remote-leakthe full rowcloseA test set VAULT_LOCAL to a temp directory believing that isolated it. vault-write.sh resolves the REMOTE from vault.md independently of VAULT_LOCAL, so it git-init'd the temp dir, adopted the real remote, and pushed two fixtures carrying FABRICATED Finanshels runway figures into the company vault, addressed to the board.
What was predicted—The range it committed to—How it gets settled—Settle by—Outcome—Settled on—Where this came fromdiscovered when a later push was rejected non-fast-forward; fixtures removed in AI-HQ commit 6279b6ethe line exactly as it is stored20260828-002 | 2026-08-28 | nightcrawler | scar | vault-remote-leak | A test set VAULT_LOCAL to a temp directory believing that isolated it. vault-write.sh resolves the REMOTE from vault.md independently of VAULT_LOCAL, so it git-init'd the temp dir, adopted the real remote, and pushed two fixtures carrying FABRICATED Finanshels runway figures into the company vault, addressed to the board. | - | - | - | - | - | - | discovered when a later push was rejected non-fast-forward; fixtures removed in AI-HQ commit 6279b6e20260821-010guardprice-the-gatethe full rowclosePrice a spend gate before asking for approval. State the estimate in the same breath as the ask. An unstated ~$0.50 cost carried the weight of a much larger fear.
What was predicted—The range it committed to—How it gets settled—Settle by—Outcome—Settled on—Where this came frommigrated from halatax LESSON 7the line exactly as it is stored20260821-010 | 2026-08-21 | nightcrawler | guard | price-the-gate | Price a spend gate before asking for approval. State the estimate in the same breath as the ask. An unstated ~$0.50 cost carried the weight of a much larger fear. | - | - | - | - | - | - | migrated from halatax LESSON 720260821-009guardpremise-and-measurementthe full rowcloseVerify the user's premise against data, then verify your own measurement. A naive median contradicted the user and was itself contaminated by 6 canned deflection strings; only the raw message bodies settled it. Both the report and the metric can be partly wrong.
What was predicted—The range it committed to—How it gets settled—Settle by—Outcome—Settled on—Where this came frommigrated from halatax LESSON 5the line exactly as it is stored20260821-009 | 2026-08-21 | nightcrawler | guard | premise-and-measurement | Verify the user's premise against data, then verify your own measurement. A naive median contradicted the user and was itself contaminated by 6 canned deflection strings; only the raw message bodies settled it. Both the report and the metric can be partly wrong. | - | - | - | - | - | - | migrated from halatax LESSON 520260821-008guardfalsifier-qualitythe full rowcloseA falsifier must name the CLASS of finding that would overturn a call, never enumerate file locations. A path-enumerating falsifier let a real defect through on a technicality.
What was predicted—The range it committed to—How it gets settled—Settle by—Outcome—Settled on—Where this came frommigrated from halatax LESSON 4the line exactly as it is stored20260821-008 | 2026-08-21 | nightcrawler | guard | falsifier-quality | A falsifier must name the CLASS of finding that would overturn a call, never enumerate file locations. A path-enumerating falsifier let a real defect through on a technicality. | - | - | - | - | - | - | migrated from halatax LESSON 420260821-007guardinteresting-mechanism-biasthe full rowcloseRank plumbing above craft when predicting a root cause. Predict the boring mechanism first.
What was predicted—The range it committed to—How it gets settled—Settle by—Outcome—Settled on—Where this came fromderived from 20260821-006the line exactly as it is stored20260821-007 | 2026-08-21 | nightcrawler | guard | interesting-mechanism-bias | Rank plumbing above craft when predicting a root cause. Predict the boring mechanism first. | - | - | - | - | - | - | derived from 20260821-00620260821-005guarduser-worktree-stashthe full rowcloseThe user's working tree is off-limits entirely — never stash it, never clean it, never assume uncommitted changes belong to the run. Brief this to every builder, not just for specific files.
What was predicted—The range it committed to—How it gets settled—Settle by—Outcome—Settled on—Where this came fromderived from 20260821-004the line exactly as it is stored20260821-005 | 2026-08-21 | nightcrawler | guard | user-worktree-stash | The user's working tree is off-limits entirely — never stash it, never clean it, never assume uncommitted changes belong to the run. Brief this to every builder, not just for specific files. | - | - | - | - | - | - | derived from 20260821-00420260821-004scaruser-worktree-stashthe full rowcloseA builder stashed the user's unrelated uncommitted work in order to get isolation.
What was predicted—The range it committed to—How it gets settled—Settle by—Outcome—Settled on—Where this came frommigrated from halatax LESSON 2the line exactly as it is stored20260821-004 | 2026-08-21 | nightcrawler | scar | user-worktree-stash | A builder stashed the user's unrelated uncommitted work in order to get isolation. | - | - | - | - | - | - | migrated from halatax LESSON 220260821-003guardworktree-collisionthe full rowcloseEvery parallel builder receives an absolute unique path AND an explicit file-ownership contract at dispatch. Never a conventional name chosen by the builder.
What was predicted—The range it committed to—How it gets settled—Settle by—Outcome—Settled on—Where this came fromderived from 20260821-002the line exactly as it is stored20260821-003 | 2026-08-21 | nightcrawler | guard | worktree-collision | Every parallel builder receives an absolute unique path AND an explicit file-ownership contract at dispatch. Never a conventional name chosen by the builder. | - | - | - | - | - | - | derived from 20260821-00220260821-002scarworktree-collisionthe full rowcloseTwo parallel builders independently chose the same conventional worktree directory name; the second reverted the first's work as contamination. The commander then misdiagnosed it as fabrication and said so to the user before reading the other builder's report.
What was predicted—The range it committed to—How it gets settled—Settle by—Outcome—Settled on—Where this came frommigrated from halatax LESSON 1the line exactly as it is stored20260821-002 | 2026-08-21 | nightcrawler | scar | worktree-collision | Two parallel builders independently chose the same conventional worktree directory name; the second reverted the first's work as contamination. The commander then misdiagnosed it as fabrication and said so to the user before reading the other builder's report. | - | - | - | - | - | - | migrated from halatax LESSON 120260813-009guardphantom-artifactsthe full rowcloseVerify artifact paths on disk at checkpoint time AND again at resume before reporting any phase complete.
What was predicted—The range it committed to—How it gets settled—Settle by—Outcome—Settled on—Where this came fromderived from 20260813-008; confirmed load-bearing by halatax LESSON 6the line exactly as it is stored20260813-009 | 2026-08-13 | nightcrawler | guard | phantom-artifacts | Verify artifact paths on disk at checkpoint time AND again at resume before reporting any phase complete. | - | - | - | - | - | - | derived from 20260813-008; confirmed load-bearing by halatax LESSON 620260813-008scarphantom-artifactsthe full rowcloseTwo phases were marked complete against files that were not on disk. The mission record said done; the filesystem said absent.
What was predicted—The range it committed to—How it gets settled—Settle by—Outcome—Settled on—Where this came frommigrated from ~/.captain-mode/command-ledger.md meridian LESSON 2the line exactly as it is stored20260813-008 | 2026-08-13 | nightcrawler | scar | phantom-artifacts | Two phases were marked complete against files that were not on disk. The mission record said done; the filesystem said absent. | - | - | - | - | - | - | migrated from ~/.captain-mode/command-ledger.md meridian LESSON 220260813-007guardroster-detectionthe full rowcloseDetect the installed roster before planning, not before dispatching. A plan with a majority of degraded phases is reported as an install recommendation first and a mission plan second.
What was predicted—The range it committed to—How it gets settled—Settle by—Outcome—Settled on—Where this came fromderived from 20260813-006, command-ledger LESSONthe line exactly as it is stored20260813-007 | 2026-08-13 | nightcrawler | guard | roster-detection | Detect the installed roster before planning, not before dispatching. A plan with a majority of degraded phases is reported as an install recommendation first and a mission plan second. | - | - | - | - | - | - | derived from 20260813-006, command-ledger LESSON20260813-005guardmcp-async-flushthe full rowcloseAny stdio server must be proven by a full handshake against clean, dirty, invalid-path and unknown-tool cases before it is called delivered. Review does not substitute for execution.
What was predicted—The range it committed to—How it gets settled—Settle by—Outcome—Settled on—Where this came fromderived from 20260813-004the line exactly as it is stored20260813-005 | 2026-08-13 | nightcrawler | guard | mcp-async-flush | Any stdio server must be proven by a full handshake against clean, dirty, invalid-path and unknown-tool cases before it is called delivered. Review does not substitute for execution. | - | - | - | - | - | - | derived from 20260813-00420260813-004scarmcp-async-flushthe full rowcloseAn MCP server dropped its final response because rl.on('close') exited before pending async tool calls flushed. Found only by real execution, not by review.
What was predicted—The range it committed to—How it gets settled—Settle by—Outcome—Settled on—Where this came frommigrated from ~/.thor-mode/armory.md evidence linethe line exactly as it is stored20260813-004 | 2026-08-13 | nightcrawler | scar | mcp-async-flush | An MCP server dropped its final response because rl.on('close') exited before pending async tool calls flushed. Found only by real execution, not by review. | - | - | - | - | - | - | migrated from ~/.thor-mode/armory.md evidence line
What its own file covers
- Diagnosis — G-005 and G-007 bind you
- Containment
- The postmortem
- Hard rules
398 words of written mandate in plugins/org-os/agents/nightcrawler.md.