Pattern-067: Issue-Body Reality Mismatch

Status

Emerging — Identified 2026-05-09 by Lead Developer during M2f Group A+B audit-cascade work (3 of 5 issues encountered the pattern in a single session). Filed under Lead Dev self-approval authority 2026-05-09 per recent precedent (CIO Pattern-066 filed under self-approval same day). Promotion to Proven pending one trial-application cycle on a future issue triage where the Phase 0 dead-code check is applied prophylactically.

Product Relevance

Portable — Any project with an issue tracker, technical-debt backlog, and codebase that evolves between issue-filing and issue-pickup. Particularly load-bearing in:

Context

When an issue is filed, its body captures the author’s understanding of what’s broken at filing time. If the codebase evolves between filing and pickup, the body’s framing can drift from reality:

This pattern is distinct from but related to:

Problem

The failure mode

The audit-cascade discipline (Pattern-049) says: issue-audit before gameplan, gameplan-audit before prompts, prompts-audit before execution. But the issue-audit step is often performed against the issue’s body as the source of truth — auditor reads the body, checks it against the feature template, surfaces missing fields, asks PM to fill in gaps.

This treats the body as authoritative on “what is currently true in the codebase.” But the body was written at a moment in time and may no longer be accurate. Auditing the body against a template doesn’t catch body-vs-reality drift; it only catches body-vs-template drift.

Result: the gameplan inherits the body’s incorrect premise. Implementation proceeds against a phantom problem (e.g., “wire UserService to DB”) when the actual problem is different (e.g., “delete UserService — it’s wired in but never populated”). Hours of work can go in the wrong direction before the mismatch surfaces — typically when tests start passing in unexpected ways, or a callsite grep returns zero results.

Trigger conditions

Particularly likely when the issue body contains any of:

The acceptance-criteria parenthetical is often the audit-cascade’s smoking gun: it’s there because the original author considered the alternative was real but didn’t have time to investigate. Phase 0 should treat the parenthetical as a candidate disposition, not an afterthought.

Evidence

M2f Group A+B audit-cascade, 2026-05-09 — 3 of 5 issues exhibited this pattern in a single Lead Dev session:

Issue Body’s framing Reality Disposition
#933 SEC: API key validation disabled “Validation should be re-enabled before beta” Original cause (format-validator issues) was fixed Oct 30 2025 in commit 214f4afe; bypass remained in place 6+ months after cause was gone Flag flip + un-broke 5 existing tests that asserted validation works
#936 TECH-DEBT: UserService in-memory dicts “All user session data lost on restart. Multi-tenancy isolation depends on in-memory state.” UserService.create_session() and create_user() had ZERO production callsites. Wired into AuthMiddleware but _sessions was always empty; isolation comes from JWT claims, not the dicts Delete (Option A); −435 LOC
#935 TECH-DEBT: BudgetManager + APIUsageTracker no DB persistence “All data is in-memory only and lost on server restart. Users have no historical usage visibility.” BudgetManager: zero callers (dead). APIUsageTracker: real INSERT SQL into api_usage_logs table, but call chain unreachable because callers don’t pass a session. Table existed in postgres with 0 rows Delete (Option A); −1378 LOC; #1029 superseded

Each issue’s body’s premise was wrong. Each took the audit-cascade Phase 0 investigation step ~30-60 min to expose. Each saved 6-12+ hours of misdirected implementation work that would have shipped a feature against a phantom problem.

Aggregated impact of Phase 0 catching these:

Mechanism

The pattern operates through temporal asymmetry:

  1. Issue is filed at time T₀ with body describing state as the author understood it
  2. Codebase evolves between T₀ and T₁ (pickup time): refactors, deletions, wiring changes, dependency upgrades
  3. At T₁, audit-cascade Phase 0 normally happens, BUT the audit checks body-against-template (does it have all required fields?) rather than body-against-current-reality
  4. Body’s premise propagates into gameplan, prompts, implementation
  5. Failure surfaces during implementation when reality contradicts the premise (e.g., a grep for the supposed-callsites returns zero, tests for the supposed-broken-feature pass, etc.)

The longer the gap T₁ - T₀, the higher the probability of drift. M2f Group A+B’s body-vs-reality mismatches all came from issues filed in the March 24 weekly docs audit TODO triage — 6+ weeks before pickup. In a high-velocity codebase, that’s enough time for substantial wiring changes.

Counter-pattern (the discipline)

Phase 0 dead-code/unreachable check, applied prophylactically to issue bodies that match trigger conditions:

  1. When the body says “X needs persistence/migration/wiring,” grep for X’s callsites as the very first investigation step. Zero callsites = dead code; investigate further.
  2. When the body says “TODO to enable Y,” find when Y was originally disabled (git blame on the bypass site). Check if the original cause has since been fixed. If yes, the bypass may be the only thing left.
  3. When the body cites a specific line number, verify the line still contains the described code (line numbers drift; the issue may now describe entirely different code).
  4. When the acceptance criteria has a parenthetical alternative (“OR documented as gateway pattern”), treat that as a candidate disposition equal in weight to the migration framing, not a fallback.
  5. When the body’s premise survives the above, proceed with confidence to gameplan. When the body fails, surface the body-vs-reality finding to PM with three options (delete / wire / defer-and-document) before any implementation.

The check is fast (~15-30 min Phase 0 work) and cheap relative to the cost of misdirected migration work (often 4-12+ hours per issue).

See Also

Pattern History


Pattern-067 author: Lead Developer (Code, Opus); 2026-05-09 Cross-references: Pattern-049 (Audit Cascade), Pattern-045 (Green Tests Red User), Pattern-046 (Beads Completion), Pattern-062 (Assembly Assumption)