Skip to content

Commit cc70cfa

Browse files
0.1.5: the PyPI page catches up, and the downloads count joins the badges
A docs-and-demo release — no runtime code changed. The badge row gains downloads/month; the version bump exists so pypi.org rerenders the README that now opens on the graph and no longer calls the project unstable. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
1 parent d3090c0 commit cc70cfa

8 files changed

Lines changed: 15 additions & 10 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,10 @@ and "used to be true" — the two things a reader most needs kept apart.
77

88
Entries are newest-last within a release, matching the order they were written.
99

10+
## 0.1.5
11+
12+
- a documentation and demo release; no runtime code changed between `0.1.4` and this wheel. The demo film was re-cut to open on the graph itself — frame one is the nine-node incident graph with its first node already running, then the question that built it, then the finished audited run — and the README now leads with it. The README and website stopped describing the project as early and unstable: the status line states the version and the testing discipline, and *Status and limits* became *Limits*, framed as edges that are documented and tested rather than confessed. A PyPI downloads badge joined the badge row. This release exists mostly so the PyPI project page, which renders the README frozen at publish time, catches up with all of it.
13+
1014
## 0.1.4
1115

1216
- a run **stopped for overspending reported spending nothing**. Tokens were attributed from `end` events, and a node the budget interrupts emits `error` instead — so `grapharc metrics` answered `tokens: 0` for a run whose own enforcement message named the figure that stopped it (`max_tokens reached (51/5)`). The audit trail lost precisely the number the stop was about, and per-node attribution dropped the most expensive node in the run. Every `error` event is now stamped with what its node spent, exactly as `end` is, and both `summarize` and the cost report count it; sub-events inside a node remain a breakdown of its total rather than an addition, so the disjointness that kept `ends + orphans` from double-counting is unchanged, and `RunCost.tokens == RunMetrics.tokens` still holds.

README.md

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
# GraphARC
1010

1111
[![PyPI](https://img.shields.io/pypi/v/grapharc.svg)](https://pypi.org/project/grapharc/)
12+
[![Downloads](https://img.shields.io/pypi/dm/grapharc.svg)](https://pypistats.org/packages/grapharc)
1213
[![Python](https://img.shields.io/pypi/pyversions/grapharc.svg)](https://pypi.org/project/grapharc/)
1314
[![CI](https://github.com/CodeGraphContext/GraphARC/actions/workflows/ci.yml/badge.svg)](https://github.com/CodeGraphContext/GraphARC/actions/workflows/ci.yml)
1415
[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)
@@ -21,7 +22,7 @@ A planner *proposes* a subgraph, a deterministic checker *admits* it — or refu
2122
- **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.
2223
- **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.
2324

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+
**Website:** [codegraphcontext.github.io/GraphARC](https://codegraphcontext.github.io/GraphARC/) · **Version:** `0.1.5` 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).
2526

2627
![A nine-node incident-investigation graph running live in the browser: triage fans out into four parallel evidence pulls, they join at correlate, then hypothesize, verify and report — each node amber while it runs and green with its own token bill when done. Then the one-line question that built it, and the finished, fully-audited run.](docs/media/grapharc-incident-demo.gif)
2728

@@ -514,7 +515,7 @@ A stable system is not one that claims to have no edges — it is one whose edge
514515
- **`.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.
515516
- **`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.
516517

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.
518+
**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.5` 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.
518519

519520
[ROADMAP.md](ROADMAP.md) tracks what is built and what is not, item by item.
520521

docs/cookbook/01-basics.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ projection instead and says which fields it dropped.
1414
`tests/test_cookbook_basics.py` reproduces every recipe here and asserts these
1515
exact strings, so the page cannot rot quietly.
1616

17-
Verified against `grapharc 0.1.4`, Python 3.14.6, `langgraph 1.2.9`,
17+
Verified against `grapharc 0.1.5`, Python 3.14.6, `langgraph 1.2.9`,
1818
`langchain-core 1.5.1`, `pydantic 2.13.4`.
1919

2020
Each snippet is a complete file. Save it and run it; nothing carries over between
@@ -41,7 +41,7 @@ uv run grapharc --version
4141
Output:
4242

4343
```
44-
grapharc 0.1.4
44+
grapharc 0.1.5
4545
```
4646

4747
Everything below uses only the base install — no API key, no network, no optional

docs/cookbook/06-serving-and-ops.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1062,7 +1062,7 @@ with TestClient(app) as client:
10621062
```
10631063

10641064
```
1065-
health : {'status': 'ok', 'version': '0.1.4', 'graphs': ['qa']}
1065+
health : {'status': 'ok', 'version': '0.1.5', 'graphs': ['qa']}
10661066
created: 201 queued
10671067
status : succeeded
10681068
answer : Budgets cap iterations, tokens and time.
@@ -1259,7 +1259,7 @@ graphs : qa
12591259
ctrl-c to stop
12601260

12611261
$ curl -s localhost:8124/healthz
1262-
{"status":"ok","version":"0.1.4","graphs":["qa"]}
1262+
{"status":"ok","version":"0.1.5","graphs":["qa"]}
12631263

12641264
$ curl -s -X POST localhost:8124/sessions -H 'content-type: application/json' \
12651265
-d '{"graph":"qa","input":{"question":"how do budgets work?"}}'

grapharc/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@
99
from grapharc.runtime.graph import GraphARC, WritePermissionError
1010
from grapharc.runtime.state import GraphARCState
1111

12-
__version__ = "0.1.4"
12+
__version__ = "0.1.5"
1313

1414
__all__ = [
1515
"GraphARC",

pyproject.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[project]
22
name = "grapharc"
3-
version = "0.1.4"
3+
version = "0.1.5"
44
description = "A graph engineering toolkit on LangGraph: typed state contracts, per-node write permissions, enforced budgets, and JSONL traces that double as replay points."
55
readme = "README.md"
66
license = "MIT"

tests/test_cookbook_basics.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555

5656

5757
def test_version_matches_the_page():
58-
assert __version__ == "0.1.4"
58+
assert __version__ == "0.1.5"
5959

6060

6161
# -- "How do I build and run my first graph?" ------------------------------

uv.lock

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)