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
This is the steering roadmap for Context Graph Protocol: from contextgraph/1.0-draft to a frozen contextgraph/1.0 with a real ecosystem around it. It came out of a full read of the crates, the docs, the schema, and GOVERNANCE.md. Each item below is its own issue with the analysis, options, and acceptance criteria; this issue is the map.
Re-trued 2026-07-26 against the live issue list and origin/main @ 1ee9b1c. Checked boxes are closed issues; open boxes carry a one-line note on what has already landed against them, so the map states residue rather than original scope.
The organizing idea
The protocol's identity is "enforced by contract, not convention". The roadmap is therefore ordered around closing every gap where the repo claims more than it enforces — because each one is a place where the project's own critique of the blob-pipe applies to itself.
Two things have changed since this map was first drawn, and both change its shape:
Every declared capability gets specified semantics or is dropped, and every documented contract gets an enforcement path — before the freeze, because the family-compatibility rule makes additions cheap after 1.0 but removals impossible.
Decided — the spec-or-drop set, now fully resolved:
P1: Structured error codes on the wire #9 Structured error codes — type, wire and spec landed; Envelope::error_code() has zero callers, so malformed-input-tolerance passes on any error.
P2: MCP interop: a bridge in each direction #19 MCP bridge in each direction — no bridge, no server, no mcp directory. conformance-external.sh is now a ready-made green gate for direction 1, and the correlation-id dependency cleared in ADR 0002.
How this maps to the GOVERNANCE.md freeze criteria
Freeze criterion
Unlocked by
≥2 independent implementations pass conformance
#17 lowered the barrier and #59 finishes distribution; #28 is the leading candidate second implementation; #18/#19 create further occasions; #3 made it possible without reading Rust
60-day stabilization window
Driving the v0.2 list to zero starts the clock — every open normative issue resets it
From the pre-freeze triage of 2026-07-23 (five-way audit: freeze-criteria mapping, wire breaking-change analysis, conformance/CI enforcement audit, downstream pressure scan, and a completeness pass), re-trued 2026-07-26. Ranked by "breaking or impossible if deferred past the freeze" first, then by which GOVERNANCE criterion it unblocks.
Two of the top three have since closed: rank 1 (#48, extensibility) — the only item that genuinely could not be retrofitted post-freeze — and rank 3 (#50), decided in PR #60. Positions are kept so the ranking stays comparable.
Now the top live item. The single normative home still contains a §9 verify example that fails the repo's own schema, a U1 anchor collision, and no usage-report text at all. Freezing an incomplete normative home freezes ambiguity.
The normative paragraph landed, so the flip-conformant-deployments-to-non-conformant risk is gone; the implementation is still absent everywhere, including the reference host. Gates the oxagen CGEP provider — the leading candidate second implementation.
The concrete path to a genuine second implementation. The oxagen CGEP spec is written and explicitly waiting on the protocol.
Below the cut — cheap, do during the stabilization window: branch protection on main (#2's residue — context-reuse §3 was destroyed by an unprotected merge, and the 60-day clock deserves a guarded trunk); #29 canary CI, which would have flagged both current downstream drifts automatically; the schema $id domain (#58, handed over from #21) — context-graph-protocol.org has no DNS at all, so third parties dereferencing $id hit a dead host; #7's anchored-query probe, which rides #51's fixture work, with context/neighbors staying a 1.x extension; #54's one-line ContextQuery fix; and the additive-by-design pair #15 / #31, which should not block the freeze.
This is the steering roadmap for Context Graph Protocol: from
contextgraph/1.0-draftto a frozencontextgraph/1.0with a real ecosystem around it. It came out of a full read of the crates, the docs, the schema, andGOVERNANCE.md. Each item below is its own issue with the analysis, options, and acceptance criteria; this issue is the map.The organizing idea
The protocol's identity is "enforced by contract, not convention". The roadmap is therefore ordered around closing every gap where the repo claims more than it enforces — because each one is a place where the project's own critique of the blob-pipe applies to itself.
Two things have changed since this map was first drawn, and both change its shape:
Milestone:
v0.2 — protocol completenessEvery declared capability gets specified semantics or is dropped, and every documented contract gets an enforcement path — before the freeze, because the family-compatibility rule makes additions cheap after 1.0 but removals impossible.
Decided — the spec-or-drop set, now fully resolved:
upsert— removed by ADR 0004 §1; design preserved indocs/sketches/write-path.md.DataFlow.writesdeliberately kept, redefined as a consent-surface declaration.subscribe— removed by ADR 0004 §3. Pull was chosen over push and shipped ascontext/verify(SPEC §9 V1–V4); push is a notification-shaped 1.x addition.filters+ embedding negotiation —filtersremoved; the embedding half specified and enforced (E1 grammar, exact-match MUST, raw-wire probe,AcceptBadEmbeddingmisbehave mode).token_cost— ADR 0003, Option A with exact equality. Conformance recomputes rather than sums, so budget honesty is checkable rather than self-reported.context/resolve— not defined incontextgraph/1.0;capabilities.resolvedemoted to a forward-declaration; B3 answered per representation at P4.max_frames, RFC 3339 andas_ofall landed; the survivinggranted_atitem moved to P1: Enforcement residue: granted_at stamping, kinds-filter probe, representations witness, red-script check mapping #51.Still open:
SPEC.md:418claims G2 is "Verified byframe-validity" and no implementation of G2 exists.Envelope::error_code()has zero callers, somalformed-input-tolerancepasses on any error.StaleDigestprobe and digest self-consistency check are missing.http.rs:43has no auth API at all).required_status_checksat the merge gate (CI is advisory today) plus a README badge.[0.1.0].$idbullet was handed to P1: Point the schema $id at a resolvable host (Cargo.toml homepage fixed in #45) #58.Milestone:
contextgraph/1.0 freezeprotocol-surface.mdpromoted;GOVERNANCE.mdand the surface doc both now defer toSPEC.md.context/verify— pull-based frame revalidation, the answer to Specify subscribe (staleness push / frame invalidation) or drop it before the freeze #6.inspect host --json, CI-wired, §11.1 naming each rule's check); the H3 version-rejection and crash-isolation scenarios are still absent and C4/C7/C8 remain self-declared.granted_at, the unprobedkindsfilter, a live representations witness, and the red script's expected-check mapping.query_allstill hands the fullmax_tokensto every provider; dedup is exact-FrameIdonly; the fence is fixed and unescaped.Milestone:
Ecosystemmcpdirectory.conformance-external.shis now a ready-made green gate for direction 1, and the correlation-id dependency cleared in ADR 0002.--jsonreport surface landed and CI already consumes it; the registry page, badge and submission flow do not exist. Effectively gated on there being third-party providers to list.Unmilestoned: release plumbing, distribution, and correctness
Two clusters filed after this map was first drawn, neither previously on it.
Release, distribution, and the public surface
MIGRATION.mdshipped, but instructs downstreams to pintag = "v0.0.2", which does not exist. One command; un-breaks a guide that is lying today and unblocks P1: Cut the attested fixture bundle tag for downstreams (regeneration shipped in #60) #52 and P0: Publish the provider SDKs to PyPI and the Go module registry #59.@contextgraphprotocol/typescript-sdk0.1.0, with PR chore(sdk): rename the TypeScript SDK to @contextgraphprotocol/typescript-sdk #46 settling the naming); PyPI and the Go module registry remain.cgp-websiterepo, not this repo'ssite/. Authoritative formacanderson/cgp-website#12.$id; entangled with P0: Vercel deploy topology: the project is Git-linked to the wrong repo, so contextgraphprotocol.org can be silently overwritten #57, since$idcan only point at a domain this repo actually serves.Correctness and content
requiredmust match the reference serializer's omit-when-empty fields — audit every wire type, and validate serialized reference values #54 Schemarequiredvs. the serializer's omit-when-empty fields — live failing case: an ordinary unfiltered, unanchoredContextQueryis invalid against the schema. The other 13 wire types audit clean.requiredmust match the reference serializer's omit-when-empty fields — audit every wire type, and validate serialized reference values #54.docs/future/context-receipt-impact-tracekeep-or-remove — a two-minute decision blocking nothing.FrameIdalready is the attribution id, so this is one envelope, not a new identity scheme. Additive; should not block the freeze.How this maps to the GOVERNANCE.md freeze criteria
v0.2list to zero starts the clock — every open normative issue resets itCurrent ranking
From the pre-freeze triage of 2026-07-23 (five-way audit: freeze-criteria mapping, wire breaking-change analysis, conformance/CI enforcement audit, downstream pressure scan, and a completeness pass), re-trued 2026-07-26. Ranked by "breaking or impossible if deferred past the freeze" first, then by which GOVERNANCE criterion it unblocks.
Two of the top three have since closed: rank 1 (#48, extensibility) — the only item that genuinely could not be retrofitted post-freeze — and rank 3 (#50), decided in PR #60. Positions are kept so the ranking stays comparable.
#48 extensibility / unknown-field rules#50 decidecontext/resolve; B3Below the cut — cheap, do during the stabilization window: branch protection on
main(#2's residue — context-reuse §3 was destroyed by an unprotected merge, and the 60-day clock deserves a guarded trunk); #29 canary CI, which would have flagged both current downstream drifts automatically; the schema$iddomain (#58, handed over from #21) —context-graph-protocol.orghas no DNS at all, so third parties dereferencing$idhit a dead host; #7's anchored-query probe, which rides #51's fixture work, withcontext/neighborsstaying a 1.x extension; #54's one-lineContextQueryfix; and the additive-by-design pair #15 / #31, which should not block the freeze.