Skip to main content

Remediation transaction

A BLOCK is not a dead end.

A BLOCK is not a dead end: the envelope names the required contract fixes; the same input re-submitted is still a BLOCK (deterministic); a modified input triggers a NEW preflight, not permission; disputes escalate to human review.

What the transaction carries

The agent-facing contract names these response fields.

remediation_transaction

Present on BLOCK only; not on ALLOW/WARN/REQUIRE_APPROVAL.

required_changes[]

The named contract fixes.

resubmission

unchanged_input -> deterministic_block; modified_input -> preflight_required; modified_is_not_permission: true; next_preflight_required: true.

recheck_scope / escalation

recheck_scope; escalation: human_review.

A measured BLOCK, in full

Not an illustration. This is the object buildRemediationTransaction returns for a BLOCK on one removed response field, measured on 2026-09-15.

{
  "required_changes": [
    {
      "change_type": "FIELD_REMOVAL",
      "precise_label": "DEPRECATE_FIELD",
      "target": "/orders response.customer_id",
      "target_ref": {
        "path": "/orders", "method": "", "field": "customer_id",
        "location": "response_body", "side": "response"
      },
      "recommended_transform": "add_alongside_then_deprecate",
      "effort": "low",
      "instruction": "Keep field `customer_id` on /orders; mark deprecated; add replacement field alongside; remove later.",
      "evidence": { "ir_type": "field_removed" }
    }
  ],
  "resubmission": {
    "unchanged_input": "deterministic_block",
    "modified_input": "preflight_required",
    "reference_fingerprint": "fp_2f1a9c4e8b7d6035",
    "fingerprint_profile": "verdict_fp_v1",
    "modified_is_not_permission": true
  },
  "next_preflight_required": true,
  "recheck_scope": {
    "targets": ["/orders", "/orders response.customer_id"],
    "precise": true
  },
  "escalation": {
    "path": "human_review",
    "when": "changes_infeasible_or_disputed"
  }
}

What happens after escalation: human_review is named by when: the path opens only when the required changes are infeasible or disputed. It is a route for a human to overrule the remediation, not a second way to pass the gate — next_preflight_required stays true either way.

Re-submission is not permission

The same input re-submitted is still a BLOCK (deterministic). A modified input triggers a NEW preflight, not permission.

modified_is_not_permission: true
next_preflight_required: true

A BLOCK on a change set carries a remediation transaction. It names the required contract fixes in required_changes[] and records "unchanged_input": "deterministic_block" next to a reference_fingerprint. The same input re-submitted is still a BLOCK (deterministic). A modified input triggers a NEW preflight, not permission: modified_is_not_permission: true, next_preflight_required: true. A remedy means the named fixes applied to the input, then a new preflight on the changed input. The decision is bound to the artifact digest of the change set. Record-keeping defines artifact_digest: artifact_digest, under bh, is the SHA-256 over the sorted per-artifact sha256 of the before text and sha256 of the after text. Limit: re-submission is not a second way to pass. A human-review escalation opens only when the changes are infeasible or disputed.

Post-execution proof

For post-execution proof boundaries, see Execution attestations and Proof boundaries.