You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
The graph opens the film, and the README stops apologising
The demo video is re-cut to lead with what people come for: frame one is
the nine-node graph already on screen, triage running amber — then the
question that built it, then the finished, audited run. The incident demo
is now the README's hero; the decompose gif moved down to the admission
gate section, where its approval flow belongs.
The README and site no longer call the project early or unstable. Version
0.1.4, every claim gated by a test, and a Limits section that documents
edges instead of denying them — renamed from "Status and limits", with
every anchor updated and the verified-pass snapshot refreshed (1,985
passed).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
Copy file name to clipboardExpand all lines: README.md
+14-12Lines changed: 14 additions & 12 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -21,11 +21,11 @@ A planner *proposes* a subgraph, a deterministic checker *admits* it — or refu
21
21
-**The worst-case cost is known before a graph runs, and the exact per-node bill after — even when it fails.** Admission prices the worst case against what is *left* of the budget; at runtime each node's spend lands on its own trace event, error and cancellation included. `recorded_cost_usd` is never an estimate.
22
22
-**One append-only JSONL trace file is the whole truth.**`replay`, `diff`, `metrics`, `viz`, cost attribution, OTel export and the live browser view all read the same file — the dashboard cannot disagree with the audit trail, because they are the same record.
23
23
24
-
**Website:**[codegraphcontext.github.io/GraphARC](https://codegraphcontext.github.io/GraphARC/) · **Status:**early days (`0.1.4`) — the API is not stable yet. Known limits are listed in [Status and limits](#status-and-limits); closed ones are in [CHANGELOG.md](CHANGELOG.md).
24
+
**Website:**[codegraphcontext.github.io/GraphARC](https://codegraphcontext.github.io/GraphARC/) · **Version:**`0.1.4` on [PyPI](https://pypi.org/project/grapharc/). Every claim on this page is enforced by a test you can run, and every release is gated by the full suite. The edges that remain are documented in [Limits](#limits); every defect ever closed is in [CHANGELOG.md](CHANGELOG.md).
25
25
26
-

26
+

27
27
28
-
*One question in, a governed graph out: a local model proposes the topology, the admission gate and a human approval decide, and the live view shows every node run — amber while executing, green when done. ([full-quality mp4](docs/media/grapharc-decompose.mp4))*
28
+
*The graph first, because it is the point: a local model turns one English question into this nine-node graph, the admission gate admits it, and every node lands green with its own bill on the trace. ([full-quality mp4](docs/media/grapharc-incident-demo.mp4))*
29
29
30
30
> *Graph engineering*: when one agent loop stops being enough, coordination becomes the engineering. Nodes do work (agent loops, model calls, deterministic functions, humans approving things), edges decide what runs next, and a typed shared state flows between them. GraphARC implements the discipline that makes such graphs production-grade rather than demos — the ideas emerging from the July 2026 loops-vs-graphs debate (Steinberger, Ng, et al.), the "Two Graphs, Two Jobs" split, and twenty years of pre-AI graph systems where every edge means something and every path can be explained.
31
31
@@ -174,7 +174,11 @@ state : goal='investigate the checkout outage' notes=['triage ran', 'patch r
174
174
175
175
Round 1 wanted to deploy and **never executed**. Round 2 went through the *same* checker and ran.
176
176
177
-
The output ends with a `trace :` path — under `.grapharc/runs/` by default — and a `watch :` line. With `grapharc serve --live-root .grapharc/runs` running in another terminal, that line is the exact URL of this run's live page (proposed graph in violet awaiting approval, amber while nodes run, green when done, replay scrubber after); without one, it is the command that starts it.
177
+
The output ends with a `trace :` path — under `.grapharc/runs/` by default — and a `watch :` line. With `grapharc serve --live-root .grapharc/runs` running in another terminal, that line is the exact URL of this run's live page (proposed graph in violet awaiting approval, amber while nodes run, green when done, replay scrubber after — and every node clickable for its status, bill, timeline and wiring); without one, it is the command that starts it.
178
+
179
+

180
+
181
+
*The live page through a full governed run: proposed, approved, executed. ([full-quality mp4](docs/media/grapharc-decompose.mp4))*
178
182
179
183
The `policy` line ends in `[registry-default]` — that is the **provenance**, and it is on the JSON payload too as `policy_source`. It matters because a policy can now come from four places: a `--policy` flag, a `grapharc.toml`, one an LLM generated on a first run, or the registry's own default. A generated run and an authored one look identical on the command line, so the source is the only thing that tells them apart afterwards.
180
184
@@ -483,17 +487,15 @@ uv run pytest -m live # real backends: spends money and quota
483
487
Live tests are deselected by default via `addopts` in `pyproject.toml`, so a plain `pytest` never reaches a real model — verified: a plain run reports 10 deselected. `--strict-markers` is on, and a misspelled marker is a collection error rather than a test that silently spends money.
484
488
485
489
486
-
## Status and limits
490
+
## Limits
487
491
488
-
Re-derived on 2026-07-28 by running each item, not by reading the commit log.
492
+
A stable system is not one that claims to have no edges — it is one whose edges are documented and tested. Everything below is re-derived by running each item, not by reading the commit log; most recently on 2026-08-05.
489
493
490
494
**Distribution**
491
495
492
-
-**`0.1.0` on PyPI reports the wrong `__version__`.** The published wheel's metadata says `0.1.0` — `pip show` and the project page agree — but the module inside it still carries `__version__ = "0.1.0a0"`, because it was built from a tree where only `pyproject.toml` had been bumped. PyPI releases are immutable, so `0.1.0` cannot be corrected in place; the fix ships in `0.1.1`. `pip install grapharc` works and `grapharc demo stage0` runs — this affects the version string alone.
493
-
-*Fixed:* the source **is** on the public remote now, so the documented `git clone && uv sync` path works. It was the ship-blocker for most of this project's life.
494
-
-*Fixed:* the package **is** on PyPI, so `pip install grapharc` works. Verified in a clean virtualenv: bare install, import, and `grapharc demo stage0`.
496
+
-**`0.1.0` on PyPI reports the wrong `__version__`.** The published wheel's metadata says `0.1.0` — `pip show` and the project page agree — but the module inside it still carries `__version__ = "0.1.0a0"`, because it was built from a tree where only `pyproject.toml` had been bumped. PyPI releases are immutable, so `0.1.0` cannot be corrected in place; every release since `0.1.1` carries the matching string, and a test now pins the two together.
495
497
496
-
**Built and unreachable** — this used to be the honest headline, four subsystems deep. One seam is left.
498
+
**One seam**
497
499
498
500
-**The HTTP API does not use the durable session layer.** It has its own `InProcessRuntime`, whose sessions die with the process and whose approvals are recorded without being delivered. [ROADMAP.md](ROADMAP.md) §12.3.
499
501
@@ -512,11 +514,11 @@ Re-derived on 2026-07-28 by running each item, not by reading the commit log.
512
514
-**`.env` and `grapharc.toml` follow the same discovery rule: the working directory, and nowhere else.** Neither searches parent directories — a run must not be governed by a file you did not know about, and must not be *billed* to one either. **This is a behaviour change:** the credential loader used to walk up to `/`, so a `.env` in an ancestor directory (a `$HOME` one on a shared box, a client project one above a demo checkout) was picked up silently. If you relied on that, move the file into the directory you run from, `export` the variable, or pass `env_file=` to name it explicitly. A real environment variable still beats any file.
513
515
-**`grapharc run` has no budget unless you give it one.** Set any of `--max-tokens`, `--max-iterations`, `--max-seconds`, or `--max-concurrency`; without them each dimension is unlimited and the gate admits a topology of any worst-case cost.
514
516
515
-
**Verified this pass:**`pytest` → 1,754 passed, 12 deselected (the live ones); `ruff check .` clean; all eight `grapharc demo` stages green, plus the `trace` / `metrics` / `viz` / `replay` tour against a freshly recorded demo trace; the wheel builds and imports all 116 submodules in a clean virtualenv with `[all]`. The test count is a snapshot, not a property of the project — `pytest` re-derives it in one command, which is the only reason it is quoted.
517
+
**Verified this pass:**`pytest` → 1,985 passed, 12 deselected (the live ones); `ruff check .` clean; all eight `grapharc demo` stages green, plus the `trace` / `metrics` / `viz` / `replay` tour against a freshly recorded demo trace; the wheel builds and imports all submodules in a clean virtualenv with `[all]`, and `0.1.4` on PyPI is that wheel. The test count is a snapshot, not a property of the project — `pytest` re-derives it in one command, which is the only reason it is quoted.
516
518
517
519
[ROADMAP.md](ROADMAP.md) tracks what is built and what is not, item by item.
518
520
519
-
Defects that have been **closed** — each with what broke, how it was found and what the fix actually guarantees — are in [CHANGELOG.md](CHANGELOG.md). They were moved there because a list headed *Status and limits* should say what is still true.
521
+
Defects that have been **closed** — each with what broke, how it was found and what the fix actually guarantees — are in [CHANGELOG.md](CHANGELOG.md). They were moved there because a list headed *Limits* should say what is still true.
0 commit comments