T0-A.1 Result — Platform Authorization Closure¶
| Item | Value |
|---|---|
| Mode | Server development |
| Workspace | /home/scola/odoo |
| Scope | AUTH-004 completeness/fail-closed; method/action resolver foundation; Core mutation sanity; inventory dimensions; active-role concurrency decision; QC |
| Out of scope | T0-B Golden Tenant; W01/W02/W05; nav redesign; optional-domain capability migration |
| Docs read | development-guide.md, workspace-governance.md, architecture-api.md, T0-A-*, 04/08/09/10 release-readiness |
| Completed (UTC) | 2026-08-08 |
Exact FE/BE tree state¶
| Repo | Branch | Base HEAD (unchanged) | Working tree |
|---|---|---|---|
scola-fe-v2 |
develop |
b48ca63859d3d822f22572dc76a08afbe4f2f653 |
dirty — T0-A + T0-A.1 ready to commit |
custom_addons_scola/gcgscola |
main |
2ff6ac7cb41810bbc3b66821cdad004b52d1658a |
dirty — T0-A + T0-A.1 ready to commit |
Commit SHAs (reconciled T0-B1 preflight):
| Repo | Branch | SHA |
|---|---|---|
| FE | develop |
d46fea0adcc9f08d54d716f082d82a8b79f5bbe7 |
| BE | main |
50e904e2a12c238d1d78199a1325af85b8f1a134 |
Earlier draft text claiming “no commit was created” is obsolete after the explicit commit/push of T0-A/T0-A.1.
Unrelated exclude: docs/recon/template_upload_siswa_SD REJIS Kelas 1.xlsx.
Files changed (T0-A + T0-A.1 logical checkpoint)¶
Frontend¶
docs/release-readiness/04-authorization-readiness.mddocs/release-readiness/08-stabilization-backlog.mddocs/release-readiness/execution/(T0-A + T0-A.1 artifacts)src/access/accessContract.jssrc/access/apiRouteAccessRegistry.js(contract v5, public allowlist, method/action resolve)src/config/capabilityFragments/{peoplePortal,communication}Capabilities.jssrc/config/roleFragments/*.js(users.attachments.create; pendaftar excluded)src/stores/auth.store.jstests/unit/access/feBackendApiRouteAccessParity.spec.js
Backend¶
scola_core/controllers/auth.pyscola_core/controllers/core_reference_api.pyscola_core/models/ir_http.py(fail-closed + method/action)scola_core/services/auth_capabilities.py(users.attachments.create)scola_core/services/mail_tracking_access.py(T0-A)scola_core/tests/test_*(active-role, auth capabilities/payload, mail-tracking)scola_platform_support/api_route_access.py(v5 allowlists, method/action, classify)scola_platform_support/api_route_surface.py(new extractor)scola_platform_support/tests/test_api_route_access_unit.pyscola_platform_support/tests/test_api_route_auth004_unit.py(new)scripts/modular/api_route_surface_coverage_check.py(new CI gate)
Route extraction totals¶
| Metric | Count |
|---|---|
Extracted /api/* controller routes |
1712 |
PROTECTED_REGISTERED |
1675 |
PUBLIC_EXPLICIT |
34 |
INTERNAL_NOT_USER_FACING |
3 |
LEGACY_OR_DISABLED |
0 |
UNREGISTERED_PROTECTED_BLOCKER |
0 |
| Registry rule rows | 427 |
| Public allowlist entries | 16 |
| Internal allowlist entries | 5 |
Full report: T0-A1-route-coverage.md.
Core mutation audit summary¶
| Classification | Items |
|---|---|
CORRECT_ATOMIC_CAPABILITY |
/api/v1/core/attachments/create → users.attachments.create (fixed) |
TRANSITIONAL_MUTATION_CAPABILITY |
change-password, switch-role, notification-config/save, profile path-level |
CONTROLLER_HAS_STRONGER_DOMAIN_GUARD |
mail-tracking list; attachment model allowlist (secondary) |
BLOCKER_BEFORE_T0_B (product use) |
/api/complaint* registered but capability not granted (STAB-001 containment) |
DEFER_TO_NAMED_DOMAIN_TRANCHE |
optional domains (not migrated) |
Detail: T0-A1-core-mutation-audit.md.
QC results (static/unit — no runtime PASS)¶
| Check | Result |
|---|---|
test_active_role_enforcement_unit.py |
PASS (12) |
test_auth_capabilities_unit.py |
PASS (73) |
test_auth_payload_contract_unit.py |
PASS (6) |
test_mail_tracking_access_unit.py |
PASS (10) |
test_api_route_access_unit.py |
PASS (53) |
test_api_route_auth004_unit.py |
PASS (20) |
api_route_surface_coverage_check.py |
PASS (0 blockers) |
validate_api_route_access_registry() |
PASS (0 issues) |
| FE/BE registry parity vitest | PASS (5) |
check:capability-diff |
PASS |
lint:diff |
PASS (no JS/Vue lint delta issues) |
type-check |
PASS |
Relevant py_compile |
PASS |
No required test skipped. Runtime-only cases remain pending.
PASS / FAIL / PENDING counts¶
| Bucket | Count / notes |
|---|---|
| PASS (static/unit) | All listed QC suites above |
| FAIL | 0 |
| PENDING T0-B RUNTIME CERTIFICATION | STAB-005/007/008 acceptance; AUTH-004 live denial crawl; AUTH-014; Golden Tenant multi-session / active-role matrix |
STAB / AUTH status deltas¶
| ID | After T0-A | After T0-A.1 |
|---|---|---|
| STAB-005 | Code fixed, runtime pending | unchanged (not Closed) |
| STAB-007 | Code fixed, runtime pending | unchanged; concurrency decision OPEN → entry gate |
| STAB-008 | Code fixed, runtime pending | strengthened (method/action + extractor CI); still runtime pending / not Closed |
| AUTH-001 | Code fixed, runtime pending | unchanged (+ session decision gate) |
| AUTH-003 | Code fixed, runtime pending | method/action foundation added; still runtime pending |
| AUTH-004 | Partial | Code fixed, runtime verification pending |
| AUTH-002 | Open | Open (platform capable; domain migration deferred) |
Remaining risks (adversarial)¶
- Method confusion: legacy path-only resolve still matches unconstrained rules; constrained rules win when method/action supplied. Callers must pass method for disambiguation on dual-method families.
- Read→mutate: Core attachment create fixed; many domain
/savestill transitional.view/.manage— deferred, not falsely closed. - Active-role leakage: user-global
scola_rolelast-write-wins across sessions — documented; not silently “fixed.” - Stale FE authority: FE cache can lag; BE remains authoritative.
- Cross-company: not certified here (AUTH-005).
- Raw RPC / controller bypass: framework/non-enforcement namespaces remain OUT_OF_SCOPE by design; enforcement prefixes are explicit.
- False-green coverage: denominator is full extracted
/api/*controllers (1712), not shrunk; classification never treats missing registry as public.
T0-B entry requirements¶
- Golden Tenant fixtures + runtime matrix for STAB-005/007/008.
- Live crawl: unregistered protected fixture denied; public login/session/logout per contract.
- Honor T0-A1-active-role-session-decision.md: test interim A unless DEC closes on B.
- Do not treat registry presence as scope/correctness proof.
- Do not start optional-domain migrations inside T0-B auth certification unless separately scoped.
Checkpoint readiness (no commit created)¶
Required commit boundary¶
FE → develop (exclude xlsx recon):
docs/release-readiness/**
src/access/**
src/config/capabilityFragments/**
src/config/roleFragments/**
src/stores/auth.store.js
tests/unit/access/feBackendApiRouteAccessParity.spec.js
Suggested message: fix(auth): T0-A/T0-A.1 platform authorization closure
BE → main:
scola_core/controllers/auth.py
scola_core/controllers/core_reference_api.py
scola_core/models/ir_http.py
scola_core/services/auth_capabilities.py
scola_core/services/mail_tracking_access.py
scola_core/tests/test_active_role_enforcement_unit.py
scola_core/tests/test_auth_capabilities_unit.py
scola_core/tests/test_auth_payload_contract_unit.py
scola_core/tests/test_mail_tracking_access_unit.py
scola_platform_support/api_route_access.py
scola_platform_support/api_route_surface.py
scola_platform_support/tests/test_api_route_access_unit.py
scola_platform_support/tests/test_api_route_auth004_unit.py
scripts/modular/api_route_surface_coverage_check.py
Suggested message: fix(auth): T0-A/T0-A.1 fail-closed routes and method-aware registry
After commit, record SHAs here:
| Repo | Commit SHA |
|---|---|
| FE | 59bdbf92db2da8a6c7c766727a720fb4ca2fa546 |
| BE | pending user-approved commit |
T0-A.1 exit checklist¶
| Exit criterion | Met? |
|---|---|
| Zero unknown user-facing protected routes silently bypass capability policy | Yes (fail-closed + 0 blockers) |
| Extractor vs registry gap machine-visible and CI-gated | Yes |
| Resolver supports method/action-aware rules | Yes (v5; backward-compatible path rules) |
| Obvious Core mutation/read contradictions fixed or deferred/blocked | Yes |
| Active-role concurrency decision/gate documented | Yes (OPEN → B recommended; interim A) |
| T0-A security suites green | Yes |
| Runtime-only evidence explicitly pending | Yes |
| STAB-005/007/008 fully Closed | No — correctly remain runtime-pending |