Plan: SC-CORE Track — W00 Unblock + W01/W02 Rebind¶
Status: PROPOSED (2026-08-29)
Mode: Server /home/scola/odoo
Track scope: CORE-PLATFORM (W00) → CORE-W01 → CORE-W02
Explicitly out of track: W03 (PKG-ADM-W03), W16 (gelombang terpisah), UAT promotion (setelah gelombang SC-CORE + W16)
Current tip (post W05-B): FE bc3ec030… / BE 6033c21… · demo pair fe-build-bc3ec030-w05b-rc1f006
Docs read: AI_AGENT_MASTER_GUIDE.md, 07-release-test-matrix.md, T0-E2-decision-inventory.md, T5-core-regression-matrix.md, independent verdicts T2.1-W01 / T3-W02, W05 rebind evidence.
1. Goal¶
Menutup denominator runtime W00 (11) + W01 (11) + W02 (11) pada exact FE/BE tip yang sama, sehingga:
- Baris
RT-W00-*,RT-W01-*,RT-W02-*di07-release-test-matrix.mddapat diisiPASSdengan evidence JSON terikat SHA. - Gelombang UAT (Rejis canary → …) dapat digabung nanti dengan W16 tanpa re-promote parsial W05 saja.
- W03 admissions tetap track terpisah (
T6A/PKG-ADM-W03).
2. Baseline & gap analysis¶
2.1 W00 — mengapa masih BLOCKED di matriks¶
| Area | Engineering state | Gap untuk unblock |
|---|---|---|
| DEC-001 / DEC-002 / DEC-014 | Approved (T0-E2-decision-inventory.md) |
Matriks belum di-reconcile; bukan blocker produk baru |
| E1.2 security matrix | 29/29 pada tip Aug-14/26; belum rebind bc3ec030/6033c21 |
Wajib re-run e12_security_matrix.py + validator |
| STAB-044 jenjang | CLOSED bounded Core | Positive DEC-013 profile matrix = optional exposure |
| STAB-007 / STAB-008 | Code fixed; runtime verification pending (T0-A-result.md) |
T0-B2 / E1.2 cases + adversarial multi-role |
| STAB-025 role home | Open | Role×app crawl + backend catalog parity |
| STAB-026 placeholder | Open | Hide/remove lab + /register stub |
| RT-W00-REC-01 / RT-PKG-GAP-12 | Open | t0d_credential_matrix.py + fixture accounts |
| RT-W00-UIA-01 | Open | Nav graph + menu crawl E2E/manual |
Harness utama W00: scripts/golden/e12_security_matrix.py, e12_evidence_identity_validator.py, t0d_credential_matrix.py; FE npm run check:nav-graph, check:core-parity, check:core-nav-ux.
2.2 W01 — rebind vs product blockers¶
| Area | Engineering state | Gap |
|---|---|---|
| Harness 64-case | 64/64 historis; findings T2W01-F-001..004 closed | Rebind pada tip 6033c21 via w01_runtime_certify.py |
| Independent audit | PARTIAL — behavior fixed, manifest stale | Current-tip matrix + E1.2 bind |
| Matriks BLOCKED | STA-01 lock policy, REC-01 recovery, SCP assignment, UIA STAB-041 | Perlu DEC freeze bounded V1 ( pola DEC-006/007 W05) atau product sign-off |
Harness: scripts/golden/w01_runtime_certify.py · evidence T2.1-W01-evidence/.
2.3 W02 — in track (rebind + S0 fix)¶
| Area | Engineering state | Gap |
|---|---|---|
| Harness 33-case | 33/33 historis (T3-W02-current-tip-matrix.json stale SHA) |
Rebind current tip |
| Independent audit | FAILED — cross-tenant parents/relation/save S0 |
Fix parent_admin_api.py + case adversarial baru |
| Validator | Served FE SHA ≠ certified tree | Rebuild FE + enforce validator served/commit equality |
Harness: scripts/golden/w02_runtime_certify.py · fix before claiming PASS.
3. Dependency order (mandatory)¶
Phase 0 — Charter & product freezes
Phase 1 — W00 engineering unblock (STAB + credential + E1.2 rebind)
Phase 2 — W01 product decisions + W01 rebind 64/64
Phase 3 — W02 S0 fix + W02 rebind 33/33
Phase 4 — Matrix closure + regression bundle (T5-style)
Phase 5 — Demo candidate refresh (NO UAT yet — wait W16 wave)
W01 tidak boleh rebind final sebelum W00 E1.2 green (platform auth/tenant baseline).
W02 tidak boleh rebind final sebelum W01 POS/VAL/TEN green (master/roster prerequisite for XMD).
4. Phase 0 — Charter & product freezes (1–2 hari)¶
4.1 Deliverable¶
Buat T4-W00-W01-W02-core-track-charter.md berisi:
- In-scope: W00 platform, W01 academic master/timetable, W02 manual onboarding (bukan bulk import async penuh jika masih DEC-008 open).
- Out-of-scope: W03, W16, UAT, production.
- Exact tip target SHA (diisi saat Phase 4).
4.2 Product decisions to freeze (minimum)¶
| ID | W01/W02 row | Recommended V1 bounded option |
|---|---|---|
| W01-LOCK | RT-W01-STA-01 | Save≡published for session; edit after session date = admin-only + audit; no separate lock API V1 |
| W01-REC | RT-W01-REC-01 | Savepoint rollback on term/session replace failure (already implemented); UI shows authoritative error |
| W01-SCP | RT-W01-SCP-01 / NEG | Teacher read = assigned faculty + homeroom batch only (T2W01-F-001 contract) |
| W02-STA | RT-W02-STA-01 | Manual create → link → batch → activate; import async = NOT RUN until DEC-008 |
| W02-XRP | RT-W02-XRP-01 | Parent link visible after relation save; revoke on archive |
Format approval: conversational record in charter (sama pola DEC-006/007).
5. Phase 1 — W00 unblock (3–5 hari)¶
5.1 STAB-026 — placeholder containment¶
- Audit
src/router/*,appFragments, public routes untuk lab/register stub. - Action:
INCOMPLETE_REMOVEatau redirect fail-closed; updaterc1CoreSurfacePolicy+ unit tests. - Verify: no menu leaf links to placeholder in
check:nav-graph.
5.2 STAB-025 — role home parity¶
- Cross-check
roleApps.js/role_catalog.pyfor orphan homes. - Run fresh-role login matrix (script or Playwright smoke): each Core role → valid home, zero 404 on visible leaves.
- Evidence:
T0-W00-role-home-crawl-<timestamp>.json.
5.3 STAB-007 / STAB-008 runtime closure¶
- Extend or run existing T0-B cases inside E1.2 matrix:
- multi-role switch → capability 403
- forged active role denied
- unregistered protected route → fail-closed
- Target: 29/29 PASS,
finding_observation_fail: 0.
5.4 Credential lifecycle (RT-W00-REC-01 / RT-PKG-GAP-12)¶
- Run
scripts/golden/t0d_credential_matrix.pyon Golden:8090. - Seed fixtures: inactive, forced-password, reset token replay, session revoke (per DEC-014).
- Hide/deny excluded auth routes per inventory.
5.5 E1.2 current-tip rebind¶
# Golden :8090 — after FE/BE tip frozen for this phase
cd custom_addons_scola/gcgscola
python3 scripts/golden/e12_security_matrix.py
python3 scripts/golden/e12_evidence_identity_validator.py \
--manifest scola-fe-v2/docs/release-readiness/execution/T0-E1.2-evidence/T0-E1.2-REBIND-CURRENT-<stamp>-runtime-manifest.json
Bind manifest to FE bc3ec030… / BE 6033c21… (or newer tip if phases 2–3 change code).
5.6 FE static gates¶
cd scola-fe-v2
npm run check:nav-graph
npm run check:core-parity
npm run check:core-nav-ux
npm run test:contract
5.7 W00 exit gate¶
- [ ] E1.2 29/29 PASS on exact tip
- [ ] Credential matrix PASS
- [ ] STAB-026/025 evidence archived
- [ ] Update §4
RT-W00-*rows →PASSwith evidence links (or explicitNOT RUNonly for DEC-013 positive jenjang profiles)
6. Phase 2 — W01 rebind (2–4 hari)¶
6.1 Preconditions¶
- Phase 1 exit gate green
- W01 product freezes signed in charter
6.2 Runtime rebind¶
cd custom_addons_scola/gcgscola
# Golden :8090, gt-core-b1.1 + overlays as harness expects
python3 scripts/golden/w01_runtime_certify.py
Expected: 64/64 PASS · write T2.1-W01-<stamp>-runtime-matrix.json · refresh T2.1-W01-current-tip-matrix.json.
6.3 Regression in T5 bundle¶
- Re-run W05 16/16 + W02 smoke subset after W01 (W01-XMD dependency).
- Update §5.1 matrix rows; defer UIA-01 if menu crawl deferred to W00 bundle.
6.4 W01 exit gate¶
- [ ] 64/64 PASS bound to same SHA as E1.2 manifest
- [ ] No open S0/S1 in independent spot-check (teacher foreign session, term atomicity)
- [ ] §5.1 rows updated
7. Phase 3 — W02 rebind (3–5 hari)¶
7.1 S0 fix — cross-tenant parent relation¶
Finding: T3-W02 independent verdict — admin can link company-22 partner to company-20 student via /api/v1/admin/parents/relation/save.
Implementation (BE main):
- Enforce company scope on
partner_idandstudent_idinparent_admin_api.py(reject foreign company atomically, no leak). - Add harness case
W02-PARENT-RELATION-FOREIGN-PARTNER(must deny + zero mutation).
7.2 Runtime rebind¶
python3 scripts/golden/w02_runtime_certify.py
Expected: 33/33 PASS (or expanded denominator if new adversarial case added → update T3-W02-certification-denominator.json).
7.3 W02-XMD spot check¶
- After W01+W02 green: verify new student appears once in W05 roster overlay (manual or
w05_runtime_certifyseed path).
7.4 W02 exit gate¶
- [ ] S0 fix merged + case PASS
- [ ] 33/33 (or N/N) PASS on exact tip
- [ ] §5.2 rows updated
8. Phase 4 — Matrix & regression bundle (1 hari)¶
8.1 Single evidence index¶
Create execution/V1-W00-W01-W02-rebind-<stamp>.json:
{
"frontend_sha": "...",
"backend_sha": "...",
"e12": "29/29",
"w01": "64/64",
"w02": "33/33",
"w05_regression": "16/16",
"isolation_live": "PASS|PARTIAL"
}
8.2 QC gate (server-first)¶
Frontend: lint:diff → check:capability-diff → type-check → vitest --changed → test:contract → build
Backend: py_compile → unit suites (core, route access, W01/W02 touched) → sudo_budget_check --strict → controller_route_budget_check → environment_isolation_check.py --live
8.3 Update docs¶
07-release-test-matrix.mdsummary rows W00/W01/W02README.mdcurrent-tip pointer- Do not edit historical audit verdicts — append rebind evidence only
9. Phase 5 — Demo candidate (prep only; UAT with W16)¶
Setelah Phase 4 lulus:
- Commit tip FE
develop+ BEmain - Build immutable FE +
create-backend-release.sh - Promote demo (same procedure as RC1F-006 W05 bundle)
- Stop — UAT
PROMOTE_UATmenunggu W16 + gelombang SC-CORE penuh
10. Risks & mitigations¶
| Risk | Mitigation |
|---|---|
| W01 product lock policy tidak disepakati | Bounded DEC freeze (admin-only late edit) — jangan block 64/64 engineering |
| W02 S0 lebih luas dari satu endpoint | Expand adversarial matrix before rebind sign-off |
| E1.2 rebind gagal setelah W01/W02 code change | Re-run Phase 1.5 last — single final SHA |
| Double promote UAT | Explicit defer until W16 track; document in charter |
| Import/async W02 (DEC-008) | Mark RT-W02-IDM/REC NOT RUN with explicit non-claim |
11. Estimated effort¶
| Phase | Effort |
|---|---|
| 0 Charter + decisions | 1–2 hari |
| 1 W00 unblock | 3–5 hari |
| 2 W01 rebind | 2–4 hari |
| 3 W02 rebind + S0 | 3–5 hari |
| 4 Bundle + docs | 1 hari |
| Total | ~2–3 minggu (1 engineer, server-first) |
12. Immediate next actions¶
- Approve charter template — user confirms W01 lock/REC bounded options (§4.2).
- Start Phase 1.1 — STAB-026 placeholder audit (read-only grep + route inventory).
- Parallel: reproduce W02 S0 on dev
8074to confirm fix scope before coding.
13. References¶
| Artifact | Path |
|---|---|
| Runtime matrix SSOT | 07-release-test-matrix.md §4, §5.1, §5.2 |
| W01 harness | custom_addons_scola/gcgscola/scripts/golden/w01_runtime_certify.py |
| W02 harness | custom_addons_scola/gcgscola/scripts/golden/w02_runtime_certify.py |
| E1.2 harness | scripts/golden/e12_security_matrix.py |
| W01 independent gap | audit/T2.1-W01-independent-verdict.md |
| W02 S0 finding | audit/T3-W02-independent-verdict.md |
| Promotion contract | docs/ai-guidelines/release-environment-promotion.md |