Beyond LangGraph Gap Plan Completion Audit¶
Date: 2026-09-30 (external state re-verified 2026-10-14)
Branch: beyond-langgraph-p4
Status: P4–P8 engineering-complete. v0.1.0 is published on GitHub with docs,
CI, release and benchmark workflows green, and both repositories report zero
in-repo-defect advisories (the one remaining fork advisory has no upstream fix
release). Registry publishing stays deferred by the 2026-10-10 scope decision;
the five external pilots are the only outstanding objective, and they require
people outside the repository.
Commit hashes quoted below identify checkpoints in the pre-squash private history and do not resolve in the public single-commit repository; the evidence they anchor is the test file named next to each hash. DeerFlow fork hashes refer to the separate
deer-flow-reactivecheckout.
Evidence summary¶
P4 — Explainable Runtime Closure: complete¶
| Requirement | Evidence |
|---|---|
| Declared and actual write-conflict explanation | python/reactivegraph/tests/test_observability.py; commits 7a84cae |
| Historical run explanation | test_driver_historical_explain_run_after_restart; commit 95e40ee |
| Causal trace JSON/DOT | test_export_causal_trace_json_and_dot; commit d55fd31 |
| Token/USD savings estimate | test_cost_saved_reports_declared_task_estimates; commit 6608267 |
P5 — Agent Orchestration Parity+: complete¶
| Requirement | Evidence |
|---|---|
| Bounded parallel tool calls with order/error isolation | test_prebuilt.py::TestParallelToolCalls; commit 932b6e6 |
| Versioned native agent state schema | TestAgentStateSchema; commit 91ace51 |
| Interrupts and human transactions | TestAgentInterrupts; commit 3c0e0bc |
| Permissions/budgets before side effects | test_driver_*policy*; commit e82253c |
| MCP adapter with reactive metadata/artifact | tests/test_mcp.py; commit 798e2c1 |
P6 — Production Runtime Hardening: complete¶
| Requirement | Evidence |
|---|---|
| Token rotation and tenant limits | test/gateway.test.ts; commit 644a198 |
| OTLP JSON export | test/controls.test.ts; commit 6e97f33 |
| Bounded spans + p50/p95/p99 metrics | test/controls.test.ts; P6 hardening branch |
| Atomic token rotation + concurrent auth-race coverage | test/gateway.test.ts; P6 hardening branch |
| Bounded slow-consumer backpressure + session metrics | test/gateway.test.ts; P6 hardening branch |
| 1,000 threads / 10,000 nodes / compaction | test/runtime.test.ts, test/durability/recovery.test.ts; commit fc3515d |
| Health/readiness, graceful shutdown, deploy artifacts | CLI tests and generated Docker/Compose; commit 7af7b97 |
| Restart-storm recovery | test/durability/recovery.test.ts; test/runtime.test.ts; commits 0a1e091, 9698773 |
| Memory ceiling + leak bounds | RuntimeLimits/RuntimeStats LRU + fail-closed ceilings; commit 9698773 |
P7 — Ecosystem and Migration: complete¶
| Requirement | Evidence |
|---|---|
| Read-only LangGraph importer | tests/test_langgraph_import.py; commit 45960be |
| LangChain tool/message adapters | tests/test_tools.py; commit 7e877fd |
| OpenAPI/MCP auth/error semantics | tests/test_openapi.py, tests/test_mcp.py; commit 6b15a79 |
| Migration/agent/deployment docs | docs/migration-guide.md, docs/agent-cookbook.md, docs/production-deployment.md; commit 7d9a052 |
P8 — Release/community readiness: engineering-complete (external actions pending)¶
| Requirement | Evidence |
|---|---|
| Python package builds | 4/4 distributions build with uv build |
| TS builds | pnpm -r build |
| Documentation site/search | mkdocs build --strict + CI docs-site job |
| Benchmark artifact | differential-benchmark-matrix in benchmark workflow |
| Contribution/security docs | CONTRIBUTING.md, SECURITY.md |
| Reproducible issue templates | bug, feature, pilot, docs templates |
| Example gallery | docs/example-gallery.md |
| Competitive proof | docs/competitive-proof.md, all required matrices |
| Public roadmap tied to plan | docs/plans/roadmap.md |
| Clean-install matrix CI | GitHub Actions clean-install job: Python 3.10/3.11/3.12 and npm packages |
| Not yet done | five external pilots (public release shipped 2026-10-12; registry publication deferred by scope decision) |
Late finding: a selective-execution cost bug (2026-10-12)¶
The user asked what makes this engine better than LangGraph, and required the
answer to come from the real code rather than the docs. Driving the actual
Python path (RGP/1 + Node child process) instead of the benchmark's bare
Scheduler exposed a defect the published numbers could not see:
- A 1000-node graph with 10 changed inputs took 3969 ms end-to-end, not the 2.5 ms the component benchmark reported — a ~1500x gap between the measured component and the user-facing path.
- Executor invocation count proved the cost was pure overhead: the run invoked 0 task callbacks (selective skip worked) yet still burned seconds.
- Root cause:
DriverRuntimerebuilt the merged task input ({...store.raw, ...baseInput}) once per task in the dispatch loop. With a 1000-node store (~2000 keys) one V8 spread measured ~4.6 ms, so 1000 rebuilds cost ~3.1 s — O(n^2) in the graph size. - Fix: the merge is now lazy (
Scheduler.runTaskLazy) and only runs for tasks that actually execute. A first attempt that memoised a single shared object was rejected because it broke the per-task input-pollution isolation the dispatch loop guarantees.
| Path (1000 nodes, 10 affected, median of 3) | Before | After |
|---|---|---|
Bare Scheduler.runAll |
16.4 ms | 16.4 ms |
DriverRuntime.run (full TS engine) |
3104 ms | 255 ms |
Python invoke over RGP/1 + Node |
3969 ms | 257 ms |
Two documentation corrections came out of the same investigation, because the published ratios overstated what a user experiences:
docs/benchmarks.mdandcompetitive-proof.md§1a now state that the millisecond columns measure the bare DriverScheduleragainst upstream's end-to-endgraph.invoke().- Section 1b was added with the end-to-end numbers: against upstream's default
configuration the real ratio is ~23x, and against upstream with a
hand-written per-node
key_funcit is ~9x — a single-digit multiple, not four digits. The execution-count claim (1/1000 vs 1000/1000, and upstream needing an explicitkey_func) is unaffected and remains accurate.
The DeerFlow real-factory report's 7.19x/8.07x figures were annotated for the
same reason: create_agent builds its ReactiveGraph with no DriverHost, so
those numbers compare the in-process Python executor against the complete
LangGraph stack. Two further scope corrections were added on 2026-10-15:
(a) the fork side of that benchmark ran this repository's own baseline
re-implementation (benchmarks/deerflow_real/deerflow_reactive.py:1837), not
deerflow.agents.factory.create_deerflow_agent, and it excludes the middleware
chain; (b) the production factory path measures ~2.3x latency / ~4x concurrency
throughput, and with a real LLM the end-to-end wall time shows no advantage.
Regression guard: packages/driver/test/scheduler/task-input-scaling.test.ts
fails if a fully-skipped 1000-node run exceeds one second (it measured 4.1 s
before the fix).
Fresh verification record¶
The canonical serial gate was run on 2026-09-30 against the final
branch head with scripts/check-release-gate.sh:
reactivegraph 802 passed, 27 skipped
reactivechain 219 passed
reactivegraph-sdk 12 passed, 1 collection warning
reactivegraph-cli 10 passed
ReactiveGraph e2e 43 passed
DeerFlow offline 26 passed
JavaScript tests 255 passed (Driver 216, Protocol 17, other packages 22)
ruff clean
mypy clean (55 source files)
mkdocs build success (strict)
docs links 59 resolved
tutorials 8 executable scripts passed
clean install 4 Python distributions + publishable npm tarballs passed
git diff --check clean
Packaging and compatibility hardening re-verified on 2026-10-05 (core
main, commit 3a77ae8):
npm tarballs each of the four publishable packages now carries its own
README.md (previously absent, so the npm pages would
have rendered blank); check-clean-install.sh asserts this
docs link check 71 relative links resolved across 74 markdown files
(previously only docs/ was scanned, 59 links/59 files)
release gate PASS (all phases; 1166 Python tests + 258 JS tests + 69 benchmark tests)
compat extra langgraph 1.2.11 + langchain 1.4.4 + langchain-core 1.6.9+ +
langgraph-checkpoint-sqlite + aiosqlite installed in CI
CI 14/14 check-runs green; reactivegraph job reports 931
passed on Python 3.12 (incl. the 16 native Postgres
contracts) and 893 passed on 3.10/3.11 — the 3.12 delta
is the Postgres suite whose opt-in DSN CI sets.
Two real defects were found and fixed by turning those skipped assertions on:
SummarizationMiddleware.summary_prompt byte-identical to upstream again
(four stray blank lines removed)
test_is_final / langgraph on 3.10 stdlib typing.final does not write
__final__ before CPython 3.11; the
assertion is now version-aware and the
native fallback is always marked
Real-service provider evidence is intentionally reported separately from the hermetic local gate:
ReactiveGraph native PostgreSQL checkpoint/store 16 passed (PostgreSQL 15.4)
Driver real-service storage 8 passed (3 RedisCache + 5 PostgreSQL)
DeerFlow fork (deer-flow-reactive, separate checkout):
fork head at first audit ab0737f
backend full offline suite 19,098 passed, 168 skipped, 21 deselected
(equivalent to 606187b)
PostgreSQL retention 60 passed (real PostgreSQL)
PostgreSQL remaining suites 268 passed, 3 skipped (real PostgreSQL)
Redis Streams bridge 7 passed (real Redis 7.2)
frontend typecheck passed
frontend unit tests 1,969 passed
frontend E2E 299 passed
(CI-equivalent: 1 worker, 2 retries, 20.6m)
The ab0737f follow-up only normalizes the asyncpg DSN in one migration
fixture.
Superseded by later work on the same branch (re-verified 2026-10-05 at fork
head 6629cb53):
backend unit tests (4 CI shards) 19,101 passed, 82 skipped, 0 failed
(CI runs real postgres:17 + redis:7-alpine,
so the integration tests execute)
Redis Streams bridge 7 passed (real Redis, plus an end-to-end
publish -> replay -> end-sentinel check)
native Postgres checkpoint/store wired: config.type=postgres resolves to
reactivegraph.checkpoint.PostgresCheckpointSaver
and reactivegraph.store.PostgresStore
CI 9/9 check-runs green
The frontend E2E run covers the full Playwright suite, including the bookmark plugin fixture, plugin asset gateway, scheduled-task routing, sidecar scroll restore, thread ordering/archive, and mobile polish cases.
Provider scope is deliberately narrow and explicit:
- PostgreSQL checkpoint/store is a native ReactiveGraph Python provider.
- The Driver PostgreSQL adapter has separate real-service coverage.
- RedisCache is a native TypeScript Driver cache, not a Python checkpoint/store.
- The Redis Streams bridge lives in the DeerFlow fork and is evidenced there.
Code-quality hardening (2026-10-05, commit cd85809)¶
The quality review findings were all addressed, with behaviour pinned by differential tests rather than inspection alone:
cyclomatic complexity every D/E/F-grade function removed from
python/reactivegraph and python/reactivechain
(was 1 F + 4 E + 15 D; now 0 D and above).
ESLint now enforces the same ceiling for TypeScript
(complexity<=32, max-depth<=6, max-lines<=1250 down
from disabled). Turning it on found two real hotspots
and both were refactored: Driver `handleRequest`
(56 -> per-method handlers) and Scheduler `runTask`
(50 -> extracted skip/gate/invoke/conflict/retry
helpers)
oversized modules store.py 1755 -> 1437 lines + store_types.py (233)
+ store_ops.py (142); checkpoint.py 1678 -> 1377
lines + checkpoint_types.py (346); create_agent.py
2367 -> 1885 lines + streaming.py (349)
+ agent_state.py (60)
+ agent_middleware_tools.py (189)
+ agent_recursion.py (201). All keep the same public
surface via re-exports (`reactivegraph.store`,
`reactivegraph.checkpoint` and
`reactivegraph.create_agent` still expose every name
in their __all__). Every source module is now under
1500 lines (largest: messages.py at 1496;
create_agent.py went 2367 -> 1328)
docstring gate [tool.interrogate] in every package's pyproject.toml,
wired into scripts/check-release-gate.sh and the CI
Python job. Coverage is now enforced per distribution:
reactivegraph 81.7%
reactivechain 84.5% (was 41.8%)
reactivegraph_sdk 92.3% (was 21.2%)
reactivegraph_cli 100.0% (was 40.0%)
Nested closures, overload stubs, __init__ and dunders
are excluded as implementation details.
message_utils: E38->C17, E32->C16, D29->C12, D22->split
graph.py: E37->split into 4 helpers, E33->split
create_agent.py: F43->layout/graph-view helpers
serde.py: D27/D27/D24 -> C-level registries
behaviour pinning 4,100 randomized differential cases comparing the
pre-refactor and post-refactor message_utils byte for
byte: 0 mismatches
public docstrings 50.8% -> 95.5% (532/557 public defs)
mypy clean; the 21 `type: ignore[override]` entries in
reactivechain are gone (base declares read-only
properties), total ignores 111 -> 90
add_messages format="langchain-openai" now implemented (delegates to
langchain-core's converter, explicit error without it)
instead of raising NotImplementedError
docs nav completeness `scripts/check-docs.py` now fails when a published
page exists but is missing from `mkdocs.yml` nav —
the whole `tutorials/` tree (11 pages) had been
building yet unreachable from the site. 39 published
pages are now all reachable.
PEP 561 typing all four distributions now ship `py.typed` and the
clean-install gate asserts it. `reactivechain` had the
marker file but no `[tool.setuptools.package-data]`
entry, so it never reached the wheel; the other three
had no marker at all. Downstream type checkers now use
the inline annotations instead of reporting missing
stubs.
resource leaks `DriverHost.close()` now closes the child's
stdin/stdout/stderr pipes explicitly. Running the
suite with `-W error` went from 42 failures + 17
errors (PytestUnraisableExceptionWarning on unclosed
`_io.FileIO`) to a single GC-timing warning.
reverse LangChain `ReactiveGraph` and `AgentGraph` inherit
`langchain_core.Runnable` when it is importable (the
same optional-base pattern `reactivegraph.messages`
uses), and they now satisfy the *call* contract as well
as the identity check. Inheriting the base alone only
satisfied `coerce_to_runnable`; a follow-up audit drove
the real composed calls and found 7 of 7 failing —
`RunnableSequence` invokes steps as
`step.invoke(input, config)`, which the native
`(event, payload)` signature rejected, and
`AgentGraph.batch` treated LangChain's per-input config
list as a mapping
(`AttributeError: 'list' object has no attribute
'get'`). Now `graph_calls.py` resolves the call shape
(one positional argument = Runnable form, a declared
event name = native form, an undeclared string beside a
real `RunnableConfig` = Runnable form with a string
payload), single-event graphs infer their entry event,
multi-event graphs declare `b.entry(event)`, and
`batch`/`abatch` accept per-input config lists plus
`return_exceptions`. Ambiguities fail loudly:
`invoke("run")` without a payload, a bare-string
`batch`, and mistyped event names all raise with hints.
Measured: 10 of 14 new composition cases failed before
the change and all 22 pass after; the engine still
imports and runs with langchain blocked
(`_runnable_base()` returns no bases).
extension contracts `reactivegraph/protocols.py` publishes the supported
extension points as `runtime_checkable` Protocols:
`StoreProtocol`, `CheckpointSaverProtocol`,
`RetrieverProtocol`. They are structural (no base class
needed) and `check_protocol()` reports exactly which
methods are missing instead of failing deep inside a
run. The engine's own MemoryStore/SqliteStore/
CheckpointStore are asserted against them, alongside a
from-scratch implementation written for the test.
`MCPServer` (reactivechain/mcp.py) exposes native tools
over MCP JSON-RPC with `initialize`/`tools/list`/
`tools/call`, and mirrors `kind`/`reads`/`writes`/
`receipt` under `_meta.reactivegraph`. Combined with the
existing `from_mcp`, a tool survives a full protocol
round trip without degrading into an opaque effect.
`docs/extending.md` documents every extension point with
runnable signatures, the `pure`/`effect`/`opaque` rules,
and the "a pure task must not read the long-term store"
guard.
langchain ecosystem a new optional extra (`langchain-ecosystem`) pins
langchain-openai + langchain-anthropic, and
`tests/test_langchain_ecosystem.py` drives the REAL
`ChatOpenAI` against a local OpenAI-format server —
proving `create_agent(ChatOpenAI(...))` works end to
end rather than happening to work. CI installs the
extra and asserts the deps are importable, so the test
cannot silently skip. Core stays at four runtime
dependencies; the engine still owns the scheduler,
so receipts/conflicts/fingerprints are unaffected.
reads-scoped fingerprint the pure-task fingerprint now covers only a task's
declared `reads`, on **both** execution paths:
- the wire carries task `reads` to the Driver
(`_to_wire_spec`), and `WireTask`/`TaskDef`/
`RuntimeTask` all carry the field;
- the Driver resolves each read against `baseInput`
first (user input — stable across runs) and the store
otherwise (so an upstream task's new write still
triggers its downstream). Reading only `baseInput`
would miss the upstream case; reading the merged task
input would make every run look different.
Measured on a 1000-task graph with one field changed:
Driver 1/1000 executed, Python fallback 1/1000 (was
1000/1000 on both before the two fixes below).
pure-task store guard `store_get`/`store_put`/`store_delete` now raise when
called from inside a task declared `kind="pure"`. The
long-term store is not part of the state fingerprint,
so such a task could be skipped even after an earlier
run wrote new data — the DeerFlow memory port did
exactly that and silently returned stale memory.
`kind="opaque"` is the correct declaration and is
covered by a positive test. Regression tests:
`TestPureTaskStoreGuard` (reject + allow).
fallback fingerprint the in-process fallback fingerprint now covers a
task's declared `reads` paths instead of the whole
state. With whole-state keys, changing one field
invalidated every task, so a 1000-task graph re-ran
all 1000 — while the Driver path skipped unaffected
tasks. A/B on the same 1000-task graph: 1000/1000
executed (969ms) before, 1/1000 (151ms) after.
Tasks that declare no `reads` keep the conservative
whole-state key, and non-JSON inputs still never
cache. Regression test:
`test_fallback_fingerprint_uses_declared_reads_not_whole_state`.
concurrent isolation `ReactiveGraph.invoke` now forwards
`config.configurable.thread_id` to the Driver. It
previously always used the Driver's "default" store,
so two concurrent invokes under distinct thread ids
shared and clobbered one run's state (~1-3% of rounds).
A/B evidence on the same 300-round stress case:
3/3 failures before, 3/3 passes after. Regression test
added as TestConcurrentThreadIsolation.
CI verification (resolved)¶
Three consecutive CI runs on main (heads 9f39a8b6, 5e6f86d7, and the
queued 02f359c2) completed with the run-level conclusion failure even
though no job reported a failure. Per-job inspection shows the affected
jobs never started:
- job
started_atis set, but no step logs exist and the log blob returnsBlobNotFound; - the jobs sit for exactly 15 minutes and are then cancelled by the platform.
GitHub's status page confirms the cause — an incident opened at
2026-10-05T19:11:58Z reporting "delays in assigning GitHub-hosted runners,
affecting workflow start times across multiple runner configurations" — which
matches the first affected run. The code itself is verified locally:
scripts/check-release-gate.sh --python --static EXIT=0
reactivegraph 880 passed, 16 skipped
reactivechain 221 passed
reactivegraph-sdk 12 passed
reactivegraph-cli 10 passed
ruff clean (63 source files)
mypy clean
docstring gates 81.7 / 84.5 / 92.3 / 100.0 all PASSED
docs nav 39/39 published pages present
flake check three consecutive full-suite runs, 880 passed each
Resolved. After GitHub's runner-assignment incident cleared, CI on
9218454 reported 14/14 jobs success (JavaScript, Python 3.10/3.11/3.12,
ReactiveChain 3.10/3.11/3.12, Coverage gate, Docs checks, Docs site build, and
all four Clean-install jobs). The local gate above remains the reproducible
record of what those jobs assert.
External blockers¶
These requirements cannot be satisfied from this git worktree. State re-verified on 2026-10-05:
| Required state | Current evidence |
|---|---|
NPM_TOKEN secret |
Actions secrets API: total_count: 0 — still absent (account action) |
PYPI_TOKEN secret |
Actions secrets API: total_count: 0 — still absent (account action) |
npm @reactivegraph scope |
registry returns 404 for @reactivegraph/protocol — org not created |
| npm authentication | npm whoami returns ENEEDAUTH — not logged in locally |
public main branch/code |
resolved — from000/reactive-graph public, main = single squashed commit, CI 14/14 green |
| docs site | resolved — GitHub Pages enabled (workflow build), https://from000.github.io/reactive-graph/ serves 200, search_index.json 200 |
| repository metadata | resolved — description, homepage, 8 topics, community profile 100%, Discussions enabled |
| public release workflow | resolved — release workflow dispatched on main and completes green; publish steps skip with a notice until both tokens exist |
| differential benchmark workflow | resolved — dispatched on main, all three jobs green, differential-benchmark-matrix + realworld-report artifacts uploaded |
v0.1.0 public tag |
resolved — annotated tag on the single main commit; GitHub Release published (not a draft) |
| external pilot users/teams | no external pilot participation yet |
PyPI reactivegraph project |
PyPI JSON API returns 404 — still unpublished (account action) |
The exact actions needed are in RELEASE_CHECKLIST.md.
Post-release hardening completed 2026-10-13:
security posture secret scanning + push protection + Dependabot
security updates all enabled (verified via REST API);
private vulnerability reporting enabled; zero open
Dependabot alerts at the time of this record
PR refs audit 19 refs/pull/* heads fetched and inspected: each is
an independent 2-commit Dependabot snapshot (squashed
root + bump), none is an ancestor of main, and a
regex + filename scan over every reachable blob found
no key material, .env/.pem/.key files or credentials
clean install Python 3.12 venv outside the repo installed
reactivegraph==0.1.0 + reactivegraph-cli from
git+ssh://git@github.com/...; the CLI entry point ran;
a selective-execution probe executed 2/2 tasks then
skipped 2/2 on an identical re-run
fork E2E on main first full browser E2E run on the public default
branch: 299 passed + 5 auth-recovery passed
(the E2E workflow gained workflow_dispatch so it can
be re-run on demand)
fork head `from000/deer-flow-reactive` main advances to
`16f3c447` (docs: state the remaining langgraph
types, not execution code); Lint/Unit/Frontend
workflows green on `main` and
`reactivegraph-checkpointer`
Post-release hardening completed 2026-10-14:
pilot funnel both READMEs link the pilot invitation AND the
pre-filled issue form directly; Discussion #20 carries
the same CTA; the `Pilot user` template is registered
with the `pilot`/`community` labels;
`.github/ISSUE_TEMPLATE/config.yml` adds Discussions
and private-vulnerability-reporting contact links;
CODE_OF_CONDUCT.md names an enforcement contact;
the from000/deer-flow-reactive fork links the same
invitations from README.md and REACTIVEGRAPH*.md
dependency security main repo: 0 open Dependabot alerts (6 fixed);
fork: 31 -> 1 open alert. The single remainder is
`braces <= 3.0.3` (high, stack-exhaustion DoS). It is
unreachable-to-fix in-repo: no patched release exists
for ANY major line (npm's newest braces is 3.0.3, the
vulnerable one; the advisory's first_patched_version
is empty). Tracked upstream and documented in
REACTIVEGRAPH*.md, not silenced.
langchain-anthropic is pinned `>=1.4.6,<1.5` because
1.5+ pulls anthropic 1.x whose `_format_messages`
drops the no-model call form the gateway relies on
(pinned by tests/test_tool_call_args.py).
pilot onboarding audit a fresh-venv walkthrough of the documented install
found and fixed three real pilot blockers:
quickstart promised Driver/`DriverHost` examples right
after a core-only `pip install` (they need a source
checkout + built Node Driver + the previously
undocumented REACTIVEGRAPH_DRIVER_ENTRY), it never
stated Node/pnpm prerequisites, and it gave no
expected output so a pilot could not self-check.
Both READMEs gained an install-troubleshooting note
for the local `insteadOf`/proxy TLS failure mode.
Re-verified: quickstart prints `hi Ada`,
`reactivegraph health` prints `reactivegraph 0.1.0
ready`, docs link check passes.
pilot value demo quickstart gained a "Selective execution (the point)"
section: a self-contained `kind="pure"` example whose
verbatim run prints {'a': 1, 'b': 1} / {'a': 1, 'b':
1} / {'a': 2, 'b': 1} and explains
executed=2 skipped=1 cache_hits=1. Previously no
quickstart path demonstrated the differentiating
capability at all. Verified by executing the fenced
block itself and diffing the output against the
documented block.
canonical release gate `scripts/check-release-gate.sh` executed phase by
phase on 36ef42b and every phase PASSED:
--python 915+229+12+10 = 1166 tests, 16 skipped,
working-tree diff check clean
--js typecheck, lint, format, 258 vitest
tests (241 driver + 17 sdk-js), build
--benchmarks 43 cross-language e2e + 26 DeerFlow
offline port
--static ruff clean, mypy clean (66 files),
docstring coverage 82.3/84.3/92.3/100%,
all >= the 80% gate
--docs mkdocs --strict build, 78 links across
75 files, 8 tutorial scripts ran
--clean-install Python wheels + npm tarballs installed
into fresh environments; all four
imports, CLI ownership (reactivegraph ->
reactivegraph-cli), `reactivegraph
health`, a graph invoke and an npm sdk
invoke all verified
(This sandbox's `uv` cannot reach PyPI — `tls handshake
eof` — so the runs were made with UV_OFFLINE=1 and a
pre-populated wheelhouse; CI runs the same gate with
real network.)
native Postgres 16/16 contract tests pass against a real local
PostgreSQL (ReactiveGraph native PostgresCheckpointSaver
+ PostgresStore). The 7 stale "PostgresStore not
implemented yet" guards were removed, so CI's
postgres:16 service now exercises all 16 contracts
instead of silently skipping 7. Python suite: 915
passed, 16 skipped.
final main head 6904c46 — single commit, tag v0.1.0, CI 14/14 + release
green
fork head bff1731d — Lint/Unit/Frontend/E2E/Blocking-IO green on
18f03f1a (the dependency commit); only docs follow up
Conclusion¶
All requirements that can be implemented and verified inside the repository are
complete, including CI, GitHub Pages docs deployment, the release workflow and
the differential benchmark workflow on the public single-commit main.
Distribution scope (decided 2026-10-10): v0.1.0 ships from GitHub source.
The npm and PyPI publication steps are deferred — the @reactivegraph npm
organization does not exist and no registry tokens are configured — and every
install instruction in the READMEs and docs uses the working GitHub form
(pip install "git+https://github.com/from000/reactive-graph.git#subdirectory=...",
plus a source build for the TypeScript packages, whose pnpm workspace:*
dependencies npm cannot resolve). That form was verified end-to-end in clean
virtualenvs: all four Python packages install together and the README
quickstart runs; installing reactivechain alone fails dependency resolution,
which is why the docs require the four-package command.
The objective is not globally complete because confirming five external pilots
requires people outside the repository. Registry publication remains deferred
rather than blocked work: the release gate PASSes, twine check PASSes on all
8 distributions, and the npm publish dry-runs PASS on all 4 tarballs, so a
future publish is one token upload away.