Appearance
date: 2026-06-09 tags: [harness, hooks, config, desync, ownership] status: graduated graduated_to: .claude/rules/skills.md
Consumer config co-locates with its owner; engines stay generic
Symptom — two desync shapes caught in one PR review (#388): agent descriptions naming their dispatchers ("Dispatched by check-reasoning, qa-code…"), and the gate hook's per-skill config headed for the hook's directory (hooks/gates/brainstorm.conf) — a foreign directory naming a skill.
Root cause — cross-references that live on the wrong side of an ownership boundary rot silently: rename or delete the owner and the stale reference/config lingers with nothing to flag it.
Fix — descriptions state what the thing is (dispatcher lists stripped from all five agents); the gate's config ships as gate.conf inside the consuming skill's own directory, discovered by glob (.claude/skills/*/gate.conf) — the engine (.claude/hooks/gate.sh) holds zero skill knowledge. Delete the skill, its gate dies with it. (SHAs 05ee3ee, f99c113.)
Guard — graduated into .claude/rules/skills.md ("Describe what it is, never who calls it" + config co-location). Candidate harness:check lens: flag Dispatched by/used by in agent/skill descriptions.