How it works
The ownership map
| Capability | Owner | Switched off elsewhere | Enforced by |
|---|---|---|---|
| Memory across sessions and branches | Hindsight | Context+ upsert_memory_node, create_relation, search_memory_graph, prune_stale_links, add_interlinked_context, retrieve_with_traversal · OmO Kibitzer | deny rules · OmO not installed |
| Live code structure and semantic search | Context+ get_context_tree, get_file_skeleton, semantic_code_search, semantic_identifier_search, semantic_navigate, get_blast_radius | Hindsight codebaseSurvey, the “Component map” page | Hindsight config |
| Writing and undoing code | Edit / Write + git | Context+ propose_commit, list_restore_points, undo_change | deny rules |
| Lint, types, tests | the repository’s own scripts | Context+ run_static_analysis | deny rule |
| Feature-to-code maps | Hindsight knowledge pages | Context+ get_feature_hub | deny rule |
| One disciplined change | ultrawork skill | OmO harness | keyword hook |
| Parallel multi-agent job | ultrawork-graph skill | OmO harness, graph-engineering’s orchestration trigger | keyword hook · narrowed description |
| Knowledge graph as a product | graph-engineering + /devstack:kg-* | — | — |
The rule behind every row: if two tools hold the same kind of state, they drift apart, and the agent picks one or the other at random.
The four enforcement layers
1. Deny rules remove tools from context
A bare tool name in permissions.deny removes that tool from Claude’s context, not just from execution. devstack adds one rule per overlapping Context+ tool:
"permissions": {
"deny": [
"mcp__plugin_devstack_contextplus__upsert_memory_node",
"mcp__plugin_devstack_contextplus__propose_commit",
"…"
]
}
2. Hindsight config switches off what Context+ covers
{
"codebaseSurvey": false,
"pages": { "Component map": false },
"toolGuideExtra": "Hindsight is the only memory system in this setup. …"
}
Hindsight’s other four knowledge pages stay on: Core concepts, Conventions and patterns, Key decisions and rationale, and Initiatives. They hold the why that code can’t show.
3. Context+’s server instructions are removed
Context+ sends a set of instructions with every connection. Among other things, they tell the agent to use its memory graph before every task, to call a cache server devstack doesn’t install, and to write code only through propose_commit. Every one of those conflicts with the map above, so the installer deletes the file they’re read from (agent-instructions.md). The tools still work without it.
4. Two hooks route the work
- SessionStart prints
routing.md, the map in prose, into every session. - UserPromptSubmit scans the prompt for
mass ulw/mass ultrawork(routes toultrawork-graph) andulw/ultrawork(routes toultrawork). For any other prompt it prints nothing, so it costs no context.
Why each tool kept what it kept
- Hindsight keeps memory because it’s the only one of the four that builds memory automatically from git history and past sessions. It shares one bank per repo across every agent and consolidates facts into observations instead of piling them up.
- Context+ keeps structure because it reads the code as it is now: AST, embeddings, call sites. A survey or a memory of the structure goes stale with the next commit.
- Edit and git keep writes because Claude Code’s own edit, checkpoint and permission flow already covers them, and a second undo history would contradict git.
- OmO keeps its ideas, not its harness. OmO is a separate agent (a fork of pi), not a Claude Code add-on. Its
ulwdiscipline andmass ulwfan-out are reimplemented as Claude Code skills and subagents. - graph-engineering keeps knowledge-graph design, for graphs you build as a product. Its task-graph rules (fake edges, the diamond, the stop rule, the human gate) are what
ultrawork-graphfollows.