Skip to content

[Epic] Drift detection v1: introduction-time + time-emergent #248

Description

@julianken

WHY

Drift audit 2026-05-04 produced this remediation plan via REPORT.md § "Recommended drift-detection automation" (lines 204-264). The next move per the detecting-drift-in-ai-repos skill is to decompose findings into composable signals so future audits run continuously.

This epic is filed but not gating. Per FINAL-PLAN.md line 7, the drift:* taxonomy is not a precondition for any #226#247 issue. Per the drift skill's cold-start protocol, audit findings the team chooses NOT to fix immediately get a wontfix issue (existing label) so day-one of the future nightly doesn't refile them — that ceremony is now #248e-1.

WHAT (epic checklist)

Tracking-only epic. Each child is a separate PR delivered in shadow mode for 5-10 firings before being verdict-capable. Per REPORT.md line 278: cap narrative drift at IMPORTANT during shadow rollout.

PRE-REQ chain: #248a → all others. No downstream child fires until the label taxonomy lands.

  • #248a — drift:* label taxonomy. Labels: drift:spec, drift:plan, drift:dependency, drift:infra, drift:docs, drift:label, drift:test, drift:automated, drift:aging, drift:escalated, drift:acknowledged. Reuse existing wontfix instead of drift:wont-fix. PRE-REQ for every child below.

  • #248b-1 — Bot rubric: canary-phrase grep on narrative-doc diffs. Path: ~/.claude/skills/reviewing-as-julianken-bot/SKILL.md. Scans README/CLAUDE.md/AGENTS.md/docs/* for: vercel, Vercel Blob, BLOB_READ_WRITE_TOKEN, Transaction Pooler, npm run, Phase 1 (current), All rights reserved. IMPORTANT cap, full shadow. PRE-REQ: #248a.

  • #248b-2 — Bot rubric: CONTENT_MODEL.md cross-check on src/collections/ diffs. Flags field-list mismatches. IMPORTANT cap, shadow. PRE-REQ: #248a.

  • #248b-3 — Bot rubric: auto-label agentic-design-patterns on PRs touching src/(data|app)/agentic-design-patterns/. Zero FP risk; ships verdict-capable on day one. PRE-REQ: #248a.

  • #248c — Workflow: check-required-contexts. Compares .mergify.yml check-success + branch-protection contexts to emitted name: fields in .github/workflows/*.yml. Fails CI if drifted. Prevents chore(ci): add missing E2E shard contexts to .mergify.yml #225-class regressions. PRE-REQ: #248a.

  • #248d — Workflow: canary-phrase-guard. ESLint-style grep over tracked narrative files; fails CI on canary matches. Canary list lives in workflow YAML. PRE-REQ: #248a.

  • #248e-1 — Cold-start ceremony. File wontfix issues for SUGGESTION-tier deferrals from this audit so day-one of #248e-2 doesn't refile them. (Replaces former [Audit log] Drift audit 2026-05-04 — deferred items #249 placeholder.) PRE-REQ: #248a.

  • #248e-2 — Nightly extractor: shell script + signals + dedup. Deterministic only, no LLM. Signals: Dependabot PRs >7d open; issues in active epic without epic's labels; migrations without paired .json snapshots; doc files with passed Next Audit: dates; components without paired tests; literal vercel in tracked files (excluding ADP example bodies). Includes exclusion list for the tool's own artifacts. Ships and bakes before #248e-3. PRE-REQ: #248a, #248e-1.

  • #248e-3 — LLM dispatch synthesizer. Gated on signal severity from #248e-2. Single issue per cycle. Synthesizer failure doesn't poison signal data. PRE-REQ: #248e-2.

DONE WHEN

All eight children land and complete at least one shadow-mode firing cycle without producing >3 false-positive issues per week. Plus: kill-review reminder issue filed (see below).

Kill review reminder

Per drift skill § 5, the kill metric requires both a quantified threshold AND a calendar trigger.

Metric: closed-as-fixed / closed-total < 40% over a calendar month → kill LLM-driven rules (#248e-3, #248b-*), keep deterministic checks (#248c, #248d, #248e-2).

Trigger: within 24h of #248e-2 first nightly fire, file a follow-up issue with label 60-day-followup and target date = merge_date(#248e-2) + 60d. Template:

gh issue create --repo julianken/detached-node \
  --title "Drift Detection v1 — kill-metric review (60d)" \
  --label "60-day-followup" \
  --body "Review window: $(date -v+60d +%Y-%m-%d). Compute closed-as-fixed/closed-total over the prior calendar month for issues labeled drift:*. If <40%, kill #248b-* and #248e-3; keep #248c/#248d/#248e-2."

Falsifiability statement

Pay-for-itself: 22 BLOCKERs from REPORT.md remediated within 30 days; future pivots produce <5 net-new BLOCKER prose-drift findings 30 days post-pivot; Dependabot ai-sdk PR closure rate >80%.

Waste: kill-metric trips; team disables nightly within 3 months; BLOCKERs recur on same artifacts after one full fix cycle.

OUT OF SCOPE

PRE-REQS

None for the epic itself. Internal chain: #248a precedes all other children.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or requestepicTracks an epic-level body of work

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions