I've been building CNF a Racket library that gives coding agents a semantic working copy instead of text files. Source code is claims about stable identities, not strings — a call site points at a function's entity, not at matching characters, so renaming is one claim, not find-and-replace.
The novel part isn't "identity not regex" — LSPs and rope already do that. It's the substrate: one claim graph across languages (Racket/Python/Beagle), supersession by default (history + temporal queries free), agents composing each other's persistent Datalog rules, and an MVCC daemon for multiple agents on one live graph. 30-tool MCP server is the control surface.
Early eval: CNF agent 30/30 vs text agent 26/30 on structural edits, with hidden API-contract tests catching the difference. Caveat: that baseline was regex — weak opponent, rerunning against rope next. The real bet is that the bottleneck for agent code editing is the substrate, not the algorithm.
raco pkg install cnf · GitHub - tompassarelli/claim-normal-form: Racket implementation of Claim Normal Form — in-memory kernel + Datalog query engine · GitHub · 379 tests
Feedback welcome, especially from the agent-tooling crowd.