docs: Phase 13 CP13-9 accepted + Phase 14 preparation docs

- phase-13.md: CP13-8/8A/9 accepted with carry-forward
- phase-13-log.md: CP13-9 technical/delivery packs
- phase-13-cp9-mode-normalization.md: minor updates
- v2-protocol-claim-and-evidence.md: CP13-8/8A claims updated,
  constrained-V1-runtime interpretation rule added

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
pingqiu
2026-04-03 16:13:03 -07:00
co-authored by Claude Opus 4.6
parent fb0da91196
commit 34f42078fb
4 changed files with 387 additions and 24 deletions
@@ -2,6 +2,8 @@
Date: 2026-04-03
Status: accepted
## Current Interpretation Rule
Before an explicit `V2 core` exists as a real code structure and live
@@ -86,6 +88,27 @@ Exact mode names may change, but the distinctions should remain explicit.
| Surface-consistency proof | lookup / heartbeat / tester / debug surfaces use one bounded mode meaning |
| Fail-closed proof | `publish_healthy`, `degraded`, and `needs_rebuild` remain distinct and do not overclaim health |
## Accepted Validation Summary
Tester verdict: `ACCEPT`
| Proof | Claim | Evidence |
|------|-------|----------|
| `AllocatedOnly` | `RF=1` maps to `allocated_only` | focused mode test |
| `BootstrapPending` (`Replicas` empty) | `RF=2` before replica set closure maps to `bootstrap_pending` | focused mode test |
| `BootstrapPending` (replica not ready) | `RF=2` with replica not ready maps to `bootstrap_pending` | focused mode test |
| `PublishHealthy` | ready + not transport degraded maps to `publish_healthy` | focused mode test |
| `Degraded` | transport degraded maps to `degraded` | focused mode test |
| `NeedsRebuild` | rebuilding role maps to `needs_rebuild` | focused mode test |
| `SurfaceConsistency` | mode / ready / degraded meaning stays aligned across transitions | focused transition checks |
| `InterpretationRule` | current integrated tests are constrained `V1` under `V2` constraints | explicit wording in contract + design docs |
| `NoOverclaim` | checkpoint does not claim pure `V2 core`, launch, or broad transport expansion | explicit boundedness wording |
Minor note kept bounded:
1. `assert_block_field` in the testrunner does not yet expose `volume_mode` as a first-class assert case
2. this does not block checkpoint acceptance because the bounded unit and API-surface proofs are already direct
## Relation to Earlier Checkpoints
| Prior checkpoint | What CP13-9 reuses |
+213
View File
@@ -1641,3 +1641,216 @@ Review checklist:
3. do lookup / heartbeat / tester surfaces agree on publication truth?
4. does the bounded rerun become attributable?
5. is the slice still bounded to closure rather than mode policy or backend replacement?
---
### `CP13-9` Technical Pack
Date: 2026-04-03
Goal: freeze one bounded mode-normalization package for the accepted `RF=2 sync_all` path so current external health/publication meaning is explicit, fail-closed, and clearly understood as constrained `V1` runtime behavior under `V2` constraints
#### Layer 1: Semantic Core
##### Problem statement
`CP13-8` and `CP13-8A` now give one important result:
1. the bounded real-workload package passes on the chosen path
2. assignment/readiness/publication closure is explicit enough for that path
What they do **not** yet give is a normalized external mode policy.
There is still a semantic gap between:
1. what current `V1` runtime behavior happens to do
2. what the system is allowed to claim externally under `V2` constraints
The most visible remaining example is the fresh-volume bootstrap behavior:
1. a newly created `RF=2 sync_all` volume may need the first real replicated write to establish the first true sync/connect proof
2. until that happens, the system must not overclaim fully replicated-healthy state
`CP13-9` therefore accepts only one bounded thing:
1. explicit mode/publication normalization for the current constrained path
It does not accept:
1. pure `V2 core` extraction
2. launch approval
3. broad transport/product expansion
4. retroactive rewriting of `CP13-8` as if it had already validated a completed `V2 runtime`
##### State / contract
`CP13-9` must make these truths explicit:
1. current integrated evidence is about `V1` runtime under `V2` constraints, not about an already-complete `V2 runtime`
2. external surfaces must use one bounded mode vocabulary for the chosen path
3. a fresh volume before first replicated durability proof is not the same as:
- replica-ready
- publish-healthy
- replication-healthy
4. degraded and `NeedsRebuild` remain distinct fail-closed meanings
Recommended first-cut mode set:
1. `allocated_only`
2. `bootstrap_pending`
3. `replica_ready`
4. `publish_healthy`
5. `degraded`
6. `needs_rebuild`
Exact names may change, but the semantic split must not.
##### Reject shapes
Reject before implementation or review if the slice:
1. keeps one meaning of “healthy” in lookup and another in tester/debug/operator surfaces
2. treats first-write bootstrap as incidental timing rather than an explicit mode policy
3. quietly upgrades the current path from constrained `V1` to completed `V2 runtime`
4. broadens into `Phase 14` pure-core extraction
#### Layer 2: Execution Core
##### Current gap `CP13-9` must close
1. current chosen-path semantics are stronger than before, but the external mode contract is still partly implicit
2. bootstrap-pending behavior is still too easy to describe informally rather than as an explicit allowed state
3. future claims can still drift if the team does not freeze how current constrained-runtime evidence should be interpreted
##### Suggested file targets
1. `sw-block/.private/phase/phase-13.md`
2. `sw-block/.private/phase/phase-13-cp9-mode-normalization.md`
3. `sw-block/design/v2-protocol-claim-and-evidence.md`
4. `sw-block/design/v2_mini_core_design.md`
5. `weed/server/*` and tester surfaces only if current mode semantics require explicit surface normalization in code/tests
##### Validation focus
Required proofs:
1. interpretation proof
- current integrated evidence is explicitly described as constrained `V1` under `V2` constraints
2. bootstrap proof
- a fresh `RF=2 sync_all` volume before first replicated write is surfaced as bootstrap-pending or equivalent bounded non-healthy mode
3. surface-consistency proof
- heartbeat / lookup / tester / debug surfaces use one bounded mode meaning
4. boundedness proof
- the checkpoint remains about mode normalization, not pure-core extraction or launch approval
Reject if:
1. different surfaces still disagree on whether a fresh or degraded volume is “healthy”
2. a claimed proof still depends on human timing interpretation rather than explicit state/mode meaning
3. the slice has no clear story for how `bootstrap_pending`, `degraded`, and `needs_rebuild` differ
##### Suggested first cut
1. freeze one explicit interpretation rule in design/ledger docs
2. freeze one explicit current-path mode contract in a dedicated `CP13-9` doc
3. if needed, add the smallest surface/test changes that make bootstrap-pending and publish-healthy externally distinguishable
4. keep the slice bounded to the accepted chosen path and current runtime
##### Assignment For `sw`
1. Goal
- deliver one bounded mode-normalization package for the accepted chosen path
2. Required outputs
- one dedicated `CP13-9` mode contract doc
- one delivery note explaining:
- the normalized mode set
- the interpretation rule for current integrated tests
- any surface/test changes required
- proof shape
- what later phases remain untouched
3. Hard rules
- do not claim a completed `V2 runtime`
- do not broaden into `Phase 14` package extraction
- do not turn this into launch approval or broad product policy
##### Assignment For `tester`
1. Goal
- validate that `CP13-9` closes bounded mode-policy meaning and nothing broader
2. Validate
- current integrated evidence is interpreted correctly as constrained `V1`
- fresh-volume bootstrap is not overclaimed as replicated-healthy
- heartbeat / lookup / tester / debug surfaces use one bounded meaning
- no-overclaim around `Phase 14`
3. Reject if
- current evidence is still described as if pure `V2 runtime` already exists
- bootstrap behavior remains informal or timing-based only
- the slice broadens into pure-core extraction or launch claims
#### Short judgment
`CP13-9` is acceptable when:
1. current integrated tests are explicitly interpreted as constrained `V1` under `V2` constraints
2. the chosen path has one bounded external mode contract
3. first-write bootstrap no longer hides inside ambiguous health claims
4. the slice stays clearly separate from `Phase 14`
---
### `CP13-9` Delivery Pack
Bounded contract:
1. `CP13-9` accepts mode normalization for the current constrained chosen path only
2. it does not accept pure `V2 core` extraction, launch approval, or broad transport/product expansion
What `sw` should deliver:
1. one explicit current-path mode contract
2. one explicit interpretation rule stating that current integrated checks are evaluating `V1` runtime under `V2` constraints
3. one bounded proof package showing:
- bootstrap-pending or equivalent first-write state is explicit
- publish-healthy remains fail-closed
- degraded / `NeedsRebuild` remain distinguishable
4. one delivery note with:
- changed files
- normalized mode names or semantic equivalents
- proof shape
- no-overclaim statement
Recommended delivery shape:
1. contract:
- define current-path mode meanings explicitly
- distinguish bootstrap-pending from replica-ready / publish-healthy
2. code/tests:
- make the smallest changes needed so surfaces reflect the normalized meaning
3. note:
- explain why this is still constrained-current-runtime work
- explain why `Phase 14` remains untouched
Review checklist:
1. does the slice clearly say current integrated evidence is constrained `V1`, not completed `V2 runtime`?
2. is first-write bootstrap explicit rather than implicit?
3. do heartbeat / lookup / tester / debug surfaces share one bounded meaning?
4. does publish-healthy remain fail-closed?
5. is the slice still bounded to mode normalization rather than pure-core extraction?
Accepted validation summary:
1. verdict:
- `ACCEPT`
2. direct bounded proofs verified:
- `allocated_only`
- `bootstrap_pending` with no replicas
- `bootstrap_pending` with replica not ready
- `publish_healthy`
- `degraded`
- `needs_rebuild`
- surface consistency across transitions
- interpretation rule
- no-overclaim
3. bounded follow-up note:
- `assert_block_field` does not yet expose `volume_mode` as a first-class testrunner assert case
- low priority; unit/API proofs already close the checkpoint
+119 -6
View File
@@ -1,7 +1,7 @@
# Phase 13
Date: 2026-04-02
Status: active
Status: accepted
Purpose: carry one explicit engineering gap beyond accepted `Phase 12` hardening into a bounded implementation phase so `RF=2 sync_all` becomes a correct, test-backed replicated durability mode under real reconnect, catch-up, retention, and rebuild conditions
## Why This Phase Exists
@@ -672,7 +672,19 @@ Reject if:
Status:
- active
- accepted
Carry-forward:
1. one bounded real-workload package now passes on the chosen path:
- `RF=2`
- `sync_all`
- iSCSI
- `ext4 + pgbench`
- one failover
2. this checkpoint validates current runtime behavior under accepted `V2` constraints
3. it does not by itself mean a pure `V2 runtime` already exists
4. `CP13-8A` and `CP13-9` must keep that interpretation explicit
### `CP13-8A`: Assignment-to-Publication Closure
@@ -750,11 +762,111 @@ Reject if:
Status:
- active
- accepted
### Later checkpoints inside `Phase 13`
Carry-forward:
1. `CP13-9`: mode normalization (only after `CP13-8A` closes the assignment/publication contradiction)
1. assignment/readiness/publication closure is now explicit enough for the bounded chosen path
2. the corrected path no longer treats replica allocation or assignment presence as equivalent to replica publication readiness
3. the remaining next step is mode-policy normalization on top of this closed assignment/publication path
### `CP13-9`: Mode Normalization Under `V2` Constraints
Goal:
- freeze one bounded mode-policy contract for the current chosen path so external health/publication meaning no longer drifts between implicit `V1` runtime behavior and `V2` constraint language
Acceptance object:
1. `CP13-9` accepts one bounded mode-normalization package for the accepted `RF=2 sync_all` path
2. it accepts mode/publication semantics for the current runtime only under explicit `V2` constraints
3. it does not accept pure `V2 core` extraction, launch approval, or broad transport/product expansion by implication
Execution steps:
1. Step 1: interpretation rule freeze
- make explicit that current integrated tests are evaluating `V1` runtime behavior under `V2` constraints
- define `CP13-9` as policy/meaning closure for the constrained current path, not proof that a completed `V2 runtime` already exists
2. Step 2: mode contract freeze
- define one bounded external mode set for the chosen path
- at minimum distinguish:
- allocated / assigned
- bootstrap-pending
- replica-ready
- publish-healthy
- degraded
- `NeedsRebuild`
- define what each surface is allowed to claim for each mode:
- heartbeat
- lookup / REST / tester surfaces
- operator/debug surfaces
3. Step 3: bootstrap-policy closure
- make the first-write / first-connect bootstrap behavior explicit
- ensure a freshly created `RF=2 sync_all` volume is not overclaimed as replicated-healthy before the first real replicated durability proof exists
4. Step 4: proof package
- prove all relevant surfaces agree on the bounded mode meanings
- prove no-overclaim around future pure-core extraction or broad launch claims
Required scope:
1. chosen path only: `RF=2 sync_all`
2. current master / volume-server heartbeat path only
3. `blockvol` remains the execution backend
4. current integrated runtime is interpreted as constrained `V1`, not yet as a completed `V2 runtime`
Must prove:
1. health/publication meaning is explicit and consistent across product/tester/operator surfaces
2. `bootstrap-pending` or equivalent first-write state is explicit rather than hidden inside ambiguous degraded/healthy output
3. publish/ready semantics remain fail-closed under the accepted replication contract
4. acceptance wording stays bounded to mode normalization for the constrained current path rather than `V2 core` extraction
Reuse discipline:
1. prefer surfaced policy/diagnostic/projection work first because this checkpoint is about external mode meaning
2. update `weed/storage/blockvol/*` only if mode normalization exposes a concrete backend leak rather than a surface-meaning gap
3. keep `CP13-1..8A` semantics fixed unless a live contradiction is exposed
4. no checkpoint work may silently broaden into `Phase 14` pure-core extraction or broad rollout claims
Verification mechanism:
1. one focused proof set around mode/publication semantics across heartbeat / lookup / tester / debug surfaces
2. explicit tests or bounded evidence that a fresh volume before first replicated write is not overpublished as replicated-healthy
3. explicit checks that degraded / rebuild-required surfaces remain distinguishable and bounded
4. no-overclaim review so `CP13-9` does not absorb `Phase 14`
Hard indicators:
1. one accepted interpretation proof:
- current integrated evidence is explicitly described as constrained `V1` under `V2` constraints
2. one accepted bootstrap proof:
- a fresh `RF=2 sync_all` volume before first replicated write is surfaced as bootstrap-pending or equivalent bounded non-healthy mode
3. one accepted surface-consistency proof:
- heartbeat / lookup / tester / debug surfaces agree on the same bounded mode meanings
4. one accepted boundedness proof:
- `CP13-9` claims mode normalization only and leaves pure-core extraction to later phases
Reject if:
1. the slice still uses one meaning of “healthy” for lookup and a different one for tester/debug/operator surfaces
2. a fresh volume can still appear fully replicated-healthy before first real replicated durability proof exists
3. the checkpoint quietly claims a completed `V2 runtime` already exists
4. delivery wording broadens into launch approval, broad productization, or `Phase 14` pure-core extraction
Status:
- accepted
Carry-forward:
1. one bounded mode set is now explicit for the current constrained chosen path:
- `allocated_only`
- `bootstrap_pending`
- `publish_healthy`
- `degraded`
- `needs_rebuild`
2. current integrated tests remain explicitly interpreted as constrained `V1` under `V2` constraints
3. `CP13-9` does not claim pure `V2 core` extraction, launch approval, or broad transport expansion
## Reuse Discipline
@@ -766,8 +878,9 @@ Status:
## Expected Outcome
If `Phase 13` succeeds:
`Phase 13` now succeeds with the following closure:
1. reconnect / catch-up / rebuild semantics become explicit and test-backed
2. `sync_all` correctness no longer depends on partial or implicit sender-state assumptions
3. later feature work can reuse a clearer replication contract instead of re-deriving durability semantics each time
4. one bounded real-workload package and one bounded mode-normalization package are both accepted on the current constrained path
@@ -30,6 +30,23 @@ When reviewing any new slice, bug fix, workload run, or delivery note, ask:
If the answer changes the current state of the product, update this ledger in the same change.
## Interpretation Rule For Current Integrated Evidence
Until an explicit `V2 core` exists as a real code structure and live event/command owner,
current integrated evidence should be interpreted as:
1. validation of current `V1` runtime behavior under `V2` constraints
2. not proof that a completed `V2 runtime` already exists
This means:
1. protocol truths and claim boundaries may already be `V2`-owned
2. workload and integration passes may still be about the constrained current runtime
3. later phases must keep separating:
- semantic authority
- constrained current-runtime validation
- future pure-core extraction
## Current Chosen Envelope
This is the bounded envelope currently allowed for active V2 claims:
@@ -46,7 +63,7 @@ This is the bounded envelope currently allowed for active V2 claims:
Current explicit exclusions:
1. `RF>2` as a general accepted product claim
2. broad mode normalization before `CP13-9`
2. broad mode normalization outside the accepted bounded `CP13-9` contract
3. broad rollout / launch approval
4. broad transport matrix claims outside explicitly named evidence
5. treating synthetic benchmarks as substitutes for real workload validation
@@ -68,6 +85,7 @@ These are the currently binding constraints that later work must preserve.
| `CP13-6` | retention must fail closed for lagging replicas | `Phase 13` | active |
| `CP13-7` | unrecoverable gap must escalate to `NeedsRebuild` and block normal paths | `Phase 13` | active |
| `CP13-8A` | assignment delivered != receiver ready != publish healthy | `Phase 13` | active |
| `CP13-9` | bounded external mode meaning must stay explicit and surface-consistent on the constrained current path | `Phase 13` | active |
## Accepted Baselines
@@ -75,7 +93,8 @@ These are the currently binding constraints that later work must preserve.
|----------|---------------------------|-------------------|------------------|
| `CP13-1` replication baseline inventory | which tests originally passed/failed/`PASS*` before `CP13-2..7` closure | `sw-block/.private/phase/phase-13-cp1-baseline.md` | valid as baseline inventory, not as final product claim |
| `Phase 12 P4` bounded floor | one bounded performance floor and rollout-gate package on the accepted chosen path | `sw-block/.private/phase/phase-12-p4-floor.md`, `phase-12-p4-rollout-gates.md` | valid inside its named envelope |
| real-workload envelope draft | one bounded `ext4 + pgbench` package for `CP13-8` | `sw-block/.private/phase/phase-13-cp8-workload-validation.md` | active draft; full claim pending rerun after blockers close |
| `CP13-8` bounded real-workload pass | one bounded `ext4 + pgbench` package passes on the accepted chosen path | `sw-block/.private/phase/phase-13-cp8-workload-validation.md` | valid inside its named envelope and current constrained-`V1` interpretation |
| `CP13-9` bounded mode contract | one bounded external mode set is explicit on the constrained current path | `sw-block/.private/phase/phase-13-cp9-mode-normalization.md` | valid inside its named envelope and constrained-`V1` interpretation |
## Allowed Claims
@@ -85,9 +104,10 @@ These are the claims that may currently be made without overreach.
|----------|---------------|----------------|-----------------|--------|
| `C-RF2-SYNCALL-CONTRACT` | the accepted `RF=2 sync_all` replication contract is closed at protocol/unit/adversarial level through `CP13-1..7` | protocol/unit/adversarial evidence only | `Phase 13` docs and tests | allowed |
| `C-WORKLOAD-DRAFT` | one bounded real-workload validation package is defined for `CP13-8` | package definition only, not final pass claim | `phase-13-cp8-workload-validation.md`, YAML scenario | allowed |
| `C-WORKLOAD-PASS` | the bounded real-workload package passes on the chosen path | only after rerun succeeds on corrected path | `CP13-8` rerun artifact | not yet allowed |
| `C-ADAPTER-CLOSURE` | assignment / readiness / publication closure is explicit on the chosen path | only after `CP13-8A` acceptance | `CP13-8A` proof package | in progress |
| `C-MODE-NORMALIZATION` | mode policy / normalization is closed | only in `CP13-9` or later | future | not allowed |
| `C-WORKLOAD-PASS` | the bounded real-workload package passes on the chosen path | bounded chosen path only; interpreted as current `V1` runtime under `V2` constraints | `CP13-8` rerun artifact | allowed |
| `C-ADAPTER-CLOSURE` | assignment / readiness / publication closure is explicit on the chosen path | bounded chosen path only; does not imply mode normalization or pure-core extraction | `CP13-8A` proof package | allowed |
| `C-CONSTRAINED-V1-RUNTIME` | current integrated checks are evaluating `V1` runtime behavior under `V2` constraints rather than validating a completed `V2 runtime` | current chosen path only, until explicit `V2 core` extraction | `v2_mini_core_design.md`, `Phase 13` docs | allowed |
| `C-MODE-NORMALIZATION` | one bounded mode-policy / normalization package is closed on the current constrained chosen path | bounded chosen path only; does not imply pure `V2 core` extraction or broad product policy | `CP13-9` docs/tests | allowed |
| `C-LAUNCH-APPROVAL` | broad product launch readiness | outside current phase | future | not allowed |
## Evidence Map
@@ -101,8 +121,9 @@ These are the claims that may currently be made without overreach.
| Retention | lagging replica retains WAL or escalates fail closed | `CP13-6` tests and docs | retention protocol tests |
| Rebuild fallback | unrecoverable gap escalates to `NeedsRebuild` and blocks normal paths | `CP13-7` tests and docs | rebuild tests |
| Performance floor | one bounded measured floor and rollout-gate package | `Phase 12 P4` docs/tests | cited baseline artifact |
| Real-workload package | one bounded workload matrix exists | `CP13-8` scenario/doc | tester validation reports |
| Assignment/publication closure | assignment does not imply readiness/publication | `CP13-8A` code/tests/debug evidence | tester investigation, bug docs |
| Real-workload package | one bounded workload matrix passes on the corrected chosen path | `CP13-8` scenario/doc | tester validation reports |
| Assignment/publication closure | assignment does not imply readiness/publication and corrected wiring refreshes replication truth explicitly | `CP13-8A` code/tests/debug evidence | tester investigation, bug docs |
| Mode normalization | one bounded mode set is explicit and surface-consistent on the constrained current path | `CP13-9` contract/doc/tests | tester validation report |
## Invalidated Or Narrowed Evidence
@@ -110,8 +131,7 @@ This section records evidence that cannot currently be used at full strength.
| ID | Affected claim/evidence | Narrowing reason | Scope | Action required |
|----|-------------------------|------------------|-------|-----------------|
| `INV-CP13-8A-01` | any weed-VS scenario claim that `block_promote` preserved replication automatically | promote path could leave new primary without replica shipper wiring; barrier then became vacuous with `0` shippers | recent weed-VS testrunner scenarios using `block_promote` | rerun after fix |
| `INV-CP13-8A-02` | bounded real-workload `CP13-8` pass claim | blocked by assignment/publication contradiction and then by promote/shipper closure issue | `CP13-8` only | rerun after `CP13-8A` blocker fixes |
| `INV-CP13-8A-01` | any historical weed-VS scenario claim that `block_promote` preserved replication automatically before the promote/refresh fix | old promote path could leave new primary without replica shipper wiring; barrier then became vacuous with `0` shippers | historical weed-VS testrunner scenarios using old `block_promote` behavior | rerun or reclassify historical evidence as needed |
| `INV-CLAIM-SPREAD-01` | claims embedded only in phase delivery notes | phase docs are not a reliable centralized current-state ledger | all scattered phase notes | migrate ongoing claim state here |
Unaffected evidence currently believed to remain valid:
@@ -122,20 +142,14 @@ Unaffected evidence currently believed to remain valid:
## Open Contradictions And Blockers
| ID | Blocker | Current classification | Impact |
|----|---------|------------------------|--------|
| `BUG-CP13-8A-ADDR` | malformed/mock replica addresses in some QA allocators | test/adapter bug | narrows affected QA evidence; does not by itself close real workload |
| `BUG-CP13-8A-RECV-IDEMP` | repeated assignment delivery restarted replica receiver and hit bind conflict | adapter/runtime bug | blocks weed-VS replica from leaving degraded state until fixed |
| `BUG-CP13-8A-PROMOTE-SHIPPER` | post-promote assignment could leave new primary with no replica shipper configured | master/adapter bug | invalidates weed-VS `block_promote` replication claims until rerun |
| `CP13-8` | real bounded workload package still needs corrected rerun | blocked by `CP13-8A` issues | blocks real-workload pass claim |
No active `Phase 13` blocker currently remains inside the accepted bounded chosen path.
## Rerun Queue
| Priority | Item | Why rerun is needed | Exit condition |
|----------|------|---------------------|----------------|
| `P0` | `CP13-8` bounded real-workload scenario | current pass claim is not yet allowed after `CP13-8A` blockers | bounded rerun passes or fails with attributable remaining cause |
| `P0` | weed-VS scenarios using `block_promote` from the recent testrunner enhancement work | prior replication interpretation may have been vacuous (`0` shippers) | affected scenarios are reclassified or rerun |
| `P1` | any recent degraded/perf interpretation derived from broken weed-VS promote path | performance interpretation may be based on RF=1 semantics | audit updated and affected numbers rerun or narrowed |
| `P0` | historical weed-VS scenarios using old `block_promote` semantics from the recent testrunner enhancement work | prior replication interpretation may have been vacuous (`0` shippers) before the refresh fix | affected scenarios are reclassified or rerun |
| `P1` | any recent degraded/perf interpretation derived from broken historical weed-VS promote path | performance interpretation may have been based on RF=1 semantics | audit updated and affected numbers rerun or narrowed |
## Maintenance Rules