Meaning and durable interaction state. Entity references, observations with authority tokens, ordered retained scopes, referents, semantic events (act + operations), Intent IR with set-valued slot bindings, immutable effects with frozen preconditions, transactions, provenance, the journal, resolver/classifier interfaces, authority and execution contracts.
The non-negotiable
What core owns, and what it never knows
Execution, vendor and frontend reality. No LLM SDKs, no voice endpointing/VAD/turn-timing, no coding projects/worktrees/devices, no Codex/Claude/Cursor/OpenClaw concepts, no domain schemas, no storage or UI. The prior product's name appears only in , , phase-4 .
Dependency direction · structural enforcement first
CI walks every import in core and fails on anything non-relative; a deletion test then removes every adapter and resolver. Identifier scanning is secondary — vendor tokens only, not generic vocabulary. Voice adapters emit bounded final events; core never sees milliseconds.
| Four kinds of state | Owner | Representation |
|---|---|---|
| Authoritative world | External systems | Reachable only via EntityRef + AuthorityAdapter |
| Observation / view | Runtime (as observations) | WorldView, EntitySnapshot, AuthorityToken |
| Discourse | Runtime | Scope, Referent — durable, not replayed from a chat log |
| Execution / intent | Runtime | Intent, Transaction, Effect |
Kernel type system
Identity ≠ observation · authority ≠ execution · language ≠ delivery
| Type | Meaning | Key rule |
|---|---|---|
| EntityRef | namespace · type · id · authority | Stable identity only — no version |
| AuthorityToken · ValidationResult | Version data vs validation outcome | Same entity at token 91/92 is one entity |
| Scope · Referent | Addressable ordered ref set; language roles | Explicit bounded retention; no magical promotion |
| SemanticEvent · TurnContext | act + operations; bounded finality | Two facets; endpointing stays in the voice adapter |
| SlotBinding | one per slot; ordered, set-valued refs + provenance | is one value; corrections replace it whole |
| AuthorityAdapter | observe + validate | Truth owner; may differ from the executor |
| CapabilityExecutor | capabilities + invoke; policy + execution semantics | Idempotency and conditional-apply are declared |
| Effect | frozen bindings + arguments + preconditions | At most one logical effect per confirmed revision; never retried silently |
| Transaction | DRAFT → … → DISPATCHED → terminal | CANCELLED pre-dispatch only; compensation is a new intent |
| InteractionLogEntry | input, observation, event, intent, confirmation, freeze, dispatch, outcome | Replay consumes the log, never live authorities |
Acts: . Operations: . / answer whatever obligation is live — a confirmation gate authorizes execution, a clarification just accepts or rejects a proposal, and with no obligation it is only a backchannel.
State machines
Freeze preconditions, dispatch conditionally
VALIDATE is a fast path, not the guarantee: preconditions freeze into the effect. DISPATCH passes the idempotency key and preconditions; executors that support atomic conditional apply check them at the mutation boundary. No consequential mutation executes unless its frozen preconditions still hold there.
means dispatch left the runtime and no authoritative outcome was observed. It is surfaced, journaled, and never auto-retried; a recorded can still resolve it to SUCCEEDED or FAILED. This is the honest contract: at-most-one logical effect, not exactly-once delivery.
| New in rev 4 | Failure it kills |
|---|---|
| I15 Mutation-boundary preconditions (atomic where supported; risk tiers and POLICY_BLOCKED otherwise) | TOCTOU: valid at validate, changed before apply; promises the downstream cannot keep |
| I16 At most one logical effect per confirmed revision; UNKNOWN resolved only by reconciliation | Double sends, retry storms after a lost response |
| Reconciliation via optional | Confusing "unknown outcome" with "permanently unknowable outcome" |
| P7 restated: affirmations with corrective operations cannot authorize the mutated revision | P7 and eval 023 disagreeing about "yeah, but not the second one" |
| I12 social/backchannel are still journaled; they just carry no semantic consequences | "Never mutate durable state" contradicting the event log |
| Scope retention is GC policy with pin rules, not a semantic lifetime | "Scopes live for eight turns" style rules |
Review gate
24 replayable semantic evals
Declarative YAML: world before, events, expected acts, operations, scopes, bindings, intents, effects and exact adapter calls. Two fake domains — tasks and messages — run on the same referent machinery. Implementation starts by making all 24 fail for real, then turning them green one by one.
Social greeting
"hello" → social, zero calls
Backchannel
"yeah" → no state change, no calls
Interrupt preserves pending
"wait" pauses dispatch, keeps AWAITING
Ordered scope
query → one observe, scope = observed order
Ordinal reference
"the second one" + ordinal provenance
Control binds referent
"stop that" → frozen target, no invoke
One logical effect
confirm once; a second "yes" adds nothing
Correction retargets
"the one above" revokes the old gate
Set exclusion
"except the last one" removes one target
Cancel pending
"actually don't" → CANCELLED, no effect
Only execution path
work.execute called only for a request
Stale blocks mutation
token change → STALE_REFERENCE, no invoke
Confirmed bindings frozen
scope drift cannot change dispatches
Explicit supersedes inferred
newer binding replaces older in one slot
Pause / resume effects
queued effects keep original bindings
Referent survives async
ordinal still resolves during execution
Plural & "the other one"
set difference over active scope
Slot-scoped correction
target changes, content preserved
Clarify and resume
out-of-range ordinal asks, answer continues intent
Message full flow
conversation B, same machinery as tasks
"yeah" without a gate
backchannel, cannot commit or fill
"yeah" with a gate
commits the presented revision exactly
"yeah, but not the second one"
mutates, revokes confirmation, nothing dispatches
Full-effect freeze
bindings and preconditions frozen at commit
Anti-pattern-matching
Nine metamorphic properties
| # | Property | Oracle |
|---|---|---|
| P1 | Ordinal invariance | shuffle any scope; "the second one" is always index 1 |
| P2 | Identity invariance | random opaque ids behave identically to A/B/C |
| P3 | Irrelevant-world mutation | unrelated changes never alter "that" |
| P4 | Ambiguity expansion | a new plausible candidate flips to clarification |
| P5 | Bind-then-drift | a resolved binding stays after scope reorder |
| P6 | Freeze invariance | post-commit drift cannot change dispatch bindings |
| P7 | Gate-state dependence | every affirm token commits under a gate, none without |
| P8 | Revision safety | random mutate/confirm sequences never dispatch stale revisions |
| P9 | Mutation-boundary preconditions | a token change after validate cannot produce a silent stale write |
Review response
Rev 4 adopted changes and deferred calls
Circe restored as the product brand (repo and packages included); legacy Circe is prior art archived as . UNKNOWN is reconcilable, not terminal, and never retried. P7 restated so qualified affirmations cannot authorize a mutated revision. Conditional-apply fallback policy with risk tiers and . I12 precision: social/backchannel are journaled but carry no semantic consequences. Scope retention is GC policy with pin rules.
Not blocking. default (8); compensation naming for Phase 4; fast-check as property runner; responder as a port with deterministic default; event-log persistence first; fake executors must model atomic conditional apply, PRECONDITION_FAILED and UNKNOWN so P9 can genuinely fail.
Takeaway
The brand is Circe; the coupling is gone
Legacy Circe appears nowhere in the pipeline or the kernel dependencies — it is evidence and, later, one deletable adapter. What remains is the normal hard part: obligation-based meaning, revision-bound authorization, mutation-boundary preconditions, reconcilable unknown outcomes, and recorded replay. Next: make all 24 scenarios and 9 properties fail for real, then implement them one by one without renegotiating the architecture.
· · · ·