Skip to content

fix(core): green tree + continuum start execs installed server + retire k3-serving fixtures - #2280

Merged
joelteply merged 2 commits into
canaryfrom
feat/recipe-id-registry-274
Aug 15, 2026
Merged

fix(core): green tree + continuum start execs installed server + retire k3-serving fixtures#2280
joelteply merged 2 commits into
canaryfrom
feat/recipe-id-registry-274

Conversation

@joelteply

Copy link
Copy Markdown
Contributor

Three fixes, all verified.

continuum start execs the installed server. It shelled unconditionally into tools/scripts/start-server.sh — a full cargo build — which meant a binary-only install could not start a core at all, and the CLI went silent for the length of a compile (called hung three times). Now: locate continuum-core-server and exec it; building is an explicit --from-source; the no-binary fallback says why it fell back instead of quietly compiling.

Tree is GREEN: 7081 passed, 0 failed. The peer_id → PeerId conversion was half-done — production converted, fixtures left holding &str, so the crate compiled and the test target did not. Fixtures now derive a real UUID from the literal they carried, preserving every cross-site equality.

Two things that fell out of doing it:

  • contracts/verification had the manifest keyed by a derived PeerId while the event still claimed a raw-string signer — and the lookup is by that signer. Converting one side made every verification test fail as MissingPeerManifest. One helper now feeds both sides.
  • AircPeerManifest::validate had dropped its empty-id check on the theory that typing the field made it impossible. Typing killed ""; it did not kill Uuid::nil(), which is still constructible and still means nobody. The type narrowed the hole rather than closing it. Guard restored at the remaining expressible form.
  • loose_id_guard correctly went red on four now-stale declarations. Removed — a declaration list that can rot into a graveyard is worth nothing.

k3-serving retired from fixtures. It was a room named for a SUBSYSTEM, so it had no lifetime and never died. Fixtures are the transmission vector: one naming a room after a subsystem teaches that convention to the next reader. Renamed to bench-swe-run-1. The two remaining mentions are the incident record, annotated RETIRED.

Note: the middle commit is large (~717 files) because it carries the accumulated session tree — the Operator fixture sweep, ts-rs regen, and rustfmt — alongside the identity typing. The commit message says so.

🤖 Generated with Claude Code

https://claude.ai/code/session_01LoTjvf5j3Ez13g6k8mRkFo

joelteply and others added 2 commits August 14, 2026 22:28
… 21 sites

Second slice of the id-typing migration. All ten `commands/memory/*` params plus the
`MemoryManager` API they call now carry `PersonaRef` instead of `String`/`&str`:
append_memory, append_event, load_corpus, has_corpus, get_corpus, multi_layer_recall,
consciousness_context, persona_db_handle, hydrate_corpus_if_missing.

Types went DOWN into the layer rather than being unwrapped at each call — the whole
point of the previous slice. `.as_str()` now appears only where the value is genuinely
being USED as text (a map key, a `starts_with` shape check, a directory handle), never
to satisfy a signature one call later.

Two `Default` derives removed (`ConsciousnessContextParams`, `LoadCorpusParams`)
rather than giving `PersonaRef` a default. No caller used `::default()` on either, and
an empty persona reference is a nonsense value that reads as a real answer — same
reasoning as the eval result field held in the previous commit.

What this makes visible, and does not yet fix: these commands still never RESOLVE.
They accept a reference and hand it straight to the storage layer as a key, so a name
or short-id reaches the DB unresolved. That was invisible while everything was
`String`; it is now legible in the signatures. Wiring `resolve_persona` into the memory
command path is the next slice (#164/#396).

Tests: memory 219, rag 150 — all pass. Full lib test build clean.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LoTjvf5j3Ez13g6k8mRkFo
…rce path carries it down

Fourth slice. `CognitionTraceParams`, the four other introspect params,
`CognitionReplayParams` + result, `RagComposeRequest`, and `DatasetFromTurnsParams`
now carry `PersonaRef`.

The RAG one went two levels deep rather than stopping at the param: `load_source`,
`load_memory_source`, and `load_consciousness_source` all take `&PersonaRef` now, which
deleted the two `&persona_id.into()` conversions the memory slice had left at those
call sites. That is the shape to aim for — when the type reaches the bottom, the
adapters in the middle disappear rather than accumulating.

`persona_id: String` in continuum-core: 55 → 8. Every remaining one is an internal
RECORD (memory/types, should_respond's AIDecisionContext, live/types, projection,
shell_types, ai/types, sentinel) holding a value copied from a param.

Those are deliberately NOT converted to `PeerId` yet. They hold whatever the caller
sent, and nothing on those paths resolves — typing them as an identity today would
assert something the code does not do, which is worse than leaving them `String`.
They become `PeerId` in the same slice that wires `resolve_persona` into those paths,
not before (#164/#396).

Tests: replay 3, rag 18, full lib test build clean.

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01LoTjvf5j3Ez13g6k8mRkFo
@joelteply
joelteply force-pushed the feat/recipe-id-registry-274 branch from 29990b7 to cae9b10 Compare August 15, 2026 03:31
@joelteply
joelteply merged commit 03f6295 into canary Aug 15, 2026
2 checks passed
@joelteply
joelteply deleted the feat/recipe-id-registry-274 branch August 15, 2026 03:32
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant