F new events ["action.allowed@pm"]
F trail pm ["session.launched",null,"action.allowed"]
G unknown decision decision-not-found
G another role decision decision-mismatch
G owner use "string"
G owner without decision still sends "string"
H first "cross-role"
H second decision-consumed
H allowed uses 1
✔ F events written by one within-role message.send with no decision (131.747467ms)
✔ G within-role sender supplies a decision it does not own or that does not exist (168.90098ms)
✔ H refused verb after consumption writes action.refused and does not add a use (135.46588ms)
A raise class gated route_to human
A message.send 0 "string"
A message.send 1 decision-consumed
A message.send 2 decision-consumed
A action.allowed uses recorded 1
A authorize after 3 sends decision-consumed
B role.revoke verb {"revoked":true}
B action.allowed uses recorded 1
B authorize role.revoke after the verb decision-consumed
B authorize again decision-consumed
C raise class cross-role route_to cto
C current class is gated; authorize with arbiter approval:
C authorize 0 decision-mismatch
C authorize 1 decision-mismatch
C authorize 2 decision-mismatch
D authorize 0 {"class":"cross-role","decision":"0d79bffd-1410-433a-b8b0-cffd99eff2a9"}
D authorize 1 decision-consumed
D authorize 2 decision-consumed
E second Store writer-locked
✔ A gated message.send approval: reuse through the verb, then authorize (148.983012ms)
✔ B role.revoke verb, then authorize with the same decision (130.871177ms)
✔ C cross-role approval after policy makes the action gated (145.689167ms)
✔ D cross-role approval reuse under unchanged policy (81.394321ms)
✔ E a second Store on the same data root refuses, so writers serialize in one process (35.07945ms)
ℹ tests 8
ℹ suites 0
ℹ pass 8
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 602.088251
