@@ -66,6 +66,18 @@ is why the Claude-CLI gateway backend exists. Run tests with
6666` .venv/bin/python -m pytest ` . ** Never run ` pytest -m live ` casually — those call
6767paid APIs and cost real money.**
6868
69+ > ** The subscription buys inference, not agency.** ` ClaudeCodeCLIChatModel `
70+ > implements no ` bind_tools ` , so it ** cannot drive ` grapharc agent ` ** — the very
71+ > milestone this handoff leads with. That is deliberate, not unfinished: `claude
72+ > -p` is itself a full agent with its own tools and its own loop, and letting it
73+ > call tools would put the control plane inside a subprocess GraphARC cannot see
74+ > or veto, which is the architecture this project exists to replace. So the
75+ > adapter strips it to pure inference (` --disallowedTools ` , `--setting-sources
76+ > ""`, empty cwd, no session). Consequence to plan around: any node that needs a
77+ > model to * think* runs free on ` claude-cli ` ; any node that needs a model to
78+ > * drive tools* needs OpenRouter and real money. ` grapharc agent ` refuses with a
79+ > clear error rather than degrading.
80+
6981> ### The ` -qq ` trap — read this before you believe a test run
7082>
7183> ` addopts ` in ` pyproject.toml ` is `-q -m 'not live' --strict-markers
@@ -284,23 +296,41 @@ choose which one that is.
284296
285297` ARCHITECTURE.md ` §7 is the current, re-derived gap analysis — ** read it rather
286298than trusting a copy here** , since a copy is exactly what went stale last time.
287- In one line each, the five gaps it names:
288-
289- 1 . ** Nothing shipped drives the loop.** ` grapharc.planner ` is imported by no
290- other module: no CLI command, no example, no session graph. The cycle is a
291- library API proven by tests, not something a reader can invoke and watch.
292- ** This is the highest-value thing left.**
293- 2 . ** Policy does not reach admission.** ` grapharc.policy ` parses a TOML document
294- that already understands ` node ` /` edge ` /` tool ` /` spend ` rules;
295- ` AdmissionChecker ` takes an ` EdgePolicy ` assembled in Python. No bridge.
296- 3 . ** The HTTP API and the session runtime are two different things.**
299+ Four of the five gaps that version named are now closed. What is left:
300+
301+ 1 . ** The HTTP API and the session runtime are two different things.**
297302 ` grapharc/server ` has its own ` InProcessRuntime ` whose sessions die with the
298- process. The durable, cross-process ` grapharc/session ` is not what it uses.
299- 4 . ** The shipped graphs do not use durable memory.** Every ` grapharc run `
300- constructs the in-process ` MemoryStore() ` , though ` SQLiteMemoryStore ` is
301- verified durable across processes.
302- 5 . ** Admission authorises a kind, not its arguments** — a boundary, not a seam,
303+ process and whose approvals are recorded without being delivered. The
304+ durable, cross-process ` grapharc/session ` is not what it uses. ** The last
305+ seam, and the highest-value thing left** (ROADMAP §12.3).
306+ 2 . ** Admission authorises a kind, not its arguments** — a boundary, not a seam,
303307 and the one most likely to be over-read. See * Known limits* .
308+ 3 . ** The source is not on the public remote.** 15 commits unpushed; the
309+ documented install fails at ` uv sync ` . ` origin/main ` is an ancestor of HEAD,
310+ so a plain ` git push ` fast-forwards.
311+
312+ Closed since, each with a shipped caller and tests:
313+
314+ - ** ` grapharc plan <goal> ` ** drives propose → admit → materialise → execute →
315+ replan, printing every round and its rejection codes. Scripted and free by
316+ default; ` --model ` for a real backend, ` --registry module:attr ` for your own
317+ kinds. ` grapharc/examples/plan_incident.py ` is the demo registry, built so the
318+ default run * shows* a refusal: ` deploy ` is registered and every edge into it
319+ denied, so round 1 is refused on ` edge_denied ` and round 2 replans without it.
320+ - ** ` PolicyEngine.edge_policy(tenant=…) ` ** compiles the TOML document's ` edge `
321+ rules into the ` EdgePolicy ` ` AdmissionChecker ` consults, and `grapharc plan
322+ --policy` is the caller. The test that matters: with a ` * ->deploy` deny rule in
323+ the file round 1 is refused; delete the rule and the same run admits it. The
324+ document constrains the run rather than answering questions about one.
325+ - ** ` grapharc run --memory PATH ` ** hands ` stage6 ` and ` capstone ` the durable
326+ ` SQLiteMemoryStore ` . In-process stays the default. Proved across a real
327+ process boundary, not just in one interpreter.
328+ - ** ` cost_usd ` on trace events.** Both gateways publish the provider's price
329+ through the same ` llm_output ` envelope; the runtime's usage callback writes it
330+ onto the node's ` end ` event and an agent writes the per-call figure onto each
331+ ` model ` event. ` recorded_cost_usd ` is a measurement again, and a backend that
332+ reports no price still falls back to a ` RateCard ` estimate without the two
333+ mixing.
304334
305335---
306336
0 commit comments