docs(17-01): update SUMMARY with checkpoint approval and backend/ deviations

- Expand SUMMARY to reflect 3 additional commits made during checkpoint:
  56194cf (backend/ restyle), d8e52f6 (IsOwn wiring + divide-y), bc3d8e6 (HTMX tab fix)
- Document Rule 1 deviations: real app restyle, IsOwn user-comparison, overview tab fix
- Add IsOwn threading decision to STATE.md
- Checkpoint approved by user ("approved")

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Arthur Belleville 2026-05-17 10:32:48 +02:00
parent bc3d8e6355
commit 78785d1851
No known key found for this signature in database
2 changed files with 113 additions and 29 deletions

View file

@ -3,7 +3,7 @@ gsd_state_version: 1.0
milestone: v3.0
milestone_name: Design System & Visual Polish
status: executing
last_updated: "2026-05-17T07:39:23.008Z"
last_updated: "2026-05-17T08:32:41.083Z"
last_activity: 2026-05-17
progress:
total_phases: 5

View file

@ -1,15 +1,15 @@
---
phase: 17-chat-planning
plan: "01"
subsystem: go-backend/web
tags: [chat, ui, css, templ, tdd]
subsystem: ui
tags: [chat, ui, css, templ, tdd, htmx]
dependency_graph:
requires: []
provides: [DiscussionTabData, DiscussionMessageView, NewDiscussionTabData, ChatMainContent]
affects: [go-backend/internal/web/views, go-backend/internal/web/handlers, go-backend/internal/web/ui]
provides: [DiscussionTabData, DiscussionMessageView, NewDiscussionTabData, ChatMainContent, message-bubble-css, IsOwn-user-comparison]
affects: [backend/templates, backend/internal/web, go-backend/internal/web/views, go-backend/internal/web/handlers, go-backend/internal/web/ui]
tech_stack:
added: []
patterns: [templ components, view model factory, TDD RED/GREEN]
patterns: [templ components, view model factory, TDD RED/GREEN, IsOwn user-comparison via session ID]
key_files:
created:
- go-backend/internal/web/views/discussion_view.go
@ -19,60 +19,144 @@ key_files:
- go-backend/internal/web/views/dashboard_components.templ
- go-backend/internal/web/views/dashboard_components_templ.go
- go-backend/internal/web/handlers/auth.go
- backend/internal/web/ui/app.css
- backend/templates/discussion.templ
- backend/templates/planning.templ
- backend/internal/web/handlers_discussion.go
- backend/templates/discussion_forms.go
- backend/internal/web/handlers_tablos.go
decisions:
- "NewDiscussionTabData() returns hardcoded demo data with 4 alternating IsOwn messages — no real data layer needed for this restyle-only phase"
- "NewDiscussionTabData() returns hardcoded demo data with 4 alternating IsOwn messages — no real data layer needed for this restyle-only phase (go-backend/)"
- "ChatMainContent uses .ui-card class matching Phase 16 tab panel surfaces"
- "rgba(128, 78, 236, 0.10) spelled out for own bubble tint — single-use value, no token indirection needed"
- "IsOwn implemented in the real backend/ app via user.ID comparison in DiscussionMessagesFromRows and DiscussionMessageFromRow — real SSE path gets IsOwn=false, HTMX POST path sets IsOwn=true"
- "divide-y wrapper restored inside #discussion-messages — discussion-sse.js depends on it to locate the message list before appending SSE events"
- "TabloDetailHandler returns TabloOverviewTabFragment on HX-Request header to fix HTMX tab swap swapping full layout"
requirements-completed: [CHAT-UI-01]
metrics:
duration: "~15min"
duration: "~60min"
completed: "2026-05-17"
tasks: 2
files: 6
tasks: 3
files: 11
---
# Phase 17 Plan 01: Chat Discussion View — Message Bubble Restyle Summary
**One-liner:** Own-vs-others chat bubbles with brand-tint right-alignment using .ui-card surface and new .message-* CSS classes driven by a static view model.
**Own-vs-others chat bubbles with brand-tint right-alignment applied to both the go-backend/ prototype (TDD) and the real running backend/ app, with IsOwn wired via user.ID comparison and an HTMX overview tab fix.**
## What Was Built
## Performance
- **CSS message classes** appended to `app.css` after line 1897: `.message-row`, `.message-own`, `.message-other`, `.message-bubble`, `.message-own .message-bubble` (brand tint rgba), `.message-other .message-bubble`, `.message-meta`, `.message-own .message-meta`, `.message-meta .message-author` — all using `var(--...)` design tokens only (exception: rgba tint value spelled out intentionally per plan)
- **discussion_view.go**: `DiscussionMessageView` struct (Author, Timestamp, Body, IsOwn bool), `DiscussionTabData` struct, `NewDiscussionTabData()` factory returning 4 alternating demo messages
- **discussion_view_test.go**: `TestChatMainContentRendersBubbleClasses` — asserts `.ui-card`, `message-own`, `message-other`, `message-bubble` classes present in rendered HTML
- **dashboard_components.templ**: `ChatMainContent()` stub replaced with `ChatMainContent(data DiscussionTabData)` — renders `.ui-card` container, empty state via `@ui.EmptyState`, message rows with `.message-row message-own/other`, `.message-meta`, `.message-bubble`
- **auth.go**: `GetChatPage` updated to pass `views.NewDiscussionTabData()` to `views.ChatMainContent()`
- **Duration:** ~60min
- **Started:** 2026-05-17T07:38:00Z
- **Completed:** 2026-05-17T08:24:00Z
- **Tasks:** 3 (2 auto + 1 browser checkpoint approved)
- **Files modified:** 11
## Accomplishments
- CSS `.message-*` bubble classes added to both `go-backend/` and `backend/` — own messages right-aligned with brand tint, others left-aligned with white surface
- `go-backend/` TDD cycle: RED (view model + tests) then GREEN (templ component + handler wiring) — full `go test ./... -count=1` green
- `backend/` (real running app): `DiscussionMessageView.IsOwn` implemented via `user.ID` comparison in `DiscussionMessagesFromRows` and `DiscussionMessageFromRow`, `.divide-y` preserved for SSE compatibility
- Pre-existing HTMX bug fixed: `TabloDetailHandler` now returns `TabloOverviewTabFragment` on `HX-Request` so HTMX swaps only the tab content, not the full layout
- User approved visual result at browser checkpoint
## Task Commits
1. **Task 1: CSS message classes + view model + render tests (RED)** - `dd1133d` (test)
2. **Task 2: ChatMainContent() templ component + handler wiring (GREEN)** - `81ccaeb` (feat)
3. **Task 3 (checkpoint) — backend/ restyle** - `56194cf` (feat), `d8e52f6` (fix), `bc3d8e6` (fix)
**Plan metadata:** `e3596ff` (docs: complete plan execution — initial), updated after checkpoint approval
## Files Created/Modified
- `go-backend/internal/web/views/discussion_view.go` - DiscussionMessageView, DiscussionTabData, NewDiscussionTabData
- `go-backend/internal/web/views/discussion_view_test.go` - TestChatMainContentRendersBubbleClasses (TDD)
- `go-backend/internal/web/ui/app.css` - .message-* CSS block appended
- `go-backend/internal/web/views/dashboard_components.templ` - ChatMainContent(data DiscussionTabData)
- `go-backend/internal/web/views/dashboard_components_templ.go` - regenerated by templ generate
- `go-backend/internal/web/handlers/auth.go` - GetChatPage passes NewDiscussionTabData()
- `backend/internal/web/ui/app.css` - Section 26 .message-* bubble classes; h1 selector for overview-section-heading
- `backend/templates/discussion.templ` - .ui-card container, .message-row/.message-own/.message-other/.message-bubble/.message-meta classes, IsOwn branching
- `backend/templates/planning.templ` - .overview-section wrapper, .overview-section-heading with h1, .ui-card empty state
- `backend/internal/web/handlers_discussion.go` - IsOwn threading via currentUserID
- `backend/templates/discussion_forms.go` - DiscussionMessageFromRow sets IsOwn=false; handlers set IsOwn=true for HTMX path
- `backend/internal/web/handlers_tablos.go` - TabloDetailHandler returns fragment on HX-Request
## Decisions Made
- `NewDiscussionTabData()` uses hardcoded demo data for go-backend/ — no real data layer needed for restyle-only prototype
- Real `backend/` app wires `IsOwn` via `user.ID` comparison (D-D01 implemented in real app, deferred only in prototype)
- `.divide-y` wrapper retained inside `#discussion-messages``discussion-sse.js` depends on it as a sentinel for appending SSE events
- Overview tab HTMX fix applied as Rule 1 auto-fix (broken behavior discovered during checkpoint)
## Deviations from Plan
The plan targeted `go-backend/` only. During the browser checkpoint, it became clear the real running app (`backend/`) also needed the restyle. Three additional commits were made outside the auto tasks:
### Auto-fixed Issues
**1. [Rule 1 - Bug] Applied restyle to real backend/ app**
- **Found during:** Task 3 (browser checkpoint)
- **Issue:** Plan only targeted go-backend/ (prototype). The running app at backend/ still showed unstyled discussion view.
- **Fix:** Added .message-* CSS to backend/internal/web/ui/app.css; updated discussion.templ and planning.templ with bubble classes and overview-section structure
- **Files modified:** backend/internal/web/ui/app.css, backend/templates/discussion.templ, backend/templates/planning.templ
- **Committed in:** 56194cf
**2. [Rule 1 - Bug] Own messages not right-aligned; IsOwn not wired**
- **Found during:** Task 3 (browser checkpoint, visual review)
- **Issue:** Initial backend/ restyle applied message classes but IsOwn was always false — all messages appeared left-aligned
- **Fix:** Added IsOwn bool to DiscussionMessageView; threaded currentUserID through loadDiscussionTabData and DiscussionMessagesFromRows; DiscussionMessageFromRow sets IsOwn=false, HTMX POST handler sets IsOwn=true; restored .divide-y wrapper for SSE compatibility
- **Files modified:** backend/internal/web/handlers_discussion.go, backend/templates/discussion.templ, backend/templates/discussion_forms.go
- **Committed in:** d8e52f6
**3. [Rule 1 - Bug] HTMX overview tab swapping full layout**
- **Found during:** Task 3 (browser checkpoint, functional testing)
- **Issue:** TabloDetailHandler always rendered the full page regardless of HX-Request header — HTMX was swapping the entire layout (sidebar, header) into #tab-content
- **Fix:** Added HX-Request check to TabloDetailHandler; returns TabloOverviewTabFragment for HTMX requests
- **Files modified:** backend/internal/web/handlers_tablos.go
- **Committed in:** bc3d8e6
---
**Total deviations:** 3 auto-fixed (all Rule 1 — bugs)
**Impact on plan:** All fixes necessary for correct visual and functional behavior in the real running app. No scope creep beyond making the plan's stated goal actually work end-to-end.
## TDD Gate Compliance
- RED commit `dd1133d`: test + view model + CSS (compile error confirmed — ChatMainContent zero-arg)
- GREEN commit `81ccaeb`: templ component + handler wiring (TestChat passes, full suite passes)
- No REFACTOR commit needed.
## Verification
```
go test ./internal/web/views/ -run TestChat -count=1 → PASS
go test ./... -count=1 → all 6 test packages pass
go test ./... -count=1 → all test packages pass
go build ./... → exits 0
```
## Deviations from Plan
None — plan executed exactly as written.
## Deferred
- D-D01 through D-D04 deferred per `<scope_note>` in plan: no `DiscussionMessagesFromRows`, no `currentUserID` threading, no SSE/HTMX IsOwn mutation — all require real backend infrastructure not present in this phase.
Browser checkpoint: user approved visual result — own messages right-aligned with brand tint, others left-aligned, card surface matching Phase 16 tab panels.
## Known Stubs
- `NewDiscussionTabData()` returns hardcoded demo messages — intentional per plan. Real data wiring deferred to the phase when the discussion backend is built. Demo data is sufficient for visual verification of CSS bubble classes.
- `go-backend/` `NewDiscussionTabData()` returns hardcoded demo messages — intentional per plan scope note. Real data wiring deferred to the phase when go-backend/ gets a live data layer.
- `backend/` now uses real data via `loadDiscussionTabData` + `DiscussionMessagesFromRows` — no stubs in the production path.
## Threat Flags
No new threat surface introduced. All `{ expr }` interpolations in `ChatMainContent` use templ auto-escaping (Author, Timestamp, Body). T-17-01-01 mitigated. T-17-01-02 accepted (demo data only, auth unchanged).
No new threat surface introduced. All `{ expr }` interpolations use templ auto-escaping (Author, Timestamp, Body). T-17-01-01 mitigated. T-17-01-02 accepted (auth unchanged, demo data only in go-backend/).
## Self-Check
## User Setup Required
Files created/modified exist on disk — verified by successful `go test ./... -count=1`. Commits dd1133d and 81ccaeb confirmed in git log.
None — no external service configuration required.
## Next Phase Readiness
- Phase 17 Plan 02 (Planning page restyle) can proceed — .overview-section CSS patterns confirmed working
- go-backend/ ChatMainContent verified with TDD; backend/ discussion view fully wired with live user data
- IsOwn infrastructure established in backend/ — ready for future SSE/HTMX message submission work
## Self-Check: PASSED
All commits confirmed in git log: dd1133d, 81ccaeb, 56194cf, d8e52f6, bc3d8e6, e3596ff.