Commit graph

1340 commits

Author SHA1 Message Date
Arthur Belleville
dfd61528d4
docs: create milestone v4.0 roadmap (5 phases) 2026-05-17 14:27:29 +02:00
Arthur Belleville
586321e8ef
docs: define milestone v4.0 requirements 2026-05-17 14:24:49 +02:00
Arthur Belleville
e91aa5d15d
docs: start milestone v4.0 Figma Design Parity 2026-05-17 14:22:10 +02:00
Arthur Belleville
dc0d3dec42
chore: archive v3.0 phase directories to milestones/v3.0-phases/
Phases 13-17 (design-system-foundation, auth-pages, dashboard-tablos,
tablo-detail, chat-planning) moved from .planning/phases/ to
.planning/milestones/v3.0-phases/ as execution history archive.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-05-17 14:14:32 +02:00
Arthur Belleville
a57827dde3
chore: remove REQUIREMENTS.md for v3.0 milestone
Fresh REQUIREMENTS.md will be created for v4.0 via /gsd-new-milestone.
History preserved — see .planning/milestones/v3.0-REQUIREMENTS.md.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-05-17 14:12:56 +02:00
Arthur Belleville
c2d191bd4b
chore: archive v3.0 milestone files 2026-05-17 14:12:49 +02:00
Arthur Belleville
fa48d81ffd
docs(phase-17): evolve PROJECT.md after phase completion 2026-05-17 13:04:53 +02:00
Arthur Belleville
f5563ec6aa
docs(phase-17): complete phase execution 2026-05-17 13:04:32 +02:00
Arthur Belleville
5624ca59ca
feat(17): add day-separator headers to planning event list
- PlanningShowDaySeparator in planning_forms.go — returns true when date
  changes between consecutive events
- PlanningDaySeparator templ: slate-50 header row with date label and
  data-day-separator attribute
- PlanningEventListItem: remove redundant DateLabel column (now in separator)
- Loop uses index to call PlanningShowDaySeparator before each event row

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-05-17 13:03:30 +02:00
Arthur Belleville
3d5d9a05ea
feat(17): cap discussion height at 32rem with auto-scroll to latest message
- #discussion-messages: max-height 32rem, overflow-y auto, smooth scroll
- Auto-scroll to bottom on initial load, on own message sent (htmx:afterRequest),
  and on SSE message received from other users

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-05-17 12:58:26 +02:00
Arthur Belleville
2e8c9de24e
chore(dev): watch static JS files in air — rebuild on discussion-sse.js changes
Remove static/ from exclude_dir, add js to include_ext.
Exclude static/tailwind.css via regex to prevent rebuild loop from
the Tailwind output file triggering its own regeneration.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-05-17 12:55:14 +02:00
Arthur Belleville
681c094b0c
fix(17): skip own-user SSE messages in JS to eliminate left-then-right flash
The server-side flush didn't eliminate the race because browser HTMX and SSE
event processing are inherently async.

Real fix: embed data-current-user-id on #discussion-tab (from DiscussionTabData.
CurrentUserID). The SSE handler now skips any event whose authorUserId matches
the current user — those messages are always delivered via HTMX (IsOwn=true,
right-aligned). SSE only appends messages from other users.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-05-17 12:47:21 +02:00
Arthur Belleville
96a58ef0ea
fix(17): flush HTTP response before SSE publish to fix own-message alignment race
The server was publishing to the SSE broker before writing the HTMX response,
causing a race: if the SSE event (IsOwn=false, left-aligned) arrived at the
browser before HTMX appended the response (IsOwn=true, right-aligned), the
SSE path won and messageExists() then blocked the correct HTMX append.

Fix: write and flush the HTMX response first, then publish to SSE. This ensures
the sender's own message lands in the DOM right-aligned before the SSE event fires.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-05-17 12:26:13 +02:00
Arthur Belleville
30256895b2
fix(17): address all code review findings
- CR-01: add id="discussion-message-list" to .divide-y; change hx-target
  to #discussion-message-list so HTMX appends inside the list, not after it.
  Always render the list div so the target exists even when messages is empty.
- WR-01: SSE broadcast now renders IsOwn=false for all recipients so other
  users don't receive the sender's right-aligned bubble
- WR-02: add HX-Retarget/HX-Reswap headers on 422 and 500 error responses
  so validation errors reach the composer form in the DOM
- WR-03: replace hardcoded rgba(128,78,236,0.10) with color-mix() using
  the --color-brand-primary token
- WR-04: remove hardcoded "1 participant" subtitle (no participant count in data)
- IN-02: DiscussionMessageFromRow now accepts currentUserID uuid.UUID (matching
  DiscussionMessagesFromRows) instead of a pre-computed bool

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-05-17 12:23:21 +02:00
Arthur Belleville
bb2001f3ce
docs(17): add code review report 2026-05-17 10:41:32 +02:00
Arthur Belleville
ab756c64ce
docs(17-02): complete planning page restyle plan execution
- 17-02-SUMMARY.md: TDD RED/GREEN cycle documented, all verification criteria met
- STATE.md: plan 2 of 2 complete, phase 17 ready for verification
- ROADMAP.md: phase 17 marked Complete (2/2 plans)
- REQUIREMENTS.md: PLAN-UI-01 marked complete
2026-05-17 10:36:43 +02:00
Arthur Belleville
9fe6c897e3
feat(17-02): wire PlanningMainContent with real planning view (GREEN)
- dashboard_components.templ: PlanningMainContent(data PlanningTabData) — overview-section heading (h1), day separators with data-day-separator attribute, event rows, empty state via ui.EmptyState
- handlers/auth.go: GetPlanningPage passes views.NewPlanningTabData()
- dashboard_components_templ.go: regenerated by templ generate
- go test ./... -count=1 exits 0
2026-05-17 10:35:30 +02:00
Arthur Belleville
1afc39e70a
test(17-02): add failing render test + view model + CSS h1 selector fix (RED)
- go-backend/internal/web/ui/app.css: prepend .overview-section-heading h1 to heading selector
- go-backend/internal/web/views/planning_view.go: PlanningEventRow, PlanningTabData, NewPlanningTabData (5 demo events / 2 dates), PlanningShowDaySeparator
- go-backend/internal/web/views/planning_view_test.go: TestPlanningShowDaySeparator (logic tests), TestPlanningMainContentRendersOverviewSection (render test — RED until Task 2)
2026-05-17 10:34:49 +02:00
Arthur Belleville
78785d1851
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>
2026-05-17 10:32:48 +02:00
Arthur Belleville
bc3d8e6355
fix(17): return TabloOverviewTabFragment on HX-Request for overview tab
TabloDetailHandler was always rendering the full page regardless of
HX-Request, causing HTMX to swap the entire layout (sidebar, header)
into #tab-content instead of just the overview fragment.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-05-17 10:24:39 +02:00
Arthur Belleville
d8e52f695b
fix(17): own messages right-aligned; restore .divide-y for SSE compatibility
- Add IsOwn bool to DiscussionMessageView; set via user.ID comparison in
  DiscussionMessagesFromRows and DiscussionMessageFromRow
- Thread currentUserID through loadDiscussionTabData and all call sites
- discussion.templ: branch message-own vs message-other on message.IsOwn
- Restore .divide-y wrapper inside #discussion-messages (discussion-sse.js
  depends on it to locate the message list before appending SSE events)

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-05-17 10:22:23 +02:00
Arthur Belleville
56194cfdb5
feat(17): restyle discussion view and planning page in backend/
- discussion.templ: #discussion-messages uses .ui-card; DiscussionMessageRow
  uses .message-row/.message-other/.message-bubble/.message-meta classes;
  day separator gets data-day-separator attribute
- planning.templ: wraps content in .overview-section; heading uses
  .overview-section-heading with h1; empty state uses .ui-card
- app.css: add Section 26 .message-* bubble classes; extend
  .overview-section-heading selector to include h1

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-05-17 10:01:24 +02:00
Arthur Belleville
e3596ff753
docs(17-01): complete plan execution — chat bubble restyle summary
- Create 17-01-SUMMARY.md with TDD gate compliance docs
- Advance plan counter to 2/2
- Mark CHAT-UI-01 complete in REQUIREMENTS.md
- Update ROADMAP.md phase 17 progress (1/2 plans complete)
2026-05-17 09:39:37 +02:00
Arthur Belleville
81ccaeb107
feat(17-01): wire ChatMainContent with real discussion view (GREEN)
- Replace ChatMainContent() stub with ChatMainContent(data DiscussionTabData)
- Renders .ui-card container with .message-own/.message-other rows and .message-bubble
- Update GetChatPage handler to pass views.NewDiscussionTabData()
- Run templ generate; TestChatMainContentRendersBubbleClasses passes
- Full go test ./... -count=1 exits 0
2026-05-17 09:38:43 +02:00
Arthur Belleville
dd1133d7cc
test(17-01): add failing test + view model + message bubble CSS (RED)
- Append .message-row/.message-own/.message-other/.message-bubble/.message-meta CSS classes to app.css
- Create discussion_view.go with DiscussionMessageView, DiscussionTabData, NewDiscussionTabData
- Create discussion_view_test.go with TestChatMainContentRendersBubbleClasses (RED: compile error expected)
2026-05-17 09:38:10 +02:00
Arthur Belleville
ba48c2c74f
docs(17): create phase plan 2026-05-17 09:36:36 +02:00
Arthur Belleville
664f826052
fix(17): revise plans based on checker feedback
- Add <scope_note> to Plan 01 documenting D-D01–D-D04 and SPEC Req 2 deferral (restyle-only phase, no SSE/HTMX backend yet)
- Plan 02 Task 1: replace fragile bg-slate-50 render assertion with data-day-separator semantic attribute; add D-P02 path-adaptation note (planning_forms.go → planning_view.go)
- VALIDATION.md: set nyquist_compliant/wave_0_complete true, update Wave 0 section, check off sign-off items, set approval 2026-05-17

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-05-17 09:33:59 +02:00
Arthur Belleville
7e3b3af1e3
docs(17): create phase 17 plans — discussion view and planning page restyle
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-05-17 09:26:26 +02:00
Arthur Belleville
f45f7c6010
docs(17): research phase domain 2026-05-17 06:37:06 +02:00
Arthur Belleville
b84503a54a
docs(17): add UI design contract for chat & planning phase
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-05-17 06:30:40 +02:00
Arthur Belleville
08e8fc1976
docs(17): capture phase context 2026-05-17 00:15:15 +02:00
Arthur Belleville
8fa490978b
spec(phase-17): add SPEC.md for Chat & Planning — 6 requirements (#2213) 2026-05-17 00:06:24 +02:00
Arthur Belleville
d40909ac9b
docs(phase-16): evolve PROJECT.md after phase completion 2026-05-17 00:00:02 +02:00
Arthur Belleville
3d3fcc9c2b
docs(phase-16): complete phase execution 2026-05-16 23:59:52 +02:00
Arthur Belleville
18a705c812
fix(16): restore task-drag-handle for Sortable.js drag-and-drop
Phase 16 executor removed the .task-drag-handle div from TaskCard
during restyling. Sortable.js handle: '.task-drag-handle' had no
matching element → dragging completely non-functional.

Restores the grip element with CSS-token styling (no Tailwind).
2026-05-16 23:58:51 +02:00
Arthur Belleville
a10fa46ae2
test(16): persist human verification items as UAT 2026-05-16 23:55:44 +02:00
Arthur Belleville
b48fe9ae89
docs(16): add code review report 2026-05-16 23:51:32 +02:00
Arthur Belleville
03d9bad0ae
docs(16-04): complete files section restyle plan summary
- DETAIL-04 delivered: @ui.Table, @ui.EmptyState, tr-based file rows
- All file handler tests pass; browser checkpoint auto-approved
2026-05-16 23:46:52 +02:00
Arthur Belleville
ca693f1683
feat(16-04): restyle files section with @ui.Table, EmptyState, and tr rows
- Replace <ul>/<li> layout with @ui.Table using fileTableHead/fileTableBody helpers
- Add .overview-section-heading header with "Files" h3 and Upload file button
- Convert FileListRow outer element from <li> to <tr class="file-row-zone">
- Convert FileDeleteConfirmFragment outer element from <div> to <tr class="file-row-zone"> with <td colspan="4">
- Add Download and Delete @ui.IconButton in FileListRow actions column
- Replace FileListEmpty with @ui.EmptyState in FilesTabFragment and UploadErrorFragment
- Convert FileRowGone from <div> to <tr> for DOM consistency
- All 9 file handler tests pass; go build ./... exits 0
2026-05-16 23:46:12 +02:00
Arthur Belleville
3a5a26c5c8
docs(16-03): complete kanban restyle + etape grouping plan summary
Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-05-16 23:43:44 +02:00
Arthur Belleville
e2ee4349f8
feat(16-03): update all three KanbanBoard call sites to pass etapes
- tablos.templ TasksTabFragment: add etapes as 5th argument to @KanbanBoard
- handlers_tasks.go reorder (single): capture etapes from loadTasksTabData; pass to KanbanBoard
- handlers_tasks.go reorder (batch): capture etapes from loadTasksTabData; pass to KanbanBoard
- go build ./backend/... exits 0; go test ./backend/internal/web/... -count=1 passes
2026-05-16 23:42:46 +02:00
Arthur Belleville
084fc0ebba
feat(16-03): restyle kanban board with etape grouping (tasks.templ)
- Add EtapeGroup type and groupTasksByEtape helper (etape declaration order, unassigned last)
- Add EtapeGroupHeader templ component with color dot and muted label for unassigned
- Update KanbanBoard and KanbanColumn signatures to accept etapes []sqlc.Etape (5th param)
- Restyle KanbanColumn: kanban-column > tasks-section > tasks-section-header/task-list layout
- Restyle TaskCard: task-row task-card with task-check + task-body + @ui.IconButton(trash)
- Restyle AddTaskTrigger: tasks-add-button class (replaces ui-button compound classes)
- Remove @EtapeStrip OOB calls from TaskCardGone and TaskCardOOB; keep params with TODO
2026-05-16 23:42:40 +02:00
Arthur Belleville
f39971bd0a
docs(16-02): add SUMMARY.md for tablo detail header restyling plan 2026-05-16 23:38:05 +02:00
Arthur Belleville
443a38dfc8
feat(16-02): restyle TabloDetailPage header, tab nav, metadata row; remove EtapeStrip
- Replace header with project-card-top layout: color avatar with first char, tablo-title-zone
- Replace Discussion link/Invite button/Delete button with @ui.IconButton and @ui.Button using design token variants
- Add inline tablo-delete-zone with trash @ui.IconButton (does not use TabloDeleteButtonFragment)
- Replace metadata row hardcoded flex/hex classes with tablo-metadata-row, @ui.Badge(BadgeVariantPrimary), project-progress-track/bar
- Replace 5 tab nav <a> elements from long inline Tailwind hex classes to tab-nav-item / tab-nav-item is-active
- Wrap tab nav in class="tab-nav" replacing raw flex container
- Move @TabloDescDisplay call from persistent header into TabloOverviewTabFragment
- Remove @EtapeStrip call from TasksTabFragment (D-E01; KanbanBoard call site update deferred to Plan 03)
- Remove last #804EEC hex value from TabloTitleDisplay hover class
- Regenerated tablos_templ.go via templ generate
2026-05-16 23:37:16 +02:00
Arthur Belleville
4e0336c950
docs(16-01): complete icon-cases and CSS-foundations plan
- add download + chat icon SVG cases to UIIcon switch
- append CSS Sections 19-25 to app.css (tasks-section through task-list-empty)
- all tests pass; zero hardcoded hex values in new CSS
2026-05-16 23:33:38 +02:00
Arthur Belleville
44209b9db2
feat(16-01): append CSS Sections 19-25 to app.css
- Section 19: tasks-section block (task-row, task-check, task-body, task-meta, tasks-add-button)
- Section 20: project-progress-track and project-progress-bar
- Section 21: tab-nav, tab-nav-item, tab-nav-item.is-active, tab-nav-item:hover
- Section 22: tablo-metadata-row, tablo-metadata-date
- Section 23: kanban-column wrapper (width: 18rem) + scoped h3 override (1rem)
- Section 24: etape-group-header, etape-group-color-dot, etape-group-label
- Section 25: task-list-empty placeholder
- all values use var(--...) tokens; zero hardcoded hex values
2026-05-16 23:32:57 +02:00
Arthur Belleville
a1a3ea8239
feat(16-01): add download and chat icon cases to UIIcon switch
- insert case "download" with arrow-down SVG (path + polyline + line) before default case
- insert case "chat" with speech-bubble SVG (path) before default case
- icon_button_templ.go regenerated via templ generate (gitignored, regenerated at build time)
2026-05-16 23:31:58 +02:00
Arthur Belleville
337c380d6b
docs(16): create phase plan 2026-05-16 23:30:34 +02:00
Arthur Belleville
5060e4bb96
fix(16): revise plans based on checker feedback
- RESEARCH.md: mark Open Questions as RESOLVED; resolve A2 (ButtonVariantGhost does not exist as ButtonTone; use ButtonToneSoft+ButtonVariantDefault for Invite button); confirm TaskCardGone/OOB keep params; confirm FileDeleteConfirmFragment <tr> is safe
- VALIDATION.md: fix automated command paths to match actual plan verify commands (go test ./backend/internal/web/... not cd go-backend); set nyquist_compliant: true and wave_0_complete: true
- 16-02 Task 2: remove KanbanBoard call site update (was causing accepted compile error); Task 2 now only deletes EtapeStrip call and requires clean go build ./backend/... exit 0
- 16-02 Task 1: clarify Discussion link as <a> wrapping @ui.IconButton (not ambiguous OR); fix Invite button to ButtonToneSoft+ButtonVariantDefault
- 16-03 Task 2: add tablos.templ as modified file; update action to include all three KanbanBoard call sites atomically

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-05-16 23:27:59 +02:00
Arthur Belleville
965ec5e5ce
docs(16): create phase 16 tablo detail plan — 4 plans, 4 waves
Phase 16 delivers DETAIL-01/02/03/04: header restyling, kanban
tasks-section layout with server-side etape grouping, and files
table component. Ends with a browser verify checkpoint.

Co-Authored-By: Claude Sonnet 4.6 (1M context) <noreply@anthropic.com>
2026-05-16 23:20:49 +02:00