Skip to main content
Glama

preflight_change_set

Use this when: a contract artifact (OpenAPI, GraphQL, protobuf, AsyncAPI, MCP manifests, or agent tool schemas) changes before merge, deploy, publish, or tool registration; AND any agent-executed operation with no supported contract type — send type agent_operation. Do not call for documentation-only changes, static readiness scoring, or receipt verification. Use analyze for risk only; authorize requires context.operation. Skipping this call is not permission. Absence of a key is not permission. Inputs: preflight_mode is required: "analyze" (risk only; no receipt, no execution_action) or "authorize" (may mint a receipt; requires context.operation — merge is not deploy is not publish). Supply exactly one artifact source: artifacts[] (1–20 items, each {id, type, before, after} as the FULL spec/schema text, not a path or URL; type is openapi|graphql|grpc|asyncapi|mcp_manifest|agent_tools|agent_operation) XOR derivation="server" (server reads GitHub Compare; needs context.repository + context.base + context.head; sending artifacts[] together is 400). Grant fields (include_execution_grant, grant_version, tenant_id, executor_id, adapter_id, target_uri, expected_state_token, state_nonce, policy_hash) apply only when preflight_mode="authorize" AND include_execution_grant=true; analyze ignores them. previous_receipt is a chain token base64url(body).base64url(signature) to LINK a prior decision — it does not re-verify; use coderifts.verify_receipt instead; for details of a past decision use coderifts.get_decision_details instead. idempotency_key replays authorize only (24h), never analyze.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
contextNoOptional apply-site context folded into the bundle fingerprint. operation distinguishes merge vs deploy vs publish (and other labels); the server accepts any non-empty string; conventional values: merge, deploy, tool_call, publish. The receipt/gate must match this label.
audienceNoRequester identity for the decision envelope. Accepted here; the server-derived audience wins when both are present.
artifactsNo1–20 contract documents analyzed together. Each item is {id, type, before, after} where before/after are the FULL document strings (YAML/JSON/proto text), not URLs or file paths. Omit this array entirely when derivation="server".
tenant_idNoAuthorize+grant v2 only. Tenant the grant is issued under. ASCII slug. When omitted the server uses "default" — pin it if you are not on the default tenant.
adapter_idNoAuthorize+grant v2 only. Adapter that will apply the change. Conventional values: fs, postgres, git. Must match the adapter the executor actually uses; a git grant does not authorize an fs write.
derivationNo"server" = the server derives artifacts[] from GitHub Compare via the App installation. Allowed only when context.repository, context.base and context.head are all present and the tenant has a proven binding for that repository. Do not send artifacts[] in the same call (400 — one source of truth). Omit this field for the caller-supplied artifacts[] path.
target_uriNoAuthorize+grant v2 only. URI the grant binds (example: git://owner/repo.git/refs/heads/main). Fallback if omitted: context.target_uri, then repository/head-derived. Distinct from context.target_id.
executor_idNoAuthorize+grant v2 only. Executor identity the grant is bound to (example: agent:ci-bot, host:github-actions). Empty/absent is not "any executor".
policy_hashNoAuthorize+grant v2 only. Policy identity bound into the grant, sha256: + 64 hex. When supplied, apply must use that same policy; a different policy is a different grant.
state_nonceNoAuthorize+grant only. Opaque nonce copied into the signed grant as its own field (not folded into scope_hash). Absent → BEARER grant. Ignored unless include_execution_grant is true.
grant_versionNoGrant envelope to mint when include_execution_grant is true. Omitting this yields cr.exec.v1 until 2026-09-18 and cr.exec.v2 on and after it (see x-coderifts-effective-default / x-coderifts-default-changes-at). The response meta.grant_version is the version actually issued. An explicit value always wins — pin "v1" to keep current behaviour with no code change on the date.
preflight_modeYesREQUIRED. "analyze" = informational risk only (no decision/execution_action/safe_for_agent; analysis_outcome + may_execute:false). "authorize" = operation-bound path; may mint a receipt (requires context.operation). Decision Spec 2.0: omission is INVALID_INPUT. Do not pin 1.0 — that pin retired.
idempotency_keyNoOptional client key; in authorize mode, a repeat with the same key + body replays the original decision (24h). Analyze responses are not replayed.
previous_receiptNoOptional prior chain token to LINK this call into a receipt chain: base64url(body).base64url(signature). Linking is not verification — a linked token is not re-checked here; use verify_receipt.
expected_state_tokenNoAuthorize+grant v2 only. Compare-and-swap token the executor must observe at apply time (the "before" state). Signed as its own field. Omit only if the adapter has no prior state; do not send a placeholder.
decision_spec_versionNoOptional. Omit or '2.0' = current contract. '1.0' retired (INVALID_INPUT); do not pin 1.0.
include_execution_grantNoAuthorize only. When true on an allow-class authorize, the response includes a signed execution_grant, or HTTP 503 SIGNER_UNAVAILABLE — never an unsigned grant. Default false. Analyze ignores this flag. Ignored unless preflight_mode="authorize".

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed3 schema fields changed
    • changedInput schema / properties / artifacts / items / properties / type / description
      Previous value: -"Artifact kind. One of openapi, graphql, grpc, asyncapi, mcp_manifest, agent_tools. Determines how before/after text is parsed. Not inferred from the filename."New value: +"Artifact kind. One of openapi, graphql, grpc, asyncapi, mcp_manifest, agent_tools, agent_operation. Contract types determine how before/after text is parsed. agent_operation: An opaque proposed agent operation for which no supported contract-artifact type applies. CodeRifts does not semantically analyze this content and does not issue an execution grant. Not inferred from the filename."
    • changedInput schema / properties / artifacts / items / properties / type / enum
      Previous value: -[
      -  "openapi",
      -  "graphql",
      -  "grpc",
      -  "asyncapi",
      -  "mcp_manifest",
      -  "agent_tools"
      -]New value: +[
      +  "openapi",
      +  "graphql",
      +  "grpc",
      +  "asyncapi",
      +  "mcp_manifest",
      +  "agent_tools",
      +  "agent_operation"
      +]
    • changedOutput schema / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, execution_grant, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      -    "not": {
      -      "anyOf": [
      -        {
      -          "required": [
      -            "decision"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "safe_for_agent"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "execution_grant"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "decision_result"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "control_envelope"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "required_action_core"
      -          ]
      -        }
      -      ]
      -    },
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror, assembled by the response builder alongside the control surface. Dual-write of the flat analysis fields present on the verdict, plus remediations[]. PROPERTIES ARE GENERATED — do not hand-edit them. OPEN BY DESIGN: additionalProperties stays TRUE and this is not an oversight. The fields above are copied conditionally, so which of them appear depends on the input — a verdict with no PII findings simply omits pii_findings. Closing this object would turn every future analysis field into a breaking change that fails inside the consumer, and would reject exactly the verdict paths that no one sampled when the union was built. Declared, not closed: you can now see what you may get, and you must still tolerate more.",
      -        "properties": {
      -          "breaking_changes": {
      -            "type": "integer"
      -          },
      -          "breaking_changes_details": {
      -            "type": "array"
      -          },
      -          "change_ir": {
      -            "type": "array"
      -          },
      -          "changelog": {
      -            "type": "array"
      -          },
      -          "compatibility_suggestions": {
      -            "type": "array"
      -          },
      -          "coverage_gap": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "coverage_gap_reason": {
      -            "type": "string"
      -          },
      -          "decision_basis": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "degraded": {
      -            "type": "boolean"
      -          },
      -          "detected_patterns": {
      -            "type": "array"
      -          },
      -          "evidence_quality": {
      -            "type": "string"
      -          },
      -          "fallback_reason": {
      -            "type": "string"
      -          },
      -          "non_breaking_changes": {
      -            "type": "array"
      -          },
      -          "pattern_sources": {
      -            "type": "array"
      -          },
      -          "patterns": {
      -            "type": "array"
      -          },
      -          "pii_findings": {
      -            "type": "array"
      -          },
      -          "policy_violations": {
      -            "type": "array"
      -          },
      -          "remediations": {
      -            "items": {
      -              "additionalProperties": true,
      -              "description": "One remediation for one detected breaking change. `instruction` is imperative prose that a model may read and act on; it is generated per input and is NOT a fixed string, so the schema declares that the field exists and does not pin its text.",
      -              "properties": {
      -                "change_type": {
      -                  "type": "string"
      -                },
      -                "effort": {
      -                  "type": "string"
      -                },
      -                "evidence": {
      -                  "additionalProperties": true,
      -                  "type": "object"
      -                },
      -                "instruction": {
      -                  "description": "Imperative remediation text. Model-visible. Generated per input; not a closed vocabulary.",
      -                  "type": "string"
      -                },
      -                "precise_label": {
      -                  "type": "string"
      -                },
      -                "recommended_transform": {
      -                  "type": "string"
      -                },
      -                "target": {
      -                  "type": "string"
      -                },
      -                "target_ref": {
      -                  "additionalProperties": true,
      -                  "type": "object"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "type": "array"
      -          },
      -          "requires_migration": {
      -            "type": "boolean"
      -          },
      -          "risk_dimensions": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "risk_level": {
      -            "type": "string"
      -          },
      -          "risk_score": {
      -            "type": "integer"
      -          },
      -          "security_findings": {
      -            "type": "array"
      -          },
      -          "semver_suggestion": {
      -            "type": "string"
      -          },
      -          "should_block": {
      -            "type": "boolean"
      -          },
      -          "stats": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "token_cost_impact": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "analysis_control": {
      -        "type": "object"
      -      },
      -      "analysis_outcome": {
      -        "description": "Closed analysis outcome set derived from engine-visible state only.",
      -        "enum": [
      -          "NO_BREAK_DETECTED",
      -          "BREAKS_DETECTED",
      -          "ANALYSIS_FAILED"
      -        ],
      -        "type": "string"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "authorization_effect": {
      -        "const": "NONE",
      -        "description": "Analyze never authorizes; always NONE."
      -      },
      -      "blast_radius": {
      -        "additionalProperties": false,
      -        "description": "Additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      -        "properties": {
      -          "consumers_declared": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "consumers_observed": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "endpoints": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "fields": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "graph_source": {
      -            "enum": [
      -              "none",
      -              "declared",
      -              "observed",
      -              "declared+observed"
      -            ],
      -            "type": "string"
      -          },
      -          "params": {
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "endpoints",
      -          "fields",
      -          "params",
      -          "consumers_declared",
      -          "consumers_observed",
      -          "graph_source"
      -        ],
      -        "type": "object"
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows, mapped from the engine's change IR. Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "decision_basis": {},
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows, emitted by the pattern detectors and validated against the decision-spec field contract before they leave the server. Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier, assembled by the response builder; analyze returns a reduced form. Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "may_execute": {
      -        "const": false,
      -        "description": "Analyze never grants execute permission."
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "analyze"
      -      },
      -      "receipt_kind": {
      -        "const": "NONE",
      -        "description": "Analyze never mints a receipt."
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes, computed once per change set. Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "analysis_outcome",
      -      "authorization_effect",
      -      "may_execute",
      -      "receipt_kind",
      -      "decision_spec_version"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": true,
      -    "allOf": [
      -      {
      -        "if": {
      -          "properties": {
      -            "receipt_kind": {
      -              "const": "operation_authorization"
      -            }
      -          },
      -          "required": [
      -            "receipt_kind"
      -          ]
      -        },
      -        "then": {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        }
      -      },
      -      {
      -        "if": {
      -          "properties": {
      -            "execution_action": {
      -              "enum": [
      -                "CONTINUE",
      -                "CONTINUE_WITH_MONITORING"
      -              ]
      -            }
      -          },
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        "then": {
      -          "properties": {
      -            "receipt_kind": {
      -              "const": "operation_authorization"
      -            }
      -          },
      -          "required": [
      -            "receipt_kind",
      -            "chain_receipt",
      -            "decision_result"
      -          ]
      -        }
      -      }
      -    ],
      -    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror, assembled by the response builder alongside the control surface. Dual-write of the flat analysis fields present on the verdict, plus remediations[]. PROPERTIES ARE GENERATED — do not hand-edit them. OPEN BY DESIGN: additionalProperties stays TRUE and this is not an oversight. The fields above are copied conditionally, so which of them appear depends on the input — a verdict with no PII findings simply omits pii_findings. Closing this object would turn every future analysis field into a breaking change that fails inside the consumer, and would reject exactly the verdict paths that no one sampled when the union was built. Declared, not closed: you can now see what you may get, and you must still tolerate more.",
      -        "properties": {
      -          "breaking_changes": {
      -            "type": "integer"
      -          },
      -          "breaking_changes_details": {
      -            "type": "array"
      -          },
      -          "change_ir": {
      -            "type": "array"
      -          },
      -          "changelog": {
      -            "type": "array"
      -          },
      -          "compatibility_suggestions": {
      -            "type": "array"
      -          },
      -          "coverage_gap": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "coverage_gap_reason": {
      -            "type": "string"
      -          },
      -          "decision_basis": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "degraded": {
      -            "type": "boolean"
      -          },
      -          "detected_patterns": {
      -            "type": "array"
      -          },
      -          "evidence_quality": {
      -            "type": "string"
      -          },
      -          "fallback_reason": {
      -            "type": "string"
      -          },
      -          "non_breaking_changes": {
      -            "type": "array"
      -          },
      -          "pattern_sources": {
      -            "type": "array"
      -          },
      -          "patterns": {
      -            "type": "array"
      -          },
      -          "pii_findings": {
      -            "type": "array"
      -          },
      -          "policy_violations": {
      -            "type": "array"
      -          },
      -          "remediations": {
      -            "items": {
      -              "additionalProperties": true,
      -              "description": "One remediation for one detected breaking change. `instruction` is imperative prose that a model may read and act on; it is generated per input and is NOT a fixed string, so the schema declares that the field exists and does not pin its text.",
      -              "properties": {
      -                "change_type": {
      -                  "type": "string"
      -                },
      -                "effort": {
      -                  "type": "string"
      -                },
      -                "evidence": {
      -                  "additionalProperties": true,
      -                  "type": "object"
      -                },
      -                "instruction": {
      -                  "description": "Imperative remediation text. Model-visible. Generated per input; not a closed vocabulary.",
      -                  "type": "string"
      -                },
      -                "precise_label": {
      -                  "type": "string"
      -                },
      -                "recommended_transform": {
      -                  "type": "string"
      -                },
      -                "target": {
      -                  "type": "string"
      -                },
      -                "target_ref": {
      -                  "additionalProperties": true,
      -                  "type": "object"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "type": "array"
      -          },
      -          "requires_migration": {
      -            "type": "boolean"
      -          },
      -          "risk_dimensions": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "risk_level": {
      -            "type": "string"
      -          },
      -          "risk_score": {
      -            "type": "integer"
      -          },
      -          "security_findings": {
      -            "type": "array"
      -          },
      -          "semver_suggestion": {
      -            "type": "string"
      -          },
      -          "should_block": {
      -            "type": "boolean"
      -          },
      -          "stats": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "token_cost_impact": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "blast_radius": {
      -        "additionalProperties": false,
      -        "description": "Additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      -        "properties": {
      -          "consumers_declared": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "consumers_observed": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "endpoints": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "fields": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "graph_source": {
      -            "enum": [
      -              "none",
      -              "declared",
      -              "observed",
      -              "declared+observed"
      -            ],
      -            "type": "string"
      -          },
      -          "params": {
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "endpoints",
      -          "fields",
      -          "params",
      -          "consumers_declared",
      -          "consumers_observed",
      -          "graph_source"
      -        ],
      -        "type": "object"
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows, mapped from the engine's change IR. Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "description": "Calibration model version when set; null until a calibrated model ships.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "chain_receipt": {
      -        "type": "string"
      -      },
      -      "chain_status": {
      -        "type": "string"
      -      },
      -      "coderifts_version": {
      -        "type": "string"
      -      },
      -      "control_envelope": {
      -        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      -        "type": "object"
      -      },
      -      "decision": {
      -        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      -        "enum": [
      -          "ALLOW",
      -          "WARN",
      -          "REQUIRE_APPROVAL",
      -          "BLOCK"
      -        ],
      -        "type": "string"
      -      },
      -      "decision_basis": {},
      -      "decision_result": {
      -        "additionalProperties": true,
      -        "description": "decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).",
      -        "properties": {
      -          "audience": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "authority": {
      -            "description": "Additive. { audience, tenant_scope: bound|unbound, binding_proven_at? }. Informational — not permission, not a verify-receipt gate, not an ACL.",
      -            "type": [
      -              "object",
      -              "null"
      -            ]
      -          },
      -          "base": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "blast_radius": {
      -            "description": "Additive COUNTS (not a score). Not permission.",
      -            "properties": {
      -              "consumers_declared": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "consumers_observed": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "endpoints": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "fields": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "graph_source": {
      -                "type": "string"
      -              },
      -              "params": {
      -                "minimum": 0,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "decision": {
      -            "enum": [
      -              "ALLOW",
      -              "WARN",
      -              "REQUIRE_APPROVAL",
      -              "BLOCK"
      -            ],
      -            "type": "string"
      -          },
      -          "decision_body_hash": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "decision_id": {
      -            "type": "string"
      -          },
      -          "derivation": {
      -            "description": "Additive. Present only when derivation:\"server\" produced this envelope. { source, platform?, base_sha, head_sha }. Covered by body_hash; not fingerprint.",
      -            "type": [
      -              "object",
      -              "null"
      -            ]
      -          },
      -          "environment": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "execution_action": {
      -            "enum": [
      -              "CONTINUE",
      -              "CONTINUE_WITH_MONITORING",
      -              "REQUEST_APPROVAL",
      -              "STOP"
      -            ],
      -            "type": "string"
      -          },
      -          "expires_at": {
      -            "type": "string"
      -          },
      -          "fingerprint": {
      -            "type": "string"
      -          },
      -          "head": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "input_fingerprint": {
      -            "type": "string"
      -          },
      -          "operation": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "receipt": {
      -            "type": "object"
      -          },
      -          "repository": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "safe_for_agent": {
      -            "type": "boolean"
      -          },
      -          "spec_version": {
      -            "pattern": "^decision-result\\.v1(\\.[0-9]+)?$",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows, emitted by the pattern detectors and validated against the decision-spec field contract before they leave the server. Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "execution_action": {
      -        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      -        "enum": [
      -          "CONTINUE",
      -          "CONTINUE_WITH_MONITORING",
      -          "REQUEST_APPROVAL",
      -          "STOP"
      -        ],
      -        "type": "string"
      -      },
      -      "execution_grant": {
      -        "description": "Opt-in cr.exec.v1 execution grant (PHASE-0). Issued only when include_execution_grant is true on authorize. Short-lived mutation-bound sibling of chain_receipt; never unsigned. Optional inner state_nonce (ATOMIC profile) is additive and is NOT in scope_hash.",
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier, assembled by the response builder; analyze returns a reduced form. Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "authorize"
      -      },
      -      "receipt_kind": {
      -        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      -        "enum": [
      -          "operation_authorization",
      -          "NONE"
      -        ],
      -        "type": "string"
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "safe_for_agent": {
      -        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      -        "type": "boolean"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes, computed once per change set. Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "decision",
      -      "execution_action",
      -      "safe_for_agent",
      -      "receipt_kind",
      -      "decision_spec_version"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, execution_grant, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      +    "not": {
      +      "anyOf": [
      +        {
      +          "required": [
      +            "decision"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "safe_for_agent"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "execution_grant"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "decision_result"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "control_envelope"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "required_action_core"
      +          ]
      +        }
      +      ]
      +    },
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror, assembled by the response builder alongside the control surface. Dual-write of the flat analysis fields present on the verdict, plus remediations[]. PROPERTIES ARE GENERATED — do not hand-edit them. OPEN BY DESIGN: additionalProperties stays TRUE and this is not an oversight. The fields above are copied conditionally, so which of them appear depends on the input — a verdict with no PII findings simply omits pii_findings. Closing this object would turn every future analysis field into a breaking change that fails inside the consumer, and would reject exactly the verdict paths that no one sampled when the union was built. Declared, not closed: you can now see what you may get, and you must still tolerate more.",
      +        "properties": {
      +          "breaking_changes": {
      +            "type": "integer"
      +          },
      +          "breaking_changes_details": {
      +            "type": "array"
      +          },
      +          "change_ir": {
      +            "type": "array"
      +          },
      +          "changelog": {
      +            "type": "array"
      +          },
      +          "compatibility_suggestions": {
      +            "type": "array"
      +          },
      +          "coverage_gap": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "coverage_gap_reason": {
      +            "type": "string"
      +          },
      +          "decision_basis": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "degraded": {
      +            "type": "boolean"
      +          },
      +          "detected_patterns": {
      +            "type": "array"
      +          },
      +          "evidence_quality": {
      +            "type": "string"
      +          },
      +          "fallback_reason": {
      +            "type": "string"
      +          },
      +          "non_breaking_changes": {
      +            "type": "array"
      +          },
      +          "pattern_sources": {
      +            "type": "array"
      +          },
      +          "patterns": {
      +            "type": "array"
      +          },
      +          "pii_findings": {
      +            "type": "array"
      +          },
      +          "policy_violations": {
      +            "type": "array"
      +          },
      +          "remediations": {
      +            "items": {
      +              "additionalProperties": true,
      +              "description": "One remediation for one detected breaking change. `instruction` is imperative prose that a model may read and act on; it is generated per input and is NOT a fixed string, so the schema declares that the field exists and does not pin its text.",
      +              "properties": {
      +                "change_type": {
      +                  "type": "string"
      +                },
      +                "effort": {
      +                  "type": "string"
      +                },
      +                "evidence": {
      +                  "additionalProperties": true,
      +                  "type": "object"
      +                },
      +                "instruction": {
      +                  "description": "Imperative remediation text. Model-visible. Generated per input; not a closed vocabulary.",
      +                  "type": "string"
      +                },
      +                "precise_label": {
      +                  "type": "string"
      +                },
      +                "recommended_transform": {
      +                  "type": "string"
      +                },
      +                "target": {
      +                  "type": "string"
      +                },
      +                "target_ref": {
      +                  "additionalProperties": true,
      +                  "type": "object"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "requires_migration": {
      +            "type": "boolean"
      +          },
      +          "risk_dimensions": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "risk_level": {
      +            "type": "string"
      +          },
      +          "risk_score": {
      +            "type": "integer"
      +          },
      +          "security_findings": {
      +            "type": "array"
      +          },
      +          "semver_suggestion": {
      +            "type": "string"
      +          },
      +          "should_block": {
      +            "type": "boolean"
      +          },
      +          "stats": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "token_cost_impact": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "analysis_control": {
      +        "type": "object"
      +      },
      +      "analysis_outcome": {
      +        "description": "Closed analysis outcome set derived from engine-visible state only. NOT_SUPPORTED = no analyzer (agent_operation / type outside the published enum). ANALYSIS_FAILED = an analyzer ran and failed.",
      +        "enum": [
      +          "NO_BREAK_DETECTED",
      +          "BREAKS_DETECTED",
      +          "ANALYSIS_FAILED",
      +          "NOT_SUPPORTED"
      +        ],
      +        "type": "string"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "authorization_effect": {
      +        "const": "NONE",
      +        "description": "Analyze never authorizes; always NONE."
      +      },
      +      "blast_radius": {
      +        "additionalProperties": false,
      +        "description": "Additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      +        "properties": {
      +          "consumers_declared": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "consumers_observed": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "endpoints": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "fields": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "graph_source": {
      +            "enum": [
      +              "none",
      +              "declared",
      +              "observed",
      +              "declared+observed"
      +            ],
      +            "type": "string"
      +          },
      +          "params": {
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "endpoints",
      +          "fields",
      +          "params",
      +          "consumers_declared",
      +          "consumers_observed",
      +          "graph_source"
      +        ],
      +        "type": "object"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows, mapped from the engine's change IR. Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "decision_basis": {},
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows, emitted by the pattern detectors and validated against the decision-spec field contract before they leave the server. Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier, assembled by the response builder; analyze returns a reduced form. Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "may_execute": {
      +        "const": false,
      +        "description": "Analyze never grants execute permission."
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "analyze"
      +      },
      +      "receipt_kind": {
      +        "const": "NONE",
      +        "description": "Analyze never mints a receipt."
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes, computed once per change set. Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "analysis_outcome",
      +      "authorization_effect",
      +      "may_execute",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": true,
      +    "allOf": [
      +      {
      +        "if": {
      +          "properties": {
      +            "receipt_kind": {
      +              "const": "operation_authorization"
      +            }
      +          },
      +          "required": [
      +            "receipt_kind"
      +          ]
      +        },
      +        "then": {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        }
      +      },
      +      {
      +        "if": {
      +          "properties": {
      +            "execution_action": {
      +              "enum": [
      +                "CONTINUE",
      +                "CONTINUE_WITH_MONITORING"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        "then": {
      +          "properties": {
      +            "receipt_kind": {
      +              "const": "operation_authorization"
      +            }
      +          },
      +          "required": [
      +            "receipt_kind",
      +            "chain_receipt",
      +            "decision_result"
      +          ]
      +        }
      +      }
      +    ],
      +    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror, assembled by the response builder alongside the control surface. Dual-write of the flat analysis fields present on the verdict, plus remediations[]. PROPERTIES ARE GENERATED — do not hand-edit them. OPEN BY DESIGN: additionalProperties stays TRUE and this is not an oversight. The fields above are copied conditionally, so which of them appear depends on the input — a verdict with no PII findings simply omits pii_findings. Closing this object would turn every future analysis field into a breaking change that fails inside the consumer, and would reject exactly the verdict paths that no one sampled when the union was built. Declared, not closed: you can now see what you may get, and you must still tolerate more.",
      +        "properties": {
      +          "breaking_changes": {
      +            "type": "integer"
      +          },
      +          "breaking_changes_details": {
      +            "type": "array"
      +          },
      +          "change_ir": {
      +            "type": "array"
      +          },
      +          "changelog": {
      +            "type": "array"
      +          },
      +          "compatibility_suggestions": {
      +            "type": "array"
      +          },
      +          "coverage_gap": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "coverage_gap_reason": {
      +            "type": "string"
      +          },
      +          "decision_basis": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "degraded": {
      +            "type": "boolean"
      +          },
      +          "detected_patterns": {
      +            "type": "array"
      +          },
      +          "evidence_quality": {
      +            "type": "string"
      +          },
      +          "fallback_reason": {
      +            "type": "string"
      +          },
      +          "non_breaking_changes": {
      +            "type": "array"
      +          },
      +          "pattern_sources": {
      +            "type": "array"
      +          },
      +          "patterns": {
      +            "type": "array"
      +          },
      +          "pii_findings": {
      +            "type": "array"
      +          },
      +          "policy_violations": {
      +            "type": "array"
      +          },
      +          "remediations": {
      +            "items": {
      +              "additionalProperties": true,
      +              "description": "One remediation for one detected breaking change. `instruction` is imperative prose that a model may read and act on; it is generated per input and is NOT a fixed string, so the schema declares that the field exists and does not pin its text.",
      +              "properties": {
      +                "change_type": {
      +                  "type": "string"
      +                },
      +                "effort": {
      +                  "type": "string"
      +                },
      +                "evidence": {
      +                  "additionalProperties": true,
      +                  "type": "object"
      +                },
      +                "instruction": {
      +                  "description": "Imperative remediation text. Model-visible. Generated per input; not a closed vocabulary.",
      +                  "type": "string"
      +                },
      +                "precise_label": {
      +                  "type": "string"
      +                },
      +                "recommended_transform": {
      +                  "type": "string"
      +                },
      +                "target": {
      +                  "type": "string"
      +                },
      +                "target_ref": {
      +                  "additionalProperties": true,
      +                  "type": "object"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "requires_migration": {
      +            "type": "boolean"
      +          },
      +          "risk_dimensions": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "risk_level": {
      +            "type": "string"
      +          },
      +          "risk_score": {
      +            "type": "integer"
      +          },
      +          "security_findings": {
      +            "type": "array"
      +          },
      +          "semver_suggestion": {
      +            "type": "string"
      +          },
      +          "should_block": {
      +            "type": "boolean"
      +          },
      +          "stats": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "token_cost_impact": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "blast_radius": {
      +        "additionalProperties": false,
      +        "description": "Additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      +        "properties": {
      +          "consumers_declared": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "consumers_observed": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "endpoints": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "fields": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "graph_source": {
      +            "enum": [
      +              "none",
      +              "declared",
      +              "observed",
      +              "declared+observed"
      +            ],
      +            "type": "string"
      +          },
      +          "params": {
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "endpoints",
      +          "fields",
      +          "params",
      +          "consumers_declared",
      +          "consumers_observed",
      +          "graph_source"
      +        ],
      +        "type": "object"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows, mapped from the engine's change IR. Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "description": "Calibration model version when set; null until a calibrated model ships.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "chain_receipt": {
      +        "type": "string"
      +      },
      +      "chain_status": {
      +        "type": "string"
      +      },
      +      "coderifts_version": {
      +        "type": "string"
      +      },
      +      "control_envelope": {
      +        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      +        "type": "object"
      +      },
      +      "decision": {
      +        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      +        "enum": [
      +          "ALLOW",
      +          "WARN",
      +          "REQUIRE_APPROVAL",
      +          "BLOCK"
      +        ],
      +        "type": "string"
      +      },
      +      "decision_basis": {},
      +      "decision_result": {
      +        "additionalProperties": true,
      +        "description": "decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).",
      +        "properties": {
      +          "audience": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "authority": {
      +            "description": "Additive. { audience, tenant_scope: bound|unbound, binding_proven_at? }. Informational — not permission, not a verify-receipt gate, not an ACL.",
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "base": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "blast_radius": {
      +            "description": "Additive COUNTS (not a score). Not permission.",
      +            "properties": {
      +              "consumers_declared": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "consumers_observed": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "endpoints": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "fields": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "graph_source": {
      +                "type": "string"
      +              },
      +              "params": {
      +                "minimum": 0,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "decision": {
      +            "enum": [
      +              "ALLOW",
      +              "WARN",
      +              "REQUIRE_APPROVAL",
      +              "BLOCK"
      +            ],
      +            "type": "string"
      +          },
      +          "decision_body_hash": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "decision_id": {
      +            "type": "string"
      +          },
      +          "derivation": {
      +            "description": "Additive. Present only when derivation:\"server\" produced this envelope. { source, platform?, base_sha, head_sha }. Covered by body_hash; not fingerprint.",
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "environment": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "execution_action": {
      +            "enum": [
      +              "CONTINUE",
      +              "CONTINUE_WITH_MONITORING",
      +              "REQUEST_APPROVAL",
      +              "STOP"
      +            ],
      +            "type": "string"
      +          },
      +          "expires_at": {
      +            "type": "string"
      +          },
      +          "fingerprint": {
      +            "type": "string"
      +          },
      +          "head": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "input_fingerprint": {
      +            "type": "string"
      +          },
      +          "operation": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "receipt": {
      +            "type": "object"
      +          },
      +          "repository": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "safe_for_agent": {
      +            "type": "boolean"
      +          },
      +          "spec_version": {
      +            "pattern": "^decision-result\\.v1(\\.[0-9]+)?$",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows, emitted by the pattern detectors and validated against the decision-spec field contract before they leave the server. Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "execution_action": {
      +        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      +        "enum": [
      +          "CONTINUE",
      +          "CONTINUE_WITH_MONITORING",
      +          "REQUEST_APPROVAL",
      +          "STOP"
      +        ],
      +        "type": "string"
      +      },
      +      "execution_grant": {
      +        "description": "Opt-in cr.exec.v1 execution grant (PHASE-0). Issued only when include_execution_grant is true on authorize. Short-lived mutation-bound sibling of chain_receipt; never unsigned. Optional inner state_nonce (ATOMIC profile) is additive and is NOT in scope_hash.",
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier, assembled by the response builder; analyze returns a reduced form. Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "authorize"
      +      },
      +      "receipt_kind": {
      +        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      +        "enum": [
      +          "operation_authorization",
      +          "NONE"
      +        ],
      +        "type": "string"
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "safe_for_agent": {
      +        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      +        "type": "boolean"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes, computed once per change set. Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "decision",
      +      "execution_action",
      +      "safe_for_agent",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  }
      +]
  2. Changed3 schema fields changed
    • changedInput schema / properties / decision_spec_version / description
      Previous value: -"Optional pin. '1.0' = legacy contract (soft-default mode + analyze still carries decision/execution_action) until the sunset date. Omit or '2.0' = current contract."New value: +"Optional. Omit or '2.0' = current contract. '1.0' retired (INVALID_INPUT); do not pin 1.0."
    • changedInput schema / properties / decision_spec_version / enum
      Previous value: -[
      -  "1.0",
      -  "2.0"
      -]New value: +[
      +  "2.0"
      +]
    • changedInput schema / properties / preflight_mode / description
      Previous value: -"REQUIRED. \"analyze\" = informational risk only (no decision/execution_action/safe_for_agent; analysis_outcome + may_execute:false). \"authorize\" = operation-bound path; may mint a receipt (requires context.operation). Decision Spec 2.0: omission is an error unless decision_spec_version is '1.0' (30-day legacy pin with soft-default analyze)."New value: +"REQUIRED. \"analyze\" = informational risk only (no decision/execution_action/safe_for_agent; analysis_outcome + may_execute:false). \"authorize\" = operation-bound path; may mint a receipt (requires context.operation). Decision Spec 2.0: omission is INVALID_INPUT. Do not pin 1.0 — that pin retired."
  3. Changed1 schema field changed
    • changedInput schema / properties / grant_version / x-coderifts-effective-default
      Previous value: -"v1"New value: +"v2"
  4. Changed1 schema field changed
    • changedOutput schema / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, execution_grant, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      -    "not": {
      -      "anyOf": [
      -        {
      -          "required": [
      -            "decision"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "safe_for_agent"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "execution_grant"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "decision_result"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "control_envelope"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "required_action_core"
      -          ]
      -        }
      -      ]
      -    },
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror, assembled by the response builder alongside the control surface. Dual-write of the flat analysis fields present on the verdict, plus remediations[]. PROPERTIES ARE GENERATED — do not hand-edit them. OPEN BY DESIGN: additionalProperties stays TRUE and this is not an oversight. The fields above are copied conditionally, so which of them appear depends on the input — a verdict with no PII findings simply omits pii_findings. Closing this object would turn every future analysis field into a breaking change that fails inside the consumer, and would reject exactly the verdict paths that no one sampled when the union was built. Declared, not closed: you can now see what you may get, and you must still tolerate more.",
      -        "properties": {
      -          "breaking_changes": {
      -            "type": "integer"
      -          },
      -          "breaking_changes_details": {
      -            "type": "array"
      -          },
      -          "change_ir": {
      -            "type": "array"
      -          },
      -          "changelog": {
      -            "type": "array"
      -          },
      -          "compatibility_suggestions": {
      -            "type": "array"
      -          },
      -          "coverage_gap": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "coverage_gap_reason": {
      -            "type": "string"
      -          },
      -          "decision_basis": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "degraded": {
      -            "type": "boolean"
      -          },
      -          "detected_patterns": {
      -            "type": "array"
      -          },
      -          "evidence_quality": {
      -            "type": "string"
      -          },
      -          "fallback_reason": {
      -            "type": "string"
      -          },
      -          "non_breaking_changes": {
      -            "type": "array"
      -          },
      -          "pattern_sources": {
      -            "type": "array"
      -          },
      -          "patterns": {
      -            "type": "array"
      -          },
      -          "pii_findings": {
      -            "type": "array"
      -          },
      -          "policy_violations": {
      -            "type": "array"
      -          },
      -          "remediations": {
      -            "items": {
      -              "additionalProperties": true,
      -              "description": "One remediation for one detected breaking change. `instruction` is imperative prose that a model may read and act on; it is generated per input and is NOT a fixed string, so the schema declares that the field exists and does not pin its text.",
      -              "properties": {
      -                "change_type": {
      -                  "type": "string"
      -                },
      -                "effort": {
      -                  "type": "string"
      -                },
      -                "evidence": {
      -                  "additionalProperties": true,
      -                  "type": "object"
      -                },
      -                "instruction": {
      -                  "description": "Imperative remediation text. Model-visible. Generated per input; not a closed vocabulary.",
      -                  "type": "string"
      -                },
      -                "precise_label": {
      -                  "type": "string"
      -                },
      -                "recommended_transform": {
      -                  "type": "string"
      -                },
      -                "target": {
      -                  "type": "string"
      -                },
      -                "target_ref": {
      -                  "additionalProperties": true,
      -                  "type": "object"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "type": "array"
      -          },
      -          "requires_migration": {
      -            "type": "boolean"
      -          },
      -          "risk_dimensions": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "risk_level": {
      -            "type": "string"
      -          },
      -          "risk_score": {
      -            "type": "integer"
      -          },
      -          "security_findings": {
      -            "type": "array"
      -          },
      -          "semver_suggestion": {
      -            "type": "string"
      -          },
      -          "should_block": {
      -            "type": "boolean"
      -          },
      -          "stats": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "token_cost_impact": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "analysis_control": {
      -        "type": "object"
      -      },
      -      "analysis_outcome": {
      -        "description": "Closed analysis outcome set derived from engine-visible state only.",
      -        "enum": [
      -          "NO_BREAK_DETECTED",
      -          "BREAKS_DETECTED",
      -          "ANALYSIS_FAILED"
      -        ],
      -        "type": "string"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "authorization_effect": {
      -        "const": "NONE",
      -        "description": "Analyze never authorizes; always NONE."
      -      },
      -      "blast_radius": {
      -        "additionalProperties": false,
      -        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      -        "properties": {
      -          "consumers_declared": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "consumers_observed": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "endpoints": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "fields": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "graph_source": {
      -            "enum": [
      -              "none",
      -              "declared",
      -              "observed",
      -              "declared+observed"
      -            ],
      -            "type": "string"
      -          },
      -          "params": {
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "endpoints",
      -          "fields",
      -          "params",
      -          "consumers_declared",
      -          "consumers_observed",
      -          "graph_source"
      -        ],
      -        "type": "object"
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "decision_basis": {},
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows, emitted by the pattern detectors and validated against the decision-spec field contract before they leave the server. Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier, assembled by the response builder; analyze returns a reduced form. Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "may_execute": {
      -        "const": false,
      -        "description": "Analyze never grants execute permission."
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "analyze"
      -      },
      -      "receipt_kind": {
      -        "const": "NONE",
      -        "description": "Analyze never mints a receipt."
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes, computed once per change set. Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "analysis_outcome",
      -      "authorization_effect",
      -      "may_execute",
      -      "receipt_kind",
      -      "decision_spec_version"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": true,
      -    "allOf": [
      -      {
      -        "if": {
      -          "properties": {
      -            "receipt_kind": {
      -              "const": "operation_authorization"
      -            }
      -          },
      -          "required": [
      -            "receipt_kind"
      -          ]
      -        },
      -        "then": {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        }
      -      },
      -      {
      -        "if": {
      -          "properties": {
      -            "execution_action": {
      -              "enum": [
      -                "CONTINUE",
      -                "CONTINUE_WITH_MONITORING"
      -              ]
      -            }
      -          },
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        "then": {
      -          "properties": {
      -            "receipt_kind": {
      -              "const": "operation_authorization"
      -            }
      -          },
      -          "required": [
      -            "receipt_kind",
      -            "chain_receipt",
      -            "decision_result"
      -          ]
      -        }
      -      }
      -    ],
      -    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror, assembled by the response builder alongside the control surface. Dual-write of the flat analysis fields present on the verdict, plus remediations[]. PROPERTIES ARE GENERATED — do not hand-edit them. OPEN BY DESIGN: additionalProperties stays TRUE and this is not an oversight. The fields above are copied conditionally, so which of them appear depends on the input — a verdict with no PII findings simply omits pii_findings. Closing this object would turn every future analysis field into a breaking change that fails inside the consumer, and would reject exactly the verdict paths that no one sampled when the union was built. Declared, not closed: you can now see what you may get, and you must still tolerate more.",
      -        "properties": {
      -          "breaking_changes": {
      -            "type": "integer"
      -          },
      -          "breaking_changes_details": {
      -            "type": "array"
      -          },
      -          "change_ir": {
      -            "type": "array"
      -          },
      -          "changelog": {
      -            "type": "array"
      -          },
      -          "compatibility_suggestions": {
      -            "type": "array"
      -          },
      -          "coverage_gap": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "coverage_gap_reason": {
      -            "type": "string"
      -          },
      -          "decision_basis": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "degraded": {
      -            "type": "boolean"
      -          },
      -          "detected_patterns": {
      -            "type": "array"
      -          },
      -          "evidence_quality": {
      -            "type": "string"
      -          },
      -          "fallback_reason": {
      -            "type": "string"
      -          },
      -          "non_breaking_changes": {
      -            "type": "array"
      -          },
      -          "pattern_sources": {
      -            "type": "array"
      -          },
      -          "patterns": {
      -            "type": "array"
      -          },
      -          "pii_findings": {
      -            "type": "array"
      -          },
      -          "policy_violations": {
      -            "type": "array"
      -          },
      -          "remediations": {
      -            "items": {
      -              "additionalProperties": true,
      -              "description": "One remediation for one detected breaking change. `instruction` is imperative prose that a model may read and act on; it is generated per input and is NOT a fixed string, so the schema declares that the field exists and does not pin its text.",
      -              "properties": {
      -                "change_type": {
      -                  "type": "string"
      -                },
      -                "effort": {
      -                  "type": "string"
      -                },
      -                "evidence": {
      -                  "additionalProperties": true,
      -                  "type": "object"
      -                },
      -                "instruction": {
      -                  "description": "Imperative remediation text. Model-visible. Generated per input; not a closed vocabulary.",
      -                  "type": "string"
      -                },
      -                "precise_label": {
      -                  "type": "string"
      -                },
      -                "recommended_transform": {
      -                  "type": "string"
      -                },
      -                "target": {
      -                  "type": "string"
      -                },
      -                "target_ref": {
      -                  "additionalProperties": true,
      -                  "type": "object"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "type": "array"
      -          },
      -          "requires_migration": {
      -            "type": "boolean"
      -          },
      -          "risk_dimensions": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "risk_level": {
      -            "type": "string"
      -          },
      -          "risk_score": {
      -            "type": "integer"
      -          },
      -          "security_findings": {
      -            "type": "array"
      -          },
      -          "semver_suggestion": {
      -            "type": "string"
      -          },
      -          "should_block": {
      -            "type": "boolean"
      -          },
      -          "stats": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "token_cost_impact": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "blast_radius": {
      -        "additionalProperties": false,
      -        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      -        "properties": {
      -          "consumers_declared": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "consumers_observed": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "endpoints": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "fields": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "graph_source": {
      -            "enum": [
      -              "none",
      -              "declared",
      -              "observed",
      -              "declared+observed"
      -            ],
      -            "type": "string"
      -          },
      -          "params": {
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "endpoints",
      -          "fields",
      -          "params",
      -          "consumers_declared",
      -          "consumers_observed",
      -          "graph_source"
      -        ],
      -        "type": "object"
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "description": "Calibration model version when set; null until a calibrated model ships.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "chain_receipt": {
      -        "type": "string"
      -      },
      -      "chain_status": {
      -        "type": "string"
      -      },
      -      "coderifts_version": {
      -        "type": "string"
      -      },
      -      "control_envelope": {
      -        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      -        "type": "object"
      -      },
      -      "decision": {
      -        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      -        "enum": [
      -          "ALLOW",
      -          "WARN",
      -          "REQUIRE_APPROVAL",
      -          "BLOCK"
      -        ],
      -        "type": "string"
      -      },
      -      "decision_basis": {},
      -      "decision_result": {
      -        "additionalProperties": true,
      -        "description": "decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).",
      -        "properties": {
      -          "audience": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "authority": {
      -            "description": "Additive. { audience, tenant_scope: bound|unbound, binding_proven_at? }. Informational — not permission, not a verify-receipt gate, not an ACL.",
      -            "type": [
      -              "object",
      -              "null"
      -            ]
      -          },
      -          "base": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "blast_radius": {
      -            "description": "ID27 additive COUNTS (not a score). Not permission.",
      -            "properties": {
      -              "consumers_declared": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "consumers_observed": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "endpoints": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "fields": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "graph_source": {
      -                "type": "string"
      -              },
      -              "params": {
      -                "minimum": 0,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "decision": {
      -            "enum": [
      -              "ALLOW",
      -              "WARN",
      -              "REQUIRE_APPROVAL",
      -              "BLOCK"
      -            ],
      -            "type": "string"
      -          },
      -          "decision_body_hash": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "decision_id": {
      -            "type": "string"
      -          },
      -          "derivation": {
      -            "description": "Additive. Present only when derivation:\"server\" produced this envelope. { source, platform?, base_sha, head_sha }. Covered by body_hash; not fingerprint.",
      -            "type": [
      -              "object",
      -              "null"
      -            ]
      -          },
      -          "environment": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "execution_action": {
      -            "enum": [
      -              "CONTINUE",
      -              "CONTINUE_WITH_MONITORING",
      -              "REQUEST_APPROVAL",
      -              "STOP"
      -            ],
      -            "type": "string"
      -          },
      -          "expires_at": {
      -            "type": "string"
      -          },
      -          "fingerprint": {
      -            "type": "string"
      -          },
      -          "head": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "input_fingerprint": {
      -            "type": "string"
      -          },
      -          "operation": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "receipt": {
      -            "type": "object"
      -          },
      -          "repository": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "safe_for_agent": {
      -            "type": "boolean"
      -          },
      -          "spec_version": {
      -            "pattern": "^decision-result\\.v1(\\.[0-9]+)?$",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows, emitted by the pattern detectors and validated against the decision-spec field contract before they leave the server. Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "execution_action": {
      -        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      -        "enum": [
      -          "CONTINUE",
      -          "CONTINUE_WITH_MONITORING",
      -          "REQUEST_APPROVAL",
      -          "STOP"
      -        ],
      -        "type": "string"
      -      },
      -      "execution_grant": {
      -        "description": "Opt-in cr.exec.v1 execution grant (PHASE-0). Issued only when include_execution_grant is true on authorize. Short-lived mutation-bound sibling of chain_receipt; never unsigned. Optional inner state_nonce (ATOMIC profile) is additive and is NOT in scope_hash.",
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier, assembled by the response builder; analyze returns a reduced form. Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "authorize"
      -      },
      -      "receipt_kind": {
      -        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      -        "enum": [
      -          "operation_authorization",
      -          "NONE"
      -        ],
      -        "type": "string"
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "safe_for_agent": {
      -        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      -        "type": "boolean"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes, computed once per change set. Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "decision",
      -      "execution_action",
      -      "safe_for_agent",
      -      "receipt_kind",
      -      "decision_spec_version"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, execution_grant, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      +    "not": {
      +      "anyOf": [
      +        {
      +          "required": [
      +            "decision"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "safe_for_agent"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "execution_grant"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "decision_result"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "control_envelope"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "required_action_core"
      +          ]
      +        }
      +      ]
      +    },
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror, assembled by the response builder alongside the control surface. Dual-write of the flat analysis fields present on the verdict, plus remediations[]. PROPERTIES ARE GENERATED — do not hand-edit them. OPEN BY DESIGN: additionalProperties stays TRUE and this is not an oversight. The fields above are copied conditionally, so which of them appear depends on the input — a verdict with no PII findings simply omits pii_findings. Closing this object would turn every future analysis field into a breaking change that fails inside the consumer, and would reject exactly the verdict paths that no one sampled when the union was built. Declared, not closed: you can now see what you may get, and you must still tolerate more.",
      +        "properties": {
      +          "breaking_changes": {
      +            "type": "integer"
      +          },
      +          "breaking_changes_details": {
      +            "type": "array"
      +          },
      +          "change_ir": {
      +            "type": "array"
      +          },
      +          "changelog": {
      +            "type": "array"
      +          },
      +          "compatibility_suggestions": {
      +            "type": "array"
      +          },
      +          "coverage_gap": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "coverage_gap_reason": {
      +            "type": "string"
      +          },
      +          "decision_basis": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "degraded": {
      +            "type": "boolean"
      +          },
      +          "detected_patterns": {
      +            "type": "array"
      +          },
      +          "evidence_quality": {
      +            "type": "string"
      +          },
      +          "fallback_reason": {
      +            "type": "string"
      +          },
      +          "non_breaking_changes": {
      +            "type": "array"
      +          },
      +          "pattern_sources": {
      +            "type": "array"
      +          },
      +          "patterns": {
      +            "type": "array"
      +          },
      +          "pii_findings": {
      +            "type": "array"
      +          },
      +          "policy_violations": {
      +            "type": "array"
      +          },
      +          "remediations": {
      +            "items": {
      +              "additionalProperties": true,
      +              "description": "One remediation for one detected breaking change. `instruction` is imperative prose that a model may read and act on; it is generated per input and is NOT a fixed string, so the schema declares that the field exists and does not pin its text.",
      +              "properties": {
      +                "change_type": {
      +                  "type": "string"
      +                },
      +                "effort": {
      +                  "type": "string"
      +                },
      +                "evidence": {
      +                  "additionalProperties": true,
      +                  "type": "object"
      +                },
      +                "instruction": {
      +                  "description": "Imperative remediation text. Model-visible. Generated per input; not a closed vocabulary.",
      +                  "type": "string"
      +                },
      +                "precise_label": {
      +                  "type": "string"
      +                },
      +                "recommended_transform": {
      +                  "type": "string"
      +                },
      +                "target": {
      +                  "type": "string"
      +                },
      +                "target_ref": {
      +                  "additionalProperties": true,
      +                  "type": "object"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "requires_migration": {
      +            "type": "boolean"
      +          },
      +          "risk_dimensions": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "risk_level": {
      +            "type": "string"
      +          },
      +          "risk_score": {
      +            "type": "integer"
      +          },
      +          "security_findings": {
      +            "type": "array"
      +          },
      +          "semver_suggestion": {
      +            "type": "string"
      +          },
      +          "should_block": {
      +            "type": "boolean"
      +          },
      +          "stats": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "token_cost_impact": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "analysis_control": {
      +        "type": "object"
      +      },
      +      "analysis_outcome": {
      +        "description": "Closed analysis outcome set derived from engine-visible state only.",
      +        "enum": [
      +          "NO_BREAK_DETECTED",
      +          "BREAKS_DETECTED",
      +          "ANALYSIS_FAILED"
      +        ],
      +        "type": "string"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "authorization_effect": {
      +        "const": "NONE",
      +        "description": "Analyze never authorizes; always NONE."
      +      },
      +      "blast_radius": {
      +        "additionalProperties": false,
      +        "description": "Additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      +        "properties": {
      +          "consumers_declared": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "consumers_observed": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "endpoints": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "fields": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "graph_source": {
      +            "enum": [
      +              "none",
      +              "declared",
      +              "observed",
      +              "declared+observed"
      +            ],
      +            "type": "string"
      +          },
      +          "params": {
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "endpoints",
      +          "fields",
      +          "params",
      +          "consumers_declared",
      +          "consumers_observed",
      +          "graph_source"
      +        ],
      +        "type": "object"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows, mapped from the engine's change IR. Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "decision_basis": {},
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows, emitted by the pattern detectors and validated against the decision-spec field contract before they leave the server. Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier, assembled by the response builder; analyze returns a reduced form. Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "may_execute": {
      +        "const": false,
      +        "description": "Analyze never grants execute permission."
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "analyze"
      +      },
      +      "receipt_kind": {
      +        "const": "NONE",
      +        "description": "Analyze never mints a receipt."
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes, computed once per change set. Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "analysis_outcome",
      +      "authorization_effect",
      +      "may_execute",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": true,
      +    "allOf": [
      +      {
      +        "if": {
      +          "properties": {
      +            "receipt_kind": {
      +              "const": "operation_authorization"
      +            }
      +          },
      +          "required": [
      +            "receipt_kind"
      +          ]
      +        },
      +        "then": {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        }
      +      },
      +      {
      +        "if": {
      +          "properties": {
      +            "execution_action": {
      +              "enum": [
      +                "CONTINUE",
      +                "CONTINUE_WITH_MONITORING"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        "then": {
      +          "properties": {
      +            "receipt_kind": {
      +              "const": "operation_authorization"
      +            }
      +          },
      +          "required": [
      +            "receipt_kind",
      +            "chain_receipt",
      +            "decision_result"
      +          ]
      +        }
      +      }
      +    ],
      +    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror, assembled by the response builder alongside the control surface. Dual-write of the flat analysis fields present on the verdict, plus remediations[]. PROPERTIES ARE GENERATED — do not hand-edit them. OPEN BY DESIGN: additionalProperties stays TRUE and this is not an oversight. The fields above are copied conditionally, so which of them appear depends on the input — a verdict with no PII findings simply omits pii_findings. Closing this object would turn every future analysis field into a breaking change that fails inside the consumer, and would reject exactly the verdict paths that no one sampled when the union was built. Declared, not closed: you can now see what you may get, and you must still tolerate more.",
      +        "properties": {
      +          "breaking_changes": {
      +            "type": "integer"
      +          },
      +          "breaking_changes_details": {
      +            "type": "array"
      +          },
      +          "change_ir": {
      +            "type": "array"
      +          },
      +          "changelog": {
      +            "type": "array"
      +          },
      +          "compatibility_suggestions": {
      +            "type": "array"
      +          },
      +          "coverage_gap": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "coverage_gap_reason": {
      +            "type": "string"
      +          },
      +          "decision_basis": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "degraded": {
      +            "type": "boolean"
      +          },
      +          "detected_patterns": {
      +            "type": "array"
      +          },
      +          "evidence_quality": {
      +            "type": "string"
      +          },
      +          "fallback_reason": {
      +            "type": "string"
      +          },
      +          "non_breaking_changes": {
      +            "type": "array"
      +          },
      +          "pattern_sources": {
      +            "type": "array"
      +          },
      +          "patterns": {
      +            "type": "array"
      +          },
      +          "pii_findings": {
      +            "type": "array"
      +          },
      +          "policy_violations": {
      +            "type": "array"
      +          },
      +          "remediations": {
      +            "items": {
      +              "additionalProperties": true,
      +              "description": "One remediation for one detected breaking change. `instruction` is imperative prose that a model may read and act on; it is generated per input and is NOT a fixed string, so the schema declares that the field exists and does not pin its text.",
      +              "properties": {
      +                "change_type": {
      +                  "type": "string"
      +                },
      +                "effort": {
      +                  "type": "string"
      +                },
      +                "evidence": {
      +                  "additionalProperties": true,
      +                  "type": "object"
      +                },
      +                "instruction": {
      +                  "description": "Imperative remediation text. Model-visible. Generated per input; not a closed vocabulary.",
      +                  "type": "string"
      +                },
      +                "precise_label": {
      +                  "type": "string"
      +                },
      +                "recommended_transform": {
      +                  "type": "string"
      +                },
      +                "target": {
      +                  "type": "string"
      +                },
      +                "target_ref": {
      +                  "additionalProperties": true,
      +                  "type": "object"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "requires_migration": {
      +            "type": "boolean"
      +          },
      +          "risk_dimensions": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "risk_level": {
      +            "type": "string"
      +          },
      +          "risk_score": {
      +            "type": "integer"
      +          },
      +          "security_findings": {
      +            "type": "array"
      +          },
      +          "semver_suggestion": {
      +            "type": "string"
      +          },
      +          "should_block": {
      +            "type": "boolean"
      +          },
      +          "stats": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "token_cost_impact": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "blast_radius": {
      +        "additionalProperties": false,
      +        "description": "Additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      +        "properties": {
      +          "consumers_declared": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "consumers_observed": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "endpoints": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "fields": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "graph_source": {
      +            "enum": [
      +              "none",
      +              "declared",
      +              "observed",
      +              "declared+observed"
      +            ],
      +            "type": "string"
      +          },
      +          "params": {
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "endpoints",
      +          "fields",
      +          "params",
      +          "consumers_declared",
      +          "consumers_observed",
      +          "graph_source"
      +        ],
      +        "type": "object"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows, mapped from the engine's change IR. Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "description": "Calibration model version when set; null until a calibrated model ships.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "chain_receipt": {
      +        "type": "string"
      +      },
      +      "chain_status": {
      +        "type": "string"
      +      },
      +      "coderifts_version": {
      +        "type": "string"
      +      },
      +      "control_envelope": {
      +        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      +        "type": "object"
      +      },
      +      "decision": {
      +        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      +        "enum": [
      +          "ALLOW",
      +          "WARN",
      +          "REQUIRE_APPROVAL",
      +          "BLOCK"
      +        ],
      +        "type": "string"
      +      },
      +      "decision_basis": {},
      +      "decision_result": {
      +        "additionalProperties": true,
      +        "description": "decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).",
      +        "properties": {
      +          "audience": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "authority": {
      +            "description": "Additive. { audience, tenant_scope: bound|unbound, binding_proven_at? }. Informational — not permission, not a verify-receipt gate, not an ACL.",
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "base": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "blast_radius": {
      +            "description": "Additive COUNTS (not a score). Not permission.",
      +            "properties": {
      +              "consumers_declared": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "consumers_observed": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "endpoints": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "fields": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "graph_source": {
      +                "type": "string"
      +              },
      +              "params": {
      +                "minimum": 0,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "decision": {
      +            "enum": [
      +              "ALLOW",
      +              "WARN",
      +              "REQUIRE_APPROVAL",
      +              "BLOCK"
      +            ],
      +            "type": "string"
      +          },
      +          "decision_body_hash": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "decision_id": {
      +            "type": "string"
      +          },
      +          "derivation": {
      +            "description": "Additive. Present only when derivation:\"server\" produced this envelope. { source, platform?, base_sha, head_sha }. Covered by body_hash; not fingerprint.",
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "environment": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "execution_action": {
      +            "enum": [
      +              "CONTINUE",
      +              "CONTINUE_WITH_MONITORING",
      +              "REQUEST_APPROVAL",
      +              "STOP"
      +            ],
      +            "type": "string"
      +          },
      +          "expires_at": {
      +            "type": "string"
      +          },
      +          "fingerprint": {
      +            "type": "string"
      +          },
      +          "head": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "input_fingerprint": {
      +            "type": "string"
      +          },
      +          "operation": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "receipt": {
      +            "type": "object"
      +          },
      +          "repository": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "safe_for_agent": {
      +            "type": "boolean"
      +          },
      +          "spec_version": {
      +            "pattern": "^decision-result\\.v1(\\.[0-9]+)?$",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows, emitted by the pattern detectors and validated against the decision-spec field contract before they leave the server. Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "execution_action": {
      +        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      +        "enum": [
      +          "CONTINUE",
      +          "CONTINUE_WITH_MONITORING",
      +          "REQUEST_APPROVAL",
      +          "STOP"
      +        ],
      +        "type": "string"
      +      },
      +      "execution_grant": {
      +        "description": "Opt-in cr.exec.v1 execution grant (PHASE-0). Issued only when include_execution_grant is true on authorize. Short-lived mutation-bound sibling of chain_receipt; never unsigned. Optional inner state_nonce (ATOMIC profile) is additive and is NOT in scope_hash.",
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier, assembled by the response builder; analyze returns a reduced form. Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "authorize"
      +      },
      +      "receipt_kind": {
      +        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      +        "enum": [
      +          "operation_authorization",
      +          "NONE"
      +        ],
      +        "type": "string"
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "safe_for_agent": {
      +        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      +        "type": "boolean"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes, computed once per change set. Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "decision",
      +      "execution_action",
      +      "safe_for_agent",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  }
      +]
  5. Changed1 schema field changed
    • changedOutput schema / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, execution_grant, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      -    "not": {
      -      "anyOf": [
      -        {
      -          "required": [
      -            "decision"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "safe_for_agent"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "execution_grant"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "decision_result"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "control_envelope"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "required_action_core"
      -          ]
      -        }
      -      ]
      -    },
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of the flat analysis fields present on the verdict, plus remediations[]. PROPERTIES ARE GENERATED from ANALYSIS_TIER_FIELDS + remediations by scripts/generate-analysis-tier-schema.js — do not hand-edit them. OPEN BY DESIGN: additionalProperties stays TRUE and this is not an oversight. The fields above are copied conditionally, so which of them appear depends on the input — a verdict with no PII findings simply omits pii_findings. Closing this object would turn every future analysis field into a breaking change that fails inside the consumer, and would reject exactly the verdict paths that no one sampled when the union was built. Declared, not closed: you can now see what you may get, and you must still tolerate more.",
      -        "properties": {
      -          "breaking_changes": {
      -            "type": "integer"
      -          },
      -          "breaking_changes_details": {
      -            "type": "array"
      -          },
      -          "change_ir": {
      -            "type": "array"
      -          },
      -          "changelog": {
      -            "type": "array"
      -          },
      -          "compatibility_suggestions": {
      -            "type": "array"
      -          },
      -          "coverage_gap": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "coverage_gap_reason": {
      -            "type": "string"
      -          },
      -          "decision_basis": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "degraded": {
      -            "type": "boolean"
      -          },
      -          "detected_patterns": {
      -            "type": "array"
      -          },
      -          "evidence_quality": {
      -            "type": "string"
      -          },
      -          "fallback_reason": {
      -            "type": "string"
      -          },
      -          "non_breaking_changes": {
      -            "type": "array"
      -          },
      -          "pattern_sources": {
      -            "type": "array"
      -          },
      -          "patterns": {
      -            "type": "array"
      -          },
      -          "pii_findings": {
      -            "type": "array"
      -          },
      -          "policy_violations": {
      -            "type": "array"
      -          },
      -          "remediations": {
      -            "items": {
      -              "additionalProperties": true,
      -              "description": "One remediation for one detected breaking change. `instruction` is imperative prose that a model may read and act on; it is generated per input and is NOT a fixed string, so the schema declares that the field exists and does not pin its text.",
      -              "properties": {
      -                "change_type": {
      -                  "type": "string"
      -                },
      -                "effort": {
      -                  "type": "string"
      -                },
      -                "evidence": {
      -                  "additionalProperties": true,
      -                  "type": "object"
      -                },
      -                "instruction": {
      -                  "description": "Imperative remediation text. Model-visible. Generated per input; not a closed vocabulary.",
      -                  "type": "string"
      -                },
      -                "precise_label": {
      -                  "type": "string"
      -                },
      -                "recommended_transform": {
      -                  "type": "string"
      -                },
      -                "target": {
      -                  "type": "string"
      -                },
      -                "target_ref": {
      -                  "additionalProperties": true,
      -                  "type": "object"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "type": "array"
      -          },
      -          "requires_migration": {
      -            "type": "boolean"
      -          },
      -          "risk_dimensions": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "risk_level": {
      -            "type": "string"
      -          },
      -          "risk_score": {
      -            "type": "integer"
      -          },
      -          "security_findings": {
      -            "type": "array"
      -          },
      -          "semver_suggestion": {
      -            "type": "string"
      -          },
      -          "should_block": {
      -            "type": "boolean"
      -          },
      -          "stats": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "token_cost_impact": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "analysis_control": {
      -        "type": "object"
      -      },
      -      "analysis_outcome": {
      -        "description": "Closed analysis outcome set derived from engine-visible state only.",
      -        "enum": [
      -          "NO_BREAK_DETECTED",
      -          "BREAKS_DETECTED",
      -          "ANALYSIS_FAILED"
      -        ],
      -        "type": "string"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "authorization_effect": {
      -        "const": "NONE",
      -        "description": "Analyze never authorizes; always NONE."
      -      },
      -      "blast_radius": {
      -        "additionalProperties": false,
      -        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      -        "properties": {
      -          "consumers_declared": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "consumers_observed": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "endpoints": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "fields": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "graph_source": {
      -            "enum": [
      -              "none",
      -              "declared",
      -              "observed",
      -              "declared+observed"
      -            ],
      -            "type": "string"
      -          },
      -          "params": {
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "endpoints",
      -          "fields",
      -          "params",
      -          "consumers_declared",
      -          "consumers_observed",
      -          "graph_source"
      -        ],
      -        "type": "object"
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "decision_basis": {},
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "may_execute": {
      -        "const": false,
      -        "description": "Analyze never grants execute permission."
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "analyze"
      -      },
      -      "receipt_kind": {
      -        "const": "NONE",
      -        "description": "Analyze never mints a receipt."
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "analysis_outcome",
      -      "authorization_effect",
      -      "may_execute",
      -      "receipt_kind",
      -      "decision_spec_version"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": true,
      -    "allOf": [
      -      {
      -        "if": {
      -          "properties": {
      -            "receipt_kind": {
      -              "const": "operation_authorization"
      -            }
      -          },
      -          "required": [
      -            "receipt_kind"
      -          ]
      -        },
      -        "then": {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        }
      -      },
      -      {
      -        "if": {
      -          "properties": {
      -            "execution_action": {
      -              "enum": [
      -                "CONTINUE",
      -                "CONTINUE_WITH_MONITORING"
      -              ]
      -            }
      -          },
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        "then": {
      -          "properties": {
      -            "receipt_kind": {
      -              "const": "operation_authorization"
      -            }
      -          },
      -          "required": [
      -            "receipt_kind",
      -            "chain_receipt",
      -            "decision_result"
      -          ]
      -        }
      -      }
      -    ],
      -    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of the flat analysis fields present on the verdict, plus remediations[]. PROPERTIES ARE GENERATED from ANALYSIS_TIER_FIELDS + remediations by scripts/generate-analysis-tier-schema.js — do not hand-edit them. OPEN BY DESIGN: additionalProperties stays TRUE and this is not an oversight. The fields above are copied conditionally, so which of them appear depends on the input — a verdict with no PII findings simply omits pii_findings. Closing this object would turn every future analysis field into a breaking change that fails inside the consumer, and would reject exactly the verdict paths that no one sampled when the union was built. Declared, not closed: you can now see what you may get, and you must still tolerate more.",
      -        "properties": {
      -          "breaking_changes": {
      -            "type": "integer"
      -          },
      -          "breaking_changes_details": {
      -            "type": "array"
      -          },
      -          "change_ir": {
      -            "type": "array"
      -          },
      -          "changelog": {
      -            "type": "array"
      -          },
      -          "compatibility_suggestions": {
      -            "type": "array"
      -          },
      -          "coverage_gap": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "coverage_gap_reason": {
      -            "type": "string"
      -          },
      -          "decision_basis": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "degraded": {
      -            "type": "boolean"
      -          },
      -          "detected_patterns": {
      -            "type": "array"
      -          },
      -          "evidence_quality": {
      -            "type": "string"
      -          },
      -          "fallback_reason": {
      -            "type": "string"
      -          },
      -          "non_breaking_changes": {
      -            "type": "array"
      -          },
      -          "pattern_sources": {
      -            "type": "array"
      -          },
      -          "patterns": {
      -            "type": "array"
      -          },
      -          "pii_findings": {
      -            "type": "array"
      -          },
      -          "policy_violations": {
      -            "type": "array"
      -          },
      -          "remediations": {
      -            "items": {
      -              "additionalProperties": true,
      -              "description": "One remediation for one detected breaking change. `instruction` is imperative prose that a model may read and act on; it is generated per input and is NOT a fixed string, so the schema declares that the field exists and does not pin its text.",
      -              "properties": {
      -                "change_type": {
      -                  "type": "string"
      -                },
      -                "effort": {
      -                  "type": "string"
      -                },
      -                "evidence": {
      -                  "additionalProperties": true,
      -                  "type": "object"
      -                },
      -                "instruction": {
      -                  "description": "Imperative remediation text. Model-visible. Generated per input; not a closed vocabulary.",
      -                  "type": "string"
      -                },
      -                "precise_label": {
      -                  "type": "string"
      -                },
      -                "recommended_transform": {
      -                  "type": "string"
      -                },
      -                "target": {
      -                  "type": "string"
      -                },
      -                "target_ref": {
      -                  "additionalProperties": true,
      -                  "type": "object"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "type": "array"
      -          },
      -          "requires_migration": {
      -            "type": "boolean"
      -          },
      -          "risk_dimensions": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "risk_level": {
      -            "type": "string"
      -          },
      -          "risk_score": {
      -            "type": "integer"
      -          },
      -          "security_findings": {
      -            "type": "array"
      -          },
      -          "semver_suggestion": {
      -            "type": "string"
      -          },
      -          "should_block": {
      -            "type": "boolean"
      -          },
      -          "stats": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "token_cost_impact": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "blast_radius": {
      -        "additionalProperties": false,
      -        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      -        "properties": {
      -          "consumers_declared": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "consumers_observed": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "endpoints": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "fields": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "graph_source": {
      -            "enum": [
      -              "none",
      -              "declared",
      -              "observed",
      -              "declared+observed"
      -            ],
      -            "type": "string"
      -          },
      -          "params": {
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "endpoints",
      -          "fields",
      -          "params",
      -          "consumers_declared",
      -          "consumers_observed",
      -          "graph_source"
      -        ],
      -        "type": "object"
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "description": "Calibration model version when set; null until a calibrated model ships.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "chain_receipt": {
      -        "type": "string"
      -      },
      -      "chain_status": {
      -        "type": "string"
      -      },
      -      "coderifts_version": {
      -        "type": "string"
      -      },
      -      "control_envelope": {
      -        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      -        "type": "object"
      -      },
      -      "decision": {
      -        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      -        "enum": [
      -          "ALLOW",
      -          "WARN",
      -          "REQUIRE_APPROVAL",
      -          "BLOCK"
      -        ],
      -        "type": "string"
      -      },
      -      "decision_basis": {},
      -      "decision_result": {
      -        "additionalProperties": true,
      -        "description": "decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).",
      -        "properties": {
      -          "audience": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "authority": {
      -            "description": "Additive. { audience, tenant_scope: bound|unbound, binding_proven_at? }. Informational — not permission, not a verify-receipt gate, not an ACL.",
      -            "type": [
      -              "object",
      -              "null"
      -            ]
      -          },
      -          "base": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "blast_radius": {
      -            "description": "ID27 additive COUNTS (not a score). Not permission.",
      -            "properties": {
      -              "consumers_declared": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "consumers_observed": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "endpoints": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "fields": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "graph_source": {
      -                "type": "string"
      -              },
      -              "params": {
      -                "minimum": 0,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "decision": {
      -            "enum": [
      -              "ALLOW",
      -              "WARN",
      -              "REQUIRE_APPROVAL",
      -              "BLOCK"
      -            ],
      -            "type": "string"
      -          },
      -          "decision_body_hash": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "decision_id": {
      -            "type": "string"
      -          },
      -          "derivation": {
      -            "description": "Additive. Present only when derivation:\"server\" produced this envelope. { source, platform?, base_sha, head_sha }. Covered by body_hash; not fingerprint.",
      -            "type": [
      -              "object",
      -              "null"
      -            ]
      -          },
      -          "environment": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "execution_action": {
      -            "enum": [
      -              "CONTINUE",
      -              "CONTINUE_WITH_MONITORING",
      -              "REQUEST_APPROVAL",
      -              "STOP"
      -            ],
      -            "type": "string"
      -          },
      -          "expires_at": {
      -            "type": "string"
      -          },
      -          "fingerprint": {
      -            "type": "string"
      -          },
      -          "head": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "input_fingerprint": {
      -            "type": "string"
      -          },
      -          "operation": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "receipt": {
      -            "type": "object"
      -          },
      -          "repository": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "safe_for_agent": {
      -            "type": "boolean"
      -          },
      -          "spec_version": {
      -            "pattern": "^decision-result\\.v1(\\.[0-9]+)?$",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "execution_action": {
      -        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      -        "enum": [
      -          "CONTINUE",
      -          "CONTINUE_WITH_MONITORING",
      -          "REQUEST_APPROVAL",
      -          "STOP"
      -        ],
      -        "type": "string"
      -      },
      -      "execution_grant": {
      -        "description": "Opt-in cr.exec.v1 execution grant (PHASE-0). Issued only when include_execution_grant is true on authorize. Short-lived mutation-bound sibling of chain_receipt; never unsigned. Optional inner state_nonce (ATOMIC profile) is additive and is NOT in scope_hash. See docs/cr-exec-v1.md / docs/cr-exec-attest-v1.md.",
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "authorize"
      -      },
      -      "receipt_kind": {
      -        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      -        "enum": [
      -          "operation_authorization",
      -          "NONE"
      -        ],
      -        "type": "string"
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "safe_for_agent": {
      -        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      -        "type": "boolean"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "decision",
      -      "execution_action",
      -      "safe_for_agent",
      -      "receipt_kind",
      -      "decision_spec_version"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, execution_grant, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      +    "not": {
      +      "anyOf": [
      +        {
      +          "required": [
      +            "decision"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "safe_for_agent"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "execution_grant"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "decision_result"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "control_envelope"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "required_action_core"
      +          ]
      +        }
      +      ]
      +    },
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror, assembled by the response builder alongside the control surface. Dual-write of the flat analysis fields present on the verdict, plus remediations[]. PROPERTIES ARE GENERATED — do not hand-edit them. OPEN BY DESIGN: additionalProperties stays TRUE and this is not an oversight. The fields above are copied conditionally, so which of them appear depends on the input — a verdict with no PII findings simply omits pii_findings. Closing this object would turn every future analysis field into a breaking change that fails inside the consumer, and would reject exactly the verdict paths that no one sampled when the union was built. Declared, not closed: you can now see what you may get, and you must still tolerate more.",
      +        "properties": {
      +          "breaking_changes": {
      +            "type": "integer"
      +          },
      +          "breaking_changes_details": {
      +            "type": "array"
      +          },
      +          "change_ir": {
      +            "type": "array"
      +          },
      +          "changelog": {
      +            "type": "array"
      +          },
      +          "compatibility_suggestions": {
      +            "type": "array"
      +          },
      +          "coverage_gap": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "coverage_gap_reason": {
      +            "type": "string"
      +          },
      +          "decision_basis": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "degraded": {
      +            "type": "boolean"
      +          },
      +          "detected_patterns": {
      +            "type": "array"
      +          },
      +          "evidence_quality": {
      +            "type": "string"
      +          },
      +          "fallback_reason": {
      +            "type": "string"
      +          },
      +          "non_breaking_changes": {
      +            "type": "array"
      +          },
      +          "pattern_sources": {
      +            "type": "array"
      +          },
      +          "patterns": {
      +            "type": "array"
      +          },
      +          "pii_findings": {
      +            "type": "array"
      +          },
      +          "policy_violations": {
      +            "type": "array"
      +          },
      +          "remediations": {
      +            "items": {
      +              "additionalProperties": true,
      +              "description": "One remediation for one detected breaking change. `instruction` is imperative prose that a model may read and act on; it is generated per input and is NOT a fixed string, so the schema declares that the field exists and does not pin its text.",
      +              "properties": {
      +                "change_type": {
      +                  "type": "string"
      +                },
      +                "effort": {
      +                  "type": "string"
      +                },
      +                "evidence": {
      +                  "additionalProperties": true,
      +                  "type": "object"
      +                },
      +                "instruction": {
      +                  "description": "Imperative remediation text. Model-visible. Generated per input; not a closed vocabulary.",
      +                  "type": "string"
      +                },
      +                "precise_label": {
      +                  "type": "string"
      +                },
      +                "recommended_transform": {
      +                  "type": "string"
      +                },
      +                "target": {
      +                  "type": "string"
      +                },
      +                "target_ref": {
      +                  "additionalProperties": true,
      +                  "type": "object"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "requires_migration": {
      +            "type": "boolean"
      +          },
      +          "risk_dimensions": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "risk_level": {
      +            "type": "string"
      +          },
      +          "risk_score": {
      +            "type": "integer"
      +          },
      +          "security_findings": {
      +            "type": "array"
      +          },
      +          "semver_suggestion": {
      +            "type": "string"
      +          },
      +          "should_block": {
      +            "type": "boolean"
      +          },
      +          "stats": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "token_cost_impact": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "analysis_control": {
      +        "type": "object"
      +      },
      +      "analysis_outcome": {
      +        "description": "Closed analysis outcome set derived from engine-visible state only.",
      +        "enum": [
      +          "NO_BREAK_DETECTED",
      +          "BREAKS_DETECTED",
      +          "ANALYSIS_FAILED"
      +        ],
      +        "type": "string"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "authorization_effect": {
      +        "const": "NONE",
      +        "description": "Analyze never authorizes; always NONE."
      +      },
      +      "blast_radius": {
      +        "additionalProperties": false,
      +        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      +        "properties": {
      +          "consumers_declared": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "consumers_observed": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "endpoints": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "fields": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "graph_source": {
      +            "enum": [
      +              "none",
      +              "declared",
      +              "observed",
      +              "declared+observed"
      +            ],
      +            "type": "string"
      +          },
      +          "params": {
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "endpoints",
      +          "fields",
      +          "params",
      +          "consumers_declared",
      +          "consumers_observed",
      +          "graph_source"
      +        ],
      +        "type": "object"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "decision_basis": {},
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows, emitted by the pattern detectors and validated against the decision-spec field contract before they leave the server. Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier, assembled by the response builder; analyze returns a reduced form. Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "may_execute": {
      +        "const": false,
      +        "description": "Analyze never grants execute permission."
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "analyze"
      +      },
      +      "receipt_kind": {
      +        "const": "NONE",
      +        "description": "Analyze never mints a receipt."
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes, computed once per change set. Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "analysis_outcome",
      +      "authorization_effect",
      +      "may_execute",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": true,
      +    "allOf": [
      +      {
      +        "if": {
      +          "properties": {
      +            "receipt_kind": {
      +              "const": "operation_authorization"
      +            }
      +          },
      +          "required": [
      +            "receipt_kind"
      +          ]
      +        },
      +        "then": {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        }
      +      },
      +      {
      +        "if": {
      +          "properties": {
      +            "execution_action": {
      +              "enum": [
      +                "CONTINUE",
      +                "CONTINUE_WITH_MONITORING"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        "then": {
      +          "properties": {
      +            "receipt_kind": {
      +              "const": "operation_authorization"
      +            }
      +          },
      +          "required": [
      +            "receipt_kind",
      +            "chain_receipt",
      +            "decision_result"
      +          ]
      +        }
      +      }
      +    ],
      +    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror, assembled by the response builder alongside the control surface. Dual-write of the flat analysis fields present on the verdict, plus remediations[]. PROPERTIES ARE GENERATED — do not hand-edit them. OPEN BY DESIGN: additionalProperties stays TRUE and this is not an oversight. The fields above are copied conditionally, so which of them appear depends on the input — a verdict with no PII findings simply omits pii_findings. Closing this object would turn every future analysis field into a breaking change that fails inside the consumer, and would reject exactly the verdict paths that no one sampled when the union was built. Declared, not closed: you can now see what you may get, and you must still tolerate more.",
      +        "properties": {
      +          "breaking_changes": {
      +            "type": "integer"
      +          },
      +          "breaking_changes_details": {
      +            "type": "array"
      +          },
      +          "change_ir": {
      +            "type": "array"
      +          },
      +          "changelog": {
      +            "type": "array"
      +          },
      +          "compatibility_suggestions": {
      +            "type": "array"
      +          },
      +          "coverage_gap": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "coverage_gap_reason": {
      +            "type": "string"
      +          },
      +          "decision_basis": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "degraded": {
      +            "type": "boolean"
      +          },
      +          "detected_patterns": {
      +            "type": "array"
      +          },
      +          "evidence_quality": {
      +            "type": "string"
      +          },
      +          "fallback_reason": {
      +            "type": "string"
      +          },
      +          "non_breaking_changes": {
      +            "type": "array"
      +          },
      +          "pattern_sources": {
      +            "type": "array"
      +          },
      +          "patterns": {
      +            "type": "array"
      +          },
      +          "pii_findings": {
      +            "type": "array"
      +          },
      +          "policy_violations": {
      +            "type": "array"
      +          },
      +          "remediations": {
      +            "items": {
      +              "additionalProperties": true,
      +              "description": "One remediation for one detected breaking change. `instruction` is imperative prose that a model may read and act on; it is generated per input and is NOT a fixed string, so the schema declares that the field exists and does not pin its text.",
      +              "properties": {
      +                "change_type": {
      +                  "type": "string"
      +                },
      +                "effort": {
      +                  "type": "string"
      +                },
      +                "evidence": {
      +                  "additionalProperties": true,
      +                  "type": "object"
      +                },
      +                "instruction": {
      +                  "description": "Imperative remediation text. Model-visible. Generated per input; not a closed vocabulary.",
      +                  "type": "string"
      +                },
      +                "precise_label": {
      +                  "type": "string"
      +                },
      +                "recommended_transform": {
      +                  "type": "string"
      +                },
      +                "target": {
      +                  "type": "string"
      +                },
      +                "target_ref": {
      +                  "additionalProperties": true,
      +                  "type": "object"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "requires_migration": {
      +            "type": "boolean"
      +          },
      +          "risk_dimensions": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "risk_level": {
      +            "type": "string"
      +          },
      +          "risk_score": {
      +            "type": "integer"
      +          },
      +          "security_findings": {
      +            "type": "array"
      +          },
      +          "semver_suggestion": {
      +            "type": "string"
      +          },
      +          "should_block": {
      +            "type": "boolean"
      +          },
      +          "stats": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "token_cost_impact": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "blast_radius": {
      +        "additionalProperties": false,
      +        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      +        "properties": {
      +          "consumers_declared": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "consumers_observed": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "endpoints": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "fields": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "graph_source": {
      +            "enum": [
      +              "none",
      +              "declared",
      +              "observed",
      +              "declared+observed"
      +            ],
      +            "type": "string"
      +          },
      +          "params": {
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "endpoints",
      +          "fields",
      +          "params",
      +          "consumers_declared",
      +          "consumers_observed",
      +          "graph_source"
      +        ],
      +        "type": "object"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "description": "Calibration model version when set; null until a calibrated model ships.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "chain_receipt": {
      +        "type": "string"
      +      },
      +      "chain_status": {
      +        "type": "string"
      +      },
      +      "coderifts_version": {
      +        "type": "string"
      +      },
      +      "control_envelope": {
      +        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      +        "type": "object"
      +      },
      +      "decision": {
      +        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      +        "enum": [
      +          "ALLOW",
      +          "WARN",
      +          "REQUIRE_APPROVAL",
      +          "BLOCK"
      +        ],
      +        "type": "string"
      +      },
      +      "decision_basis": {},
      +      "decision_result": {
      +        "additionalProperties": true,
      +        "description": "decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).",
      +        "properties": {
      +          "audience": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "authority": {
      +            "description": "Additive. { audience, tenant_scope: bound|unbound, binding_proven_at? }. Informational — not permission, not a verify-receipt gate, not an ACL.",
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "base": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "blast_radius": {
      +            "description": "ID27 additive COUNTS (not a score). Not permission.",
      +            "properties": {
      +              "consumers_declared": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "consumers_observed": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "endpoints": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "fields": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "graph_source": {
      +                "type": "string"
      +              },
      +              "params": {
      +                "minimum": 0,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "decision": {
      +            "enum": [
      +              "ALLOW",
      +              "WARN",
      +              "REQUIRE_APPROVAL",
      +              "BLOCK"
      +            ],
      +            "type": "string"
      +          },
      +          "decision_body_hash": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "decision_id": {
      +            "type": "string"
      +          },
      +          "derivation": {
      +            "description": "Additive. Present only when derivation:\"server\" produced this envelope. { source, platform?, base_sha, head_sha }. Covered by body_hash; not fingerprint.",
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "environment": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "execution_action": {
      +            "enum": [
      +              "CONTINUE",
      +              "CONTINUE_WITH_MONITORING",
      +              "REQUEST_APPROVAL",
      +              "STOP"
      +            ],
      +            "type": "string"
      +          },
      +          "expires_at": {
      +            "type": "string"
      +          },
      +          "fingerprint": {
      +            "type": "string"
      +          },
      +          "head": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "input_fingerprint": {
      +            "type": "string"
      +          },
      +          "operation": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "receipt": {
      +            "type": "object"
      +          },
      +          "repository": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "safe_for_agent": {
      +            "type": "boolean"
      +          },
      +          "spec_version": {
      +            "pattern": "^decision-result\\.v1(\\.[0-9]+)?$",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows, emitted by the pattern detectors and validated against the decision-spec field contract before they leave the server. Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "execution_action": {
      +        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      +        "enum": [
      +          "CONTINUE",
      +          "CONTINUE_WITH_MONITORING",
      +          "REQUEST_APPROVAL",
      +          "STOP"
      +        ],
      +        "type": "string"
      +      },
      +      "execution_grant": {
      +        "description": "Opt-in cr.exec.v1 execution grant (PHASE-0). Issued only when include_execution_grant is true on authorize. Short-lived mutation-bound sibling of chain_receipt; never unsigned. Optional inner state_nonce (ATOMIC profile) is additive and is NOT in scope_hash.",
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier, assembled by the response builder; analyze returns a reduced form. Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "authorize"
      +      },
      +      "receipt_kind": {
      +        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      +        "enum": [
      +          "operation_authorization",
      +          "NONE"
      +        ],
      +        "type": "string"
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "safe_for_agent": {
      +        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      +        "type": "boolean"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes, computed once per change set. Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "decision",
      +      "execution_action",
      +      "safe_for_agent",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  }
      +]
  6. Changed16 schema fields changed
    • changedInput schema / properties / adapter_id / description
      Previous value: -"Adapter the executor will apply the change with, e.g. fs, postgres, git (cr.exec.v2)."New value: +"Authorize+grant v2 only. Adapter that will apply the change. Conventional values: fs, postgres, git. Must match the adapter the executor actually uses; a git grant does not authorize an fs write."
    • changedInput schema / properties / artifacts / description
      Previous value: -"Contract artifacts to analyze together (max 20). Each is { id, type, before, after }."New value: +"1–20 contract documents analyzed together. Each item is {id, type, before, after} where before/after are the FULL document strings (YAML/JSON/proto text), not URLs or file paths. Omit this array entirely when derivation=\"server\"."
    • changedInput schema / properties / artifacts / items / properties / after / description
      Previous value: -"Updated artifact content as a string"New value: +"The proposed document as raw text, same kind as before. Must be the bytes you intend to merge/deploy/publish, not a diff."
    • changedInput schema / properties / artifacts / items / properties / before / description
      Previous value: -"Prior artifact content (spec/schema/manifest) as a string"New value: +"The baseline document as raw text (the spec/schema/manifest body). Empty string means \"no prior version\" (create), not \"load from disk\"."
    • addedInput schema / properties / artifacts / items / properties / type / description
      Added value: +"Artifact kind. One of openapi, graphql, grpc, asyncapi, mcp_manifest, agent_tools. Determines how before/after text is parsed. Not inferred from the filename."
    • changedInput schema / properties / context / description
      Previous value: -"Optional apply-site context folded into the bundle fingerprint. operation distinguishes merge vs deploy vs publish (and other labels); the server accepts any string for operation (change-set.js) — conventional values below."New value: +"Optional apply-site context folded into the bundle fingerprint. operation distinguishes merge vs deploy vs publish (and other labels); the server accepts any non-empty string; conventional values: merge, deploy, tool_call, publish. The receipt/gate must match this label."
    • changedInput schema / properties / derivation / description
      Previous value: -"Opt-in (ID637 6b). \"server\" = the server derives artifacts[] from GitHub Compare via the App installation. Allowed only when the tenant has a proven binding for context.repository and context.base + context.head are present. Omit artifacts[] (caller-supplied artifacts[] with this flag is 400 — one source of truth). Default absent = today's caller-artifacts path (byte-identical)."New value: +"\"server\" = the server derives artifacts[] from GitHub Compare via the App installation. Allowed only when context.repository, context.base and context.head are all present and the tenant has a proven binding for that repository. Do not send artifacts[] in the same call (400 — one source of truth). Omit this field for the caller-supplied artifacts[] path."
    • changedInput schema / properties / executor_id / description
      Previous value: -"Identity of the executor the grant is bound to (cr.exec.v2)."New value: +"Authorize+grant v2 only. Executor identity the grant is bound to (example: agent:ci-bot, host:github-actions). Empty/absent is not \"any executor\"."
    • changedInput schema / properties / expected_state_token / description
      Previous value: -"State token the executor expects to observe at apply time (cr.exec.v2). Signed as a separate field; empty string when absent."New value: +"Authorize+grant v2 only. Compare-and-swap token the executor must observe at apply time (the \"before\" state). Signed as its own field. Omit only if the adapter has no prior state; do not send a placeholder."
    • changedInput schema / properties / include_execution_grant / description
      Previous value: -"Opt-in (authorize only). When true on allow-class authorize, the response includes a signed execution_grant (cr.exec.v1) alongside chain_receipt, or HTTP 503 SIGNER_UNAVAILABLE — never unsigned. Default false. Analyze ignores this flag. See docs/cr-exec-v1.md."New value: +"Authorize only. When true on an allow-class authorize, the response includes a signed execution_grant, or HTTP 503 SIGNER_UNAVAILABLE — never an unsigned grant. Default false. Analyze ignores this flag. Ignored unless preflight_mode=\"authorize\"."
    • changedInput schema / properties / policy_hash / description
      Previous value: -"Policy identity the grant is issued under (cr.exec.v2). Bound into the signed grant when supplied."New value: +"Authorize+grant v2 only. Policy identity bound into the grant, sha256: + 64 hex. When supplied, apply must use that same policy; a different policy is a different grant."
    • changedInput schema / properties / previous_receipt / description
      Previous value: -"Optional prior chain receipt token to link"New value: +"Optional prior chain token to LINK this call into a receipt chain: base64url(body).base64url(signature). Linking is not verification — a linked token is not re-checked here; use verify_receipt."
    • changedInput schema / properties / state_nonce / description
      Previous value: -"Optional ATOMIC-profile nonce. When include_execution_grant is true, copied into the signed grant as state_nonce (a separate signed field — NOT folded into scope_hash). Absent → BEARER grant (today's default). See docs/cr-exec-v1.md."New value: +"Authorize+grant only. Opaque nonce copied into the signed grant as its own field (not folded into scope_hash). Absent → BEARER grant. Ignored unless include_execution_grant is true."
    • changedInput schema / properties / target_uri / description
      Previous value: -"Target the grant is bound to (cr.exec.v2). Falls back to context.target_uri, then to a repository/head-derived value."New value: +"Authorize+grant v2 only. URI the grant binds (example: git://owner/repo.git/refs/heads/main). Fallback if omitted: context.target_uri, then repository/head-derived. Distinct from context.target_id."
    • changedInput schema / properties / tenant_id / description
      Previous value: -"Tenant the grant is issued under (cr.exec.v2). Defaults to \"default\" when absent."New value: +"Authorize+grant v2 only. Tenant the grant is issued under. ASCII slug. When omitted the server uses \"default\" — pin it if you are not on the default tenant."
    • changedOutput schema / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, execution_grant, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      -    "not": {
      -      "anyOf": [
      -        {
      -          "required": [
      -            "decision"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "safe_for_agent"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "execution_grant"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "decision_result"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "control_envelope"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "required_action_core"
      -          ]
      -        }
      -      ]
      -    },
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of the flat analysis fields present on the verdict, plus remediations[]. PROPERTIES ARE GENERATED from ANALYSIS_TIER_FIELDS + remediations by scripts/generate-analysis-tier-schema.js — do not hand-edit them. OPEN BY DESIGN: additionalProperties stays TRUE and this is not an oversight. The fields above are copied conditionally, so which of them appear depends on the input — a verdict with no PII findings simply omits pii_findings. Closing this object would turn every future analysis field into a breaking change that fails inside the consumer, and would reject exactly the verdict paths that no one sampled when the union was built. Declared, not closed: you can now see what you may get, and you must still tolerate more.",
      -        "properties": {
      -          "breaking_changes": {
      -            "type": "integer"
      -          },
      -          "breaking_changes_details": {
      -            "type": "array"
      -          },
      -          "change_ir": {
      -            "type": "array"
      -          },
      -          "changelog": {
      -            "type": "array"
      -          },
      -          "compatibility_suggestions": {
      -            "type": "array"
      -          },
      -          "coverage_gap": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "coverage_gap_reason": {
      -            "type": "string"
      -          },
      -          "decision_basis": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "degraded": {
      -            "type": "boolean"
      -          },
      -          "detected_patterns": {
      -            "type": "array"
      -          },
      -          "evidence_quality": {
      -            "type": "string"
      -          },
      -          "fallback_reason": {
      -            "type": "string"
      -          },
      -          "non_breaking_changes": {
      -            "type": "array"
      -          },
      -          "pattern_sources": {
      -            "type": "array"
      -          },
      -          "patterns": {
      -            "type": "array"
      -          },
      -          "pii_findings": {
      -            "type": "array"
      -          },
      -          "policy_violations": {
      -            "type": "array"
      -          },
      -          "remediations": {
      -            "items": {
      -              "additionalProperties": true,
      -              "description": "One remediation for one detected breaking change. `instruction` is imperative prose that a model may read and act on; it is generated per input and is NOT a fixed string, so the schema declares that the field exists and does not pin its text.",
      -              "properties": {
      -                "change_type": {
      -                  "type": "string"
      -                },
      -                "effort": {
      -                  "type": "string"
      -                },
      -                "evidence": {
      -                  "additionalProperties": true,
      -                  "type": "object"
      -                },
      -                "instruction": {
      -                  "description": "Imperative remediation text. Model-visible. Generated per input; not a closed vocabulary.",
      -                  "type": "string"
      -                },
      -                "precise_label": {
      -                  "type": "string"
      -                },
      -                "recommended_transform": {
      -                  "type": "string"
      -                },
      -                "target": {
      -                  "type": "string"
      -                },
      -                "target_ref": {
      -                  "additionalProperties": true,
      -                  "type": "object"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "type": "array"
      -          },
      -          "requires_migration": {
      -            "type": "boolean"
      -          },
      -          "risk_dimensions": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "risk_level": {
      -            "type": "string"
      -          },
      -          "risk_score": {
      -            "type": "integer"
      -          },
      -          "security_findings": {
      -            "type": "array"
      -          },
      -          "semver_suggestion": {
      -            "type": "string"
      -          },
      -          "should_block": {
      -            "type": "boolean"
      -          },
      -          "stats": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "token_cost_impact": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "analysis_control": {
      -        "type": "object"
      -      },
      -      "analysis_outcome": {
      -        "description": "Closed analysis outcome set derived from engine-visible state only.",
      -        "enum": [
      -          "NO_BREAK_DETECTED",
      -          "BREAKS_DETECTED",
      -          "ANALYSIS_FAILED"
      -        ],
      -        "type": "string"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "authorization_effect": {
      -        "const": "NONE",
      -        "description": "Analyze never authorizes; always NONE."
      -      },
      -      "blast_radius": {
      -        "additionalProperties": false,
      -        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      -        "properties": {
      -          "consumers_declared": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "consumers_observed": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "endpoints": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "fields": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "graph_source": {
      -            "enum": [
      -              "none",
      -              "declared",
      -              "observed",
      -              "declared+observed"
      -            ],
      -            "type": "string"
      -          },
      -          "params": {
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "endpoints",
      -          "fields",
      -          "params",
      -          "consumers_declared",
      -          "consumers_observed",
      -          "graph_source"
      -        ],
      -        "type": "object"
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "decision_basis": {},
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "may_execute": {
      -        "const": false,
      -        "description": "Analyze never grants execute permission."
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "analyze"
      -      },
      -      "receipt_kind": {
      -        "const": "NONE",
      -        "description": "Analyze never mints a receipt."
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "analysis_outcome",
      -      "authorization_effect",
      -      "may_execute",
      -      "receipt_kind",
      -      "decision_spec_version"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": true,
      -    "allOf": [
      -      {
      -        "if": {
      -          "properties": {
      -            "receipt_kind": {
      -              "const": "operation_authorization"
      -            }
      -          },
      -          "required": [
      -            "receipt_kind"
      -          ]
      -        },
      -        "then": {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        }
      -      },
      -      {
      -        "if": {
      -          "properties": {
      -            "execution_action": {
      -              "enum": [
      -                "CONTINUE",
      -                "CONTINUE_WITH_MONITORING"
      -              ]
      -            }
      -          },
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        "then": {
      -          "properties": {
      -            "receipt_kind": {
      -              "const": "operation_authorization"
      -            }
      -          },
      -          "required": [
      -            "receipt_kind",
      -            "chain_receipt",
      -            "decision_result"
      -          ]
      -        }
      -      }
      -    ],
      -    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of the flat analysis fields present on the verdict, plus remediations[]. PROPERTIES ARE GENERATED from ANALYSIS_TIER_FIELDS + remediations by scripts/generate-analysis-tier-schema.js — do not hand-edit them. OPEN BY DESIGN: additionalProperties stays TRUE and this is not an oversight. The fields above are copied conditionally, so which of them appear depends on the input — a verdict with no PII findings simply omits pii_findings. Closing this object would turn every future analysis field into a breaking change that fails inside the consumer, and would reject exactly the verdict paths that no one sampled when the union was built. Declared, not closed: you can now see what you may get, and you must still tolerate more.",
      -        "properties": {
      -          "breaking_changes": {
      -            "type": "integer"
      -          },
      -          "breaking_changes_details": {
      -            "type": "array"
      -          },
      -          "change_ir": {
      -            "type": "array"
      -          },
      -          "changelog": {
      -            "type": "array"
      -          },
      -          "compatibility_suggestions": {
      -            "type": "array"
      -          },
      -          "coverage_gap": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "coverage_gap_reason": {
      -            "type": "string"
      -          },
      -          "decision_basis": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "degraded": {
      -            "type": "boolean"
      -          },
      -          "detected_patterns": {
      -            "type": "array"
      -          },
      -          "evidence_quality": {
      -            "type": "string"
      -          },
      -          "fallback_reason": {
      -            "type": "string"
      -          },
      -          "non_breaking_changes": {
      -            "type": "array"
      -          },
      -          "pattern_sources": {
      -            "type": "array"
      -          },
      -          "patterns": {
      -            "type": "array"
      -          },
      -          "pii_findings": {
      -            "type": "array"
      -          },
      -          "policy_violations": {
      -            "type": "array"
      -          },
      -          "remediations": {
      -            "items": {
      -              "additionalProperties": true,
      -              "description": "One remediation for one detected breaking change. `instruction` is imperative prose that a model may read and act on; it is generated per input and is NOT a fixed string, so the schema declares that the field exists and does not pin its text.",
      -              "properties": {
      -                "change_type": {
      -                  "type": "string"
      -                },
      -                "effort": {
      -                  "type": "string"
      -                },
      -                "evidence": {
      -                  "additionalProperties": true,
      -                  "type": "object"
      -                },
      -                "instruction": {
      -                  "description": "Imperative remediation text. Model-visible. Generated per input; not a closed vocabulary.",
      -                  "type": "string"
      -                },
      -                "precise_label": {
      -                  "type": "string"
      -                },
      -                "recommended_transform": {
      -                  "type": "string"
      -                },
      -                "target": {
      -                  "type": "string"
      -                },
      -                "target_ref": {
      -                  "additionalProperties": true,
      -                  "type": "object"
      -                }
      -              },
      -              "type": "object"
      -            },
      -            "type": "array"
      -          },
      -          "requires_migration": {
      -            "type": "boolean"
      -          },
      -          "risk_dimensions": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "risk_level": {
      -            "type": "string"
      -          },
      -          "risk_score": {
      -            "type": "integer"
      -          },
      -          "security_findings": {
      -            "type": "array"
      -          },
      -          "semver_suggestion": {
      -            "type": "string"
      -          },
      -          "should_block": {
      -            "type": "boolean"
      -          },
      -          "stats": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          },
      -          "token_cost_impact": {
      -            "additionalProperties": true,
      -            "type": "object"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "blast_radius": {
      -        "additionalProperties": false,
      -        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      -        "properties": {
      -          "consumers_declared": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "consumers_observed": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "endpoints": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "fields": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "graph_source": {
      -            "enum": [
      -              "none",
      -              "declared",
      -              "observed",
      -              "declared+observed"
      -            ],
      -            "type": "string"
      -          },
      -          "params": {
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "endpoints",
      -          "fields",
      -          "params",
      -          "consumers_declared",
      -          "consumers_observed",
      -          "graph_source"
      -        ],
      -        "type": "object"
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "description": "Calibration model version when set; null until a calibrated model ships.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "chain_receipt": {
      -        "type": "string"
      -      },
      -      "chain_status": {
      -        "type": "string"
      -      },
      -      "coderifts_version": {
      -        "type": "string"
      -      },
      -      "control_envelope": {
      -        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      -        "type": "object"
      -      },
      -      "decision": {
      -        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      -        "enum": [
      -          "ALLOW",
      -          "WARN",
      -          "REQUIRE_APPROVAL",
      -          "BLOCK"
      -        ],
      -        "type": "string"
      -      },
      -      "decision_basis": {},
      -      "decision_result": {
      -        "additionalProperties": true,
      -        "description": "decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).",
      -        "properties": {
      -          "audience": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "authority": {
      -            "description": "ID963 additive. { audience, tenant_scope: bound|unbound, binding_proven_at? }. Informational — not permission, not a verify-receipt gate, not an ACL.",
      -            "type": [
      -              "object",
      -              "null"
      -            ]
      -          },
      -          "base": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "blast_radius": {
      -            "description": "ID27 additive COUNTS (not a score). Not permission.",
      -            "properties": {
      -              "consumers_declared": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "consumers_observed": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "endpoints": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "fields": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "graph_source": {
      -                "type": "string"
      -              },
      -              "params": {
      -                "minimum": 0,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "decision": {
      -            "enum": [
      -              "ALLOW",
      -              "WARN",
      -              "REQUIRE_APPROVAL",
      -              "BLOCK"
      -            ],
      -            "type": "string"
      -          },
      -          "decision_body_hash": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "decision_id": {
      -            "type": "string"
      -          },
      -          "derivation": {
      -            "description": "ID637 6b additive. Present only when derivation:\"server\" produced this envelope. { source, platform?, base_sha, head_sha }. Covered by body_hash; not fingerprint.",
      -            "type": [
      -              "object",
      -              "null"
      -            ]
      -          },
      -          "environment": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "execution_action": {
      -            "enum": [
      -              "CONTINUE",
      -              "CONTINUE_WITH_MONITORING",
      -              "REQUEST_APPROVAL",
      -              "STOP"
      -            ],
      -            "type": "string"
      -          },
      -          "expires_at": {
      -            "type": "string"
      -          },
      -          "fingerprint": {
      -            "type": "string"
      -          },
      -          "head": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "input_fingerprint": {
      -            "type": "string"
      -          },
      -          "operation": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "receipt": {
      -            "type": "object"
      -          },
      -          "repository": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "safe_for_agent": {
      -            "type": "boolean"
      -          },
      -          "spec_version": {
      -            "pattern": "^decision-result\\.v1(\\.[0-9]+)?$",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "execution_action": {
      -        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      -        "enum": [
      -          "CONTINUE",
      -          "CONTINUE_WITH_MONITORING",
      -          "REQUEST_APPROVAL",
      -          "STOP"
      -        ],
      -        "type": "string"
      -      },
      -      "execution_grant": {
      -        "description": "Opt-in cr.exec.v1 execution grant (PHASE-0). Issued only when include_execution_grant is true on authorize. Short-lived mutation-bound sibling of chain_receipt; never unsigned. Optional inner state_nonce (ATOMIC profile) is additive and is NOT in scope_hash. See docs/cr-exec-v1.md / docs/cr-exec-attest-v1.md.",
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "authorize"
      -      },
      -      "receipt_kind": {
      -        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      -        "enum": [
      -          "operation_authorization",
      -          "NONE"
      -        ],
      -        "type": "string"
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "safe_for_agent": {
      -        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      -        "type": "boolean"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "decision",
      -      "execution_action",
      -      "safe_for_agent",
      -      "receipt_kind",
      -      "decision_spec_version"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, execution_grant, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      +    "not": {
      +      "anyOf": [
      +        {
      +          "required": [
      +            "decision"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "safe_for_agent"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "execution_grant"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "decision_result"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "control_envelope"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "required_action_core"
      +          ]
      +        }
      +      ]
      +    },
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of the flat analysis fields present on the verdict, plus remediations[]. PROPERTIES ARE GENERATED from ANALYSIS_TIER_FIELDS + remediations by scripts/generate-analysis-tier-schema.js — do not hand-edit them. OPEN BY DESIGN: additionalProperties stays TRUE and this is not an oversight. The fields above are copied conditionally, so which of them appear depends on the input — a verdict with no PII findings simply omits pii_findings. Closing this object would turn every future analysis field into a breaking change that fails inside the consumer, and would reject exactly the verdict paths that no one sampled when the union was built. Declared, not closed: you can now see what you may get, and you must still tolerate more.",
      +        "properties": {
      +          "breaking_changes": {
      +            "type": "integer"
      +          },
      +          "breaking_changes_details": {
      +            "type": "array"
      +          },
      +          "change_ir": {
      +            "type": "array"
      +          },
      +          "changelog": {
      +            "type": "array"
      +          },
      +          "compatibility_suggestions": {
      +            "type": "array"
      +          },
      +          "coverage_gap": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "coverage_gap_reason": {
      +            "type": "string"
      +          },
      +          "decision_basis": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "degraded": {
      +            "type": "boolean"
      +          },
      +          "detected_patterns": {
      +            "type": "array"
      +          },
      +          "evidence_quality": {
      +            "type": "string"
      +          },
      +          "fallback_reason": {
      +            "type": "string"
      +          },
      +          "non_breaking_changes": {
      +            "type": "array"
      +          },
      +          "pattern_sources": {
      +            "type": "array"
      +          },
      +          "patterns": {
      +            "type": "array"
      +          },
      +          "pii_findings": {
      +            "type": "array"
      +          },
      +          "policy_violations": {
      +            "type": "array"
      +          },
      +          "remediations": {
      +            "items": {
      +              "additionalProperties": true,
      +              "description": "One remediation for one detected breaking change. `instruction` is imperative prose that a model may read and act on; it is generated per input and is NOT a fixed string, so the schema declares that the field exists and does not pin its text.",
      +              "properties": {
      +                "change_type": {
      +                  "type": "string"
      +                },
      +                "effort": {
      +                  "type": "string"
      +                },
      +                "evidence": {
      +                  "additionalProperties": true,
      +                  "type": "object"
      +                },
      +                "instruction": {
      +                  "description": "Imperative remediation text. Model-visible. Generated per input; not a closed vocabulary.",
      +                  "type": "string"
      +                },
      +                "precise_label": {
      +                  "type": "string"
      +                },
      +                "recommended_transform": {
      +                  "type": "string"
      +                },
      +                "target": {
      +                  "type": "string"
      +                },
      +                "target_ref": {
      +                  "additionalProperties": true,
      +                  "type": "object"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "requires_migration": {
      +            "type": "boolean"
      +          },
      +          "risk_dimensions": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "risk_level": {
      +            "type": "string"
      +          },
      +          "risk_score": {
      +            "type": "integer"
      +          },
      +          "security_findings": {
      +            "type": "array"
      +          },
      +          "semver_suggestion": {
      +            "type": "string"
      +          },
      +          "should_block": {
      +            "type": "boolean"
      +          },
      +          "stats": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "token_cost_impact": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "analysis_control": {
      +        "type": "object"
      +      },
      +      "analysis_outcome": {
      +        "description": "Closed analysis outcome set derived from engine-visible state only.",
      +        "enum": [
      +          "NO_BREAK_DETECTED",
      +          "BREAKS_DETECTED",
      +          "ANALYSIS_FAILED"
      +        ],
      +        "type": "string"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "authorization_effect": {
      +        "const": "NONE",
      +        "description": "Analyze never authorizes; always NONE."
      +      },
      +      "blast_radius": {
      +        "additionalProperties": false,
      +        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      +        "properties": {
      +          "consumers_declared": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "consumers_observed": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "endpoints": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "fields": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "graph_source": {
      +            "enum": [
      +              "none",
      +              "declared",
      +              "observed",
      +              "declared+observed"
      +            ],
      +            "type": "string"
      +          },
      +          "params": {
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "endpoints",
      +          "fields",
      +          "params",
      +          "consumers_declared",
      +          "consumers_observed",
      +          "graph_source"
      +        ],
      +        "type": "object"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "decision_basis": {},
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "may_execute": {
      +        "const": false,
      +        "description": "Analyze never grants execute permission."
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "analyze"
      +      },
      +      "receipt_kind": {
      +        "const": "NONE",
      +        "description": "Analyze never mints a receipt."
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "analysis_outcome",
      +      "authorization_effect",
      +      "may_execute",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": true,
      +    "allOf": [
      +      {
      +        "if": {
      +          "properties": {
      +            "receipt_kind": {
      +              "const": "operation_authorization"
      +            }
      +          },
      +          "required": [
      +            "receipt_kind"
      +          ]
      +        },
      +        "then": {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        }
      +      },
      +      {
      +        "if": {
      +          "properties": {
      +            "execution_action": {
      +              "enum": [
      +                "CONTINUE",
      +                "CONTINUE_WITH_MONITORING"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        "then": {
      +          "properties": {
      +            "receipt_kind": {
      +              "const": "operation_authorization"
      +            }
      +          },
      +          "required": [
      +            "receipt_kind",
      +            "chain_receipt",
      +            "decision_result"
      +          ]
      +        }
      +      }
      +    ],
      +    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of the flat analysis fields present on the verdict, plus remediations[]. PROPERTIES ARE GENERATED from ANALYSIS_TIER_FIELDS + remediations by scripts/generate-analysis-tier-schema.js — do not hand-edit them. OPEN BY DESIGN: additionalProperties stays TRUE and this is not an oversight. The fields above are copied conditionally, so which of them appear depends on the input — a verdict with no PII findings simply omits pii_findings. Closing this object would turn every future analysis field into a breaking change that fails inside the consumer, and would reject exactly the verdict paths that no one sampled when the union was built. Declared, not closed: you can now see what you may get, and you must still tolerate more.",
      +        "properties": {
      +          "breaking_changes": {
      +            "type": "integer"
      +          },
      +          "breaking_changes_details": {
      +            "type": "array"
      +          },
      +          "change_ir": {
      +            "type": "array"
      +          },
      +          "changelog": {
      +            "type": "array"
      +          },
      +          "compatibility_suggestions": {
      +            "type": "array"
      +          },
      +          "coverage_gap": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "coverage_gap_reason": {
      +            "type": "string"
      +          },
      +          "decision_basis": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "degraded": {
      +            "type": "boolean"
      +          },
      +          "detected_patterns": {
      +            "type": "array"
      +          },
      +          "evidence_quality": {
      +            "type": "string"
      +          },
      +          "fallback_reason": {
      +            "type": "string"
      +          },
      +          "non_breaking_changes": {
      +            "type": "array"
      +          },
      +          "pattern_sources": {
      +            "type": "array"
      +          },
      +          "patterns": {
      +            "type": "array"
      +          },
      +          "pii_findings": {
      +            "type": "array"
      +          },
      +          "policy_violations": {
      +            "type": "array"
      +          },
      +          "remediations": {
      +            "items": {
      +              "additionalProperties": true,
      +              "description": "One remediation for one detected breaking change. `instruction` is imperative prose that a model may read and act on; it is generated per input and is NOT a fixed string, so the schema declares that the field exists and does not pin its text.",
      +              "properties": {
      +                "change_type": {
      +                  "type": "string"
      +                },
      +                "effort": {
      +                  "type": "string"
      +                },
      +                "evidence": {
      +                  "additionalProperties": true,
      +                  "type": "object"
      +                },
      +                "instruction": {
      +                  "description": "Imperative remediation text. Model-visible. Generated per input; not a closed vocabulary.",
      +                  "type": "string"
      +                },
      +                "precise_label": {
      +                  "type": "string"
      +                },
      +                "recommended_transform": {
      +                  "type": "string"
      +                },
      +                "target": {
      +                  "type": "string"
      +                },
      +                "target_ref": {
      +                  "additionalProperties": true,
      +                  "type": "object"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "requires_migration": {
      +            "type": "boolean"
      +          },
      +          "risk_dimensions": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "risk_level": {
      +            "type": "string"
      +          },
      +          "risk_score": {
      +            "type": "integer"
      +          },
      +          "security_findings": {
      +            "type": "array"
      +          },
      +          "semver_suggestion": {
      +            "type": "string"
      +          },
      +          "should_block": {
      +            "type": "boolean"
      +          },
      +          "stats": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "token_cost_impact": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "blast_radius": {
      +        "additionalProperties": false,
      +        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      +        "properties": {
      +          "consumers_declared": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "consumers_observed": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "endpoints": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "fields": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "graph_source": {
      +            "enum": [
      +              "none",
      +              "declared",
      +              "observed",
      +              "declared+observed"
      +            ],
      +            "type": "string"
      +          },
      +          "params": {
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "endpoints",
      +          "fields",
      +          "params",
      +          "consumers_declared",
      +          "consumers_observed",
      +          "graph_source"
      +        ],
      +        "type": "object"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "description": "Calibration model version when set; null until a calibrated model ships.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "chain_receipt": {
      +        "type": "string"
      +      },
      +      "chain_status": {
      +        "type": "string"
      +      },
      +      "coderifts_version": {
      +        "type": "string"
      +      },
      +      "control_envelope": {
      +        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      +        "type": "object"
      +      },
      +      "decision": {
      +        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      +        "enum": [
      +          "ALLOW",
      +          "WARN",
      +          "REQUIRE_APPROVAL",
      +          "BLOCK"
      +        ],
      +        "type": "string"
      +      },
      +      "decision_basis": {},
      +      "decision_result": {
      +        "additionalProperties": true,
      +        "description": "decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).",
      +        "properties": {
      +          "audience": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "authority": {
      +            "description": "Additive. { audience, tenant_scope: bound|unbound, binding_proven_at? }. Informational — not permission, not a verify-receipt gate, not an ACL.",
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "base": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "blast_radius": {
      +            "description": "ID27 additive COUNTS (not a score). Not permission.",
      +            "properties": {
      +              "consumers_declared": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "consumers_observed": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "endpoints": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "fields": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "graph_source": {
      +                "type": "string"
      +              },
      +              "params": {
      +                "minimum": 0,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "decision": {
      +            "enum": [
      +              "ALLOW",
      +              "WARN",
      +              "REQUIRE_APPROVAL",
      +              "BLOCK"
      +            ],
      +            "type": "string"
      +          },
      +          "decision_body_hash": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "decision_id": {
      +            "type": "string"
      +          },
      +          "derivation": {
      +            "description": "Additive. Present only when derivation:\"server\" produced this envelope. { source, platform?, base_sha, head_sha }. Covered by body_hash; not fingerprint.",
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "environment": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "execution_action": {
      +            "enum": [
      +              "CONTINUE",
      +              "CONTINUE_WITH_MONITORING",
      +              "REQUEST_APPROVAL",
      +              "STOP"
      +            ],
      +            "type": "string"
      +          },
      +          "expires_at": {
      +            "type": "string"
      +          },
      +          "fingerprint": {
      +            "type": "string"
      +          },
      +          "head": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "input_fingerprint": {
      +            "type": "string"
      +          },
      +          "operation": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "receipt": {
      +            "type": "object"
      +          },
      +          "repository": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "safe_for_agent": {
      +            "type": "boolean"
      +          },
      +          "spec_version": {
      +            "pattern": "^decision-result\\.v1(\\.[0-9]+)?$",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "execution_action": {
      +        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      +        "enum": [
      +          "CONTINUE",
      +          "CONTINUE_WITH_MONITORING",
      +          "REQUEST_APPROVAL",
      +          "STOP"
      +        ],
      +        "type": "string"
      +      },
      +      "execution_grant": {
      +        "description": "Opt-in cr.exec.v1 execution grant (PHASE-0). Issued only when include_execution_grant is true on authorize. Short-lived mutation-bound sibling of chain_receipt; never unsigned. Optional inner state_nonce (ATOMIC profile) is additive and is NOT in scope_hash. See docs/cr-exec-v1.md / docs/cr-exec-attest-v1.md.",
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "authorize"
      +      },
      +      "receipt_kind": {
      +        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      +        "enum": [
      +          "operation_authorization",
      +          "NONE"
      +        ],
      +        "type": "string"
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "safe_for_agent": {
      +        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      +        "type": "boolean"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "decision",
      +      "execution_action",
      +      "safe_for_agent",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  }
      +]
  7. Changed5 schema fields changed
    • addedInput schema / properties / context / properties / target_uri
      Added value: +{
      +  "description": "Optional apply-site URI the cr.exec.v2 grant binds (handler fallback: input.target_uri, then context.target_uri, then repository/head-derived). Distinct from target_id.",
      +  "type": "string"
      +}
    • removedInput schema / properties / grant_version / default
      Removed value: -"v2"
    • changedInput schema / properties / grant_version / description
      Previous value: -"Grant envelope to mint when include_execution_grant is true. MIGRATION: omitting this yields cr.exec.v1 until 2026-09-18 and cr.exec.v2 on and after it; the response carries grant_version_deprecation while the old default is still in effect. An explicit value always wins, before and after the cutoff — pin \"v1\" to keep the current behaviour with no code change on the date."New value: +"Grant envelope to mint when include_execution_grant is true. Omitting this yields cr.exec.v1 until 2026-09-18 and cr.exec.v2 on and after it (see x-coderifts-effective-default / x-coderifts-default-changes-at). The response meta.grant_version is the version actually issued. An explicit value always wins — pin \"v1\" to keep current behaviour with no code change on the date."
    • addedInput schema / properties / grant_version / x-coderifts-default-changes-at
      Added value: +"2026-09-18"
    • addedInput schema / properties / grant_version / x-coderifts-effective-default
      Added value: +"v1"
  8. Changed2 schema fields changed
    • addedInput schema / properties / grant_version / default
      Added value: +"v2"
    • changedInput schema / properties / grant_version / description
      Previous value: -"Grant envelope to mint when include_execution_grant is true. Default absent = v1."New value: +"Grant envelope to mint when include_execution_grant is true. MIGRATION: omitting this yields cr.exec.v1 until 2026-09-18 and cr.exec.v2 on and after it; the response carries grant_version_deprecation while the old default is still in effect. An explicit value always wins, before and after the cutoff — pin \"v1\" to keep the current behaviour with no code change on the date."
  9. Changed8 schema fields changed
    • addedInput schema / properties / adapter_id
      Added value: +{
      +  "description": "Adapter the executor will apply the change with, e.g. fs, postgres, git (cr.exec.v2).",
      +  "type": "string"
      +}
    • addedInput schema / properties / audience
      Added value: +{
      +  "description": "Requester identity for the decision envelope. Accepted here; the server-derived audience wins when both are present.",
      +  "type": "string"
      +}
    • addedInput schema / properties / executor_id
      Added value: +{
      +  "description": "Identity of the executor the grant is bound to (cr.exec.v2).",
      +  "type": "string"
      +}
    • addedInput schema / properties / expected_state_token
      Added value: +{
      +  "description": "State token the executor expects to observe at apply time (cr.exec.v2). Signed as a separate field; empty string when absent.",
      +  "type": "string"
      +}
    • addedInput schema / properties / grant_version
      Added value: +{
      +  "description": "Grant envelope to mint when include_execution_grant is true. Default absent = v1.",
      +  "enum": [
      +    "v1",
      +    "v2"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / policy_hash
      Added value: +{
      +  "description": "Policy identity the grant is issued under (cr.exec.v2). Bound into the signed grant when supplied.",
      +  "type": "string"
      +}
    • addedInput schema / properties / target_uri
      Added value: +{
      +  "description": "Target the grant is bound to (cr.exec.v2). Falls back to context.target_uri, then to a repository/head-derived value.",
      +  "type": "string"
      +}
    • addedInput schema / properties / tenant_id
      Added value: +{
      +  "description": "Tenant the grant is issued under (cr.exec.v2). Defaults to \"default\" when absent.",
      +  "type": "string"
      +}
  10. Changed1 schema field changed
    • changedOutput schema / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, execution_grant, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      -    "not": {
      -      "anyOf": [
      -        {
      -          "required": [
      -            "decision"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "safe_for_agent"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "execution_grant"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "decision_result"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "control_envelope"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "required_action_core"
      -          ]
      -        }
      -      ]
      -    },
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      -        "type": "object"
      -      },
      -      "analysis_control": {
      -        "type": "object"
      -      },
      -      "analysis_outcome": {
      -        "description": "Closed analysis outcome set derived from engine-visible state only.",
      -        "enum": [
      -          "NO_BREAK_DETECTED",
      -          "BREAKS_DETECTED",
      -          "ANALYSIS_FAILED"
      -        ],
      -        "type": "string"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "authorization_effect": {
      -        "const": "NONE",
      -        "description": "Analyze never authorizes; always NONE."
      -      },
      -      "blast_radius": {
      -        "additionalProperties": false,
      -        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      -        "properties": {
      -          "consumers_declared": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "consumers_observed": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "endpoints": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "fields": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "graph_source": {
      -            "enum": [
      -              "none",
      -              "declared",
      -              "observed",
      -              "declared+observed"
      -            ],
      -            "type": "string"
      -          },
      -          "params": {
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "endpoints",
      -          "fields",
      -          "params",
      -          "consumers_declared",
      -          "consumers_observed",
      -          "graph_source"
      -        ],
      -        "type": "object"
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "decision_basis": {},
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "may_execute": {
      -        "const": false,
      -        "description": "Analyze never grants execute permission."
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "analyze"
      -      },
      -      "receipt_kind": {
      -        "const": "NONE",
      -        "description": "Analyze never mints a receipt."
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "analysis_outcome",
      -      "authorization_effect",
      -      "may_execute",
      -      "receipt_kind",
      -      "decision_spec_version"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": true,
      -    "allOf": [
      -      {
      -        "if": {
      -          "properties": {
      -            "receipt_kind": {
      -              "const": "operation_authorization"
      -            }
      -          },
      -          "required": [
      -            "receipt_kind"
      -          ]
      -        },
      -        "then": {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        }
      -      },
      -      {
      -        "if": {
      -          "properties": {
      -            "execution_action": {
      -              "enum": [
      -                "CONTINUE",
      -                "CONTINUE_WITH_MONITORING"
      -              ]
      -            }
      -          },
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        "then": {
      -          "properties": {
      -            "receipt_kind": {
      -              "const": "operation_authorization"
      -            }
      -          },
      -          "required": [
      -            "receipt_kind",
      -            "chain_receipt",
      -            "decision_result"
      -          ]
      -        }
      -      }
      -    ],
      -    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      -        "type": "object"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "blast_radius": {
      -        "additionalProperties": false,
      -        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      -        "properties": {
      -          "consumers_declared": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "consumers_observed": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "endpoints": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "fields": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "graph_source": {
      -            "enum": [
      -              "none",
      -              "declared",
      -              "observed",
      -              "declared+observed"
      -            ],
      -            "type": "string"
      -          },
      -          "params": {
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "endpoints",
      -          "fields",
      -          "params",
      -          "consumers_declared",
      -          "consumers_observed",
      -          "graph_source"
      -        ],
      -        "type": "object"
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "description": "Calibration model version when set; null until a calibrated model ships.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "chain_receipt": {
      -        "type": "string"
      -      },
      -      "chain_status": {
      -        "type": "string"
      -      },
      -      "coderifts_version": {
      -        "type": "string"
      -      },
      -      "control_envelope": {
      -        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      -        "type": "object"
      -      },
      -      "decision": {
      -        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      -        "enum": [
      -          "ALLOW",
      -          "WARN",
      -          "REQUIRE_APPROVAL",
      -          "BLOCK"
      -        ],
      -        "type": "string"
      -      },
      -      "decision_basis": {},
      -      "decision_result": {
      -        "additionalProperties": true,
      -        "description": "decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).",
      -        "properties": {
      -          "audience": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "authority": {
      -            "description": "ID963 additive. { audience, tenant_scope: bound|unbound, binding_proven_at? }. Informational — not permission, not a verify-receipt gate, not an ACL.",
      -            "type": [
      -              "object",
      -              "null"
      -            ]
      -          },
      -          "base": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "blast_radius": {
      -            "description": "ID27 additive COUNTS (not a score). Not permission.",
      -            "properties": {
      -              "consumers_declared": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "consumers_observed": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "endpoints": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "fields": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "graph_source": {
      -                "type": "string"
      -              },
      -              "params": {
      -                "minimum": 0,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "decision": {
      -            "enum": [
      -              "ALLOW",
      -              "WARN",
      -              "REQUIRE_APPROVAL",
      -              "BLOCK"
      -            ],
      -            "type": "string"
      -          },
      -          "decision_body_hash": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "decision_id": {
      -            "type": "string"
      -          },
      -          "derivation": {
      -            "description": "ID637 6b additive. Present only when derivation:\"server\" produced this envelope. { source, platform?, base_sha, head_sha }. Covered by body_hash; not fingerprint.",
      -            "type": [
      -              "object",
      -              "null"
      -            ]
      -          },
      -          "environment": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "execution_action": {
      -            "enum": [
      -              "CONTINUE",
      -              "CONTINUE_WITH_MONITORING",
      -              "REQUEST_APPROVAL",
      -              "STOP"
      -            ],
      -            "type": "string"
      -          },
      -          "expires_at": {
      -            "type": "string"
      -          },
      -          "fingerprint": {
      -            "type": "string"
      -          },
      -          "head": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "input_fingerprint": {
      -            "type": "string"
      -          },
      -          "operation": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "receipt": {
      -            "type": "object"
      -          },
      -          "repository": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "safe_for_agent": {
      -            "type": "boolean"
      -          },
      -          "spec_version": {
      -            "pattern": "^decision-result\\.v1(\\.[0-9]+)?$",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "execution_action": {
      -        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      -        "enum": [
      -          "CONTINUE",
      -          "CONTINUE_WITH_MONITORING",
      -          "REQUEST_APPROVAL",
      -          "STOP"
      -        ],
      -        "type": "string"
      -      },
      -      "execution_grant": {
      -        "description": "Opt-in cr.exec.v1 execution grant (PHASE-0). Issued only when include_execution_grant is true on authorize. Short-lived mutation-bound sibling of chain_receipt; never unsigned. Optional inner state_nonce (ATOMIC profile) is additive and is NOT in scope_hash. See docs/cr-exec-v1.md / docs/cr-exec-attest-v1.md.",
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "authorize"
      -      },
      -      "receipt_kind": {
      -        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      -        "enum": [
      -          "operation_authorization",
      -          "NONE"
      -        ],
      -        "type": "string"
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "safe_for_agent": {
      -        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      -        "type": "boolean"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "decision",
      -      "execution_action",
      -      "safe_for_agent",
      -      "receipt_kind",
      -      "decision_spec_version"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, execution_grant, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      +    "not": {
      +      "anyOf": [
      +        {
      +          "required": [
      +            "decision"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "safe_for_agent"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "execution_grant"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "decision_result"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "control_envelope"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "required_action_core"
      +          ]
      +        }
      +      ]
      +    },
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of the flat analysis fields present on the verdict, plus remediations[]. PROPERTIES ARE GENERATED from ANALYSIS_TIER_FIELDS + remediations by scripts/generate-analysis-tier-schema.js — do not hand-edit them. OPEN BY DESIGN: additionalProperties stays TRUE and this is not an oversight. The fields above are copied conditionally, so which of them appear depends on the input — a verdict with no PII findings simply omits pii_findings. Closing this object would turn every future analysis field into a breaking change that fails inside the consumer, and would reject exactly the verdict paths that no one sampled when the union was built. Declared, not closed: you can now see what you may get, and you must still tolerate more.",
      +        "properties": {
      +          "breaking_changes": {
      +            "type": "integer"
      +          },
      +          "breaking_changes_details": {
      +            "type": "array"
      +          },
      +          "change_ir": {
      +            "type": "array"
      +          },
      +          "changelog": {
      +            "type": "array"
      +          },
      +          "compatibility_suggestions": {
      +            "type": "array"
      +          },
      +          "coverage_gap": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "coverage_gap_reason": {
      +            "type": "string"
      +          },
      +          "decision_basis": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "degraded": {
      +            "type": "boolean"
      +          },
      +          "detected_patterns": {
      +            "type": "array"
      +          },
      +          "evidence_quality": {
      +            "type": "string"
      +          },
      +          "fallback_reason": {
      +            "type": "string"
      +          },
      +          "non_breaking_changes": {
      +            "type": "array"
      +          },
      +          "pattern_sources": {
      +            "type": "array"
      +          },
      +          "patterns": {
      +            "type": "array"
      +          },
      +          "pii_findings": {
      +            "type": "array"
      +          },
      +          "policy_violations": {
      +            "type": "array"
      +          },
      +          "remediations": {
      +            "items": {
      +              "additionalProperties": true,
      +              "description": "One remediation for one detected breaking change. `instruction` is imperative prose that a model may read and act on; it is generated per input and is NOT a fixed string, so the schema declares that the field exists and does not pin its text.",
      +              "properties": {
      +                "change_type": {
      +                  "type": "string"
      +                },
      +                "effort": {
      +                  "type": "string"
      +                },
      +                "evidence": {
      +                  "additionalProperties": true,
      +                  "type": "object"
      +                },
      +                "instruction": {
      +                  "description": "Imperative remediation text. Model-visible. Generated per input; not a closed vocabulary.",
      +                  "type": "string"
      +                },
      +                "precise_label": {
      +                  "type": "string"
      +                },
      +                "recommended_transform": {
      +                  "type": "string"
      +                },
      +                "target": {
      +                  "type": "string"
      +                },
      +                "target_ref": {
      +                  "additionalProperties": true,
      +                  "type": "object"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "requires_migration": {
      +            "type": "boolean"
      +          },
      +          "risk_dimensions": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "risk_level": {
      +            "type": "string"
      +          },
      +          "risk_score": {
      +            "type": "integer"
      +          },
      +          "security_findings": {
      +            "type": "array"
      +          },
      +          "semver_suggestion": {
      +            "type": "string"
      +          },
      +          "should_block": {
      +            "type": "boolean"
      +          },
      +          "stats": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "token_cost_impact": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "analysis_control": {
      +        "type": "object"
      +      },
      +      "analysis_outcome": {
      +        "description": "Closed analysis outcome set derived from engine-visible state only.",
      +        "enum": [
      +          "NO_BREAK_DETECTED",
      +          "BREAKS_DETECTED",
      +          "ANALYSIS_FAILED"
      +        ],
      +        "type": "string"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "authorization_effect": {
      +        "const": "NONE",
      +        "description": "Analyze never authorizes; always NONE."
      +      },
      +      "blast_radius": {
      +        "additionalProperties": false,
      +        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      +        "properties": {
      +          "consumers_declared": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "consumers_observed": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "endpoints": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "fields": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "graph_source": {
      +            "enum": [
      +              "none",
      +              "declared",
      +              "observed",
      +              "declared+observed"
      +            ],
      +            "type": "string"
      +          },
      +          "params": {
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "endpoints",
      +          "fields",
      +          "params",
      +          "consumers_declared",
      +          "consumers_observed",
      +          "graph_source"
      +        ],
      +        "type": "object"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "decision_basis": {},
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "may_execute": {
      +        "const": false,
      +        "description": "Analyze never grants execute permission."
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "analyze"
      +      },
      +      "receipt_kind": {
      +        "const": "NONE",
      +        "description": "Analyze never mints a receipt."
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "analysis_outcome",
      +      "authorization_effect",
      +      "may_execute",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": true,
      +    "allOf": [
      +      {
      +        "if": {
      +          "properties": {
      +            "receipt_kind": {
      +              "const": "operation_authorization"
      +            }
      +          },
      +          "required": [
      +            "receipt_kind"
      +          ]
      +        },
      +        "then": {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        }
      +      },
      +      {
      +        "if": {
      +          "properties": {
      +            "execution_action": {
      +              "enum": [
      +                "CONTINUE",
      +                "CONTINUE_WITH_MONITORING"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        "then": {
      +          "properties": {
      +            "receipt_kind": {
      +              "const": "operation_authorization"
      +            }
      +          },
      +          "required": [
      +            "receipt_kind",
      +            "chain_receipt",
      +            "decision_result"
      +          ]
      +        }
      +      }
      +    ],
      +    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of the flat analysis fields present on the verdict, plus remediations[]. PROPERTIES ARE GENERATED from ANALYSIS_TIER_FIELDS + remediations by scripts/generate-analysis-tier-schema.js — do not hand-edit them. OPEN BY DESIGN: additionalProperties stays TRUE and this is not an oversight. The fields above are copied conditionally, so which of them appear depends on the input — a verdict with no PII findings simply omits pii_findings. Closing this object would turn every future analysis field into a breaking change that fails inside the consumer, and would reject exactly the verdict paths that no one sampled when the union was built. Declared, not closed: you can now see what you may get, and you must still tolerate more.",
      +        "properties": {
      +          "breaking_changes": {
      +            "type": "integer"
      +          },
      +          "breaking_changes_details": {
      +            "type": "array"
      +          },
      +          "change_ir": {
      +            "type": "array"
      +          },
      +          "changelog": {
      +            "type": "array"
      +          },
      +          "compatibility_suggestions": {
      +            "type": "array"
      +          },
      +          "coverage_gap": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "coverage_gap_reason": {
      +            "type": "string"
      +          },
      +          "decision_basis": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "degraded": {
      +            "type": "boolean"
      +          },
      +          "detected_patterns": {
      +            "type": "array"
      +          },
      +          "evidence_quality": {
      +            "type": "string"
      +          },
      +          "fallback_reason": {
      +            "type": "string"
      +          },
      +          "non_breaking_changes": {
      +            "type": "array"
      +          },
      +          "pattern_sources": {
      +            "type": "array"
      +          },
      +          "patterns": {
      +            "type": "array"
      +          },
      +          "pii_findings": {
      +            "type": "array"
      +          },
      +          "policy_violations": {
      +            "type": "array"
      +          },
      +          "remediations": {
      +            "items": {
      +              "additionalProperties": true,
      +              "description": "One remediation for one detected breaking change. `instruction` is imperative prose that a model may read and act on; it is generated per input and is NOT a fixed string, so the schema declares that the field exists and does not pin its text.",
      +              "properties": {
      +                "change_type": {
      +                  "type": "string"
      +                },
      +                "effort": {
      +                  "type": "string"
      +                },
      +                "evidence": {
      +                  "additionalProperties": true,
      +                  "type": "object"
      +                },
      +                "instruction": {
      +                  "description": "Imperative remediation text. Model-visible. Generated per input; not a closed vocabulary.",
      +                  "type": "string"
      +                },
      +                "precise_label": {
      +                  "type": "string"
      +                },
      +                "recommended_transform": {
      +                  "type": "string"
      +                },
      +                "target": {
      +                  "type": "string"
      +                },
      +                "target_ref": {
      +                  "additionalProperties": true,
      +                  "type": "object"
      +                }
      +              },
      +              "type": "object"
      +            },
      +            "type": "array"
      +          },
      +          "requires_migration": {
      +            "type": "boolean"
      +          },
      +          "risk_dimensions": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "risk_level": {
      +            "type": "string"
      +          },
      +          "risk_score": {
      +            "type": "integer"
      +          },
      +          "security_findings": {
      +            "type": "array"
      +          },
      +          "semver_suggestion": {
      +            "type": "string"
      +          },
      +          "should_block": {
      +            "type": "boolean"
      +          },
      +          "stats": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          },
      +          "token_cost_impact": {
      +            "additionalProperties": true,
      +            "type": "object"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "blast_radius": {
      +        "additionalProperties": false,
      +        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      +        "properties": {
      +          "consumers_declared": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "consumers_observed": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "endpoints": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "fields": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "graph_source": {
      +            "enum": [
      +              "none",
      +              "declared",
      +              "observed",
      +              "declared+observed"
      +            ],
      +            "type": "string"
      +          },
      +          "params": {
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "endpoints",
      +          "fields",
      +          "params",
      +          "consumers_declared",
      +          "consumers_observed",
      +          "graph_source"
      +        ],
      +        "type": "object"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "description": "Calibration model version when set; null until a calibrated model ships.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "chain_receipt": {
      +        "type": "string"
      +      },
      +      "chain_status": {
      +        "type": "string"
      +      },
      +      "coderifts_version": {
      +        "type": "string"
      +      },
      +      "control_envelope": {
      +        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      +        "type": "object"
      +      },
      +      "decision": {
      +        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      +        "enum": [
      +          "ALLOW",
      +          "WARN",
      +          "REQUIRE_APPROVAL",
      +          "BLOCK"
      +        ],
      +        "type": "string"
      +      },
      +      "decision_basis": {},
      +      "decision_result": {
      +        "additionalProperties": true,
      +        "description": "decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).",
      +        "properties": {
      +          "audience": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "authority": {
      +            "description": "ID963 additive. { audience, tenant_scope: bound|unbound, binding_proven_at? }. Informational — not permission, not a verify-receipt gate, not an ACL.",
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "base": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "blast_radius": {
      +            "description": "ID27 additive COUNTS (not a score). Not permission.",
      +            "properties": {
      +              "consumers_declared": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "consumers_observed": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "endpoints": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "fields": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "graph_source": {
      +                "type": "string"
      +              },
      +              "params": {
      +                "minimum": 0,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "decision": {
      +            "enum": [
      +              "ALLOW",
      +              "WARN",
      +              "REQUIRE_APPROVAL",
      +              "BLOCK"
      +            ],
      +            "type": "string"
      +          },
      +          "decision_body_hash": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "decision_id": {
      +            "type": "string"
      +          },
      +          "derivation": {
      +            "description": "ID637 6b additive. Present only when derivation:\"server\" produced this envelope. { source, platform?, base_sha, head_sha }. Covered by body_hash; not fingerprint.",
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "environment": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "execution_action": {
      +            "enum": [
      +              "CONTINUE",
      +              "CONTINUE_WITH_MONITORING",
      +              "REQUEST_APPROVAL",
      +              "STOP"
      +            ],
      +            "type": "string"
      +          },
      +          "expires_at": {
      +            "type": "string"
      +          },
      +          "fingerprint": {
      +            "type": "string"
      +          },
      +          "head": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "input_fingerprint": {
      +            "type": "string"
      +          },
      +          "operation": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "receipt": {
      +            "type": "object"
      +          },
      +          "repository": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "safe_for_agent": {
      +            "type": "boolean"
      +          },
      +          "spec_version": {
      +            "pattern": "^decision-result\\.v1(\\.[0-9]+)?$",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "execution_action": {
      +        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      +        "enum": [
      +          "CONTINUE",
      +          "CONTINUE_WITH_MONITORING",
      +          "REQUEST_APPROVAL",
      +          "STOP"
      +        ],
      +        "type": "string"
      +      },
      +      "execution_grant": {
      +        "description": "Opt-in cr.exec.v1 execution grant (PHASE-0). Issued only when include_execution_grant is true on authorize. Short-lived mutation-bound sibling of chain_receipt; never unsigned. Optional inner state_nonce (ATOMIC profile) is additive and is NOT in scope_hash. See docs/cr-exec-v1.md / docs/cr-exec-attest-v1.md.",
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "authorize"
      +      },
      +      "receipt_kind": {
      +        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      +        "enum": [
      +          "operation_authorization",
      +          "NONE"
      +        ],
      +        "type": "string"
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "safe_for_agent": {
      +        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      +        "type": "boolean"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "decision",
      +      "execution_action",
      +      "safe_for_agent",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  }
      +]
  11. Changed1 schema field changed
    • changedOutput schema / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, execution_grant, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      -    "not": {
      -      "anyOf": [
      -        {
      -          "required": [
      -            "decision"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "safe_for_agent"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "execution_grant"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "decision_result"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "control_envelope"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "required_action_core"
      -          ]
      -        }
      -      ]
      -    },
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      -        "type": "object"
      -      },
      -      "analysis_control": {
      -        "type": "object"
      -      },
      -      "analysis_outcome": {
      -        "description": "Closed analysis outcome set derived from engine-visible state only.",
      -        "enum": [
      -          "NO_BREAK_DETECTED",
      -          "BREAKS_DETECTED",
      -          "ANALYSIS_FAILED"
      -        ],
      -        "type": "string"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "authorization_effect": {
      -        "const": "NONE",
      -        "description": "Analyze never authorizes; always NONE."
      -      },
      -      "blast_radius": {
      -        "additionalProperties": false,
      -        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      -        "properties": {
      -          "consumers_declared": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "consumers_observed": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "endpoints": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "fields": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "graph_source": {
      -            "enum": [
      -              "none",
      -              "declared",
      -              "observed",
      -              "declared+observed"
      -            ],
      -            "type": "string"
      -          },
      -          "params": {
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "endpoints",
      -          "fields",
      -          "params",
      -          "consumers_declared",
      -          "consumers_observed",
      -          "graph_source"
      -        ],
      -        "type": "object"
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "decision_basis": {},
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "may_execute": {
      -        "const": false,
      -        "description": "Analyze never grants execute permission."
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "analyze"
      -      },
      -      "receipt_kind": {
      -        "const": "NONE",
      -        "description": "Analyze never mints a receipt."
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "analysis_outcome",
      -      "authorization_effect",
      -      "may_execute",
      -      "receipt_kind",
      -      "decision_spec_version"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": true,
      -    "allOf": [
      -      {
      -        "if": {
      -          "properties": {
      -            "receipt_kind": {
      -              "const": "operation_authorization"
      -            }
      -          },
      -          "required": [
      -            "receipt_kind"
      -          ]
      -        },
      -        "then": {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        }
      -      },
      -      {
      -        "if": {
      -          "properties": {
      -            "execution_action": {
      -              "enum": [
      -                "CONTINUE",
      -                "CONTINUE_WITH_MONITORING"
      -              ]
      -            }
      -          },
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        "then": {
      -          "properties": {
      -            "receipt_kind": {
      -              "const": "operation_authorization"
      -            }
      -          },
      -          "required": [
      -            "receipt_kind",
      -            "chain_receipt",
      -            "decision_result"
      -          ]
      -        }
      -      }
      -    ],
      -    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      -        "type": "object"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "blast_radius": {
      -        "additionalProperties": false,
      -        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      -        "properties": {
      -          "consumers_declared": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "consumers_observed": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "endpoints": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "fields": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "graph_source": {
      -            "enum": [
      -              "none",
      -              "declared",
      -              "observed",
      -              "declared+observed"
      -            ],
      -            "type": "string"
      -          },
      -          "params": {
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "endpoints",
      -          "fields",
      -          "params",
      -          "consumers_declared",
      -          "consumers_observed",
      -          "graph_source"
      -        ],
      -        "type": "object"
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "description": "Calibration model version when set; null until a calibrated model ships.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "chain_receipt": {
      -        "type": "string"
      -      },
      -      "chain_status": {
      -        "type": "string"
      -      },
      -      "coderifts_version": {
      -        "type": "string"
      -      },
      -      "control_envelope": {
      -        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      -        "type": "object"
      -      },
      -      "decision": {
      -        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      -        "enum": [
      -          "ALLOW",
      -          "WARN",
      -          "REQUIRE_APPROVAL",
      -          "BLOCK"
      -        ],
      -        "type": "string"
      -      },
      -      "decision_basis": {},
      -      "decision_result": {
      -        "additionalProperties": true,
      -        "description": "decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).",
      -        "properties": {
      -          "audience": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "authority": {
      -            "description": "ID963 additive. { audience, tenant_scope: bound|unbound, binding_proven_at? }. Informational — not permission, not a verify-receipt gate, not an ACL.",
      -            "type": [
      -              "object",
      -              "null"
      -            ]
      -          },
      -          "base": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "blast_radius": {
      -            "description": "ID27 additive COUNTS (not a score). Not permission.",
      -            "properties": {
      -              "consumers_declared": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "consumers_observed": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "endpoints": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "fields": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "graph_source": {
      -                "type": "string"
      -              },
      -              "params": {
      -                "minimum": 0,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "decision": {
      -            "enum": [
      -              "ALLOW",
      -              "WARN",
      -              "REQUIRE_APPROVAL",
      -              "BLOCK"
      -            ],
      -            "type": "string"
      -          },
      -          "decision_body_hash": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "decision_id": {
      -            "type": "string"
      -          },
      -          "derivation": {
      -            "description": "ID637 6b additive. Present only when derivation:\"server\" produced this envelope. { source: github_compare, base_sha, head_sha }. Covered by body_hash; not fingerprint.",
      -            "type": [
      -              "object",
      -              "null"
      -            ]
      -          },
      -          "environment": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "execution_action": {
      -            "enum": [
      -              "CONTINUE",
      -              "CONTINUE_WITH_MONITORING",
      -              "REQUEST_APPROVAL",
      -              "STOP"
      -            ],
      -            "type": "string"
      -          },
      -          "expires_at": {
      -            "type": "string"
      -          },
      -          "fingerprint": {
      -            "type": "string"
      -          },
      -          "head": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "input_fingerprint": {
      -            "type": "string"
      -          },
      -          "operation": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "receipt": {
      -            "type": "object"
      -          },
      -          "repository": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "safe_for_agent": {
      -            "type": "boolean"
      -          },
      -          "spec_version": {
      -            "pattern": "^decision-result\\.v1(\\.[0-9]+)?$",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "execution_action": {
      -        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      -        "enum": [
      -          "CONTINUE",
      -          "CONTINUE_WITH_MONITORING",
      -          "REQUEST_APPROVAL",
      -          "STOP"
      -        ],
      -        "type": "string"
      -      },
      -      "execution_grant": {
      -        "description": "Opt-in cr.exec.v1 execution grant (PHASE-0). Issued only when include_execution_grant is true on authorize. Short-lived mutation-bound sibling of chain_receipt; never unsigned. Optional inner state_nonce (ATOMIC profile) is additive and is NOT in scope_hash. See docs/cr-exec-v1.md / docs/cr-exec-attest-v1.md.",
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "authorize"
      -      },
      -      "receipt_kind": {
      -        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      -        "enum": [
      -          "operation_authorization",
      -          "NONE"
      -        ],
      -        "type": "string"
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "safe_for_agent": {
      -        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      -        "type": "boolean"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "decision",
      -      "execution_action",
      -      "safe_for_agent",
      -      "receipt_kind",
      -      "decision_spec_version"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, execution_grant, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      +    "not": {
      +      "anyOf": [
      +        {
      +          "required": [
      +            "decision"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "safe_for_agent"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "execution_grant"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "decision_result"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "control_envelope"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "required_action_core"
      +          ]
      +        }
      +      ]
      +    },
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      +        "type": "object"
      +      },
      +      "analysis_control": {
      +        "type": "object"
      +      },
      +      "analysis_outcome": {
      +        "description": "Closed analysis outcome set derived from engine-visible state only.",
      +        "enum": [
      +          "NO_BREAK_DETECTED",
      +          "BREAKS_DETECTED",
      +          "ANALYSIS_FAILED"
      +        ],
      +        "type": "string"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "authorization_effect": {
      +        "const": "NONE",
      +        "description": "Analyze never authorizes; always NONE."
      +      },
      +      "blast_radius": {
      +        "additionalProperties": false,
      +        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      +        "properties": {
      +          "consumers_declared": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "consumers_observed": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "endpoints": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "fields": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "graph_source": {
      +            "enum": [
      +              "none",
      +              "declared",
      +              "observed",
      +              "declared+observed"
      +            ],
      +            "type": "string"
      +          },
      +          "params": {
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "endpoints",
      +          "fields",
      +          "params",
      +          "consumers_declared",
      +          "consumers_observed",
      +          "graph_source"
      +        ],
      +        "type": "object"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "decision_basis": {},
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "may_execute": {
      +        "const": false,
      +        "description": "Analyze never grants execute permission."
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "analyze"
      +      },
      +      "receipt_kind": {
      +        "const": "NONE",
      +        "description": "Analyze never mints a receipt."
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "analysis_outcome",
      +      "authorization_effect",
      +      "may_execute",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": true,
      +    "allOf": [
      +      {
      +        "if": {
      +          "properties": {
      +            "receipt_kind": {
      +              "const": "operation_authorization"
      +            }
      +          },
      +          "required": [
      +            "receipt_kind"
      +          ]
      +        },
      +        "then": {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        }
      +      },
      +      {
      +        "if": {
      +          "properties": {
      +            "execution_action": {
      +              "enum": [
      +                "CONTINUE",
      +                "CONTINUE_WITH_MONITORING"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        "then": {
      +          "properties": {
      +            "receipt_kind": {
      +              "const": "operation_authorization"
      +            }
      +          },
      +          "required": [
      +            "receipt_kind",
      +            "chain_receipt",
      +            "decision_result"
      +          ]
      +        }
      +      }
      +    ],
      +    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      +        "type": "object"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "blast_radius": {
      +        "additionalProperties": false,
      +        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      +        "properties": {
      +          "consumers_declared": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "consumers_observed": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "endpoints": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "fields": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "graph_source": {
      +            "enum": [
      +              "none",
      +              "declared",
      +              "observed",
      +              "declared+observed"
      +            ],
      +            "type": "string"
      +          },
      +          "params": {
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "endpoints",
      +          "fields",
      +          "params",
      +          "consumers_declared",
      +          "consumers_observed",
      +          "graph_source"
      +        ],
      +        "type": "object"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "description": "Calibration model version when set; null until a calibrated model ships.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "chain_receipt": {
      +        "type": "string"
      +      },
      +      "chain_status": {
      +        "type": "string"
      +      },
      +      "coderifts_version": {
      +        "type": "string"
      +      },
      +      "control_envelope": {
      +        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      +        "type": "object"
      +      },
      +      "decision": {
      +        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      +        "enum": [
      +          "ALLOW",
      +          "WARN",
      +          "REQUIRE_APPROVAL",
      +          "BLOCK"
      +        ],
      +        "type": "string"
      +      },
      +      "decision_basis": {},
      +      "decision_result": {
      +        "additionalProperties": true,
      +        "description": "decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).",
      +        "properties": {
      +          "audience": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "authority": {
      +            "description": "ID963 additive. { audience, tenant_scope: bound|unbound, binding_proven_at? }. Informational — not permission, not a verify-receipt gate, not an ACL.",
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "base": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "blast_radius": {
      +            "description": "ID27 additive COUNTS (not a score). Not permission.",
      +            "properties": {
      +              "consumers_declared": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "consumers_observed": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "endpoints": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "fields": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "graph_source": {
      +                "type": "string"
      +              },
      +              "params": {
      +                "minimum": 0,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "decision": {
      +            "enum": [
      +              "ALLOW",
      +              "WARN",
      +              "REQUIRE_APPROVAL",
      +              "BLOCK"
      +            ],
      +            "type": "string"
      +          },
      +          "decision_body_hash": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "decision_id": {
      +            "type": "string"
      +          },
      +          "derivation": {
      +            "description": "ID637 6b additive. Present only when derivation:\"server\" produced this envelope. { source, platform?, base_sha, head_sha }. Covered by body_hash; not fingerprint.",
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "environment": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "execution_action": {
      +            "enum": [
      +              "CONTINUE",
      +              "CONTINUE_WITH_MONITORING",
      +              "REQUEST_APPROVAL",
      +              "STOP"
      +            ],
      +            "type": "string"
      +          },
      +          "expires_at": {
      +            "type": "string"
      +          },
      +          "fingerprint": {
      +            "type": "string"
      +          },
      +          "head": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "input_fingerprint": {
      +            "type": "string"
      +          },
      +          "operation": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "receipt": {
      +            "type": "object"
      +          },
      +          "repository": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "safe_for_agent": {
      +            "type": "boolean"
      +          },
      +          "spec_version": {
      +            "pattern": "^decision-result\\.v1(\\.[0-9]+)?$",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "execution_action": {
      +        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      +        "enum": [
      +          "CONTINUE",
      +          "CONTINUE_WITH_MONITORING",
      +          "REQUEST_APPROVAL",
      +          "STOP"
      +        ],
      +        "type": "string"
      +      },
      +      "execution_grant": {
      +        "description": "Opt-in cr.exec.v1 execution grant (PHASE-0). Issued only when include_execution_grant is true on authorize. Short-lived mutation-bound sibling of chain_receipt; never unsigned. Optional inner state_nonce (ATOMIC profile) is additive and is NOT in scope_hash. See docs/cr-exec-v1.md / docs/cr-exec-attest-v1.md.",
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "authorize"
      +      },
      +      "receipt_kind": {
      +        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      +        "enum": [
      +          "operation_authorization",
      +          "NONE"
      +        ],
      +        "type": "string"
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "safe_for_agent": {
      +        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      +        "type": "boolean"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "decision",
      +      "execution_action",
      +      "safe_for_agent",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  }
      +]
  12. Changed3 schema fields changed
    • addedInput schema / properties / derivation
      Added value: +{
      +  "description": "Opt-in (ID637 6b). \"server\" = the server derives artifacts[] from GitHub Compare via the App installation. Allowed only when the tenant has a proven binding for context.repository and context.base + context.head are present. Omit artifacts[] (caller-supplied artifacts[] with this flag is 400 — one source of truth). Default absent = today's caller-artifacts path (byte-identical).",
      +  "enum": [
      +    "server"
      +  ],
      +  "type": "string"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "artifacts",
      -  "preflight_mode"
      -]New value: +[
      +  "preflight_mode"
      +]
    • changedOutput schema / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, execution_grant, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      -    "not": {
      -      "anyOf": [
      -        {
      -          "required": [
      -            "decision"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "safe_for_agent"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "execution_grant"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "decision_result"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "control_envelope"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "required_action_core"
      -          ]
      -        }
      -      ]
      -    },
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      -        "type": "object"
      -      },
      -      "analysis_control": {
      -        "type": "object"
      -      },
      -      "analysis_outcome": {
      -        "description": "Closed analysis outcome set derived from engine-visible state only.",
      -        "enum": [
      -          "NO_BREAK_DETECTED",
      -          "BREAKS_DETECTED",
      -          "ANALYSIS_FAILED"
      -        ],
      -        "type": "string"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "authorization_effect": {
      -        "const": "NONE",
      -        "description": "Analyze never authorizes; always NONE."
      -      },
      -      "blast_radius": {
      -        "additionalProperties": false,
      -        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      -        "properties": {
      -          "consumers_declared": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "consumers_observed": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "endpoints": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "fields": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "graph_source": {
      -            "enum": [
      -              "none",
      -              "declared",
      -              "observed",
      -              "declared+observed"
      -            ],
      -            "type": "string"
      -          },
      -          "params": {
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "endpoints",
      -          "fields",
      -          "params",
      -          "consumers_declared",
      -          "consumers_observed",
      -          "graph_source"
      -        ],
      -        "type": "object"
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "decision_basis": {},
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "may_execute": {
      -        "const": false,
      -        "description": "Analyze never grants execute permission."
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "analyze"
      -      },
      -      "receipt_kind": {
      -        "const": "NONE",
      -        "description": "Analyze never mints a receipt."
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "analysis_outcome",
      -      "authorization_effect",
      -      "may_execute",
      -      "receipt_kind",
      -      "decision_spec_version"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": true,
      -    "allOf": [
      -      {
      -        "if": {
      -          "properties": {
      -            "receipt_kind": {
      -              "const": "operation_authorization"
      -            }
      -          },
      -          "required": [
      -            "receipt_kind"
      -          ]
      -        },
      -        "then": {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        }
      -      },
      -      {
      -        "if": {
      -          "properties": {
      -            "execution_action": {
      -              "enum": [
      -                "CONTINUE",
      -                "CONTINUE_WITH_MONITORING"
      -              ]
      -            }
      -          },
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        "then": {
      -          "properties": {
      -            "receipt_kind": {
      -              "const": "operation_authorization"
      -            }
      -          },
      -          "required": [
      -            "receipt_kind",
      -            "chain_receipt",
      -            "decision_result"
      -          ]
      -        }
      -      }
      -    ],
      -    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      -        "type": "object"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "blast_radius": {
      -        "additionalProperties": false,
      -        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      -        "properties": {
      -          "consumers_declared": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "consumers_observed": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "endpoints": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "fields": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "graph_source": {
      -            "enum": [
      -              "none",
      -              "declared",
      -              "observed",
      -              "declared+observed"
      -            ],
      -            "type": "string"
      -          },
      -          "params": {
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "endpoints",
      -          "fields",
      -          "params",
      -          "consumers_declared",
      -          "consumers_observed",
      -          "graph_source"
      -        ],
      -        "type": "object"
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "description": "Calibration model version when set; null until a calibrated model ships.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "chain_receipt": {
      -        "type": "string"
      -      },
      -      "chain_status": {
      -        "type": "string"
      -      },
      -      "coderifts_version": {
      -        "type": "string"
      -      },
      -      "control_envelope": {
      -        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      -        "type": "object"
      -      },
      -      "decision": {
      -        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      -        "enum": [
      -          "ALLOW",
      -          "WARN",
      -          "REQUIRE_APPROVAL",
      -          "BLOCK"
      -        ],
      -        "type": "string"
      -      },
      -      "decision_basis": {},
      -      "decision_result": {
      -        "additionalProperties": true,
      -        "description": "decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).",
      -        "properties": {
      -          "audience": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "authority": {
      -            "description": "ID963 additive. { audience, tenant_scope: bound|unbound, binding_proven_at? }. Informational — not permission, not a verify-receipt gate, not an ACL.",
      -            "type": [
      -              "object",
      -              "null"
      -            ]
      -          },
      -          "base": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "blast_radius": {
      -            "description": "ID27 additive COUNTS (not a score). Not permission.",
      -            "properties": {
      -              "consumers_declared": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "consumers_observed": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "endpoints": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "fields": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "graph_source": {
      -                "type": "string"
      -              },
      -              "params": {
      -                "minimum": 0,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "decision": {
      -            "enum": [
      -              "ALLOW",
      -              "WARN",
      -              "REQUIRE_APPROVAL",
      -              "BLOCK"
      -            ],
      -            "type": "string"
      -          },
      -          "decision_body_hash": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "decision_id": {
      -            "type": "string"
      -          },
      -          "environment": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "execution_action": {
      -            "enum": [
      -              "CONTINUE",
      -              "CONTINUE_WITH_MONITORING",
      -              "REQUEST_APPROVAL",
      -              "STOP"
      -            ],
      -            "type": "string"
      -          },
      -          "expires_at": {
      -            "type": "string"
      -          },
      -          "fingerprint": {
      -            "type": "string"
      -          },
      -          "head": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "input_fingerprint": {
      -            "type": "string"
      -          },
      -          "operation": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "receipt": {
      -            "type": "object"
      -          },
      -          "repository": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "safe_for_agent": {
      -            "type": "boolean"
      -          },
      -          "spec_version": {
      -            "pattern": "^decision-result\\.v1(\\.[0-9]+)?$",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "execution_action": {
      -        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      -        "enum": [
      -          "CONTINUE",
      -          "CONTINUE_WITH_MONITORING",
      -          "REQUEST_APPROVAL",
      -          "STOP"
      -        ],
      -        "type": "string"
      -      },
      -      "execution_grant": {
      -        "description": "Opt-in cr.exec.v1 execution grant (PHASE-0). Issued only when include_execution_grant is true on authorize. Short-lived mutation-bound sibling of chain_receipt; never unsigned. Optional inner state_nonce (ATOMIC profile) is additive and is NOT in scope_hash. See docs/cr-exec-v1.md / docs/cr-exec-attest-v1.md.",
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "authorize"
      -      },
      -      "receipt_kind": {
      -        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      -        "enum": [
      -          "operation_authorization",
      -          "NONE"
      -        ],
      -        "type": "string"
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "safe_for_agent": {
      -        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      -        "type": "boolean"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "decision",
      -      "execution_action",
      -      "safe_for_agent",
      -      "receipt_kind",
      -      "decision_spec_version"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, execution_grant, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      +    "not": {
      +      "anyOf": [
      +        {
      +          "required": [
      +            "decision"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "safe_for_agent"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "execution_grant"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "decision_result"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "control_envelope"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "required_action_core"
      +          ]
      +        }
      +      ]
      +    },
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      +        "type": "object"
      +      },
      +      "analysis_control": {
      +        "type": "object"
      +      },
      +      "analysis_outcome": {
      +        "description": "Closed analysis outcome set derived from engine-visible state only.",
      +        "enum": [
      +          "NO_BREAK_DETECTED",
      +          "BREAKS_DETECTED",
      +          "ANALYSIS_FAILED"
      +        ],
      +        "type": "string"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "authorization_effect": {
      +        "const": "NONE",
      +        "description": "Analyze never authorizes; always NONE."
      +      },
      +      "blast_radius": {
      +        "additionalProperties": false,
      +        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      +        "properties": {
      +          "consumers_declared": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "consumers_observed": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "endpoints": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "fields": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "graph_source": {
      +            "enum": [
      +              "none",
      +              "declared",
      +              "observed",
      +              "declared+observed"
      +            ],
      +            "type": "string"
      +          },
      +          "params": {
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "endpoints",
      +          "fields",
      +          "params",
      +          "consumers_declared",
      +          "consumers_observed",
      +          "graph_source"
      +        ],
      +        "type": "object"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "decision_basis": {},
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "may_execute": {
      +        "const": false,
      +        "description": "Analyze never grants execute permission."
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "analyze"
      +      },
      +      "receipt_kind": {
      +        "const": "NONE",
      +        "description": "Analyze never mints a receipt."
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "analysis_outcome",
      +      "authorization_effect",
      +      "may_execute",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": true,
      +    "allOf": [
      +      {
      +        "if": {
      +          "properties": {
      +            "receipt_kind": {
      +              "const": "operation_authorization"
      +            }
      +          },
      +          "required": [
      +            "receipt_kind"
      +          ]
      +        },
      +        "then": {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        }
      +      },
      +      {
      +        "if": {
      +          "properties": {
      +            "execution_action": {
      +              "enum": [
      +                "CONTINUE",
      +                "CONTINUE_WITH_MONITORING"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        "then": {
      +          "properties": {
      +            "receipt_kind": {
      +              "const": "operation_authorization"
      +            }
      +          },
      +          "required": [
      +            "receipt_kind",
      +            "chain_receipt",
      +            "decision_result"
      +          ]
      +        }
      +      }
      +    ],
      +    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      +        "type": "object"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "blast_radius": {
      +        "additionalProperties": false,
      +        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      +        "properties": {
      +          "consumers_declared": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "consumers_observed": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "endpoints": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "fields": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "graph_source": {
      +            "enum": [
      +              "none",
      +              "declared",
      +              "observed",
      +              "declared+observed"
      +            ],
      +            "type": "string"
      +          },
      +          "params": {
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "endpoints",
      +          "fields",
      +          "params",
      +          "consumers_declared",
      +          "consumers_observed",
      +          "graph_source"
      +        ],
      +        "type": "object"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "description": "Calibration model version when set; null until a calibrated model ships.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "chain_receipt": {
      +        "type": "string"
      +      },
      +      "chain_status": {
      +        "type": "string"
      +      },
      +      "coderifts_version": {
      +        "type": "string"
      +      },
      +      "control_envelope": {
      +        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      +        "type": "object"
      +      },
      +      "decision": {
      +        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      +        "enum": [
      +          "ALLOW",
      +          "WARN",
      +          "REQUIRE_APPROVAL",
      +          "BLOCK"
      +        ],
      +        "type": "string"
      +      },
      +      "decision_basis": {},
      +      "decision_result": {
      +        "additionalProperties": true,
      +        "description": "decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).",
      +        "properties": {
      +          "audience": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "authority": {
      +            "description": "ID963 additive. { audience, tenant_scope: bound|unbound, binding_proven_at? }. Informational — not permission, not a verify-receipt gate, not an ACL.",
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "base": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "blast_radius": {
      +            "description": "ID27 additive COUNTS (not a score). Not permission.",
      +            "properties": {
      +              "consumers_declared": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "consumers_observed": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "endpoints": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "fields": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "graph_source": {
      +                "type": "string"
      +              },
      +              "params": {
      +                "minimum": 0,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "decision": {
      +            "enum": [
      +              "ALLOW",
      +              "WARN",
      +              "REQUIRE_APPROVAL",
      +              "BLOCK"
      +            ],
      +            "type": "string"
      +          },
      +          "decision_body_hash": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "decision_id": {
      +            "type": "string"
      +          },
      +          "derivation": {
      +            "description": "ID637 6b additive. Present only when derivation:\"server\" produced this envelope. { source: github_compare, base_sha, head_sha }. Covered by body_hash; not fingerprint.",
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "environment": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "execution_action": {
      +            "enum": [
      +              "CONTINUE",
      +              "CONTINUE_WITH_MONITORING",
      +              "REQUEST_APPROVAL",
      +              "STOP"
      +            ],
      +            "type": "string"
      +          },
      +          "expires_at": {
      +            "type": "string"
      +          },
      +          "fingerprint": {
      +            "type": "string"
      +          },
      +          "head": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "input_fingerprint": {
      +            "type": "string"
      +          },
      +          "operation": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "receipt": {
      +            "type": "object"
      +          },
      +          "repository": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "safe_for_agent": {
      +            "type": "boolean"
      +          },
      +          "spec_version": {
      +            "pattern": "^decision-result\\.v1(\\.[0-9]+)?$",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "execution_action": {
      +        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      +        "enum": [
      +          "CONTINUE",
      +          "CONTINUE_WITH_MONITORING",
      +          "REQUEST_APPROVAL",
      +          "STOP"
      +        ],
      +        "type": "string"
      +      },
      +      "execution_grant": {
      +        "description": "Opt-in cr.exec.v1 execution grant (PHASE-0). Issued only when include_execution_grant is true on authorize. Short-lived mutation-bound sibling of chain_receipt; never unsigned. Optional inner state_nonce (ATOMIC profile) is additive and is NOT in scope_hash. See docs/cr-exec-v1.md / docs/cr-exec-attest-v1.md.",
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "authorize"
      +      },
      +      "receipt_kind": {
      +        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      +        "enum": [
      +          "operation_authorization",
      +          "NONE"
      +        ],
      +        "type": "string"
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "safe_for_agent": {
      +        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      +        "type": "boolean"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "decision",
      +      "execution_action",
      +      "safe_for_agent",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  }
      +]
  13. Changed1 schema field changed
    • changedOutput schema / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, execution_grant, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      -    "not": {
      -      "anyOf": [
      -        {
      -          "required": [
      -            "decision"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "safe_for_agent"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "execution_grant"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "decision_result"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "control_envelope"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "required_action_core"
      -          ]
      -        }
      -      ]
      -    },
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      -        "type": "object"
      -      },
      -      "analysis_control": {
      -        "type": "object"
      -      },
      -      "analysis_outcome": {
      -        "description": "Closed analysis outcome set derived from engine-visible state only.",
      -        "enum": [
      -          "NO_BREAK_DETECTED",
      -          "BREAKS_DETECTED",
      -          "ANALYSIS_FAILED"
      -        ],
      -        "type": "string"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "authorization_effect": {
      -        "const": "NONE",
      -        "description": "Analyze never authorizes; always NONE."
      -      },
      -      "blast_radius": {
      -        "additionalProperties": false,
      -        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      -        "properties": {
      -          "consumers_declared": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "consumers_observed": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "endpoints": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "fields": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "graph_source": {
      -            "enum": [
      -              "none",
      -              "declared",
      -              "observed",
      -              "declared+observed"
      -            ],
      -            "type": "string"
      -          },
      -          "params": {
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "endpoints",
      -          "fields",
      -          "params",
      -          "consumers_declared",
      -          "consumers_observed",
      -          "graph_source"
      -        ],
      -        "type": "object"
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "decision_basis": {},
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "may_execute": {
      -        "const": false,
      -        "description": "Analyze never grants execute permission."
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "analyze"
      -      },
      -      "receipt_kind": {
      -        "const": "NONE",
      -        "description": "Analyze never mints a receipt."
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "analysis_outcome",
      -      "authorization_effect",
      -      "may_execute",
      -      "receipt_kind",
      -      "decision_spec_version"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": true,
      -    "allOf": [
      -      {
      -        "if": {
      -          "properties": {
      -            "receipt_kind": {
      -              "const": "operation_authorization"
      -            }
      -          },
      -          "required": [
      -            "receipt_kind"
      -          ]
      -        },
      -        "then": {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        }
      -      },
      -      {
      -        "if": {
      -          "properties": {
      -            "execution_action": {
      -              "enum": [
      -                "CONTINUE",
      -                "CONTINUE_WITH_MONITORING"
      -              ]
      -            }
      -          },
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        "then": {
      -          "properties": {
      -            "receipt_kind": {
      -              "const": "operation_authorization"
      -            }
      -          },
      -          "required": [
      -            "receipt_kind",
      -            "chain_receipt",
      -            "decision_result"
      -          ]
      -        }
      -      }
      -    ],
      -    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      -        "type": "object"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "blast_radius": {
      -        "additionalProperties": false,
      -        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      -        "properties": {
      -          "consumers_declared": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "consumers_observed": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "endpoints": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "fields": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "graph_source": {
      -            "enum": [
      -              "none",
      -              "declared",
      -              "observed",
      -              "declared+observed"
      -            ],
      -            "type": "string"
      -          },
      -          "params": {
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "endpoints",
      -          "fields",
      -          "params",
      -          "consumers_declared",
      -          "consumers_observed",
      -          "graph_source"
      -        ],
      -        "type": "object"
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "description": "Calibration model version when set; null until a calibrated model ships.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "chain_receipt": {
      -        "type": "string"
      -      },
      -      "chain_status": {
      -        "type": "string"
      -      },
      -      "coderifts_version": {
      -        "type": "string"
      -      },
      -      "control_envelope": {
      -        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      -        "type": "object"
      -      },
      -      "decision": {
      -        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      -        "enum": [
      -          "ALLOW",
      -          "WARN",
      -          "REQUIRE_APPROVAL",
      -          "BLOCK"
      -        ],
      -        "type": "string"
      -      },
      -      "decision_basis": {},
      -      "decision_result": {
      -        "additionalProperties": true,
      -        "description": "decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).",
      -        "properties": {
      -          "base": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "blast_radius": {
      -            "description": "ID27 additive COUNTS (not a score). Not permission.",
      -            "properties": {
      -              "consumers_declared": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "consumers_observed": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "endpoints": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "fields": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "graph_source": {
      -                "type": "string"
      -              },
      -              "params": {
      -                "minimum": 0,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "decision": {
      -            "enum": [
      -              "ALLOW",
      -              "WARN",
      -              "REQUIRE_APPROVAL",
      -              "BLOCK"
      -            ],
      -            "type": "string"
      -          },
      -          "decision_body_hash": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "decision_id": {
      -            "type": "string"
      -          },
      -          "environment": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "execution_action": {
      -            "enum": [
      -              "CONTINUE",
      -              "CONTINUE_WITH_MONITORING",
      -              "REQUEST_APPROVAL",
      -              "STOP"
      -            ],
      -            "type": "string"
      -          },
      -          "expires_at": {
      -            "type": "string"
      -          },
      -          "fingerprint": {
      -            "type": "string"
      -          },
      -          "head": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "input_fingerprint": {
      -            "type": "string"
      -          },
      -          "operation": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "receipt": {
      -            "type": "object"
      -          },
      -          "repository": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "safe_for_agent": {
      -            "type": "boolean"
      -          },
      -          "spec_version": {
      -            "pattern": "^decision-result\\.v1(\\.[0-9]+)?$",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "execution_action": {
      -        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      -        "enum": [
      -          "CONTINUE",
      -          "CONTINUE_WITH_MONITORING",
      -          "REQUEST_APPROVAL",
      -          "STOP"
      -        ],
      -        "type": "string"
      -      },
      -      "execution_grant": {
      -        "description": "Opt-in cr.exec.v1 execution grant (PHASE-0). Issued only when include_execution_grant is true on authorize. Short-lived mutation-bound sibling of chain_receipt; never unsigned. Optional inner state_nonce (ATOMIC profile) is additive and is NOT in scope_hash. See docs/cr-exec-v1.md / docs/cr-exec-attest-v1.md.",
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "authorize"
      -      },
      -      "receipt_kind": {
      -        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      -        "enum": [
      -          "operation_authorization",
      -          "NONE"
      -        ],
      -        "type": "string"
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "safe_for_agent": {
      -        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      -        "type": "boolean"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "decision",
      -      "execution_action",
      -      "safe_for_agent",
      -      "receipt_kind",
      -      "decision_spec_version"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, execution_grant, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      +    "not": {
      +      "anyOf": [
      +        {
      +          "required": [
      +            "decision"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "safe_for_agent"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "execution_grant"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "decision_result"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "control_envelope"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "required_action_core"
      +          ]
      +        }
      +      ]
      +    },
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      +        "type": "object"
      +      },
      +      "analysis_control": {
      +        "type": "object"
      +      },
      +      "analysis_outcome": {
      +        "description": "Closed analysis outcome set derived from engine-visible state only.",
      +        "enum": [
      +          "NO_BREAK_DETECTED",
      +          "BREAKS_DETECTED",
      +          "ANALYSIS_FAILED"
      +        ],
      +        "type": "string"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "authorization_effect": {
      +        "const": "NONE",
      +        "description": "Analyze never authorizes; always NONE."
      +      },
      +      "blast_radius": {
      +        "additionalProperties": false,
      +        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      +        "properties": {
      +          "consumers_declared": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "consumers_observed": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "endpoints": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "fields": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "graph_source": {
      +            "enum": [
      +              "none",
      +              "declared",
      +              "observed",
      +              "declared+observed"
      +            ],
      +            "type": "string"
      +          },
      +          "params": {
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "endpoints",
      +          "fields",
      +          "params",
      +          "consumers_declared",
      +          "consumers_observed",
      +          "graph_source"
      +        ],
      +        "type": "object"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "decision_basis": {},
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "may_execute": {
      +        "const": false,
      +        "description": "Analyze never grants execute permission."
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "analyze"
      +      },
      +      "receipt_kind": {
      +        "const": "NONE",
      +        "description": "Analyze never mints a receipt."
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "analysis_outcome",
      +      "authorization_effect",
      +      "may_execute",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": true,
      +    "allOf": [
      +      {
      +        "if": {
      +          "properties": {
      +            "receipt_kind": {
      +              "const": "operation_authorization"
      +            }
      +          },
      +          "required": [
      +            "receipt_kind"
      +          ]
      +        },
      +        "then": {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        }
      +      },
      +      {
      +        "if": {
      +          "properties": {
      +            "execution_action": {
      +              "enum": [
      +                "CONTINUE",
      +                "CONTINUE_WITH_MONITORING"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        "then": {
      +          "properties": {
      +            "receipt_kind": {
      +              "const": "operation_authorization"
      +            }
      +          },
      +          "required": [
      +            "receipt_kind",
      +            "chain_receipt",
      +            "decision_result"
      +          ]
      +        }
      +      }
      +    ],
      +    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      +        "type": "object"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "blast_radius": {
      +        "additionalProperties": false,
      +        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      +        "properties": {
      +          "consumers_declared": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "consumers_observed": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "endpoints": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "fields": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "graph_source": {
      +            "enum": [
      +              "none",
      +              "declared",
      +              "observed",
      +              "declared+observed"
      +            ],
      +            "type": "string"
      +          },
      +          "params": {
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "endpoints",
      +          "fields",
      +          "params",
      +          "consumers_declared",
      +          "consumers_observed",
      +          "graph_source"
      +        ],
      +        "type": "object"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "description": "Calibration model version when set; null until a calibrated model ships.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "chain_receipt": {
      +        "type": "string"
      +      },
      +      "chain_status": {
      +        "type": "string"
      +      },
      +      "coderifts_version": {
      +        "type": "string"
      +      },
      +      "control_envelope": {
      +        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      +        "type": "object"
      +      },
      +      "decision": {
      +        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      +        "enum": [
      +          "ALLOW",
      +          "WARN",
      +          "REQUIRE_APPROVAL",
      +          "BLOCK"
      +        ],
      +        "type": "string"
      +      },
      +      "decision_basis": {},
      +      "decision_result": {
      +        "additionalProperties": true,
      +        "description": "decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).",
      +        "properties": {
      +          "audience": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "authority": {
      +            "description": "ID963 additive. { audience, tenant_scope: bound|unbound, binding_proven_at? }. Informational — not permission, not a verify-receipt gate, not an ACL.",
      +            "type": [
      +              "object",
      +              "null"
      +            ]
      +          },
      +          "base": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "blast_radius": {
      +            "description": "ID27 additive COUNTS (not a score). Not permission.",
      +            "properties": {
      +              "consumers_declared": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "consumers_observed": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "endpoints": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "fields": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "graph_source": {
      +                "type": "string"
      +              },
      +              "params": {
      +                "minimum": 0,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "decision": {
      +            "enum": [
      +              "ALLOW",
      +              "WARN",
      +              "REQUIRE_APPROVAL",
      +              "BLOCK"
      +            ],
      +            "type": "string"
      +          },
      +          "decision_body_hash": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "decision_id": {
      +            "type": "string"
      +          },
      +          "environment": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "execution_action": {
      +            "enum": [
      +              "CONTINUE",
      +              "CONTINUE_WITH_MONITORING",
      +              "REQUEST_APPROVAL",
      +              "STOP"
      +            ],
      +            "type": "string"
      +          },
      +          "expires_at": {
      +            "type": "string"
      +          },
      +          "fingerprint": {
      +            "type": "string"
      +          },
      +          "head": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "input_fingerprint": {
      +            "type": "string"
      +          },
      +          "operation": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "receipt": {
      +            "type": "object"
      +          },
      +          "repository": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "safe_for_agent": {
      +            "type": "boolean"
      +          },
      +          "spec_version": {
      +            "pattern": "^decision-result\\.v1(\\.[0-9]+)?$",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "execution_action": {
      +        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      +        "enum": [
      +          "CONTINUE",
      +          "CONTINUE_WITH_MONITORING",
      +          "REQUEST_APPROVAL",
      +          "STOP"
      +        ],
      +        "type": "string"
      +      },
      +      "execution_grant": {
      +        "description": "Opt-in cr.exec.v1 execution grant (PHASE-0). Issued only when include_execution_grant is true on authorize. Short-lived mutation-bound sibling of chain_receipt; never unsigned. Optional inner state_nonce (ATOMIC profile) is additive and is NOT in scope_hash. See docs/cr-exec-v1.md / docs/cr-exec-attest-v1.md.",
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "authorize"
      +      },
      +      "receipt_kind": {
      +        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      +        "enum": [
      +          "operation_authorization",
      +          "NONE"
      +        ],
      +        "type": "string"
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "safe_for_agent": {
      +        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      +        "type": "boolean"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "decision",
      +      "execution_action",
      +      "safe_for_agent",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  }
      +]
  14. Changed2 schema fields changed
    • addedInput schema / properties / state_nonce
      Added value: +{
      +  "description": "Optional ATOMIC-profile nonce. When include_execution_grant is true, copied into the signed grant as state_nonce (a separate signed field — NOT folded into scope_hash). Absent → BEARER grant (today's default). See docs/cr-exec-v1.md.",
      +  "type": "string"
      +}
    • changedOutput schema / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, execution_grant, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      -    "not": {
      -      "anyOf": [
      -        {
      -          "required": [
      -            "decision"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "safe_for_agent"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "execution_grant"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "decision_result"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "control_envelope"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "required_action_core"
      -          ]
      -        }
      -      ]
      -    },
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      -        "type": "object"
      -      },
      -      "analysis_control": {
      -        "type": "object"
      -      },
      -      "analysis_outcome": {
      -        "description": "Closed analysis outcome set derived from engine-visible state only.",
      -        "enum": [
      -          "NO_BREAK_DETECTED",
      -          "BREAKS_DETECTED",
      -          "ANALYSIS_FAILED"
      -        ],
      -        "type": "string"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "authorization_effect": {
      -        "const": "NONE",
      -        "description": "Analyze never authorizes; always NONE."
      -      },
      -      "blast_radius": {
      -        "additionalProperties": false,
      -        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      -        "properties": {
      -          "consumers_declared": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "consumers_observed": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "endpoints": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "fields": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "graph_source": {
      -            "enum": [
      -              "none",
      -              "declared",
      -              "observed",
      -              "declared+observed"
      -            ],
      -            "type": "string"
      -          },
      -          "params": {
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "endpoints",
      -          "fields",
      -          "params",
      -          "consumers_declared",
      -          "consumers_observed",
      -          "graph_source"
      -        ],
      -        "type": "object"
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "decision_basis": {},
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "may_execute": {
      -        "const": false,
      -        "description": "Analyze never grants execute permission."
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "analyze"
      -      },
      -      "receipt_kind": {
      -        "const": "NONE",
      -        "description": "Analyze never mints a receipt."
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "analysis_outcome",
      -      "authorization_effect",
      -      "may_execute",
      -      "receipt_kind",
      -      "decision_spec_version"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": true,
      -    "allOf": [
      -      {
      -        "if": {
      -          "properties": {
      -            "receipt_kind": {
      -              "const": "operation_authorization"
      -            }
      -          },
      -          "required": [
      -            "receipt_kind"
      -          ]
      -        },
      -        "then": {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        }
      -      },
      -      {
      -        "if": {
      -          "properties": {
      -            "execution_action": {
      -              "enum": [
      -                "CONTINUE",
      -                "CONTINUE_WITH_MONITORING"
      -              ]
      -            }
      -          },
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        "then": {
      -          "properties": {
      -            "receipt_kind": {
      -              "const": "operation_authorization"
      -            }
      -          },
      -          "required": [
      -            "receipt_kind",
      -            "chain_receipt",
      -            "decision_result"
      -          ]
      -        }
      -      }
      -    ],
      -    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      -        "type": "object"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "blast_radius": {
      -        "additionalProperties": false,
      -        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      -        "properties": {
      -          "consumers_declared": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "consumers_observed": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "endpoints": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "fields": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "graph_source": {
      -            "enum": [
      -              "none",
      -              "declared",
      -              "observed",
      -              "declared+observed"
      -            ],
      -            "type": "string"
      -          },
      -          "params": {
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "endpoints",
      -          "fields",
      -          "params",
      -          "consumers_declared",
      -          "consumers_observed",
      -          "graph_source"
      -        ],
      -        "type": "object"
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "description": "Calibration model version when set; null until a calibrated model ships.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "chain_receipt": {
      -        "type": "string"
      -      },
      -      "chain_status": {
      -        "type": "string"
      -      },
      -      "coderifts_version": {
      -        "type": "string"
      -      },
      -      "control_envelope": {
      -        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      -        "type": "object"
      -      },
      -      "decision": {
      -        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      -        "enum": [
      -          "ALLOW",
      -          "WARN",
      -          "REQUIRE_APPROVAL",
      -          "BLOCK"
      -        ],
      -        "type": "string"
      -      },
      -      "decision_basis": {},
      -      "decision_result": {
      -        "additionalProperties": true,
      -        "description": "decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).",
      -        "properties": {
      -          "base": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "blast_radius": {
      -            "description": "ID27 additive COUNTS (not a score). Not permission.",
      -            "properties": {
      -              "consumers_declared": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "consumers_observed": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "endpoints": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "fields": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "graph_source": {
      -                "type": "string"
      -              },
      -              "params": {
      -                "minimum": 0,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "decision": {
      -            "enum": [
      -              "ALLOW",
      -              "WARN",
      -              "REQUIRE_APPROVAL",
      -              "BLOCK"
      -            ],
      -            "type": "string"
      -          },
      -          "decision_body_hash": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "decision_id": {
      -            "type": "string"
      -          },
      -          "environment": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "execution_action": {
      -            "enum": [
      -              "CONTINUE",
      -              "CONTINUE_WITH_MONITORING",
      -              "REQUEST_APPROVAL",
      -              "STOP"
      -            ],
      -            "type": "string"
      -          },
      -          "expires_at": {
      -            "type": "string"
      -          },
      -          "fingerprint": {
      -            "type": "string"
      -          },
      -          "head": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "input_fingerprint": {
      -            "type": "string"
      -          },
      -          "operation": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "receipt": {
      -            "type": "object"
      -          },
      -          "repository": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "safe_for_agent": {
      -            "type": "boolean"
      -          },
      -          "spec_version": {
      -            "pattern": "^decision-result\\.v1(\\.[0-9]+)?$",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "execution_action": {
      -        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      -        "enum": [
      -          "CONTINUE",
      -          "CONTINUE_WITH_MONITORING",
      -          "REQUEST_APPROVAL",
      -          "STOP"
      -        ],
      -        "type": "string"
      -      },
      -      "execution_grant": {
      -        "description": "Opt-in cr.exec.v1 execution grant (PHASE-0). Issued only when include_execution_grant is true on authorize. Short-lived mutation-bound sibling of chain_receipt; never unsigned. See docs/cr-exec-v1.md.",
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "authorize"
      -      },
      -      "receipt_kind": {
      -        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      -        "enum": [
      -          "operation_authorization",
      -          "NONE"
      -        ],
      -        "type": "string"
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "safe_for_agent": {
      -        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      -        "type": "boolean"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "decision",
      -      "execution_action",
      -      "safe_for_agent",
      -      "receipt_kind",
      -      "decision_spec_version"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, execution_grant, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      +    "not": {
      +      "anyOf": [
      +        {
      +          "required": [
      +            "decision"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "safe_for_agent"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "execution_grant"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "decision_result"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "control_envelope"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "required_action_core"
      +          ]
      +        }
      +      ]
      +    },
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      +        "type": "object"
      +      },
      +      "analysis_control": {
      +        "type": "object"
      +      },
      +      "analysis_outcome": {
      +        "description": "Closed analysis outcome set derived from engine-visible state only.",
      +        "enum": [
      +          "NO_BREAK_DETECTED",
      +          "BREAKS_DETECTED",
      +          "ANALYSIS_FAILED"
      +        ],
      +        "type": "string"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "authorization_effect": {
      +        "const": "NONE",
      +        "description": "Analyze never authorizes; always NONE."
      +      },
      +      "blast_radius": {
      +        "additionalProperties": false,
      +        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      +        "properties": {
      +          "consumers_declared": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "consumers_observed": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "endpoints": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "fields": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "graph_source": {
      +            "enum": [
      +              "none",
      +              "declared",
      +              "observed",
      +              "declared+observed"
      +            ],
      +            "type": "string"
      +          },
      +          "params": {
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "endpoints",
      +          "fields",
      +          "params",
      +          "consumers_declared",
      +          "consumers_observed",
      +          "graph_source"
      +        ],
      +        "type": "object"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "decision_basis": {},
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "may_execute": {
      +        "const": false,
      +        "description": "Analyze never grants execute permission."
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "analyze"
      +      },
      +      "receipt_kind": {
      +        "const": "NONE",
      +        "description": "Analyze never mints a receipt."
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "analysis_outcome",
      +      "authorization_effect",
      +      "may_execute",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": true,
      +    "allOf": [
      +      {
      +        "if": {
      +          "properties": {
      +            "receipt_kind": {
      +              "const": "operation_authorization"
      +            }
      +          },
      +          "required": [
      +            "receipt_kind"
      +          ]
      +        },
      +        "then": {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        }
      +      },
      +      {
      +        "if": {
      +          "properties": {
      +            "execution_action": {
      +              "enum": [
      +                "CONTINUE",
      +                "CONTINUE_WITH_MONITORING"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        "then": {
      +          "properties": {
      +            "receipt_kind": {
      +              "const": "operation_authorization"
      +            }
      +          },
      +          "required": [
      +            "receipt_kind",
      +            "chain_receipt",
      +            "decision_result"
      +          ]
      +        }
      +      }
      +    ],
      +    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      +        "type": "object"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "blast_radius": {
      +        "additionalProperties": false,
      +        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      +        "properties": {
      +          "consumers_declared": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "consumers_observed": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "endpoints": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "fields": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "graph_source": {
      +            "enum": [
      +              "none",
      +              "declared",
      +              "observed",
      +              "declared+observed"
      +            ],
      +            "type": "string"
      +          },
      +          "params": {
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "endpoints",
      +          "fields",
      +          "params",
      +          "consumers_declared",
      +          "consumers_observed",
      +          "graph_source"
      +        ],
      +        "type": "object"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "description": "Calibration model version when set; null until a calibrated model ships.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "chain_receipt": {
      +        "type": "string"
      +      },
      +      "chain_status": {
      +        "type": "string"
      +      },
      +      "coderifts_version": {
      +        "type": "string"
      +      },
      +      "control_envelope": {
      +        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      +        "type": "object"
      +      },
      +      "decision": {
      +        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      +        "enum": [
      +          "ALLOW",
      +          "WARN",
      +          "REQUIRE_APPROVAL",
      +          "BLOCK"
      +        ],
      +        "type": "string"
      +      },
      +      "decision_basis": {},
      +      "decision_result": {
      +        "additionalProperties": true,
      +        "description": "decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).",
      +        "properties": {
      +          "base": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "blast_radius": {
      +            "description": "ID27 additive COUNTS (not a score). Not permission.",
      +            "properties": {
      +              "consumers_declared": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "consumers_observed": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "endpoints": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "fields": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "graph_source": {
      +                "type": "string"
      +              },
      +              "params": {
      +                "minimum": 0,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "decision": {
      +            "enum": [
      +              "ALLOW",
      +              "WARN",
      +              "REQUIRE_APPROVAL",
      +              "BLOCK"
      +            ],
      +            "type": "string"
      +          },
      +          "decision_body_hash": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "decision_id": {
      +            "type": "string"
      +          },
      +          "environment": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "execution_action": {
      +            "enum": [
      +              "CONTINUE",
      +              "CONTINUE_WITH_MONITORING",
      +              "REQUEST_APPROVAL",
      +              "STOP"
      +            ],
      +            "type": "string"
      +          },
      +          "expires_at": {
      +            "type": "string"
      +          },
      +          "fingerprint": {
      +            "type": "string"
      +          },
      +          "head": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "input_fingerprint": {
      +            "type": "string"
      +          },
      +          "operation": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "receipt": {
      +            "type": "object"
      +          },
      +          "repository": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "safe_for_agent": {
      +            "type": "boolean"
      +          },
      +          "spec_version": {
      +            "pattern": "^decision-result\\.v1(\\.[0-9]+)?$",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "execution_action": {
      +        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      +        "enum": [
      +          "CONTINUE",
      +          "CONTINUE_WITH_MONITORING",
      +          "REQUEST_APPROVAL",
      +          "STOP"
      +        ],
      +        "type": "string"
      +      },
      +      "execution_grant": {
      +        "description": "Opt-in cr.exec.v1 execution grant (PHASE-0). Issued only when include_execution_grant is true on authorize. Short-lived mutation-bound sibling of chain_receipt; never unsigned. Optional inner state_nonce (ATOMIC profile) is additive and is NOT in scope_hash. See docs/cr-exec-v1.md / docs/cr-exec-attest-v1.md.",
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "authorize"
      +      },
      +      "receipt_kind": {
      +        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      +        "enum": [
      +          "operation_authorization",
      +          "NONE"
      +        ],
      +        "type": "string"
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "safe_for_agent": {
      +        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      +        "type": "boolean"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "decision",
      +      "execution_action",
      +      "safe_for_agent",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  }
      +]
  15. Changed2 schema fields changed
    • addedInput schema / properties / include_execution_grant
      Added value: +{
      +  "description": "Opt-in (authorize only). When true on allow-class authorize, the response includes a signed execution_grant (cr.exec.v1) alongside chain_receipt, or HTTP 503 SIGNER_UNAVAILABLE — never unsigned. Default false. Analyze ignores this flag. See docs/cr-exec-v1.md.",
      +  "type": "boolean"
      +}
    • changedOutput schema / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      -    "not": {
      -      "anyOf": [
      -        {
      -          "required": [
      -            "decision"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "safe_for_agent"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "decision_result"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "control_envelope"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "required_action_core"
      -          ]
      -        }
      -      ]
      -    },
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      -        "type": "object"
      -      },
      -      "analysis_control": {
      -        "type": "object"
      -      },
      -      "analysis_outcome": {
      -        "description": "Closed analysis outcome set derived from engine-visible state only.",
      -        "enum": [
      -          "NO_BREAK_DETECTED",
      -          "BREAKS_DETECTED",
      -          "ANALYSIS_FAILED"
      -        ],
      -        "type": "string"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "authorization_effect": {
      -        "const": "NONE",
      -        "description": "Analyze never authorizes; always NONE."
      -      },
      -      "blast_radius": {
      -        "additionalProperties": false,
      -        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      -        "properties": {
      -          "consumers_declared": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "consumers_observed": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "endpoints": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "fields": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "graph_source": {
      -            "enum": [
      -              "none",
      -              "declared",
      -              "observed",
      -              "declared+observed"
      -            ],
      -            "type": "string"
      -          },
      -          "params": {
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "endpoints",
      -          "fields",
      -          "params",
      -          "consumers_declared",
      -          "consumers_observed",
      -          "graph_source"
      -        ],
      -        "type": "object"
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "decision_basis": {},
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "may_execute": {
      -        "const": false,
      -        "description": "Analyze never grants execute permission."
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "analyze"
      -      },
      -      "receipt_kind": {
      -        "const": "NONE",
      -        "description": "Analyze never mints a receipt."
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "analysis_outcome",
      -      "authorization_effect",
      -      "may_execute",
      -      "receipt_kind",
      -      "decision_spec_version"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": true,
      -    "allOf": [
      -      {
      -        "if": {
      -          "properties": {
      -            "receipt_kind": {
      -              "const": "operation_authorization"
      -            }
      -          },
      -          "required": [
      -            "receipt_kind"
      -          ]
      -        },
      -        "then": {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        }
      -      },
      -      {
      -        "if": {
      -          "properties": {
      -            "execution_action": {
      -              "enum": [
      -                "CONTINUE",
      -                "CONTINUE_WITH_MONITORING"
      -              ]
      -            }
      -          },
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        "then": {
      -          "properties": {
      -            "receipt_kind": {
      -              "const": "operation_authorization"
      -            }
      -          },
      -          "required": [
      -            "receipt_kind",
      -            "chain_receipt",
      -            "decision_result"
      -          ]
      -        }
      -      }
      -    ],
      -    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      -        "type": "object"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "blast_radius": {
      -        "additionalProperties": false,
      -        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      -        "properties": {
      -          "consumers_declared": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "consumers_observed": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "endpoints": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "fields": {
      -            "minimum": 0,
      -            "type": "integer"
      -          },
      -          "graph_source": {
      -            "enum": [
      -              "none",
      -              "declared",
      -              "observed",
      -              "declared+observed"
      -            ],
      -            "type": "string"
      -          },
      -          "params": {
      -            "minimum": 0,
      -            "type": "integer"
      -          }
      -        },
      -        "required": [
      -          "endpoints",
      -          "fields",
      -          "params",
      -          "consumers_declared",
      -          "consumers_observed",
      -          "graph_source"
      -        ],
      -        "type": "object"
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "description": "Calibration model version when set; null until a calibrated model ships.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "chain_receipt": {
      -        "type": "string"
      -      },
      -      "chain_status": {
      -        "type": "string"
      -      },
      -      "coderifts_version": {
      -        "type": "string"
      -      },
      -      "control_envelope": {
      -        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      -        "type": "object"
      -      },
      -      "decision": {
      -        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      -        "enum": [
      -          "ALLOW",
      -          "WARN",
      -          "REQUIRE_APPROVAL",
      -          "BLOCK"
      -        ],
      -        "type": "string"
      -      },
      -      "decision_basis": {},
      -      "decision_result": {
      -        "additionalProperties": true,
      -        "description": "decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).",
      -        "properties": {
      -          "base": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "blast_radius": {
      -            "description": "ID27 additive COUNTS (not a score). Not permission.",
      -            "properties": {
      -              "consumers_declared": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "consumers_observed": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "endpoints": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "fields": {
      -                "minimum": 0,
      -                "type": "integer"
      -              },
      -              "graph_source": {
      -                "type": "string"
      -              },
      -              "params": {
      -                "minimum": 0,
      -                "type": "integer"
      -              }
      -            },
      -            "type": "object"
      -          },
      -          "decision": {
      -            "enum": [
      -              "ALLOW",
      -              "WARN",
      -              "REQUIRE_APPROVAL",
      -              "BLOCK"
      -            ],
      -            "type": "string"
      -          },
      -          "decision_body_hash": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "decision_id": {
      -            "type": "string"
      -          },
      -          "environment": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "execution_action": {
      -            "enum": [
      -              "CONTINUE",
      -              "CONTINUE_WITH_MONITORING",
      -              "REQUEST_APPROVAL",
      -              "STOP"
      -            ],
      -            "type": "string"
      -          },
      -          "expires_at": {
      -            "type": "string"
      -          },
      -          "fingerprint": {
      -            "type": "string"
      -          },
      -          "head": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "input_fingerprint": {
      -            "type": "string"
      -          },
      -          "operation": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "receipt": {
      -            "type": "object"
      -          },
      -          "repository": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "safe_for_agent": {
      -            "type": "boolean"
      -          },
      -          "spec_version": {
      -            "pattern": "^decision-result\\.v1(\\.[0-9]+)?$",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "execution_action": {
      -        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      -        "enum": [
      -          "CONTINUE",
      -          "CONTINUE_WITH_MONITORING",
      -          "REQUEST_APPROVAL",
      -          "STOP"
      -        ],
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "authorize"
      -      },
      -      "receipt_kind": {
      -        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      -        "enum": [
      -          "operation_authorization",
      -          "NONE"
      -        ],
      -        "type": "string"
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "safe_for_agent": {
      -        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      -        "type": "boolean"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "decision",
      -      "execution_action",
      -      "safe_for_agent",
      -      "receipt_kind",
      -      "decision_spec_version"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, execution_grant, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      +    "not": {
      +      "anyOf": [
      +        {
      +          "required": [
      +            "decision"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "safe_for_agent"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "execution_grant"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "decision_result"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "control_envelope"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "required_action_core"
      +          ]
      +        }
      +      ]
      +    },
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      +        "type": "object"
      +      },
      +      "analysis_control": {
      +        "type": "object"
      +      },
      +      "analysis_outcome": {
      +        "description": "Closed analysis outcome set derived from engine-visible state only.",
      +        "enum": [
      +          "NO_BREAK_DETECTED",
      +          "BREAKS_DETECTED",
      +          "ANALYSIS_FAILED"
      +        ],
      +        "type": "string"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "authorization_effect": {
      +        "const": "NONE",
      +        "description": "Analyze never authorizes; always NONE."
      +      },
      +      "blast_radius": {
      +        "additionalProperties": false,
      +        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      +        "properties": {
      +          "consumers_declared": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "consumers_observed": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "endpoints": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "fields": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "graph_source": {
      +            "enum": [
      +              "none",
      +              "declared",
      +              "observed",
      +              "declared+observed"
      +            ],
      +            "type": "string"
      +          },
      +          "params": {
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "endpoints",
      +          "fields",
      +          "params",
      +          "consumers_declared",
      +          "consumers_observed",
      +          "graph_source"
      +        ],
      +        "type": "object"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "decision_basis": {},
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "may_execute": {
      +        "const": false,
      +        "description": "Analyze never grants execute permission."
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "analyze"
      +      },
      +      "receipt_kind": {
      +        "const": "NONE",
      +        "description": "Analyze never mints a receipt."
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "analysis_outcome",
      +      "authorization_effect",
      +      "may_execute",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": true,
      +    "allOf": [
      +      {
      +        "if": {
      +          "properties": {
      +            "receipt_kind": {
      +              "const": "operation_authorization"
      +            }
      +          },
      +          "required": [
      +            "receipt_kind"
      +          ]
      +        },
      +        "then": {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        }
      +      },
      +      {
      +        "if": {
      +          "properties": {
      +            "execution_action": {
      +              "enum": [
      +                "CONTINUE",
      +                "CONTINUE_WITH_MONITORING"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        "then": {
      +          "properties": {
      +            "receipt_kind": {
      +              "const": "operation_authorization"
      +            }
      +          },
      +          "required": [
      +            "receipt_kind",
      +            "chain_receipt",
      +            "decision_result"
      +          ]
      +        }
      +      }
      +    ],
      +    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      +        "type": "object"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "blast_radius": {
      +        "additionalProperties": false,
      +        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      +        "properties": {
      +          "consumers_declared": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "consumers_observed": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "endpoints": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "fields": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "graph_source": {
      +            "enum": [
      +              "none",
      +              "declared",
      +              "observed",
      +              "declared+observed"
      +            ],
      +            "type": "string"
      +          },
      +          "params": {
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "endpoints",
      +          "fields",
      +          "params",
      +          "consumers_declared",
      +          "consumers_observed",
      +          "graph_source"
      +        ],
      +        "type": "object"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "description": "Calibration model version when set; null until a calibrated model ships.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "chain_receipt": {
      +        "type": "string"
      +      },
      +      "chain_status": {
      +        "type": "string"
      +      },
      +      "coderifts_version": {
      +        "type": "string"
      +      },
      +      "control_envelope": {
      +        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      +        "type": "object"
      +      },
      +      "decision": {
      +        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      +        "enum": [
      +          "ALLOW",
      +          "WARN",
      +          "REQUIRE_APPROVAL",
      +          "BLOCK"
      +        ],
      +        "type": "string"
      +      },
      +      "decision_basis": {},
      +      "decision_result": {
      +        "additionalProperties": true,
      +        "description": "decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).",
      +        "properties": {
      +          "base": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "blast_radius": {
      +            "description": "ID27 additive COUNTS (not a score). Not permission.",
      +            "properties": {
      +              "consumers_declared": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "consumers_observed": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "endpoints": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "fields": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "graph_source": {
      +                "type": "string"
      +              },
      +              "params": {
      +                "minimum": 0,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "decision": {
      +            "enum": [
      +              "ALLOW",
      +              "WARN",
      +              "REQUIRE_APPROVAL",
      +              "BLOCK"
      +            ],
      +            "type": "string"
      +          },
      +          "decision_body_hash": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "decision_id": {
      +            "type": "string"
      +          },
      +          "environment": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "execution_action": {
      +            "enum": [
      +              "CONTINUE",
      +              "CONTINUE_WITH_MONITORING",
      +              "REQUEST_APPROVAL",
      +              "STOP"
      +            ],
      +            "type": "string"
      +          },
      +          "expires_at": {
      +            "type": "string"
      +          },
      +          "fingerprint": {
      +            "type": "string"
      +          },
      +          "head": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "input_fingerprint": {
      +            "type": "string"
      +          },
      +          "operation": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "receipt": {
      +            "type": "object"
      +          },
      +          "repository": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "safe_for_agent": {
      +            "type": "boolean"
      +          },
      +          "spec_version": {
      +            "pattern": "^decision-result\\.v1(\\.[0-9]+)?$",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "execution_action": {
      +        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      +        "enum": [
      +          "CONTINUE",
      +          "CONTINUE_WITH_MONITORING",
      +          "REQUEST_APPROVAL",
      +          "STOP"
      +        ],
      +        "type": "string"
      +      },
      +      "execution_grant": {
      +        "description": "Opt-in cr.exec.v1 execution grant (PHASE-0). Issued only when include_execution_grant is true on authorize. Short-lived mutation-bound sibling of chain_receipt; never unsigned. See docs/cr-exec-v1.md.",
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "authorize"
      +      },
      +      "receipt_kind": {
      +        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      +        "enum": [
      +          "operation_authorization",
      +          "NONE"
      +        ],
      +        "type": "string"
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "safe_for_agent": {
      +        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      +        "type": "boolean"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "decision",
      +      "execution_action",
      +      "safe_for_agent",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  }
      +]
  16. Changed3 schema fields changed
    • addedInput schema / properties / context / properties / audience
      Added value: +{
      +  "description": "Optional audience (IntentContext parity; REST/MCP accept, server-derived audience still wins on the envelope)",
      +  "type": "string"
      +}
    • addedInput schema / properties / context / properties / fingerprint
      Added value: +{
      +  "description": "Optional change fingerprint (IntentContext parity; not folded into the bundle fingerprint)",
      +  "type": "string"
      +}
    • addedInput schema / properties / context / properties / target_id
      Added value: +{
      +  "description": "Optional apply-site target (IntentContext parity; not folded into the bundle fingerprint)",
      +  "type": "string"
      +}
  17. Changed1 schema field changed
    • changedOutput schema / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      -    "not": {
      -      "anyOf": [
      -        {
      -          "required": [
      -            "decision"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "safe_for_agent"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "decision_result"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "control_envelope"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "required_action_core"
      -          ]
      -        }
      -      ]
      -    },
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      -        "type": "object"
      -      },
      -      "analysis_control": {
      -        "type": "object"
      -      },
      -      "analysis_outcome": {
      -        "description": "Closed analysis outcome set derived from engine-visible state only.",
      -        "enum": [
      -          "NO_BREAK_DETECTED",
      -          "BREAKS_DETECTED",
      -          "ANALYSIS_FAILED"
      -        ],
      -        "type": "string"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "authorization_effect": {
      -        "const": "NONE",
      -        "description": "Analyze never authorizes; always NONE."
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "decision_basis": {},
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "may_execute": {
      -        "const": false,
      -        "description": "Analyze never grants execute permission."
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "analyze"
      -      },
      -      "receipt_kind": {
      -        "const": "NONE",
      -        "description": "Analyze never mints a receipt."
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "analysis_outcome",
      -      "authorization_effect",
      -      "may_execute",
      -      "receipt_kind",
      -      "decision_spec_version"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": true,
      -    "allOf": [
      -      {
      -        "if": {
      -          "properties": {
      -            "receipt_kind": {
      -              "const": "operation_authorization"
      -            }
      -          },
      -          "required": [
      -            "receipt_kind"
      -          ]
      -        },
      -        "then": {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        }
      -      },
      -      {
      -        "if": {
      -          "properties": {
      -            "execution_action": {
      -              "enum": [
      -                "CONTINUE",
      -                "CONTINUE_WITH_MONITORING"
      -              ]
      -            }
      -          },
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        "then": {
      -          "properties": {
      -            "receipt_kind": {
      -              "const": "operation_authorization"
      -            }
      -          },
      -          "required": [
      -            "receipt_kind",
      -            "chain_receipt",
      -            "decision_result"
      -          ]
      -        }
      -      }
      -    ],
      -    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      -        "type": "object"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "description": "Calibration model version when set; null until a calibrated model ships.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "chain_receipt": {
      -        "type": "string"
      -      },
      -      "chain_status": {
      -        "type": "string"
      -      },
      -      "coderifts_version": {
      -        "type": "string"
      -      },
      -      "control_envelope": {
      -        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      -        "type": "object"
      -      },
      -      "decision": {
      -        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      -        "enum": [
      -          "ALLOW",
      -          "WARN",
      -          "REQUIRE_APPROVAL",
      -          "BLOCK"
      -        ],
      -        "type": "string"
      -      },
      -      "decision_basis": {},
      -      "decision_result": {
      -        "additionalProperties": true,
      -        "description": "decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).",
      -        "properties": {
      -          "base": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "decision": {
      -            "enum": [
      -              "ALLOW",
      -              "WARN",
      -              "REQUIRE_APPROVAL",
      -              "BLOCK"
      -            ],
      -            "type": "string"
      -          },
      -          "decision_body_hash": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "decision_id": {
      -            "type": "string"
      -          },
      -          "environment": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "execution_action": {
      -            "enum": [
      -              "CONTINUE",
      -              "CONTINUE_WITH_MONITORING",
      -              "REQUEST_APPROVAL",
      -              "STOP"
      -            ],
      -            "type": "string"
      -          },
      -          "expires_at": {
      -            "type": "string"
      -          },
      -          "fingerprint": {
      -            "type": "string"
      -          },
      -          "head": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "input_fingerprint": {
      -            "type": "string"
      -          },
      -          "operation": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "receipt": {
      -            "type": "object"
      -          },
      -          "repository": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "safe_for_agent": {
      -            "type": "boolean"
      -          },
      -          "spec_version": {
      -            "pattern": "^decision-result\\.v1(\\.[0-9]+)?$",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "execution_action": {
      -        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      -        "enum": [
      -          "CONTINUE",
      -          "CONTINUE_WITH_MONITORING",
      -          "REQUEST_APPROVAL",
      -          "STOP"
      -        ],
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "authorize"
      -      },
      -      "receipt_kind": {
      -        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      -        "enum": [
      -          "operation_authorization",
      -          "NONE"
      -        ],
      -        "type": "string"
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "safe_for_agent": {
      -        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      -        "type": "boolean"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "decision",
      -      "execution_action",
      -      "safe_for_agent",
      -      "receipt_kind",
      -      "decision_spec_version"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      +    "not": {
      +      "anyOf": [
      +        {
      +          "required": [
      +            "decision"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "safe_for_agent"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "decision_result"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "control_envelope"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "required_action_core"
      +          ]
      +        }
      +      ]
      +    },
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      +        "type": "object"
      +      },
      +      "analysis_control": {
      +        "type": "object"
      +      },
      +      "analysis_outcome": {
      +        "description": "Closed analysis outcome set derived from engine-visible state only.",
      +        "enum": [
      +          "NO_BREAK_DETECTED",
      +          "BREAKS_DETECTED",
      +          "ANALYSIS_FAILED"
      +        ],
      +        "type": "string"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "authorization_effect": {
      +        "const": "NONE",
      +        "description": "Analyze never authorizes; always NONE."
      +      },
      +      "blast_radius": {
      +        "additionalProperties": false,
      +        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      +        "properties": {
      +          "consumers_declared": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "consumers_observed": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "endpoints": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "fields": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "graph_source": {
      +            "enum": [
      +              "none",
      +              "declared",
      +              "observed",
      +              "declared+observed"
      +            ],
      +            "type": "string"
      +          },
      +          "params": {
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "endpoints",
      +          "fields",
      +          "params",
      +          "consumers_declared",
      +          "consumers_observed",
      +          "graph_source"
      +        ],
      +        "type": "object"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "decision_basis": {},
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "may_execute": {
      +        "const": false,
      +        "description": "Analyze never grants execute permission."
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "analyze"
      +      },
      +      "receipt_kind": {
      +        "const": "NONE",
      +        "description": "Analyze never mints a receipt."
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "analysis_outcome",
      +      "authorization_effect",
      +      "may_execute",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": true,
      +    "allOf": [
      +      {
      +        "if": {
      +          "properties": {
      +            "receipt_kind": {
      +              "const": "operation_authorization"
      +            }
      +          },
      +          "required": [
      +            "receipt_kind"
      +          ]
      +        },
      +        "then": {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        }
      +      },
      +      {
      +        "if": {
      +          "properties": {
      +            "execution_action": {
      +              "enum": [
      +                "CONTINUE",
      +                "CONTINUE_WITH_MONITORING"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        "then": {
      +          "properties": {
      +            "receipt_kind": {
      +              "const": "operation_authorization"
      +            }
      +          },
      +          "required": [
      +            "receipt_kind",
      +            "chain_receipt",
      +            "decision_result"
      +          ]
      +        }
      +      }
      +    ],
      +    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      +        "type": "object"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "blast_radius": {
      +        "additionalProperties": false,
      +        "description": "ID27 additive COUNTS (not a score). Pure function of the change-set + request graphs. Not in the verdict_fingerprint preimage.",
      +        "properties": {
      +          "consumers_declared": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "consumers_observed": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "endpoints": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "fields": {
      +            "minimum": 0,
      +            "type": "integer"
      +          },
      +          "graph_source": {
      +            "enum": [
      +              "none",
      +              "declared",
      +              "observed",
      +              "declared+observed"
      +            ],
      +            "type": "string"
      +          },
      +          "params": {
      +            "minimum": 0,
      +            "type": "integer"
      +          }
      +        },
      +        "required": [
      +          "endpoints",
      +          "fields",
      +          "params",
      +          "consumers_declared",
      +          "consumers_observed",
      +          "graph_source"
      +        ],
      +        "type": "object"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "description": "Calibration model version when set; null until a calibrated model ships.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "chain_receipt": {
      +        "type": "string"
      +      },
      +      "chain_status": {
      +        "type": "string"
      +      },
      +      "coderifts_version": {
      +        "type": "string"
      +      },
      +      "control_envelope": {
      +        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      +        "type": "object"
      +      },
      +      "decision": {
      +        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      +        "enum": [
      +          "ALLOW",
      +          "WARN",
      +          "REQUIRE_APPROVAL",
      +          "BLOCK"
      +        ],
      +        "type": "string"
      +      },
      +      "decision_basis": {},
      +      "decision_result": {
      +        "additionalProperties": true,
      +        "description": "decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).",
      +        "properties": {
      +          "base": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "blast_radius": {
      +            "description": "ID27 additive COUNTS (not a score). Not permission.",
      +            "properties": {
      +              "consumers_declared": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "consumers_observed": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "endpoints": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "fields": {
      +                "minimum": 0,
      +                "type": "integer"
      +              },
      +              "graph_source": {
      +                "type": "string"
      +              },
      +              "params": {
      +                "minimum": 0,
      +                "type": "integer"
      +              }
      +            },
      +            "type": "object"
      +          },
      +          "decision": {
      +            "enum": [
      +              "ALLOW",
      +              "WARN",
      +              "REQUIRE_APPROVAL",
      +              "BLOCK"
      +            ],
      +            "type": "string"
      +          },
      +          "decision_body_hash": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "decision_id": {
      +            "type": "string"
      +          },
      +          "environment": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "execution_action": {
      +            "enum": [
      +              "CONTINUE",
      +              "CONTINUE_WITH_MONITORING",
      +              "REQUEST_APPROVAL",
      +              "STOP"
      +            ],
      +            "type": "string"
      +          },
      +          "expires_at": {
      +            "type": "string"
      +          },
      +          "fingerprint": {
      +            "type": "string"
      +          },
      +          "head": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "input_fingerprint": {
      +            "type": "string"
      +          },
      +          "operation": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "receipt": {
      +            "type": "object"
      +          },
      +          "repository": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "safe_for_agent": {
      +            "type": "boolean"
      +          },
      +          "spec_version": {
      +            "pattern": "^decision-result\\.v1(\\.[0-9]+)?$",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "execution_action": {
      +        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      +        "enum": [
      +          "CONTINUE",
      +          "CONTINUE_WITH_MONITORING",
      +          "REQUEST_APPROVAL",
      +          "STOP"
      +        ],
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "authorize"
      +      },
      +      "receipt_kind": {
      +        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      +        "enum": [
      +          "operation_authorization",
      +          "NONE"
      +        ],
      +        "type": "string"
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "safe_for_agent": {
      +        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      +        "type": "boolean"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "decision",
      +      "execution_action",
      +      "safe_for_agent",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  }
      +]
  18. Changed1 schema field changed
    • changedOutput schema / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      -    "not": {
      -      "anyOf": [
      -        {
      -          "required": [
      -            "decision"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "safe_for_agent"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "decision_result"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "control_envelope"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "required_action_core"
      -          ]
      -        }
      -      ]
      -    },
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      -        "type": "object"
      -      },
      -      "analysis_control": {
      -        "type": "object"
      -      },
      -      "analysis_outcome": {
      -        "description": "Closed analysis outcome set derived from engine-visible state only.",
      -        "enum": [
      -          "NO_BREAK_DETECTED",
      -          "BREAKS_DETECTED",
      -          "ANALYSIS_FAILED"
      -        ],
      -        "type": "string"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "authorization_effect": {
      -        "const": "NONE",
      -        "description": "Analyze never authorizes; always NONE."
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "decision_basis": {},
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "may_execute": {
      -        "const": false,
      -        "description": "Analyze never grants execute permission."
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "analyze"
      -      },
      -      "receipt_kind": {
      -        "const": "NONE",
      -        "description": "Analyze never mints a receipt."
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "analysis_outcome",
      -      "authorization_effect",
      -      "may_execute",
      -      "receipt_kind",
      -      "decision_spec_version"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": true,
      -    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      -        "type": "object"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "description": "Calibration model version when set; null until a calibrated model ships.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "chain_receipt": {
      -        "type": "string"
      -      },
      -      "chain_status": {
      -        "type": "string"
      -      },
      -      "coderifts_version": {
      -        "type": "string"
      -      },
      -      "control_envelope": {
      -        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      -        "type": "object"
      -      },
      -      "decision": {
      -        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      -        "enum": [
      -          "ALLOW",
      -          "WARN",
      -          "REQUIRE_APPROVAL",
      -          "BLOCK"
      -        ],
      -        "type": "string"
      -      },
      -      "decision_basis": {},
      -      "decision_result": {
      -        "additionalProperties": true,
      -        "description": "decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).",
      -        "properties": {
      -          "base": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "decision": {
      -            "enum": [
      -              "ALLOW",
      -              "WARN",
      -              "REQUIRE_APPROVAL",
      -              "BLOCK"
      -            ],
      -            "type": "string"
      -          },
      -          "decision_body_hash": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "decision_id": {
      -            "type": "string"
      -          },
      -          "environment": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "execution_action": {
      -            "enum": [
      -              "CONTINUE",
      -              "CONTINUE_WITH_MONITORING",
      -              "REQUEST_APPROVAL",
      -              "STOP"
      -            ],
      -            "type": "string"
      -          },
      -          "expires_at": {
      -            "type": "string"
      -          },
      -          "fingerprint": {
      -            "type": "string"
      -          },
      -          "head": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "input_fingerprint": {
      -            "type": "string"
      -          },
      -          "operation": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "receipt": {
      -            "type": "object"
      -          },
      -          "repository": {
      -            "type": [
      -              "string",
      -              "null"
      -            ]
      -          },
      -          "safe_for_agent": {
      -            "type": "boolean"
      -          },
      -          "spec_version": {
      -            "pattern": "^decision-result\\.v1(\\.[0-9]+)?$",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "execution_action": {
      -        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      -        "enum": [
      -          "CONTINUE",
      -          "CONTINUE_WITH_MONITORING",
      -          "REQUEST_APPROVAL",
      -          "STOP"
      -        ],
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "authorize"
      -      },
      -      "receipt_kind": {
      -        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      -        "enum": [
      -          "operation_authorization",
      -          "NONE"
      -        ],
      -        "type": "string"
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "safe_for_agent": {
      -        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      -        "type": "boolean"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "decision",
      -      "execution_action",
      -      "safe_for_agent",
      -      "receipt_kind",
      -      "decision_spec_version"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      +    "not": {
      +      "anyOf": [
      +        {
      +          "required": [
      +            "decision"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "safe_for_agent"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "decision_result"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "control_envelope"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "required_action_core"
      +          ]
      +        }
      +      ]
      +    },
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      +        "type": "object"
      +      },
      +      "analysis_control": {
      +        "type": "object"
      +      },
      +      "analysis_outcome": {
      +        "description": "Closed analysis outcome set derived from engine-visible state only.",
      +        "enum": [
      +          "NO_BREAK_DETECTED",
      +          "BREAKS_DETECTED",
      +          "ANALYSIS_FAILED"
      +        ],
      +        "type": "string"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "authorization_effect": {
      +        "const": "NONE",
      +        "description": "Analyze never authorizes; always NONE."
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "decision_basis": {},
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "may_execute": {
      +        "const": false,
      +        "description": "Analyze never grants execute permission."
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "analyze"
      +      },
      +      "receipt_kind": {
      +        "const": "NONE",
      +        "description": "Analyze never mints a receipt."
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "analysis_outcome",
      +      "authorization_effect",
      +      "may_execute",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": true,
      +    "allOf": [
      +      {
      +        "if": {
      +          "properties": {
      +            "receipt_kind": {
      +              "const": "operation_authorization"
      +            }
      +          },
      +          "required": [
      +            "receipt_kind"
      +          ]
      +        },
      +        "then": {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        }
      +      },
      +      {
      +        "if": {
      +          "properties": {
      +            "execution_action": {
      +              "enum": [
      +                "CONTINUE",
      +                "CONTINUE_WITH_MONITORING"
      +              ]
      +            }
      +          },
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        "then": {
      +          "properties": {
      +            "receipt_kind": {
      +              "const": "operation_authorization"
      +            }
      +          },
      +          "required": [
      +            "receipt_kind",
      +            "chain_receipt",
      +            "decision_result"
      +          ]
      +        }
      +      }
      +    ],
      +    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      +        "type": "object"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "description": "Calibration model version when set; null until a calibrated model ships.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "chain_receipt": {
      +        "type": "string"
      +      },
      +      "chain_status": {
      +        "type": "string"
      +      },
      +      "coderifts_version": {
      +        "type": "string"
      +      },
      +      "control_envelope": {
      +        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      +        "type": "object"
      +      },
      +      "decision": {
      +        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      +        "enum": [
      +          "ALLOW",
      +          "WARN",
      +          "REQUIRE_APPROVAL",
      +          "BLOCK"
      +        ],
      +        "type": "string"
      +      },
      +      "decision_basis": {},
      +      "decision_result": {
      +        "additionalProperties": true,
      +        "description": "decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).",
      +        "properties": {
      +          "base": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "decision": {
      +            "enum": [
      +              "ALLOW",
      +              "WARN",
      +              "REQUIRE_APPROVAL",
      +              "BLOCK"
      +            ],
      +            "type": "string"
      +          },
      +          "decision_body_hash": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "decision_id": {
      +            "type": "string"
      +          },
      +          "environment": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "execution_action": {
      +            "enum": [
      +              "CONTINUE",
      +              "CONTINUE_WITH_MONITORING",
      +              "REQUEST_APPROVAL",
      +              "STOP"
      +            ],
      +            "type": "string"
      +          },
      +          "expires_at": {
      +            "type": "string"
      +          },
      +          "fingerprint": {
      +            "type": "string"
      +          },
      +          "head": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "input_fingerprint": {
      +            "type": "string"
      +          },
      +          "operation": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "receipt": {
      +            "type": "object"
      +          },
      +          "repository": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "safe_for_agent": {
      +            "type": "boolean"
      +          },
      +          "spec_version": {
      +            "pattern": "^decision-result\\.v1(\\.[0-9]+)?$",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "execution_action": {
      +        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      +        "enum": [
      +          "CONTINUE",
      +          "CONTINUE_WITH_MONITORING",
      +          "REQUEST_APPROVAL",
      +          "STOP"
      +        ],
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "authorize"
      +      },
      +      "receipt_kind": {
      +        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      +        "enum": [
      +          "operation_authorization",
      +          "NONE"
      +        ],
      +        "type": "string"
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "safe_for_agent": {
      +        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      +        "type": "boolean"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "decision",
      +      "execution_action",
      +      "safe_for_agent",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  }
      +]
  19. Changed3 schema fields changed
    • addedInput schema / if
      Added value: +{
      +  "properties": {
      +    "preflight_mode": {
      +      "const": "authorize"
      +    }
      +  },
      +  "required": [
      +    "preflight_mode"
      +  ]
      +}
    • addedInput schema / then
      Added value: +{
      +  "properties": {
      +    "context": {
      +      "properties": {
      +        "operation": {
      +          "minLength": 1,
      +          "type": "string"
      +        }
      +      },
      +      "required": [
      +        "operation"
      +      ],
      +      "type": "object"
      +    }
      +  },
      +  "required": [
      +    "context"
      +  ]
      +}
    • changedOutput schema / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      -    "not": {
      -      "anyOf": [
      -        {
      -          "required": [
      -            "decision"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "safe_for_agent"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "decision_result"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "control_envelope"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "required_action_core"
      -          ]
      -        }
      -      ]
      -    },
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      -        "type": "object"
      -      },
      -      "analysis_control": {
      -        "type": "object"
      -      },
      -      "analysis_outcome": {
      -        "description": "Closed analysis outcome set derived from engine-visible state only.",
      -        "enum": [
      -          "NO_BREAK_DETECTED",
      -          "BREAKS_DETECTED",
      -          "ANALYSIS_FAILED"
      -        ],
      -        "type": "string"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "authorization_effect": {
      -        "const": "NONE",
      -        "description": "Analyze never authorizes; always NONE."
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "decision_basis": {},
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "may_execute": {
      -        "const": false,
      -        "description": "Analyze never grants execute permission."
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "analyze"
      -      },
      -      "receipt_kind": {
      -        "const": "NONE",
      -        "description": "Analyze never mints a receipt."
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "analysis_outcome",
      -      "authorization_effect",
      -      "may_execute",
      -      "receipt_kind"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": true,
      -    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      -        "type": "object"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "calibration_version": {
      -        "description": "Calibration model version when set; null until a calibrated model ships.",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "chain_receipt": {
      -        "type": "string"
      -      },
      -      "chain_status": {
      -        "type": "string"
      -      },
      -      "coderifts_version": {
      -        "type": "string"
      -      },
      -      "control_envelope": {
      -        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      -        "type": "object"
      -      },
      -      "decision": {
      -        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      -        "enum": [
      -          "ALLOW",
      -          "WARN",
      -          "REQUIRE_APPROVAL",
      -          "BLOCK"
      -        ],
      -        "type": "string"
      -      },
      -      "decision_basis": {},
      -      "decision_result": {
      -        "description": "Proof/receipt side: decision-result.v1 envelope when the issuance path produced one (validate with decision-result.v1.producer.json). Carries fingerprints, audience, receipt / decision_body_hash. Not a second branch enum — branch on control_envelope.execution_action.",
      -        "type": "object"
      -      },
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "execution_action": {
      -        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      -        "enum": [
      -          "CONTINUE",
      -          "CONTINUE_WITH_MONITORING",
      -          "REQUEST_APPROVAL",
      -          "STOP"
      -        ],
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "policy_pin_status": {
      -        "additionalProperties": true,
      -        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      -        "type": [
      -          "object",
      -          "null"
      -        ]
      -      },
      -      "preflight_mode": {
      -        "const": "authorize"
      -      },
      -      "receipt_kind": {
      -        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      -        "enum": [
      -          "operation_authorization",
      -          "NONE"
      -        ],
      -        "type": "string"
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "safe_for_agent": {
      -        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      -        "type": "boolean"
      -      },
      -      "scorer_version": {
      -        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      -        "type": [
      -          "string",
      -          "null"
      -        ]
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "decision",
      -      "execution_action",
      -      "safe_for_agent",
      -      "receipt_kind"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      +    "not": {
      +      "anyOf": [
      +        {
      +          "required": [
      +            "decision"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "safe_for_agent"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "decision_result"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "control_envelope"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "required_action_core"
      +          ]
      +        }
      +      ]
      +    },
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      +        "type": "object"
      +      },
      +      "analysis_control": {
      +        "type": "object"
      +      },
      +      "analysis_outcome": {
      +        "description": "Closed analysis outcome set derived from engine-visible state only.",
      +        "enum": [
      +          "NO_BREAK_DETECTED",
      +          "BREAKS_DETECTED",
      +          "ANALYSIS_FAILED"
      +        ],
      +        "type": "string"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "authorization_effect": {
      +        "const": "NONE",
      +        "description": "Analyze never authorizes; always NONE."
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "decision_basis": {},
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "may_execute": {
      +        "const": false,
      +        "description": "Analyze never grants execute permission."
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "analyze"
      +      },
      +      "receipt_kind": {
      +        "const": "NONE",
      +        "description": "Analyze never mints a receipt."
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "analysis_outcome",
      +      "authorization_effect",
      +      "may_execute",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": true,
      +    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      +        "type": "object"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "description": "Calibration model version when set; null until a calibrated model ships.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "chain_receipt": {
      +        "type": "string"
      +      },
      +      "chain_status": {
      +        "type": "string"
      +      },
      +      "coderifts_version": {
      +        "type": "string"
      +      },
      +      "control_envelope": {
      +        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      +        "type": "object"
      +      },
      +      "decision": {
      +        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      +        "enum": [
      +          "ALLOW",
      +          "WARN",
      +          "REQUIRE_APPROVAL",
      +          "BLOCK"
      +        ],
      +        "type": "string"
      +      },
      +      "decision_basis": {},
      +      "decision_result": {
      +        "additionalProperties": true,
      +        "description": "decision-result.v1 envelope (control enums closed). Additive fields may appear and are not permission. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json (producer: https://coderifts.com/schemas/decision-result.v1.producer.json).",
      +        "properties": {
      +          "base": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "decision": {
      +            "enum": [
      +              "ALLOW",
      +              "WARN",
      +              "REQUIRE_APPROVAL",
      +              "BLOCK"
      +            ],
      +            "type": "string"
      +          },
      +          "decision_body_hash": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "decision_id": {
      +            "type": "string"
      +          },
      +          "environment": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "execution_action": {
      +            "enum": [
      +              "CONTINUE",
      +              "CONTINUE_WITH_MONITORING",
      +              "REQUEST_APPROVAL",
      +              "STOP"
      +            ],
      +            "type": "string"
      +          },
      +          "expires_at": {
      +            "type": "string"
      +          },
      +          "fingerprint": {
      +            "type": "string"
      +          },
      +          "head": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "input_fingerprint": {
      +            "type": "string"
      +          },
      +          "operation": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "receipt": {
      +            "type": "object"
      +          },
      +          "repository": {
      +            "type": [
      +              "string",
      +              "null"
      +            ]
      +          },
      +          "safe_for_agent": {
      +            "type": "boolean"
      +          },
      +          "spec_version": {
      +            "pattern": "^decision-result\\.v1(\\.[0-9]+)?$",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "execution_action": {
      +        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      +        "enum": [
      +          "CONTINUE",
      +          "CONTINUE_WITH_MONITORING",
      +          "REQUEST_APPROVAL",
      +          "STOP"
      +        ],
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "authorize"
      +      },
      +      "receipt_kind": {
      +        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      +        "enum": [
      +          "operation_authorization",
      +          "NONE"
      +        ],
      +        "type": "string"
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "safe_for_agent": {
      +        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      +        "type": "boolean"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "decision",
      +      "execution_action",
      +      "safe_for_agent",
      +      "receipt_kind",
      +      "decision_spec_version"
      +    ],
      +    "type": "object"
      +  }
      +]
  20. Changed2 schema fields changed
    • addedInput schema / properties / context / properties / base
      Added value: +{
      +  "description": "Base commit/ref SHA the change set was computed against (optional; PR/commit identity)",
      +  "type": "string"
      +}
    • addedInput schema / properties / context / properties / head
      Added value: +{
      +  "description": "Head commit/ref SHA of the proposed change (optional; PR/commit identity)",
      +  "type": "string"
      +}
  21. Changed1 schema field changed
    • changedOutput schema / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      -    "not": {
      -      "anyOf": [
      -        {
      -          "required": [
      -            "decision"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "safe_for_agent"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "decision_result"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "control_envelope"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "required_action_core"
      -          ]
      -        }
      -      ]
      -    },
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      -        "type": "object"
      -      },
      -      "analysis_control": {
      -        "type": "object"
      -      },
      -      "analysis_outcome": {
      -        "description": "Closed analysis outcome set derived from engine-visible state only.",
      -        "enum": [
      -          "NO_BREAK_DETECTED",
      -          "BREAKS_DETECTED",
      -          "ANALYSIS_FAILED"
      -        ],
      -        "type": "string"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "authorization_effect": {
      -        "const": "NONE",
      -        "description": "Analyze never authorizes; always NONE."
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "decision_basis": {},
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "may_execute": {
      -        "const": false,
      -        "description": "Analyze never grants execute permission."
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "preflight_mode": {
      -        "const": "analyze"
      -      },
      -      "receipt_kind": {
      -        "const": "NONE",
      -        "description": "Analyze never mints a receipt."
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "analysis_outcome",
      -      "authorization_effect",
      -      "may_execute",
      -      "receipt_kind"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": true,
      -    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      -        "type": "object"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "chain_receipt": {
      -        "type": "string"
      -      },
      -      "chain_status": {
      -        "type": "string"
      -      },
      -      "coderifts_version": {
      -        "type": "string"
      -      },
      -      "control_envelope": {
      -        "type": "object"
      -      },
      -      "decision": {
      -        "enum": [
      -          "ALLOW",
      -          "WARN",
      -          "REQUIRE_APPROVAL",
      -          "BLOCK"
      -        ],
      -        "type": "string"
      -      },
      -      "decision_basis": {},
      -      "decision_result": {
      -        "description": "decision-result.v1 envelope when issuance path produced one (validate with decision-result.v1.producer.json).",
      -        "type": "object"
      -      },
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "execution_action": {
      -        "enum": [
      -          "CONTINUE",
      -          "CONTINUE_WITH_MONITORING",
      -          "REQUEST_APPROVAL",
      -          "STOP"
      -        ],
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "preflight_mode": {
      -        "const": "authorize"
      -      },
      -      "receipt_kind": {
      -        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      -        "enum": [
      -          "operation_authorization",
      -          "NONE"
      -        ],
      -        "type": "string"
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "safe_for_agent": {
      -        "type": "boolean"
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "decision",
      -      "execution_action",
      -      "safe_for_agent",
      -      "receipt_kind"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      +    "not": {
      +      "anyOf": [
      +        {
      +          "required": [
      +            "decision"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "safe_for_agent"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "decision_result"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "control_envelope"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "required_action_core"
      +          ]
      +        }
      +      ]
      +    },
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      +        "type": "object"
      +      },
      +      "analysis_control": {
      +        "type": "object"
      +      },
      +      "analysis_outcome": {
      +        "description": "Closed analysis outcome set derived from engine-visible state only.",
      +        "enum": [
      +          "NO_BREAK_DETECTED",
      +          "BREAKS_DETECTED",
      +          "ANALYSIS_FAILED"
      +        ],
      +        "type": "string"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "authorization_effect": {
      +        "const": "NONE",
      +        "description": "Analyze never authorizes; always NONE."
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "decision_basis": {},
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "may_execute": {
      +        "const": false,
      +        "description": "Analyze never grants execute permission."
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "analyze"
      +      },
      +      "receipt_kind": {
      +        "const": "NONE",
      +        "description": "Analyze never mints a receipt."
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (observation; not permission).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "analysis_outcome",
      +      "authorization_effect",
      +      "may_execute",
      +      "receipt_kind"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": true,
      +    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      +        "type": "object"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "calibration_version": {
      +        "description": "Calibration model version when set; null until a calibrated model ships.",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "chain_receipt": {
      +        "type": "string"
      +      },
      +      "chain_status": {
      +        "type": "string"
      +      },
      +      "coderifts_version": {
      +        "type": "string"
      +      },
      +      "control_envelope": {
      +        "description": "Branch source (control/1.0). Machine-control surface from attachControlSurface / buildControlEnvelope. Agents and @coderifts/agent-guard branch on control_envelope.execution_action. Top-level decision/safe_for_agent/execution_action mirror these values for compatibility. Includes next_agent_step (structured remediation SUGGESTION derived from execution_action + required_action; null on CONTINUE*; not permission — still branch on execution_action).",
      +        "type": "object"
      +      },
      +      "decision": {
      +        "description": "Compatibility mirror of control_envelope.decision (same value). Prefer control_envelope for branching; use decision as explanation only.",
      +        "enum": [
      +          "ALLOW",
      +          "WARN",
      +          "REQUIRE_APPROVAL",
      +          "BLOCK"
      +        ],
      +        "type": "string"
      +      },
      +      "decision_basis": {},
      +      "decision_result": {
      +        "description": "Proof/receipt side: decision-result.v1 envelope when the issuance path produced one (validate with decision-result.v1.producer.json). Carries fingerprints, audience, receipt / decision_body_hash. Not a second branch enum — branch on control_envelope.execution_action.",
      +        "type": "object"
      +      },
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "execution_action": {
      +        "description": "Compatibility mirror of control_envelope.execution_action (same value). Canonical branch key; unrecognised values are not permission (fail closed).",
      +        "enum": [
      +          "CONTINUE",
      +          "CONTINUE_WITH_MONITORING",
      +          "REQUEST_APPROVAL",
      +          "STOP"
      +        ],
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "policy_pin_status": {
      +        "additionalProperties": true,
      +        "description": "policy_pin observation (898). match null=no pin; false=drift warning (non-blocking).",
      +        "type": [
      +          "object",
      +          "null"
      +        ]
      +      },
      +      "preflight_mode": {
      +        "const": "authorize"
      +      },
      +      "receipt_kind": {
      +        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      +        "enum": [
      +          "operation_authorization",
      +          "NONE"
      +        ],
      +        "type": "string"
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "safe_for_agent": {
      +        "description": "Compatibility mirror of control_envelope.safe_for_agent (same value). Not a branch key — do not branch on safe_for_agent (use execution_action).",
      +        "type": "boolean"
      +      },
      +      "scorer_version": {
      +        "description": "Fingerprint-bound scorerVersion() (same as decision_result.scorer_version / FP preimage).",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "decision",
      +      "execution_action",
      +      "safe_for_agent",
      +      "receipt_kind"
      +    ],
      +    "type": "object"
      +  }
      +]
  22. Changed1 schema field changed
    • changedOutput schema / oneOf
      Previous value: -[
      -  {
      -    "additionalProperties": true,
      -    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      -    "not": {
      -      "anyOf": [
      -        {
      -          "required": [
      -            "decision"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "execution_action"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "safe_for_agent"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "chain_receipt"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "decision_result"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "control_envelope"
      -          ]
      -        },
      -        {
      -          "required": [
      -            "required_action_core"
      -          ]
      -        }
      -      ]
      -    },
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      -        "type": "object"
      -      },
      -      "analysis_control": {
      -        "type": "object"
      -      },
      -      "analysis_outcome": {
      -        "description": "Closed analysis outcome set derived from engine-visible state only.",
      -        "enum": [
      -          "NO_BREAK_DETECTED",
      -          "BREAKS_DETECTED",
      -          "ANALYSIS_FAILED"
      -        ],
      -        "type": "string"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "authorization_effect": {
      -        "const": "NONE",
      -        "description": "Analyze never authorizes; always NONE."
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "decision_basis": {},
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "may_execute": {
      -        "const": false,
      -        "description": "Analyze never grants execute permission."
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "preflight_mode": {
      -        "const": "analyze"
      -      },
      -      "receipt_kind": {
      -        "const": "NONE",
      -        "description": "Analyze never mints a receipt."
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "analysis_outcome",
      -      "authorization_effect",
      -      "may_execute",
      -      "receipt_kind"
      -    ],
      -    "type": "object"
      -  },
      -  {
      -    "additionalProperties": true,
      -    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      -    "properties": {
      -      "analysis": {
      -        "additionalProperties": true,
      -        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      -        "type": "object"
      -      },
      -      "artifacts": {
      -        "type": "array"
      -      },
      -      "breaking_changes": {
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "breaking_changes_details": {
      -        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      -        "items": {
      -          "additionalProperties": true,
      -          "properties": {
      -            "description": {
      -              "type": "string"
      -            },
      -            "field": {
      -              "type": "string"
      -            },
      -            "method": {
      -              "type": "string"
      -            },
      -            "path": {
      -              "type": "string"
      -            },
      -            "severity": {
      -              "type": "string"
      -            },
      -            "type": {
      -              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      -              "type": "string"
      -            }
      -          },
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "bundle_fingerprint": {
      -        "type": "string"
      -      },
      -      "chain_receipt": {
      -        "type": "string"
      -      },
      -      "chain_status": {
      -        "type": "string"
      -      },
      -      "coderifts_version": {
      -        "type": "string"
      -      },
      -      "control_envelope": {
      -        "type": "object"
      -      },
      -      "decision": {
      -        "enum": [
      -          "ALLOW",
      -          "WARN",
      -          "REQUIRE_APPROVAL",
      -          "BLOCK"
      -        ],
      -        "type": "string"
      -      },
      -      "decision_basis": {},
      -      "decision_result": {
      -        "description": "decision-result.v1 envelope when issuance path produced one (validate with decision-result.v1.producer.json).",
      -        "type": "object"
      -      },
      -      "decision_spec_version": {
      -        "description": "Decision Spec major for this response (typically '2.0').",
      -        "type": "string"
      -      },
      -      "detected_patterns": {
      -        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      -        "items": {
      -          "additionalProperties": false,
      -          "properties": {
      -            "affected_field": {
      -              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "affected_path": {
      -              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      -              "type": "string"
      -            },
      -            "consequence": {
      -              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "description": {
      -              "description": "What the detector matched. Untrusted free text.",
      -              "type": "string"
      -            },
      -            "name": {
      -              "description": "Governance pattern name; appears in patterns when both are carried.",
      -              "type": "string"
      -            },
      -            "severity": {
      -              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      -              "type": "string"
      -            },
      -            "side": {
      -              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      -              "enum": [
      -                "request",
      -                "response"
      -              ],
      -              "type": "string"
      -            }
      -          },
      -          "required": [
      -            "name",
      -            "severity",
      -            "description",
      -            "consequence",
      -            "affected_path",
      -            "affected_field"
      -          ],
      -          "type": "object"
      -        },
      -        "type": "array"
      -      },
      -      "evidence": {
      -        "type": "array"
      -      },
      -      "evidence_quality": {
      -        "type": "string"
      -      },
      -      "execution_action": {
      -        "enum": [
      -          "CONTINUE",
      -          "CONTINUE_WITH_MONITORING",
      -          "REQUEST_APPROVAL",
      -          "STOP"
      -        ],
      -        "type": "string"
      -      },
      -      "human_report": {
      -        "additionalProperties": false,
      -        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      -        "properties": {
      -          "breaking_highlights": {
      -            "type": "array"
      -          },
      -          "next_steps_prose": {
      -            "type": "string"
      -          },
      -          "suggestions": {
      -            "type": "array"
      -          },
      -          "summary": {
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "operation": {},
      -      "pattern_sources": {
      -        "type": "array"
      -      },
      -      "patterns": {
      -        "items": {
      -          "type": "string"
      -        },
      -        "type": "array"
      -      },
      -      "preflight_mode": {
      -        "const": "authorize"
      -      },
      -      "receipt_kind": {
      -        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      -        "enum": [
      -          "operation_authorization",
      -          "NONE"
      -        ],
      -        "type": "string"
      -      },
      -      "requires_migration": {
      -        "type": "boolean"
      -      },
      -      "risk_score": {
      -        "maximum": 100,
      -        "minimum": 0,
      -        "type": "integer"
      -      },
      -      "safe_for_agent": {
      -        "type": "boolean"
      -      },
      -      "severity_summary": {
      -        "additionalProperties": false,
      -        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      -        "properties": {
      -          "diff_severity": {
      -            "description": "Structural size of the schema change.",
      -            "type": "string"
      -          },
      -          "governance_severity": {
      -            "description": "How the rule engine rates the change.",
      -            "type": "string"
      -          },
      -          "note": {
      -            "type": "string"
      -          },
      -          "policy_effect": {
      -            "description": "Resulting decision effect label.",
      -            "type": "string"
      -          }
      -        },
      -        "type": "object"
      -      },
      -      "timestamp": {
      -        "type": "string"
      -      },
      -      "verdict_fingerprint": {
      -        "type": "string"
      -      }
      -    },
      -    "required": [
      -      "preflight_mode",
      -      "decision",
      -      "execution_action",
      -      "safe_for_agent"
      -    ],
      -    "type": "object"
      -  }
      -]New value: +[
      +  {
      +    "additionalProperties": true,
      +    "description": "ANALYZE mode (Decision Spec 2.0): informational only. MUST NOT contain decision, execution_action, safe_for_agent, chain_receipt, decision_result, control_envelope, or required_action_core. Branch on analysis_outcome; never treat as permission. Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist).",
      +    "not": {
      +      "anyOf": [
      +        {
      +          "required": [
      +            "decision"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "execution_action"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "safe_for_agent"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "chain_receipt"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "decision_result"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "control_envelope"
      +          ]
      +        },
      +        {
      +          "required": [
      +            "required_action_core"
      +          ]
      +        }
      +      ]
      +    },
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      +        "type": "object"
      +      },
      +      "analysis_control": {
      +        "type": "object"
      +      },
      +      "analysis_outcome": {
      +        "description": "Closed analysis outcome set derived from engine-visible state only.",
      +        "enum": [
      +          "NO_BREAK_DETECTED",
      +          "BREAKS_DETECTED",
      +          "ANALYSIS_FAILED"
      +        ],
      +        "type": "string"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "authorization_effect": {
      +        "const": "NONE",
      +        "description": "Analyze never authorizes; always NONE."
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "decision_basis": {},
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "may_execute": {
      +        "const": false,
      +        "description": "Analyze never grants execute permission."
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "preflight_mode": {
      +        "const": "analyze"
      +      },
      +      "receipt_kind": {
      +        "const": "NONE",
      +        "description": "Analyze never mints a receipt."
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "analysis_outcome",
      +      "authorization_effect",
      +      "may_execute",
      +      "receipt_kind"
      +    ],
      +    "type": "object"
      +  },
      +  {
      +    "additionalProperties": true,
      +    "description": "AUTHORIZE mode: operation-bound decision. Branch on execution_action (not decision, not safe_for_agent). Field set GENERATED from preflight-response.v2.producer.json (agent-facing allowlist). Compatibility: https://coderifts.com/schemas/decision-result.v1.consumer.json",
      +    "properties": {
      +      "analysis": {
      +        "additionalProperties": true,
      +        "description": "Tier-2 analysis mirror (src/response-envelope.js buildAnalysisTier / attachControlSurface). Dual-write of flat analysis fields present on the verdict plus remediations[]. ANALYSIS_TIER_FIELDS subset when present; not a closed property set.",
      +        "type": "object"
      +      },
      +      "artifacts": {
      +        "type": "array"
      +      },
      +      "breaking_changes": {
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "breaking_changes_details": {
      +        "description": "Per-change IR/detail rows from the engine (src/blast/diff-to-change.js maps these). Measured row keys: type, path, method, field, severity, description. Distinct from breaking_changes (integer count).",
      +        "items": {
      +          "additionalProperties": true,
      +          "properties": {
      +            "description": {
      +              "type": "string"
      +            },
      +            "field": {
      +              "type": "string"
      +            },
      +            "method": {
      +              "type": "string"
      +            },
      +            "path": {
      +              "type": "string"
      +            },
      +            "severity": {
      +              "type": "string"
      +            },
      +            "type": {
      +              "description": "Change kind / IR type code (e.g. response.body.property.remove).",
      +              "type": "string"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "bundle_fingerprint": {
      +        "type": "string"
      +      },
      +      "chain_receipt": {
      +        "type": "string"
      +      },
      +      "chain_status": {
      +        "type": "string"
      +      },
      +      "coderifts_version": {
      +        "type": "string"
      +      },
      +      "control_envelope": {
      +        "type": "object"
      +      },
      +      "decision": {
      +        "enum": [
      +          "ALLOW",
      +          "WARN",
      +          "REQUIRE_APPROVAL",
      +          "BLOCK"
      +        ],
      +        "type": "string"
      +      },
      +      "decision_basis": {},
      +      "decision_result": {
      +        "description": "decision-result.v1 envelope when issuance path produced one (validate with decision-result.v1.producer.json).",
      +        "type": "object"
      +      },
      +      "decision_spec_version": {
      +        "description": "Decision Spec major for this response (typically '2.0').",
      +        "type": "string"
      +      },
      +      "detected_patterns": {
      +        "description": "GOVERNANCE detector detail rows (src/change-patterns.js; validated by decision-spec-fields.js). Row shape measured live: name, severity, description, consequence, affected_path, affected_field; optional side (request|response) on ENUM_NARROWING. Names ⊆ patterns (not equality). Agent-detector names may appear only in patterns. Free-text fields are untrusted.",
      +        "items": {
      +          "additionalProperties": false,
      +          "properties": {
      +            "affected_field": {
      +              "description": "Field within affected_path. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "affected_path": {
      +              "description": "Contract path this row is about. Empty string when the detector had none — the key is always emitted.",
      +              "type": "string"
      +            },
      +            "consequence": {
      +              "description": "What breaks for a consumer if this ships. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "description": {
      +              "description": "What the detector matched. Untrusted free text.",
      +              "type": "string"
      +            },
      +            "name": {
      +              "description": "Governance pattern name; appears in patterns when both are carried.",
      +              "type": "string"
      +            },
      +            "severity": {
      +              "description": "Row severity from the pattern catalog (observed set: CRITICAL, HIGH, MEDIUM). NOT a closed control enum — branch on execution_action, never on this.",
      +              "type": "string"
      +            },
      +            "side": {
      +              "description": "Optional; currently set on ENUM_NARROWING only. Request-side narrowing is agent-breaking (threaded so safe_for_agent can distinguish it). Absent when the detector did not set it.",
      +              "enum": [
      +                "request",
      +                "response"
      +              ],
      +              "type": "string"
      +            }
      +          },
      +          "required": [
      +            "name",
      +            "severity",
      +            "description",
      +            "consequence",
      +            "affected_path",
      +            "affected_field"
      +          ],
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "evidence": {
      +        "type": "array"
      +      },
      +      "evidence_quality": {
      +        "type": "string"
      +      },
      +      "execution_action": {
      +        "enum": [
      +          "CONTINUE",
      +          "CONTINUE_WITH_MONITORING",
      +          "REQUEST_APPROVAL",
      +          "STOP"
      +        ],
      +        "type": "string"
      +      },
      +      "human_report": {
      +        "additionalProperties": false,
      +        "description": "Human-readable report tier (src/response-envelope.js buildHumanReport / analyze v2 stub). Measured keys: summary, breaking_highlights, suggestions, next_steps_prose.",
      +        "properties": {
      +          "breaking_highlights": {
      +            "type": "array"
      +          },
      +          "next_steps_prose": {
      +            "type": "string"
      +          },
      +          "suggestions": {
      +            "type": "array"
      +          },
      +          "summary": {
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "operation": {},
      +      "pattern_sources": {
      +        "type": "array"
      +      },
      +      "patterns": {
      +        "items": {
      +          "type": "string"
      +        },
      +        "type": "array"
      +      },
      +      "preflight_mode": {
      +        "const": "authorize"
      +      },
      +      "receipt_kind": {
      +        "description": "operation_authorization when a chain receipt was issued; NONE if signer unconfigured.",
      +        "enum": [
      +          "operation_authorization",
      +          "NONE"
      +        ],
      +        "type": "string"
      +      },
      +      "requires_migration": {
      +        "type": "boolean"
      +      },
      +      "risk_score": {
      +        "maximum": 100,
      +        "minimum": 0,
      +        "type": "integer"
      +      },
      +      "safe_for_agent": {
      +        "type": "boolean"
      +      },
      +      "severity_summary": {
      +        "additionalProperties": false,
      +        "description": "Bundle severity axes (src/change-set.js severity_summary). Distinct axes, not contradictory. Measured keys: diff_severity, governance_severity, policy_effect, note.",
      +        "properties": {
      +          "diff_severity": {
      +            "description": "Structural size of the schema change.",
      +            "type": "string"
      +          },
      +          "governance_severity": {
      +            "description": "How the rule engine rates the change.",
      +            "type": "string"
      +          },
      +          "note": {
      +            "type": "string"
      +          },
      +          "policy_effect": {
      +            "description": "Resulting decision effect label.",
      +            "type": "string"
      +          }
      +        },
      +        "type": "object"
      +      },
      +      "timestamp": {
      +        "type": "string"
      +      },
      +      "verdict_fingerprint": {
      +        "type": "string"
      +      }
      +    },
      +    "required": [
      +      "preflight_mode",
      +      "decision",
      +      "execution_action",
      +      "safe_for_agent",
      +      "receipt_kind"
      +    ],
      +    "type": "object"
      +  }
      +]
  23. Changed1 schema field changed
    • changedInput schema / properties / idempotency_key / description
      Previous value: -"Optional client key; a repeat with the same key + body replays the original decision (24h)"New value: +"Optional client key; in authorize mode, a repeat with the same key + body replays the original decision (24h). Analyze responses are not replayed."
  24. First observed

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Despite only readOnlyHint=false and openWorldHint=false annotations, the description richly discloses behaviors: analyze produces no receipt/execution_action, authorize may mint receipts, execution grants can return 503 SIGNER_UNAVAILABLE, idempotency replays only authorize within 24h, previous_receipt links without re-verifying, and agent_operation is not semantically analyzed. No contradictions with annotations.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is lengthy but front-loaded with usage conditions and organized around operational concerns. Some redundancy with the schema descriptions exists, but most sentences add actionable guidance or constraints. For a tool with 17 parameters and two modes, the length is largely justified.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the full decision context: when to call, what each mode returns at a high level, artifact source selection, grant fields, linking vs verification, idempotency, and explicit non-permission semantics. The output schema exists, so return-value details need not be repeated. Nothing critical is missing for an agent to call this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Even though schema coverage is 100%, the description adds critical cross-parameter semantics: artifacts must be full text not URLs, artifacts[] XOR derivation="server" else 400, grant fields only apply on authorize+include_execution_grant, previous_receipt vs verify_receipt, and grant_version default change date. These constraints are not inferable from individual schema descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's role: preflight analysis/authorization for contract artifact changes, with explicit 'Use this when' conditions and two modes ('analyze' risk-only, 'authorize' may mint a receipt). It differentiates from siblings by directing receipt verification to verify_receipt and past decision details to get_decision_details.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit when-to-use conditions (contract changes before merge/deploy/publish/register), exclusions ('Do not call for documentation-only changes, static readiness scoring, or receipt verification'), and alternatives named by sibling tools. It also includes safety guidance: 'Skipping this call is not permission' and 'Absence of a key is not permission.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources