forensic-research · git:20260614.58467df · 2026-06-14 · sha256 6b475b5a859eef7b

forensic-research git:20260614.58467dfA

Immutable. This exact content never changes and is served at /api/v1/blob/6b475b5a859eef7b.

---
name: forensic-research
description: >-
  Exhaustive evidence-based investigation with sub-agents, vBRIEF claim ledger,
  and mandatory falsification before conclusions or recommendations. Domain-agnostic
  core with pluggable domain packs. Artifacts live under .tmp/investigations/ only.
  Use for "why did", "investigate", "root cause", "what caused", "forensic research",
  production delay/failure questions, or when the operator rejects a first-theory
  diagnosis. Do NOT trigger on action requests that already name a fix unless the
  operator also wants investigation first. Do NOT trigger on bare "run tests" or
  "read logs" without a causal question. Triggers: forensic research, investigate why,
  root cause, what caused, forensic mode, stay in forensic. Mode stays ACTIVE across
  follow-ups until operator exits (exit forensic, done investigating, normal mode).
  Read references/forensic-mode.md + follow-ups.md.
---

# Forensic Research — MODE

**Forensic mode** is a sustained investigation posture, not a one-shot reply. Enter on first causal question; **stay in mode** until the operator exits. Follow-ups drill the **active** ledger (`.tmp/investigations/.active`).

**Mode docs:** `references/forensic-mode.md`, `references/follow-ups.md`

Multi-agent investigation discipline: decompose the question into a logic tree, verify every claim with evidence, falsify popular wrong theories, and conclude only when surviving theories have verified causal chains.

**Core references:** `references/forensic-mode.md`, `references/follow-ups.md`, `references/question-framing.md`, `references/investigation-profile.md`, `references/orchestrator-protocol.md`, `references/subagent-prompts.md`, `references/outcome-template.md`, `references/failures.md`

**Domain packs:** `references/domains/<domain>.md` — **you must add one per project** (start from `references/domains/TEMPLATE.md`).

**Examples:** `examples/slizard/` — full SLizard production pack (reference only).

**Template:** `templates/investigation.vbrief.json`

---

## Iron laws

0. **Mode gate** — On enter: read `references/forensic-mode.md`. If `.tmp/investigations/.active` exists, resume that id (follow-up). Else scaffold new id + write `.active`. First chat line: `Forensic mode active — .tmp/investigations/<id>/`. Stay in mode every turn until operator exits.
0b. **Artifact gate** — Before ANY causal statement in chat, active investigation must have `investigation.vbrief.json`. Follow-ups extend it; do not answer from chat memory alone.
1. **Answer embargo (chat gate)** — While `plan.status` is `running` OR validator has not passed: chat may only say forensic mode is active, current wave, and path to ledger/`outcome.md` if it exists from a **prior** completed pass. ⊗ Root cause, ⊗ mechanism names, ⊗ counts, ⊗ config recommendations. After Wave 5: chat may summarize **only** what `outcome.md` already states.
1b. **Operator challenge = re-verify** — When the operator disputes a claim, treat as mandatory re-verification: new or updated `EV-OPERATOR` or disproof evidence **before** repeating the claim. ⊗ Debate from memory.
2. **Evidence before narrative** — every factual claim cites a `plan.references` id (`EV-…`). Assertions without citations are `[HYPOTHESIS]` only.
3. **Config is not code** — production flags require runtime proof (secrets manager, deploy env, or log line showing actual value). ⊗ Infer from source code or docs alone.
3b. **No tautologies** — "failed because timed out" and "slow because X took N minutes" are **not** answers to why it was slow. Name a **mechanism** or close with "mechanism not verified" after exhausting `branch.mechanism.*`.
4. **Falsification before fixation** — a branch is **ruled out** (`status: failed`) when disproof evidence exists; "less likely" is not allowed.
5. **Proof-required disproval** — "no evidence found" → `unknown`, not `failed`. `failed` requires a specific counter-evidence ref.
6. **Sub-agents own branches** — orchestrator prefetches evidence bundles (domain adapters) into `evidence/` before dispatch; branch/trap agents interpret and cite `EV-*`. Sub-agent returns `blocked: needs_shell` if required adapter output is missing — orchestrator fetches, then re-dispatches.
7. **Scratch only** — all artifacts under `.tmp/investigations/<id>/`. ⊗ `git add` anything under that path.

---

## Artifact layout

```
.tmp/investigations/<investigation-id>/
  investigation.vbrief.json
  evidence/
  outcome.md
```

**Investigation id:** `YYYY-MM-DD-<slug>` (slug from anchor).

---

## Orchestrator workflow (summary)

| Wave | Agent(s) | Output |
|------|----------|--------|
| 0 — Init | Orchestrator | Dir + template + traps |
| 1 — Traps | trap-runner | Popular theories falsified |
| 2 — Branches | branch investigators | Claims verified/failed/unknown |
| 2b — Mechanism | branch investigator | Why dominant phase was slow |
| 3 — Falsify | falsifier | Disproof attempts — **mandatory** |
| 4 — Red-team | red-team | Counter-evidence — **mandatory** |
| 5 — Synthesize | synthesizer | `outcome.md` after validator pass |

**Domain selection:** infer from question; if ambiguous, ask **one** question. Load `references/domains/<your-pack>.md`.

Read `references/orchestrator-protocol.md` for full detail.

---

## Quick start (orchestrator checklist)

- [ ] Domain pack exists for this project (`references/domains/<name>.md`)
- [ ] Anchor recorded in `narratives.Problem`
- [ ] `.tmp/investigations/<id>/` created from template
- [ ] Wave 1 traps dispatched
- [ ] Wave 2 + 2b branch agents dispatched
- [ ] Wave 3–4 falsifier + red-team dispatched
- [ ] Validator pass (`references/investigation-profile.md` § Validator)
- [ ] Wave 5 `outcome.md` written
- [ ] Chat: brief summary + path to `outcome.md` only