Context Files
Drift Detection
Keeping context files current through CI checks and automated audits
Last verified 2026-09-25
Summary
Context files go stale as code evolves: commands removed, directories moved, tech stack upgraded, permissions changed. Agents following outdated files fail silently. Detect drift via CI checks: run all commands in to verify they exist and succeed, verify referenced directories exist, grep tech stack to confirm current versions, compare permission boundaries to actual code. Run the /surface skill's scorecard (context dimension) monthly or quarterly. Add lint rules for AGENTS.md format consistency. Track changes in git; recent commits on the file signal maintenance.
- Stale commands: pnpm dev removed from package.json
- Deleted directories: src/components moved to packages/web/components
- Outdated tech: Node 16 EOL but still in AGENTS.md
- Drift detection: CI checks, monthly audits, git log inspection
- Lint rules: Require AGENTS.md format consistency
- Maintenance signal: Recent git commits on AGENTS.md
Context files go stale. Commands, directories and conventions change. Agents that follow outdated instructions fail silently - running non-existent commands, trying to access deleted files, applying superseded conventions.
Drift detection catches this via CI checks and automated audits.
Common Drift Patterns
Stale Commands
# AGENTS.md (outdated)
pnpm dev # But package.json has "dev" removed; now it's "start"
npm install # But migrated to pnpm; npm install will failDeleted Directories
# AGENTS.md (outdated)
See src/components/ # But moved to packages/web/components/Outdated Tech
# AGENTS.md (outdated)
Framework: Next.js 14 # But upgraded to Next.js 16
Database: MySQL # But migrated to PostgreSQLRemoved Conventions
# AGENTS.md (outdated)
Testing: Jest # Migrated to Vitest 6 months ago
Linter: ESLint v7 # Upgraded to ESLint v9Detection Strategies
Manual: Verification Dates
Tag entries with last-verified dates:
# AGENTS.md
Commands (verified 2026-04-15):
pnpm dev # Last verified 2026-04-15
pnpm test # Last verified 2026-04-15
pnpm build # Last verified 2026-04-01 — STALE, verify soon
Tech Stack (verified 2026-03-01):
TypeScript # Last verified 2026-03-01
Next.js 16 # Last verified 2026-04-10 — recently updated
PostgreSQL # Last verified 2026-02-15 — STALE, mark verifiedRed-flag entries older than 3 months. Require re-verification before merge.
Automated: CI Checks
Add a pre-commit or CI script to validate commands:
#!/bin/bash
# scripts/validate-agents.sh
set -e
echo "Validating AGENTS.md commands..."
# Check that commands exist
pnpm -v > /dev/null || (echo "✗ pnpm not found" && exit 1)
turbo --version > /dev/null || (echo "✗ turbo not found" && exit 1)
# Check that scripts exist in package.json
for cmd in dev test lint build; do
grep -q "\"$cmd\":" package.json || \
(echo "✗ pnpm $cmd script not found in package.json" && exit 1)
done
echo "✓ All commands validated"Run on every commit:
# .git/hooks/pre-commit
#!/bin/bash
bash scripts/validate-agents.shAutomated: Directory Checks
Verify directories referenced in AGENTS.md still exist:
#!/bin/bash
# scripts/check-paths.sh
set -e
echo "Checking referenced directories..."
dirs=(
"src/"
"tests/"
"docs/"
"packages/api/"
"packages/web/"
)
for dir in "${dirs[@]}"; do
[ -d "$dir" ] || (echo "✗ Directory $dir not found" && exit 1)
done
echo "✓ All directories exist"Automated: Content Validation
Check that AGENTS.md sections haven't been removed:
#!/bin/bash
# scripts/validate-agents-content.sh
set -e
echo "Validating AGENTS.md sections..."
# Check required sections exist
required_sections=(
"Quick Start"
"Conventions"
"Testing"
"Boundaries"
)
for section in "${required_sections[@]}"; do
grep -q "## $section" AGENTS.md || \
(echo "✗ Required section '## $section' missing from AGENTS.md" && exit 1)
done
# Check line count (warn if over 370)
lines=$(wc -l < AGENTS.md)
if [ "$lines" -gt 370 ]; then
echo "AGENTS.md is $lines lines (recommend under 370)"
exit 1
fi
echo "✓ AGENTS.md structure valid"Skill-Based Audit
Run the /surface skill's scorecard against context files from an agent session:
/surface score --dimension=context
# Outputs:
# context-files dimension:
# Score: 2/3
# Issues:
# - AGENTS.md: 425 lines (recommend under 370)
# - CLAUDE.md: Last verified 2026-02-01 (>3 months stale)
# - Missing .cursor/rules/ for Cursor users
# Recommendations:
# - Split AGENTS.md or link to deeper docs
# - Re-verify CLAUDE.md against current behaviorThis is a skill invocation inside an agent session, not a binary - there is nothing here for a CI job to shell out to. Run it on a cadence (monthly or quarterly) or after a change that touches commands, tech stack, or boundaries, and treat a low score as a prompt to investigate and fix, not a merge gate. The shell scripts above are what actually belongs in CI: they run as ordinary commands and can fail a build.
Maintenance Cadence
Quarterly Review
Every 3 months, re-verify AGENTS.md sections:
# AGENTS.md
## Quick Start
Commands (verified 2026-04-17):
pnpm dev # ✓ 2026-04-17
pnpm test # ✓ 2026-04-17
pnpm build # ✗ 2026-01-15 — RE-VERIFY
## Boundaries (verified 2026-04-01)
- Last verified when changed; no recent updatesCreate quarterly reminder task:
# scripts/quarterly-review.sh
#!/bin/bash
cat << EOF
# Quarterly AGENTS.md Review
Verify these sections:
- [ ] Commands still exist and work
- [ ] Directories referenced still exist
- [ ] Tech stack versions current
- [ ] Permission boundaries still enforced
- [ ] Testing setup matches reality
- [ ] All links point to existing files
Run full test suite:
pnpm test
If anything changed, update dates:
Commands (verified 2026-04-17):
pnpm dev # ✓ 2026-04-17
EOFEvent-Driven Updates
Update AGENTS.md immediately when:
- Package manager changes (npm → pnpm)
- Major version upgrades (Next.js 14 → 16)
- File structure changes (src/ moved to lib/)
- Command names change
- Permission boundaries change
- Testing framework changes
Commit message pattern:
docs(AGENTS.md): Update Next.js version to 16
- Verified all dev commands work with Next.js 16
- No changes needed in CLAUDE.md - it imports AGENTS.md, so it picked up the update automatically
- No breaking changes to existing commandsStale Content Removal
Remove sections that are no longer relevant:
Before:
## Legacy Setup
If using Node <20, install node-gyp separately:
npm install -g node-gyp
(Node <20 no longer supported - Next.js 16 requires 20+; .nvmrc enforces 20+)After: Delete the section. Update instead:
## Requirements
Node.js 20.12+. Enforced in .nvmrc.Tooling Integration
Pre-Commit Hook
#!/bin/bash
# .git/hooks/pre-commit
echo "Validating context files..."
# Run validation scripts
bash scripts/validate-agents.sh || exit 1
bash scripts/check-paths.sh || exit 1
bash scripts/validate-agents-content.sh || exit 1
echo "✓ Context files OK"
exit 0CI Workflow
# .github/workflows/validate-context.yml
name: Validate Context Files
on: [push, pull_request]
jobs:
validate:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Validate commands
run: bash scripts/validate-agents.sh
- name: Check directories
run: bash scripts/check-paths.sh
- name: Check structure
run: bash scripts/validate-agents-content.shBlocks merge if the shell scripts fail. The /surface scorecard from the previous section runs separately, in an agent session on a cadence - it has no CLI form for CI to call, and its purpose is diagnostic, not a merge gate.
Manual Audit Checklist
Use before committing changes that affect conventions:
# Context File Audit Checklist
Before merging code changes, verify context files:
- [ ] All commands in AGENTS.md work (pnpm dev, pnpm test, pnpm build)
- [ ] Directories referenced still exist
- [ ] Tech stack versions current
- [ ] Permission boundaries match actual permissions
- [ ] Testing commands match actual test setup
- [ ] No deprecated libraries or patterns
- [ ] File count reasonable (<370 lines for AGENTS.md)
- [ ] Links to deeper docs still valid
- [ ] CLAUDE.md, if present, imports AGENTS.md with `@AGENTS.md` (no duplication)
- [ ] Cursor rules and Copilot instructions reference AGENTS.md
If any fail, update AGENTS.md and re-verify.Metrics
Track context file health over time:
// scripts/measure-context-health.ts
interface ContextMetrics {
agentsMdLines: number;
commandsVerified: number;
commandsStale: number;
lastFullAudit: Date;
stalenessScore: number; // 0–100, higher is better
}
function calculateMetrics(): ContextMetrics {
const content = readFile("AGENTS.md");
const lines = content.split("\n").length;
const verified = (content.match(/✓ \d{4}-\d{2}-\d{2}/g) || []).length;
const stale = (content.match(/✗ \d{4}-\d{2}-\d{2}/g) || []).length;
const stalenessScore = (verified / (verified + stale)) * 100;
return {
agentsMdLines: lines,
commandsVerified: verified,
commandsStale: stale,
lastFullAudit: new Date(), // Manually update
stalenessScore: Math.round(stalenessScore),
};
}Log metrics in CI and track over time. Alert if stalenessScore drops below 80%.
See also
/docs/context-files/agents-md- AGENTS.md spec/docs/context-files/anti-patterns- stale content patterns/templates/discovery/AGENTS.md- starter template