Soul's Cut 2 findings, fixed before Cut 3a.
- TypedCommitStore gains `backing_store: fn(&Path) -> Result<RuntimeSpineBackingStore>`,
and `open_cache` now takes the resolved store instead of a path. The owner
resolves the store once per commit and uses it for the cache load, the batch
CAS, and the conflict re-read, so a profile can no longer read one store and
write another. The hard-coded `runtime_spine_backing_store(store_path)` calls
in the owner are gone.
- `runtime_spine_cache` delegates to the new `open_runtime_spine_cache`, which
the Mind profile uses as its opener. The epoch check stays in that opener.
- The profile's implicit contracts are documented on the type.
- Tests: the test profile's backing store is a sibling of the commit path, so
re-deriving the store from the path fails; a foreign-epoch Mind store refuses
a commit with nothing written; a replay through a profile whose validator now
refuses the batch is refused rather than answered with the stored receipt.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Cut 2 of the Eureka pipeline state campaign, behaviour-preserving.
commit_authorized_mind_mutation stays the only code that builds receipts,
replays and runs batch CAS, but no longer hard-codes the Mind store:
- TypedCommitStore { store_id, open_cache, validate_write } is its first
argument.
- MIND_COMMIT_STORE = { "epiphany-mind", runtime_spine_cache,
validate_mind_write_envelope }, passed by all six wrappers.
- Deleted from the owner: runtime_spine_cache(store_path),
validate_mind_write_envelope(write), and the two "epiphany-mind"
literals on receipt versions.
The backing store for CAS stays runtime_spine_backing_store(store_path).
Tests:
- typed_commit_store_profile_owns_open_validate_and_store_id: a test
profile with a two-type registry and a key-refusing validator; a
refused write leaves the store byte-identical, and receipt versions
carry the profile's store id.
- mind_commit_store_profile_keeps_mind_validation_receipts_replay_and_conflicts:
through a Mind wrapper, Mind semantic-identity validation refuses
without writing, receipt versions carry "epiphany-mind", the receipt id
equals a pinned digest, exact replay returns the stored receipt, and a
stale strong read maps to Conflict naming it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Soul's Cut 1 finding F2: the two read pins only proved the seeded store
file's mtime was unchanged, so a store attached at a shadow path (every
read writing path.with_extension("shadow.cc")) survived all 156 tests.
state_cache_reads_without_writing_the_store and
persona_social_cache_reads_without_writing_the_store now snapshot every
directory entry (name, length, mtime) before and after the read, require
exactly the store and its lock file, and require the snapshot unchanged.
cultcache-rs at a0813c6 exposes no backing-store count on CultCache, so
the directory is the observable layer.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
The re-pin swapped load_envelope for put_envelope on the claim that each
site's cache has no store attached, so put_envelope stays memory-only.
No existing test observed that: attaching the store in state_cache left
every resident_self test passing, because re-pushing the envelope just
read rewrites identical bytes.
Each test seeds its store, sets the file's modified time to a fixed past
instant, reopens the cache and requires the time to be unchanged. Any
push replaces the file through a staged rename, so attaching a store to
state_cache or persona_social_cache now fails the matching test. The
retirement-receipt site takes a snapshot slice with no path, so it cannot
acquire a store without a signature change.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Operator ruling (2026-09-15): Q1-Q5 all A. That means:
- one single-file store per repo, with an admission-replay merge;
- additive-only epochs;
- merge_exclusion settlement;
- voidbot indexes the default branch only;
- schemars unconditional in core.
The Eureka skill is also published as the GameCult/Eureka repo, and Cut 5's
skill edits land there.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Cut 1 of the Eureka pipeline state campaign. Moves every CultLib
dependency from e171eca3 to main a0813c6.
- load_envelope was deleted upstream (CultLib 4ed9871). The 12 sites in
persona_conversation, persona_social_state and resident_self now call
put_envelope. Each site feeds a cache built with CultCache::new() in
the same function with no backing store attached, so home_index
returns None and put_envelope only inserts into memory, exactly as
load_envelope did. validate_envelope is byte-identical across the pins.
- add_generic_backing_store now returns Result; the three production
sites and five test sites propagate it with ?.
No ownership change.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Imagination's cut map, built from probes:
1. Re-pin CultLib: 12 load_envelope sites; core 154/154 at the new pin.
2. One profile-parameterized commit owner.
3. The pipeline document set, lease, admission, queries, and a merge command.
4. The eureka-state stdio MCP package.
5. Skill wiring.
6. A proof campaign on the CultRecordRefFormatter follow-ups.
7. voidbot projection.
Five operator questions are open. The target now drops the claim that the
store merges in git, and records that voidbot indexes only default branches.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Operator ruling (2026-09-15): only one Epiphany or Eureka may write a repo's
pipeline store at a time, and a second concurrent writer is refused. A merge
tool still reconciles divergent copies through admission, reporting true
conflicts as typed refusals rather than letting the last writer win.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Operator ruling (2026-09-15), superseding the user-level store: each
campaign's store is committed in the repo where the task runs, and
knowledge crosses repos only through explicit sharing. Pushing the working
branch syncs it to Yggdrasil, where voidbot's existing repo mirror indexes
it.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Operator ruling (2026-09-15): Epiphany owns the typed schemas and admission
for pipeline state (findings, rulings, cut specs and reports, follow-ups).
The Eureka Claude Code skill reaches that state through a per-session Rust
stdio MCP server, built as an Epiphany package, over one user-level store.
voidbot indexes a projection for semantic search. The campaign re-pins
CultLib first, and Epiphany adopting Eureka's habits follows later.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Codex, Claude and OpenAI-compatible APIs reach Epiphany through connectors
that share one standardized Epiphany-facing CultNet API, also used by
Ghostlight. Codex is one connector backend, not Epiphany's body.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
main's only commit not on this branch deletes the stale compaction scratch and
the superseded protocol/controller-actions.md (census REC-045/REC-104). Merging
it here lets main fast-forward to the live branch, so Epiphany's default branch
stops pinning the retiring standalone cultcache-rs and cultnet-rs submodules.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Deletes state/scratch-compaction-17cd64d8-da88-4642-a871-4cf1b768c20a.md: a
pre-compaction memory dump naming lost E:\Projects paths, a set of
"pseudo-Epiphany" repos to migrate, and the native
epiphany-agent-memory-store binary as its validation gate. That binary was
removed along with the other parallel executable control planes (commit
387afe49, 2026-08-23). The prompt doc the scratch describes producing
(notes/true-epiphany-memory-migration-sandbox-prompt.md) was already either
admitted or abandoned; the scratch itself records no unresolved next action
beyond "commit the doc," which git history shows happened or didn't
independently of this file.
Deletes protocol/controller-actions.md: self-described as "the legacy/manual
controller discipline from the first external-state prototype," it still
instructs writes to state/branches.json and state/evidence.jsonl — both
verified absent from the current tree (git show origin/main:state/branches.json
and :state/evidence.jsonl both fail). No Rust source references
"controller-actions" (checked via git grep across *.rs).
FALSIFIED, not cut: REC-104 also named "orphan prompt files"
(epiphany-state-model/src/prompts/epiphany_doctrine.md and
epiphany_state_intro.md) as dead. They are not — epiphany-state-model/src/
prompt.rs:30-31 pulls both in via include_str!, and epiphany-core/Cargo.toml:40
depends on epiphany-state-model as a path dependency. Deleting them would
break the build. Left untouched; see the coordinator report.
MOOT, not cut: REC-104's "stale scratch tail" referred (per
pass-one/deletion-candidates.md and branch-graveyard.md:390) to a leftover
EpiphanyRuntimeJobResult action at the tail of state/scratch.md. That file
now reads only "No active scratch subgoal. Rehydrate from state/map.yaml..."
— already retired before this pass, independent of this repo's current
(and very much alive) EpiphanyRuntimeJobResult type used throughout
epiphany-core/src/runtime_spine.rs.
Kill attempts: git grep -n for both deleted filenames across origin/main,
and rg across all of F:/Projects excluding target/node_modules/.git/
.epiphany-run: only the census documents and gamecult-site's generated
interactive repo-doc-tree (a static GitHub-link catalog, not a functional
reader) reference either path.
Collision check: git diff --stat origin/main against the active checkout
(codex/epiphany-shakedown-live), the epiphany-model-bridge worktree, and all
four detached .epiphany-run / temp worktrees, over both deleted paths: all
empty.
REC-045, REC-104 (partial)
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
What the improvised Self/Modeling/Imagination/Hands/Soul/Steward pipeline
did across nine design passes and four cuts, where it paid, where it leaked,
and what Epiphany's structured implementation should make typed: faculty
artifacts as schemas, rulings as a first-class artifact, a landed-names
digest per cut, owner-scoped edit queues, structural steward triggers, a
Self that cannot open source except through a faculty, and swarm visibility
as a read surface.
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
The worktree had been sitting on a partial `cargo fmt` run: 15 files reflowed,
mostly multi-line derive attributes collapsed onto one line, with no semantic
change anywhere in the diff. It was never finished -- `cargo fmt --check` still
flagged resident_readiness.rs, which the pass had not reached.
Completed rather than reverted, since the formatting is what rustfmt produces
and leaving it half-applied is the only bad option. 16 test binaries pass.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Epiphany carried three vendored copies: CultCache and CultNet as submodules on
their own branches of the retiring standalone repos, and a 491-line in-tree
CultMesh, a third Rust CultMesh lineage after CultLib's and Odin's.
None of it was load-bearing. Against CultLib the CultCache fork held nothing
unique, CultNet held one function that CultLib had all along but kept private,
and CultMesh held two thin delegations to CultCache. All three are now exposed
in CultLib, so this repoint needed no code changes at all: the workspace
compiles and its 16 test binaries pass against the pinned revision unchanged.
The submodule working tree also carried an uncommitted change, which turned out
to be a rustfmt reflow of one test expression. Nothing was lost with it.
Only the manifests move here. The in-flight epiphany-core work is left
uncommitted and untouched.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude Code reads CLAUDE.md, not AGENTS.md, so this repo's doctrine was
invisible to it. This one-line import makes the existing AGENTS.md load
without duplicating or renaming it. Codex is unaffected.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>