7954c579d3
feat(theme): showcase harness — the human-eyeball proof
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-10 20:39:09 -05:00
73fcf2d096
feat(theme): parchment/dark-bay/vignette shader surfaces as drop-in scenes
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-10 20:34:52 -05:00
9091707535
feat(theme): game_theme.tres (fonts + stylebox variations) via builder
2026-07-10 20:29:22 -05:00
3981047ec6
feat(theme): bundle EB Garamond, Architects Daughter, JetBrains Mono (OFL)
2026-07-10 20:25:06 -05:00
888b2b32f5
feat(theme): palette tokens as the single colour source
2026-07-10 20:21:42 -05:00
82b2de19bb
feat(client): ConsideringIndicator — rotates think-lines on a Timer
2026-07-10 15:06:31 -05:00
6bd5e4f84a
fix(client): HttpTransport sets request timeout (no more infinite hang)
2026-07-10 15:03:29 -05:00
377adb10b2
feat(client): ProxyConfig.request_timeout_seconds (default 35s, reject <=0)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-10 15:00:40 -05:00
a171d40781
feat(client): ConsideringPhrases — authored rotating think-lines (§13)
2026-07-10 14:57:38 -05:00
2b1c11b1e6
fix(client): TagExtractor tolerates paren-less moves + scrubs misformatted move tags (live-review LF1/LF2)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-10 13:15:18 -05:00
ed2311b62c
chore(client): commit Godot .uid sidecars for new npc scripts (Tasks 10-15)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-10 13:03:04 -05:00
832cdc65ca
feat(client): NpcService.speak — post, extract, validate moves (§6)
...
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com >
2026-07-10 12:55:52 -05:00
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