Review: Spike -- CI bootstrap resilience
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 usesalpine/gitwith internal URLforgejo-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. Noforgejo_repository_branch_protectionresources 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_mergeoradmin_mergepatterns 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.