Review: Spike -- CI bootstrap resilience

review-231-2026-03-22 Review

review ready

Verdict: READY

Template Completeness

  • [x] Lineage
  • [x] Repo (lists both pal-e-platform and pal-e-services)
  • [x] Question (spike template -- replaces User Story)
  • [x] What to Explore (spike template -- replaces File Targets)
  • [x] Success Criteria (spike template -- replaces Acceptance Criteria)
  • [x] Time-box
  • [x] Related
Note: Spikes use a different template structure than standard issues. All required spike sections are present.

File Targets

  • [x] .woodpecker.yaml -- verified: clone step uses alpine/git with internal URL forgejo-http.forgejo.svc.cluster.local:80. No fallback to external URL exists. This is the resilience gap the spike investigates.
  • [x] pal-e-services/terraform/ branch protection config -- verified: NO branch protection resources found in pal-e-services Terraform. No forgejo_repository_branch_protection resources exist anywhere. This means branch protection is either (a) not configured, or (b) configured manually via Forgejo UI. The spike should discover this.
  • [x] Related incident: Issue #121 (CI clone broken) is on the board at item #221, column=done. The fix that exposed this gap is resolved.
  • [x] Force merge precedent: PR #124 was force-merged per ticket context. No force_merge or admin_merge patterns found in codebase.

Repo Placement

OK. Filed on pal-e-platform (primary). The ticket correctly identifies pal-e-services as a secondary repo for branch protection config investigation. Multi-repo scope is appropriate for a spike.

Dependencies

  • Board item #221 (Issue #121: CI clone broken) is done -- the incident that motivated this spike is resolved.
  • Board item #252 (Issue #133: CI pipeline broken -- replace clone with alpine/git) is done -- the tactical fix is in place.
  • Board item #258 (Issue #138: Split-horizon DNS) is done -- the infrastructure fix that resolved the clone failures.
  • No blockers. This spike can proceed independently.

Acceptance Criteria

All criteria are appropriate for a spike:
  • "Question answered with evidence" -- clear deliverable
  • "Trade-offs evaluated" -- good scope control
  • "Follow-up ticket created" -- ensures spike produces actionable work
  • "Or: admin bypass is sufficient" -- realistic escape hatch

Blast Radius

  • The spike itself has zero blast radius (research only, no code changes).
  • Finding: branch protection is NOT in IaC. This is itself a discovered scope item -- branch protection should be Terraform-managed. The spike may surface this as a prerequisite.
  • The clone step currently uses internal URL only with no fallback. Any future internal DNS failure will reproduce the original incident. This validates the spike's premise.

Recommendation

No action needed. Spike scope is well-defined, time-boxed, and properly motivated by real incidents. Points=3 is appropriate. One bonus finding for the spike agent: branch protection is not in IaC at all (no forgejo_repository_branch_protection resources found), which may simplify the "admin bypass" option since there's nothing to modify -- it would need to be created from scratch.