Experimental, and Claude Code only (hooks are a Claude Code feature). Off by default.
How it works
Two switches, by design
The hook is installed locally but controlled remotely:- Installed by
driftless install-skillinto the repo’s.claude/settings.json. It stays there, inert. - Activated by a workspace admin at Settings → Automations, a single toggle (
settings.auto_pull_context). The glue reads it on each run (cached ~60s), so flipping it off makes the hook a no-op for the whole workspace, without anyone touching a local file.
driftless hooks disable there.
hook and hooks are two different commands, not a typo. driftless hook is the runtime glue Claude Code invokes (pre-edit, post-edit, stop, sync); you never run it by hand. driftless hooks is the management command (enable / disable) that installs or removes the hook entries in .claude/settings.json.Why it’s the payoff of governance
Only Knowledge (reviewed) topics auto-inject. A Note is a hint, not the team’s truth, so it never reaches the agent automatically. This is why adding a note to knowledge is literally what makes your agents start coding with it. The owner/admin decision and the hook are the same loop: review → merge (by an owner/admin, or an agent they ask) → the hook delivers it → the agent gets it right.
Cost & safety
Built so it can’t run away with your tokens or block your editor:- Reviewed + System only. Drafts and early-stage notes never inject.
- Deduped per session. Edit the same area five times → its context injects once, not five.
- Size-capped. A signal-first brief under a fixed ~2k-token budget: every matched topic’s invariants and gotchas come before any topic’s decisions, drawn round-robin so one verbose topic can’t crowd out the rest. Never the whole topic.
- No-op on miss or slowness. No matching reviewed topic, or a slow API → nothing injected.
- Never blocks. The hook always exits cleanly; a failure can’t stop your edit.
