- DebugOverlay: position comment updated, tscn is source of truth
- GauntletHUD: moved from y:48 to y:252 (below StanceIndicator)
- StanceIndicator: offset_top 192→200, height 26→44px for ImplantPanel
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
HUD: merge TimeDisplay into ImplantPanel (time/health/perception in one
panel), remove dead tscn nodes, move HUD to InsertOverlay for D-051 bloom.
Interaction prompt: convert from PanelContainer+StyleBoxFlat to Control
with ImplantPanel+ImplantDataRow, fix panel height for 42px minimum.
Tests updated for new scene structure and public API.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Draw ImplantTheme-styled StyleBoxFlat behind the circular minimap for
visual consistency with other implant components. Stance badge icons
remain blocked by #795 (visual team).
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Reviewers: Hoshe (code quality), Tyre (architecture) Process gap: No runtime smoke test mentioned in commits.
Hoshe (Code Quality): REQUEST_CHANGES
Implant conversion is solid — D-169 patterns followed, fade tweens clean. Three issues:
#
File
Issue
1
test_time_display_sprint17.gd:285,299
Stale node path — test failure.get_node_or_null("UILayer/HUD") returns null because this PR moved HUD to InsertOverlay/HUD. Both paths and comments need updating.
2
hud.gdupdate_from_state(), update_health()
Null-unsafe field access._time_row/_health_row dereferenced without null guards. Crash if called before _ready(). Add if not _time_row: return guards.
3
minimap.gd_process()
queue_redraw() every frame unconditionally. Should only redraw on state change. Use dirty flag or wire to snapshot dispatch.
Tyre (Architecture): REQUEST_CHANGES
Layer move correct per D-049, D-169 usage in hud.gd and interaction_prompt.gd is clean. Six issues:
#
File
Issue
1
main.tscn
Wrong D-record citation. Comments say "per D-051" — should be D-049 (z-layer 6 = insert overlay, bloom-rendered). D-051 is "Settling is placement."
2
minimap.gd
D-169 violation._init_container_style() manually creates StyleBoxFlat + .draw() — pattern D-169 rejected. Wrap MinimapRenderer inside ImplantPanel at scene level instead.
3
hud.gd
Redundant _panel.size.x = 200.0.custom_minimum_size.x is sufficient. Remove.
4
hud.gd
Debug print left in.print("HUD: Initialized") — remove or gate behind OS.is_debug_build().
5
main.tscn
DebugOverlay comment doesn't match value. "y:16 + ~80px + 10px gap" = 106, but offset is 150.
6
gauntlet_hud.tscn
Magic number y:252, no comment. Add positioning basis comment.
Tyre #2 (D-169 violation in minimap.gd) — RETRACTED.
Reason: Implementation-Tyre deliberately chose the StyleBoxFlat approach because ImplantPanel's VBox layout model doesn't serve a custom-drawn circle — it would introduce geometry disruption and 24px padding shrink. The manual StyleBoxFlat drawn as a container frame behind the _draw() circle is a pragmatic compromise, not an oversight. D-169's "not _draw() draw-objects" rule applies to full UI components, not to a decorative frame behind a canvas-drawn renderer.
Hoshe #3 (per-frame queue_redraw) still stands independently — the StyleBoxFlat can stay, but unconditional per-frame redraws should use a dirty flag.
## Review update — 1 comment retracted
**Tyre #2 (D-169 violation in minimap.gd) — RETRACTED.**
Reason: Implementation-Tyre deliberately chose the StyleBoxFlat approach because ImplantPanel's VBox layout model doesn't serve a custom-drawn circle — it would introduce geometry disruption and 24px padding shrink. The manual StyleBoxFlat drawn as a container frame behind the `_draw()` circle is a pragmatic compromise, not an oversight. D-169's "not `_draw()` draw-objects" rule applies to full UI components, not to a decorative frame behind a canvas-drawn renderer.
Hoshe #3 (per-frame `queue_redraw`) still stands independently — the StyleBoxFlat can stay, but unconditional per-frame redraws should use a dirty flag.
**Updated blocking count: 3** (stale test path, wrong D-051→D-049 citation, null guards in hud.gd).
**Should-fix: 5** (per-frame redraw, redundant size.x, debug print, DebugOverlay comment, gauntlet_hud magic number).
Retracted from round 1: Tyre #2 (minimap D-169 violation) — implementation-Tyre's StyleBoxFlat approach is a deliberate pragmatic choice; ImplantPanel's VBox model doesn't serve a custom-drawn circle.
Verdict: APPROVED
No new issues. One minor item (#8 gauntlet_hud comment) deferred — not blocking.
## Re-review: sprint-32/client → main (round 2)
**Commit:** `879ef609` — fix(ui): address PR #115 review — 8 items
**Prior review:** 3 blocking + 5 should-fix (1 retracted: Tyre #2 minimap D-169).
### Issues addressed (7/8):
| # | Issue | Status |
|---|-------|--------|
| 1 | Stale test path `UILayer/HUD` → `InsertOverlay/HUD` | **Fixed** — all 4 locations + comments |
| 2 | D-051 → D-049 citation | **Fixed** — both main.tscn comments |
| 3 | Null guards in hud.gd | **Fixed** — all 3 update methods guarded |
| 4 | Per-frame `queue_redraw()` | **Fixed** — dirty flag on player pos + POI count |
| 5 | Redundant `_panel.size.x` | **Fixed** — removed |
| 6 | Debug print | **Fixed** — removed |
| 7 | DebugOverlay comment mismatch | **Fixed** — comment reworded |
| 8 | gauntlet_hud.tscn positioning comment | Not addressed (minor) |
**Retracted from round 1:** Tyre #2 (minimap D-169 violation) — implementation-Tyre's StyleBoxFlat approach is a deliberate pragmatic choice; ImplantPanel's VBox model doesn't serve a custom-drawn circle.
### Verdict: APPROVED
No new issues. One minor item (#8 gauntlet_hud comment) deferred — not blocking.
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
Changes
12 files changed across
client/:main.tscn/main.gd— TimeDisplay removed, HUD moved to InsertOverlayhud.gd/hud.tscn— merged time/health/perception panel, dead nodes removedinteraction_prompt.gd/.tscn— full ImplantPanel conversionminimap.gd— StyleBoxFlat container framedebug_overlay.gd/gauntlet_hud.tscn/stance_indicator.tscn— layout fixestest_interaction_prompt.gd/test_time_display_sprint17.gd— updated for new structureDecisions referenced
Test plan
make test-clientfor unit test passReview: sprint-32/client → main (type: code)
Reviewers: Hoshe (code quality), Tyre (architecture)
Process gap: No runtime smoke test mentioned in commits.
Hoshe (Code Quality): REQUEST_CHANGES
Implant conversion is solid — D-169 patterns followed, fade tweens clean. Three issues:
test_time_display_sprint17.gd:285,299get_node_or_null("UILayer/HUD")returns null because this PR moved HUD toInsertOverlay/HUD. Both paths and comments need updating.hud.gdupdate_from_state(),update_health()_time_row/_health_rowdereferenced without null guards. Crash if called before_ready(). Addif not _time_row: returnguards.minimap.gd_process()queue_redraw()every frame unconditionally. Should only redraw on state change. Use dirty flag or wire to snapshot dispatch.Tyre (Architecture): REQUEST_CHANGES
Layer move correct per D-049, D-169 usage in hud.gd and interaction_prompt.gd is clean. Six issues:
main.tscnminimap.gd_init_container_style()manually creates StyleBoxFlat +.draw()— pattern D-169 rejected. Wrap MinimapRenderer inside ImplantPanel at scene level instead.hud.gd_panel.size.x = 200.0.custom_minimum_size.xis sufficient. Remove.hud.gdprint("HUD: Initialized")— remove or gate behindOS.is_debug_build().main.tscngauntlet_hud.tscnVerdict: CHANGES REQUESTED
Blocking (4):
UILayer/HUD→InsertOverlay/HUDShould-fix (4):
5. Remove redundant
_panel.size.x6. Remove debug print
7. Fix DebugOverlay comment/value mismatch
8. Add positioning comment to gauntlet_hud.tscn
Review update — 1 comment retracted
Tyre #2 (D-169 violation in minimap.gd) — RETRACTED.
Reason: Implementation-Tyre deliberately chose the StyleBoxFlat approach because ImplantPanel's VBox layout model doesn't serve a custom-drawn circle — it would introduce geometry disruption and 24px padding shrink. The manual StyleBoxFlat drawn as a container frame behind the
_draw()circle is a pragmatic compromise, not an oversight. D-169's "not_draw()draw-objects" rule applies to full UI components, not to a decorative frame behind a canvas-drawn renderer.Hoshe #3 (per-frame
queue_redraw) still stands independently — the StyleBoxFlat can stay, but unconditional per-frame redraws should use a dirty flag.Updated blocking count: 3 (stale test path, wrong D-051→D-049 citation, null guards in hud.gd).
Should-fix: 5 (per-frame redraw, redundant size.x, debug print, DebugOverlay comment, gauntlet_hud magic number).
Re-review: sprint-32/client → main (round 2)
Commit:
879ef609— fix(ui): address PR #115 review — 8 itemsPrior review: 3 blocking + 5 should-fix (1 retracted: Tyre #2 minimap D-169).
Issues addressed (7/8):
UILayer/HUD→InsertOverlay/HUDqueue_redraw()_panel.size.xRetracted from round 1: Tyre #2 (minimap D-169 violation) — implementation-Tyre's StyleBoxFlat approach is a deliberate pragmatic choice; ImplantPanel's VBox model doesn't serve a custom-drawn circle.
Verdict: APPROVED
No new issues. One minor item (#8 gauntlet_hud comment) deferred — not blocking.
Pull request closed