diff --git a/TASKS.md b/TASKS.md index ce4b2278..3bd8747d 100644 --- a/TASKS.md +++ b/TASKS.md @@ -45,6 +45,7 @@ argos cluster. That is a G0 milestone, not full P1 completion (HA / backup | T29 | Pooler TLS Secret auto-issuance — cert-manager `Certificate` CR + AutoTLS spec + self-signed fallback | Complete | 100% | T27 | F05 | 2026-05-13. **Stage 1+2** spec + controller. **Stage 3 cert-manager kind drill** → 6/6 PASS. **Stage 4 self-signed fallback**: `PoolerAutoTLSSpec.SelfSigned` field, `applyPoolerSelfSignedCertificate` generates RSA-2048 + x509 in-process (1-year validity, 30-day renewal skew), writes `tls.crt`/`tls.key`/`ca.crt` Secret, idempotent. CEL XValidation enforces "exactly one of {issuerRef, selfSigned}". Regression test `TestPoolerAutoTLS_SelfSignedCreatesSecretAndMirrorsNotAfter` + sample CR. **Stage 5 rotation observability**: `Pooler.Status.AutoTLSClientCertNotAfter` / `AutoTLSServerCertNotAfter` mirror Certificate.status.notAfter (cert-manager path) or parsed Secret cert (self-signed path); `priority=1` additionalPrinterColumns. T29 complete. | | T31 | G1 라이브 drill 자동화 — replica rejoin (basebackup + pg_rewind) + sync replication RPO=0 | 완료 | 90% | T27, T30 | F-G1 | 2026-05-17. `hack/smoke.sh` 에 `SMOKE_REJOIN` + `SMOKE_REJOIN_MODE` + `SMOKE_SYNC` + `SMOKE_SYNC_KILL` 4 env var + 5 함수 (`drill_rejoin`, `drill_rejoin_basebackup`, `drill_rejoin_rewind`, `drill_sync`, `drill_sync_kill`) 추가. 라이브 evidence: **B.1~B.3 RPO=0 PASS** (`commit_lsn=0/3DA43A0 == flush_lsn=0/3DA43A0`, `pg_wal_lsn_diff=0`, commit dca3fa0); **A.1 basebackup rejoin PASS** (`quickstart-shard-0-1` standby PVC delete → fresh basebackup → `streaming sync_state=async lag=0` 회복). ROADMAP G1 `Replica rejoin` + `Synchronous replication` 양쪽 `[~]→[x]` 마감. **A.2 pg_rewind 라이브 + SMOKE_FAILOVER operator-driven promotion 라이브 trigger 회귀** = 별 task (`docs/g1-ha-election-fact-fix` 영역 위임). spec/plan = `docs/superpowers/{specs,plans}/2026-05-17-g1-rejoin-sync-drill-*.md`. | | T30 | HA bootstrap fencing race — final fix | Complete | 100% | T27 | P1/G0 | 2026-05-13. Three-layer fix shipped: (i) `supervise.IsStandby(dataDir)` skip in handleStoppedLeading; (ii) `promotedAtLeastOnce atomic.Bool` flag; (iii) **standby-pod election downgrade** — a pod that boots with `standby.signal` on disk takes the Follower election (never contests the lease). The final architectural call: handleStoppedLeading is now side-effect-free. All fence / CreateStandbySignal / Stop logic on lease loss was removed — transient K8s API hiccups can no longer poison the data dir. Failover is exclusively operator-driven through `executeClusterPromotion` (exec into chosen replica → remove standby.signal → pg_ctl promote → kill the pod so the next boot crosses `bootedAsStandby=false` → Real elector). Regression tests: `TestHandleStoppedLeading_SkipsFenceAndDemoteForSingleMember`, `TestHandleStoppedLeading_SkipsFenceWhenNeverPromoted`, **new** `TestHandleStoppedLeading_NeverFencesOrDemotes` (T30 contract). **Live verification 2026-05-13**: PG18 SHARD_REPLICAS=1 5/5 PASS + WAL streaming verified; PG17 SHARD_REPLICAS=1 5/5 PASS + WAL streaming verified. SHARD_REPLICAS=0 PG18 + PG17 5/5 also re-confirmed (no regression). | +| T32 | Phase A' 통합 — 8 forward work branch sequential squash merge to stable + 100% cleanup + main FF sync | Complete | 100% | T31 | F-G1, F-G3, F-G5, F-G6 | 2026-05-17. `~/.claude/plans/1-swift-anchor.md` Rev 5/6 §Phase A' 라이브 evidence. 8 PR squash merge chain (target=`stable`, Rev 5 §A' 패턴): #61 d65-release-smoke ROADMAP D.6.5 drift 정정 (`1ba11bb`) → #62 G3 sharding-foundation-finalize ShardingMode/ShardsSpec/plugin [~]→[x] (`deeb79a`) → #63 ShardRange CRD type + manifests (`072d3fd`, ROADMAP G3 conflict union resolve) → #64 K8s Lease HA election lease.go + 2 unit test (`efb720b`, rebase 시 ROADMAP G1 conflict 이미 resolve) → #65 scatter-gather query path interface freeze (`8bdcb33`) → #66 ADR-0015 Accepted + 2PC skeleton (`2fe9825`, ROADMAP G5 conflict union resolve) → #67 cross-shard isolation matrix D.10.3 docs 완성 (`36227ad`, ROADMAP G5 conflict union resolve) → #68 sysbench/pgbench skeleton + baseline.md (`e403785`, ROADMAP G5 conflict union resolve). conflict 4건 모두 ROADMAP union resolution 패턴 (HEAD verbose markers + branch work additions). cleanup 100% — remote + local feat/postgres-* = 0/0 verified. stable → main fast-forward sync 완료 (`53dbdf0..e403785`, 9 commit advance). ArgoCD GitOps deploy trigger 활성. 9 ROADMAP marker 갱신: G2 D.6.5 (path 정정) + G3 4 sub-task ([~]→[x] + ShardRange CRD [x]) + G5 4 sub-task ([~] Scatter / [~] 2PC / [x] Isolation / [~] Benchmarks). WIP commit `72271d8 chore: pre-migration WIP (auto)` 8 branch 모두 rebase 시 drop (each PR body disclosure). Lesson codify: force-push 후 `sleep 4` GitHub mergeable 재계산 wait 의무, cleanup 은 `merged=true` 응답 확인 후만, PR auto-close → reopen + branch recreate retry 패턴. ADR-0015 v1.0 scope `{RC + 2PC}` only 정합 — distributed `{RR, SER}` = v2.0+ 별 RFC. | ## Previous phase record (P0 — 0.3.0-alpha redesign reset, commit df1f2e1)