Plan reference: plan/glamsterdam-2026-09-05/issues/08-phase-8-network-soak-and-observability.md
Goal: make the fork boundary observable (P2-1), soak on the first public network that schedules Gloas with the zero-slashing gate enforced, re-pin SPEC_TAG to that network's shipped spec release, and drive mainnet readiness to evidence complete. release approved is a separate state this phase cannot reach (D16). Issues: 11 · Points: 20 · Duration: ~10 working days single-stream (8.8 additionally waits 14 elapsed days; the wait is not effort).
Entry criteria: Phase 7 complete (devnet metrics met, fork-transition test green in CI; 7.6 landed the PTC counters and 7.2b landed the validator_perf.py SLOT_DURATION_MS read). 8.9a–8.10 additionally require a public network with a real GLOAS_FORK_EPOCH in its config and a published spec release tag for it. 8.1–8.7 need no such network and start as soon as P7 lands.
Exit criteria (D16 — this phase closes on evidence complete, never on release approved):
evidence complete — objectively closeable by this phase's own issues: every KAT layer (L1–L5) all green against the network's shipped spec tag before the soak starts (8.9a → 8.9b, D26); ≥ 14 consecutive stable days on that network (never a calendar date) on the exact build that passed, 0 slashable events; readiness evidence recorded in docs/gloas-observability.md by 8.10. This is Phase 8's exit gate. A KAT failure with a verdict is a triage result that blocks the soak; it never satisfies this state.
release approved — an explicit decision by the named accountable role, which is UNASSIGNED (Q1). It is tracked separately, blocked pending assignment, and is the only state that closes the mainnet-readiness milestone. Recording the gap is not approval, and no issue here may self-approve or substitute a recorded gap for a decision.
Summary and execution plan (Day = effort day, single stream)
| Day |
Issue |
Title |
Pts |
Blocked by |
Scope |
Files |
| 1–1.5 |
8.1 |
Fork-resolution gauges + boundary log lines |
3 |
P2, P7 |
1.5 d |
eth-types/src/fork.rs, rvc/src/metrics.rs, rvc/src/orchestrator/coordinator/mod.rs |
| 2 |
8.2 |
PTC counters — verification no-op (7.6 implements) |
0 |
P7 (7.6) |
< 0.5 d |
none (verify rvc/src/metrics.rs) |
| 2 |
8.3 |
BN capability gauge — consume 6.7's family, label hygiene |
1 |
8.2, P6 (6.7) |
0.5 d |
bn-manager/src/{metrics,types}.rs |
| 3 |
8.4 |
Signer rejections by sign type and version |
2 |
8.3, P4 (4.9, 4.10) |
1 d |
signer/src/metrics.rs, signer/src/lib.rs |
| 4 |
8.5 |
SLOT_DURATION_MS read — verification checkpoint (7.2b implements) |
0 |
P7 (7.2b) |
< 0.5 d |
none (verify scripts/validator_perf.py) |
| 4 |
8.6 |
Pre-fork alerting rules + operator dashboard doc |
2 |
8.1–8.5 |
1 d |
docs/gloas-observability.md |
| 5–5.5 |
8.7 |
Soak evidence harness + zero-slashing check |
3 |
8.5, 8.6 |
1.5 d |
scripts/gloas_soak_snapshot.sh, scripts/tests/ |
| 6 |
8.9a |
Re-pin SPEC_TAG to the network's shipped tag, cold-cache regen + provenance — before the soak (D26) |
2 |
8.7, Q2 (tag published) |
1 d |
rvc-spec-vectors, spec_kat.rs, Makefile |
| 7–8 |
8.9b |
Root-diff triage + L1–L5 all-green verdict on the build to be soaked |
3 |
8.9a |
1.5 d |
project-plan.md Decision Log |
| 8.5–9.5 (+14 elapsed) |
8.8 |
Soak run on the first scheduling network, on the build 8.9b passed |
3 |
8.9b |
1.5 d effort / 14 d elapsed |
soak log, docs/gloas-observability.md |
| 10 |
8.10 |
Readiness record — evidence complete declared, release approved tracked |
1 |
8.8 |
0.5 d |
docs/gloas-observability.md |
Sub-issues
Plan ID → GitHub issue
| Plan ID |
Issue |
Title |
| 8.1 |
#332 |
[8.1] Fork-resolution gauges and fork-boundary log lines |
| 8.2 |
#333 |
[8.2] PTC duty and submission counters — verification no-op |
| 8.3 |
#334 |
[8.3] BN capability-state gauge — consume 6.7's family and pin label hygiene |
| 8.4 |
#335 |
[8.4] Signer rejections by sign type and version |
| 8.5 |
#336 |
[8.5] SLOT_DURATION_MS read — verification checkpoint |
| 8.6 |
#337 |
[8.6] Pre-fork alerting rules and operator dashboard doc |
| 8.7 |
#338 |
[8.7] Soak evidence harness and zero-slashing check |
| 8.8 |
#339 |
[8.8] Soak run on the first scheduling public network |
| 8.9a |
#340 |
[8.9a] Re-pin SPEC_TAG and regenerate vectors from a cold cache |
| 8.9b |
#341 |
[8.9b] Root-diff triage and the L1–L5 all-green verdict on the build to be soaked |
| 8.10 |
#342 |
[8.10] Readiness record — evidence complete declared, release approved tracked |
Plan reference:
plan/glamsterdam-2026-09-05/issues/08-phase-8-network-soak-and-observability.mdGoal: make the fork boundary observable (P2-1), soak on the first public network that schedules Gloas with the zero-slashing gate enforced, re-pin
SPEC_TAGto that network's shipped spec release, and drive mainnet readiness toevidence complete.release approvedis a separate state this phase cannot reach (D16). Issues: 11 · Points: 20 · Duration: ~10 working days single-stream (8.8 additionally waits 14 elapsed days; the wait is not effort).Entry criteria: Phase 7 complete (devnet metrics met, fork-transition test green in CI; 7.6 landed the PTC counters and 7.2b landed the
validator_perf.pySLOT_DURATION_MSread). 8.9a–8.10 additionally require a public network with a realGLOAS_FORK_EPOCHin its config and a published spec release tag for it. 8.1–8.7 need no such network and start as soon as P7 lands.Exit criteria (D16 — this phase closes on
evidence complete, never onrelease approved):evidence complete— objectively closeable by this phase's own issues: every KAT layer (L1–L5) all green against the network's shipped spec tag before the soak starts (8.9a → 8.9b, D26); ≥ 14 consecutive stable days on that network (never a calendar date) on the exact build that passed, 0 slashable events; readiness evidence recorded indocs/gloas-observability.mdby 8.10. This is Phase 8's exit gate. A KAT failure with a verdict is a triage result that blocks the soak; it never satisfies this state.release approved— an explicit decision by the named accountable role, which is UNASSIGNED (Q1). It is tracked separately, blocked pending assignment, and is the only state that closes the mainnet-readiness milestone. Recording the gap is not approval, and no issue here may self-approve or substitute a recorded gap for a decision.Summary and execution plan (Day = effort day, single stream)
eth-types/src/fork.rs,rvc/src/metrics.rs,rvc/src/orchestrator/coordinator/mod.rsrvc/src/metrics.rs)bn-manager/src/{metrics,types}.rssigner/src/metrics.rs,signer/src/lib.rsSLOT_DURATION_MSread — verification checkpoint (7.2b implements)scripts/validator_perf.py)docs/gloas-observability.mdscripts/gloas_soak_snapshot.sh,scripts/tests/SPEC_TAGto the network's shipped tag, cold-cache regen + provenance — before the soak (D26)rvc-spec-vectors,spec_kat.rs,Makefileproject-plan.mdDecision Logdocs/gloas-observability.mdevidence completedeclared,release approvedtrackeddocs/gloas-observability.mdSub-issues
SLOT_DURATION_MSread — verification checkpointSPEC_TAGand regenerate vectors from a cold cacheevidence completedeclared,release approvedtrackedPlan ID → GitHub issue
SLOT_DURATION_MSread — verification checkpointSPEC_TAGand regenerate vectors from a cold cacheevidence completedeclared,release approvedtracked