feat: add Zenith strategy and move latency tracing
Build and Push Docker Container / build-and-push (push) Successful in 2m18s

- Register Zenith 1.1 with balanced duel verdicts and forced-outcome overrides.
- Prioritize permanent-trail space in Constrictor and health-aware hazard routes.
- Deduct executor queue delays and return fallback directions on move timeouts.
- Correlate response headers, replay timings, and sampled structured trace logs.
- Move shared metrics publication off the response path without losing local counts.
- Allow configurable tournament opponents and add a psql helper recipe.
- Preserve empty latency values through compact replay encoding and migration.
- Update Arena game links and use default assets for missing customizations.
- Cover strategy, HTTP lifecycle, tracing, replay codecs, and dashboard behavior.
- Validate with 260 passing Python tests, 4 skips, and 2 passing JavaScript tests.
This commit is contained in:
2026-11-05 01:11:31 +01:00
parent 39a7a53873
commit a2414f0b3d
26 changed files with 758 additions and 45 deletions
+10 -3
View File
@@ -27,17 +27,24 @@ def decode_move(code:int|None) -> str|None:
return None
return MOVES[int(code) - 1]
# The engine reports latency as a string; "" means no response was measured.
_EMPTY_LATENCY = -32768
def encode_latency(latency:object) -> int|None:
if latency is None or latency == "":
if latency is None:
return None
if latency == "":
return _EMPTY_LATENCY
try:
value = int(str(latency))
except ValueError:
return None
return value if -32768 <= value <= 32767 else None
return value if _EMPTY_LATENCY < value <= 32767 else None
def decode_latency(value:int|None) -> str|None:
return None if value is None else str(value)
if value is None:
return None
return "" if value == _EMPTY_LATENCY else str(value)
def _point(point:object) -> tuple[int, int]|None:
if not isinstance(point, dict):