Lewati ke isi

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)

  1. installed ≠ entitled ≠ visible — modul terpasang atau feature flag hidup tidak otomatis membuka menu/route; entitlement + capability + scope wajib.
  2. Internal / platform isolation — shell platform dan addon internal (scola_platform_support, observability, bridges) tidak boleh masuk navigasi sekolah biasa.
  3. Mobile / desktop same visibility contractmobile.bottomRank / launcher / quickAccess hanya penempatan UX; gate capability/featureFlag harus sama dengan desktop.
  4. Fail closed — surface Core yang dilindungi tanpa capability / capabilityKey / meta.capability dianggap gagal kontrak (bukan “public by omission”).
  5. DEC-003 — action hanya dari kosakata kanonis; scope harus eksplisit di kontrak route (FE metadata membantu UX; BE registry + resolver + ACL tetap otoritatif).
  6. 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/eventscommunication.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.