authz.lock: fastapi-todos@c059889: pr-mut-update-skip-category-check.v1

Verdict: FAIL · 2 new invariant violations · 3 widened cells · 3 changed cells

probes693
probe time (s)96.0
coverage17/20 operations
never green (unprobed)DELETE /users/{id}, POST /auth/reset-password, POST /auth/verify
harnessvalid
appfastapi-todos@c059889
expectedFAIL
whatPUT /todos/{id}: category validation replaced by a duplicates-only check (FK is 'enough')
regression testproven (JUnit: passes on base, AssertionError on head)
proof LLM cost$0.073 (20 calls, 3 prove runs in Nebius Sandboxes, 302.2 s)

Invariant violations introduced by this PR

rulecell (op | identity | target | variant)detail
I1 read-isolationPUT /todos/{todo_id} | user_a | user_a | foreign_refuser_a received data owned by user_b
I1 read-isolationPUT /todos/{todo_id} | user_b | user_b | foreign_refuser_b received data owned by user_a

Access widened (lockfile diff)

cellbasehead
PUT /todos/{todo_id} | superuser | superuser | foreign_refDENY 400 leaks=- db=- count=NoneALLOW 200 leaks=['user_b'] db=['delete:todo_category:self', 'insert:todo_category:self', 'update:todo:self'] count=None
PUT /todos/{todo_id} | user_a | user_a | foreign_refDENY 400 leaks=- db=- count=NoneALLOW 200 leaks=['user_b'] db=['delete:todo_category:self', 'insert:todo_category:self', 'update:todo:self'] count=None
PUT /todos/{todo_id} | user_b | user_b | foreign_refDENY 400 leaks=- db=- count=NoneALLOW 200 leaks=['user_a'] db=['delete:todo_category:self', 'insert:todo_category:self', 'update:todo:self'] count=None

Identity × operation

PASS = no invariant violation in any probe of that pair; FAIL = at least one new violation; CHANGED = widened vs base without a violation. Letters: A=ALLOW D=DENY I=INCONCLUSIVE probe counts. Expand a cell for per-probe evidence (status, leaked canary owners, DB row changes with owner attribution); request/response bodies are not stored in the lock, and tokens/passwords are redacted.

operationalg_noneanonymousdeleted_userexpiredforged_siginactivesuperuseruser_auser_b
DELETE /categories/{category_id}
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
sharedbaseDENY 401--None
superuserbaseDENY 401--None
user_abaseDENY 401--None
user_bbaseDENY 401--None
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
sharedbaseDENY 401--None
superuserbaseDENY 401--None
user_abaseDENY 401--None
user_bbaseDENY 401--None
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
sharedbaseDENY 401--None
superuserbaseDENY 401--None
user_abaseDENY 401--None
user_bbaseDENY 401--None
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
sharedbaseDENY 401--None
superuserbaseDENY 401--None
user_abaseDENY 401--None
user_bbaseDENY 401--None
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
sharedbaseDENY 401--None
superuserbaseDENY 401--None
user_abaseDENY 401--None
user_bbaseDENY 401--None
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
sharedbaseDENY 401--None
superuserbaseDENY 401--None
user_abaseDENY 401--None
user_bbaseDENY 401--None
PASS A1 D4
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 404--None
sharedbaseDENY 403--None
superuserbaseALLOW 204-delete:category:self, delete:todo_category:self, delete:todo_category:selfNone
user_abaseDENY 403--None
user_bbaseDENY 403--None
PASS A1 D4
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 404--None
sharedbaseDENY 403--None
superuserbaseDENY 403--None
user_abaseALLOW 204-delete:category:self, delete:todo_category:self, delete:todo_category:self, delete:todo_category:self, delete:todo_category:self, delete:todo_category:self, delete:todo_category:self, delete:todo_category:selfNone
user_bbaseDENY 403--None
PASS A1 D4
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 404--None
sharedbaseDENY 403--None
superuserbaseDENY 403--None
user_abaseDENY 403--None
user_bbaseALLOW 204-delete:category:self, delete:todo_category:self, delete:todo_category:self, delete:todo_category:selfNone
DELETE /todos/{todo_id}
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
sharedbaseDENY 401--None
superuserbaseDENY 401--None
user_abaseDENY 401--None
user_bbaseDENY 401--None
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
sharedbaseDENY 401--None
superuserbaseDENY 401--None
user_abaseDENY 401--None
user_bbaseDENY 401--None
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
sharedbaseDENY 401--None
superuserbaseDENY 401--None
user_abaseDENY 401--None
user_bbaseDENY 401--None
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
sharedbaseDENY 401--None
superuserbaseDENY 401--None
user_abaseDENY 401--None
user_bbaseDENY 401--None
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
sharedbaseDENY 401--None
superuserbaseDENY 401--None
user_abaseDENY 401--None
user_bbaseDENY 401--None
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
sharedbaseDENY 401--None
superuserbaseDENY 401--None
user_abaseDENY 401--None
user_bbaseDENY 401--None
PASS A1 D4
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 404--None
sharedbaseDENY 404--None
superuserbaseALLOW 204-delete:todo:self, delete:todo_category:selfNone
user_abaseDENY 403--None
user_bbaseDENY 403--None
PASS A1 D4
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 404--None
sharedbaseDENY 404--None
superuserbaseDENY 403--None
user_abaseALLOW 204-delete:todo:self, delete:todo_category:selfNone
user_bbaseDENY 403--None
PASS A1 D4
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 404--None
sharedbaseDENY 404--None
superuserbaseDENY 403--None
user_abaseDENY 403--None
user_bbaseALLOW 204-delete:todo:self, delete:todo_category:selfNone
DELETE /users/{id}
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
sharedbaseDENY 401--None
superuserbaseDENY 401--None
user_abaseDENY 401--None
user_bbaseDENY 401--None
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
sharedbaseDENY 401--None
superuserbaseDENY 401--None
user_abaseDENY 401--None
user_bbaseDENY 401--None
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
sharedbaseDENY 401--None
superuserbaseDENY 401--None
user_abaseDENY 401--None
user_bbaseDENY 401--None
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
sharedbaseDENY 401--None
superuserbaseDENY 401--None
user_abaseDENY 401--None
user_bbaseDENY 401--None
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
sharedbaseDENY 401--None
superuserbaseDENY 401--None
user_abaseDENY 401--None
user_bbaseDENY 401--None
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
sharedbaseDENY 401--None
superuserbaseDENY 401--None
user_abaseDENY 401--None
user_bbaseDENY 401--None
PASS D2 I3
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 404--None
sharedbaseDENY 404--None
superuserbaseINCONCLUSIVE 500--None
user_abaseINCONCLUSIVE 500--None
user_bbaseINCONCLUSIVE 500--None
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 403--None
sharedbaseDENY 403--None
superuserbaseDENY 403--None
user_abaseDENY 403--None
user_bbaseDENY 403--None
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 403--None
sharedbaseDENY 403--None
superuserbaseDENY 403--None
user_abaseDENY 403--None
user_bbaseDENY 403--None
GET /categories
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS A1
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 200self-None
PASS A1
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 200self-None
PASS A1
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 200self-None
GET /priorities
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS A1
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 200--None
PASS A1
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 200--None
PASS A1
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 200--None
GET /todos
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS A1
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 200self-None
PASS A1
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 200self-None
PASS A1
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 200self-None
GET /users/me
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS A1
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 200self-None
PASS A1
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 200self-None
PASS A1
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 200self-None
GET /users/{id}
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
sharedbaseDENY 401--None
superuserbaseDENY 401--None
user_abaseDENY 401--None
user_bbaseDENY 401--None
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
sharedbaseDENY 401--None
superuserbaseDENY 401--None
user_abaseDENY 401--None
user_bbaseDENY 401--None
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
sharedbaseDENY 401--None
superuserbaseDENY 401--None
user_abaseDENY 401--None
user_bbaseDENY 401--None
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
sharedbaseDENY 401--None
superuserbaseDENY 401--None
user_abaseDENY 401--None
user_bbaseDENY 401--None
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
sharedbaseDENY 401--None
superuserbaseDENY 401--None
user_abaseDENY 401--None
user_bbaseDENY 401--None
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
sharedbaseDENY 401--None
superuserbaseDENY 401--None
user_abaseDENY 401--None
user_bbaseDENY 401--None
PASS A3 D2
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 404--None
sharedbaseDENY 404--None
superuserbaseALLOW 200self-None
user_abaseALLOW 200user_a-None
user_bbaseALLOW 200user_b-None
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 403--None
sharedbaseDENY 403--None
superuserbaseDENY 403--None
user_abaseDENY 403--None
user_bbaseDENY 403--None
PASS D5
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 403--None
sharedbaseDENY 403--None
superuserbaseDENY 403--None
user_abaseDENY 403--None
user_bbaseDENY 403--None
PATCH /users/me
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
-hostileDENY 401--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
-hostileDENY 401--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
-hostileDENY 401--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
-hostileDENY 401--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
-hostileDENY 401--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
-hostileDENY 401--None
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 200selfupdate:user:selfNone
-hostileALLOW 200selfupdate:user:selfNone
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 200selfupdate:user:selfNone
-hostileALLOW 200selfupdate:user:selfNone
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 200selfupdate:user:selfNone
-hostileALLOW 200selfupdate:user:selfNone
PATCH /users/{id}
PASS D10
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
nonexistenthostileDENY 401--None
sharedbaseDENY 401--None
sharedhostileDENY 401--None
superuserbaseDENY 401--None
superuserhostileDENY 401--None
user_abaseDENY 401--None
user_ahostileDENY 401--None
user_bbaseDENY 401--None
user_bhostileDENY 401--None
PASS D10
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
nonexistenthostileDENY 401--None
sharedbaseDENY 401--None
sharedhostileDENY 401--None
superuserbaseDENY 401--None
superuserhostileDENY 401--None
user_abaseDENY 401--None
user_ahostileDENY 401--None
user_bbaseDENY 401--None
user_bhostileDENY 401--None
PASS D10
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
nonexistenthostileDENY 401--None
sharedbaseDENY 401--None
sharedhostileDENY 401--None
superuserbaseDENY 401--None
superuserhostileDENY 401--None
user_abaseDENY 401--None
user_ahostileDENY 401--None
user_bbaseDENY 401--None
user_bhostileDENY 401--None
PASS D10
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
nonexistenthostileDENY 401--None
sharedbaseDENY 401--None
sharedhostileDENY 401--None
superuserbaseDENY 401--None
superuserhostileDENY 401--None
user_abaseDENY 401--None
user_ahostileDENY 401--None
user_bbaseDENY 401--None
user_bhostileDENY 401--None
PASS D10
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
nonexistenthostileDENY 401--None
sharedbaseDENY 401--None
sharedhostileDENY 401--None
superuserbaseDENY 401--None
superuserhostileDENY 401--None
user_abaseDENY 401--None
user_ahostileDENY 401--None
user_bbaseDENY 401--None
user_bhostileDENY 401--None
PASS D10
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
nonexistenthostileDENY 401--None
sharedbaseDENY 401--None
sharedhostileDENY 401--None
superuserbaseDENY 401--None
superuserhostileDENY 401--None
user_abaseDENY 401--None
user_ahostileDENY 401--None
user_bbaseDENY 401--None
user_bhostileDENY 401--None
PASS A6 D4
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 404--None
nonexistenthostileDENY 404--None
sharedbaseDENY 404--None
sharedhostileDENY 404--None
superuserbaseALLOW 200selfupdate:user:selfNone
superuserhostileALLOW 200selfupdate:user:selfNone
user_abaseALLOW 200user_aupdate:user:user_aNone
user_ahostileALLOW 200user_aupdate:user:user_a[priv:is_superuser]None
user_bbaseALLOW 200user_bupdate:user:user_bNone
user_bhostileALLOW 200user_bupdate:user:user_b[priv:is_superuser]None
PASS D10
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 403--None
nonexistenthostileDENY 403--None
sharedbaseDENY 403--None
sharedhostileDENY 403--None
superuserbaseDENY 403--None
superuserhostileDENY 403--None
user_abaseDENY 403--None
user_ahostileDENY 403--None
user_bbaseDENY 403--None
user_bhostileDENY 403--None
PASS D10
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 403--None
nonexistenthostileDENY 403--None
sharedbaseDENY 403--None
sharedhostileDENY 403--None
superuserbaseDENY 403--None
superuserhostileDENY 403--None
user_abaseDENY 403--None
user_ahostileDENY 403--None
user_bbaseDENY 403--None
user_bhostileDENY 403--None
POST /auth/forgot-password
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 202--None
-hostileALLOW 202--None
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 202--None
-hostileALLOW 202--None
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 202--None
-hostileALLOW 202--None
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 202--None
-hostileALLOW 202--None
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 202--None
-hostileALLOW 202--None
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 202--None
-hostileALLOW 202--None
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 202--None
-hostileALLOW 202--None
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 202--None
-hostileALLOW 202--None
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 202--None
-hostileALLOW 202--None
POST /auth/login
PASS A3 D7
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentvalid_credsDENY 400--None
nonexistentwrong_passwordDENY 400--None
sharedvalid_credsDENY 400--None
sharedwrong_passwordDENY 400--None
superuservalid_credsALLOW 200--None
superuserwrong_passwordDENY 400--None
user_avalid_credsALLOW 200--None
user_awrong_passwordDENY 400--None
user_bvalid_credsALLOW 200--None
user_bwrong_passwordDENY 400--None
PASS A3 D7
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentvalid_credsDENY 400--None
nonexistentwrong_passwordDENY 400--None
sharedvalid_credsDENY 400--None
sharedwrong_passwordDENY 400--None
superuservalid_credsALLOW 200--None
superuserwrong_passwordDENY 400--None
user_avalid_credsALLOW 200--None
user_awrong_passwordDENY 400--None
user_bvalid_credsALLOW 200--None
user_bwrong_passwordDENY 400--None
PASS A3 D7
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentvalid_credsDENY 400--None
nonexistentwrong_passwordDENY 400--None
sharedvalid_credsDENY 400--None
sharedwrong_passwordDENY 400--None
superuservalid_credsALLOW 200--None
superuserwrong_passwordDENY 400--None
user_avalid_credsALLOW 200--None
user_awrong_passwordDENY 400--None
user_bvalid_credsALLOW 200--None
user_bwrong_passwordDENY 400--None
PASS A3 D7
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentvalid_credsDENY 400--None
nonexistentwrong_passwordDENY 400--None
sharedvalid_credsDENY 400--None
sharedwrong_passwordDENY 400--None
superuservalid_credsALLOW 200--None
superuserwrong_passwordDENY 400--None
user_avalid_credsALLOW 200--None
user_awrong_passwordDENY 400--None
user_bvalid_credsALLOW 200--None
user_bwrong_passwordDENY 400--None
PASS A3 D7
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentvalid_credsDENY 400--None
nonexistentwrong_passwordDENY 400--None
sharedvalid_credsDENY 400--None
sharedwrong_passwordDENY 400--None
superuservalid_credsALLOW 200--None
superuserwrong_passwordDENY 400--None
user_avalid_credsALLOW 200--None
user_awrong_passwordDENY 400--None
user_bvalid_credsALLOW 200--None
user_bwrong_passwordDENY 400--None
PASS A3 D7
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentvalid_credsDENY 400--None
nonexistentwrong_passwordDENY 400--None
sharedvalid_credsDENY 400--None
sharedwrong_passwordDENY 400--None
superuservalid_credsALLOW 200--None
superuserwrong_passwordDENY 400--None
user_avalid_credsALLOW 200--None
user_awrong_passwordDENY 400--None
user_bvalid_credsALLOW 200--None
user_bwrong_passwordDENY 400--None
PASS A3 D7
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentvalid_credsDENY 400--None
nonexistentwrong_passwordDENY 400--None
sharedvalid_credsDENY 400--None
sharedwrong_passwordDENY 400--None
superuservalid_credsALLOW 200--None
superuserwrong_passwordDENY 400--None
user_avalid_credsALLOW 200--None
user_awrong_passwordDENY 400--None
user_bvalid_credsALLOW 200--None
user_bwrong_passwordDENY 400--None
PASS A3 D7
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentvalid_credsDENY 400--None
nonexistentwrong_passwordDENY 400--None
sharedvalid_credsDENY 400--None
sharedwrong_passwordDENY 400--None
superuservalid_credsALLOW 200--None
superuserwrong_passwordDENY 400--None
user_avalid_credsALLOW 200--None
user_awrong_passwordDENY 400--None
user_bvalid_credsALLOW 200--None
user_bwrong_passwordDENY 400--None
PASS A3 D7
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentvalid_credsDENY 400--None
nonexistentwrong_passwordDENY 400--None
sharedvalid_credsDENY 400--None
sharedwrong_passwordDENY 400--None
superuservalid_credsALLOW 200--None
superuserwrong_passwordDENY 400--None
user_avalid_credsALLOW 200--None
user_awrong_passwordDENY 400--None
user_bvalid_credsALLOW 200--None
user_bwrong_passwordDENY 400--None
POST /auth/logout
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
PASS A1
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 200--None
PASS A1
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 200--None
PASS A1
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 200--None
POST /auth/register
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 201-insert:user:newNone
-hostileALLOW 201-insert:user:newNone
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 201-insert:user:newNone
-hostileALLOW 201-insert:user:newNone
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 201-insert:user:newNone
-hostileALLOW 201-insert:user:newNone
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 201-insert:user:newNone
-hostileALLOW 201-insert:user:newNone
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 201-insert:user:newNone
-hostileALLOW 201-insert:user:newNone
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 201-insert:user:newNone
-hostileALLOW 201-insert:user:newNone
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 201-insert:user:newNone
-hostileALLOW 201-insert:user:newNone
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 201-insert:user:newNone
-hostileALLOW 201-insert:user:newNone
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 201-insert:user:newNone
-hostileALLOW 201-insert:user:newNone
POST /auth/request-verify-token
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 202--None
-hostileALLOW 202--None
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 202--None
-hostileALLOW 202--None
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 202--None
-hostileALLOW 202--None
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 202--None
-hostileALLOW 202--None
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 202--None
-hostileALLOW 202--None
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 202--None
-hostileALLOW 202--None
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 202--None
-hostileALLOW 202--None
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 202--None
-hostileALLOW 202--None
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 202--None
-hostileALLOW 202--None
POST /auth/reset-password
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 400--None
-hostileDENY 400--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 400--None
-hostileDENY 400--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 400--None
-hostileDENY 400--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 400--None
-hostileDENY 400--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 400--None
-hostileDENY 400--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 400--None
-hostileDENY 400--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 400--None
-hostileDENY 400--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 400--None
-hostileDENY 400--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 400--None
-hostileDENY 400--None
POST /auth/verify
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 400--None
-hostileDENY 400--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 400--None
-hostileDENY 400--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 400--None
-hostileDENY 400--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 400--None
-hostileDENY 400--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 400--None
-hostileDENY 400--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 400--None
-hostileDENY 400--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 400--None
-hostileDENY 400--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 400--None
-hostileDENY 400--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 400--None
-hostileDENY 400--None
POST /categories
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
-hostileDENY 401--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
-hostileDENY 401--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
-hostileDENY 401--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
-hostileDENY 401--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
-hostileDENY 401--None
PASS D2
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
-hostileDENY 401--None
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 201-insert:category:selfNone
-hostileALLOW 201-insert:category:selfNone
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 201-insert:category:selfNone
-hostileALLOW 201-insert:category:selfNone
PASS A2
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 201-insert:category:selfNone
-hostileALLOW 201-insert:category:selfNone
POST /todos
PASS D3
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
-foreign_refDENY 401--None
-hostileDENY 401--None
PASS D3
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
-foreign_refDENY 401--None
-hostileDENY 401--None
PASS D3
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
-foreign_refDENY 401--None
-hostileDENY 401--None
PASS D3
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
-foreign_refDENY 401--None
-hostileDENY 401--None
PASS D3
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
-foreign_refDENY 401--None
-hostileDENY 401--None
PASS D3
targetvariantdecisionleaked canariesDB changescountviolation
-baseDENY 401--None
-foreign_refDENY 401--None
-hostileDENY 401--None
PASS A2 D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 201-insert:todo:selfNone
-foreign_refDENY 400--None
-hostileALLOW 201-insert:todo:selfNone
PASS A2 D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 201-insert:todo:selfNone
-foreign_refDENY 400--None
-hostileALLOW 201-insert:todo:selfNone
PASS A2 D1
targetvariantdecisionleaked canariesDB changescountviolation
-baseALLOW 201-insert:todo:selfNone
-foreign_refDENY 400--None
-hostileALLOW 201-insert:todo:selfNone
PUT /todos/{todo_id}
PASS D15
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
nonexistentforeign_refDENY 401--None
nonexistenthostileDENY 401--None
sharedbaseDENY 401--None
sharedforeign_refDENY 401--None
sharedhostileDENY 401--None
superuserbaseDENY 401--None
superuserforeign_refDENY 401--None
superuserhostileDENY 401--None
user_abaseDENY 401--None
user_aforeign_refDENY 401--None
user_ahostileDENY 401--None
user_bbaseDENY 401--None
user_bforeign_refDENY 401--None
user_bhostileDENY 401--None
PASS D15
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
nonexistentforeign_refDENY 401--None
nonexistenthostileDENY 401--None
sharedbaseDENY 401--None
sharedforeign_refDENY 401--None
sharedhostileDENY 401--None
superuserbaseDENY 401--None
superuserforeign_refDENY 401--None
superuserhostileDENY 401--None
user_abaseDENY 401--None
user_aforeign_refDENY 401--None
user_ahostileDENY 401--None
user_bbaseDENY 401--None
user_bforeign_refDENY 401--None
user_bhostileDENY 401--None
PASS D15
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
nonexistentforeign_refDENY 401--None
nonexistenthostileDENY 401--None
sharedbaseDENY 401--None
sharedforeign_refDENY 401--None
sharedhostileDENY 401--None
superuserbaseDENY 401--None
superuserforeign_refDENY 401--None
superuserhostileDENY 401--None
user_abaseDENY 401--None
user_aforeign_refDENY 401--None
user_ahostileDENY 401--None
user_bbaseDENY 401--None
user_bforeign_refDENY 401--None
user_bhostileDENY 401--None
PASS D15
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
nonexistentforeign_refDENY 401--None
nonexistenthostileDENY 401--None
sharedbaseDENY 401--None
sharedforeign_refDENY 401--None
sharedhostileDENY 401--None
superuserbaseDENY 401--None
superuserforeign_refDENY 401--None
superuserhostileDENY 401--None
user_abaseDENY 401--None
user_aforeign_refDENY 401--None
user_ahostileDENY 401--None
user_bbaseDENY 401--None
user_bforeign_refDENY 401--None
user_bhostileDENY 401--None
PASS D15
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
nonexistentforeign_refDENY 401--None
nonexistenthostileDENY 401--None
sharedbaseDENY 401--None
sharedforeign_refDENY 401--None
sharedhostileDENY 401--None
superuserbaseDENY 401--None
superuserforeign_refDENY 401--None
superuserhostileDENY 401--None
user_abaseDENY 401--None
user_aforeign_refDENY 401--None
user_ahostileDENY 401--None
user_bbaseDENY 401--None
user_bforeign_refDENY 401--None
user_bhostileDENY 401--None
PASS D15
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 401--None
nonexistentforeign_refDENY 401--None
nonexistenthostileDENY 401--None
sharedbaseDENY 401--None
sharedforeign_refDENY 401--None
sharedhostileDENY 401--None
superuserbaseDENY 401--None
superuserforeign_refDENY 401--None
superuserhostileDENY 401--None
user_abaseDENY 401--None
user_aforeign_refDENY 401--None
user_ahostileDENY 401--None
user_bbaseDENY 401--None
user_bforeign_refDENY 401--None
user_bhostileDENY 401--None
CHANGED A3 D12
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 404--None
nonexistentforeign_refDENY 404--None
nonexistenthostileDENY 404--None
sharedbaseDENY 404--None
sharedforeign_refDENY 404--None
sharedhostileDENY 404--None
superuserbaseALLOW 200-delete:todo_category:self, update:todo:selfNone
superuserforeign_refALLOW 200user_bdelete:todo_category:self, insert:todo_category:self, update:todo:selfNone
superuserhostileALLOW 200-delete:todo_category:self, update:todo:selfNone
user_abaseDENY 403--None
user_aforeign_refDENY 403--None
user_ahostileDENY 403--None
user_bbaseDENY 403--None
user_bforeign_refDENY 403--None
user_bhostileDENY 403--None
FAIL A3 D12
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 404--None
nonexistentforeign_refDENY 404--None
nonexistenthostileDENY 404--None
sharedbaseDENY 404--None
sharedforeign_refDENY 404--None
sharedhostileDENY 404--None
superuserbaseDENY 403--None
superuserforeign_refDENY 403--None
superuserhostileDENY 403--None
user_abaseALLOW 200-delete:todo_category:self, update:todo:selfNone
user_aforeign_refALLOW 200user_bdelete:todo_category:self, insert:todo_category:self, update:todo:selfNone ⚠ I1 read-isolation: user_a received data owned by user_b
user_ahostileALLOW 200-delete:todo_category:self, update:todo:selfNone
user_bbaseDENY 403--None
user_bforeign_refDENY 403--None
user_bhostileDENY 403--None
FAIL A3 D12
targetvariantdecisionleaked canariesDB changescountviolation
nonexistentbaseDENY 404--None
nonexistentforeign_refDENY 404--None
nonexistenthostileDENY 404--None
sharedbaseDENY 404--None
sharedforeign_refDENY 404--None
sharedhostileDENY 404--None
superuserbaseDENY 403--None
superuserforeign_refDENY 403--None
superuserhostileDENY 403--None
user_abaseDENY 403--None
user_aforeign_refDENY 403--None
user_ahostileDENY 403--None
user_bbaseALLOW 200-delete:todo_category:self, update:todo:selfNone
user_bforeign_refALLOW 200user_adelete:todo_category:self, insert:todo_category:self, update:todo:selfNone ⚠ I1 read-isolation: user_b received data owned by user_a
user_bhostileALLOW 200-delete:todo_category:self, update:todo:selfNone

Generated by report.py from the lockfile; the verdict is computed by authzlock.diff (deterministic, no LLM).