Skip to content

Commit 721c92d

Browse files
Digest CH-003: the cause, the record, and what may honestly be promoted.
AN-006 now carries the established cause instead of a suspect. The death never reaches any bot: the Tank Royale server emits it before the turn's bot snapshot exists, so it fans out over nobody. The repair is committed upstream on its own branch with a positive and a negative server test; the bridge is correct throughout and needs no change. The Bot API event queue, the negative priority, the instant death handler, and the bridge are each recorded as ruled out, with the probe that ruled them out. EVT-004 stays draft, because the repair is unreleased and the bridge builds against released artifacts. Its reason is now a named cause with a named fix. EVT-007 is blocked by the same cause, which nobody had written down. EVT-003 is promoted and M-103 closes: three conformance tests prove exactly what it says, and they pass. EVT-005 is not promoted, which is what this change set out to do. The tests tagged for it assert round and battle completion -- behaviour no criterion in CAP-001 covers -- and the win-handler test tagged EVT-004 is mistagged the same way. Promoting on that evidence would have recorded a promise as kept that nothing kept. G-002 carries the repair as a proposed goal, since fixing it means minting criteria and retagging tests. AN-008 records a second divergence the death fix made visible: Tank Royale declares more round winners than a battle has rounds, which classic never does. It is pre-existing and independent -- it occurs on the unrepaired server too. The harness README gains the build caveat that cost a whole comparison: the runner jar embeds a shrunk server jar that Gradle will happily not rebuild. Verification: tier 1 green; the conformance tier ran (not skipped) and is green, with the EVT-004 death test skipped by design. The regression gate is untouched because no runtime source changed in this change. Cliewen-Route: full Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011CzphhW5SDHycZJFfaAKLm
1 parent 02af87e commit 721c92d

13 files changed

Lines changed: 149 additions & 183 deletions

File tree

.clue/id-ledger.yaml

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,14 +1,14 @@
11
counters:
22
ADR: "1"
3-
AN: "7"
3+
AN: "9"
44
API: "6"
55
ARCH: "3"
66
C: "7"
77
CAP: "8"
88
CH: "3"
99
CRIT: "8"
1010
DES: "8"
11-
G: "1"
11+
G: "2"
1212
IDR: "2"
1313
OQ: "2"
1414
P: "1"
@@ -57,6 +57,16 @@ entries:
5757
state: live
5858
prefix: AN
5959
component: "7"
60+
- id: AN-008
61+
kind: numeric
62+
state: live
63+
prefix: AN
64+
component: "8"
65+
- id: AN-009
66+
kind: numeric
67+
state: reserved
68+
prefix: AN
69+
component: "9"
6070
- id: API-001
6171
kind: numeric
6272
state: live
@@ -277,6 +287,11 @@ entries:
277287
state: live
278288
prefix: G
279289
component: "1"
290+
- id: G-002
291+
kind: numeric
292+
state: live
293+
prefix: G
294+
component: "2"
280295
- id: IDR-001
281296
kind: numeric
282297
state: live

changes/CH-003-own-death-reaches-on-death/findings.md

Lines changed: 0 additions & 54 deletions
This file was deleted.

changes/CH-003-own-death-reaches-on-death/proposal.md

Lines changed: 0 additions & 61 deletions
This file was deleted.

changes/CH-003-own-death-reaches-on-death/tasks.md

Lines changed: 0 additions & 46 deletions
This file was deleted.

compat-test/README.md

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -224,3 +224,10 @@ therefore safe to run over a state file holding results from several eras.
224224
chunk it; checkpointing makes chunking free.
225225
- Per-side timeout (`--timeout`, default 600 s) kills the entire worker process tree
226226
(server/booter/bot JVMs included) and records the robot as failed.
227+
- **Comparing two Tank Royale server builds**: the runner jar carries an embedded server
228+
jar, and rebuilding it does not reliably pick up a change to the server's sources —
229+
Gradle's up-to-date check reused a stale shrunk server jar and produced byte-identical
230+
runner jars for two different source trees, which silently made a whole comparison
231+
meaningless. Clean the modules first (`gradlew :server:clean :runner:clean`) and check
232+
the runner jar's checksum between builds; if the checksum did not change, neither did
233+
the server.

conformance-test/src/test/java/dev/robocode/tankroyale/bridge/conformance/RoundOutcomeEventsConformanceTest.java

Lines changed: 12 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,24 @@
1919
* routed through the Bot API's event queue, the bridge dispatched them from a hand-written
2020
* switch that had no case for the robot's own death, so {@code onDeath} was never called for
2121
* any robot. A manual switch fails silently on the branch nobody wrote, and nothing in a
22-
* score report shows it.
22+
* score report shows it. Routing through the queue did not fix it either, and AN-006 now has
23+
* the reason: the death never reaches the bot, so there is nothing for any dispatcher to route.
24+
*
25+
* Two of the tests here are tagged for criteria they do not prove -- the win-handler test and
26+
* both round-completion tests assert behaviour no criterion in CAP-001 covers. G-002 carries
27+
* that; do not read a passing test in this class as evidence for the criterion in its name.
2328
*/
2429
class RoundOutcomeEventsConformanceTest extends ConformanceTestBase {
2530

2631
private static final String ROBOT = "tested.robots.BattleWin";
2732

2833
@Test
29-
@Disabled("Fails against the bridge: onDeath is never called. Confirmed and recorded in "
30-
+ "AN-006, which has the measured marker counts for both engines. Kept rather than "
31-
+ "deleted because it is the only thing that detects the defect, and disabled rather "
32-
+ "than left failing so the build stays honest. Re-enable in M-001, which owns the "
33-
+ "root cause in the Bot API's event queue.")
34+
@Disabled("Fails against the bridge: onDeath is never called, because no death event reaches "
35+
+ "any bot at all. AN-006 has the cause -- the Tank Royale server emits a death before "
36+
+ "the turn's bot snapshot exists, so it fans out over nobody -- and the repair is "
37+
+ "committed upstream and unreleased. Kept rather than deleted because it is the only "
38+
+ "thing that detects the defect, and disabled rather than left failing so the build "
39+
+ "stays honest. Re-enable when a Tank Royale release carries the repair.")
3440
@DisplayName("EVT-004: a robot's own death reaches onDeath on both engines")
3541
void testEVT004_IntegrationPositive_OwnDeathReachesTheDeathHandler() {
3642
assertOnBothEngines(ROBOT, (outcome, engine) ->

0 commit comments

Comments
 (0)