3 changes for clearer dev roadmap:
1. v3-phase-15-mvp-scope-gates.md — added G9A Placement Controller MVP
per architect direction 2026-04-26. Sits between G9 lifecycle and
G10 snapshot. P0 priority. Source rationale: production block
storage needs V2-like operational ergonomics (operator asks for
intent → system computes placement → master mints assignment) but
V3 authority discipline must be preserved (no heartbeat-as-
authority, no V2 promote/demote). G9A bridges the two:
- flat-topology RF placement (NO rack/AZ awareness in P15)
- durable desired topology generation
- explainable candidate filtering (why selected, why rejected)
- replacement-on-drain/disk-loss
- master mints ONLY from desired topology
Explicit non-scope (defer to G20 / P16): rack-aware, hot rebalance,
automatic load movement, multi-master HA, V2 promote/demote.
Updated P0 table, dependency graph §4.5, closure rule §5 #13.
2. v3-dev-roadmap.md (NEW) — 1-page entry point for "where are we,
what's next." Lists 22 P15 gates with status emoji, current
batch state, naming decoder, source-of-truth pointers, recently
closed batches, prediction for after-G5. QA owns; updates at
every gate-close.
3. v3-phase-development-model.md — added §0 header note clarifying
this is methodology-only, NOT current state. Points to
v3-dev-roadmap.md as current-state entry. Methodology sections
(§1-§6, §8-§14) remain canonical.
Doc layer architecture now:
Methodology: v3-phase-development-model.md (stable)
Roadmap: v3-dev-roadmap.md (entry point; updated per gate-close)
Canonical: v3-phase-15-mvp-scope-gates.md (22 gates + closure)
Rationale: v3-product-placement-authority-rationale.md (why G9A)
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
51 KiB
V3 Phase Development Model
Date: 2026-04-11 (methodology stable; NOT current-state — see §0 below)
Status: methodology reference; for current state see v3-dev-roadmap.md
Purpose: define how V3 phases should be run so every phase has a clear target, a closed loop, and a visible path toward production scope
§0 Document scope (added 2026-04-26)
This doc is the methodology, NOT the current state. Sections describe the closed-loop discipline, target/proof/closure rules, and suggested phase shapes. Some illustrative examples (especially §7 "Suggested V3 Phases" and §15 "Production Roadmap Layer") were drafted Apr 2026 and may not match current reality.
For current state, go to:
| Question | Doc |
|---|---|
| What's done, what's next, where are we? | v3-dev-roadmap.md |
| What does P15 promise (22 gates)? | v3-phase-15-mvp-scope-gates.md |
| Why pre-declared topology + authority discipline? | v3-product-placement-authority-rationale.md |
This doc remains canonical for: (§1-§6) closed-loop discipline rules; (§8) anti-pattern closure mapping; (§9) phase-gates-must-stay-narrow rule; (§10-§14) repo bootstrap + naming conventions. These are methodology-stable.
1. Short Answer
Yes, V3 should use phase-based development.
In fact, V3 needs phase discipline even more than V2, because:
V3is trying to protect semantic cleanliness- it is likely to reuse execution muscles that do not fully align
- it may later support multiple runtimes such as Go and Rust
- it must not quietly accumulate workaround semantics while "moving fast"
So the point of phases is not bureaucracy.
The point is:
- each phase must have one clear target
- each phase must define what it will not do
- each phase must define what counts as proof
- each phase must close its loop before the next phase expands scope
2. What A Closed Loop Means In V3
For V3, a phase is not closed when code exists.
A phase is closed only when all four are true:
- the semantic target is explicit
swimplemented only that targettestervalidated the intended proof level- the result was recorded in a durable phase decision/progress artifact
That means the loop is:
target
-> implementation
-> evidence
-> review
-> accepted closure
If one of these is missing, the phase is not closed.
3. Why V3 Needs Stronger Phase Rules Than V2
V2 had to discover many truths while implementation was already moving.
V3 has a different job:
- preserve the semantic lessons already learned
- prevent old route pollution from re-entering
- convert design package into a portable semantic platform
That means V3 phases should be stricter about:
- semantic scope
- non-goals
- evidence gates
- reuse boundaries
4. Phase Shape
Each V3 phase should contain three documents:
phase-xx.mdphase-xx-log.mdphase-xx-decisions.md
This follows the earlier project process, but the content emphasis changes for V3.
4.1 phase-xx.md
Use for:
- current phase target
- current scope
- explicit non-goals
- accepted guardrails
- handoff expectations for
swandtester
It should stay short.
4.2 phase-xx-log.md
Use for:
- design evolution
- review corrections
- carry-forward items
- reuse notes from
V2 - why a boundary moved or stayed fixed
It can be longer.
4.3 phase-xx-decisions.md
Use for:
- durable decisions
- gate decisions
- accepted compromises
- explicit "do not re-open without new evidence" items
This keeps V3 from re-arguing the same architecture boundary every week.
5. Required Fields For Every V3 Phase
Every phase should explicitly answer these questions.
5.1 Target
What single thing is this phase trying to establish?
Good examples:
- mini engine can execute deterministic conformance
- adapter-backed route can drive one real recovery family path
- selected
V2scenarios calibrate correctly underV3
Bad examples:
- improve architecture
- make
V3better - support more stuff
5.2 Scope
What is included in this phase?
5.3 Non-goals
What is explicitly excluded in this phase?
This is critical for V3, because otherwise:
- storage extensions leak in early
- scheduler policy leaks into semantic core
- mismatched
V2muscles get imported "temporarily"
5.4 Reuse boundary
What may be reused from V2, and in what form?
Examples:
- reference only
- wrapper allowed
- copy allowed
- must rewrite in native
V3form
5.5 Required proof
What evidence level is required?
Examples:
- schema validation
- conformance runner
- adapter-backed calibration
- selected runner scenarios
5.6 Reject conditions
What makes this phase fail, even if code exists?
Examples:
- duplicate semantic route appears
- projection is reused as control input
- terminal success has multiple authorities
- adapter silently decides policy
5.7 Closure Checklist
Every phase should also answer three closure questions explicitly.
These are not optional review style points.
They are part of whether the phase is actually closed.
A. Semantic closure
Question:
Has the semantic route evolved far enough for this phase, with the required constraints complete and no hidden anti-pattern dependence?
Must check:
- the engine / adapter / accepted command boundary now covers the semantic target of this phase
- stale, reorder, overlap, timeout, cancel, and handoff behavior are fail-closed at the proof level required by this phase
- target meaning, lineage meaning, and terminal truth authority are still explicit and fixed
- no new surface quietly turns progress, projection, transport state, or policy hints into semantic truth
- relevant anti-patterns from
protocol-anti-patterns.mdare either:- already closed
- explicitly bounded in this phase
- or explicitly deferred to a named later phase
Short form:
the semantic contract needed by this phase is complete enough, and it does not quietly depend on timing luck or execution residue.
B. Functional closure
Question:
Does the new function introduced in this phase, including any V2 muscle
migration, work cleanly and honestly at the intended boundary?
Must check:
- new behavior is inside the declared scope of the phase
- any migrated
V2execution muscle names what old semantic coupling was removed - code path, docs, scope statement, and test/evidence story all describe the same capability
- integration behavior exists at the intended level, not only isolated local unit success
- the claimed feature has enough evidence to prevent "implemented but not actually closed" drift
Short form:
new function and migrated execution both land cleanly, and the evidence matches the real product/runtime claim.
C. Phase-responsibility closure
Question:
Is this work closed in the correct phase, rather than quietly borrowing authority from a later phase or leaving a current-phase obligation unresolved?
Must check:
- the work belongs to this phase's declared responsibility line
- this phase does not silently pull policy, topology authority, or product meaning backward from a later phase
- anything not closed here is explicitly assigned to a later named phase
- if a task or PR spans more than one responsibility line, the split or the phase definition should be re-reviewed
Short form:
the work is not only correct; it is closed at the correct layer and in the correct phase.
6. The V3 Phase Loop
Each phase should run through the same loop.
Step 1: Phase definition
Owner:
- manager / architect
Output:
- target
- scope
- non-goals
- gate
Step 2: Expectation definition
Owner:
- tester
Output:
- must-pass expectations
- failure-class checklist
- required test level
- reject conditions
Step 3: Implementation
Owner:
- sw
Output:
- code
- delivery template
- trace hooks
- reuse note
Step 4: Technical review
Owner:
- architect
Output:
- correctness review
- semantic-boundary review
- fail-closed review
Step 5: Evidence closure
Owner:
- tester
Output:
- runner/conformance evidence
- calibration closure
- reject-or-accept statement
Step 6: Durable closure
Owner:
- manager / architect
Output:
- phase decision
- carry-forward list
- next-phase handoff
7. Suggested V3 Phases
The exact numbering can change, but the semantic order should not.
Phase 0: Constitution Freeze
Target:
- freeze the initial
V3semantic package enough to begin implementation
Close when:
- truth domains are accepted
- mini engine unit is accepted
- metadata boundary is accepted
- growth plan and calibration plan exist
Phase 1: Initial Core
Target:
- executable deterministic mini engine
Close when:
- schema loads
- engine applies events deterministically
- conformance examples run
- stale rejection and projection derivation are reviewable
Phase 2: Reference Runtime
Target:
- a small replay/conformance runtime exists
Close when:
- conformance runner works
- traces are readable
- semantic outputs are replayable
Phase 3: First Adapter Route
Target:
- one real adapter-backed route exists from runtime facts to session close
Close when:
- no duplicate trigger path exists
- no duplicate terminal path exists
- adapter does not silently own policy
Phase 4: Runnable Block Sparrow
Target:
- one complete but narrow block slice can run end-to-end through the new core
Close when:
- one basic block route can be started and exercised end-to-end
- the route still uses one semantic decision path and one terminal-close path
- the slice is narrow, but it is complete enough to act as the first public runnable check-in
- phase output can honestly say "this repo runs a basic block slice"
Phase 5: Bootstrap And Validation Stabilization
Target:
- the runnable block sparrow becomes easy to start, inspect, and validate repeatedly
Close when:
- the repo has a minimal bootstrap and read-only inspection surface for the runnable slice
- the repo has a minimal test interface for validating the runnable slice
- first-time users can start, inspect, and troubleshoot the slice without reading deep design docs
- progress remains visible and honest in the standalone repo
- no real operator CLI is introduced before a later single-node demo stage
Phase 6: Calibration MVP
Target:
- selected
V2scenarios are calibrated through the runnableV3route
Close when:
- chosen calibration scenarios pass
- semantic route matches observed runtime route
- tester closes the calibration evidence
Phase 7: Persistent Single-Node Slice
Target:
- admit one persistence-backed single-node block slice cleanly
Close when:
- one persistence-backed single-node slice survives stop/restart with data still present
- the persistence seam does not pollute the semantic core
- the result stays honest about proving local persistence rather than broader durability
Phase 8: Local Data Process
Target:
- admit one coherent local data process around the accepted persistence seam
Close when:
- local read/write/flush/checkpoint/recover responsibilities are explicit
- bounded abrupt-termination proof exists for the accepted crash model
- the local data process does not pollute the semantic core
Phase 9: Data Sync Process
Target:
- admit one coherent data-sync institution for catch-up and rebuild data movement
Close when:
- data movement, barrier, and achieved-frontier feedback responsibilities are explicit
- replication/rebuild data transfer no longer lives as scattered transport muscle
- the data-sync process does not decide recovery class or terminal truth
This phase is where the remaining data-plane closure work belongs:
- data-sync execution must be one named institution rather than scattered transport helpers
- byte movement, barrier, achieved-frontier, and restart/retry behavior must be explicit
- recovery traffic must stay lineage-bound and fail closed under stale or overlapping execution
- this phase closes data movement correctness, not topology governance
Practical sequencing rule:
- implementation of
Phase 9andPhase 10may overlap - declared closure must still treat
Phase 9as earlier, becausePhase 10timeout/cancel/lifecycle claims depend onPhase 9wire correctness and lineage-safe feedback behavior
Phase 10: Recovery Execution Process
Target:
- admit one coherent recovery execution institution around engine-issued commands
Close when:
- catch-up and rebuild execution lifecycles are explicit
- engine-issued targets remain fixed through execution
- the execution process does not reinterpret command intent or publish terminal semantic truth by itself
This phase is where the remaining execution-side handoff closure belongs:
- command-to-execution-to-close lifecycle must be explicit for catch-up and rebuild
- old execution must become semantically dead immediately after newer lineage exists
- delayed callback, retry, timeout, cancellation, and overlap rules must be explicit and tested
- this phase closes recovery execution semantics, not promotion or failover policy
Phase 11: Single-Node Product Surface
Target:
- make the accepted single-node route operable as a bounded product surface
Close when:
- one operator-usable single-node workflow exists
- observability and safe inspection are strong enough for repeatable local operation
- the product surface still reads truth from accepted lower institutions rather than inventing a new authority path
This phase is where bounded single-node governance surfaces belong:
- local operator visibility, inspection, and safe action surfaces become explicit
- the repo should state clearly that current closure is recovery semantics on one node, not cluster topology governance
- any "promote" or "failover" wording must remain out of scope unless backed by later replicated-phase evidence
Phase 11surface must not expose cluster-shaped APIs that are likely to require breaking meaning changes when later topology phases land
Phase 12: Replicated Durable Slice
Target:
- admit one honest replicated durable slice around the accepted route
Close when:
- the replicated route supports bounded catch-up and rebuild with honest failover/rejoin behavior
- durability and fencing claims are backed by explicit evidence
- replicated execution still preserves the accepted semantic ownership split
This phase is the first phase that should close bounded failover behavior:
- reassignment, failover, rejoin, and fencing behavior become explicit replicated claims here
- the product may claim one bounded failover/rejoin contract only after explicit evidence exists here
- this phase still consumes topology facts from above; it does not yet own broad topology arbitration policy
Non-goals that must stay explicit:
Phase 12may consumeepochfrom an authority, but it must not mint or governepochitselfPhase 12may use a trivial test/manual authority as a placeholderPhase 12does not choose which node becomes the new primaryPhase 12does not decide what condition should trigger a failover
Practical bounded-contract checklist:
- given
(old primary, new primary, epoch+1), rejoin must converge without stale execution pollution - acknowledged or rejected stale callbacks during epoch turnover must not contaminate current truth
- bounded failover/rejoin claims must name what is accepted
- bounded failover/rejoin claims must also name what remains outside this phase
Phase 13: Production Hardening And Release Gate
Target:
- close the mainline product hardening gate for the accepted replicated slice
Close when:
- qualification, observability, and release criteria are explicit
- the repo can state a bounded production-ready claim honestly
- the mainline can hand off to later scale and ecosystem phases without reopening core authority boundaries
This phase is where bounded first-launch governance closure belongs:
- bounded failover/publication/runbook criteria should be explicit
- operational disturbance handling must be clear enough for a bounded production-ready statement
- this is still not the phase for broad topology expansion or broad placement policy
Phase 14: Scale And Topology Expansion
Target:
- widen the accepted product into larger-scale and richer-topology deployment shapes
Close when:
- placement, rebalance, and failover behavior remain correct under the accepted expanded topology set
- scale/topology work reuses the accepted semantic and execution institutions rather than replacing them
- the resulting topology claims are backed by explicit evidence
This phase is where topology governance and richer failover policy belong:
- topology authority, placement, rebalance, and failover policy become explicit institutions here
- eligibility, selection, and topology-wide convergence policy should be closed here rather than hidden inside recovery execution
- only from this phase onward should the product claim richer topology behavior beyond the bounded replicated slice
Mainline product meaning:
Phase 14is not a side expansion line; it is the mainline stage where fuller topology/governance product closure should land- if the repo wants to aim at a real full product rather than a bounded replicated slice, that aim must pass through
Phase 14
Phase 15: Operations And Ecosystem Expansion
Target:
- complete the mainline product loop through operations and ecosystem integration
Close when:
- operator workflows, ecosystem entry points, and lifecycle operations are production-reviewable
- the ecosystem surface still preserves accepted truth boundaries
- the mainline product and operations story is complete enough to shift later work into expansion lines
This phase is where cluster-facing operator policy becomes consumable:
- operator workflows for failover, recovery supervision, and lifecycle control become explicit product surfaces here
- ecosystem entry points may expose topology/failover operations only after the lower topology-policy phases are already closed
- this phase makes the accepted governance and topology behavior operable; it does not invent new truth
Mainline product meaning:
Phase 15is where the mainline product loop becomes consumable through operations and ecosystem surfacesPhase 14+Phase 15together should be read as the intended full-product completion target for the mainline
8. Anti-Pattern Closure Mapping
V3 phases should explicitly track which anti-patterns are:
- already avoided in the semantic core
- only partially closed
- deferred until adapter/runtime phases
Reference:
protocol-anti-patterns.md
8.1 A1: Heartbeat Timing Defines Recovery Semantics
Status:
- not fully closed in Phase 1-2
Reason:
- the semantic core already decides from bounded facts rather than timer values
- but the real closure requires a live adapter/runtime path where heartbeat, probe, and refresh can arrive in different timings
Closure phase:
- primary closure target: Phase 3
- calibration proof target: Phase 6
Required proof:
- heartbeat timing changes latency only
- it does not directly choose recovery class
- selected reconnect/rejoin scenarios prove this through the adapter-backed route
8.2 A4: Event Ordering Determines Semantics
Status:
- partially closed in Phase 1-2
Reason:
- the mini engine already rejects stale epoch/endpoint/session and uses bounded facts for decisions
- but full closure requires proof that runtime/adapter event ordering still converges to the same semantic result
Closure phase:
- semantic-core partial closure: Phase 1
- replay/runtime strengthening: Phase 2
- adapter/runtime closure: Phase 3
- calibration proof: Phase 6
Required proof:
- same facts produce the same commands/projection regardless of arrival ordering
- replay and adapter-backed scenario evidence agree
8.3 A7: Transport Mechanics Leak Into the Semantic Engine
Status:
- avoided in Phase 1-2 engine/runtime core
- not yet fully proven at integration boundary
Reason:
- the semantic reducer and reference runtime are intentionally transport-free
- but real closure requires attaching execution muscles without reintroducing transport state into semantic logic
Closure phase:
- engine/runtime avoidance: Phase 1-2
- integration closure: Phase 3
- calibration proof: Phase 6
Required proof:
- transport lifecycle stays in adapter/runtime
- engine only receives normalized facts
- no semantic rule depends on TCP/session plumbing details
8.4 Practical Rule
If a phase touches runtime integration and does not say how it preserves closure
against A1, A4, and A7, then the phase definition is incomplete.
9. Phase Gates Must Stay Narrow
A common failure is letting one phase carry too much ambition.
For V3, phase gates should be narrow enough that failure is diagnosable.
Bad phase gate:
- "V3 MVP should support failover, rebuild, RF3, SmartWAL, and Rust readiness"
Good phase gate:
- "one adapter-backed route handles short-gap and long-gap recovery with one terminal-close authority"
Narrow gates are important because they make closure real.
10. Repo Bootstrap After Phase 4
Phase 4 should be treated as the first complete runnable sparrow, but a small
repo bootstrap step should immediately follow its closure.
Purpose:
- turn the first runnable slice into a credible first public check-in
- freeze public-facing paths early so git history is not dominated by later renames
- make the repo operable by readers who did not follow the internal design history
Recommended immediate actions after Phase 4 closes:
- freeze the primary semantic path under
core/ - add a minimal runnable entry path
- add minimal repo status and progress files
- prepare the bootstrap and validation stabilization work for
Phase 5
Practical rule:
Phase 4proves the sparrow can run- the immediate bootstrap step makes that sparrow visible and usable as the first stable repo shape
11. Testrunner Inside The Phase Model
The runner should be attached to phases explicitly.
Phases 1-2
Use:
- conformance runner
Phases 3-4
Use:
- calibration scenarios
- selected
V2scenario reuse
Phases 6-8
Use:
- broader SW system scenarios
- chaos / soak / workload validation as appropriate
This keeps the runner aligned with phase goals instead of becoming a giant undifferentiated pass/fail bucket.
12. Progress Exposure In The Future V3 Repo
Each phase should be visible in the standalone repo through:
docs/progress/current-status.mddocs/progress/phase-xx.mddocs/progress/phase-xx-log.mddocs/progress/phase-xx-decisions.mddocs/conformance/status.md
For each phase, report:
- target
- current status
- evidence level reached
- open risks
- next gate
This progress surface is still necessary even when a broader production roadmap also exists.
13. Naming And Repo Structure Rule
For the future standalone repo, public-facing directory names should describe system role, not internal generation history.
Recommended top-level implementation names:
core/runtime/adapter/conformance/schema/
Reason:
- the standalone repo is the first public implementation, not a public "
V3repo" - outside readers should see stable subsystem names rather than internal rewrite history
- the semantic core is expected to grow into a fuller system rather than be replaced by another generation directory later
Current transition rule:
- after the runnable-sparrow closeout, the preferred public semantic-center path is
core/ - any remaining
v3mini/references should be treated as historical or transitional, not as the preferred long-term public package name - phase plans should refer to the semantic center as
corewhen describing the intended standalone repo structure - documents may still mention "
v3mini" when referring to the already-built Phase 01-03 code or historical implementation path
Practical reading rule:
core= the public-facing semantic center namev3mini= the current internal implementation name for that same semantic center until the repo is renamed
14. Practical Rule
If a phase cannot be summarized in one sentence of the form:
"This phase proves X, and it is closed when Y evidence exists."
then the phase is probably too vague.
15. Production Roadmap Layer
The phase model above is the execution model.
It should not be the only planning view.
V3 also needs a top-down product roadmap so the team can see how narrow phase
closures accumulate into a production-capable block system.
The correct planning shape is:
- one broad production roadmap describing the major capability gates
- one narrow execution-phase ladder describing the next concrete closure step
- a clear mapping from the current phase to the broader roadmap position
15.1 Production Target
The production target is not:
- a runnable demo
- a narrow persistence slice
- a calibration-only repo
The production target is:
- a semantically correct block system
- with real persistence and restart safety
- with credible crash-safety boundaries
- with operator-usable surfaces
- with replicated recovery and fencing behavior that are production-reviewable
- with observability, validation, and release-hardening strong enough for real deployment
15.2 Top-Down Roadmap
The broad roadmap should be read as a capability stack:
- semantic core correctness
- runnable adapter-backed block slice
- calibration against selected
V2reality - persistent single-node slice
- local data process around the accepted persistence seam
- data-sync process for catch-up and rebuild movement
- recovery execution process around engine-issued commands
- operator-usable single-node product surface
- replicated durable slice with honest failover/fencing behavior
- production hardening, qualification, and release gate
- scale and topology expansion
- operations and ecosystem expansion
Each layer should inherit the truth already closed below it.
No layer should be claimed early just because a lower layer demo exists.
15.3 Current Position
The current execution package should be read as:
- Phase 04: runnable narrow slice
- Phase 05: bootstrap and inspection stabilization
- Phase 06: first-pass calibration
- Phase 07: first persistence-backed single-node slice
This means the project is currently moving from:
- "runnable and calibrated"
to:
- "persisted on one node"
It is NOT yet at:
- full crash-safety qualification
- operator-ready product surface
- replicated production rollout
- release hardening / GA gate
- scale/topology expansion
- operations/ecosystem completion
Practical reading rule:
- the current delivered closure is recovery semantics and its lower execution boundaries
- topology authority, failover selection/promotion policy, and broader cluster governance are explicitly assigned to later phases rather than implied as already done
15.5 Responsibility Table
For scope checking, the later mainline should be read in this short form:
| Phase | One-line responsibility |
|---|---|
P9 |
move bytes correctly under lineage |
P10 |
execute recovery lifecycle correctly under start/cancel/complete/timeout |
P11 |
ship bounded single-node product surface with no cluster-shape leak |
P12 |
close bounded replicated handoff/rejoin mechanism as mechanism, not topology policy |
P13 |
harden the bounded replicated slice on persistent storage for release criteria |
P14 |
close topology authority and failover policy for who/when/where |
P15 |
expose accepted governance through operator and ecosystem surfaces without creating new authority |
Practical rule:
- if one task or PR cannot be assigned cleanly to one row, either the task is over-scoped or the phase boundary is still unclear
Delivery-weight note:
P13-P15should be read as a substantial finalization program, not light finishing work- the expected cost center shifts from semantic-engine invention to control-plane, frontend, and ecosystem integration
- the mainline is expected to rely heavily on selected
V2product-muscle porting rather than broad greenfield rewrite - use
v3-p13-p15-work-estimate.mdas the planning baseline for workload, sequencing, and expected new-code versus port mix
15.4 Planning Rule
Future phase definitions should always answer two questions:
- what narrow loop does this phase close
- which production-roadmap layer does that closure advance
If a phase closes a local loop but does not clearly move one roadmap layer forward, the phase is probably too internal or too detached from product direction.
16. Execution Institution Model
V3 should not invent lower execution institutions independently from the
semantic model.
Instead, they should be derived from:
- the model truth domains
- the accepted event types
- the accepted command boundaries
- the visibility contract
- the crash/recover contract
This means execution-layer interfaces are not just engineering convenience.
They are the controlled lower institutions that receive delegated authority
from the already-accepted V3 semantic route.
16.1 Core Rule
Execution institutions may have:
- internal data structures
- asynchronous scheduling
- batching, retry, and queueing
- local progress tracking
- narrow local decisions required to execute accepted commands
Execution institutions may NOT have:
- authority to redefine semantic meaning
- authority to reinterpret accepted commands
- authority to publish terminal truth on their own
- authority to widen or narrow semantic targets such as
targetLSN - authority to turn local progress into system truth without returning through the accepted route
The short rule is:
inside freedom is allowed; outside contract is fixed.
16.2 Knowledge And Authority Split
The semantic route should continue to own:
- recovery classification
- command intent
- target meaning
- terminal truth
- external visibility rules
Execution institutions may own only:
- local execution state
- local persistence state
- transport/data-transfer state
- progress and error detail
- local recovery mechanics that do not redefine semantic meaning
16.3 Typical Execution Institutions
Examples of correct lower institutions:
LogicalStorageDataCommunicatorRecoveryExecutorProgressFeedor equivalent trace/progress surface
Expected role boundaries:
LogicalStorageowns local persistence execution, local reopen, and local data recovery detailsDataCommunicatorowns data transfer, barrier execution, progress reporting, and transport-local retry behaviorRecoveryExecutorowns orchestration of already-decided commands by calling storage and communication institutions- trace/progress surfaces expose evidence but do not become semantic control input
16.3A One Possible Further Split
The list above is not the only acceptable cut.
One possible future split, if the system needs stronger named institutions, is:
IdentityManagerDataManagerCommunicationManagerLBAMaporRecoveryIndexRecoverProcess
This is a possible partition, not a claim that all five already exist as cleanly separated interfaces today.
Suggested responsibilities:
IdentityManagerowns self identity, peer identity, assignment, epoch, endpoint version, and topology contextDataManagerowns local read, local write,Write -> lsn, sync, flush, checkpoint, recover, and local durability boundariesCommunicationManagerowns replica connection state, ship/receive, barrier, backpressure, and remote progressLBAMaporRecoveryIndexowns recovery-oriented mapping knowledge such as whichlsntouched whichlbaRecoverProcessowns orchestration of engine-issued recovery intent across the other institutions
Suggested prohibitions:
IdentityManagershould not own bytes truth or semantic recovery classDataManagershould not own topology, connection policy, or shipping policyCommunicationManagershould not decide recovery class or terminal semantic successLBAMapshould not own identity, connection lifecycle, or semantic authorityRecoverProcessshould not invent recovery meaning or rewrite engine-issued targets
One useful consequence of this split is:
- read APIs can go directly through
DataManager - writes can return
lsndirectly fromDataManager - upper layers can maintain
LBAMapknowledge for smarter recovery without pushing that planning logic down into local storage CommunicationManagercan consumelsn-ordered change facts explicitly rather than being hidden behind local write side effects
16.3B Manager Split Rule
The institutions above do not need to become perfectly synchronized at every instant.
Local execution lag is acceptable.
Semantic lag is not.
Allowed:
IdentityManagermay accept a newer assignment, epoch, or topology fact before older data-movement goroutines are physically goneCommunicationManagermay still hold an old connection, sender, or queue while cleanup drainsDataManagermay still retain local state associated with an older replica path while invalidation is being processed
Not allowed:
- an old shipper or old connection continuing to advance current semantic truth after
IdentityManagerhas already made it stale - stale progress, ack, barrier, or "caught up" results being accepted into the live semantic route
- cleanup timing differences turning into authority differences
The intended rule is:
- execution lag is allowed
- authority lag is not
Practical consequence:
- once a newer assignment / epoch / endpoint version / session context exists, older execution state must become semantically dead immediately
- older goroutines may still run for cleanup, but their outputs must be ignored or rejected at the acceptance boundary
- every manager split should be reviewed by asking whether the split changes only cleanup timing, or whether it also changes who still gets to affect system truth
Short form:
old process may still run, but it must already be semantically dead.
16.3C Deliver-Lineage Rule
When a V3 recovery command crosses from semantic truth into execution,
it must no longer be lineage-free.
The accepted deliver-side rule is:
- the engine chooses recovery class and freezes
targetLSN - the adapter or execution boundary binds that recovery work to a
fresh
sessionID - the execution route carries at least
sessionID + epoch + endpointVersion + targetLSN - stale or superseded lineage must be rejected before it can mutate current semantic truth or current replica bytes
This keeps the semantic reducer small without allowing the runtime to become ambiguous during handoff.
Short form:
partial semantic command is acceptable; lineage-free execution is not.
16.4 V2 Muscle Migration Rule
V3 is not a blank-slate rewrite.
The working model is:
V3defines semantic truth, authority, and boundaries first- compatible
V2execution muscles may then be migrated behind cleanV3seams - migration is filtered by semantic compatibility, not by code reuse convenience alone
This means:
- semantic modules from
V2are usually reference-only or rewritten in nativeV3form - execution modules from
V2may often be migrated as whole muscles after old semantic coupling is stripped - the phase claim may stay narrow even when the migrated execution muscle is substantial
The purpose is to avoid a renamed V2 that still quietly inherits older truth
structures.
17. Interface Review Checklist
When sw proposes a new execution-layer interface or implementation, review it
with these questions first.
17.1 Knowledge Boundary
- what facts does this interface know
- are those facts local execution facts or semantic truth
- does it hold any knowledge that should remain in the semantic route instead
17.2 Authority Boundary
- what local decisions is this institution allowed to make
- does it only execute an accepted command, or does it reinterpret the command
- can it accidentally choose recovery class, target meaning, or terminal truth
- does it add the required execution lineage before work leaves the semantic route
17.3 Visibility Boundary
- what does it expose as trace, progress, or status
- can any exposed local state be mistaken for semantic truth
- does externally visible success still require the accepted route rather than local completion alone
17.4 Crash And Recover Boundary
- what local state must survive restart
- what local state may be discarded after crash
- after restart, which facts must return through the accepted event/command route before they become system truth
17.5 Migration Boundary
- is this a semantic module, adapter/glue module, or execution muscle from
V2 - if migrated from
V2, what old semantic coupling was explicitly removed - is the migration saving throwaway work without re-importing old truth ownership
17.6 Reject Signals
Reject the interface or implementation if any of these appear:
- it changes the meaning of an accepted command
- it silently widens or narrows
targetLSN - it treats local progress as terminal semantic success
- it converts trace/projection output into control truth
- it carries hidden
V2policy that theV3route did not explicitly accept - it allows stale callback, stale probe result, or stale mutation traffic to pass without lineage rejection
18. Summary
Yes, V3 should use phases.
But the important rule is:
- each phase has one semantic target
- each phase has explicit non-goals
- each phase has a clear proof gate
- each phase is not closed until
sw+tester+ review all complete the loop - those narrow phase closures should be explicitly mapped to a broader production roadmap
- lower execution institutions should be derived from
V3semantic boundaries and reviewed for knowledge/authority correctness - compatible
V2execution muscles may be migrated, but only after semantic filtering and boundary cleanup
That is the safest way to grow V3 without turning it into another open-ended architecture drift.
19. Canonical P14B To Production Plan
This section is the current canonical reading for the remaining mainline work
from late P14 to production.
It exists because the earlier coarse reading of P14 and P15 was too small
on internal control-plane closure and too optimistic about how much of the
production gap could be postponed to operator-facing phases.
Short form:
P14Bmust close the internal control-plane truth loopP14Amust verify each new mixed route created by that closureP15must expose and productize the already-closed internal loop- multi-master HA is not silently included in this bounded mainline plan
19.1 Stable Anchors That Must Not Drift
The following documents remain the stable review anchors while P14B and P15
move quickly:
v3-protocol-truths.mdv3-protocol-claim-and-evidence.mdv3-semantic-constraint-checklist.md- the active phase package and
14Asidecar
Planning may move faster than before. These anchors must not.
Practical rule:
- do not widen engine truth just because control-plane work grows
- do not import old
V2policy ownership with reused code - do not let heartbeat, transport mood, or projection convenience become semantic authority
- do not claim broader product closure than the currently proved route
19.2 Global Target
The remaining mainline target is not just "more topology" or "more operator surface".
The target is:
- one bounded single-active-master deployment shape
- one bounded topology/control-plane truth loop
- one bounded host-consumable block product loop
The control-plane truth loop that must become real is:
heartbeat / observation
-> inventory merge and freshness
-> stable ClusterSnapshot synthesis
-> policy/controller decision
-> assignment publication
-> adapter / engine convergence
-> observed confirmation
-> restart recovery of current truth
If this loop is not closed, P15 surfaces have nothing stable to expose.
19.3 Phase Split From Here
The remaining mainline should be read as:
P14B: internal control-plane closureP14A: verification sidecar over newP14Bmixed routesP15: external control surface, operator/product surface, and frontend/productization
That means:
P14Bis still part ofP14, not a separate product phaseP15must not absorb missing internal truth closure14Aremains proof and regression pressure, not institution ownership
19.4 P14B Overall Responsibility
P14B is closed only when the bounded accepted topology set has:
- real observation ingestion
- real snapshot synthesis
- real durable authority source
- real convergence and confirmation rules
- real restart-safe current-truth recovery
- proof through the real adapter/engine route, not only publisher-local or recording-consumer proof
Bounded deployment assumption for this plan:
- one active master / control-plane owner
- multiple volumes
- per volume, three bounded replica slots on distinct servers
- one current primary and two bounded candidates
- no multi-master leader election or distributed authority ownership in this plan
19.5 P14B-1 Observation Institution
Target:
- turn heartbeat and inventory into a stable
ClusterSnapshotproducer rather than a test input
Must close:
- heartbeat ingestion
- freshness / expiry rules
- partial and conflicting observation handling
- bounded unsupported evidence for incomplete or inconsistent topology input
- stable
ClusterSnapshotsynthesis for the accepted topology set
Engine work:
- none by default
- engine remains a consumer of already-published identity truth
- no new engine truth or projection field unless a later proof shows a real missing read-only output
Primary new-code areas:
core/authority/for normalized cluster snapshot contract and observation institution boundaryweed/server/for heartbeat collector and raw master-side wiringweed/storage/blockvol/v2bridge/only for bounded source-format adaptation when needed
Port now from V2 (mechanism only):
weed/server/block_heartbeat_loop.goweed/storage/blockvol/block_heartbeat.goweed/storage/blockvol/block_heartbeat_proto.go- selected source-format adaptation ideas from
weed/storage/blockvol/v2bridge/control.go
Do not port directly:
- any heartbeat-to-policy shortcut that directly decides recovery/failover from timing
- any volume-local authority mutation path
- any old projection/status reuse as control truth
Required proof:
- incomplete inventory becomes unsupported evidence, not failover input
- stale observation cannot mint fresh authority
- one bad or unsupported volume does not block unrelated healthy volume progress
19.6 P14B-2 Durable Authority Institution
Target:
- make the current authority line durable and restart-recoverable under the bounded single-owner deployment
Must close:
- durable source for current per-volume authority line
- restart recovery for controller / publisher current truth
- explicit bounded single-owner rule
- epoch / endpointVersion continuity after restart
- bounded recovery when observed state lags durable authority
Engine work:
- none by default
- no semantic ownership moves into engine
- only read-only evidence additions are acceptable, and only if later proof forces them
Primary new-code areas:
core/authority/for durable registry / current-line persistence / replay into controller stateweed/server/for master-side hosting and lifecycle- possibly
weed/storage/blockvol/or adjacent persistence helpers only as storage muscle, not authority owner
Port now from V2 (mechanism only):
weed/server/master_block_registry.goweed/server/master_block_assignment_queue.go- lifecycle/wiring patterns from
weed/server/volume_server_block.go
Do not port directly:
- old master or volume code that mutates assignment truth from local convenience state
- promote/demote ownership hidden inside volume-local paths
- any old registry state treated as semantic authority without explicit filtering
Required proof:
- restart does not lose current authority line
- stale pre-restart state cannot revive newer authority
- bounded single-owner truth remains intact without multi-master assumptions
19.7 P14B-3 Convergence Institution
Target:
- make
publish-until-observeda real bounded convergence loop instead of a local planning idea
Must close:
- desired-state pending / observed / superseded rules
- retry / suppression / backoff / dedupe rules
- explicit confirmation source for assignment and endpoint moves
- stale observation handling that does not thrash authority
- bounded authority transition honesty while new identity is converging
Engine work:
- preserve the existing ack-gated fence and publication contract
- do not add a generic controller loop to adapter/runtime
- only tighten bounded-fate handling if a real mixed-route hole appears under
14Areview
Primary new-code areas:
core/authority/for convergence state, confirmation rules, and bounded desired-state lifecycleweed/server/for observation inputs and hostingcore/adapter/only if a new bounded-fate or stale-rejection proof forces a narrow integration fix
Port now from V2 (mechanism only):
- selected planning/failover plumbing from
weed/server/master_block_plan.go - selected selection/evidence mechanics from
weed/server/master_block_failover.go - selected evidence patterns from
weed/server/master_block_evidence.go
Do not port directly:
- old failover trigger meaning as-is
- old policy ownership hidden in master convenience logic
- any route where transport/heartbeat timing directly becomes failover truth
Required proof:
- published desired state remains until observed or superseded
- stale observation cannot churn the current line
- authority transition does not overclaim healthy publication
- failover and rebalance remain bounded and diagnosable under the accepted topology set
19.8 P14B-4 Full P14 Close
Target:
- close one bounded topology/governance product shape on the full accepted topology set
Must close:
- multi-volume topology authority under the accepted three-slot pattern
- failover and rebalance through real adapter/engine convergence
- restart/catch-up/fence/publication behavior across the full bounded route
- one final bounded supported-topology statement
- one explicit unsupported list
Engine work:
- no new policy ownership
- no broad semantic rewrite
- only bounded fixes that
14Aproves are necessary on the mixed routes
Primary proof expectation:
- controller-driven route must reach real
VolumeReplicaAdapter, not only recording consumers - controller-driven failover/rebalance must remain honest at the publication surface during transition
- crash/restart mixed-route proofs must exist for the bounded deployment
19.9 P14A Role During P14B
14A remains the verification sidecar.
It should reopen only when a new P14B workstream creates real mixed-route pressure.
Expected 14A reopen themes by workstream:
- after Observation Institution:
- stale / delayed heartbeat
- partial inventory
- conflicting observation
- unsupported evidence honesty
- after Durable Authority Institution:
- stale authority after restart
- old truth revival
- bounded single-owner correctness
- after Convergence Institution:
- publish-but-not-observed loops
- timeout / suppress / dedupe correctness
- transition publication honesty
- new silent liveness holes
- before Full P14 Close:
- mixed-route sequence pass across observation, authority, convergence, demotion, and failover overlap
14A must not:
- invent new product institutions
- widen engine truth just because testing is hard
- claim global engine stability
19.10 P15 Responsibility After P14B
P15 starts only after the internal control-plane loop is closed enough to expose.
P15 owns:
- external control APIs
- operator-facing diagnostics and explanation surfaces
- runbook and lifecycle productization
- frontend/export protocols such as
iSCSI,NVMe/TCP, andCSI - operator packaging and ecosystem integration
P15 does NOT own:
- heartbeat truth formation
- durable current authority truth
- convergence semantics
- the internal policy/controller truth loop itself
19.11 V2 Port Matrix For The Mainline Plan
Port now into P14B
These are the highest-value muscles for the reopened P14 mainline:
weed/server/block_heartbeat_loop.goweed/storage/blockvol/block_heartbeat.goweed/storage/blockvol/block_heartbeat_proto.goweed/server/master_block_registry.goweed/server/master_block_assignment_queue.go- selected mechanism-shaped parts of
weed/server/master_block_plan.go - selected mechanism-shaped parts of
weed/server/master_block_failover.go - selected evidence patterns from
weed/server/master_block_evidence.go - bounded master/volume hosting patterns from
weed/server/volume_server_block.go
Port later into P15
weed/storage/blockvol/iscsi/weed/storage/blockvol/nvme/weed/storage/blockvol/csi/weed/storage/blockvol/operator/weed/storage/blockvol/monitoring/- larger
testrunnerand scenario-product muscles
Reference only or do-not-port directly
weed/storage/blockvol/promotion.go- old
HandleAssignment/promote/demoteownership paths - old engine/orchestrator/registry semantic owners as current truth owners
- any
V2route that turns heartbeat timing, local status, or transport convenience directly into authority - any code that would make volume-local runtime mutate assignment truth on its own
19.12 Practical Implementation Order
Use this order unless new evidence forces a re-cut:
P14B-1Observation Institution14Atargeted reopen on observation routesP14B-2Durable Authority Institution14Atargeted reopen on restart and durable-truth routesP14B-3Convergence Institution14Atargeted reopen on convergence and publication-honesty routesP14B-4Full P14 close packageP15external/operator/frontend productization
This is intentionally a big-step plan. It is not a license to blur the engine.
The speed rule is:
- move fast by porting
V2muscles aggressively - keep engine truth, authority ownership, and semantic constraints stable
- prefer one big bounded institution per step over many plumbing-only micro-steps
19.13 One-Sentence Summary
From here to production, the mainline should be read as:
P14B closes the internal control-plane truth loop using semantic-filtered V2 muscles, 14A verifies the new mixed routes, and P15 exposes the already-closed loop through operator and ecosystem surfaces.