Review: Property detail page: Projects section (depends on #122)

review-1403-2026-07-26 Review

review approved

Verdict: APPROVED

Scope is clear and actionable. All file targets verified, traceability complete, dependencies documented and resolved. One minor line-reference inaccuracy in the body does not block implementation.

Template Completeness

  • [x] Type (Feature)
  • [x] Lineage
  • [x] Repo
  • [x] User Story
  • [x] Context
  • [x] File Targets
  • [x] Feature Flag (None -- acceptable: read-only display on existing page, not a new user workflow)
  • [x] Acceptance Criteria
  • [x] Test Expectations
  • [x] Constraints
  • [x] Checklist
  • [x] Related

Traceability

  • [x] story:auth label -- "Log in with Keycloak, see role-appropriate tabs and features"
  • [x] story note verified -- "auth" key found in project-landscaping-assistant user-stories section
  • [x] arch:rails-app label -- Rails App (Shared Pattern)
  • [x] arch note verified -- arch-rails-app note exists in pal-e-docs
  • [x] Forgejo issue -- ldraney/landscaping-assistant#176, open

File Targets

  • [x] app/views/properties/show.html.erb -- verified: exists, current structure has property details + comments section, projects section would be inserted between them
  • [x] app/views/properties/_service_requests.html.erb -- new partial (does not exist yet, expected)
  • [x] app/assets/stylesheets/application.css -- verified: exists (59k). Line reference inaccuracy: ticket says .status-indicator and .role-badge at lines 1564-1616, but actual locations are lines 1999-2048. Class names are correct and findable by grep.
  • [x] app/controllers/properties_controller.rb -- verified: exists, show action at line 78 currently loads comments but not service_requests
  • [x] spec/requests/properties_spec.rb -- verified: exists (17k)
  • [x] ServiceRequest::STATUSES and ServiceRequest::VALID_TRANSITIONS -- verified: defined in app/models/service_request.rb at lines 5 and 7
  • [x] Property has_many :service_requests -- verified: association exists at line 9 of app/models/property.rb

Repo Placement

OK. Issue filed on ldraney/landscaping-assistant, all file targets are in the same repo. Single-repo change.

Dependencies

  • [x] #122 (ServiceRequest model) -- DONE on board (item 1347), merged. Prerequisite satisfied.
  • [x] #126 (CSS refresh) -- DONE on board (item 1351), merged. Prerequisite satisfied.
  • [x] #206 (decline transitions bug) -- DONE on board (item 1452), merged. Non-blocking per ticket.
  • [x] #123 (Client request form) -- backlog (item 1348), sibling ticket. Not a dependency.
  • [x] #179 (Admin project workflow) -- backlog (item 1404), depends on THIS ticket. Correctly sequenced.
All upstream dependencies resolved. Downstream dependency (#179) correctly documents dependency on this ticket.

Acceptance Criteria

6 ACs, all testable and verifiable by an agent:
  • Projects section visibility -- check DOM element presence in show response
  • Active request grouping -- verify correct statuses rendered together
  • Completed/declined separation -- check separate rendering section
  • Request detail display -- verify description, badges, price in rendered HTML
  • Empty state -- test with property that has no service_requests
  • Mobile layout -- verify CSS uses 44px touch targets and proper spacing
All criteria are concrete and machine-verifiable via request specs.

Blast Radius

Contained. Changes are isolated to the property detail page:
  • Existing service_request usage in property_comments views/controller is separate (comment-linked requests, not a standalone list).
  • New CSS classes are additive; existing .status-indicator and .role-badge patterns are reused, not modified.
  • Controller change (eager-loading) adds a query, does not modify existing behavior.
  • No other views render a project/request list -- this is the first.

Decomposition Assessment

5 file targets, 1 repo, 6 ACs -- all within the property detail page domain. Estimated agent work under 5 minutes. No decomposition needed.

Recommendation

  • [BODY] Fix CSS line references: ticket says .status-indicator and .role-badge at lines 1564-1616, actual location is lines ~1999-2048. Class names are correct; only the line numbers need updating.