Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
90 commits
Select commit Hold shift + click to select a range
f88f433
Propose CH-017 continue M-006 parity sweep
flemming-n-larsen Sep 11, 2026
8ded29f
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 11, 2026
28c35e2
Record second CH-017 roborumble checkpoint
flemming-n-larsen Sep 11, 2026
458b1a5
Record third CH-017 roborumble checkpoint
flemming-n-larsen Sep 11, 2026
9a866c0
Record fourth CH-017 roborumble checkpoint
flemming-n-larsen Sep 11, 2026
f44e32e
Record fifth CH-017 roborumble checkpoint
flemming-n-larsen Sep 11, 2026
ec27660
Record sixth CH-017 roborumble checkpoint
flemming-n-larsen Sep 11, 2026
bf9963e
Record seventh CH-017 roborumble checkpoint
flemming-n-larsen Sep 11, 2026
fc1bb82
Record eighth CH-017 roborumble checkpoint
flemming-n-larsen Sep 11, 2026
78c338d
Record ninth CH-017 roborumble checkpoint
flemming-n-larsen Sep 11, 2026
520560c
Fix checkpoint registry replay
flemming-n-larsen Sep 11, 2026
7c7e232
Repair CH-017 registry replay artifacts
flemming-n-larsen Sep 11, 2026
7e4b06b
Record tenth CH-017 roborumble checkpoint
flemming-n-larsen Sep 11, 2026
94fdbe3
Handle legacy metadata encoding
flemming-n-larsen Sep 12, 2026
3bfc0db
Record recovered CH-017 roborumble checkpoint
flemming-n-larsen Sep 12, 2026
df9075a
Promote CH-017 metadata identities
flemming-n-larsen Sep 12, 2026
36549f1
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 12, 2026
7f69420
Record CH-017 matched failure checkpoint
flemming-n-larsen Sep 12, 2026
d2d1a23
Record CH-017 harness failure checkpoint
flemming-n-larsen Sep 12, 2026
7a4932b
Keep compatibility workers Java 11 compatible
flemming-n-larsen Sep 12, 2026
975ed11
Retest CH-017 after worker compatibility repair
flemming-n-larsen Sep 12, 2026
cdeb97a
Record CH-017 roborumble checkpoint after harness repair
flemming-n-larsen Sep 12, 2026
5939e54
Recover interrupted CH-017 checkpoint
flemming-n-larsen Sep 12, 2026
2e03617
Record CH-017 roborumble checkpoint after worker repair
flemming-n-larsen Sep 12, 2026
b685c55
Pin classic Robocode version in parity evidence
flemming-n-larsen Sep 12, 2026
64f9ea7
Record Robocode version pin proof
flemming-n-larsen Sep 12, 2026
a5a2657
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 12, 2026
cf50844
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 12, 2026
28d4a79
Restore packaged robot data files
flemming-n-larsen Sep 12, 2026
9972f00
Confirm packaged robot data parity
flemming-n-larsen Sep 12, 2026
1498474
Retest unresolved roborumble cases with packaged data
flemming-n-larsen Sep 12, 2026
aafcebc
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 12, 2026
07f66a1
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 12, 2026
3bcf751
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 12, 2026
886afdc
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 12, 2026
d177578
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 12, 2026
d30d1b3
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 12, 2026
eb9dd70
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 12, 2026
14e9cb0
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 12, 2026
837ec4d
Record recovered CH-017 checkpoint
flemming-n-larsen Sep 21, 2026
dbfd9c0
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 21, 2026
e8f08ff
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 21, 2026
cd0dbe5
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 21, 2026
ceb4b54
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 21, 2026
cd5f9d5
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 21, 2026
23b21f0
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 21, 2026
63d0dd7
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 21, 2026
2d79813
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 21, 2026
b88dfa3
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 21, 2026
f5a241b
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 21, 2026
416f694
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 21, 2026
b535f48
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 21, 2026
40a7fcf
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 21, 2026
09ec1f7
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 21, 2026
2760d30
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 21, 2026
1df8246
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 21, 2026
e783817
Record CH-017 roborumble checkpoint
flemming-n-larsen Sep 21, 2026
24857a3
Recover interrupted CH-017 checkpoint
flemming-n-larsen Sep 22, 2026
44fd5bc
Record final CH-017 roborumble checkpoint
flemming-n-larsen Sep 22, 2026
1a83348
Confirm packaged data repair
flemming-n-larsen Sep 22, 2026
8135a43
Write wrapper metadata as UTF-8
flemming-n-larsen Sep 22, 2026
48871c9
Escape wrapper JSON for legacy Bot API
flemming-n-larsen Sep 22, 2026
19e72af
Confirm legacy metadata encoding repair
flemming-n-larsen Sep 22, 2026
1e23ca9
Confirm remaining metadata encoding cases
flemming-n-larsen Sep 22, 2026
f76de0c
Discover robots inside classic team jars
flemming-n-larsen Sep 22, 2026
e5b2daf
Confirm nested team archive support
flemming-n-larsen Sep 22, 2026
c3cda7d
Diagnose Tank Royale team message limit
flemming-n-larsen Sep 22, 2026
cc5a673
Record team identity mapping decision
flemming-n-larsen Sep 22, 2026
7746488
Confirm batched team broadcast delivery
flemming-n-larsen Sep 23, 2026
2336f3b
fix(team): restore classic team names from Tank Royale map
flemming-n-larsen Sep 27, 2026
3557f22
test(m006): record five stream-limit retests
flemming-n-larsen Sep 27, 2026
e7b7653
test(m006): record official melee checkpoint
flemming-n-larsen Sep 28, 2026
4d0fa88
test(m006): bound harness timeouts and record checkpoint
flemming-n-larsen Sep 28, 2026
9b0a7f1
Merge remote-tracking branch 'origin/main' into ch-017-complete-m006-…
flemming-n-larsen Sep 28, 2026
7af5c9b
docs(ch017): remove stale change link
flemming-n-larsen Sep 28, 2026
3247751
test(m006): retest timeout repair and bot exceptions
flemming-n-larsen Sep 28, 2026
671d41a
Record CH-017 official parity checkpoint
flemming-n-larsen Sep 28, 2026
796a170
Close abandoned legacy streams between rounds
flemming-n-larsen Sep 28, 2026
c828459
Record Fermat stream repair retests
flemming-n-larsen Sep 28, 2026
255fcb3
Preserve classic scan target name identity
flemming-n-larsen Sep 28, 2026
5f18421
Record Colossus2 repair retest
flemming-n-larsen Sep 28, 2026
3878254
Match classic quota on file overwrite
flemming-n-larsen Sep 28, 2026
792ae19
Close legacy streams after round thread stops
flemming-n-larsen Sep 28, 2026
47e1040
Record stream lifecycle retests
flemming-n-larsen Sep 28, 2026
e663103
Scope cause retests to diagnosed subjects
flemming-n-larsen Sep 28, 2026
8e50c0b
Deliver initial status before legacy run
flemming-n-larsen Sep 29, 2026
e18491b
Record initial-status cause retests
flemming-n-larsen Sep 29, 2026
15b26e3
Retire completed TEAM-002 milestone
flemming-n-larsen Sep 29, 2026
21f7376
Scope CH-017 as a verified parity checkpoint
flemming-n-larsen Sep 29, 2026
05c4b56
Digest the CH-017 checkpoint workspace
flemming-n-larsen Sep 29, 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
7 changes: 7 additions & 0 deletions .clue/id-ledger.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -166,6 +166,12 @@ events:
- {id: AN-015, kind: numeric, state: live, prefix: AN, component: "15"}
- {id: FIO-005, kind: numeric, state: reserved, prefix: FIO, component: "5"}
- {id: FIO-005, kind: numeric, state: live, prefix: FIO, component: "5"}
- {id: CH-017, kind: numeric, state: reserved, prefix: CH, component: "17"}
- {id: TASKS-010, kind: numeric, state: reserved, prefix: TASKS, component: "10"}
- {id: OQ-008, kind: numeric, state: reserved, prefix: OQ, component: "8"}
- {id: CH-017, kind: numeric, state: live, prefix: CH, component: "17"}
- {id: TASKS-010, kind: numeric, state: live, prefix: TASKS, component: "10"}
- {id: OQ-008, kind: numeric, state: live, prefix: OQ, component: "8"}
- {id: M-005, kind: numeric, state: retired, prefix: M, component: "5"}
- {id: M-006, kind: numeric, state: live, prefix: M, component: "6"}
- {id: M-007, kind: numeric, state: retired, prefix: M, component: "7"}
Expand Down Expand Up @@ -221,6 +227,7 @@ events:
- {id: M-002, kind: numeric, state: retired, prefix: M, component: "2"}
- {id: M-003, kind: numeric, state: retired, prefix: M, component: "3"}
- {id: M-004, kind: numeric, state: retired, prefix: M, component: "4"}
- {id: M-130, kind: numeric, state: retired, prefix: M, component: "130"}
high-water:
- {id: ADR-002, kind: numeric, state: reserved, prefix: ADR, component: "2"}
- {id: AN-014, kind: numeric, state: reserved, prefix: AN, component: "14"}
Expand Down
7 changes: 7 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,14 @@

## Unreleased

- Deliver each round's initial status callback before the legacy robot's `run()` method, matching Classic Robocode and preventing robots from reading uninitialized callback state.
- Preserve classic scan target names and stable string identity so legacy robots continue to recognize repeated scans of the same bot.
- Close legacy data streams abandoned by worker threads between rounds after the previous bot thread has stopped, and track active stream instances so leaked handles cannot consume later rounds' five-stream quota.
- Match classic data-quota accounting when a robot replaces an existing file, so repeated rewrites do not consume quota cumulatively.
- Bounded compatibility-sweep timeout supervision so blocked error watching or process-tree cleanup cannot stall a checkpoint indefinitely, and retain Windows taskkill diagnostics when cleanup is incomplete.
- Kept cause-targeted compatibility retests limited to unresolved, diagnosed subjects even when local checkpoint state is missing.
- Fixed legacy bot startup and round-transition lifecycle races by attaching peers after game setup and containing stale callback tick errors during shutdown.
- Added two-engine conformance evidence for pending scan delivery, turn-boundary timing, custom-event removal, skipped turns, handler exceptions, and official melee-participant-count scans.
- Preserved classic handler-exception reporting by surfacing legacy callback failures at the bridge boundary while retaining Tank Royale's event queue.
- Added grouped team-robot staging and two-engine conformance evidence for team membership, teammate messages, directed-recipient isolation, droid no-scan behavior, and arbitrary serializable message payloads.
- Restored classic team names, including battle-wide duplicate suffixes, through the Tank Royale name map for team identity, teammate lookup, directed messaging, and message-event senders when paired with the matching Tank Royale Bot API and runner.
3 changes: 2 additions & 1 deletion compat-test/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,8 @@ the failure.
JDK; override with `--rc-java` or `COMPAT_RC_JAVA`. The Tank Royale side is unaffected.
- Robot collection at `C:\Code\LiteRumble robots` with `roborumble`, `meleerumble`,
`teamrumble` subdirectories of `.jar` files.
- Classic Robocode installation at `C:\robocode` (1.10.3 tested).
- Classic Robocode installation at `C:\robocode`; LiteRumble currently accepts client versions
1.10.3, 1.11.0, and 1.11.1, and the harness records and validates the installed version.
- Built artifacts (all present after building the respective repos):
- Tank Royale runner fat jar: `C:\Code\tank-royale\runner\examples\lib\robocode-tankroyale-runner.jar`
- Bridge adapter: `robocode-api\build\libs\robocode-api-0.5.0.jar` (this repo, `gradlew :robocode-api:build`)
Expand Down
27 changes: 15 additions & 12 deletions compat-test/RcBattleWorker.java
Original file line number Diff line number Diff line change
Expand Up @@ -344,11 +344,13 @@ static String write(Object value) {
private static void writeValue(StringBuilder sb, Object value) {
if (value == null) {
sb.append("null");
} else if (value instanceof String s) {
} else if (value instanceof String) {
String s = (String) value;
sb.append('"').append(escape(s)).append('"');
} else if (value instanceof Number || value instanceof Boolean) {
sb.append(value);
} else if (value instanceof Map<?, ?> map) {
} else if (value instanceof Map) {
Map<?, ?> map = (Map<?, ?>) value;
sb.append('{');
boolean first = true;
for (Map.Entry<?, ?> e : map.entrySet()) {
Expand All @@ -358,7 +360,8 @@ private static void writeValue(StringBuilder sb, Object value) {
writeValue(sb, e.getValue());
}
sb.append('}');
} else if (value instanceof Iterable<?> it) {
} else if (value instanceof Iterable) {
Iterable<?> it = (Iterable<?>) value;
sb.append('[');
boolean first = true;
for (Object o : it) {
Expand All @@ -377,21 +380,21 @@ private static String escape(String s) {
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
switch (c) {
case '"' -> sb.append("\\\"");
case '\\' -> sb.append("\\\\");
case '\n' -> sb.append("\\n");
case '\r' -> sb.append("\\r");
case '\t' -> sb.append("\\t");
case '\b' -> sb.append("\\b");
case '\f' -> sb.append("\\f");
default -> {
case '"': sb.append("\\\""); break;
case '\\': sb.append("\\\\"); break;
case '\n': sb.append("\\n"); break;
case '\r': sb.append("\\r"); break;
case '\t': sb.append("\\t"); break;
case '\b': sb.append("\\b"); break;
case '\f': sb.append("\\f"); break;
default:
if (c < 0x20) {
sb.append(String.format("\\u%04x", (int) c));
} else {
sb.append(c);
}
break;
}
}
}
return sb.toString();
}
Expand Down
27 changes: 15 additions & 12 deletions compat-test/TrBattleWorker.java
Original file line number Diff line number Diff line change
Expand Up @@ -269,11 +269,13 @@ static String write(Object value) {
private static void writeValue(StringBuilder sb, Object value) {
if (value == null) {
sb.append("null");
} else if (value instanceof String s) {
} else if (value instanceof String) {
String s = (String) value;
sb.append('"').append(escape(s)).append('"');
} else if (value instanceof Number || value instanceof Boolean) {
sb.append(value);
} else if (value instanceof Map<?, ?> map) {
} else if (value instanceof Map) {
Map<?, ?> map = (Map<?, ?>) value;
sb.append('{');
boolean first = true;
for (Map.Entry<?, ?> e : map.entrySet()) {
Expand All @@ -283,7 +285,8 @@ private static void writeValue(StringBuilder sb, Object value) {
writeValue(sb, e.getValue());
}
sb.append('}');
} else if (value instanceof Iterable<?> it) {
} else if (value instanceof Iterable) {
Iterable<?> it = (Iterable<?>) value;
sb.append('[');
boolean first = true;
for (Object o : it) {
Expand All @@ -302,21 +305,21 @@ private static String escape(String s) {
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
switch (c) {
case '"' -> sb.append("\\\"");
case '\\' -> sb.append("\\\\");
case '\n' -> sb.append("\\n");
case '\r' -> sb.append("\\r");
case '\t' -> sb.append("\\t");
case '\b' -> sb.append("\\b");
case '\f' -> sb.append("\\f");
default -> {
case '"': sb.append("\\\""); break;
case '\\': sb.append("\\\\"); break;
case '\n': sb.append("\\n"); break;
case '\r': sb.append("\\r"); break;
case '\t': sb.append("\\t"); break;
case '\b': sb.append("\\b"); break;
case '\f': sb.append("\\f"); break;
default:
if (c < 0x20) {
sb.append(String.format("\\u%04x", (int) c));
} else {
sb.append(c);
}
break;
}
}
}
return sb.toString();
}
Expand Down
Loading
Loading