Sprint 10 "Prove" — final two client tickets, completing all 7 client tasks for the sprint.
#501 Hub teleport UX: Home key sends TeleportToHub in Gauntlet mode. Camera snaps to hub spawn with 0.3s fade-from-black. Clears dialogue/monologue/interaction buffers. Teleport detection uses distance threshold (>5 tiles) so future teleport types inherit the transition.
#521 Confrontation D-033 color shift: Entity renderer tracks relationship per entity and tweens D-033 tint color over 0.7s when relationship changes on confrontation delivery. Manual lerp in _process() for testability. Cursor hover tint cascades automatically via Constants.color_for_entity_kind().
47/47 new tests pass, no regressions in full suite (348 cases, pre-existing failures only)
## Summary
Sprint 10 "Prove" — final two client tickets, completing all 7 client tasks for the sprint.
- **#501 Hub teleport UX:** Home key sends `TeleportToHub` in Gauntlet mode. Camera snaps to hub spawn with 0.3s fade-from-black. Clears dialogue/monologue/interaction buffers. Teleport detection uses distance threshold (>5 tiles) so future teleport types inherit the transition.
- **#521 Confrontation D-033 color shift:** Entity renderer tracks relationship per entity and tweens D-033 tint color over 0.7s when relationship changes on confrontation delivery. Manual lerp in `_process()` for testability. Cursor hover tint cascades automatically via `Constants.color_for_entity_kind()`.
**Decisions:** D-020, D-033, D-054, D-063
## Test plan
- [x] 21 hub teleport tests: enum, gauntlet guard, wire format, roundtrip, detection boundary cases, buffer clearing
- [x] 26 color shift tests: D-033 palette constants, relationship→color mapping, tween lifecycle (not-instant + convergence), protocol round-trip, GameState passthrough
- [x] 47/47 new tests pass, no regressions in full suite (348 cases, pre-existing failures only)
Home key sends TeleportToHub in Gauntlet mode. Camera snaps to hub
spawn with 0.3s fade-from-black. Clears dialogue/monologue buffers
on teleport. Teleport detection uses distance threshold (>5 tiles)
so future teleport types get the transition for free.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Entity renderer now tracks relationship per entity and tweens D-033
tint color over 0.7s when relationship changes (e.g. on confrontation
delivery). Uses manual lerp in _process() for testability instead of
SceneTree tweens. Cursor hover tint cascades automatically via
Constants.color_for_entity_kind().
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Both features are well-implemented. Three issues block approval.
#
File
Severity
Issue
1
entity_renderer.gd:29
warning
COLOR_FADE_DURATION = 0.7 contradicts D-033 spec ("0.5s fade"). Comment misquotes spec as "0.5-1s". Either fix to 0.5 or update the decision.
2
test_hub_teleport.gd:76-92
warning
test_teleport_hub_gated_by_gauntlet_mode and _allowed_in_gauntlet_mode are tautological — set a bool and assert its value, never exercise InputMapper's actual guard.
3
test_hub_teleport.gd:208-225
warning
test_teleport_clears_monologue_state and _clears_dialogue_state manually null fields instead of calling _teleport_transition().
4
entity_renderer.gd
suggestion
No test for mid-transition re-trigger (relationship changes twice rapidly).
5
sim_bridge.gd:~330
suggestion
Test snapshot NPC has no relationship field — color shift untestable in test mode.
6
commit messages
suggestion
Test counts don't match actual: #501 says 22/has 21, #521 says 30/has 26.
Tyre (Architecture): REQUEST_CHANGES
#
File
Severity
Issue
1
main.gd:_process
warning
_teleport_transition() disables smoothing but the re-enable block at bottom of same _process() frame re-enables it immediately. Add a _teleport_in_progress flag to defer by one frame.
2
sim_bridge.gd:_test_snapshot
warning
No gauntlet_mode field in test snapshot — gauntlet guard has no integration coverage. Add _test_gauntlet_mode: bool like _test_in_dialogue.
3
test_hub_teleport.gd
suggestion
Teleport detection tests compute distance inline, not via _detect_teleport() — threshold 5.0 in two places.
4
entity_renderer.gd
suggestion
modulate.a and color are compositionally independent — note for future if alpha tweening added.
5
main.gd:_teleport_transition
suggestion
_flash_rect shared between teleport and room reset — teleport preempts amber flash. Worth a comment.
#501 is re-scoped as Gauntlet-only dev teleport, not a foundation for production fast-travel. The real game travel system is diegetic (local gate → system gate → target menu → destination). Rename references from "hub teleport" to "gauntlet dev teleport" or similar to make the debug scope explicit.
Verdict: CHANGES REQUESTED
## Review: client -> main (type: code)
### Hoshe (Code Quality): REQUEST_CHANGES
Both features are well-implemented. Three issues block approval.
| # | File | Severity | Issue |
|---|------|----------|-------|
| 1 | `entity_renderer.gd:29` | warning | `COLOR_FADE_DURATION = 0.7` contradicts D-033 spec ("0.5s fade"). Comment misquotes spec as "0.5-1s". Either fix to 0.5 or update the decision. |
| 2 | `test_hub_teleport.gd:76-92` | warning | `test_teleport_hub_gated_by_gauntlet_mode` and `_allowed_in_gauntlet_mode` are tautological — set a bool and assert its value, never exercise InputMapper's actual guard. |
| 3 | `test_hub_teleport.gd:208-225` | warning | `test_teleport_clears_monologue_state` and `_clears_dialogue_state` manually null fields instead of calling `_teleport_transition()`. |
| 4 | `entity_renderer.gd` | suggestion | No test for mid-transition re-trigger (relationship changes twice rapidly). |
| 5 | `sim_bridge.gd:~330` | suggestion | Test snapshot NPC has no `relationship` field — color shift untestable in test mode. |
| 6 | commit messages | suggestion | Test counts don't match actual: #501 says 22/has 21, #521 says 30/has 26. |
### Tyre (Architecture): REQUEST_CHANGES
| # | File | Severity | Issue |
|---|------|----------|-------|
| 1 | `main.gd:_process` | warning | `_teleport_transition()` disables smoothing but the re-enable block at bottom of same `_process()` frame re-enables it immediately. Add a `_teleport_in_progress` flag to defer by one frame. |
| 2 | `sim_bridge.gd:_test_snapshot` | warning | No `gauntlet_mode` field in test snapshot — gauntlet guard has no integration coverage. Add `_test_gauntlet_mode: bool` like `_test_in_dialogue`. |
| 3 | `test_hub_teleport.gd` | suggestion | Teleport detection tests compute distance inline, not via `_detect_teleport()` — threshold 5.0 in two places. |
| 4 | `entity_renderer.gd` | suggestion | `modulate.a` and `color` are compositionally independent — note for future if alpha tweening added. |
| 5 | `main.gd:_teleport_transition` | suggestion | `_flash_rect` shared between teleport and room reset — teleport preempts amber flash. Worth a comment. |
### Scope change: #501 is Gauntlet-only
**#501 is re-scoped as Gauntlet-only dev teleport**, not a foundation for production fast-travel. The real game travel system is diegetic (local gate → system gate → target menu → destination). Rename references from "hub teleport" to "gauntlet dev teleport" or similar to make the debug scope explicit.
### Verdict: CHANGES REQUESTED
Hoshe:
- COLOR_FADE_DURATION 0.7 → 0.5 to match D-033 spec ("0.5s fade")
- Gauntlet guard tests now exercise InputMapper._unhandled_input()
with synthesized InputEventKey instead of asserting a bool
- Buffer clearing tests use SimBridge pipeline instead of manual nulls
- Add mid-transition re-trigger test (rapid relationship changes)
- Add relationship field to test snapshot NPC
Tyre:
- Add _teleport_in_progress flag to defer smoothing re-enable by one
frame after teleport (prevents same-_process() re-enable race)
- Add _test_gauntlet_mode to SimBridge test snapshot
- Extract TELEPORT_DISTANCE_THRESHOLD constant, mirror in tests
- Add comments: flash preemption, modulate/color independence
- Rename "hub teleport" → "Gauntlet dev teleport" in code comments
to clarify this is not production fast-travel
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Summary
Sprint 10 "Prove" — final two client tickets, completing all 7 client tasks for the sprint.
TeleportToHubin Gauntlet mode. Camera snaps to hub spawn with 0.3s fade-from-black. Clears dialogue/monologue/interaction buffers. Teleport detection uses distance threshold (>5 tiles) so future teleport types inherit the transition._process()for testability. Cursor hover tint cascades automatically viaConstants.color_for_entity_kind().Decisions: D-020, D-033, D-054, D-063
Test plan
Review: client -> main (type: code)
Hoshe (Code Quality): REQUEST_CHANGES
Both features are well-implemented. Three issues block approval.
entity_renderer.gd:29COLOR_FADE_DURATION = 0.7contradicts D-033 spec ("0.5s fade"). Comment misquotes spec as "0.5-1s". Either fix to 0.5 or update the decision.test_hub_teleport.gd:76-92test_teleport_hub_gated_by_gauntlet_modeand_allowed_in_gauntlet_modeare tautological — set a bool and assert its value, never exercise InputMapper's actual guard.test_hub_teleport.gd:208-225test_teleport_clears_monologue_stateand_clears_dialogue_statemanually null fields instead of calling_teleport_transition().entity_renderer.gdsim_bridge.gd:~330relationshipfield — color shift untestable in test mode.Tyre (Architecture): REQUEST_CHANGES
main.gd:_process_teleport_transition()disables smoothing but the re-enable block at bottom of same_process()frame re-enables it immediately. Add a_teleport_in_progressflag to defer by one frame.sim_bridge.gd:_test_snapshotgauntlet_modefield in test snapshot — gauntlet guard has no integration coverage. Add_test_gauntlet_mode: boollike_test_in_dialogue.test_hub_teleport.gd_detect_teleport()— threshold 5.0 in two places.entity_renderer.gdmodulate.aandcolorare compositionally independent — note for future if alpha tweening added.main.gd:_teleport_transition_flash_rectshared between teleport and room reset — teleport preempts amber flash. Worth a comment.Scope change: #501 is Gauntlet-only
#501 is re-scoped as Gauntlet-only dev teleport, not a foundation for production fast-travel. The real game travel system is diegetic (local gate → system gate → target menu → destination). Rename references from "hub teleport" to "gauntlet dev teleport" or similar to make the debug scope explicit.
Verdict: CHANGES REQUESTED
Hoshe: - COLOR_FADE_DURATION 0.7 → 0.5 to match D-033 spec ("0.5s fade") - Gauntlet guard tests now exercise InputMapper._unhandled_input() with synthesized InputEventKey instead of asserting a bool - Buffer clearing tests use SimBridge pipeline instead of manual nulls - Add mid-transition re-trigger test (rapid relationship changes) - Add relationship field to test snapshot NPC Tyre: - Add _teleport_in_progress flag to defer smoothing re-enable by one frame after teleport (prevents same-_process() re-enable race) - Add _test_gauntlet_mode to SimBridge test snapshot - Extract TELEPORT_DISTANCE_THRESHOLD constant, mirror in tests - Add comments: flash preemption, modulate/color independence - Rename "hub teleport" → "Gauntlet dev teleport" in code comments to clarify this is not production fast-travel Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>Re-Review (round 2): client -> main (type: code)
Hoshe (Code Quality): APPROVE
All 6 items from previous round confirmed fixed:
COLOR_FADE_DURATIONcorrected to 0.5 (D-033 spec)InputEventKey, call_unhandled_input()SimBridge._test_snapshot()pipelineUnknown→Friendly→Hostilerapid change)relationshipfield via_test_npc_relationshipTyre (Architecture): APPROVE
Both warnings resolved:
_teleport_in_progressflag defers smoothing re-enable by one frame — race condition eliminated_test_gauntlet_modeadded to SimBridge, included in_test_snapshot()return dictAll suggestions addressed:
TELEPORT_DISTANCE_THRESHOLDextracted, compositionality note added, flash rect preemption documented.Verdict: APPROVED
Pull request closed