#include "workflow_fixture.hpp" struct FailedPlaceDriver : Simulator { void send(const GoalRequest& q) override { Simulator::send(q); if(q.skill==Skill::PLACE){auto& event=events.back();event.native_status=NativeStatus::ABORTED;event.result.code=ResultCode::FAILED;event.result.error_code="VLA_EXECUTION_FAILED";} } }; int main(){ Fixture config("settlement_config");FailedPlaceDriver driver;ContextStore context; ActiveGoalRegistry registry(driver,Fixture::test_root()+"/settlement.journal");unsigned deliveries=0; StageRunner runner(config.task,config.site,driver,registry,context,[&](const std::string&,unsigned,const std::string&){++deliveries;return true;}); Workflow flow(runner);TickStatus status=TickStatus::RUNNING;unsigned i=0; for(;i<200&&status==TickStatus::RUNNING;++i){driver.now=1000000+i*1000000;runner.update_safety({true,true,driver.sensor_holding,driver.now,driver.now+1000000000});status=flow.tick(SteadyTime{}+Milliseconds(i),driver.now);} assert(status==TickStatus::FAILURE);assert(deliveries==0); runner.halt(SteadyTime{}+Milliseconds(i)); runner.update_safety({true,false,driver.sensor_holding,driver.now,driver.now+1000000000}); assert(runner.settle(SteadyTime{}+Milliseconds(i),driver.now)==TickStatus::RUNNING); // Settlement is read-only except for the idempotent business receipt. for(status=TickStatus::RUNNING;i<300&&status==TickStatus::RUNNING;++i){driver.now=1000000+i*1000000;runner.update_safety({true,true,driver.sensor_holding,driver.now,driver.now+1000000000});status=runner.settle(SteadyTime{}+Milliseconds(i),driver.now);} assert(status==TickStatus::SUCCESS);assert(deliveries==1);assert(runner.error_code()=="VLA_EXECUTION_FAILED"); unsigned place=0,verify=0;for(const auto&q:driver.sent){place+=q.skill==Skill::PLACE;verify+=q.skill==Skill::VERIFY_PLACE;} assert(place==1&&verify==1);assert(runner.empty_verified(driver.now)); assert(runner.settle(SteadyTime{}+Milliseconds(i),driver.now)==TickStatus::SUCCESS);assert(deliveries==1); std::cout<<"failed place settlement records verified delivery without motion retry\n"; }