docs(validation): RG3 realtime chaos (Phase A) — 238-kill re-cert result + candid caveats#159
Merged
Merged
Conversation
…ult + candid caveats Record the RG3 Phase-A realtime-chaos result into the validation dossier and mark the RG3 gate row as MET in the stream-realtime campaign plan. VALIDATION.md §5.11 (new, self-contained): methodology (mock-driven SIGKILL crash-timing suite over the actual stream-mode indexer, phase-aware kill controller, whole-cluster digest vs unkilled baseline), the verbatim numbers (238 kills across 7 timing-class sub-runs, 238/238 clean resumes, 238/238 byte-identical digests, 0 duplicate FINALIZED rows over 204 finalized rows scanned), the K6-cutover non-vacuity fix + K2 kill-spread self-certification, and the candid mock-fidelity caveats (scripted not live semantics; K5 = handler reachability; K6 = MEDIUM-LOW-fidelity cutover; invariant() = fatal tripwire not the primary death detector) with an explicit "what this does NOT prove -> RG4/RG5" boundary. Does not rewrite §5.8 (that is the RG6 task). Harness source: #158. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…ee nit) Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
…erage scope) Fold two taste-seat candor nits on the RG3 Phase-A subsection, both in the weakening/precision direction: - K6 caveat: 'live stream cutover' → 'stream-phase cutover (after a block has actually streamed)', removing 'live' where the passage is conceding low mock fidelity (the doc draws a sharp mock-vs-live boundary elsewhere). - Conclusion: 'SIGKILL at any point in ... loop' → 'at each of the exercised crash points (the K1–K6 timing classes) spanning ... loop', so the sentence claims discrete crash-class coverage, not continuous per-instruction coverage. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Docs-only. Records the RG3 Phase-A realtime-chaos result (harness #158) into the validation dossier with candid, precisely-bounded caveats, and marks the RG3 gate row as MET in the stream-realtime campaign plan.
What changed
VALIDATION.md§5.11 (new, self-contained subsection): methodology + verbatim result + mock-fidelity caveats + an explicit "what this does NOT prove" boundary. It does not rewrite §5.8 — that consolidation is the later (RG6) dossier task..agents/plans/stream-realtime-production.md: the RG3 gate row annotated MET (Phase A, harness(rg3): realtime chaos kill/resume harness (Phase A) #158), pointing to §5.11 for the numbers and caveats. No other table rows restructured.Methodology (RG3 Phase A)
A
SIGKILLcrash-timing suite (#158) that drives the actual stream-mode indexer (portal/portal-realtime.tsvia a Ponder app) against a deterministic mock Portal (scripted/streamNDJSON with forks, 409 fork-negotiations, 204 idle phases, redelivery re-serves,/finalized-headscript). A phase-aware kill controller reads the mock's "phase reached" markers so kills land deterministically in the intended state rather than by sleep-guessing. After each kill the process is restarted and the resumed store is digested and compared whole-cluster against an unkilled baseline for that class.Six timing classes: K1 mid-append · K2 mid-stream at a varying interior block · K3 during redelivery await · K4 during a finalize-defer streak · K5 at a fork/409 cutover-handler entry (409 + wrong-fork variants) · K6 at the historical→realtime cutover.
Result (verbatim)
All three RG3 thresholds met: 238 ≥ 200 kills across 7 ≥ 6 classes, 100% clean resumes, byte-identical digests.
Non-vacuity self-certified in the harness. All 34 K6 kills recorded
killStats.stream == 1(kill lands on a real backfill→live cutover, not the startup/finalized-headprobe — the original bug #158's adversarial review caught). K2's kill-block varied across 8 distinct interior blocks {103…110}, recovered empirically from the kill phase log. Both are load-bearing in theacceptedconjunction (k6CutoverNonVacuousOk,k2KillSpreadOk), mutation-verified.Candid caveats (folded into §5.11)
portal-realtime.test.tsunit test, not by K5.invariant()= a fatal-string tripwire matching all seven real fatal throws inportal/portal-realtime.ts, not the primary death detector — a real client process-death fails the run regardless.What it does / does not prove
Crash-timing safety against a scripted mock: the stream path resumes byte-identical after a SIGKILL at any point in its mock-driven ingest/finalize/cutover loop. It does not establish live-protocol reorg survival, live finalize-boundary reconciliation, multichain ordering, or long-run availability — those are RG4 (multichain stream soak + live crash drills) and RG5 (A/B soak).
Draft — held for independent review before un-drafting.
🤖 Generated with Claude Code