8.2 KiB
Epiphany Fork Implementation Plan
This is the current implementation plan for Epiphany as an opinionated fork of Codex.
It is not a changelog. Git history, commit messages, smoke artifacts, and
targeted logs already do the proof job without turning this file into a hay
bale; state/evidence.jsonl carries only distilled belief-changing evidence.
The purpose of this note is to answer four questions:
- what exists now
- what boundaries must not be blurred
- what we have learned
- what the next real implementation organs are
Lineage
This note started as notes/codex-epiphany-mode-plan.md in commit e64eee9.
It described Phase 1: add a durable Epiphany thread-state seam to vendored
Codex without changing normal Codex behavior.
The note was later renamed because Epiphany stopped being "a Codex mode" and became a fork-level modeling architecture. The rename was correct. The later append-only status drift was not. A plan that records every landed micro-slice forever becomes the documentation equivalent of the Jenga tower.
Historical detail belongs in:
git logstate/evidence.jsonl, when the detail changes what a future agent should believenotes/fresh-workspace-handoff.mdnotes/epiphany-current-algorithmic-map.md
This file carries the distilled plan.
Current Baseline
Phase 1 through Phase 5 are complete enough.
The landed machine now has:
- durable Epiphany thread state in Codex protocol/core rollout state
- prompt integration through a bounded
<epiphany_state>developer fragment - typed client read exposure through
Thread.epiphanyState - hybrid repo retrieval through
thread/epiphany/retrieve - explicit persistent semantic indexing through
thread/epiphany/index - repo-owned heavy implementation in
epiphany-core - typed state mutation through
thread/epiphany/update - read-only observation distillation through
thread/epiphany/distill - read-only map/churn proposal through
thread/epiphany/propose - verifier-backed promotion through
thread/epiphany/promote - successful-write notification through
thread/epiphany/stateUpdated - response-level and notification-level revision and changed-field metadata
- direct-update validation for malformed appended records and structural replacements
- proposal and promotion rules that reduce map/churn Jenga pressure
- reusable Phase 5 app-server smoke coverage in
tools/epiphany_phase5_smoke.py - a first Phase 6 read-only reflection surface through
thread/epiphany/scene - live Phase 6 scene app-server smoke coverage in
tools/epiphany_phase6_scene_smoke.py - read-only Phase 6 job/progress reflection through
thread/epiphany/jobs - live Phase 6 jobs app-server smoke coverage in
tools/epiphany_phase6_jobs_smoke.py - read-only Phase 6 targeted state-shard reflection through
thread/epiphany/context - live Phase 6 context app-server smoke coverage in
tools/epiphany_phase6_context_smoke.py
The current phase is Phase 6: reflection boundary and observable harness state.
Boundary Rules
These boundaries are more important than the individual method names:
thread/epiphany/retrieveis read-only.thread/epiphany/distillis read-only.thread/epiphany/proposeis read-only.- Durable typed state writes go through
thread/epiphany/updateor acceptedthread/epiphany/promote. thread/epiphany/indexmay update the semantic retrieval catalog, but it is not a hidden Epiphany-state writer.thread/epiphany/sceneis a client reflection, not a second source of truth.thread/epiphany/jobsis a derived reflection, not a scheduler or durable job store.thread/epiphany/contextis a targeted reflection, not a state writer or hidden proposal engine.- The GUI may render and steer typed state, but it must not manufacture canonical understanding.
- The app-server remains a host seam; Epiphany-owned machinery should live in
epiphany-corewhere practical. - Qdrant is the preferred persistent semantic backend; BM25 remains the bootstrap/fallback/control path.
If a new feature violates one of these rules, stop and redesign before writing more Rust-flavored archaeology.
What We Learned
State can rot exactly like code.
The failure mode is not only speculative implementation cruft. Persistent memory can also become a pile of locally true fragments that no longer help the next agent model the whole machine. That is the same Jenga problem with nicer headings.
The current lessons:
- Keep the algorithmic map as the source-audited control-flow description.
- Keep the implementation plan as a distilled forward plan, not a trophy wall.
- Keep the harness-surfaces note as a surface contract, not a dump of every possible future type.
- Keep
fresh-workspace-handoff.mdas a re-entry packet, not a substitute brain. - Keep
state/evidence.jsonlas a durable distilled ledger, not an activity feed. - Revert failed code hypotheses immediately.
- Distill failed or obsolete state hypotheses just as aggressively.
The plan should get shorter after a phase completes, not longer by default.
What We Need To Know Next
The next unknown is not whether Epiphany can preserve, read, propose, promote, and notify typed state. It can.
The next unknowns are:
- how to expose live long-running job progress without making the GUI authoritative
- when watcher-driven invalidation becomes necessary instead of merely tempting
- how to expose context pressure as a real runtime signal for automatic CRRC
- how much automatic CRRC coordination belongs in runtime before it becomes ceremony machinery
- what Phase 6 should prove before specialist scheduling begins
Phase 6 Direction
Phase 6 should grow observable harness state outward from the typed spine.
Useful candidates:
- Add watcher/freshness inputs when stale graph or retrieval state needs earlier warning.
- Add live job progress notifications only after there is a real long-running owner to report.
- Add targeted scene/jobs/context fields only when a client or smoke exposes a real gap.
Do not spend Phase 6 polishing Phase 5 out of anxiety. The Phase 5 smoke harness is a regression guardrail, not a ritual drum circle for summoning more tiny hardening slices.
Later Phases
These remain later work:
- watcher-driven semantic invalidation
- automatic observation promotion from tool output
- richer evidence and graph-shard inspection beyond the landed targeted context read
- role-scoped specialist-agent registry and scheduling
- mutation gates that warn or block broad writes when map freshness is stale
- automatic CRRC runtime coordination with typed context-pressure telemetry
- GUI workflows for graph, evidence, job, invariant, and frontier steering
Do not start these from vibes. Each one needs a source-grounded slice plan and a clear invariant that says what it must not break.
Verification Guardrails
Use focused checks for the surface being changed.
Before modifying Phase 5 control-plane behavior, run:
& 'C:\Users\Meta\.cache\codex-runtimes\codex-primary-runtime\dependencies\python\python.exe' '.\tools\epiphany_phase5_smoke.py'
Before modifying scene projection behavior, run:
& 'C:\Users\Meta\.cache\codex-runtimes\codex-primary-runtime\dependencies\python\python.exe' '.\tools\epiphany_phase6_scene_smoke.py'
Before modifying jobs reflection behavior, run:
& 'C:\Users\Meta\.cache\codex-runtimes\codex-primary-runtime\dependencies\python\python.exe' '.\tools\epiphany_phase6_jobs_smoke.py'
Before modifying targeted context-shard behavior, run:
& 'C:\Users\Meta\.cache\codex-runtimes\codex-primary-runtime\dependencies\python\python.exe' '.\tools\epiphany_phase6_context_smoke.py'
For app-server protocol changes, expect to run the relevant protocol tests, regenerate stable schema fixtures when needed, and verify the generated tree is intentional.
On this Windows machine, use:
$env:CARGO_TARGET_DIR='C:\Users\Meta\.cargo-target-codex'
Do not parallelize cargo builds or tests against the same target directory.
Planning Rule
When this file changes, prefer replacement and distillation over accretion.
A good update should usually:
- remove obsolete phase prose
- preserve the current boundary rules
- name the next larger organ
- move historical proof into evidence or git
- leave the next agent with less to carry, not more