Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 32 additions & 2 deletions docs/architecture/NODEKIT_ACTIVEGRAPH_CANARY.md
Original file line number Diff line number Diff line change
Expand Up @@ -332,7 +332,7 @@ graph and identity fields rather than the former two-event trace fixture.
This proves the boundary on one deterministic representative corpus. It does
not satisfy the owner-authorized multi-run adoption experiment.

### Gate 3b — representative owner-authorized corpus: implemented, live result required
### Gate 3b — representative owner-authorized corpus: closed with `reject`

The repository now provides a fixed 20-scenario collector and bounded corpus
runner:
Expand Down Expand Up @@ -372,6 +372,37 @@ Passing all stop rules yields only `eligible-for-adr`; it does not adopt
ActiveGraph. A reject result closes this adoption experiment while preserving
the offline diagnostic canary.

The owner-authorized production run completed on 2026-07-30. It evaluated 20
unique, complete exports across the fixed workflow classes, including a
fail-safe terminal run. All 20 exports retained exact persistence/reload
parity. The first production-shaped run also exposed a compatibility defect:
the Python evaluator and JSON Schema did not yet accept the native-session
identity snapshot and graph lifecycle events that the JavaScript boundary and
production exporter already supported. Commit
`e910276c6c6a6cfc0f309d9ff36bed2b040cd176` aligned all three validators and
added production-shaped identity, lifecycle, and stale-identity scenarios.

The corrected corpus produced:

- canonical validation median: `0.144125 ms`;
- ActiveGraph canary median: `2018.27055 ms`;
- latency ratio: `14003.6118×`, above the predefined `2×` stop threshold;
- material explanatory value observed: `false`;
- persistence/reload parity: `20/20`;
- adoption verdict: `reject`.

The private source report is bound by
`sha256:46b00a19d00f83be131ffa574f02def8577918032b9bab90a166756611778559`.
The committed
[sanitized production corpus receipt](evidence/nodekit-activegraph-production-corpus-2026-07-30.json)
contains the non-sensitive measurements, source and evaluator commit bindings,
and sandbox image attestation. It intentionally excludes owner identifiers,
run identifiers, exported events, databases, and evidence-directory contents.

This result closes the adoption experiment. ActiveGraph remains useful only as
an optional offline diagnostic canary. It is not eligible for an ADR proposing
production runtime adoption.

### Gate 4 — production bridge: not authorized

A production bridge would still require a threat model, owner and tenant
Expand All @@ -398,7 +429,6 @@ This slice does not add:
- an MCP ingestion path;
- a Temporal backend;
- a production worker or dual-write;
- a corpus-based adoption decision; or
- any ActiveGraph role in user-visible answers or approval decisions.

## Reproduction
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
{
"schemaVersion": "nodebench.activegraph.production-corpus-receipt/v1",
"evaluatedAt": "2026-07-30T04:23:17.463Z",
"source": {
"kind": "nodebench-production",
"gatewayFunction": "exportNodeKitRun",
"authorization": "gateway-injected-owner",
"ownerDataIncluded": false
},
"bindings": {
"nodeBenchMainCommit": "6790041dc3999fc3dae3d533190be79bf2907b82",
"evaluatorFixCommit": "e910276c6c6a6cfc0f309d9ff36bed2b040cd176",
"activeGraphVersion": "1.10.0",
"sandboxImageAttestationHash": "sha256:4c2a5788c664e45657d10fd68438090799dfb64e1b0fdcb77e2c5442824b2df8"
},
"corpus": {
"exportCount": 20,
"uniqueExportHashCount": 20,
"allExportsComplete": true,
"allPersistenceReloadParity": true,
"workflowClasses": [
"agent-eval",
"aggregate",
"barrier",
"browser",
"build",
"check",
"context",
"decision",
"deliver",
"human-gate",
"repair",
"review"
],
"includesFailSafeTerminalRun": true
},
"measurements": {
"baselineValidationMedianMs": 0.14412500000071304,
"activeGraphCanaryMedianMs": 2018.2705499999993,
"latencyRatio": 14003.61179524728,
"latencyThreshold": 2,
"materialExplanatoryValueObserved": false
},
"stopConditions": [
"median_latency_exceeded_2x",
"no_material_explanatory_value"
],
"adoptionVerdict": "reject",
"authority": "offline evaluation evidence only; cannot answer, approve, mutate, schedule, or replace NodeBench state",
"limitations": [
"Gateway-injected ownership is enforced by NodeBench and is not cryptographically signed into each export.",
"The baseline is canonical NodeKit validation and does not include another graph database.",
"The reject verdict closes the adoption experiment but preserves the offline diagnostic canary."
],
"sourceReportHash": "sha256:46b00a19d00f83be131ffa574f02def8577918032b9bab90a166756611778559"
}
65 changes: 63 additions & 2 deletions evals/activegraph/schemas/nodekit-run-export.v1.schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,10 @@
"minLength": 1,
"maxLength": 256
},
"startedAt": { "type": "integer", "minimum": 0 }
"startedAt": { "type": "integer", "minimum": 0 },
"nativeIdentity": {
"$ref": "#/$defs/nativeIdentity"
}
}
},
"trace": {
Expand Down Expand Up @@ -123,6 +126,13 @@
"verification.recorded",
"evidence.attached",
"approval.requested",
"node.started",
"edge.consumed",
"artifact.produced",
"node.completed",
"node.failed",
"barrier.opened",
"barrier.blocked",
"run.completed",
"run.failed"
]
Expand Down Expand Up @@ -200,12 +210,63 @@
},
"fields": {
"type": "object",
"maxProperties": 7,
"maxProperties": 16,
"additionalProperties": {
"type": ["string", "number", "boolean", "null"]
}
}
}
},
"nativeIdentity": {
"type": "object",
"additionalProperties": false,
"required": [
"schemaVersion",
"identityRef",
"agentId",
"workspaceId",
"nativeSessionId",
"nativeSessionGeneration",
"snapshotHash"
],
"properties": {
"schemaVersion": {
"const": "nodekit.native-agent-session-identity/v1"
},
"identityRef": {
"type": "string",
"minLength": 1,
"maxLength": 256
},
"agentId": {
"type": "string",
"minLength": 1,
"maxLength": 256
},
"workspaceId": {
"type": "string",
"minLength": 1,
"maxLength": 256
},
"nativeSessionId": {
"type": "string",
"minLength": 1,
"maxLength": 256
},
"nativeSessionGeneration": {
"type": "integer",
"minimum": 0,
"maximum": 9007199254740991
},
"peerId": {
"type": "string",
"minLength": 1,
"maxLength": 256
},
"snapshotHash": {
"$ref": "#/$defs/hash"
}
}
}
}
}
Loading
Loading