513225df3f
feat(client): DmService narrate loop + FakeDmTransport (all branches tested)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-10 10:04:33 -05:00
32fa372124
feat(client): FallbackLibrary + authored narrator fallback (§13)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-10 09:59:54 -05:00
18a18820fe
feat(client): net primitives — DmResponse, NarrateResult, DmTransport, ProxyConfig
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-10 09:54:03 -05:00
bc83e92f44
chore(client): Godot rewrote project.godot header on open
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-09 15:34:41 -05:00
63ce3efb74
fix(client): reject empty player name in NewGame.construct (contract minLength:1)
...
Whole-branch review flagged that NewGame.construct validated class and
origin refs but not player.name. The canon-log schema requires
player.name with minLength:1, so a missing/blank name previously
returned ok:true and produced a log the API would reject with 422.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-09 15:03:18 -05:00
2d52d74963
chore(client): track generated .uid for test_round_trip.gd
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-09 14:51:48 -05:00
2673126003
test(client): round-trip + contract-invariant integration on a constructed log
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-09 14:51:42 -05:00
5388979bf1
feat(client): TagExtractor — pure regex parse/strip of §12 tags
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-09 14:46:11 -05:00
7c5eaf3ba3
test(client): cover non-companion disposition routing (§6/§7 boundary) in NewGame
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-09 14:42:12 -05:00
8ca89a1ab2
feat(client): NewGame.construct — origin+world+creation -> {canon log, state}
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-09 14:36:50 -05:00
fe03d1f787
feat(client): ContentDB loads /content + mirrors the api id-resolution check
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-09 14:30:48 -05:00
0a9742a984
feat(client): Luck (deterministic gen/drift/descriptor) + GameState store
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-09 14:24:59 -05:00
4166370f9d
feat(client): CanonLog container + maintenance mutators (cap 5, dedup, stack)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-09 14:19:55 -05:00
a682022f17
feat(client): id helper + leaf canon-log entities with owned invariants
...
Also configure GUT to not treat push_error() as a test failure
(client/.gutconfig.json: failure_error_types = [engine, gut]).
The brief's LogPlayer/Quest setters intentionally push_error() on
rejected input; GUT's default failure_error_types includes
push_error, which would fail test_player_rejects_unknown_class and
test_quest_status_enum despite their assertions passing.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-09 14:12:16 -05:00
5486ed00fa
chore(client): vendor GUT 9.7.1 + headless test harness
2026-07-09 14:05:20 -05:00
d54599e27d
first commit
2026-07-09 11:17:54 -05:00