T1-A Capability Parity — Menu / Route / DEC-003 / API Registry¶
| Item | Nilai |
|---|---|
| Mode | Server development |
| Workspace root | /home/scola/odoo |
| Tanggal | 2026-08-10 |
| Workstream | T1-A Canonical Product Surface & Navigation Contract |
| Phase 0 | PASS (T1-A-preflight.md) |
| Surface inventory | T1-A-surface-inventory.json |
| Machine-readable twin | T1-A-capability-parity.json |
| Evidence extract | T1-A-evidence/_capability_parity_extract.json |
| Docs dibaca | docs/ai-guidelines/workspace-governance.md, T1-A-preflight.md, T0-E2-DEC-003-capability-taxonomy.md/.json, 01-product-contract.md (katalog Core), 10-implementation-roadmap.md (T1 units), cuplikan 02-information-architecture.md |
| Scope penulisan | Dokumentasi parity/residual saja — tidak mengubah application business logic |
1. Prinsip kontrak (berlaku untuk semua klasifikasi)¶
- installed ≠ entitled ≠ visible — modul terpasang atau feature flag hidup tidak otomatis membuka menu/route; entitlement + capability + scope wajib.
- Internal / platform isolation — shell
platformdan addon internal (scola_platform_support, observability, bridges) tidak boleh masuk navigasi sekolah biasa. - Mobile / desktop same visibility contract —
mobile.bottomRank/launcher/quickAccesshanya penempatan UX; gate capability/featureFlag harus sama dengan desktop. - Fail closed — surface Core yang dilindungi tanpa
capability/capabilityKey/meta.capabilitydianggap gagal kontrak (bukan “public by omission”). - DEC-003 — action hanya dari kosakata kanonis; scope harus eksplisit di kontrak route (FE metadata membantu UX; BE registry + resolver + ACL tetap otoritatif).
- Temuan T0 tidak diganti ulang di sini; dokumen ini hanya memetakan parity navigasi untuk T1-B/T1-C.
2. Ringkasan kuantitatif (live FE tree = certified app tree)¶
| Metric | Nilai |
|---|---|
| Apps / sections / leaves | 36 / 143 / 529 |
Leaf tanpa capabilityKey eksplisit pada mirror /calendar |
0 (ditutup T1-A follow-up: communication.calendar.view pada teacher/student/parent + router meta) |
| Unique capability string di menu | 239 |
Unique capability string di API_ROUTE_ACCESS_RULES (FE mirror BE) |
145 |
| Menu capability yang tidak muncul exact di API registry | 138 (mayoritas optional/domain leaf; tidak otomatis = bug Core) |
| Menu action di luar kosakata DEC-003 | 18 string (mis. edit, config, sync, sit, verify) |
Sumber ekstraksi: src/config/apps/index.js → fragments; src/access/apiRouteAccessRegistry.js (API_ROUTE_ACCESS_RULES); pola BE custom_addons_scola/gcgscola/scola_platform_support/api_route_access.py.
3. Klasifikasi¶
| Kode | Arti singkat |
|---|---|
PARITY |
Menu, route meta, dan kontrak API/DEC-003 selaras untuk aksi baca navigasi yang diuji |
FE_TOO_BROAD |
FE membuka/mengizinkan lebih longgar dari DEC-003 atau BE |
FE_TOO_NARROW |
FE menyembunyikan/menolak lebih ketat dari kontrak yang berhak |
MISSING_FE_CAPABILITY |
Surface dilindungi tanpa capability di menu dan/atau router |
MISSING_BE_CONTRACT |
Capability dipakai FE tetapi tidak punya binding route registry BE yang selaras |
ACTION_MISMATCH |
Action string / CTA tidak selaras antar lapisan atau di luar kosakata DEC-003 |
SCOPE_MISMATCH |
Scope role/package/app vs leaf tidak selaras |
DECISION_REQUIRED |
Shell/SKU/package belum diputus Product; tetap fail-closed sampai keputusan |
4. Fokus CORE navigation leaves¶
Canonical entries dari 01-product-contract.md SC-CORE: dashboards, /students, /schedule, /attendance/home, /news, /calendar, /settings/company, /admin/users (+ /academic-year sebagai master akademik terkait).
| Surface | Menu capability | Router meta.capability |
API registry (FE=BE pattern) | DEC-003 notes | Classification | Residual owner |
|---|---|---|---|---|---|---|
Admin dashboard /admin/dashboard |
dashboard.operations.view |
sama | /api/v1/admin/dashboard/ → dashboard.operations.view |
view kanonis; scope company |
PARITY (path admin khusus) | — |
Shared stats /api/dashboard/stats (dipakai dashboard) |
n/a (bukan leaf) | n/a | users.profile.view |
terlalu generik vs dashboard role | FE_TOO_BROAD pada kontrak API bersama | T1-B registry tighten |
Teacher home /faculty/home → /faculty/dashboard |
academics.dashboard.view |
academics.dashboard.view |
tidak ada entry exact; stats pakai users.profile.view |
view ok; binding API lemah |
MISSING_BE_CONTRACT (+ alias home di residual IA) | T1-B / T1-U01 |
Student dashboard /student/dashboard |
students.dashboard.view |
sama | tidak exact di registry | view + scope self diharapkan |
MISSING_BE_CONTRACT | T1-B |
Parent dashboard /parent/dashboard |
menu parents.dashboard.view |
parents.dashboard.view |
portal API lain masih parents.portal.view |
home leaf↔router PARITY (T1-A); shell app tetap parents.portal.view |
PARITY (home) | T1-B optional shell rename |
Students /students |
students.list.view |
sama | /api/v1/core/students/search, admin-staff list → students.list.view |
view/list domain students |
PARITY (read list) | W02 create/import = residual workflow |
Schedule /schedule |
academics.schedule.view |
sama | sessions/LMS calendar paths → academics.schedule.view |
view kanonis |
PARITY (read) | W01 mutation residual |
Attendance home /attendance/home |
students.attendance.view |
sama | /api/v1/attendance/{student,parent,admin,analytics,principal}/ → students.attendance.view |
view ok untuk hub read |
PARITY (hub read) | W05 write = residual |
| Attendance app shell capability | app-level settings.attendance.view vs leaf hub students.attendance.view |
— | settings.attendance.view tidak di API registry |
app gate ≠ leaf gate | SCOPE_MISMATCH | T1-B |
Attendance allowedRoles portal |
mencakup pickup_officer, lab_technician, dll. |
attendanceRoutes.js |
pickup punya path/capability sendiri | role list melebar ke shell undecided/incomplete | FE_TOO_BROAD / DECISION_REQUIRED | T1-C + Product |
| Attendance daily/pickup leaves | students.attendance.edit |
edit paths | transport → students.dropoff.execute; hub view terpisah |
action edit bukan kosakata DEC-003 (update) |
ACTION_MISMATCH | T1-B + W05 |
News /news |
communication.news.view |
sama | announcements/news API → communication.news.view |
view kanonis |
PARITY | manage/publish residual |
Calendar /calendar (communication canonical) |
communication.calendar.view |
communication.calendar.view (T1-A) |
/api/v1/calendar/events → communication.calendar.view |
menu+router+API selaras | PARITY | — |
| Calendar mirror teacher/student/parent | communication.calendar.view (T1-A) |
sama route /calendar |
BE communication.calendar.view |
fail-open ditutup | PARITY | — |
Settings company /settings/company |
settings.school.view |
sama | /api/v1/settings/company/ → settings.school.view |
view/configure boundary masih longgar di beberapa sibling leaf |
PARITY (leaf company) | sibling settings residual |
Users /admin/users |
users.manage |
sama | /api/v1/users, /api/v1/admin/accounts/ → users.manage |
manage terikat resource users; bukan wildcard domain lain |
PARITY (navigasi) | credential DEC-014 residual di T0, bukan diulang |
4.1 Protected Core without capability = fail closed¶
Satu pelanggaran hard Core (mirror /calendar tanpa capability + router tanpa meta.capability) ditutup di T1-A follow-up. Parent home leaf sekarang memakai parents.dashboard.view selaras router; string shell parents.portal.view tetap residual kosmetik T1-B.
5. Sampling singkat package opsional / non-Core¶
| Shell / sample | Status produk (01-contract) | Observasi parity singkat | Classification |
|---|---|---|---|
admissions |
OPTIONAL_SUPPORTED | Leaf ber-featureFlag/capability; sebagian capability menu belum exact di API registry |
Deferred package certification; bukan Core PARITY claim |
finance / hr / inventory / library / counselor |
OPTIONAL_SUPPORTED | Banyak capability menu FE-only (ux gate); sertifikasi workflow terpisah | Sample only — bukan Core certified |
bos-admin / dapodik-operator |
CONTROLLED_PILOT | Harus entitlement+capability; jangan naik ke Core nav | Pilot residual |
platform |
INTERNAL_PLATFORM | Isolasi wajib dari ROLE_APPS sekolah | Isolation check residual T1-C |
analytics |
LEGACY_DEPRECATED | Shortcut/redirect bersaing dengan domain owner | Legacy retirement residual |
lab-technician |
INCOMPLETE_REMOVE | Placeholder/stub pages; capability lab.* mayoritas tidak di API registry |
Remove residual |
security-officer |
DECISION_REQUIRED | API visitor ada (security.visitor.manage) tetapi tanpa SKU/package owner |
DECISION_REQUIRED |
school-committee |
DECISION_REQUIRED | Memakai Core news capability tanpa package owner | DECISION_REQUIRED |
dpo |
DECISION_REQUIRED | Role compliance tanpa kontrak produk/retensi | DECISION_REQUIRED |
pickup-officer |
DECISION_REQUIRED | students.dropoff.execute terdaftar API; bukan W05; privacy/package terbuka |
DECISION_REQUIRED |
| Mixed portal sections (teacher/student/parent optional leaves) | Mixed Core+optional | Leaf optional harus hilang jika tidak entitled; jangan empty group menyesatkan | SCOPE_MISMATCH residual T1-C |
6. Action vocabulary drift (DEC-003)¶
Contoh string menu yang action-tail-nya di luar kosakata formal DEC-003 (bukan semua = Core blocker; semuanya residual normalisasi T1-B):
students.attendance.edit, *.config (seharusnya configure), report_cards.dapodik.sync, academics.cbt_exams.sit, finance.billing.verify, finance.billing.receive_cash, finance.payment.setup, foundation.finance.budget.monitor, accounting.bank.reconcile, …
7. Verdict navigasi capability (T1-A docs gate)¶
| Area | Verdict |
|---|---|
| Core read leaves dengan triad menu↔router↔API exact | Sebagian PARITY (students, schedule read, news view, settings/company, admin/users, admin dashboard path) |
| Hard fail-closed gap | Calendar fail-open ditutup T1-A (menu mirrors + router meta) |
| Binding dashboard portal | Teacher/student dashboard capability MISSING_BE_CONTRACT terhadap API stats generik |
| Parent home | PARITY home leaf↔router (parents.dashboard.view); shell parents.portal.view residual |
| Optional / undecided shells | Sampel dicatat; sertifikasi ditunda — jangan diangkat sebagai Core PARITY |
Backlog eksekusi: T1-A-navigation-residuals.md.