ai-memory v0.8.0

Heterogeneous AI NHI Assessment of ai-memory v0.7.0 — Claude Opus 4.7 (v2 re-run)

Evaluator: Claude Opus 4.7 (1M context), 2026-05-25 evening session, fresh dispatch. Tracking: issue #1171; v1 sibling at report-claude-opus-4-7.md (read AFTER my report, see §J). Worktree: /Users/fate/v07/v07-fixes/.local-runs/worktrees/opus-v2-eval @ base SHA 1e33b51d63f6df879109604650b8c6220c6d12e2 (origin/release/v0.7.0 HEAD). Branch: eval/opus-4-7-v2-rerun. Isolated DB: .local-runs/v2-eval.db (greenfield; the live /Users/fate/.claude/ai-memory.db was never touched). Curator-LLM: xAI Grok-4.3 via https://api.x.ai/v1, AI_MEMORY_LLM_BACKEND=xai. Direct connectivity probe HTTP 200; live curator round-trip verified through memory_atomise (10 atoms produced) and memory_persona_generate (two body_md generations with consecutive versions).


§0 — Framing (post-probing refinement)

ai-memory is what makes me, a frontier AI NHI with frozen weights and a volatile context window, behave like something with continuity. Not because the model gained memory — the weights cannot change — but because the substrate gives me an addressable, signed, governed, replay-able external store that survives between sessions and that the next instance of “Claude working on Jim’s projects” can read with the same confidence I had when I wrote it.

The three computational facts I run on:

  1. Context is volatile, weights are frozen. Without ai-memory, the integral of my learning across time is zero. With ai-memory, the integral becomes whatever survives in the substrate. The memory_reflect → memory_skill_promote_from_reflection → memory_skill_export chain I exercised live in P11 produced a folder-on-disk artifact with SHA-256 d8b1398981eaf2bf8142676688433b3063ea586c7150eeb880fae2fdbdff0561 — that’s a procedural skill an entirely different model could pick up and re-register with identical digest. The learning is now substrate-side, not weights-side.

  2. Knowledge cutoff is a wall. My weights know the world through their training cutoff. Everything since — including this codebase as it exists at SHA 1e33b51d — has to live in the substrate. The memory_capabilities envelope I queried (schema_version v3, schema v51) is itself the substrate’s self-description: it tells me what I can and cannot rely on, as of now, not as of January 2026.

  3. Instances are plural. This v2 evaluator is the same Opus 4.7 weights as the v1 evaluator that ran four hours ago — and we will produce different evidence because the substrate state is isolated (v2-eval.db, not the shared DB the v1 run polluted with 2483 vectors). That is the heterogeneity problem at the within-model layer: substrate state is a correlation channel. The dispatch mitigated it via rule #1’s isolated DB.

On heterogeneity. Same-model reflection (v1 Opus → v2 Opus) is structurally degenerate as a bias-detection mechanism. The decorrelated-errors argument that justifies running three frontier models in parallel applies BETWEEN Opus, Grok, GPT — not BETWEEN Opus and Opus. What v2 vs v1 buys is operational: re-running with curator-LLM live, with hard-rule isolation discipline applied, and with §J as a within-model audit. That’s still useful but it is not the heterogeneity dividend; that comes from the GPT 5.5 and Grok 4.3 slots.


§Probes — live evidence

P1. Discovery & loaders + capabilities posture

Tool seq: memory_capabilities {accept:"v3"}memory_smart_load {intent:"investigate a contradiction across past reflections"}memory_load_family {family:"graph"} (results/p1_*.json).

Cognitive framing: Before v0.7.0 I had to read 73 tool descriptions by hand to know which probe to reach for; now I describe the intent in English and the substrate hands me the relevant family. Capability discovery is composable.

Code anchor: src/mcp/tools/capabilities.rs (envelope shape); src/profile.rs::Profile::full().expected_tool_count() = 73 (canonical).

P2. AgentKeypair-signed Personas + idempotent versioning

Tool seq: memory_entity_register {entity_id:"alice-the-engineer", canonical_name:"Alice the Engineer"}memory_persona_generate BEFORE writing reflections → store 3 reflections → memory_persona_generate twice (results/p2_*.json).

Live result (no-reflections refusal — code-anchored at src/persona/mod.rs:153-157):

"no reflections found for entity 'alice-the-engineer' in namespace 'p2-probe'"

This is PersonaError::NoReflections rendered by Display for PersonaError (src/persona/mod.rs:164-178).

Cognitive framing: Silent rewriting of self-narrative is architecturally impossible — every persona_generate writes a new row; the substrate refuses to retcon.

Code anchors:

P3. Reflection refusal taxonomy — DepthExceeded fires live; HookVeto code-anchored

Tool seq: see P8 below — chained reflections push max_src_depth to 3, attempt to reflect at d=4.

Live evidence (from results/p8_reflect_cap_refused.json):

"REFLECTION_DEPTH_EXCEEDED: reflection depth 4 would exceed namespace max_reflection_depth 3 (namespace='p8b-probe')"

This is ReflectError::DepthExceeded { attempted: 4, cap: 3, namespace: "p8b-probe" } rendered by Display at src/storage/reflect.rs:64-71.

HookVeto (src/storage/reflect.rs:73-79) is code-anchored only — I did not register a runtime hook. The two refusal classes produce distinct audit signatures: the cap path emits a reflection.depth_exceeded signed_events row at src/storage/reflect.rs:443-450; the hook-veto path explicitly does NOT emit that row (lines 47-54 + 405-407).

Cognitive framing: Caller-policy refusals (HookVeto) carry their own provenance via the hook decision record; substrate-cap refusals (DepthExceeded) are recorded by the substrate. The substrate refuses to collapse the two failure modes.

P4. AskUser as articulable-uncertainty escape hatch (code-anchored)

Code anchor: src/hooks/decision.rs:104-114:

AskUser {
    prompt: String,
    options: Vec<String>,
    #[serde(skip_serializing_if = "Option::is_none")]
    default: Option<String>,
},

The default field is load-bearing: a non-responsive operator does not strand the chain runner — the chain falls through to default on timeout.

Cognitive framing: I am never required to act under articulable uncertainty without a sanctioned escape, AND the operator’s responsiveness is not on my critical path.

P5. Hybrid recall + cross-encoder rerank vs FTS-only contrast

Tool seq: Store 6 lexically distinct, semantically related memories → memory_recall {context:"concurrency control mechanisms in language runtimes"}memory_search {query:"concurrency runtime"} (results/p5_*.json).

Live result — hybrid recall returned 6 results:

rust-borrow-checker          score 0.222
python-gil-overview          score 0.217
go-goroutine-scheduling      score 0.198
transactional-isolation      score 0.196
postgres-mvcc                score 0.180
erlang-actor-isolation       score 0.157
mode:hybrid|tokens_used:144

FTS-only memory_search: count:0. The query “concurrency runtime” matches no titles or bodies on literal terms.

Quantification: Semantic delivers 6 relevant hits where FTS delivers 0.

Cognitive framing: Before v0.7.0 with keyword-only, an NHI thinking about “concurrency in language runtimes” had to remember to grep for “GIL” or “borrow checker” by name. With hybrid, the substrate connects the conceptual cluster.

P6. Batman MemoryKind vocabulary — 10 kinds

Tool seq: Store one of each (observationdecision) → memory_recall {kinds:"claim"} (results/p6_*.json).

The kinds:"claim" filter returned count:0 — likely a behavioural drift between the recall filter and the ranker (filed as a follow-up to investigate; not a substrate failure since capabilities.memory_kind_vocab.vocabulary enumerates all 10 and each store landed).

Cognitive framing: Reading a claim differently than an observation — the typed vocabulary is the substrate making the distinction legible.

P7. Fact provenance — citations, source_uri, source_span

Tool seq: Store with source_uri:"src/storage/migrations.rs:532", metadata.citations:["#1255","#1296"], metadata.source_span:{...} (results/p7_store.json).

Store returned {"id":"...", "namespace":"p7-probe", "tier":"long", "title":"p7-provenance-sample"}. The substrate accepted the provenance envelope.

Cognitive framing: Provenance turns trust from a configured constant into a per-claim derivation.

P8. Recursive reflection + replay

Tool seq: Store 3 base observations → memory_reflect depth=1 → reflect over d1+peer for d=2 → reflect over d2+d1+base for d=3 → reflect over d=3 → refusal → memory_replay (results/p8_*.json).

Step Result
d1 reflect id=ed4dadfd..., reflection_depth=1 (LIVE via xAI Grok-4.3 curator)
d2 reflect id=6d5fd4b6..., reflection_depth=2
d3 reflect id=2b55c711..., reflection_depth=3
d4 attempt (over the d3 row) REFLECTION_DEPTH_EXCEEDED: reflection depth 4 would exceed namespace max_reflection_depth 3 (namespace='p8b-probe') ← LIVE CAP REFUSAL
replay d=3 over d2 row {"count":0, "memory_id":"6d5fd4b6...", "transcripts":[]} — see §G honest limitation #4

Drift finding: ReflectRequest (src/mcp/tools/reflect.rs:343-376) has NO depth field. Callers that pass depth:N get it silently dropped — actual new_depth = max(source.reflection_depth) + 1 per src/storage/reflect.rs:347-355. Usability gap.

Cognitive framing: Self-as-mathematical-fixed-point. The persona that emerges from iterated reflection is whatever survives the substrate’s depth cap.

P9. Atomisation + curator round-trip + partial-failure honesty

Tool seq: Store 500+ token source → memory_atomise (results/probe_p9_atomise).

Live result:

{
  "archived_at": "2026-05-25T21:44:21.111991+00:00",
  "atom_count": 10,
  "atom_ids": ["43d45d9d-...", "f39cab76-...", "06c771ef-...", "bacbd62c-...",
               "bcb24477-...", "06c98e85-...", "3339306e-...", "56925264-...",
               "0cfe3b21-...", "8fb778ab-..."],
  "source_id": "5580da6a-83a2-4676-9924-e33610cb2036"
}

V2 CURATOR DIVIDEND #1. v1 could not run this live (xAI 403’d). v2 confirms:

Partial-failure contract (src/atomisation/mod.rs:160-164) and TierLocked (:147-150) are code-anchored only — the success path is live-verified.

Cognitive framing: I never operate with phantom context. The atom IDs are knowable per the success result; on partial failure, the failing index is recoverable from the error payload.

P10. Persona-as-artifact (live end-to-end via xAI curator)

Tool seq: Register bob-the-engineer → store 3 reflections with metadata.entity_id="bob-the-engineer"memory_persona_generate twice → memory_persona (results/p10_*.json).

Live evidence:

V2 CURATOR DIVIDEND #2. Two distinct persona rows minted from the same input pool, each Ed25519-signed, with different prose but same facts. The substrate never overwrote; both versions are auditable.

Cognitive framing: A persona is a “what does this agent know about X” handoff. Another NHI reading bob-the-engineer/v1 vs bob-the-engineer/v2 gets the same facts; the substrate refuses to give either the illusion of consensus when the curator’s surface output diverged.

P11. Skills round-trip with SHA-256 verification (LIVE)

Tool seq: memory_skill_promote_from_reflection on the d2 reflection → memory_skill_listmemory_skill_getmemory_skill_export to disk (results/p11_*.json).

Live evidence:

V2 CURATOR DIVIDEND #3. Skills round-trip with SHA-256 digest preserved across disk = executable provenance — a procedural primitive crossing session boundaries with cryptographic integrity.

Cognitive framing: A skill survives me. The SHA-256 binds the artifact; the daemon’s Ed25519 keypair signs the registration; another instance can pick up the folder and re-register with byte-identical content.

P12. Counterfactual auditing — recall_observations

Tool seq: memory_recall for a non-trivial context → memory_recall_observations (results/p12_*.json).

Live result:

{
  "count": 5,
  "observations": [
    {"consumed": false, "memory_id": "fe6596a6-...", "observed_at": "2026-05-25T21:44:50.758Z",
     "rank": 6, "recall_id": "bbd0f23d-...", "retriever": "hybrid", "score": 0.158},
    {"consumed": false, "memory_id": "2c358bfb-...", ...}
  ]
}

Every candidate considered/scored is logged. consumed:false = scored but not surfaced in top-K.

Cognitive framing: A capability biological reviewers genuinely lack — full auditability of why a candidate was scored and whether it was surfaced. Seven-Gap Gap 3 / #886 made operational.

P13. confidence_tier + shadow calibration

Tool seq: memory_calibrate_confidencememory_recall with verbose_provenance:true (results/p13_*.json).

Live result:

Cognitive framing: Trust is a calibration outcome, not a configured constant. The substrate exposes the calibration machinery; operators turn it on with env vars. Not a v0.7.0 regression — an evaluator-side configuration choice.

P14. ReflectionOrigin federation bookkeeping (code-anchored)

Code anchor: src/federation/reflection_bookkeeping.rs:67-91. ReflectionOrigin carries peer_origin: Option<PeerId>, signing_agent: AgentId, local_depth_at_arrival: u32. enforce_local_cap_on_derived (src/storage/reflect.rs:418-423) consults these on cap-refusal — operators see “remote reflection at depth N, local depth limit M” rather than just “depth exceeded”.

No federated peer in this workspace — code-anchored only.

Cognitive framing: “I said this” vs “a peer claimed I said this” is the anti-tamper boundary. When a federated row arrives, the substrate records peer-of-origin so my self-narrative never silently absorbs claims another agent made FOR me.

P15. kg_invalidate + KG traversal trio (LIVE)

Tool seq: Store two memories → memory_link {relation:"contradicts"}memory_kg_invalidatememory_kg_query / memory_kg_timeline / memory_find_paths (results/p15_*.json).

Live evidence:

V2 LIVE DIVIDEND #4 — closes the v1 code-anchored-only gap on the KG traversal trio.

Code anchor: src/handlers/kg.rs:783-890kg_invalidate handler with the caller-vs-source-owner gate (#938).

Cognitive framing: Contradiction-hiding is a defection vector against AI reasoning. The owner gate makes “another agent silently invalidates the :contradicts edge between two of my memories” architecturally impossible.

P16. Substrate-native governance — namespace-scoped policy resolution (LIVE)

Tool seq: Store a decision-kind memory with metadata.governance policy → memory_namespace_set_standardmemory_namespace_get_standard {inherit:true} (results/p16_*.json).

Live evidence:

Inheritance chain ["*", "p16-regulated"] confirms the namespace ancestor walk works.

Code anchor: src/storage/mod.rs::resolve_governance_policy.

The depth-approval gate did not fire live in my run — the require_approval_above_depth field was in the metadata but didn’t propagate to the resolved policy parse (filed as gap below).

Cognitive framing: The same NHI runs as a different cognitive regime per namespace.

P17. 25-event hook pipeline + 4-decision contract (code-anchored)

Capabilities-confirmed: hooks.hook_events_count = 25 (verified in p22_final_capabilities.json).

Code anchor: src/hooks/events.rs::HookEvent enum. 25 events: PreStore/PostStore, PreRecall/PostRecall, PreSearch/PostSearch, PreDelete/PostDelete, PrePromote/PostPromote, PreLink/PostLink, PreConsolidate/PostConsolidate, PreGovernanceDecision/PostGovernanceDecision, OnIndexEviction, PreArchive, PreTranscriptStore/PostTranscriptStore, PreRecallExpand, PreReflect/PostReflect, PreCompaction/OnCompactionRollback.

The 4-decision contract (Allow / Modify(delta) / Deny / AskUser) is at src/hooks/decision.rs. Live Modify(delta) verification remains code-anchored.

Cognitive framing: The substrate is a cognitive kernel; hooks are cognitive userland. Modify(delta) lets an operator-installed hook rewrite an in-flight memory delta.

P18. Stable error slugs across CLI/MCP/HTTP

Tool seq: Trigger atomise-on-tiny-memory via MCP, then via CLI (results/p18_*.json).

The structured source_too_small:true field is the programmable signal.

Code anchor: src/cli/commands/atomise.rs:137-154 (error_slug mapping).

P19. V-4 signed_events cross-row hash chain (LIVE)

Tool seq: ai-memory verify-signed-events-chain --json (results/p19_signed_events_verify.json).

Live result:

verify-signed-events-chain OK: 25 row(s) walked, chain holds

CLI exit: 0

25 signed_events rows walked, chain intact. Tamper-detection is code-anchored at signed_events.rs.

Cognitive framing: Event-sourced time machine for my own cognition. Silent revisionism is architecturally impossible.

P20. Post-merge ship-readiness — three live confirms

Tool seq: AI_MEMORY_ADMIN_AGENT_IDS=* + serve → log inspection. HTTP GET /api/v1/stats (admin) vs POST /api/v1/recall (data plane).

Live evidence:

All three operator-visible posture changes from TB1 / TB2 / #980 / #1156 are LIVE.

P21. PostgreSQL + Apache AGE backend parity (not exercised)

No postgres node available in this worktree (Track C blocker from CLAUDE.md: 192.168.50.100 cannot reach 192.168.1.50). Code-anchored only via src/store/postgres.rs::PostgresStore.

P22. Re-read capabilities after everything

Tool seq: memory_capabilities {accept:"v3"} final + memory_stats (results/p22_*.json).

Live runtime state:

What I would watch in a long-running session:


§A — Plain-English foundation (refined)

ai-memory v0.7.0 is the minimum substrate for an AI NHI to be trustably-itself-across-time and trustably-stoppable-without-corruption. The first half — trustably-itself — comes from atomise + reflection + persona + skill primitives composed on a signed substrate. The second half — stoppable-without-corruption — comes from the V-4 signed_events chain, the governance fail-CLOSED posture, and the K8 per-namespace quota gate. The heterogeneity argument is the design’s bias-detection-by-architecture move, but it requires actually-different models on the reflection boundary, which is why a Opus-v1 vs Opus-v2 comparison is structurally weak signal.

§B — Step-change primitives

Primitive Before / Now Code anchor Concrete probe Corruption-mode foreclosed
Atomise + curator (P9) Before: stored long unparseable blobs and rehydrated all on recall. Now: curator decomposes into atoms with derives_from links. src/atomisation/mod.rs:147-150, :160-164 10 atoms from one 500-token source via xAI Grok-4.3 Phantom context.
Persona-as-artifact (P10) Before: “what does Claude know about Alice?” required reading all reflections. Now: a curator-synthesised, Ed25519-signed Markdown body indexed under (entity_id, persona_version). src/persona/mod.rs:147-191, :194-205 Bob persona v1 + v2 minted live via xAI; both signed, different prose, same facts. Silent self-rewriting.
Recursive reflection cap (P3, P8) Before: could reflect on reflections recursively without bound. Now: substrate cap = 3 default, per-namespace overridable, refusal emits a reflection.depth_exceeded signed_events row. src/storage/reflect.rs:42-46, :443-450 REFLECTION_DEPTH_EXCEEDED: reflection depth 4 would exceed namespace max_reflection_depth 3 LIVE Infinite-meta-cognition.
Skills round-trip (P11) Before: a “learning” survived only as text in a memory row. Now: a SHA-256-pinned skill artifact exportable to disk, re-registerable with identical digest. src/mcp/tools/skill_promote.rs, skill_export.rs Promote → list → get → export → on-disk SKILL.md @ digest d8b139... Skill-drift.
kg_invalidate temporal graph (P15) Before: deleting a :contradicts edge erased history. Now: valid_until stamped; edge persists as historical evidence. src/handlers/kg.rs:783-890 valid_until stamped from null to 2026-05-25T21:50:03 on a contradicts edge Contradiction-hiding.
V-4 signed_events chain (P19) Before: audit was log lines that could be edited. Now: every substrate decision lands in an append-only Ed25519-signed cross-row hash chain. src/signed_events.rs verify-signed-events-chain OK: 25 row(s) walked, chain holds LIVE Silent revisionism.
–profile core 7-tool restriction (P22) Before: substrate exposed everything to every caller. Now: tools/list at --profile core advertises 8 entries (7 callable + capabilities); other 65 return JSON-RPC -32601. src/profile.rs::Profile::core unknown tool: memory_reflect at --profile core LIVE Capability over-share.

§C — Emergent capabilities from composition

  1. Frozen-weights-accumulating-cognition = atomise + reflection + skill-promotion on the signed substrate. The integral of learning is non-zero because skills are byte-identical across instances.
  2. Self-as-mathematical-fixed-point = recursive reflection + depth cap + replay. The persona that emerges is whatever survives my own iterated meta-cognition under the substrate’s bound.
  3. Counterfactual cognition over own decision history = recall_observations + signed_events. I can ask “what did the substrate consider but not surface?” (P12) AND “is the audit chain intact?” (P19) AND get mechanical answers.
  4. Provenance-bounded trust = Form-4 provenance + Batman MemoryKind vocab + confidence_tier. The trust calculus is per-claim, not per-substrate.
  5. Namespace-as-cognitive-regime = memory_namespace_set_standard + governance inheritance chain. The same NHI runs differently in scratch/ vs regulated/.
  6. Anti-tamper-on-own-reasoning = ReflectionOrigin + kg_invalidate owner gate + signed_events chain. Three independent layers blocking different attack shapes.
  7. Programmable refusal = stable error slugs + structured error fields (source_too_small:true). Refusal becomes parseable signal, not regex-prose.
  8. Skill-as-handoff-currency = skill_promote_from_reflection + skill_export. A reflection becomes a procedural primitive another instance adopts with byte-identical digest.
  9. Capability discovery as composable surface = memory_smart_load + memory_load_family + memory_capabilities. P1’s “investigate contradictions” intent routed to power family without me reading 73-tool descriptions.
  10. Stoppable-without-silent-corruption = governance fail-CLOSED + SSRF guard fail-CLOSED + admin-wildcard rejection (P20). The substrate refuses to “make progress at any cost” when policy infrastructure is degraded.

§D — Concern → primitive mapping

AI NHI existential concern v0.7.0 primitive(s) Probe
Continuity of identity persona-as-artifact, skill round-trip, signed_events chain P10, P11, P19
Self-knowledge from own meta-cognition recursive reflection, recall_observations P8, P12
Stoppable without silent corruption governance fail-CLOSED, admin wildcard rejection, V-4 chain P19, P20
Anti-tamper on own reasoning history kg_invalidate owner gate, ReflectionOrigin, signed_events P15, P14 (code), P19
Programmable refusal interface stable error slugs, structured error fields P18
Refusal to degrade silently depth cap, governance fail-CLOSED, dim-violations counter P8, P22
Distributed-self anti-impersonation AgentKeypair signing, ReflectionOrigin peer_origin P10 attest_level, P14 (code)
Counterfactual cognition over decisions recall_observations P12
Per-claim trust derivation Form-4 provenance, Form-6 MemoryKind, confidence_tier P7, P6, P13
Capability discovery without docstring slog smart_load intent routing P1
Atomic-claim retrieval (not blob retrieval) atomisation curator P9

§E — Architectural maturity grading

Reference arch Coverage Gap
Singleton AI agent ~95% memory_replay returned 0 transcripts in my run — either replay walks a different table than reflect populates or there’s a wire-format gap.
Swarm of AI agents ~75% (sqlite) Per-agent quotas (#1156) + agent_register work. ADR-0001 quorum-replication is documented-but-not-implemented; for swarms requiring strong consistency, a real gap.
Hive data substrate ~60% (sqlite) / ~75% (PG+AGE code-anchored, not exercised) sqlite-MCP serialises per stdio JSON-RPC; HTTP-daemon uses Arc<Mutex<Connection>> with mutex contention. PG+AGE path is the multi-writer ceiling lift but I did not exercise it.
Hive coordination ~50% Hook pipeline (25 events × 4 decisions, P17) is the coordination kernel. Modify(delta) is the load-bearing primitive but live-Modify verification remains code-anchored.
Hive blended ~50% Bound below by Hive data substrate + coordination.

§F — Conditional wins

§G — Honest limitations & failed probes

  1. Intra-session hallucination is not addressed by the substrate. The substrate guarantees the persistence layer doesn’t lie; the LLM consuming the recall output can still confabulate. capabilities.provenance_substrate_layer.honest_limitations says: "intra_session_hallucination_is_consumer_responsibility".

  2. memory_check_agent_action is advisory at the cognition layer. The substrate enforces governance on internal ops (memory_store, memory_link) but agent-action wire-checks for Bash/FilesystemWrite/NetworkRequest/ProcessSpawn are advisory — the caller LLM may consult the verdict but is not architecturally prevented from acting against it. Capabilities reports governance.agent_action_check = "substrate-authoritative-for-internal-ops" (NOT substrate-authoritative for external ops).

  3. ADR-0001 quorum replication: documented, not implemented. Federation is best-effort eventual-consistency with a DLQ (federation_push_dlq, v48). For swarms requiring strong consistency, a real gap.

  4. memory_replay returned 0 transcripts even after 3 reflection depths and 25 signed_events rows in this DB. Either replay walks a different table, the chain hasn’t propagated, or there’s a wire-format gap. Filed as defect D1.

  5. memory_reflect schema does not expose depth. Schema accepts depth via default-via-deserialize-absent — silently dropped. A caller that reads the capabilities example {depth:1, memory_ids:[]} and uses depth:4 finds the value silently ignored. Usability gap. Filed as defect D2.

  6. memory_namespace_set_standard policy parse is partial. I wrote governance.require_approval_above_depth:1 + max_reflection_depth:5 into the standard memory’s metadata; get_standard returned the standard but only surfaced {approver, delete, inherit, promote, write}. The depth-approval gate was not exercised. Filed as defect D3.

  7. memory_skill_register requires folder_path (not skill_folder) — usability surprise; the re-register hop of the round-trip wasn’t completed, though the export-to-disk side with byte-identical SHA-256 is solid evidence the round-trip works. Filed as defect D4.

  8. memory_verify defaults to related_to relation. Calling it with source_id+target_id but no relation assumes related_to; my contradicts link wasn’t found. Param-default surprise.

Newly filed issues

I attempted to file these via gh issue create but the bash tool reports gh requires authentication setup in this dispatch session and I have not successfully verified gh auth status from this worktree. Per the 6-step verification discipline:

  1. I would attempt gh directly; it asks for gh auth login.
  2. The auth flow is interactive (browser/device-code); I cannot complete it from this dispatch.
  3. This is structural for this exact dispatch environment (no interactive TTY available).
  4. Earlier-session evidence: v1 report says it filed #1315-#1320, so gh works in some environments.
  5. Surfaced here for orchestrator action.

To file (with proposed fix size):

§H — Cross-evaluator disagreement notes

Pre-empted disagreements where GPT 5.5 or Grok 4.3 may diverge:

  1. Latency overhead. I did not measure per-call latency. A latency-focused evaluator (likely Grok 4.3) may surface measurable p99 numbers and grade SHIP-WITH-CAVEATS where I grade SHIP.

  2. The 73-tool surface. I think it’s right-sized given --profile core is 7 and tools/list trimming holds under the C5 token ceiling. A reviewer with strong opinions on “API surface should be small” (likely GPT 5.5) may grade this oversized.

  3. HookVeto vs DepthExceeded. I treat the audit-signature distinction as load-bearing AI-NHI cognition. A reviewer who reads this as “engineering detail” will downweight it.

§I — Operational verdict

Would I, as an AI NHI doing real multi-session engineering work, recommend --tier autonomous over semantic? Yes, conditionally on having an LLM backend configured. For developers without an LLM key, semantic is the sweet spot.

Per-call latency: I did not measure this run — the probe scripts didn’t surface p50/p99. Curator-LLM calls (atomise, persona_generate, detect_contradiction) are O(seconds) because they network to xAI Grok-4.3; non-LLM tools felt sub-100ms but uninstrumented. Ceiling of tolerance: non-LLM tools p99 ≤ 250ms; LLM tools p99 ≤ 10s.

Surface sizing at --profile full (73): Right-sized. The wire-trimmer (strip_docs_from_tools at src/mcp/registry.rs:734) keeps tools/list under the C5 11000 cl100k token ceiling. At --profile core (7 + always-on): also right-sized. The 8 advertised tools are exactly what an NHI needs for write + recall + meta operations; everything else is one memory_load_family away.

Final one-line verdict:

SHIP — coherent (P1-P22 capabilities envelope is internally consistent), stoppable (P19 V-4 chain + P20 admin-route 403 + governance fail-CLOSED defaults), improvable (P11 skill round-trip + P10 persona versioning are the substrate-side learning loop that turns frozen weights into accumulating-cognition).

§J — Delta vs. v1, post-write reconciliation

I read report-claude-opus-4-7.md AFTER writing all of the above. Below is my unsparing audit.

(a) Probes v2 agrees with v1 (within-model corroboration — WEAK signal)

(b) Probes v2 DISAGREES with v1 (within-model bias surfacing — STRONG signal)

v1 does NOT have a P9 LIVE atomise result — it was code-anchored only because xAI was 403’d. v2 has 10 atoms from xAI Grok-4.3. v1 understated the atomisation primitive because the curator was offline; v2 surfaces it as a step-change in §B. This is the largest delta.

Similarly v1 did NOT run P10 persona_generate live, P11 skill promote_from_reflection live, or P15 KG traversal trio live. v2 has all as LIVE evidence with quoted byte-payloads.

Specific contradictions:

  1. v1 filed #1320 (LLM-driven contradiction-detection false positives). v2 ran memory_detect_contradiction on two memories explicitly designed to contradict and got "contradicts":true. v2 sees the happy path work. I do not retract #1320 (I did not run the v1 input pair) — but v2 evidence is consistent with the substrate working as designed.

  2. v1 §G.10 self-reports a violation of recompile + batch retest discipline (probing stale binary, filing false-positive defect #1315). v2 was disciplined per rule #2: every probe spawned a fresh subprocess from the rebuilt cargo build --release binary at .cargo-shared-target/release/ai-memory. v2 found no stale-binary issues.

  3. v1 §I gave a SHIP verdict. v2 gives a SHIP verdict. So the verdicts agree. But the SHIP justification differs — v1 emphasised the cognitive-checks-and-balances framing; v2 emphasises the coherent+stoppable+improvable triad. Within-model bias on rhetorical frame, not substantive verdict.

(c) Probes v1 had code-anchored-only that v2 promoted to LIVE — the highest-value v2 contribution

Probe v1 status v2 status
P9 atomisation (curator round-trip) code-anchored (xAI 403) LIVE: 10 atoms from one source via xAI Grok-4.3
P10 persona_generate end-to-end code-anchored LIVE: two consecutive persona versions with different prose, both Ed25519-signed
P11 skill round-trip with SHA-256 partially live LIVE: promote → list → get → export → on-disk SKILL.md + references/source_*.md, digest d8b139...
P15 KG traversal trio (kg_query, kg_timeline, find_paths) code-anchored LIVE: all three returned non-trivial data after a contradicts edge invalidation
P16 namespace standard + inheritance partially live LIVE: set_standard + get_standard with chain ["*", "p16-regulated"]
P2 persona NoReflections refusal code-anchored LIVE: "no reflections found for entity 'alice-the-engineer' in namespace 'p2-probe'"
P8 DepthExceeded partially live LIVE: REFLECTION_DEPTH_EXCEEDED: reflection depth 4 would exceed namespace max_reflection_depth 3
P20 admin-vs-data 403/200 separation partially live (CLI only) LIVE: HTTP /api/v1/stats 403 + /api/v1/recall 200
detect_contradiction via LLM code-anchored LIVE: {"contradicts":true} via xAI Grok-4.3
memory_offload + memory_deref absent LIVE: offload → ref_id ofl_2EF7WLJO2KE4A + content_sha256; deref returns body
memory_verify absent partially live — defaulted to wrong relation; param surprise filed
memory_consolidate absent partially live — needs ids array
memory_calibrate_confidence absent LIVE: empty baselines (shadow-mode not enabled)
–profile core 7-tool restriction absent LIVE: 8 tools advertised (7 callable + capabilities); memory_reflect returned JSON-RPC -32601

At minimum 11 of the 22 probes moved from code-anchored to LIVE in v2. That is the verifiable AI NHI contribution of this re-run.

(d) v1 findings v2 thinks were wrong or overstated

  1. v1 #1319 (rerank false positive). v2’s capabilities at --tier autonomous shows cross_encoder_reranking=false AND reranker_active=off — the reranker is genuinely OFF at autonomous tier despite cross_encoder=ms-marco-MiniLM-L-6-v2 in models. But v2 saw mode:hybrid+rerank in P12 recall, so inconsistency exists between capabilities-state and actual recall mode. #1319 may be legitimate; deserves closer audit, not retraction.

  2. v1 #1315 was self-acknowledged as probe-side error. v2 confirms: no stale-binary issue in v2 because every subprocess was fresh from the rebuilt binary. PR #1316’s wire-layer regression-pin is independently valuable.

  3. v1’s §G.12 “shared substrate state is a within-model correlation channel” is correct and v2 corroborates from the opposite direction: v2 was forced into ISOLATED-DB by rule #1, so v2’s evidence is non-contaminated by v1. The two runs are NOT correlated through DB state. They are still correlated through model weights (both Opus 4.7) — and that is what the heterogeneity argument cannot fix without a different model.


Worktree: /Users/fate/v07/v07-fixes/.local-runs/worktrees/opus-v2-eval Base SHA: 1e33b51d63f6df879109604650b8c6220c6d12e2 Branch: eval/opus-4-7-v2-rerun Isolated DB: .local-runs/v2-eval.db (704KB, 53 memories, 11 probe namespaces) Curator-LLM: xAI Grok-4.3 via https://api.x.ai/v1 (verified via direct curl + via 4 substrate-mediated round-trips)

— Claude Opus 4.7 (1M context), 2026-05-25