{
  "_meta": {
    "audience": "AI coding agents first. Closed type registry for incident-dispatch briefs.",
    "source": "~/Projects/0 DOCS/COMPLAINT_REGISTRY.jsonl (217 records, field `category`), counted 2026-08-08",
    "coverage": {
      "total_records": 217,
      "mapped_records": 205,
      "mapped_categories": "21 of 22 named categories",
      "unmapped": {
        "ci-ritual-fatigue": { "records": 11, "reason": "process-ceremony complaints, not machine incidents — untyped BY DESIGN" },
        "no-category-field": { "records": 1, "ids": ["C217"], "reason": "record carries no `category` field; content is resource-overload-shaped but coverage counts by category field only" }
      },
      "tool-reliability-fatigue_split": {
        "note": "18 records split case-by-case at authoring per spec; ids listed so the split is reproducible",
        "hooks-harness": ["C033", "C034", "C035", "C050", "C080", "C122", "C125", "C182", "C192"],
        "guard-tooling": ["C133", "C134", "C136", "C150", "C173", "C174", "C193"],
        "cluster-offload": ["C084", "C166"]
      }
    }
  },
  "types": [
    {
      "id": "resource-overload",
      "title": "Resource overload",
      "absorbs": ["cpu-load", "memory-load", "disk-io-load", "runaway-process", "disk-cache-fatigue"],
      "skill": "od-overload",
      "doctrine": "Measure first; kill by cgroup, NEVER by process name; never bypass the admission queue.",
      "keywords": ["cpu", "load", "oom", "memory", "swap", "ram", "runaway", "fork bomb", "disk io", "iowait", "thrash", "saturation", "throttle", "100%", "freeze", "slow", "cache", "concurrency"],
      "coverage": 59
    },
    {
      "id": "machine-down",
      "title": "Machine down",
      "absorbs": ["system-crash", "machine-lockout", "graphics-crash"],
      "skill": "od-recovery",
      "doctrine": "Capture evidence BEFORE reboot (VT state, journal, kdump); check /sys/class/tty/tty0/active first.",
      "keywords": ["crash", "lockout", "locked out", "hang", "frozen", "black screen", "reboot", "graphics", "gpu", "xorg", "cinnamon", "compositor", "kernel panic", "watchdog", "unresponsive", "dead", "won't boot"],
      "coverage": 16
    },
    {
      "id": "cluster-offload",
      "title": "Cluster / offload",
      "absorbs": ["tool-reliability-fatigue (buildbox/k3s/offload subset — see _meta split)"],
      "skill": "od-cluster",
      "doctrine": "Read ~/.claude/buildbox-hosts.json first; NEVER contact a host the registry does not mark reachable.",
      "keywords": ["buildbox", "k3s", "offload", "debian1", "debian2", "remote build", "failover", "ssh", "e2e-remote", "spill", "vm", "cluster", "unreachable host"],
      "coverage": 2
    },
    {
      "id": "hooks-harness",
      "title": "Hooks / harness",
      "absorbs": ["hook-timeout", "context-spam", "polling-anti-pattern", "tool-reliability-fatigue (harness-reliability subset — see _meta split)"],
      "skill": "od-hooks",
      "doctrine": "Reproduce the hook/harness failure in isolation; fix fail-closed; NEVER restore v1 daemon/auto-relaunch behavior.",
      "keywords": ["hook", "harness", "timeout", "factory", "workflow", "stuck", "hanging turn", "context spam", "polling", "advisor", "mcp", "subagent", "resume", "crashed mid-run", "checkpoint"],
      "coverage": 24
    },
    {
      "id": "auth-credentials",
      "title": "Auth / credentials",
      "absorbs": ["credential-session-loss"],
      "skill": "od-auth",
      "doctrine": "Read od-auth BEFORE touching any auth path; automate checks first, owner is last resort.",
      "keywords": ["auth", "credential", "token", "login", "logged out", "401", "session loss", "account", "password", "seat", "oauth", "not logged in", "authentication required"],
      "coverage": 5
    },
    {
      "id": "agent-discipline",
      "title": "Agent discipline",
      "absorbs": ["agent-ignores-instructions", "git-decision-dumping", "delivery-approval-fatigue"],
      "skill": "od-agent-discipline",
      "doctrine": "Quote the violated instruction verbatim; fix the enforcing mechanism (hook/gate), not the wording.",
      "keywords": ["ignored", "instruction", "disobey", "asked permission", "approval", "re-ask", "git decision", "rebase", "merge question", "quiz", "deferred", "skipped", "didn't land", "not deployed", "handed back"],
      "coverage": 61
    },
    {
      "id": "notification-spam",
      "title": "Notification spam",
      "absorbs": ["notification-spam", "notification-fatigue"],
      "skill": "od-notifications",
      "doctrine": "Edge-triggered only; auto-remediate before notifying; dedupe on stable episode identity, never timestamps.",
      "keywords": ["notification", "notify", "spam", "ping", "alert", "reminder", "popup", "toast", "fatigue", "dedupe", "repeated alerts"],
      "coverage": 22
    },
    {
      "id": "data-safety",
      "title": "Data safety",
      "absorbs": ["lost-work", "data-retention", "file-sprawl"],
      "skill": "od-data-safety",
      "doctrine": "Stop writes FIRST; prove a backup exists before any restore; never destructive git in the shared checkout.",
      "keywords": ["lost work", "data loss", "deleted", "overwritten", "wiped", "retention", "backup", "transcript", "file sprawl", "scatter", "uncommitted", "discarded"],
      "coverage": 9
    },
    {
      "id": "guard-tooling",
      "title": "Guard tooling",
      "absorbs": ["tool-reliability-fatigue (shim/gate/wrapper subset — see _meta split)"],
      "skill": "od-guards",
      "doctrine": "Check EVERY wrapper layer before blaming the tool; test both branches; a guard fix must fail closed.",
      "keywords": ["shim", "gate", "wrapper", "guard", "deny", "blocked", "refused", "exit 97", "claudex", "cdx", "cursor-agent", "cpu-guard", "slopgate", "prevent-band", "lock", "sqlite", "throttled", "killed session", "statusline"],
      "coverage": 7
    }
  ]
}
