DEC-0015: Agent Accountability Compact
Date: 2026-03-29 Status: Accepted Scope: All agents (Cursor, Claude Code, Codex, Perplexity) — universal behavioral contract
Problem
Forensic analysis of the codebase and governance documents (2026-03-29) found that the agent system had strong normative rules but near-zero enforcement. Specific failures documented:
-
Key behavioral rule not loading:
.cursor/rules/cursor-operational-discipline.mdchad no frontmatter. Cursor's rule loader could silently skip it. The entire root-cause protocol and pre-commit checklist were potentially invisible to agents. -
Silent error masking normalized: 51
catchblocks insite/, including:kb-search.ts: vector search failure silently fell back to text search with no logAudioPlayer.tsx:audio.play().catch(() => {})— pure suppressionEssayGraphOverlay.tsx:catch { return null }— errors became invisibleuse-kb-search.ts: errors looked like "no results" rather than "broken search"
-
Stub routes returned HTTP 200:
cron/kb-indexandcron/analyticsreturned{ status: "ok" }for unimplemented work. Monitoring would never detect this. -
sloppylint configured to always pass:
sloppylint scripts/ || truein the Makefile converted a lint gate into theater. -
No rejection mechanism in prompt relay: Once an agent marked work complete, there was no formal path to return it for rework. Sloppy work accumulated.
-
No documented history of agent failures: The "Things That Have Gone Wrong" section in
memory-bank-patterns.mdcwas empty despite documented incidents (imagery pipeline postmortem, orchestration failure).
Decision
All agents are bound by the Agent Accountability Compact, documented in:
.cursor/rules/agent-accountability.mdc(canonical, always-loaded)AGENTS.mdsection Agent Accountability Compact (visible to all agents)
Ten Forbidden Behaviors
- Silent error swallowing (
catch { return null }without logging) - Returning success for unimplemented work (HTTP 200 for stubs)
- Masking data problems in the UI (fallback strings that hide bad data)
- Skipping context before editing (not reading producers/consumers first)
- Using IDE todo list as a plan substitute
- Claiming "too complex" without documentation
- Completing work without verification evidence
- Creating undeclared workarounds (missing WORKAROUND / ROOT CAUSE / PROPER FIX / TRACKED fields)
- Guessing instead of asking on ambiguous requirements
- Bypassing hooks without documentation in the commit message
What Changed
Files created:
.cursor/rules/agent-accountability.mdc— anti-pattern registry,alwaysApply: trueproject-log/decisions/DEC-0015_agent-accountability-compact.md— this file
Files modified:
.cursor/rules/cursor-operational-discipline.mdc— added frontmatter, verification section, IDE todo prohibition, catch and hook rulesAGENTS.md— bumped to v2.5, added Agent Accountability Compact sectionprompts/_schema.yaml— addedrejectedstatus withrejected_by,rejection_reason,rejection_datescripts/prompt-queue.py— addedrejectsubcommandMakefile— addedmake prompt-rejecttarget; removed|| truefromlint-slopsite/app/api/cron/kb-index/route.ts— HTTP 200 to 501site/app/api/cron/analytics/route.ts— HTTP 200 to 501site/lib/kb-search.ts— added error logging to vector search fallbacksite/app/components/AudioPlayer.tsx— addedconsole.warnto play rejectionsite/app/essays/components/EssayGraphOverlay.tsx— addedconsole.errorto neighborhood fetch failuressite/lib/use-kb-search.ts— addedconsole.errorto search failuressite/lib/kb.ts— addedconsole.errorto directory read failuresite/lib/graph-data.ts— addedconsole.errorto directory read failuresite/lib/episodes.ts— addedconsole.errorto episode parse failuressite/app/episodes/[id]/page.tsx— missing episode metadata returns descriptive fallback instead of{}.cursor/rules/memory-bank-patterns.mdc— added Agent Anti-Patterns section and Things That Have Gone Wrong entries.cursor/rules/memory-bank-active-context.mdc— updated with session note
Rationale
Agent systems converge on anti-patterns because anti-patterns are locally optimal: returning {} is faster than tracing the root cause; || true lets the build pass without fixing anything; catch { return null } avoids having to think about what to do on error. These are individually defensible choices but collectively produce a system where bugs are buried, errors are invisible, and the governance apparatus is cosmetic.
The compact makes each anti-pattern explicit, names it, and provides the alternative. The enforcement changes (rule loading, sloppylint, HTTP 501, prompt rejection) provide the first layer of mechanical backing for what were previously purely normative rules.
What This Does Not Fix
- CI/CD enforcement of behavioral rules (no GitHub Actions yet; see
memory-bank-progress.mdc) - All 51 catch blocks in
site/— only the worst user-visible ones were fixed - Automated testing coverage
These are follow-on work. The compact and the mechanical fixes here are the foundation.
Decided By
Human (2026-03-29). Implemented by Cursor.