integrations/fleet-proof/REASON-COVERAGE.md

Proof reason coverage

Linux adds unsupported_pid_namespace to the fixed terminal and native reason vocabularies. A real private-PID-namespace container emits this refusal before process or socket observation. The manual host-only Linux fixture exercises real TCP cookies, shared descriptors (including private per-thread tables), unreadable same-user processes, pinned births, ancestry exits and serial transport. The portable vocabulary check compares the protocol with both production helper sources. Linux evidence and its initial-PID-namespace limits are recorded in VUH-2118 verification.

fleet-health-metrics-native.integration.test.ts runs the real macOS helper, live loopback TCP sockets, an isolated Herdr daemon and a service-owned private registry. It asserts fourteen existing terminal refusal cases independently of native retry diagnostics: eighteen attempts, sixteen refusals and two admissions. It also checks a real provider method refusal and an actual reply corrupted by an owned Unix relay. No kernel observations or successful provider responses are fabricated.

Terminal reasonExercised boundary
unsupported_platformHost platform configuration refuses a live socket.
invalid_paneAn invalid caller pane claim on a live socket.
closed_socketThe owned TCP peer is closed; project coverage also closes it after a real native observation.
missing_bindingThe service supplies no current Herdr binding.
native_initial_unavailableThe compiled helper is unavailable at the initial checkpoint.
native_final_unavailableThe real initial observation succeeds, then the final helper is unavailable.
pane_unavailableReal Herdr returns pane_not_found on the initial pane read.
pane_movedThe claimed ID belongs to a pane moved to another workspace; real Herdr answers for it under its new ID.
not_memberNeither the actual ancestry nor the service registry grants membership.
snapshot_changedThe TCP owner's actual parent exits between observations.
pane_changedThe owned pane is removed between the initial and final Herdr reads.
private_seat_expiredThe service revokes its actual private registry entry between checks.
binding_changedThe service changes its Herdr binding between checks.
observation_failedThe real Herdr control socket is unavailable, rejects an unknown method, or returns a reply corrupted in transit.

Only Herdr's fixed pane_not_found code is preserved by the native control transport. Other provider errors, invalid JSON, incorrect reply IDs and transport failures remain generic failures. An initial missing pane maps to pane_unavailable; a missing final pane maps to pane_changed. Both refuse admission. A project socket that closes during asynchronous observation maps to closed_socket, separately from changes in binding or native observations.

native-ancestry-exit.integration.test.ts adds real scheduled claimant and intermediate exits: caller_exited is terminal and never replayed; ancestor_exited permits one re-walk only with the same live claimant. A second intermediate exit is terminal. The fixture controls owned exit timing while returning only real libproc/sysctl/socket observations. It also checks stale PID/birth/socket pins and HTTP non-member refusal after real reparenting. PID/birth facts remain private; public metrics retain the fixed reasons.

Native diagnostic evidence

The manual native churn test asserts real multiple_owners, owner_mismatch, socket_mismatch, invalid_arguments and owner_not_found counters. It uses a second real PID sharing the connected FD, an invalid server-owned lifetime/socket pin, and a previously owned TCP pair after both endpoints close.

The project HTTP integration uses real execv with a 4097-byte argv[0]. The kernel permits the exec, but the helper's bounded argument observation emits argv_invalid; the project request refuses with HTTP 403 and no forwarded effect. Project process diagnostics are passed through the same schema and collector as socket diagnostics; diagnostic hooks do not affect admission.

The redacted fixture exhausted-diagnostics.json retains actual budget_exhausted and attempts_exhausted events from independent FD-churn runs on unchanged commit 8fcf47a54b578629386bdbc306db3ae2205d57f4. Both original requests returned HTTP 403 with zero forwarded effects. Their source run names, checkpoint, attempt and fixed event fields are retained; variable PIDs, ports, paths and other request data are omitted. Those same runs also observed socket_unavailable, process_unavailable and process_census_changed. The captures prove these OS branches occurred; a golden replay does not claim to force their occurrence on every machine.

fleet-health-metrics.integration.test.ts derives the complete fixed native vocabulary from the helper's diagnostic declarations, compares it to the protocol enum, and checks every token through the collector and authenticated HTTP schema. It also counts the captured exhaustion events and rejects an unknown diagnostic reason. These vocabulary samples are contract inputs, not claims that the OS produced every possible failure. Native diagnostics never add terminal proof attempts or inflate the refusal denominator.

Additional defensive OS evidence

The four-producer evidence and the seven-producer evidence (manual fleet-additional-os-native.integration.test.ts) establish eleven of the sixteen formerly unmet reasons. Those owned workloads cover ancestry_bounds, process_census_unavailable, fd_list_unavailable, argv_unavailable, executable_unavailable, fd_list_bounds, executable_changed, argv_changed, process_changed, ancestry_unavailable and ancestry_changed. These direct helper observations are distinct from full HTTP admission proofs and do not claim a deployed check. Since VUH-2070 that oversized owner's table is read whole: the same manual test now proves the non-refusing fd_list_large diagnostic, and the opt-in native-proof-churn.integration.test.ts proves an unrelated oversized table neither refuses a caller nor hides a second holder of its socket.

fleet-final-os-native.integration.test.ts adds a real clock_unavailable producer. The unchanged helper runs under a policy denying only its libc retry wait syscalls, on actual owned TCP sockets with bounded process churn. A native baseline verifies that the monotonic clock remains available while the wait is denied. The helper refuses after its real retry wait fails. Its actual fixed reason reaches the production schema, aggregate counter and five/sixty-minute windows without adding terminal proof attempts. See the actual capture and limitations. The same file proves ancestry_cycle from an owned child debugger tracing its parent, with actual reciprocal kernel PPIDs. A stable untraced supervisor reaps the original target after detach/continue; ordinary high-level exit waits during reparenting do not prove exit. Only owned debug-signed fixture processes are addressed. The production helper and its kernel observations are not replaced. Pure final-check budget expiration still reports budget_exhausted without inventing a socket mismatch.

Explicit OS coverage limits

fleet-allocation-native.integration.test.ts now proves allocation_failed with the original stock Intel allocator and production proof implementation on a real owned TCP pair. An unconstrained baseline admits; bounded, untouched PROT_NONE address-space reservations make the FD buffer allocation return ENOMEM. Its actual diagnostic reaches the schema, collector and both windows. This manual-only case requires an executable x86_64 macOS slice (Rosetta on Apple Silicon); it does not claim an ARM reproduction. See the producer evidence. The lead's revised acceptance classifies fd_record_invalid and socket_identity_invalid as defensive, not producible through supported APIs on the reviewed ABI. The same manual test compiles the production guard and diagnostic implementations directly, checks negative/valid FD records and each missing/complete Unix/TCP identity field, then checks the production schema, collector and both windows. These explicitly supplied direct guard inputs are not records claimed to come from the OS. The kernel/ABI review and direct tests satisfy the revised guard acceptance; vocabulary/schema inputs alone do not. Actual failed candidate probes and the pinned Apple API review are distinguished from successful native diagnostics.

Supported FD operations have not supplied negative descriptor records, and no supported per-process operation was found that zeros a matched socket's opaque identity. These fail-closed guards stay intact. Published debugger attach paths can alter process parentage, so a blanket assertion that kernel observations cannot be cyclic is not sufficient evidence. The successful owned debugger workload above proves cyclic parentage on this host; its earlier denied attach did not. Allocation-limit setup failures and loader exits before the helper's allocation are likewise not allocation_failed events. No existing fleet process, host-wide policy or proof response is changed to manufacture a diagnostic.

Worker receipt failures

fleet-report-reasons.integration.test.ts exercises the production installed sender against real loopback HTTP, the durable conversation store and inbound receipt fence, and real local files. Every fixed failure reason reaches the collector, authenticated HTTP schema and CLI five/sixty-minute windows:

ReasonActual failure boundary
binding_timeoutThe owned binding endpoint holds its response past the request deadline.
binding_unavailableThe binding endpoint returns HTTP 503.
binding_rejectedThe binding endpoint denies the request with HTTP 403.
receipt_timeoutThe original POST response exceeds its deadline; the local claim remains.
receipt_invalidThe service stores the original, then its reply fingerprint is corrupted. Exact GET reconciliation later settles it.
receipt_unresolvedThe POST returns HTTP 503; the real listener is then closed before refreshed-bridge GET reconciliation.
connection_refusedThe real listener closes after binding and before POST dispatch.
local_receipt_unavailableA real file occupies the required claim-directory path.

The stored control verifies durable receipt evidence and removes only its exact claim. Retained originals are reconciled by GET without another POST. Repeated polls of the same health observation do not add attempts. Snapshots contain only fixed counters, never report bodies, binding fingerprints, paths or process data. This proves receipt transport and counter boundaries, not native OS diagnostics.

The proof-alert integration in fleet-lead-round.integration.test.ts uses real TCP refusals and durable native outbox receipts with a captured census boundary. It proves threshold → notifyFleetHealthAlert → exact head acknowledgment, and that unavailable delivery does not consume the accepted-alert cooldown. Native owner TUI acceptance remains a separate live proof; this fixture does not claim that an original operator TUI received the alert.

Focused checks

pnpm fleet-proof:build
FLEET_PROOF_NATIVE_TEST=1 PROJECT_NATIVE_PROOF_TEST=1 pnpm exec vitest run --config vitest.config.ts \
  apps/clankie/test/fleet-health-metrics-native.integration.test.ts \
  apps/clankie/test/native-proof-churn.integration.test.ts \
  apps/clankie/test/project-native-proof.integration.test.ts \
  apps/clankie/test/fleet-health-metrics.integration.test.ts

Native cases are manual opt-ins. They add no build, subprocess churn or Herdr daemon to per-push CI. The vocabulary/HTTP contract uses no native build and remains a fast portable integration check.

Run the additional manual cases under the fleet's heavy wrapper with FLEET_ADDITIONAL_OS_TEST=1; build the production helper first. The owning fixtures' lifetime and reproduction notes describe their bounded processes and cleanup.