5181c3e74a
feat(client): authored NPC fallback line (§13)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-10 12:51:13 -05:00
c0dcc8df82
feat(client): MoveApplier — validated moves to game state
2026-07-10 12:47:51 -05:00
a2100f802f
feat(client): NpcResult model
2026-07-10 12:45:23 -05:00
4c0b4e41c3
feat(client): pure MoveValidator — membership is the whole test
2026-07-10 12:41:45 -05:00
1b67b3984b
feat(client): NpcContent.available_moves — the legality home
2026-07-10 12:39:10 -05:00
3b71fcdcc0
feat(client): CanonLog.add_quest/has_quest for offer_quest
2026-07-10 12:36:37 -05:00
1d1ae37281
feat(client): GameState move targets — remove_item, reveal/gift tracking
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-10 12:34:33 -05:00
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
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