Plan: Post-SCORE Program — W16 / Profile / Async Import¶
Status: CLOSED (2026-08-29) — T4-POST-SCORE-closure-decision.md
Mode: Server /home/scola/odoo
Baseline: SC-CORE closed — FE app 1d7a9038 · BE runtime 6033c21 · E1.2 validator PASS
Program scope: Tiga jalur paralel setelah gelombang SC-CORE; UAT PROMOTE_UAT tetap di luar semua jalur
Docs read: T4-SCORE-closure-decision.md, 07-release-test-matrix.md §5.3 / §10.2, 06-golden-tenant-spec.md §12.1, 10-implementation-roadmap.md §8 T5-U02, T4-W00-W01-W02-core-track-charter.md, T4-DEC-W01-W02-bounded-freezes.md
1. Goal¶
Menutup residual scope yang explicitly deferred dari SC-CORE closure tanpa memperluas denominator gelombang lalu:
| Jalur | Matrix target | Exit definition |
|---|---|---|
| W16 | §5.3 — 11 row CORE-W16 |
11/11 PASS (or documented bounded NOT RUN with sign-off) |
| Profile | §10.2 — RT-PROFILE-JENJANG-01, RT-PROFILE-TIMEZONE-01 |
PASS untuk signed GT-PROFILE-* IDs only |
| Async import | §5.2 — RT-W02-IDM-01, RT-W02-REC-01 |
IDM+REC PASS; W02 harness extended |
Explicit non-claim (semua jalur): PROMOTE_UAT, tenant UAT isolation fix, production promotion, demo refresh opsional saja.
2. Baseline & gap analysis¶
2.1 SC-CORE closure residual¶
| Item | SC-CORE status | Post-SCORE jalur |
|---|---|---|
| W16 §5.3 (11 rows) | 6 NOT RUN, 5 BLOCKED |
Track W16 |
RT-PROFILE-JENJANG-01 / RT-PROFILE-TIMEZONE-01 |
DEFER (DEC-013 unsigned) | Track Profile |
RT-W02-IDM-01 / RT-W02-REC-01 |
NOT RUN (DEC-008) |
Track Async import |
PROMOTE_UAT |
DEFER → W16 wave | Out of scope ketiga jalur |
2.2 W16 — mengapa masih BLOCKED¶
| Row | Status | Blocker |
|---|---|---|
RT-W16-NEG-01 |
BLOCKED |
Capability/approval matrix — DEC-003/004 |
RT-W16-STA-01 |
BLOCKED |
Approval/reversal policy — DEC-007 |
RT-W16-REC-01 |
BLOCKED |
Notification/recovery contract — DEC-010 |
RT-W16-XRP-01 |
BLOCKED |
Notification behavior — DEC-010 |
RT-W16-XMD-01, RT-W16-UIA-01 |
BLOCKED |
Legacy migration + UI — DEC-011/STAB-033 |
| POS/SCP/TEN/VAL/IDM | NOT RUN |
Harness + engineering belum dijalankan |
Contract: scola.news sole writable source; legacy announcement read-only/migrated (EV-W16, STAB-033, IA-010).
2.3 Profile — mengapa masih BLOCKED¶
| Control | Status | Gap |
|---|---|---|
RT-PROFILE-JENJANG-01 |
BLOCKED |
DEC-013 unsigned; STAB-044 bounded negatif sudah cukup Core V1 |
RT-PROFILE-TIMEZONE-01 |
BLOCKED |
Butuh signed profile set + fixture WIB/WITA/WIT |
Baseline seed: hanya GT-PROFILE-NON-EARLY-WIB ter-seed; GT-PROFILE-EARLY-WIB, GT-PROFILE-NON-EARLY-WITA, GT-PROFILE-NON-EARLY-WIT = decision fixtures (06 §12.1).
2.4 Async import — mengapa NOT RUN¶
| Row | SC-CORE claim | Gap |
|---|---|---|
RT-W02-IDM-01 |
Manual sync 1-row only | Async job idempotency contract unsigned (DEC-008 subset) |
RT-W02-REC-01 |
ROW_ATOMIC mixed-row only |
Fault injection / resume / reversal unsigned |
Code surface sudah ada: scola.student.import.job (idempotency_key + company unique), admin_import_api.py enqueue/poll.
3. Program architecture — tiga jalur paralel¶
flowchart TB
subgraph phaseA [FaseA_SC_CORE_Closed]
SCORE[SC_CORE_PASS_bounded]
E12[E1.2_29_29_validator_PASS]
end
subgraph tracks [PostSCORE_Parallel]
W16[Track_W16_News]
Profile[Track_PROFILE_DEC013]
Async[Track_W02_Async_DEC008]
end
phaseA --> tracks
W16 -.->|explicit_out| UAT[UAT_Promotion_W16_plus]
Profile --> GoldenFixtures[GT_PROFILE_fixtures]
Async --> ImportJob[student_import_job_harness]
W16 --> W16Harness[w16_runtime_certify.py]
Profile --> ProfileHarness[profile_matrix_certify]
Async --> W02Harness[w02_async_import_certify]
SHA rule: Satu track = satu rebind bundle; 3 bundle evidence terpisah — jangan gabungkan ketiga jalur jadi satu SHA claim.
4. Rekomendasi urutan / paralelisme¶
| Jalur | Mulai setelah | Paralel dengan | Gate Product dulu? |
|---|---|---|---|
| W16 | SC-CORE closed (+ optional Fase A push green) | Profile + Async (code-independent per roadmap §8) | Ya — DEC-003/004/007/010/011 |
| Profile | Workshop DEC-013 | W16 + Async | Wajib — signed profile matrix |
| Async import | DEC-008 import subset signed | W16 + Profile | Wajib — import job contract |
Rekomendasi operasional:
- Phase 0 decision ketiga jalur paralel (workshop 1–2 hari): W16-1 + PROF-0 + ASYNC-0.
- Engineering W16 + Profile seed paralel setelah freeze masing-masing.
- Async start harness setelah kontrak DEC-008 import ditandatangani (bergantung BE job semantics).
5. Jalur 1 — W16 Canonical News¶
Track ID: POST-SCORE-W16
Objective: T5-U02 — scola.news sole writable source; legacy announcement read-only/migrated (STAB-033).
| Phase | Deliverable | Doc |
|---|---|---|
| W16-0 | Charter | T4-W16-core-track-charter.md |
| W16-1 | Bounded product freezes | T4-DEC-W16-bounded-freezes.md |
| W16-2 | Code — FE canonical routes/menu (IA-010); BE lifecycle, legacy guard, audience/outbox idempotency | Engineering |
| W16-3 | Harness — scripts/golden/w16_runtime_certify.py (mirror w01_runtime_certify.py) |
BE |
| W16-4 | Rebind Golden :8090; update §5.3 + V1-W16-rebind-*.json; QC + E1.2 regression smoke |
Evidence bundle |
Denominator: 11 row §5.3 — saat ini 6 NOT RUN, 5 BLOCKED.
Exit gate: 11/11 §5.3 PASS bound to exact FE/BE SHA · bundle V1-W16-rebind-<stamp>.json.
6. Jalur 2 — Profile Jenjang / Timezone (DEC-013)¶
Track ID: POST-SCORE-PROFILE-DEC013
Objective: Positive certification §10.2 — RT-PROFILE-JENJANG-01, RT-PROFILE-TIMEZONE-01.
| Phase | Deliverable | Doc |
|---|---|---|
| PROF-0 | Workshop charter + signed DEC-013 matrix | T4-PROFILE-DEC013-track-charter.md |
| PROF-1 | Seed Golden overlays: GT-PROFILE-EARLY-WIB, GT-PROFILE-NON-EARLY-WITA, GT-PROFILE-NON-EARLY-WIT |
Golden seed |
| PROF-2 | Parameterize W00 nav crawl; W01/W05 fixed-clock boundary (STAB-022); extend vitest jenjang | FE/BE tests |
| PROF-3 | profile_matrix_certify.py or extend E1.2 property set |
Harness |
| PROF-4 | Update §10.2 rows BLOCKED → PASS bounded; manifest lists exact GT-PROFILE-* IDs |
Evidence bundle |
Rekomendasi: Jangan gabung ke denominator W16 — cross-cutting, Product-led. Bisa unblock W06/W20 nanti tapi bukan gate W16.
Exit gate: §10.2 RT-PROFILE-* PASS for signed profile IDs only · no “all schools” claim.
7. Jalur 3 — W02 Async Import IDM/REC (DEC-008 subset)¶
Track ID: POST-SCORE-W02-ASYNC
Objective: Tutup RT-W02-IDM-01, RT-W02-REC-01 (§5.2).
| Phase | Deliverable | Doc |
|---|---|---|
| ASYNC-0 | Import-job bounded freeze (subset DEC-008) | T4-DEC-W02-async-import-freeze.md |
| ASYNC-1 | BE hardening — job state machine, cron recovery, fault injection hooks; sudo/route budget | BE |
| ASYNC-2 | Extend w02_runtime_certify.py or w02_async_import_certify.py — IDM duplicate key, REC partial failure/resume |
Harness |
| ASYNC-3 | FE UploadSiswa.vue progress/retry/error download (STAB-023) |
FE |
| ASYNC-4 | W02 §5.2 IDM/REC NOT RUN → PASS; update bundle; W05 regression 16/16 guard | Evidence bundle |
Scope boundary: Import job saja — bukan seluruh master-data DEC-008 (MD-01–MD-03).
Exit gate: §5.2 IDM+REC PASS · W02 harness extended · W05 regression 16/16 guard.
8. Exit gates program (keseluruhan)¶
| Jalur | PASS definition | UAT |
|---|---|---|
| W16 | 11/11 §5.3 PASS (or documented bounded NOT RUN with sign-off) | Out |
| Profile | §10.2 RT-PROFILE-* PASS for signed profile IDs only |
Out |
| Async | §5.2 IDM+REC PASS; W02 harness extended | Out |
UAT promotion tetap gelombang terpisah W16+ (engineering isolation + PROMOTE_UAT workflow) — bukan bagian exit gate ketiga jalur di atas.
9. Phase order (mandatory per track)¶
Program Phase 0 — Decision freezes (parallel workshops)
W16-0/1 + PROF-0 + ASYNC-0
Program Phase 1 — Engineering (parallel where independent)
W16-2/3 + PROF-1/2 + (Async waits ASYNC-0 sign-off)
Program Phase 2 — Harness + rebind (per track)
W16-4 | PROF-3/4 | ASYNC-1/2/3/4
Program Phase 3 — Optional demo candidate refresh (NO UAT)
10. Risks & mitigations¶
| Risk | Mitigation |
|---|---|
| Scope creep menggabungkan 3 jalur jadi satu SHA | Satu track = satu rebind bundle; 3 bundle evidence terpisah |
| W16 BLOCKED tanpa DEC freeze | Phase W16-1 wajib sebelum coding harness |
| Profile klaim over-broad | Manifest lists exact GT-PROFILE-*; no “all schools” claim |
| Async import tanpa DEC-008 subset | ASYNC-0 sign-off before harness |
| UAT promoted prematurely | Explicit exclusion in semua charter; gelombang W16+ terpisah |
11. Estimated effort¶
| Jalur | Effort | Critical path |
|---|---|---|
| W16 | 2–3 minggu | DEC freeze + STAB-033 migration |
| Profile | 2–4 minggu | Product workshop + fixture seed |
| Async import | 1.5–2.5 minggu | DEC-008 import contract + harness |
Jalur bisa overlap setelah Phase 0 decisions.
12. Charter index¶
| Track | Charter | Bounded freezes |
|---|---|---|
| W16 | T4-W16-core-track-charter.md |
T4-DEC-W16-bounded-freezes.md |
| Profile | T4-PROFILE-DEC013-track-charter.md |
DEC-013 matrix (PROF-0 workshop output) |
| Async import | — (subset of W02) | T4-DEC-W02-async-import-freeze.md |
13. References¶
| Artifact | Path |
|---|---|
| SC-CORE closure | T4-SCORE-closure-decision.md |
| SC-CORE charter (predecessor) | T4-W00-W01-W02-core-track-charter.md |
| Runtime matrix SSOT | 07-release-test-matrix.md §5.3, §10.2 |
| Golden profile candidates | 06-golden-tenant-spec.md §12.1 |
| W16 roadmap unit | 10-implementation-roadmap.md §8 T5-U02 |
| STAB-033 legacy/canonical | 08-stabilization-backlog.md |
| W02 import job model | custom_addons_scola/gcgscola/scola_core/models/student_import_job.py |