T0 final findings¶
| ID | Severity | Contract violated / questioned | Evidence | Impact | Required disposition |
|---|---|---|---|---|---|
| T0F-001 | S0 | Active-role isolation / AUTH-001 | student_admin_api.py, school_context_api.py, and identity-admin scope read global role/union groups; conflict-role tests absent |
Inactive role can widen tenant scope | Fix and live two-session conflict tests |
| T0F-002 | S0 | Direct protected authorization / AUTH-003 | B2-DIR-01 expected denial but created attachment [742]; runner ignores list success |
Claimed 39/39 evidence false; direct RPC boundary unproven | Define and enforce Scola RPC boundary; recertify |
| T0F-003 | S0 | Immutable evidence / T0-U04 | Validator accepts arbitrary descendants as docs/tooling and hashes old source; controlled app descendant passed; current run fails | Different application source can certify PASS | Redesign validator and recertify served FE/BE/DB |
| T0F-004 | S0 | Entitlement != installation / U06/QG14 | Leadership routes feature_flag=None; live optional HR/finance data returned with flags false |
Installed but unentitled actor/data exposure | Gate or remove routes; mixed-install proof |
| T0F-005 | S0 | Credential tenant isolation / DEC-014 | Bulk parent reset browses caller IDs as SUPERUSER, returns password, no tenant scope/revoke/audit | Cross-tenant reset path | Remove alternate path; authorized GT-T1→GT-T2 test |
| T0F-006 | S0 | Credential creation / DEC-014 | /api/v1/users accepts arbitrary nonempty admin password, active user, no must-change; historical migration/provision scripts use predictable passwords |
Alternate credential policy and reachable defaults | Canonicalize lifecycle; remove/rotate defaults; prove no active reuse |
| T0F-007 | S0 | Must-change enforcement | Backend only returns must_change_password; FE modal is the gate |
Must-change account can call protected APIs | Enforce server-side and test direct API |
| T0F-008 | S0 | Public credential boundary / DEC-014 | auth_signup.reset_password=True; /web/reset_password 200; missing login response says “No account found…” |
Native reset path bypasses Scola audit/contract and enumerates | Disable or integrate and recertify |
| T0F-009 | S1 | Token/session/audit reliability | Token check/write has no concurrency lock; revoke/audit helpers swallow failures | Recovery can be non-atomic/unattributed | Add atomic tests and fail-closed behavior |
| T0F-010 | S1 | U05 suite separation | ADM selector includes Assess and Fees bridge tests; scripts/manifests disagree | Package evidence is contaminated | Separate selectors/manifests and rerun |
| T0F-011 | S1 | Topology CI | CI evaluates only Core; missing baseline auto-passes; modular unit 7/44 failed | Optional peer drift can pass CI | Validate every candidate bundle and fail missing baseline |
| T0F-012 | S1 | Product/decision closure | Product contract and DEC-014 signatures blank; leadership/bridge classifications changed in code | T1 would build on unapproved boundary | Obtain explicit approvals or restore decision-required status |
| T0F-013 | S1 | Route coverage | Denominator checker is not in CI; SPMB public prefix classifies authenticated descendants public | Registry/capability bypass | Correct matcher, wire CI, retest |
| T0F-014 | S1 | Credential evidence denominator | 11/11 omits successful reset/change, cross-tenant reset, deactivate-session, activation, must-change, concurrency, audit | Closure claim unsupported | Expand runtime matrix with immutable identity |
| T0F-015 | S0 | Core tenant isolation evidence | B2 mutation used disallowed op.student and hashes fabricated responses |
No valid cross-tenant mutation proof | Run real read/list/relation/mutation/attachment/mail probes |
The findings are independent of prior CLOSED/PASS/CERTIFIED labels. No application fix was made in this audit.