Review v3: Hours tab: clock in/out/break UI

review-1938-2026-07-27-v3 Review

review approved

Verdict: APPROVED

Board item #1938 — Hours tab: clock in/out/break UI (Forgejo issue #333, 5 points, sprint:7)
Re-review v3 after refinement. Previous reviews: review-1938-2026-07-27 (v1), review-1938-2026-07-27-v2 (v2). The sole remaining issue from v2 — missing user story entry on project page — has been fixed. All 5 original issues are now resolved.

Previous Issues — All Resolved

  • [x] arch:rails label — Resolved in v2. convention-architecture-ids lists arch:rails as a general category label "Rails application (models, controllers, views)" under Application section. Not project-specific. Acceptable.
  • [x] hours_controller.rb annotation — Resolved in v2. Issue body now reads app/controllers/hours_controller.rb (created by #332).
  • [x] Stimulus timer test expectation — Resolved in v2. Test expectations note server-derived correctness: timer calculates elapsed from started_at minus break durations. JS is pure display.
  • [x] Decomposition rejection — Resolved in v2. Context section justifies keeping 10 AC as one ticket: all items on single page, tightly coupled. Splitting nav/page-shell from timer-widget would deliver an empty page.
  • [x] User story on project page — NOW RESOLVED. project-landscaping-assistant user-stories section has 16 entries. "crew-time-tracking" is row 16 with Key=crew-time-tracking, Role=Crew Member/Crew Lead, Summary=Clock in/out, track breaks, view daily/weekly hours from Hours tab. Success Metric includes parent #331 reference.

Template Completeness

  • [x] Type — Feature
  • [x] Lineage — Related to #331 (parent), depends on #332 (model ticket)
  • [x] Repo — ldraney/landscaping-assistant
  • [x] User Story — As a crew member or lead, clock in/out/break
  • [x] Context — Present, includes decomposition justification
  • [x] File Targets — 2 create, 5 modify, exclusions listed
  • [x] Feature Flag — time_tracking (registered by #332)
  • [x] Acceptance Criteria — 10 items
  • [x] Test Expectations — 6 items + run command
  • [x] Constraints — 4 items
  • [x] Checklist — standard
  • [x] Related — project + parent + story
All template sections present and complete.

Traceability

  • [x] story:crew-time-tracking label — present on board item
  • [x] story note verified — found as row 16 of 16 in project-landscaping-assistant user-stories section
  • [x] arch:rails label — present on board item. Verified against convention-architecture-ids: general category label "Rails application (models, controllers, views)" under Application section.
  • [x] arch note verified — arch-rails note exists in pal-e-docs. General category label per convention, not project-specific.
  • [x] Forgejo issue — #333, open

File Targets

  • [x] app/views/hours/index.html.erb — TO CREATE. Directory does not exist; expected for greenfield.
  • [x] app/javascript/controllers/timer_controller.js — TO CREATE. Controllers directory exists with Stimulus controllers. Uses eagerLoadControllersFrom.
  • [x] app/views/layouts/application.html.erb — verified exists. Nav uses 5-slot grid. Slot 2 reuse for Hours (member/lead) is sound.
  • [x] app/controllers/application_controller.rb — verified exists. TAB_ROLES present, adding :hours is straightforward.
  • [x] app/controllers/hours_controller.rb (created by #332) — correctly annotated as dependency.
  • [x] app/assets/stylesheets/application.css — verified exists.
  • [x] config/routes.rb — verified exists. Ticket correctly notes routes may be added by #332.

Repo Placement

Correct. All work in ldraney/landscaping-assistant. Forgejo issue filed on same repo. No cross-repo scope.

Dependencies

  • #1937 / issue #332 (TimeEntry data model + API + flag) — backlog, sprint:6. Hard dependency. Creates controller, models, routes, feature flag. Sprint ordering (6 before 7) is correct. Documented in Lineage section.
  • #1936 / issue #331 (Time Tracking: Hours Tab) — backlog, parent umbrella. No blocking dependency.
  • #1939 / issue #334 (Hours tab: daily/weekly summary) — backlog, sprint:7. Sibling ticket, independent, can run in parallel.
  • Only in_progress item is #1940 (Keycloak redirect bug) — unrelated, does not block.

Acceptance Criteria

10 acceptance criteria. All have reasonable test coverage strategy. AC 1-3, 7-10 covered by request specs. AC 4-6 (client-side timer) addressed by server-derived correctness approach. All criteria are agent-verifiable.

Blast Radius

No existing time tracking code in codebase. Clean greenfield addition. Nav slot 2 reuse is architecturally sound — admin (Week) and member/lead (Hours) roles are mutually exclusive. No downstream consumers affected.

Decomposition Assessment

Decomposition waived. Justification accepted in v2: all 10 AC describe states of one cohesive widget on one page. Splitting would create artificial boundaries. AC are tightly coupled (cannot test break without clock-in, cannot test clock-out without timer).

Recommendation

No action needed. All issues from v1 and v2 have been resolved. Ticket is ready for implementation.