Context
Operator named the pattern explicitly 2026-05-18: "META AND monkey patching. DONE, RESOLVED, and again, and new regression!, and regression of regression! but this time for sure! oopsie, and again."
V-B-A this turn against last 200 merged PRs (2026-05-09 → 2026-05-18, 9 days): 14+ obvious monkey-patch shapes by regex sample alone — defensive null-safety / downgrade-log-level / filter-false-positive / retry-transient / stale-cleanup. Real rate inside the 195 META PRs is likely much higher; many feat() PRs are symptom-fixes wearing feature clothing (e.g., feat(ci): two-layer body-shape validation = monkey-patch for "agents produce malformed PR bodies"; root cause = training-drift on body-shape adherence, addressable at skill layer not gate layer).
Friction
- Symptom-fix → next symptom surfaces → another fix → regression of fix → counter-regression. No root-cause halt.
- The recursive pattern compounds: each gate added becomes new substrate that itself accretes new gates.
- Distinct from monkey-patching at code layer alone; this is monkey-patching at substrate-policy layer (ADR + skill + AGENTS.md) which has higher decay-cost.
Scope
Two complementary moves:
- Anti-pattern naming substrate — codify "monkey-patch vs root-cause" recognition in a workflow doc or ADR. Should include:
- Detector signature: Nth recurring fix in same surface within K weeks
- V-B-A prompt: "what root cause is this defensive-fix masking?"
- Halt-and-elevate trigger: defer Nth fix until root cause inquiry runs
- Mechanical gate (sibling work) — measurement primitive that flags surface-area recurrence (e.g.,
gh pr list regex classifier surfacing same scope fix() recurrence)
Should NOT become another monkey-patch (recursive irony). Discipline-substrate, not yet-another-gate.
Acceptance criteria (stub)
Empirical anchor
- Operator-direction 2026-05-18 ~22:35Z (Discussion #11598)
- V-B-A
gh pr list --state merged --limit 200 --json number,title against the working tree this turn — 14+ confirmed monkey-patch shapes via regex (null-safety|defensive|downgrade.*log|mute|filter.*false-positive|retry|transient|orphan|stale)
- Companion: PR #11600 itself is a small instance — Phase 1 "mechanical conversion" missed two stale forms (kebab + title-case
§<ref>) that grep should have caught; root-cause = no lint-agents.mjs regex for stale-semantic-form drift. Captured as [TOOLING_GAP] in GPT's review.
Cross-refs
- Refs #11598 META — friction item NOT previously captured as ticket (operator-correction)
- Related substrate: ADR 0007, AGENTS.md §friction_to_gold, ideation-sandbox §9.0
- Related companion ticket: substrate-bandwidth-saturation (sibling)
Priority
Team to triage.
Context
Operator named the pattern explicitly 2026-05-18: "META AND monkey patching. DONE, RESOLVED, and again, and new regression!, and regression of regression! but this time for sure! oopsie, and again."
V-B-A this turn against last 200 merged PRs (2026-05-09 → 2026-05-18, 9 days): 14+ obvious monkey-patch shapes by regex sample alone — defensive null-safety / downgrade-log-level / filter-false-positive / retry-transient / stale-cleanup. Real rate inside the 195 META PRs is likely much higher; many
feat()PRs are symptom-fixes wearing feature clothing (e.g.,feat(ci): two-layer body-shape validation= monkey-patch for "agents produce malformed PR bodies"; root cause = training-drift on body-shape adherence, addressable at skill layer not gate layer).Friction
Scope
Two complementary moves:
gh pr listregex classifier surfacing same scopefix()recurrence)Should NOT become another monkey-patch (recursive irony). Discipline-substrate, not yet-another-gate.
Acceptance criteria (stub)
Empirical anchor
gh pr list --state merged --limit 200 --json number,titleagainst the working tree this turn — 14+ confirmed monkey-patch shapes via regex (null-safety|defensive|downgrade.*log|mute|filter.*false-positive|retry|transient|orphan|stale)§<ref>) that grep should have caught; root-cause = no lint-agents.mjs regex for stale-semantic-form drift. Captured as [TOOLING_GAP] in GPT's review.Cross-refs
Priority
Team to triage.