# Obstacle-aware civilian mapping mission study

**240/240 episodes accounted for; 1440 scheduled agents.** Status: complete.

## Mission liveness (not a safety proxy)

Outcomes: **{'blocked_unreachable': 288, 'complete': 432, 'pending': 0, 'runtime_error': 0, 'timeout': 720}**. Fleet-complete episodes: **48**. Collision-free agent completions: **432**.

| Layout | Planner | Complete / 96 | Blocked | Timeout | Error | Deadlock steps | Mean flown m | Completed-only time s |
|---|---|---:|---:|---:|---:|---:|---:|---:|
| open | straight | 0 | 0 | 96 | 0 | 2336 | 14.40 | — |
| open | routed | 0 | 0 | 96 | 0 | 2336 | 14.40 | — |
| open | routed_recovery | 48 | 0 | 48 | 0 | 2336 | 51.05 | 68.00 |
| clutter | straight | 0 | 0 | 96 | 0 | 2528 | 12.55 | — |
| clutter | routed | 96 | 0 | 0 | 0 | 0 | 33.27 | 22.75 |
| clutter | routed_recovery | 96 | 0 | 0 | 0 | 0 | 33.27 | 22.75 |
| corridor | straight | 0 | 0 | 96 | 0 | 2512 | 10.50 | — |
| corridor | routed | 96 | 0 | 0 | 0 | 656 | 38.20 | 47.08 |
| corridor | routed_recovery | 16 | 0 | 80 | 0 | 2320 | 66.41 | 52.50 |
| disconnected | straight | 0 | 96 | 0 | 0 | 0 | 14.05 | — |
| disconnected | routed | 0 | 96 | 0 | 0 | 0 | 0.00 | — |
| disconnected | routed_recovery | 0 | 96 | 0 | 0 | 0 | 0.00 | — |
| thin_wall | straight | 0 | 0 | 96 | 0 | 2448 | 14.40 | — |
| thin_wall | routed | 64 | 0 | 32 | 0 | 2336 | 34.43 | 51.38 |
| thin_wall | routed_recovery | 16 | 0 | 80 | 0 | 2336 | 65.07 | 89.00 |

Completion requires both ordered waypoints at low speed. Unreachable missions and finite-horizon timeouts stay in the denominator. A dash is missing/not applicable, never a successful zero time. Progress and conditional route/time metrics are in `summary.json` and per-agent `result.json`.

## Safety and numerical audit

Audited episode replays: **240**. Agent-seconds: **129600.0**. Executed steps: **43200**.

Swept safety and integrity counts: `{'acceleration_violations': 0, 'boundary_violations': 0, 'clearance_collisions': 0, 'false_completions': 0, 'integration_errors': 0, 'nofly_intrusions': 0, 'obstacle_collisions': 0, 'pair_collisions': 0, 'planned_route_violations': 0, 'speed_violations': 0, 'uncertified_collision_steps': 0}`.

Minimum swept pair distance: **1.20 m** (threshold 1.2 m). Maximum speed: **2.40 m/s**; maximum acceleration: **2.00 m/s²**. Uncertified/braking steps: **96**. Motionless agents: **192**; these are not evidence of mission success.

Full deterministic rerun: `{'audited_jobs': 240, 'passed': True}`. Separate adversarial audit: `{'case_count': 5, 'outside_mission_denominator': True, 'passed': True}`. The adversarial cases deliberately retain thin-wall tunneling, boundary departure and pair collision when bounded braking cannot stop in time; those are outside the frozen mission denominator, not hidden failures.

## Figures

![Completion and deadlock](comparison.png)

Completion bars use all 96 scheduled agents per cell, including impossible missions. The second panel shows deadlock occupancy, not just how often a detector fired.

![Representative trajectories](trajectories.png)

Every layout/planner cell uses seed 10100 (preselected, not best-case). Solid shaded rectangles are raw obstacles/no-fly zones; dashed outlines are inflated forbidden boundaries. Circles are starts, stars are final mission goals. All six complete finite-horizon trajectories are drawn, including stationary/blocked ones.

![Thin-wall continuous audit](thin_wall_audit.png)

The left panel shows the 0.02 m mission wall and representative paths; the right zoom shows an adversarial one-step crossing with both raw-obstacle endpoints outside. Continuous edge-intersection audit catches what endpoint checks miss.

![Bounded braking cases](braking_audit.png)

These are intentionally infeasible or forced-failure states, not 240 additional study episodes. Braking respects the actuator change bound; it does not guarantee no collision. The feasible thin-wall case is shown alongside the failed cases.

## Observed findings (deterministically generated)

Completed agents by planner (480 scheduled each): **{'routed': 256, 'routed_recovery': 176, 'straight': 0}**.

Recovery minus routed completed agents by layout: **{'clutter': 0, 'corridor': -80, 'disconnected': 0, 'open': 48, 'thin_wall': -48}**. Positive values favor recovery; negative values are regressions, not omitted failures.

The detector measures finite-window stagnation, not proof of permanent deadlock. A routed episode may complete after a temporary deadlock flag; intervening can reduce throughput. More executed distance need not mean more mission progress. Unreachable waiting remains failure to complete, not successful navigation.

## Hardened execution and validation

This hardened run repeats the original 240 job specifications to validate changed journaling, recovery and publication code. It is a duplicate execution, **not 240 new independent trials**. Original reports and source snapshots remain immutable under `../full/`.

Validation: `{'command': ['venv/bin/python', '-B', '-m', 'unittest', 'discover', '-s', 'tests', '-p', 'test_obstacle_missions.py', '-v'], 'core_unchanged_from_e60c90a': True, 'duplicate_execution_not_independent': True, 'exact_replay_jobs': 240, 'explicit_verify_readonly': True, 'log_sha256': 'd50775f443d73d42ebb53ca0fb7c0647b8850a4e878eec735fc71be90d059386', 'noop_resume_readonly': True, 'original': {'bytes_and_mtimes_unchanged': True, 'inventory_sha256': '5a0fcec3b6529e9d3fe2649cbc076c5db8e70fd097c4fe897d9f0bd66b6a781a', 'original_manifest_sha256': '639d0d5229e2483fabd75d93d2d3d83e7f62f226d3365589b6fca2d2e407949e', 'unchanged_files': 1473}, 'passed': True, 'publisher_byte_repeatable': True, 'tests_exit_code': 0, 'tests_log': 'tests.log', 'tests_run': 34}`. Metrics comparison: `{'aggregate_metrics_unchanged': True, 'cell_metrics_unchanged': True, 'changed_arrays': [], 'changed_metrics': [], 'compared_jobs': 240, 'duplicate_executions': True, 'expected_nonmetric_changes': ['Source/runtime provenance and execution wall times', 'Trace phase/step_index and per-step mapping_phase/mapping_error', 'Result error_phase and sealed startup/error evidence', 'Deterministic publication, validation and duplicate-execution lineage'], 'independent_new_trials': 0, 'jobs_with_exact_arrays': 240, 'jobs_with_identical_audit_metrics': 240, 'paired_comparisons_unchanged': True, 'reference': '../full/summary.json'}`. Null means not yet performed; no validation success is inferred.

The deterministic publisher owns these findings, validation references and the artifact manifest. Normal no-op resume and `--verify` are read-only. Explicit `--publish` regenerates derived assets and reseals the manifest; no manual append step is required.

## Interpretation and reproducibility

Compare routed/recovery to straight within each frozen layout and seed; `paired_comparisons` retains every paired completion delta. Do not infer a general recovery benefit if its measured counts are lower or unchanged. Symmetric encounters, static yielding bays and finite priority leases can leave substantial deadlock and timeout. Safety does not imply liveness.

- True-state known-geometry simulation oracle, not robust sensing or flight validation.
- Fixed geometry/motion repeated across mapping seeds; no independent geometric-trial inference.
- Conservative local convex constraints and heuristic recovery can deadlock; failed certificates are not infeasibility proofs.
- No obstacle occlusion in auxiliary scalar mapping; no terrain-to-obstacle inference.
- Conditional completion time excludes unfinished agents; explicit outcome counts carry the denominator.

- Baseline: `e60c90a1121209969da7b80cf1ea0f39a57a61f0`.
- Source bundle: `0a9ee09a16d4abb261817b10e9d6f192df3b9a659b1cc18c5980e4ca9b74f225`; runtime: `ca836e4d16b3e1ab95bc1888a0d8d59c4c40094c4a522a3c6ca82942fa8696de`.
- Exact source bytes and all 240 job specifications are in `source_snapshot/` and `preregistration.json`. Every job retains state arrays, ordered stages, chosen routes, preferred/executed velocities, solver residuals, map sufficient statistics and error/checkpoint artifacts. Resume validates source, runtime and job bytes before reuse.
- Runtime failures and pending jobs are explicit; a failed execution is not a mission success. See the frozen source methodology for exact thresholds, model scope, attribution and commands.
