Canonize Persona state v0
This commit is contained in:
parent
ac822e002a
commit
ebd5ee2a3b
8 changed files with 173 additions and 19 deletions
|
|
@ -32,7 +32,7 @@ remembers doctrine; the branch remembers the blade.
|
|||
## Current Orientation
|
||||
|
||||
- Do not copy exact branch or HEAD from this note. Run `git status --short --branch` and `git log --oneline -5`.
|
||||
- Canonical anatomy now lives in `notes/epiphany-anatomy.md`. Embodied sub-agents are Self, Face, Imagination, Eyes, Proprioception, Hands, and Soul. Body, Mind, Continuity, and Substrate Gate are substrate/state/protocol surfaces, not sub-agent identities. State is split by layer: `work_organ` for resident Epiphany sub-agents, `persona` for portable public/person-shaped state shared by Epiphany Face, VoidBot repo Faces, and Ghostlight characters, and heartbeat/swarm state for scheduling and coordination physiology. Persona state now carries provenance, public presentation, generic `candidateActions`, strict anchored thoughts with non-authoritative extensions, and typed affect records for bonds/status reads/doctrine stances.
|
||||
- Canonical anatomy now lives in `notes/epiphany-anatomy.md`. Embodied sub-agents are Self, Face, Imagination, Eyes, Proprioception, Hands, and Soul. Body, Mind, Continuity, and Substrate Gate are substrate/state/protocol surfaces, not sub-agent identities. State is split by layer: `work_organ` for resident Epiphany sub-agents, `persona` for portable public/person-shaped state shared by Epiphany Face, VoidBot repo Faces, and Ghostlight characters, and heartbeat/swarm state for scheduling and coordination physiology. Persona state now carries provenance, required public presentation, `date-time` timestamps, generic `candidateActions`, strict anchored thoughts with non-authoritative extensions, custom enum companion labels, and typed affect records for bonds/status reads/doctrine stances.
|
||||
- The repo now has a one-command local operator path: `.\tools\epiphany_local_run.ps1`. Default mode is `smoke`; it builds the retained Codex app-server compatibility edge, builds native Epiphany operator binaries, runs the coordinator smoke, and writes launcher artifacts under `.epiphany-run/` plus coordinator artifacts under `.epiphany-dogfood/`. `-Mode status` is now Epiphany-native: it builds only Epiphany operator binaries, reads `state/thread-state.msgpack` when present, derives status through `epiphany-core`, and does not start or require `codex-app-server`. Use `-Mode plan` or `-Mode run -MaxSteps 4` for the raw bridge-equipped coordinator entrypoints; use `-Mode mvp -FaceInput "<operator request>" -MaxSteps 4` for the local product cycle that projects Face's character turn, writes a Face/Aquarium bubble, bootstraps a minimal local checkpoint for fresh threads, runs the coordinator with auto-tools, then runs heartbeat sleep/dream maintenance. Live plan/run/mvp modes use the workspace `state/runtime-spine.msgpack`, because CodexThread launch writes worker requests there; the run bundle remains artifact evidence, not runtime lifecycle authority. Add `-ThreadId <id>` and `-Workspace <path>` to inspect or continue an existing thread. `status`, `plan`, and `smoke` do not spend model calls; `run` and `mvp` build and use `epiphany-openai-runtime`. Coordinator workers now launch detached and are polled through runtime-spine instead of blocking the coordinator. MVP runs are non-ephemeral by default so `-ThreadId <id>` can resume and poll later. `-MaxRuntimeSeconds <n>` is passed into worker runtime; timeout writes a failed worker receipt and exits. Failed modeling now blocks downstream verification until the failed result is reviewed.
|
||||
- Current Mom-ready status: the normal MVP pass reaches Face -> coordinator -> detached runtime -> heartbeat sleep, and modeling workers now complete through the ChatGPT subscription transport. The first failure was a stack of violated observability/runtime invariants: worker prompts prepended the whole shared persistent-memory rite, Responses frame liveness was invisible until completion, and the runtime tried to persist hundreds of text deltas before completing the worker job. Role/reorient workers now get a compact Epiphany worker boundary instead of full persistent memory; runtime-spine records sampled raw Responses frame kinds with small previews; contiguous reasoning/text deltas compact before durable storage; and live proofs completed `2fe38dcd-d99e-4c73-9a58-afcc81f851c7`, `241e3851-e3ea-4877-a63b-0d2bbd96a7e2`, and `85149a26-6975-403f-ac93-092b717c5825` instead of timing out. The second failure was stale lifecycle authority: completed runtime jobs remained as unresolved `runtime_links`, replacement launches treated historical active links as current, and one bad validation path opened an orphan job before rejecting the state patch. Latest-link-wins is now the runtime-link invariant, terminal links project completed jobs, stale active history cannot veto replacement, launch validation happens before opening runtime jobs, and completed-but-unreviewable modeling findings stop for review instead of relaunching the same lane. The remaining concrete blocker is architectural: the MVP coordinator has no executable Eyes/source-gather lane. A modeler can return `regather-needed`, but it cannot inspect the missing stream-storage source itself; choose between adding a real research/Eyes specialist lane or routing this regather to the main implementation agent with explicit statePatch banking.
|
||||
- Local operator runs now write typed CultMesh intent/receipt documents to `.epiphany-run/cultmesh/operator-runs.ccmp` through `epiphany-operator-run`. The wrapper writes intent before acting and a completion receipt after success; this is the local consent/trace rail, not a hidden scheduler queue.
|
||||
|
|
@ -140,7 +140,7 @@ remembers doctrine; the branch remembers the blade.
|
|||
- The native runtime-spine hello now publishes the interactive surface catalog, not just the deep runtime bones. In addition to runtime/session/job/memory/heartbeat/ledger documents, Aquarium-discoverable contracts now advertise scene, pressure, reorient, CRRC, jobs, roles, role-result, reorient-result, planning, coordinator, Face, Void memory, repo initialization/birth runner, Rider bridge, and Unity bridge surfaces, with explicit read-only versus coordinator-owned intent/receipt posture. The point is to let Aquarium discover operator affordances from CultNet instead of hard-coding a secret menu of verbs.
|
||||
- Epiphany now publishes those CultNet receipts locally under `schemas/cultnet/`, and `epiphany-runtime-spine schema-catalog --include-schema-json true` emits a merged builtin-plus-local schema catalog Aquarium can consume directly. The local catalog covers runtime-spine documents, durable agent/heartbeat/ledger state, operator-safe `epiphany.surface.*` projections, control intents, and receipt/artifact payloads. The vendored `cultnet-rs` wire contract was aligned with the C# canon at the same time: raw document replication now keys on `schemaId` and `recordKey`, snapshot filters use `schemaIds` / `recordKeys`, and hello supports typed mutation-contract advertisement instead of the old half-remembered payload-schema-version folklore.
|
||||
- Epiphany now owns the canonical schema paperwork locally under `schemas/`. The key receipts are `schemas/cultnet/gamecult.persona_state.v0.schema.json`, `schemas/cultnet/epiphany.work_organ_state.v0.schema.json`, `schemas/canonical-agent-state-schema.md`, `schemas/agent-state-variable-glossary.md`, `schemas/organ-state-profiles.md`, `schemas/repo-personality-birth-projection.md`, and `schemas/heartbeat-state-schema.md`. If a standing trait name like `routing_discipline` changes, or if organ-state, Persona, heartbeat, or birth-projection semantics move, update those docs in the same pass instead of relying on old Ghostlight notes or live store archaeology.
|
||||
- The schema doctrine now makes the profile split explicit: resident Epiphany organs are `work_organ` state with lean role memory and growth via rumination/distillation, while Face is the Epiphany organ that may use portable `persona` state shared with VoidBot repo Faces and Ghostlight characters. Work organs do not inherit Persona affect, social bonds, or status-read machinery. PersonaState now has explicit provenance and presentation surfaces, `candidateActions` as the generic pressure/action field, `voidbotProjection.candidateInterventions` only as a VoidBot compatibility projection, strict anchored thoughts, extension data marked non-authoritative, and typed affect records for bonds/status reads/doctrine stances. `epiphany-agent-memory-store status` and `epiphany-character-loop` now surface profile classification on the wire as `organStateProfile`.
|
||||
- The schema doctrine now makes the profile split explicit: resident Epiphany organs are `work_organ` state with lean role memory and growth via rumination/distillation, while Face is the Epiphany organ that may use portable `persona` state shared with VoidBot repo Faces and Ghostlight characters. Work organs do not inherit Persona affect, social bonds, or status-read machinery. PersonaState now has explicit provenance and required presentation surfaces, `date-time` timestamps, `candidateActions` as the generic pressure/action field, `voidbotProjection.candidateInterventions` only as a VoidBot compatibility projection, strict anchored thoughts, extension data marked non-authoritative, custom enum companion labels, and typed affect records for bonds/status reads/doctrine stances. `candidateActions.actions` and `privateNotes` are deliberate v0 simplifications, not authority surfaces. `epiphany-agent-memory-store status` and `epiphany-character-loop` now surface profile classification on the wire as `organStateProfile`.
|
||||
- Face packets now carry deterministic Ghostlight-style `projectionSeed`, `appraisalSeed`, and `reactionSeed` surfaces rebuilt from local organ traits, relationship memories, perceived overlays, and visible stimulus so the public mouth can use actual projection/appraisal machinery instead of decorative prompt text. Also record this now before some future fool hard-codes singularity: multiple Persona actors are part of the plan, even though the current MVP still routes through one `face` role.
|
||||
- Repo personality initialization now has a terrain-reduced plan and native birth surface. `epiphany-repo-personality scout/project/agent-packet/status` scouts local git repos, scores body taxonomy/history temperament/memory doctrine, writes typed CultCache terrain/profile/role-projection MessagePack stores, emits JSON/Markdown inspection exports, and renders a birth-only Repo Personality Distiller specialist prompt packet. `epiphany-repo-personality startup` now checks for accepted personality/memory initialization records, launches packet generation only when absent, and `accept-init` can route reviewed role `selfPatch` candidates into initial role memory, stamp the newborn Ghostlight trait lattice from deterministic role projections, and seed heartbeat physiology from the same typed role personality projections. The birth specialists are startup-only initialization actuators, not heartbeat lanes; heartbeat receives only the accepted physiology seed. `epiphany-repo-birth-runner` owns the startup-only execution path through `epiphany-model-runtime` typed model-request documents plus runtime-spine receipts and reviewable `result.json`; the old Codex CLI executor path is cut so birth specialists cannot receive Codex prompt wrappers. The remaining seam is Aquarium review/action surfacing. After accepted birth, personality drift belongs to heartbeat, mood, rumination, sleep consolidation, lived evidence, and reviewed `selfPatch`, not repeated startup distillation.
|
||||
- Repo trajectory initialization is now a separate birth-only organ. `epiphany-repo-personality` derives a typed `repo_trajectory_report` from early-history, recent-history, doctrine/content excerpts, and deterministic theme scoring, and `trajectory-packet` renders a startup-only Repo Trajectory Distiller prompt/packet so Self can review historical direction, self-image, implicit goals, and anti-goals before the newborn wakes.
|
||||
|
|
|
|||
|
|
@ -152,6 +152,13 @@ subject/object/kind/trust/tension, status reads name target/kind/confidence,
|
|||
and doctrine stances name principle/stance/action implication. Needs remain
|
||||
anchored thoughts because they behave like pressure records.
|
||||
|
||||
The baseline also requires a public `presentation` block, annotates timestamps
|
||||
as JSON Schema `date-time`, and gives every `custom` enum path a companion
|
||||
custom-label field. `candidateActions.actions` and `privateNotes` stay simple
|
||||
for v0 interchange; if either begins carrying routing, readiness, expiry,
|
||||
provenance, or action authority, promote it into a typed v1 record instead of
|
||||
letting raw strings or generic thoughts grow a steering wheel.
|
||||
|
||||
CultNet is not just ergonomic framing. It also carries CultLib-style auth and
|
||||
session semantics:
|
||||
|
||||
|
|
|
|||
|
|
@ -17,7 +17,9 @@ developer's damp recollection.
|
|||
Ghostlight characters. It carries explicit provenance, public presentation
|
||||
metadata, generic `candidateActions`, and a non-authoritative extension bag
|
||||
for source-specific fields; social bonds, status reads, and doctrine stances
|
||||
are typed affect records rather than generic thought blobs.
|
||||
are typed affect records rather than generic thought blobs. Timestamps use
|
||||
JSON Schema `date-time`, `presentation` is required, and `custom` enum values
|
||||
have companion custom-label fields.
|
||||
- [cultnet/epiphany.work_organ_state.v0.schema.json](./cultnet/epiphany.work_organ_state.v0.schema.json):
|
||||
light function-shaped state for Epiphany internal work organs.
|
||||
- [canonical-agent-state-schema.md](./canonical-agent-state-schema.md):
|
||||
|
|
|
|||
|
|
@ -152,8 +152,10 @@ for portable Personas.
|
|||
Portable Persona documents must carry provenance and presentation metadata.
|
||||
`provenance` says which source system/document produced the state, when it was
|
||||
updated/exported, and whether the document is canonical, a projection, or an
|
||||
import. `presentation` carries the public surface: voice summary, optional
|
||||
avatar/pronouns/renderer, home context or jurisdiction, and public handles.
|
||||
import. Timestamps use JSON Schema `date-time` format. `presentation` is
|
||||
required for public Personas and carries the public surface: voice summary,
|
||||
optional avatar/pronouns/renderer, home context or jurisdiction, and public
|
||||
handles.
|
||||
|
||||
The generic forward-pressure field is `candidateActions`. VoidBot-flavored
|
||||
`candidateInterventions` may exist under `voidbotProjection`, but it is a
|
||||
|
|
@ -168,6 +170,14 @@ confidence, and doctrine stances carry principle/stance/action implication.
|
|||
Needs remain anchored thoughts because they are closer to pressure records than
|
||||
relationship facts.
|
||||
|
||||
Every enum that allows `custom` has a companion custom-label field, so custom
|
||||
does not become a stringly-typed category leak. `candidateActions.actions`
|
||||
remain anchored thoughts in v0; richer action records with action type,
|
||||
delivery target, risk, readiness, and expiry belong in the next version if the
|
||||
shared contract starts carrying executable action pressure. `privateNotes` are
|
||||
raw strings for v0 interchange only and must not become portable state
|
||||
authority without being promoted into typed private-note records.
|
||||
|
||||
## Project Truth Versus Self Truth
|
||||
|
||||
These organ-state records are not the same thing as thread state.
|
||||
|
|
|
|||
|
|
@ -57,7 +57,8 @@
|
|||
"$ref": "#/definitions/personaAffect"
|
||||
},
|
||||
"updatedAt": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -65,6 +66,7 @@
|
|||
"provenance",
|
||||
"personaId",
|
||||
"publicName",
|
||||
"presentation",
|
||||
"activationProfile",
|
||||
"thoughtMemory",
|
||||
"agencyPressure",
|
||||
|
|
@ -84,10 +86,12 @@
|
|||
"type": "string"
|
||||
},
|
||||
"sourceUpdatedAt": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
},
|
||||
"exportedAt": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
},
|
||||
"authority": {
|
||||
"type": "string",
|
||||
|
|
@ -117,7 +121,8 @@
|
|||
"type": "string"
|
||||
},
|
||||
"uri": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"format": "uri"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -130,7 +135,8 @@
|
|||
"additionalProperties": false,
|
||||
"properties": {
|
||||
"avatarUri": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"format": "uri"
|
||||
},
|
||||
"pronouns": {
|
||||
"type": "string"
|
||||
|
|
@ -150,6 +156,9 @@
|
|||
"custom"
|
||||
]
|
||||
},
|
||||
"customRenderer": {
|
||||
"type": "string"
|
||||
},
|
||||
"homeContext": {
|
||||
"$ref": "#/definitions/target"
|
||||
},
|
||||
|
|
@ -166,6 +175,25 @@
|
|||
},
|
||||
"required": [
|
||||
"voiceSummary"
|
||||
],
|
||||
"allOf": [
|
||||
{
|
||||
"if": {
|
||||
"properties": {
|
||||
"defaultRenderer": {
|
||||
"const": "custom"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"defaultRenderer"
|
||||
]
|
||||
},
|
||||
"then": {
|
||||
"required": [
|
||||
"customRenderer"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"traitVector": {
|
||||
|
|
@ -285,11 +313,33 @@
|
|||
},
|
||||
"label": {
|
||||
"type": "string"
|
||||
},
|
||||
"customKind": {
|
||||
"type": "string"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"kind",
|
||||
"id"
|
||||
],
|
||||
"allOf": [
|
||||
{
|
||||
"if": {
|
||||
"properties": {
|
||||
"kind": {
|
||||
"const": "custom"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"kind"
|
||||
]
|
||||
},
|
||||
"then": {
|
||||
"required": [
|
||||
"customKind"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"thoughtStatus": {
|
||||
|
|
@ -347,13 +397,16 @@
|
|||
"maximum": 1
|
||||
},
|
||||
"createdAt": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
},
|
||||
"updatedAt": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
},
|
||||
"retiredAt": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
},
|
||||
"tags": {
|
||||
"type": "array",
|
||||
|
|
@ -473,7 +526,8 @@
|
|||
"type": "string"
|
||||
},
|
||||
"updatedAt": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -501,7 +555,8 @@
|
|||
"type": "string"
|
||||
},
|
||||
"updatedAt": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
|
|
@ -544,6 +599,9 @@
|
|||
"custom"
|
||||
]
|
||||
},
|
||||
"customRelationshipKind": {
|
||||
"type": "string"
|
||||
},
|
||||
"summary": {
|
||||
"type": "string"
|
||||
},
|
||||
|
|
@ -566,7 +624,8 @@
|
|||
"$ref": "#/definitions/anchoredThought"
|
||||
},
|
||||
"updatedAt": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
},
|
||||
"extensions": {
|
||||
"$ref": "#/definitions/extensions"
|
||||
|
|
@ -582,6 +641,25 @@
|
|||
"trust",
|
||||
"tension",
|
||||
"updatedAt"
|
||||
],
|
||||
"allOf": [
|
||||
{
|
||||
"if": {
|
||||
"properties": {
|
||||
"relationshipKind": {
|
||||
"const": "custom"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"relationshipKind"
|
||||
]
|
||||
},
|
||||
"then": {
|
||||
"required": [
|
||||
"customRelationshipKind"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"statusRead": {
|
||||
|
|
@ -612,6 +690,9 @@
|
|||
"custom"
|
||||
]
|
||||
},
|
||||
"customStatusKind": {
|
||||
"type": "string"
|
||||
},
|
||||
"summary": {
|
||||
"type": "string"
|
||||
},
|
||||
|
|
@ -634,7 +715,8 @@
|
|||
"$ref": "#/definitions/anchoredThought"
|
||||
},
|
||||
"updatedAt": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
},
|
||||
"extensions": {
|
||||
"$ref": "#/definitions/extensions"
|
||||
|
|
@ -648,6 +730,25 @@
|
|||
"summary",
|
||||
"confidence",
|
||||
"updatedAt"
|
||||
],
|
||||
"allOf": [
|
||||
{
|
||||
"if": {
|
||||
"properties": {
|
||||
"statusKind": {
|
||||
"const": "custom"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"statusKind"
|
||||
]
|
||||
},
|
||||
"then": {
|
||||
"required": [
|
||||
"customStatusKind"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"doctrineStance": {
|
||||
|
|
@ -674,6 +775,9 @@
|
|||
"custom"
|
||||
]
|
||||
},
|
||||
"customStanceKind": {
|
||||
"type": "string"
|
||||
},
|
||||
"principle": {
|
||||
"type": "string"
|
||||
},
|
||||
|
|
@ -689,7 +793,8 @@
|
|||
"maximum": 1
|
||||
},
|
||||
"updatedAt": {
|
||||
"type": "string"
|
||||
"type": "string",
|
||||
"format": "date-time"
|
||||
},
|
||||
"extensions": {
|
||||
"$ref": "#/definitions/extensions"
|
||||
|
|
@ -704,6 +809,25 @@
|
|||
"summary",
|
||||
"actionImplication",
|
||||
"updatedAt"
|
||||
],
|
||||
"allOf": [
|
||||
{
|
||||
"if": {
|
||||
"properties": {
|
||||
"stanceKind": {
|
||||
"const": "custom"
|
||||
}
|
||||
},
|
||||
"required": [
|
||||
"stanceKind"
|
||||
]
|
||||
},
|
||||
"then": {
|
||||
"required": [
|
||||
"customStanceKind"
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"personaAffect": {
|
||||
|
|
|
|||
|
|
@ -100,10 +100,21 @@ usable by Ghostlight and Epiphany Face.
|
|||
The generic action surface is `candidateActions`. VoidBot may project those
|
||||
actions back into `voidbotProjection.candidateInterventions` for repo-Face
|
||||
routine compatibility, but that projection does not own the portable contract.
|
||||
In v0, candidate actions remain anchored thoughts. That is enough for shared
|
||||
pressure and intention exchange, but richer action records with action type,
|
||||
delivery target, risk, readiness, and expiry are the obvious v1 pressure.
|
||||
|
||||
`anchoredThought.extensions` is a quarantine bag for source-specific fields.
|
||||
Portable consumers may preserve those fields, but they are not authoritative
|
||||
PersonaState unless the consumer explicitly understands the source contract.
|
||||
Timestamp fields use JSON Schema `date-time` format, public Persona documents
|
||||
must include `presentation`, and any `custom` enum value must carry a companion
|
||||
custom-label field rather than leaving consumers with a shrug in a hat.
|
||||
|
||||
`privateNotes` are still raw strings in v0 for simple interchange. They should
|
||||
not become portable authority; if private notes start needing provenance,
|
||||
lifecycle, or routing semantics, promote them into typed private-note records or
|
||||
drop them from the shared interchange surface.
|
||||
|
||||
The affect surface is not one flat thought bucket. Needs still use
|
||||
`anchoredThought`, but bonds carry subject/object/kind/trust/tension, status
|
||||
|
|
|
|||
Binary file not shown.
|
|
@ -74,7 +74,7 @@ active_subgoals:
|
|||
- CultMesh is now the preferred ergonomic Rust abstraction over CultCache and CultNet for Epiphany-owned local database surfaces. The Rust substrate is repo-contained under `vendor/cultcache-rs`, `vendor/cultnet-rs`, and `vendor/cultmesh-rs`; the old `E:\Projects\CultLib\crates\*` path is dead in this checkout and must not be reintroduced as a compile-time dependency. Future local Verse/dream/status work should start at CultMesh unless it is explicitly polishing CultMesh internals. Preserve the three-Verse boundary: `epiphany-internal` for private sub-agent typed state, `gamecult-local` for trusted LAN/Yggdrasil-tunnel GameCult project sharing, and `epiphany-global` for untrusted public dreams plus topic-specific threaded public rooms for Face posts.
|
||||
- The active priority is Codex starvation and CultNet liberation. Use `notes/codex-starvation-and-cultnet-liberation-plan.md` as the directive and `notes/codex-auth-spine-inventory.md` as the source-grounded keeper list for the retained OpenAI subscription auth/model transport bridge. Classify all Epiphany-relevant JSON contamination, define the native CultNet runtime boundary, keep worker launch/result/selfPatch cargo as typed documents, evacuate Epiphany operator/state/process authority from Codex JSON-RPC, wrap MCP's unavoidable JSON protocol edge in typed Epiphany intent/result/receipt documents, and keep cutting until Epiphany can run its own state and processes without `codex_message_processor.rs` except for bridge compatibility.
|
||||
- Use `notes/epiphany-anatomy.md` as the canonical anatomy map. Embodied sub-agents are Self, Face, Imagination, Eyes, Proprioception, Hands, and Soul. Body is substrate, Mind is persistent state/state admission, Continuity is recovery/compaction/sleep protocol machinery, and Substrate Gate is substrate access protocol.
|
||||
- Organ state now has a hard profile split: resident Epiphany sub-agents use lean `work_organ` state, public/person-shaped agents use portable `persona` state, and heartbeat/swarm machinery owns scheduling/coordination physiology. Face is the Epiphany organ; Persona is the shared GameCult contract for Epiphany Face, VoidBot repo Faces, and Ghostlight characters. Persona documents carry provenance, public presentation metadata, generic `candidateActions`, strict anchored thoughts with non-authoritative extensions, and typed affect subrecords for bonds/status reads/doctrine stances. Work organs must not inherit Persona affect/social-bond/status-read machinery just because the old Ghostlight-derived shape had room for it.
|
||||
- Organ state now has a hard profile split: resident Epiphany sub-agents use lean `work_organ` state, public/person-shaped agents use portable `persona` state, and heartbeat/swarm machinery owns scheduling/coordination physiology. Face is the Epiphany organ; Persona is the shared GameCult contract for Epiphany Face, VoidBot repo Faces, and Ghostlight characters. Persona documents carry provenance, required public presentation metadata, `date-time` timestamps, generic `candidateActions`, strict anchored thoughts with non-authoritative extensions, custom enum companion labels, and typed affect subrecords for bonds/status reads/doctrine stances. Work organs must not inherit Persona affect/social-bond/status-read machinery just because the old Ghostlight-derived shape had room for it.
|
||||
- The next Codex-starvation slice is the Eyes/source-gathering fork exposed by the Mom-ready MVP proof. The quarantined Codex MCP spine may execute typed tool intents and emit typed receipts; the model runtime can build and run provider-neutral follow-up turns from those receipts; coordinator run mode passes the quarantined tool adapter into worker runtime with auto-tools enabled by default; worker runtime now enforces max-runtime with one timeout close primitive for both tokio timeout and watchdog paths; inner `openai-worker-*` jobs are opened before async auth/stream waits and sealed with their outer worker on timeout; native status/roles/jobs/coordinator surfaces project failed and completed runtime-linked jobs as terminal without Codex prompt or scheduler authority; direct tiny model-turn transport succeeds; worker requests record request metrics, transport readiness, and sampled raw Responses frame kinds; worker prompts no longer prepend the full shared persistent-memory rite; stream deltas compact before durable storage; live MVP modeling workers complete instead of timing out; stale completed runtime links no longer block replacement launches; jobLaunch validates before opening runtime jobs; and completed-but-unreviewable modeling findings now stop for review instead of relaunching the same blind lane. The remaining blocker is structural: the MVP coordinator has no executable Eyes/source-gather lane, so a modeler that returns `regather-needed` cannot inspect the missing source itself.
|
||||
- The May 2026 teardown/rebuild migration is archived under `notes/archive/epiphany-ideal-architecture-rebuild-plan.md` unless a concrete regression reopens it. Preserve the new foundation: Epiphany view/coordinator policy lives in `epiphany-core`, runtime-spine owns job/result lifecycle identity through `runtime_links`, duplicate acceptance is receipt-keyed, public findings stay typed/sealed, view expansion requires a core contract, and app-server remains routing/adaptation rather than a second policy throne.
|
||||
- Treat Phase 5 update/distill/propose/promote/read/notification as complete enough unless a concrete regression appears.
|
||||
|
|
|
|||
Reference in a new issue