🧹 Drift Cleanup β€” goal-convergence-emitter

First execution batch of the #2217 drift audit Β· CC-native-first in action

interactive playground Β· DELETE 1 / KEEP 3 Β· subtractive adoption

πŸ“Š What this PR removes

1
hook deleted
212β†’211
total hooks
100β†’99
async hooks
3
KEEP (justified)

🎯 The goal machinery β€” DELETE 1, KEEP the M140 trio

Click a row for the rationale. The point of the no-drift rule: it discriminates, it doesn't just delete.

FileHooks eventVerdict

πŸ”» Why the emitter is a Shadow

Before (drift)

CC writes goal-current.json
β†’ ork's emitter reads it
β†’ re-writes goal-history.jsonl (dup)
β†’ emits goal_converged β†’ events.jsonl (no consumer)
β†’
After (native)

CC owns goal-current.json βœ“
stop/goal-tracker already writes history βœ“
budget ceilings stay in the M140 trio βœ“
~one async hook lighter

βœ… The KEEP is the interesting part

The M140 trio (prompt/goal-tracker + stop/goal-tracker + lifecycle/goal-budget-guard) stays β€” it enforces hard per-session turn/token ceilings (ORK_GOAL_MAX_TURNS_PER_SESSION=30, ORK_GOAL_MAX_TOKENS_PER_SESSION=250k) that native /goal has no equivalent for. Deleting it would lose a real safety guarantee. That distinction β€” DELETE the Shadow, KEEP the orthogonal β€” is exactly what shared/rules/cc-native-first.md codifies.

πŸ—ΊοΈ Where this sits in the register

Drift register (5 surfaces, all audited in #2217): this PR is batch A. Remaining: notification THIN (β†’terminalSequence), session-registry THIN, and the version-matrix + version-check thread (tied to adopting CC 2.1.163 requiredMinimumVersion).

PR companion to #2217 Β· rule: shared/rules/cc-native-first.md (merged #2216)