MOOS-IvP Eval Mission Builder
Overview
Use this skill for one self-evaluating mission folder: a normal MOOS-IvP mission
with an added single-run grading contract. The mission should still be readable
and runnable by a person, but it must also run headlessly, decide pass/fail
inside the mission, write results.txt, and finish through the shared
xlaunch.sh / uMayFinish path.
For ordinary mission layout, use moos-ivp-mission-builder first. For multi-case
matrices, patch sweeps, parallel runs, or expected-vs-actual aggregation, use
moos-ivp-harness-builder. For post-run .alog evidence, use
moos-alog-analysis.
Core Rules
- Start from an ordinary mission that already launches cleanly. Prefer the
moos-ivp-mission-builderbaselines or an existing nearby mission family. - Add only the evaluation plumbing needed for one scenario:
optional
pAutoPoke, optionaluTimerScript,pMissionEval,results.txt, and a thinzlaunch.sh. - Keep
launch.shhuman-facing. It may accept--xlaunched,--nogui, and port overrides, but it should not contain case loops or result aggregation. - Keep
zlaunch.shthin: parse automation arguments, truncateresults.txt, call sharedxlaunch.sh, validate thatresults.txtcontainsgrade=, then apply project-local scoped cleanup. - Let
xlaunch.sh --max_time=<secs>ownuMayFinishand the timed wait/stop contract. Do not duplicate that lifecycle in mission-local wrappers. - Do not synthesize
grade=or write the final result row fromzlaunch.sh,launch.sh, or target-file parsing.pMissionEvalmust own the verdict and writeresults.txt; wrappers may only truncate, launch, wait, validate presence ofgrade=, and clean up. - For cleanup backstops, copy
assets/moos_scoped_teardown.shinto the target project as<project-root>/scripts/moos_scoped_teardown.shif it does not already exist. Reuse an existing project-root helper unless it is clearly stale or incompatible. - Prefer
pAutoPoketo seed deploy and evaluation variables in moving missions. Unit-style evals may useuTimerScriptor the app under test for readiness when there is no vehicle/deploy lifecycle. Do not put pass/fail logic inpAutoPoke. - Use
pMissionEvalas the primary verdict owner. Prefer mission-level booleans or simple scalar checks over harness-side parsing of raw MOOS traffic. - Prefer event-driven
pMissionEvalleads: evaluate when the mission-owned completion event occurs. UseuMayFinishthroughxlaunch.sh --max_timeas the outer infrastructure ceiling. Use a time-driven evaluation-window lead only when non-completion is an expected mission outcome that should produce mission-ownedgrade=fail. - Multiple
lead_conditionlines in the same aspect are allowed, but they are ANDed: all must be true before pass/fail conditions are evaluated. Alead_conditionafter pass/fail conditions starts the next ordered aspect. A singlelead_conditionmay use textualorwhen each operand is parenthesized, for example(EVENT_A = true) or (EVENT_B = true). Do not use||; it is not a supportedLogicConditionoperator. - Treat
BHV_ERROR_SEEN=falseas a normal safety/integrity pass condition. TreatBHV_WARNINGas advisory development evidence by default: inspect and investigate it with appcasts or.alogtools, but do not add a stickyBHV_WARNING_SEENmailflag, result column, or pass condition unless the scenario is explicitly warning-intolerant and the warning signal is known to be stable rather than transient/retracted. - Keep
results.txtscalar and parseable. The only hard schema requirement isgrade=<pass|fail>; fields such asform=,eval=,timeout=, domain facts, andmhash=are recommended evidence, not a mandatory metric set. mission_modis optional mission-owned provenance. Use it only when one mission folder intentionally supports multiple named standalone modes. Omit it from single-scenario eval missions, and do not use it to represent harness cases.- If a vehicle-local variable is graded shoreside, bridge it explicitly through the vehicle broker and shoreside broker.
- For GUI-capable eval missions, keep normal operator buttons available. Do not force appcast/realmcast viewer modes unless the evaluation scenario needs it.
- Do not add
--case,--jobs, temp mission copies, per-case port blocks, or expected-vs-actual aggregation here. Those belong to the harness builder.
Workflow
- Confirm the base mission launches and generates targets.
- Identify the smallest mission-owned pass/fail signal.
- unit-style app variable
- behavior end flag
- arrival/collision/encounter outcome
- load/process/host info signal
- Add evaluation state to the relevant
.bhvor app config.- When adapting an ordinary waypoint mission, make the graded behavior
finite, such as
repeat = 0, or add an explicit completion flag. A repeating operator survey is usually not a valid eval completion signal.
- When adapting an ordinary waypoint mission, make the graded behavior
finite, such as
- Bridge graded vehicle-local variables to shoreside when needed.
- Add
pAutoPokeor an equivalent explicit initializer for deploy and evaluation variables. - Add
pMissionEvalwith simple lead condition(s), clear pass conditions,result_flag = MISSION_EVALUATED = true, andreport_file = results.txt. - Add or update
zlaunch.shto set a mission-appropriateMAX_TIMEdefault, accept--max_time=<secs>as an override, and forward the final value toxlaunch.sh --max_time=<secs>. - Add or update
README.mdwith scenario, grading signal, and run commands. - Validate target generation, then run the headless cycle and inspect
results.txt.
Reference Use
- Read
references/eval-mission-style.mdfor boundaries and file layout. - Read
references/evaluator-apps.mdbefore wiringpAutoPokeorpMissionEval. - Read
references/scenario-and-grading.mdbefore grading obstacles, contacts, moving/integration outcomes, or structured payloads. - Read
references/zlaunch-xlaunch.mdbefore editing automation wrappers. - Read
references/validation.mdbefore reporting an eval mission as done. - Copy
assets/eval-single-vehicle/when a concrete minimal moving example is useful. - Copy
assets/moos_scoped_teardown.shinto the target project as<project-root>/scripts/moos_scoped_teardown.shwhen the project does not already have an equivalent root-scoped helper. - Run
scripts/static_check_eval_mission.sh <mission-dir>for a quick structural check. - Run
scripts/live_check_eval_mission.sh <mission-dir> --port_base=<free-base>for bundled-example or high-trust validation when MOOS-IvP runtime tools are available. - Treat live-check teardown failure as a test failure, show the teardown error, and preserve the temporary workdir for diagnosis.
Validation Checklist
./launch.sh --just_make --nogui <warp>succeeds.- Generated targets contain
pMissionEval, explicit initialization (pAutoPoke,uTimerScript, or an app-owned producer), and any evaluator apps needed for reported columns such aspMissionHash. - If
pMissionHashis used formhash=evidence, keep it headless-only by default; GUI targets should not launch bothpMissionHashandpMarineViewerunless the overlapping pMarineViewer hash feature is deliberately disabled. - Generated targets include bridged graded variables if the verdict depends on vehicle-local posts.
./zlaunch.sh --just_make <warp>succeeds whenxlaunch.shis onPATH.- Headless
./zlaunch.sh --max_time=<secs> <warp>exits cleanly. results.txtcontains one parseable result line withgrade=.- Runtime warnings are investigated during validation; only stable,
scenario-relevant warning metrics are surfaced in
results.txt. - High-trust checks use
scripts/live_check_eval_mission.shor equivalent to verify result rows, surface warning evidence, and detect leftover listeners on scoped ports. - No mission wrapper uses global
ktm,pkill, or unrelated cleanup. - Eval wrappers use
<project-root>/scripts/moos_scoped_teardown.shas a scoped backstop afterxlaunch.sh; they do not use globalktm,pkill, or broad process discovery. - GUI runs retain normal operator controls unless the user requested a headless-only mission.