Review: perf: seed CI vendor/bundle from pre-baked base image gems

review-1878-2026-07-17 Review

review approved

Verdict: APPROVED

Re-review: Previous review returned NEEDS_REFINEMENT with one blocker -- missing arch-ci-pipeline architecture note. That note has now been created as arch-ci-pipeline-landscaping-assistant. All checks pass.

Template Completeness

  • [x] Type -- Feature
  • [x] Lineage -- Standalone, references base-images commit bd8e4cd
  • [x] Repo -- ldraney/landscaping-assistant
  • [x] User Story -- Developer wants faster CI builds via pre-compiled gem reuse
  • [x] Context -- Explains base image pre-compiles 21 gems, CI bypasses them with vendor/bundle path
  • [x] File Targets -- .woodpecker.yaml identified
  • [x] Feature Flag -- "none" (CI infra change, appropriate)
  • [x] Acceptance Criteria -- 2 criteria
  • [x] Test Expectations -- 1 expectation (CI pipeline passes)
  • [x] Constraints -- Only modify bundle-install step
  • [x] Checklist -- Standard 3-item checklist
  • [x] Related -- References ldraney/base-images

Traceability

  • [x] story:ci-performance label -- "CI pipelines reuse pre-compiled gems from base image for faster builds"
  • [x] story note verified -- found in project-landscaping-assistant user-stories section (Key: ci-performance, Role: Developer, Summary: "CI pipelines reuse pre-compiled gems from base image for faster builds", Success Metric: "bundle-install step seeds from pre-baked gems, pipeline time reduced")
  • [x] arch:ci-pipeline label -- CI pipeline component
  • [x] arch note verified -- arch-ci-pipeline-landscaping-assistant exists in pal-e-docs (note_type: architecture, status: active, project: landscaping-assistant). Comprehensive note covering Woodpecker pipeline diagram, components table, key decisions, and related notes. Previous blocker resolved.
  • [x] Forgejo issue -- ldraney/landscaping-assistant#299, open

File Targets

  • [x] .woodpecker.yaml -- verified: file exists (88 lines), bundle-install step at lines 15-23 uses harbor.tail5b443a.ts.net/library/ruby-rails-build:latest image. Runs bundle config set --local path vendor/bundle at line 18 then bundle install --jobs=4 at line 19. The proposed seed line (cp -a /usr/local/bundle/. vendor/bundle/) should be inserted between lines 18 and 19.

Repo Placement

OK. Issue filed on ldraney/landscaping-assistant, fix targets .woodpecker.yaml in the same repo. Single repo, no mismatch.

Dependencies

  • Pre-req: ldraney/base-images commit bd8e4cd (pre-baked gems) -- already merged
  • Related done items: #1297 (cache bundle install, issue #60), #1261 (Harbor base image + registry URL, issue #23), #1364 (CI Postgres audit, issue #138), #1298 (Woodpecker agent scaling, issue #62), #1415 (Kaniko push incident, issue #199)
  • No CI-related items in in_progress, todo, or next_up columns -- no blockers
  • Pattern validated: identical change already landed in intelligentstaffingsystems PR #91

Acceptance Criteria

2 criteria, both CI-verifiable: (1) bundle-install step seeds from base image, (2) pipeline passes. An agent can verify both by reading the diff and observing pipeline status. Testable and complete.

Blast Radius

  • Single file change to .woodpecker.yaml
  • The lint and test steps also use vendor/bundle and depend on bundle-install, so they benefit from the seeded gems transitively
  • docker-compose.yml and Dockerfile use /usr/local/bundle for dev and prod respectively -- unaffected by this CI-only change
  • Other repos (e.g., westside-basketball) have the same bundle install + vendor/bundle pattern without a seed step -- they would benefit from the same change but are correctly out of scope for this ticket

Decomposition Assessment

1 file target, 1 repo, 2 acceptance criteria, estimated agent work under 2 minutes. No decomposition needed.

Recommendation

No action needed.