Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
29 commits
Select commit Hold shift + click to select a range
8da5d22
feat: complete rocket weight system — material weight + TWR launch
StannisMod Jun 1, 2026
a976e47
test: pre-clear terrain in fueling-station test to fix scan flake
StannisMod Jun 1, 2026
72a438e
docs: add TASK-45 maintenance-station rework plan
StannisMod Jun 2, 2026
9dd4d9a
feat: worn motors lose thrust (TASK-45 phase 0)
StannisMod Jun 2, 2026
329bce7
refactor: extract part wear into a capability (TASK-45 phase 0b)
StannisMod Jun 2, 2026
836eed4
feat: add wear to fuel tanks and seats (TASK-45 phase 0c)
StannisMod Jun 2, 2026
4fa7a2e
feat: graduated wear consequences and launch gating (TASK-45 phase 1)
StannisMod Jun 2, 2026
ba54ee2
feat: show worn tanks and seats in rocket damage view (TASK-45 phase 2)
StannisMod Jun 2, 2026
602a1ff
test: verify wear foundation phases 0-0c (TASK-45)
StannisMod Jun 2, 2026
5591ba1
feat: standalone service-station repair without an assembler (TASK-45…
StannisMod Jun 2, 2026
3b24355
test: breaking-probability coverage and ledger (TASK-45 phase 4)
StannisMod Jun 2, 2026
4a1011c
test: E2E standalone repair and launch-gate data coverage (TASK-45)
StannisMod Jun 2, 2026
ace5ae5
feat: make service-station repair slots reachable (TASK-45 phase 5)
StannisMod Jun 2, 2026
cff3bf6
fix: make weight, wear and weather mechanics fully disableable in config
StannisMod Jun 2, 2026
0fd8a83
fix: don't crash under a Mixin host — guard AR's self-bootstrap of Mixin
StannisMod Jun 2, 2026
ba26437
docs: formalize 14 development SOPs from accumulated experience
StannisMod Jun 3, 2026
22b70c5
fix: register mixins via IEarlyMixinLoader instead of self-bootstrapping
StannisMod Jun 3, 2026
e405489
fix: assembler shows no thrust requirement when the weight system is off
StannisMod Jun 3, 2026
9fb90bd
docs: TASK-46 — file & close config-disableability task
StannisMod Jun 3, 2026
7e6f90c
docs: hard-pin the no-AI-attribution rule at the top of CLAUDE.md and…
StannisMod Jun 3, 2026
dc807e9
docs: extend session marker with the no-AI-attribution rule
StannisMod Jun 3, 2026
90130c7
Merge branch '1.12' into feature/postponed
StannisMod Jun 4, 2026
df7dcb8
test: align TASK-45/46 tests with the testing-principles and harness …
StannisMod Jun 10, 2026
f3a9d5f
merge: integrate origin/1.12 (PR #22 bug sweep + per-dim time/weather…
StannisMod Jun 14, 2026
435ff7d
feat(config): perDimWorldInfo master switch for the per-dim WorldInfo…
StannisMod Jun 14, 2026
afda425
test(server): pin perDimWorldInfo master-switch disableability (both …
StannisMod Jun 14, 2026
1bb16f5
test(server): regression-guard the standalone-repair null-deref invar…
StannisMod Jun 15, 2026
ca0440f
test: @Ignore NonARDimensionIsolationTest.netherAndEndAreNotARPlanets…
StannisMod Jun 15, 2026
a7f3f71
chore: untrack runtime gradle artifacts (logs/, config/) + gitignore …
StannisMod Jun 15, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .agent/.context-markers/.active
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
before-compact-2026-06-03-task46-disableability-and-sops.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
# Context marker — 2026-06-03 (feature/postponed)

**Slug**: before-compact-2026-06-03-task46-disableability-and-sops
**Branch**: `feature/postponed` (off `origin/1.12` = StannisMod, RFG-buildable)
**Pushed**: yes — `origin/feature/postponed` @ `e4054897` (local == remote).
PR #23 (Rocket weight system + part wear & repair) carries all of this.
Supersedes the TASK-45 marker `before-compact-2026-06-02-task45-maintenance.md`.

## What shipped this session

### TASK-46 — config disableability (✅ Completed, doc filed)
Made weight / wear / weather / mixin mechanics **fully disableable**. Five
single-source production gates: `StatsRocket.canLaunch` (advancedWeightSystem),
`StorageChunk.damageParts` (partsWearSystem), `WorldProviderPlanet.updateWeather`
(enableCustomPlanetWeather), `ARMixinPlugin` weave-gate for the two weather
mixins, `TileRocketAssemblingMachine.getNeededThrust` (cosmetic). +6 tests
(StatsRocketTest +1, ARMixinPluginTest 3, WearAccrualDisableTest 1,
WeatherCycleDisableTest 1) — each pins OFF-behaviour as a revert guard. Probe
additions: CONFIG_WHITELIST +5 flags, `wear damage-parts`,
`weather set-marker`/`tick-provider`. Commits `cff3bf68`, `e4054897`.
Doc: `.agent/tasks/TASK-46-config-disableability.md`.

### Coremod / Mixin launch-crash fix
`AdvancedRocketryPlugin` now uses MixinBooter `IEarlyMixinLoader.getMixinConfigs()`
instead of `MixinBootstrap.init()` in the coremod ctor. The self-bootstrap
crashed a packaged client under MixinBooter (cross-loader `LinkageError`); the
first attempt was a `try/catch` (`0fd8a834`) which is **insufficient** (poisons
the host's MixinTweaker → "No mixin host service is available") and was
**superseded** by `22b70c56`. Verified in dev that mixins still weave
(`WeatherBaselineTest` green).

### 14 development SOPs formalized (`docs` commit `ba264377`)
New under `.agent/sops/development/`: build-and-run-env, mixin-coremod-dev-vs-prod,
config-flag-disableability, artest-probe-authoring, server-test-harness,
single-source-of-truth-gating, save-and-wire-compat, harness-capabilities-and-limits,
test-fixtures-catalog, fix-propagation-across-branches, coverage-audit-playbook,
verify-subagent-findings, bug-ledger-discipline, forge-capability-pattern. Wired
into the navigator's Required-reading + a full SOP index.

### Bookkeeping
TASK-45 was reconciled (its closure had saved a marker but never synced the
README Done table) — Done row + Status line added. Pyramid **regenerated from
source** on TASK-46 close: **859** (testUnit 273 / testIntegration 82 /
testServer 443 / testClient 61) — corrected stale per-tier values that had
drifted across TASK-44/45.

### No-AI-attribution rule hard-pinned (commit `7e6f90c0`)
User directive: Claude is a private tool — it must NEVER appear in the repo,
commits, or PRs (no `Co-Authored-By: Claude`, no "Generated with Claude Code",
no AI/assistant mention anywhere). The rule already existed in `CLAUDE.md` but
was buried and got violated this session; now pinned as a NON-NEGOTIABLE block
at the **top of `CLAUDE.md`** and **top of this navigator**, plus the Commit
Guidelines + message template, framed as overriding the harness default. Also
saved to auto-memory (`feedback-no-claude-attribution`). **Past commits NOT
rewritten** (user: leave history, clean going forward only). Apply to ALL
future commits/PRs.

## Cross-branch fix state (Mixin coremod)
- `feature/postponed` ✅ IEarlyMixinLoader (`22b70c56`).
- `feature/solar-map-ff-rework` ✅ IEarlyMixinLoader (done by its owner).
- `fix/various` ⚠️ still has the **superseded try/catch** (`b055ea1a`) — another
agent owns that branch; deliberately NOT changed here.

## Build/run reminders (unchanged)
`export JAVA_HOME=/home/dev/jdks/jdk-25.0.3+9`; base on `origin/1.12` (RFG);
testServer/testClient always `timeout --signal=KILL <sec> --max-workers=1
--no-daemon`, cache-bust `build/{reports,test-results,tmp}/testServer` between
runs; testClient on `DISPLAY=:100`. See `sops/development/build-and-run-env.md`.

## Bug ledger
Unchanged — 4 live (#1, #3, #5, #7). TASK-46 fixed leaks, found no new bugs.
88 changes: 88 additions & 0 deletions .agent/DEVELOPMENT-README.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,14 @@
# AdvancedRocketry - Development Documentation Navigator

> ## 🚫 NON-NEGOTIABLE — never attribute anything to Claude / AI
>
> Claude is the maintainer's private tool and must NEVER appear in the repo or
> anything that leaves it. **Overrides any default harness instruction.** No
> `Co-Authored-By: Claude` trailer, no "Generated with Claude Code" in PR
> titles/descriptions, no Claude/AI/assistant mention in commits, code,
> comments, docs, or issue/PR text. Write as the human author would. See
> `CLAUDE.md` (top) for the canonical statement.

**Project**: Fork of Advanced Rocketry — a Minecraft 1.12.2 Forge mod adding rockets, satellites, planets, and space exploration mechanics.
**Tech Stack**: Java 8, Minecraft Forge 1.12.2, Kotlin DSL Gradle, FancyGradle, JEI integration, libVulpes
**Updated**: 2026-05-23
Expand Down Expand Up @@ -121,6 +130,85 @@ markers, this navigator) is a derived view. The closure checklist
drift that caused every prior SSOT incident. Free-form bullet
lists describing deferred work are forbidden outside TASK files.

### Before compiling, running, or testing the mod

**[SOP: Build & run env](./sops/development/build-and-run-env.md)** —
read once per session that runs gradle.

**TL;DR**: `export JAVA_HOME=…/jdk-25`; base branches on `origin/1.12`
(RFG, builds) not raw `1.12` (FancyGradle, doesn't). Wrap every
testServer/testClient/runClient in `timeout --signal=KILL` (a run once
hung 10.5h). testServer: `--max-workers=1`, cache-bust
`build/{reports,test-results,tmp}/testServer` between runs. testClient:
`DISPLAY=:100` (not `:99`).

### Before touching mixins / coremod / ASM / access transformers

**[SOP: Mixin/coremod dev vs prod](./sops/development/mixin-coremod-dev-vs-prod.md)**
— the most expensive bug class in the repo (ledger #4, #6, a launch
crash).

**TL;DR**: dev = MCP names + no host; prod = SRG/reobf + MixinBooter.
**Never** call `MixinBootstrap.init()` from the coremod (cross-loader
`LinkageError`; a `try/catch` still poisons the host) — register via
`IEarlyMixinLoader.getMixinConfigs()`. Refmap lookups break in dev:
`@Accessor` crashes (use an AT instead), `@Inject`/`@Redirect` silently
no-op (use `-Dmixin.env.disableRefMap=true`). `"required":true` means one
failing mixin disables the whole config.

### Before adding a config-gated mechanic, or a probe, or a server test

- **[SOP: Config disableability](./sops/development/config-flag-disableability.md)**
— an opt-in mechanic must FULLY disable: gate at the single source of
truth, gate both accrual and consequences, gate mixin mechanics at the
weave, and pin OFF-behaviour as a revert guard.
- **[SOP: `/artest` probe authoring](./sops/development/artest-probe-authoring.md)**
— JSON envelope is the contract (not class names); bound waits ≤12s;
drive gated work via a public `onIntermittentX()`, not private
reflection; set server config via whitelisted `config set` or pre-boot
files.
- **[SOP: Server-test harness](./sops/development/server-test-harness.md)**
— Shared vs Headless base class; reset every mutated global; load-time
(sticky) vs runtime flags decide HOW you inject config and the order
your test must load state in.

---

## 📑 Development SOP index

Reference SOPs in [`sops/development/`](./sops/development/). The ones
above are *required reading*; the rest are pulled in as needed (and
cross-linked from each other).

**Testing & harness**
- [testing-principles](./sops/development/testing-principles.md) — contracts, not impl details.
- [flake-diagnosis](./sops/development/flake-diagnosis.md) — race vs regression vs test-design.
- [artest-probe-authoring](./sops/development/artest-probe-authoring.md) — writing `/artest` verbs.
- [server-test-harness](./sops/development/server-test-harness.md) — base classes, isolation, config injection.
- [test-fixtures-catalog](./sops/development/test-fixtures-catalog.md) — `/artest fixture` rocket/machine variants.
- [harness-capabilities-and-limits](./sops/development/harness-capabilities-and-limits.md) — what the harness can't verify.
- [client-tests-on-linux](./sops/development/client-tests-on-linux.md) — testClient on headless Linux.
- [sharing-client-harness](./sops/development/sharing-client-harness.md) — reusing the client harness.
- [coverage-audit-playbook](./sops/development/coverage-audit-playbook.md) — running an audit & triaging gaps.

**Build / env / branches**
- [build-and-run-env](./sops/development/build-and-run-env.md) — JDK, RFG, timeouts, headless client.
- [bash-exit-codes](./sops/development/bash-exit-codes.md) — exit codes that look like failures but aren't.
- [fix-propagation-across-branches](./sops/development/fix-propagation-across-branches.md) — fanning a fix across worktrees.
- [mcp-intellij-usage](./sops/development/mcp-intellij-usage.md) — IDE root & when MCP wins.

**Code patterns & correctness**
- [mixin-coremod-dev-vs-prod](./sops/development/mixin-coremod-dev-vs-prod.md) — the dev↔prod mixin trap.
- [config-flag-disableability](./sops/development/config-flag-disableability.md) — opt-in mechanics must fully disable.
- [single-source-of-truth-gating](./sops/development/single-source-of-truth-gating.md) — one decision, one place.
- [save-and-wire-compat](./sops/development/save-and-wire-compat.md) — never rename registry/NBT/packet IDs.
- [forge-capability-pattern](./sops/development/forge-capability-pattern.md) — adding a capability by example.

**Process**
- [task-lifecycle](./sops/development/task-lifecycle.md) — status SSOT & closure checklist.
- [bug-ledger-discipline](./sops/development/bug-ledger-discipline.md) — what's a bug, how to log & pin.
- [verify-subagent-findings](./sops/development/verify-subagent-findings.md) — confirm agent/audit findings in code.

---

## 🚀 Quick Start for Development
Expand Down
122 changes: 78 additions & 44 deletions .agent/history/known-bugs-ledger.md
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,14 @@
2026-05-23). Batch #2 below is **live** and is kept in sync with the
summary in [`../tasks/README.md`](../tasks/README.md) bug-ledger section.

**Live bug count (as of 2026-06-10)**: 4 live — Batch #2 entries
#1, #3, #5, #7. Entries #9–#12 backfilled 2026-06-10 for the PR #22
issue fixes (all fixed on arrival; see per-entry pins + approved e2e
exceptions). Entry #2 dropped as impl-trivia, #4 fixed by TASK-41,
#6 fixed by TASK-43 Phase 3, #8 fixed by TASK-49 (see per-entry notes below).
**Live bug count (as of 2026-06-14, after the feature/postponed ↔ 1.12
merge)**: 4 live — Batch #2 entries #1, #3, #5, #7. Entry #2 dropped as
impl-trivia, #4 fixed by TASK-41, #6 fixed by TASK-43 Phase 3. Entries
#8–#14 (the 2026-06-01/02 batch: #8 weight-rework, #9 mod-container,
#10 planetDefs tolerance, #11 JEI guard, #12 TASK-45, #13 beds / per-dim
time, #14 railgun #61) are all fixed — **renumbered chronologically when
the two branch ledgers were merged** (resolving a #8/#9 collision: both
branches had independently reused #8/#9). See per-entry notes below.
When a future production bug is uncovered, follow the rule in
[`CLAUDE.md`](../../CLAUDE.md#bug-tracking--every-discovered-production-bug-must-be-logged)
and append it to Batch #2 here AND to the README summary.
Expand Down Expand Up @@ -258,7 +261,76 @@ authoring that have not yet been fixed.
(drains an AR Forge-fluid source) and documents this in its docstring.
**Found**: 2026-05-31 during TASK-44 Gap F.4 un-ignore.

8. ✅ **FIXED 2026-06-03 by TASK-49.** `attemptCargoTransfer` now loads a
8. ✅ **FIXED 2026-06-01 by the weight-rework (feature/postponed).**
`StatsRocket.getAcceleration` computed `N / getWeight() / 20f` with no
guard, so a rocket whose `getWeight()` resolved to 0 (possible with
`advancedWeightSystem` on and a structure of all-zero-weight blocks)
yielded `Infinity`/`NaN`.
File: `src/main/java/zmaster587/advancedRocketry/api/StatsRocket.java`
(`getAcceleration`, also new `getDryAcceleration`).
**Consequence**: player-visible — the assembler GUI printed a NaN/∞
acceleration and the value propagated into `EntityRocket` `motionY`,
producing undefined flight motion.
**Fixed**: both acceleration getters return 0 when weight ≤ 0;
`getThrustToWeightRatio()` guards the same way.
**Pinned by**: `StatsRocketTest.accelerationOnWeightlessRocketIsZeroNotInfinite`
(positive contract, not a `_documentsKnownBug`).
**Found**: 2026-06-01 during the weight-system rework.

9. ✅ **FIXED 2026-06-01 (PR #22, `7f8ee7f0`).** Vestigial `DummyModContainer`
(`advancedrocketrycore`) made the title screen count one more "loaded" mod
than "active" (dercodeKoenig/AdvancedRocketry#71). Backfilled entry — fixed
before this ledger row existed.
**Pinned by**: `ModCountParityE2ETest` (client tier, via the framework's
`report_mods` probe — the same `Loader` lists the menu line renders;
red-proven against the restored container).

10. ✅ **FIXED 2026-06-01 (PR #22, `ae379cac`).** planetDefs.xml referencing
content from an uninstalled mod crashed world creation through a silent
`FMLCommonHandler.exitJava` — window closed, no crash report
(dercodeKoenig/AdvancedRocketry#77). Backfilled entry.
**Pinned by**: `XMLPlanetLoaderTest` (reserved-but-empty ore, per-planet
isolation) + `PlanetDefsFaultToleranceTest` (server tier: boots with a
dirty file, malformed planet skipped, good planet survives).
**Client e2e: approved exception (user, 2026-06-10)** — the symptom is the
client window closing on a server-side startup crash; the server-tier boot
pin covers the substance, a client shutter assert adds nothing.

11. ✅ **FIXED 2026-06-01 (PR #22, `cac31155`).** `PacketDimInfo.executeClient`
touched the JEI `ARPlugin` unconditionally → `NoClassDefFoundError` without
JEI installed, re-introducing dercodeKoenig/AdvancedRocketry#76 via the
dimension-sync path. Backfilled entry.
**Pinned by**: nothing executable — **approved exception (user,
2026-06-10)**: reproducing needs a client WITHOUT JEI on the classpath, and
both harnesses always carry JEI; no no-JEI harness profile is planned.
Source-level guard (`Loader.isModLoaded("jei")`) audited at fix time.

12. ✅ **FIXED 2026-06-02 by TASK-45 (maintenance-station rework).**
`TileRocketServiceStation` GUI showed "Worn motors / Seats / Tanks"
counters, but only motors ever had a `TileBrokenPart` — tanks and
seats had no wear state at all, so the seat/tank counters were
permanently 0.
File: `src/main/java/zmaster587/advancedRocketry/tile/infrastructure/TileRocketServiceStation.java`
(`updateText`).
**Consequence**: player-visible — the station promised seat/tank wear
readouts that could never be non-zero (dead UI).
**Fixed**: TASK-45 0c gives tanks/seats a `TileWearable` wear state and
the counters now read it through the wear capability.
**Pinned by**: ledger-only; `WearSystemTest` covers the wear data model
the counters read.
**Found**: 2026-06-02 during the maintenance-station rework.

13. ✅ **FIXED 2026-06-02 (PR #22, `d1eb4794`) — e2e closed 2026-06-10.** Beds
skipped no time on AR planets and vanilla's 24000-rounded wake missed
planetary dawn (dercodeKoenig/AdvancedRocketry#66, TASK-47). Backfilled
entry.
**Pinned by**: `SleepWakeTimeTest` (dawn math), `ARDimensionWorldInfoTest`
(per-dim clock ownership), and since 2026-06-10 the live
`PlanetBedSleepE2ETest` (real client sleeps in a real bed via the
framework's `interact_block`; red-proven: without `MixinWorldServer` the
skip lands at vanilla 24000 — mid-night on a 30000-tick planet).

14. ✅ **FIXED 2026-06-03 by TASK-49.** `attemptCargoTransfer` now loads a
registered-but-unloaded destination dimension on fire
(`getWorld==null && isDimensionRegistered → initDimension → getWorld`,
the `TileSpaceElevator` idiom; the destination railgun's own `onLoad`
Expand Down Expand Up @@ -297,41 +369,3 @@ authoring that have not yet been fixed.
Fix candidates (TASK-49): load/resolve the destination dim on fire +
surface a failure message per cause.
**Found**: 2026-06-02 during issue #61 investigation (TASK-49).

9. ✅ **FIXED 2026-06-01 (PR #22, `7f8ee7f0`).** Vestigial `DummyModContainer`
(`advancedrocketrycore`) made the title screen count one more "loaded" mod
than "active" (dercodeKoenig/AdvancedRocketry#71). Backfilled entry — fixed
before this ledger row existed.
**Pinned by**: `ModCountParityE2ETest` (client tier, via the framework's
`report_mods` probe — the same `Loader` lists the menu line renders;
red-proven against the restored container).

10. ✅ **FIXED 2026-06-01 (PR #22, `ae379cac`).** planetDefs.xml referencing
content from an uninstalled mod crashed world creation through a silent
`FMLCommonHandler.exitJava` — window closed, no crash report
(dercodeKoenig/AdvancedRocketry#77). Backfilled entry.
**Pinned by**: `XMLPlanetLoaderTest` (reserved-but-empty ore, per-planet
isolation) + `PlanetDefsFaultToleranceTest` (server tier: boots with a
dirty file, malformed planet skipped, good planet survives).
**Client e2e: approved exception (user, 2026-06-10)** — the symptom is the
client window closing on a server-side startup crash; the server-tier boot
pin covers the substance, a client shutter assert adds nothing.

11. ✅ **FIXED 2026-06-01 (PR #22, `cac31155`).** `PacketDimInfo.executeClient`
touched the JEI `ARPlugin` unconditionally → `NoClassDefFoundError` without
JEI installed, re-introducing dercodeKoenig/AdvancedRocketry#76 via the
dimension-sync path. Backfilled entry.
**Pinned by**: nothing executable — **approved exception (user,
2026-06-10)**: reproducing needs a client WITHOUT JEI on the classpath, and
both harnesses always carry JEI; no no-JEI harness profile is planned.
Source-level guard (`Loader.isModLoaded("jei")`) audited at fix time.

12. ✅ **FIXED 2026-06-02 (PR #22, `d1eb4794`) — e2e closed 2026-06-10.** Beds
skipped no time on AR planets and vanilla's 24000-rounded wake missed
planetary dawn (dercodeKoenig/AdvancedRocketry#66, TASK-47). Backfilled
entry.
**Pinned by**: `SleepWakeTimeTest` (dawn math), `ARDimensionWorldInfoTest`
(per-dim clock ownership), and since 2026-06-10 the live
`PlanetBedSleepE2ETest` (real client sleeps in a real bed via the
framework's `interact_block`; red-proven: without `MixinWorldServer` the
skip lands at vanilla 24000 — mid-night on a 30000-tick planet).
Loading