Agents
Keep approval attached to the reviewed inspection
P7 became P9 after the review
Botie’s drafted inspection can change while a technician reviews it. Build a gate that keeps the decision attached to the exact proposal and current authority.
BOTIE
The inputs we are comparing
Current proposal fields
The unchanged job is still approved
{
"requestId": "R17",
"asset": "P7",
"operation": "inspect",
"revision": "1"
}The proposal changed after review
{
"requestId": "R17",
"asset": "P9",
"operation": "inspect",
"revision": "2"
}Authoritative approval fixture
Same in both cases
{
"requestId": "R17",
"asset": "P7",
"operation": "inspect",
"revision": "1",
"approved": true
}Current server time
Same in both cases
20
Approval expiry time
Same in both cases
40
Reviewer currently permitted?
Same in both cases
true
Result for the unchanged job is still approved
authorised for this action
The reviewer’s authority changed while Botie waited
This check uses the pieces from “Bind the review to the proposed inspection”.
BOTIE
- Current proposal fields
{ "requestId": "R21", "asset": "P4", "operation": "inspect", "revision": "2" }- Authoritative approval fixture
{ "requestId": "R21", "asset": "P4", "operation": "inspect", "revision": "2", "approved": true }- Current server time
70
- Approval expiry time
90
- Reviewer currently permitted?
false
Use a number, text, or an array matching the requested result. For a matrix, put each row in brackets. Saving your prediction runs your current construction on these inputs and checks the earlier examples too.
Build a construction in the workspace above first. This case will test those pieces.
Which additional fields would need approval if creating a job also selected a site, schedule and assignee?
Every consequential argument belongs to the approved snapshot. Check that snapshot atomically at the effect boundary.
The records are trusted fixtures. Production approval must be authenticated, stored securely, checked atomically against the effect and paired with idempotent job creation.
Work through the Python challenges →