Problem
CLAUDE.md and AGENTS.md both describe TXLookup as a Python async agent in agent/main.py orchestrating tools through agent/executor.py with state in agent/memory.py. New contributors (and AI agents — this skill just hit it) read those docs first and waste context inferring an architecture that isn't shipped.
The actual runtime:
- The live agent loop is TypeScript in
app/lib/agent.ts (1348 lines), called from app/api/agent/route.ts as an SSE stream
- Specialists live in
app/lib/specialists.ts (898 lines), not agent/specialists/*.py
- Doom-loop guard is
app/lib/doomLoop.ts (the Python agent/doom_loop.py is the historical port)
agent/main.py, agent/executor.py, agent/memory.py are all skeletons full of # TODO: Codex — placeholders and aren't imported anywhere
What IS still Python and load-bearing:
agent/planner.py (484 lines, used by mcp/server.py + tests)
agent/tools/data.py (Socrata client, used by mcp/server.py)
agent/tools/miro.py (used by mcp/server.py)
agent/specialists/dataset_scout.py + ingestor.py (cron workers via .github/workflows/)
Fix
Rewrite the "Quick Context", "Key Files", and "Architecture" sections of both docs to reflect reality:
- Frontend + agent runtime + API: TypeScript in
app/
- MCP surface + cron workers (scout, ingestor): Python in
agent/ + mcp/
- Source-of-truth files:
app/lib/agent.ts, app/lib/specialists.ts, app/lib/doomLoop.ts, app/api/agent/route.ts, agent/planner.py, agent/specialists/, mcp/server.py
Drop agent/main.py from the key-files table or mark it explicitly as historical.
Code pointers
CLAUDE.md:13-19, 60-72 — the misleading sections
AGENTS.md:14-22, 32-77 — same drift
app/lib/agent.ts, app/lib/specialists.ts — actual runtime
agent/main.py, agent/executor.py, agent/memory.py — stubs to flag
Acceptance
Problem
CLAUDE.mdandAGENTS.mdboth describe TXLookup as a Python async agent inagent/main.pyorchestrating tools throughagent/executor.pywith state inagent/memory.py. New contributors (and AI agents — this skill just hit it) read those docs first and waste context inferring an architecture that isn't shipped.The actual runtime:
app/lib/agent.ts(1348 lines), called fromapp/api/agent/route.tsas an SSE streamapp/lib/specialists.ts(898 lines), notagent/specialists/*.pyapp/lib/doomLoop.ts(the Pythonagent/doom_loop.pyis the historical port)agent/main.py,agent/executor.py,agent/memory.pyare all skeletons full of# TODO: Codex —placeholders and aren't imported anywhereWhat IS still Python and load-bearing:
agent/planner.py(484 lines, used bymcp/server.py+ tests)agent/tools/data.py(Socrata client, used bymcp/server.py)agent/tools/miro.py(used by mcp/server.py)agent/specialists/dataset_scout.py+ingestor.py(cron workers via .github/workflows/)Fix
Rewrite the "Quick Context", "Key Files", and "Architecture" sections of both docs to reflect reality:
app/agent/+mcp/app/lib/agent.ts,app/lib/specialists.ts,app/lib/doomLoop.ts,app/api/agent/route.ts,agent/planner.py,agent/specialists/,mcp/server.pyDrop
agent/main.pyfrom the key-files table or mark it explicitly as historical.Code pointers
CLAUDE.md:13-19, 60-72— the misleading sectionsAGENTS.md:14-22, 32-77— same driftapp/lib/agent.ts,app/lib/specialists.ts— actual runtimeagent/main.py,agent/executor.py,agent/memory.py— stubs to flagAcceptance
app/lib/agent.tsfor the agent loop