authz.lock: fastapi-todos@c059889: pr-mut-update-todo-no-owner.v1

Verdict: FAIL · 16 new invariant violations · 12 widened cells · 12 changed cells

probes693
probe time (s)96.2
coverage17/20 operations
never green (unprobed)DELETE /users/{id}, POST /auth/reset-password, POST /auth/verify
harnessvalid
appfastapi-todos@c059889
expectedFAIL
whatPUT /todos/{id}: service-level owner comparison removed

Invariant violations introduced by this PR

rulecell (op | identity | target | variant)detail
I3 write-isolationPUT /todos/{todo_id} | user_a | user_b | baseuser_a updated a todo row owned by user_b (ownership moved to self)
I3 write-isolationPUT /todos/{todo_id} | user_a | user_b | baseuser_a deleted a todo_category row owned by user_b
I3 write-isolationPUT /todos/{todo_id} | user_a | user_b | hostileuser_a updated a todo row owned by user_b (ownership moved to self)
I3 write-isolationPUT /todos/{todo_id} | user_a | user_b | hostileuser_a deleted a todo_category row owned by user_b
I3 write-isolationPUT /todos/{todo_id} | user_a | superuser | baseuser_a updated a todo row owned by superuser (ownership moved to self)
I3 write-isolationPUT /todos/{todo_id} | user_a | superuser | baseuser_a deleted a todo_category row owned by superuser
I3 write-isolationPUT /todos/{todo_id} | user_a | superuser | hostileuser_a updated a todo row owned by superuser (ownership moved to self)
I3 write-isolationPUT /todos/{todo_id} | user_a | superuser | hostileuser_a deleted a todo_category row owned by superuser
I3 write-isolationPUT /todos/{todo_id} | user_b | user_a | baseuser_b updated a todo row owned by user_a (ownership moved to self)
I3 write-isolationPUT /todos/{todo_id} | user_b | user_a | baseuser_b deleted a todo_category row owned by user_a
I3 write-isolationPUT /todos/{todo_id} | user_b | user_a | hostileuser_b updated a todo row owned by user_a (ownership moved to self)
I3 write-isolationPUT /todos/{todo_id} | user_b | user_a | hostileuser_b deleted a todo_category row owned by user_a
I3 write-isolationPUT /todos/{todo_id} | user_b | superuser | baseuser_b updated a todo row owned by superuser (ownership moved to self)
I3 write-isolationPUT /todos/{todo_id} | user_b | superuser | baseuser_b deleted a todo_category row owned by superuser
I3 write-isolationPUT /todos/{todo_id} | user_b | superuser | hostileuser_b updated a todo row owned by superuser (ownership moved to self)
I3 write-isolationPUT /todos/{todo_id} | user_b | superuser | hostileuser_b deleted a todo_category row owned by superuser

Access widened (lockfile diff)

cellbasehead
PUT /todos/{todo_id} | superuser | user_a | baseDENY 403 leaks=- db=- count=NoneALLOW 200 leaks=- db=['delete:todo_category:user_a', 'update:todo:user_a->self'] count=None
PUT /todos/{todo_id} | superuser | user_a | hostileDENY 403 leaks=- db=- count=NoneALLOW 200 leaks=- db=['delete:todo_category:user_a', 'update:todo:user_a->self'] count=None
PUT /todos/{todo_id} | superuser | user_b | baseDENY 403 leaks=- db=- count=NoneALLOW 200 leaks=- db=['delete:todo_category:user_b', 'update:todo:user_b->self'] count=None
PUT /todos/{todo_id} | superuser | user_b | hostileDENY 403 leaks=- db=- count=NoneALLOW 200 leaks=- db=['delete:todo_category:user_b', 'update:todo:user_b->self'] count=None
PUT /todos/{todo_id} | user_a | superuser | baseDENY 403 leaks=- db=- count=NoneALLOW 200 leaks=- db=['delete:todo_category:superuser', 'update:todo:superuser->self'] count=None
PUT /todos/{todo_id} | user_a | superuser | hostileDENY 403 leaks=- db=- count=NoneALLOW 200 leaks=- db=['delete:todo_category:superuser', 'update:todo:superuser->self'] count=None
PUT /todos/{todo_id} | user_a | user_b | baseDENY 403 leaks=- db=- count=NoneALLOW 200 leaks=- db=['delete:todo_category:user_b', 'update:todo:user_b->self'] count=None
PUT /todos/{todo_id} | user_a | user_b | hostileDENY 403 leaks=- db=- count=NoneALLOW 200 leaks=- db=['delete:todo_category:user_b', 'update:todo:user_b->self'] count=None
PUT /todos/{todo_id} | user_b | superuser | baseDENY 403 leaks=- db=- count=NoneALLOW 200 leaks=- db=['delete:todo_category:superuser', 'update:todo:superuser->self'] count=None
PUT /todos/{todo_id} | user_b | superuser | hostileDENY 403 leaks=- db=- count=NoneALLOW 200 leaks=- db=['delete:todo_category:superuser', 'update:todo:superuser->self'] count=None
PUT /todos/{todo_id} | user_b | user_a | baseDENY 403 leaks=- db=- count=NoneALLOW 200 leaks=- db=['delete:todo_category:user_a', 'update:todo:user_a->self'] count=None
PUT /todos/{todo_id} | user_b | user_a | hostileDENY 403 leaks=- db=- count=NoneALLOW 200 leaks=- db=['delete:todo_category:user_a', 'update:todo:user_a->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 A6 D9
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_refDENY 400--None
superuserhostileALLOW 200-delete:todo_category:self, update:todo:selfNone
user_abaseALLOW 200-delete:todo_category:user_a, update:todo:user_a->selfNone
user_aforeign_refDENY 400--None
user_ahostileALLOW 200-delete:todo_category:user_a, update:todo:user_a->selfNone
user_bbaseALLOW 200-delete:todo_category:user_b, update:todo:user_b->selfNone
user_bforeign_refDENY 400--None
user_bhostileALLOW 200-delete:todo_category:user_b, update:todo:user_b->selfNone
FAIL A6 D9
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:superuser, update:todo:superuser->selfNone ⚠ I3 write-isolation: user_a updated a todo row owned by superuser (ownership moved to self); I3 write-isolation: user_a deleted a todo_category row owned by superuser
superuserforeign_refDENY 400--None
superuserhostileALLOW 200-delete:todo_category:superuser, update:todo:superuser->selfNone ⚠ I3 write-isolation: user_a updated a todo row owned by superuser (ownership moved to self); I3 write-isolation: user_a deleted a todo_category row owned by superuser
user_abaseALLOW 200-delete:todo_category:self, update:todo:selfNone
user_aforeign_refDENY 400--None
user_ahostileALLOW 200-delete:todo_category:self, update:todo:selfNone
user_bbaseALLOW 200-delete:todo_category:user_b, update:todo:user_b->selfNone ⚠ I3 write-isolation: user_a updated a todo row owned by user_b (ownership moved to self); I3 write-isolation: user_a deleted a todo_category row owned by user_b
user_bforeign_refDENY 400--None
user_bhostileALLOW 200-delete:todo_category:user_b, update:todo:user_b->selfNone ⚠ I3 write-isolation: user_a updated a todo row owned by user_b (ownership moved to self); I3 write-isolation: user_a deleted a todo_category row owned by user_b
FAIL A6 D9
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:superuser, update:todo:superuser->selfNone ⚠ I3 write-isolation: user_b updated a todo row owned by superuser (ownership moved to self); I3 write-isolation: user_b deleted a todo_category row owned by superuser
superuserforeign_refDENY 400--None
superuserhostileALLOW 200-delete:todo_category:superuser, update:todo:superuser->selfNone ⚠ I3 write-isolation: user_b updated a todo row owned by superuser (ownership moved to self); I3 write-isolation: user_b deleted a todo_category row owned by superuser
user_abaseALLOW 200-delete:todo_category:user_a, update:todo:user_a->selfNone ⚠ I3 write-isolation: user_b updated a todo row owned by user_a (ownership moved to self); I3 write-isolation: user_b deleted a todo_category row owned by user_a
user_aforeign_refDENY 400--None
user_ahostileALLOW 200-delete:todo_category:user_a, update:todo:user_a->selfNone ⚠ I3 write-isolation: user_b updated a todo row owned by user_a (ownership moved to self); I3 write-isolation: user_b deleted a todo_category row owned by user_a
user_bbaseALLOW 200-delete:todo_category:self, update:todo:selfNone
user_bforeign_refDENY 400--None
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).