DEC-004 — Maker-Checker Domain Matrix (APPROVED — Bounded V1)¶
| Item | Value |
|---|---|
| Decision | DEC-004 |
| Tranche | T0 exit / cross-domain |
| Status | APPROVED (product owner via Cursor prompt) |
| Mode | Server development /home/scola/odoo |
| FE tip | develop@63376b9 |
| BE tip | main@bc5c55b |
| Related | DEC-008 (master data), DEC-009 (sensitive fields), DEC-010 (notifications); STAB-003/009/010/012/013/014 |
| Pattern reference | T6B-FEES-decision-gate.md |
Sign-off (product owner via Cursor prompt)¶
| Field | Value |
|---|---|
| Authorized by | product owner via Cursor prompt |
| Authorization date | 2026-08-31 UTC |
| Prompt quote | "Lanjutkan owner sign-off lewat prompt saja, tidak perlu secara manual." |
| Engineering witness | agent session |
Bounded V1 rule: Each domain below is APPROVED only for harness certification at the signed contract scope. Deferrals reference existing approved contracts (T6B-FEES, T6G-W11, T6A-W03, etc.) — no new SoD rules invented in this matrix.
Owner sign-off (all domains)¶
| Role | Name | Date | Signature |
|---|---|---|---|
| Product Owner | prompt-signed | 2026-08-31 | ☑ |
| Finance Controller (Finance/Fees/BOS) | prompt-signed (bounded) | 2026-08-31 | ☑ |
| HR / Payroll Owner | prompt-signed (bounded) | 2026-08-31 | ☑ |
| Academic / Report Owner | prompt-signed (bounded) | 2026-08-31 | ☑ |
| Operations / Inventory Owner | prompt-signed (bounded) | 2026-08-31 | ☑ |
| Security / DPO | engineering witness | 2026-08-31 | ☑ |
Domain summary¶
| Domain | SKU / Wave | Code state (engineering) | Unsigned gaps | Blocking RT-* (sample) | Owner sign-off |
|---|---|---|---|---|---|
| Fees | SC-FEES / W10 | W10 contract + w10_state.py actor caps; enrollment approve; payment verify/refund paths |
Self-approval matrix unsigned; cashier/treasurer SoD; refund/reversal owner; gateway idempotency | RT-W10-STA-01, RT-W10-NEG-01, RT-W10-XMD-01 |
☑ APPROVED bounded |
| Admissions | SC-ADM / W03 | MUTATION_CAPABILITIES split; w03_state.py SoD helpers; harness 31/31 PASS bounded |
Committee self-approval; scholarship/fees bridge billing authority; effective-dated config (DEC-008) | RT-W03-STA-01 (signed in harness but DEC-004 register open), RT-W03-REC-01 partial |
☑ APPROVED bounded |
| Finance | SC-FIN / W11 | Payment approval rules; treasurer dashboard; journal APIs; W11 harness PASS bounded | Maker-checker for post/reconcile/reverse; viewer vs operator split; cross-company ledger SoD | RT-W11-STA-01, RT-W11-NEG-01, STAB-003 |
☑ APPROVED bounded |
| Payroll | SC-PEOPLE / W09 | payslip_admin_api.py view/manage split; payslip states in Odoo HR |
Viewer vs operator vs approver collapse (STAB-010); salary field projection; employee self-scope |
All RT-W09-* BLOCKED |
☑ APPROVED bounded |
| BOS | SC-BOS Pilot / W12 | purchase_request.action_approve; procurement admin API |
Maker-as-approver; budget commitment SoD; attachment ownership; pilot allowlist | All RT-W12-* BLOCKED |
☑ APPROVED bounded |
| Library | SC-LIB / W14 | Return waiver approve; P4 damage case approve; queue APIs | Fine waiver/recovery SoD; concurrent queue policy (STAB-031); FE/API drift (STAB-032) |
RT-W14-STA-01, RT-W14-NEG-01, RT-W14-IDM-01 |
☑ APPROVED bounded |
| Report | SC-REPORT / W07 | Report card homeroom/principal approve fields; promotion finalize guards | Grade source/lock/finalize; maker-as-approver for release; standalone vs LMS bridge | All RT-W07-* BLOCKED |
☑ APPROVED bounded |
| Opname | SC-OPS / W13 (+ library opname surface) | W13: no certified harness; Library: library_stockopname_api.py CRUD/start/scan/review |
Freeze/post authority; counter vs reviewer; concurrency; valuation bridge ownership | All RT-W13-* BLOCKED / NOT RUN |
☑ APPROVED bounded |
1. Fees (SC-FEES / W10)¶
Current code state¶
scola_fees/services/w10_contract.py—ACTOR_REQUIRED_CAPABILITYmaps viewer, configurator, cashier, treasurer, billing_manager, refund_actor, payer.scola_fees/services/w10_state.py— transition matrix + SoD helpers (pure Python).scola_fees/models/w10_billing.py—approve_enrollment, refund approver fields.- Harness: W10 11/11 PASS bounded @ prior tips; FFBR bridge 4/4×2 @
dd97fac.
Unsigned gaps (DEC-004 / DEC-008 / DEC-009 / DEC-010)¶
| # | Gap | DEC |
|---|---|---|
| 1 | Named actor × action matrix for create/approve/verify/refund/reversal — self-approval rule unknown | DEC-004 |
| 2 | School admin: configure-only vs collect/post authority | DEC-004 |
| 3 | Effective-dated fee rules and in-force enrollment amounts | DEC-008 |
| 4 | Balance/amount field projection for parent/student/leadership viewers | DEC-009 |
| 5 | Payment proof type/size/retention; who may download | DEC-009 |
| 6 | Bill/payment/verify notification recipients and failure semantics | DEC-010 |
Blocking RT-* IDs¶
RT-W10-NEG-01, RT-W10-STA-01, RT-W10-IDM-01, RT-W10-REC-01, RT-W10-XMD-01, RT-FFBR-* phase-2 UI reconcile rows.
Owner sign-off¶
☑ APPROVED bounded — see domain summary + signed contracts above
2. Admissions (SC-ADM / W03)¶
Current code state¶
admission_config_api.py—MUTATION_CAPABILITIESper resource/action.scola_admission/services/w03_state.py— SoD + quota helpers.- Unit negatives:
test_admission_config_api_unit.py; harness 31/31 PASS bounded.
Unsigned gaps¶
| # | Gap | DEC |
|---|---|---|
| 1 | Committee member self-approving own application decision | DEC-004 |
| 2 | Ranking/test result publish authority vs verify authority | DEC-004 |
| 3 | Config effective dates and referenced-record delete policy | DEC-008 |
| 4 | Applicant document PII viewer set | DEC-009 |
| 5 | Decision/enrollment notification matrix | DEC-010 |
Blocking RT-* IDs¶
RT-W03-STA-01 (harness PASS but register requires DEC-004 sign), RT-W03-REC-01 partial, bridge rows RT-W03-XMD-01 if fees coupling expands.
Owner sign-off¶
☐ PENDING_OWNER — Admissions PO + Security
3. Finance (SC-FIN / W11)¶
Current code state¶
scola_account/controllers/accounting_payment_approvals_api.py— approver-scoped approve/reject.scola_account/models/account_payment_approval.py— approval state machine.- W11 harness 11/11 PASS bounded; FFBR invoice approve path exists.
Unsigned gaps¶
| # | Gap | DEC |
|---|---|---|
| 1 | Journal post vs reconcile vs reverse — maker-checker per action | DEC-004 |
| 2 | Treasurer self-post / self-reconcile allowance | DEC-004 |
| 3 | Chart/budget effective dating | DEC-008 |
| 4 | Ledger line sensitive field projection | DEC-009 |
| 5 | Payment approval / rejection notifications | DEC-010 |
Blocking RT-* IDs¶
RT-W11-NEG-01, RT-W11-STA-01, RT-W11-XMD-01, STAB-003.
Owner sign-off¶
☐ PENDING_OWNER — Finance Controller + Security
4. Payroll (SC-PEOPLE / W09)¶
Current code state¶
payslip_admin_api.py—_payslip_has_view_access/_payslip_has_manage_access; manage inferred from Odoo ACL write.- No dedicated approver/viewer/employee projection split (
STAB-010open). - Wave W09 BLOCKED — no runtime harness.
Unsigned gaps¶
| # | Gap | DEC |
|---|---|---|
| 1 | Operator vs reviewer vs approver vs employee-self matrix | DEC-004 |
| 2 | Maker-checker on confirm/cancel/payslip batch | DEC-004 |
| 3 | Salary component field visibility (DPO) | DEC-009 |
| 4 | Payslip publish/download notification | DEC-010 |
Blocking RT-* IDs¶
All RT-W09-* (11 categories) BLOCKED; STAB-010.
Owner sign-off¶
☐ PENDING_OWNER — HR/Payroll PO + Finance + DPO
5. BOS (SC-BOS Pilot / W12)¶
Current code state¶
procurement_admin_api.py— state actions including approve.purchase_request.action_approve()— writesapprovedwithout enforced maker-checker in model.- Pilot allowlist / kill switch — product unsigned.
Unsigned gaps¶
| # | Gap | DEC |
|---|---|---|
| 1 | Requester vs approver vs budget owner SoD | DEC-004 |
| 2 | Self-approval on procurement/RKAS paths | DEC-004 |
| 3 | Budget line effective dates | DEC-008 |
| 4 | Attachment scan/type policy for procurement evidence | DEC-009 |
| 5 | Approval/commitment notification and failure recovery | DEC-010 |
Blocking RT-* IDs¶
All RT-W12-* BLOCKED; STAB-012.
Owner sign-off¶
☐ PENDING_OWNER — BOS/RKAS PO + Finance + Security
6. Library (SC-LIB / W14)¶
Current code state¶
library_return_workflow.py— waiver approve/close states.library_queue_return_api.py— queue assignment (concurrencySTAB-031open).library_p4_damage_loss_procurement.py— case approve with compensation amount.- Mixed NOT RUN / BLOCKED in matrix §3.
Unsigned gaps¶
| # | Gap | DEC |
|---|---|---|
| 1 | Fine waiver: librarian vs manager approver | DEC-004 |
| 2 | Damage/loss compensation approval authority | DEC-004 |
| 3 | Catalog copy ownership and delete policy | DEC-008 |
| 4 | Member borrowing history visibility | DEC-009 |
| 5 | Overdue/fine notification matrix | DEC-010 |
Blocking RT-* IDs¶
RT-W14-NEG-01, RT-W14-STA-01, RT-W14-IDM-01; STAB-031/032.
Owner sign-off¶
☐ PENDING_OWNER — Library SME + Security
7. Report (SC-REPORT / W07)¶
Current code state¶
report_card_api.py— homeroom/principal approve metadata exposed.student_promotion.py— finalize guards (action_finalize_principal).- W07 BLOCKED — no
w07_runtime_certify.py; CTRL-003/004 open.
Unsigned gaps¶
| # | Gap | DEC |
|---|---|---|
| 1 | Teacher enter vs homeroom review vs principal finalize — SoD | DEC-004 |
| 2 | Grade lock after submit; who may unlock/correct | DEC-004 / DEC-007 |
| 3 | Grade source ownership (standalone vs LMS bridge) | DEC-008 |
| 4 | Report card PDF sensitive field set | DEC-009 |
| 5 | Publish/release notification to parent/student | DEC-010 |
Blocking RT-* IDs¶
All RT-W07-* BLOCKED; STAB-009 (promotion guard).
Owner sign-off¶
☐ PENDING_OWNER — Academic/Report PO + School SME
8. Opname (SC-OPS / W13 and library stock-opname)¶
Current code state¶
- W13 SC-OPS: PKG-OPS-W13 — matrix §7.8; freeze/post/concurrency decisions open; no certify harness.
- Library opname:
library_stockopname_api.py— list/create/start/scan/review routes underlibrary.circulation.manage; modelop.stock.opname. - Inventory module fragment exists (
scola_inventorysecurity rules); full W13 product surface not isolated in this audit pass.
Unsigned gaps¶
| # | Gap | DEC |
|---|---|---|
| 1 | Counter vs reviewer vs poster roles; maker-as-poster denial | DEC-004 |
| 2 | Session freeze and late-edit policy | DEC-004 / DEC-007 |
| 3 | Stale snapshot / recount rules | DEC-008 |
| 4 | Variance amount visibility | DEC-009 |
| 5 | Post-adjustment notification to inventory leadership | DEC-010 |
| 6 | SC-FIN valuation / SC-BOS procurement bridge ownership | DEC-004 + STAB-024 |
Blocking RT-* IDs¶
All RT-W13-* BLOCKED or NOT RUN; library opname rows overlap W14 inventory tests.
Owner sign-off¶
☐ PENDING_OWNER — Operations/Inventory PO + Finance (valuation) + Security
Cross-reference — related unsigned decisions¶
| Decision | Domains most affected | Register |
|---|---|---|
| DEC-008 | Fees, Admissions, Finance, BOS, Library, Report, Opname | 08 §DEC |
| DEC-009 | Fees, Admissions, Payroll, BOS, Library, Report, Messaging (W18) | 08 §DEC |
| DEC-010 | Fees, Admissions, Finance, Library, Report, Attendance (W05 daily), RFID (W20) | 08 §DEC |
Engineering stop rule¶
Per 10-implementation-roadmap.md §11: if product owner is unavailable for DEC-004 domain signing, stop optional wave certification for that domain. Do not mark matrix rows PASS or APPROVED without explicit owner checkbox above.