Files
rivencraft/docs/MILESTONE_6_REGRESSION.md
T
2026-10-10 15:16:08 -04:00

96 lines
7.0 KiB
Markdown

# Milestone 6 instability regression and migration check (#73)
This is the release-slice acceptance record for instability, not a promise of
general old-save compatibility. The latter remains issue #60. Run the focused
archive with `./gradlew build runGameTestServer -ParchivedGameTestSuites=instability`;
it includes the default smoke suite.
For 0.5.8.10 on 2026-10-10, that dedicated GameTest server passed all 55 required tests
with no optional content/client integrations installed (the required Dynamic
Dimensions and Bad Packets dependencies were present). The full archive was not run;
it has a previously documented storage stall, so do not count it as passing.
The 0.5.8.11 run with live block profiling stalled in its initial batch and
was stopped; it is **not** a passing result. The live profiling scenario is
handed to the player in [the block-profile checklist](LIVE_BLOCK_INSTABILITY.md).
## Automated coverage
| Requirement | Existing default test or focused archive |
| --- | --- |
| Stable writing, defective writing, score explanations, repeated use of the same book | `AgePersistenceGameTests.instabilitySeparatesStableAndDefectiveWriting` |
| Frozen score, age-scoped writing cost, random baseline | `AgePersistenceGameTests.randomBaselineAndBrightBalanceAreFrozen`, `auditedSymbolCostsAreCountedAndAgeScoped` |
| Complete Age definition, score and provider-plan save/load | `AgePersistenceGameTests.authoredPlanRetainsResolvedMeaningAndAgeIdentity`; `AgeInstabilityRuntimeGameTests.selectionIsDeterministicAndFrozen` |
| Old pre-scoring Ages, score-only saves, removed symbols, unavailable handlers | `AgePersistenceGameTests.missingRegistryEntryDoesNotReinterpretAnOldAge`, `instabilitySeparatesStableAndDefectiveWriting`; `AgeInstabilityRuntimeGameTests.savedPlanSurvivesAgeUpdatesAndMissingHandlers` |
| Per-Age controls and changed config without score/plan reroll | `AgeInstabilityRuntimeGameTests.perAgeControlsPersistWithoutChangingScoresOrOtherAges`; `Milestone6RegressionGameTests.disablingEffectsCannotRerollFrozenPlan` |
| Hazard cooldown and attempt sequence across saved-state reload | `AgeInstabilityRuntimeGameTests.hazardCooldownAndAttemptSequenceSurviveReload` |
| Active-Age rotation, action/tick budget | `AgeInstabilityRuntimeGameTests.ageScopeRotationAndActionBudgetAreBounded` |
| Multiplayer loaded-chunk-only candidate selection, deduplication and cap | `Milestone6RegressionGameTests.multiplayerCandidatesStayLoadedDeduplicatedAndCapped` |
| Decay loaded-chunk target and spawn protection | `AgeDecayGameTests.targetMustRemainInChosenLoadedChunk`, `savedSpawnAndPlatformAreProtected` |
| Explosion policy gates and protected blocks | `Milestone6RegressionGameTests.disabledGriefAndProtectedBlocksStayUntouched` |
| No Overworld status or decay provider | `AgeStatusEffectGameTests.overworldCannotRunAnAgeStatusProvider`; `AgeDecayGameTests.overworldCannotRunDecayProvider` |
These tests exercise saved-data serialization and deterministic policies. They
do **not** simulate a complete process restart, an actual multiplayer server,
optional-mod installation, or real terrain and hazard visuals. The three new
checks live only in the `instability` archive to avoid duplicating default tests.
## Migration outcome and known gaps
- Pre-scoring Milestone 5 Ages load with a neutral score and no effects; they
are not retroactively rescored under current writing rules.
- Score-only Ages receive a deterministic provider plan once from their saved
score and Age seed. An already-saved score and plan retain their meaning when
pages, handlers, or runtime config change. Unknown but syntactically valid
provider IDs are preserved and skipped if their handler is unavailable.
- Missing symbol definitions do not reinterpret a frozen instability score.
That check is narrower than arbitrary missing biome, block, or worldgen
registry entries: loading a world with removed data packs is not guaranteed.
Broad save compatibility and migration remain tracked in #60.
- In-process roundtrips cannot prove that Age dimensions reload correctly
after a full stop/start. Check that in a real client/server world. Do not add
another GameTest for it if it hits the documented storage stall; hand the
exact scenario to the player instead.
- The dedicated GameTest run establishes classloading with no optional runtime
flags. It does not establish classloading with every optional integration
installed, nor the reverse of removing one from an existing save.
## Manual in-game matrix
Use a fresh test world, then keep one save for the restart and data-pack checks.
Record the seed, mod list, age name, and `/rivencraft age instability` output
before and after each change. Do not deliberately remove a required registry
entry from a valued world; copy the test save first.
1. Bind a low-instability book and a deliberately unstable book. Reuse each
book and verify the Age name, dimension ID, score, selected providers and
provider levels remain unchanged. Exit the Ages, stop Minecraft completely,
restart and re-enter; compare the same diagnostic values.
2. With two survival players in one unstable Age and a third player in the
Overworld, verify effects stay in the Age, follow the Age players, and do
not appear in the Overworld. Move both Age players away, let old chunks
unload, and confirm hazards do not keep remote chunks loaded or operate
there. Confirm controls on one Age do not alter a second Age.
3. Disable global instability, then world mutation, then one provider. Verify
the suppressed effect stops and the frozen score/plan do not change after
re-enabling or restarting. With block destruction disabled, trigger an
explosion in an expendable Age; check that arrival platforms, portals,
block entities and protected blocks survive. Check lightning, explosion,
decay, status-effect, burning, meteor and erosion visuals where selected.
4. With Biomes O' Plenty or another TerraBlender biome mod, confirm recognized
biome pages still author an Age and the instability diagnostics remain
stable after restart. Repeat with Serene Seasons installed, then absent in
a disposable copy; confirm its Age season behavior and that Rivencraft
itself still loads. JEI should display the relevant pages and recipes when
installed, while the mod works without it.
5. Check the book preview separately with its fallback animation, Ponder/Create,
and Immersive Portals when available. Opening a book should not change
player location, instability diagnostics, or ambient audio in the actual
Age. Do not install both season mods together for this matrix.
6. On a copied save, remove or alter a **nonessential** data pack providing
a writing symbol or optional handler, then reload. Existing saved scores
and provider plans must not reroll. If a referenced worldgen registry entry
prevents load, record it against issue #60 rather than treating #73's
frozen-instability guarantee as general missing-registry support.
The matrix is guidance for a player-run pass; none of these six scenarios is
claimed as completed by the automated result above.