Skip to main content
Glama

Server Details

API governance for AI agents. Detects breaking changes, scores blast radius, blocks unsafe calls.

If you are the author of this connector, you can claim ownership with GitHub, an HTTP challenge, or a DNS record. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP
URL
Repository
coderifts/self-hosted
GitHub Stars
0

Available Tools

3 tools
get_decision_detailsA
Read-only
Inspect

Retrieve a PAST CodeRifts decision by decision_id (or fingerprint): full report payload, breaking changes list, scores, and linked receipt metadata if stored.

Use this when:

  • You have a decision_id (or fingerprint) from a previous preflight, PR comment, or CI log and need to inspect or explain that past decision.

  • You are auditing why a prior ALLOW/WARN/BLOCK was issued.

  • You are NOT requesting a new analysis of current before/after specs.

Do not use when:

  • You need a decision for the CURRENT uncommitted or PR head change set — call coderifts.preflight_change_set with the current artifacts.

  • You hold a receipt token and only need cryptographic/lifecycle verification — use coderifts.verify_receipt.

  • You have no decision_id/fingerprint — run preflight first to create one.

Inputs: at least one of decision_id (preferred) or fingerprint is required (empty {} is rejected by the server as INVALID_INPUT). Returns the stored decision document or not_found.

Scoping — fingerprint lookup returns only YOUR OWN decisions. A fingerprint is derived from content, not from an account, so two callers who preflight byte-identical specs derive the same one; the lookup is therefore constrained to the decisions your credential can prove it owns.

A decision that exists but is not yours returns the SAME not_found as one that was never issued. This is deliberate: a distinguishable "exists but forbidden" would confirm to any caller that a given content hash had been decided on by someone, which is the fact the scoping exists to withhold. Do not read not_found as proof that no such decision exists anywhere.

Decisions persisted without context.repository cannot currently be attributed to an account, and are not retrievable by fingerprint at all — not by their owner either. Retrieve those by decision_id, which is unchanged and unscoped. This is a limitation of what older stored rows carry, not a property of the lookup: rows written from now on record the account directly, so the gap narrows as older rows age out. If a fingerprint you expect returns not_found, use the decision_id before concluding the decision is missing.

When the stored envelope carries control fields, control_envelope.next_agent_step is structured remediation guidance the agent MAY follow for non-CONTINUE execution_action values (null on CONTINUE*). Still branch on execution_action; next_agent_step is a suggestion, not permission.

ParametersJSON Schema
NameRequiredDescriptionDefault
decision_idNoThe decision_id from a prior decision_result envelope. Provide this and/or fingerprint (at least one non-empty string required).
fingerprintNoA verdict fingerprint (sha256:...); returns the latest matching decision. Provide this and/or decision_id (at least one non-empty string required).

Output Schema

ParametersJSON Schema
NameRequiredDescription
metaYes
decisionNo
evidenceNo
patternsNo
operationNo
timestampNo
risk_scoreNo
receipt_kindNo
chain_receiptNo
preflight_modeNo
safe_for_agentNo
decision_resultYesdecision-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).
pattern_sourcesNo
breaking_changesNo
control_envelopeNoControl envelope (control/1.0) derived from the stored decision_result. Includes next_agent_step (structured remediation SUGGESTION for non-CONTINUE execution_action; null on CONTINUE*; not permission — still branch on execution_action).
evidence_qualityNo
execution_actionNo
coderifts_versionNo
requires_migrationNo
verdict_fingerprintNo
required_action_coreNoBranchable required-action core { type, reason_code, recheck_required } when present on the envelope.
decision_spec_versionNo
decision_semantic_hashNo

TDQS

A4.9/5.0
Behavior5/5

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

Annotations already declare readOnlyHint=true, but the description adds substantial non-obvious behavior: fingerprint scoping to own decisions, deliberate identical not_found for forbidden lookups, legacy rows not retrievable by fingerprint, and the meaning of control_envelope.next_agent_step. This goes well beyond what annotations provide.

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 well-structured with clear sections and front-loaded purpose, but it is quite lengthy and includes some details that slightly overlap with the schema (e.g., empty {} rejection) and an extended legacy-row explanation that could be tightened. Still, nearly every sentence carries useful behavioral information.

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?

Given the tool's complexity (scoped lookups, legacy limitations, not_found semantics, control_envelope hints), the description covers all critical aspects an agent needs to call it correctly. The presence of an output schema means return-value details do not need to be in the description.

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?

Although the input schema has 100% parameter coverage, the description adds meaningful semantics beyond it: decision_id is preferred, fingerprint is content-derived and scoped to the caller's own decisions, decision_id is unscoped, and a fallback strategy is provided when fingerprint returns not_found. This enhances the agent's ability to choose and combine the parameters correctly.

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 names a specific verb ('Retrieve'), a clear resource ('a PAST CodeRifts decision'), and the key identifiers (decision_id or fingerprint). It explicitly enumerates what the payload contains (report, breaking changes, scores, receipt metadata) and distinguishes itself from sibling tools by focusing on past decisions.

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?

The description provides explicit 'Use this when' and 'Do not use when' sections, naming the exact alternatives (preflight_change_set, verify_receipt) and the conditions that trigger them. This is the clearest possible routing guidance for an agent.

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

preflight_change_setAInspect

Use this when: a change set of contract artifacts modifies OpenAPI, GraphQL, protobuf, AsyncAPI, MCP manifests, or agent tool schemas before merge, deploy, publish, or tool registration. Do not call for documentation-only changes, static readiness scoring, or receipt verification. Use analyze for risk only; authorize requires context.operation for permission. For receipt verification use coderifts.verify_receipt instead; for details of a past decision use coderifts.get_decision_details instead.

ParametersJSON 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 string for operation (change-set.js) — conventional values below.
audienceNoRequester identity for the decision envelope. Accepted here; the server-derived audience wins when both are present.
artifactsNoContract artifacts to analyze together (max 20). Each is { id, type, before, after }.
tenant_idNoTenant the grant is issued under (cr.exec.v2). Defaults to "default" when absent.
adapter_idNoAdapter the executor will apply the change with, e.g. fs, postgres, git (cr.exec.v2).
derivationNoOpt-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).
target_uriNoTarget the grant is bound to (cr.exec.v2). Falls back to context.target_uri, then to a repository/head-derived value.
executor_idNoIdentity of the executor the grant is bound to (cr.exec.v2).
policy_hashNoPolicy identity the grant is issued under (cr.exec.v2). Bound into the signed grant when supplied.
state_nonceNoOptional 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.
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 an error unless decision_spec_version is '1.0' (30-day legacy pin with soft-default analyze).
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 receipt token to link
expected_state_tokenNoState token the executor expects to observe at apply time (cr.exec.v2). Signed as a separate field; empty string when absent.
decision_spec_versionNoOptional pin. '1.0' = legacy contract (soft-default mode + analyze still carries decision/execution_action) until the sunset date. Omit or '2.0' = current contract.
include_execution_grantNoOpt-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.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

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

Annotations only indicate readOnlyHint=false and openWorldHint=false, so the description carries meaningful behavioral weight. It adds that analyze is risk-only and authorize requires context.operation for permission, and it implies receipt-producing behavior by pointing to verify_receipt for verification. It does not explicitly mention receipts/execution grants, but the schema and annotations cover enough of the safety profile.

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 front-loaded with 'Use this when' and every sentence earns its place: trigger conditions, exclusions, mode selection, and sibling routing. It is denser than a minimal description but appropriately sized for a complex 17-parameter tool with multiple modes.

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

Completeness4/5

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

For a complex tool with 17 parameters, an output schema, and nested objects, the description provides enough selection and invocation context: when to use, when not to use, mode differences, and alternatives. It does not enumerate all parameter behaviors, but the schema and output schema carry that burden, so nothing critical is missing at the decision level.

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

Parameters3/5

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

Schema description coverage is 100%, so the schema already fully documents all 17 parameters. The description adds no parameter-level detail beyond naming the general artifact types and pointing to context.operation as an authorization requirement, which is sufficient given the high schema coverage.

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 states exactly when the tool applies: a change set of contract artifacts modifies OpenAPI, GraphQL, protobuf, AsyncAPI, MCP manifests, or agent tool schemas before merge, deploy, publish, or tool registration. It also distinguishes itself from siblings by routing receipt verification to coderifts.verify_receipt and past decisions to coderifts.get_decision_details, so an agent can tell the tools apart without inspecting schemas.

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, explicit do-not-call cases ('documentation-only changes, static readiness scoring, or receipt verification'), and mode-level guidance ('Use analyze for risk only; authorize requires context.operation for permission'). It also names the sibling alternatives directly, leaving little to inference.

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

verify_receiptA
Read-only
Inspect

Verify a CodeRifts signed chain-receipt you ALREADY HOLD: cryptographic authenticity (signature + key id), body binding, and — when lifecycle indices are available — whether it is currently valid authorization (not expired, superseded, or revoked) for a stated operation/target.

Use this when:

  • You already obtained a chain_receipt / receipt token from a prior preflight (or CI artifact) and are about to act (merge/deploy) under that receipt.

  • A contract-gate or policy requires offline/online proof that the receipt is authentic for this change before proceeding.

  • You must distinguish "signature ok" from "currently authorized" (stale or superseded receipts must not be treated as live approval).

Do not use when:

  • You do not have a receipt yet — call coderifts.preflight_change_set first.

  • You need a NEW decision for a changed base→head set — preflight again; verify_receipt does not re-diff specs.

  • The receipt you hold binds a different operation or target than the one you are about to perform — call coderifts.preflight_change_set with context.operation set to that operation (a merge receipt does not authorize a deploy); verify_receipt cannot re-scope or re-issue a decision.

  • You only need human-readable history of an old decision_id without a receipt token — use coderifts.get_decision_details.

  • The change set itself is unknown or incomplete — fix the change set and preflight; do not "verify" a placeholder.

Inputs: receipt token (required); optional intended context (operation, environment, fingerprint, target_id, audience, repository/branch/pull_request, base/head) and the body_hash-bound decision_result envelope. 30s clock-skew leeway on expiry. A 0s grace for declared destructive production operations is defined in the policy but is unreachable today: the intended-context schema has no destructive field, so nothing can declare one and the 30s leeway always applies. Returns { valid, status, currently_authorized (bool|null), reason, payload, authz_* }. Branch on currently_authorized; null = not evaluated.

When a decision envelope is also in hand (e.g. from a prior preflight), its control_envelope.next_agent_step (if present) is structured remediation guidance the agent MAY follow after a non-CONTINUE decision — still branch on execution_action; next_agent_step is suggestion, not permission.

ParametersJSON Schema
NameRequiredDescriptionDefault
baseNoIntended base commit/ref SHA the receipt must match (signed-wins vs envelope.base)
headNoIntended head commit/ref SHA the receipt must match (signed-wins vs envelope.head)
tokenYesThe chain receipt token (base64url(body).base64url(signature))
branchNoIntended branch the receipt must bind (place binding; optional)
audienceNoIntended audience — must match the receipt
operationNoIntended operation the receipt must authorize (conventional: merge|deploy|tool_call|publish). Triggers authorization evaluation when non-empty; supply decision_result for full scope binding.
target_idNoIntended apply-site target the receipt must bind
repositoryNoIntended repository the receipt must bind (place binding; optional)
environmentNoIntended environment (e.g. production) — must match the receipt
fingerprintNoIntended change fingerprint — must equal the receipt fp
pull_requestNoIntended pull-request id the receipt must bind (place binding; optional)
decision_resultNoThe body_hash-bound decision envelope (carries operation/target/decision). Required for a meaningful AUTHORIZATION evaluation of scope; without it, intended context alone fails closed on authorization (currently_authorized false) while signature status remains independent. Full schema: https://coderifts.com/schemas/decision-result.v1.consumer.json.

Output Schema

ParametersJSON Schema
NameRequiredDescription
validYestrue iff status is VERIFIED_CURRENT or RETIRED_KEY_VALID_AT_ISSUE
reasonNo
statusYes
payloadNo
authz_noteNoPresent when no intended context supplied: status reflects signature+expiry only
authz_stateNoLifecycle state from isCurrentlyAuthorized when authorization is evaluated (optional; omitted when currently_authorized is null)
authz_reasonNoWhen currently_authorized=false: the deny reason (operation_mismatch, decision_not_allow, superseded, expired, target_mismatch, environment_mismatch, …)
authz_statusNoAuthorization-level status (VERIFIED_WRONG_ENVIRONMENT / VERIFIED_SUPERSEDED / VERIFIED_SCOPE_MISMATCH / …)
caller_valueNoCaller claim that differed from the signed envelope
signed_valueNoSigned envelope slot when signed-wins fail-closed (source_binding_mismatch)
binding_levelNoplace_and_content | content_only — forensic, not a second verdict
correlation_idNoRoute-owned trace id (ID828); always a non-empty string on 200
currently_authorizedYesWhether the receipt currently authorizes the intended operation/target/fp (§106). null means authorization could not be evaluated (e.g. no intended context) — not unauthorized and not authorized.

TDQS

A5/5.0
Behavior5/5

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

Beyond readOnlyHint=true, the description discloses the 30s clock-skew leeway, the unreachable 0s destructive-production grace, fail-closed authorization when the envelope is omitted, return semantics with currently_authorized null, and next_agent_step being advisory. No annotation contradiction; this goes well beyond what annotations and schema already state.

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

Conciseness5/5

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

The description front-loads the core purpose, then uses scannable bullets for when/do-not-use, then compactly adds operational details and return guidance. It is dense, but every sentence carries a distinct fact relevant to invoking or interpreting the tool; there is no filler.

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?

For a complex 12-parameter verification tool with nested objects and an output schema, it covers prerequisites, mode selection, edge cases, return branching, and sibling routing. The existing output schema makes detailed return documentation unnecessary, and the description still gives the essential branching pointer.

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?

Although schema coverage is 100%, the description adds meaning that the schema alone does not: two evaluation modes, token-only acceptance, fail-closed behavior when intended context is present but the decision envelope is omitted, and the need for decision_result for full scope binding. This materially helps an agent construct correct calls.

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 opens with a specific action and resource: verify a chain-receipt you ALREADY HOLD, covering signature authenticity, body binding, and authorization status. It also differentiates itself from preflight_change_set and get_decision_details in the Do-not-use section, so an agent can distinguish it from siblings without inspecting schemas.

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?

Explicit 'Use this when' and 'Do not use when' blocks specify the exact conditions: holding an existing receipt, about to act, needing proof, and needing to distinguish signature-ok from authorized. It names sibling tools and states when to call them instead, such as preflight for new decisions and get_decision_details for history without a receipt token.

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

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections. Dates show when Glama detected each change.

  1. 1 tool update
    • Changedpreflight_change_set5 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"
  2. 1 tool update
    • Changedpreflight_change_set2 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."
  3. 1 tool update
    • Changedverify_receipt1 field changed
      • changedOutput schema / properties / status / enum
        Previous value: -[
        -  "VERIFIED_CURRENT",
        -  "VERIFIED_EXPIRED",
        -  "VERIFIED_WRONG_AUDIENCE",
        -  "VERIFIED_WRONG_ENVIRONMENT",
        -  "VERIFIED_SUPERSEDED",
        -  "VERIFIED_SCOPE_MISMATCH",
        -  "UNKNOWN_KEY",
        -  "RETIRED_KEY_VALID_AT_ISSUE",
        -  "INVALID_SIGNATURE",
        -  "MALFORMED",
        -  "UNSUPPORTED_VERSION",
        -  "REGISTRY_UNREACHABLE"
        -]New value: +[
        +  "VERIFIED_CURRENT",
        +  "VERIFIED_EXPIRED",
        +  "VERIFIED_WRONG_AUDIENCE",
        +  "VERIFIED_WRONG_ENVIRONMENT",
        +  "VERIFIED_SUPERSEDED",
        +  "VERIFIED_SCOPE_MISMATCH",
        +  "VERIFIED_UNBOUND_OPERATION",
        +  "VERIFIED_UNBOUND_TARGET",
        +  "VERIFIED_UNBOUND_REPOSITORY",
        +  "VERIFIED_UNBOUND_BRANCH",
        +  "VERIFIED_UNBOUND_PULL_REQUEST",
        +  "UNKNOWN_KEY",
        +  "UNKNOWN_KEY_STATUS",
        +  "RETIRED_KEY_VALID_AT_ISSUE",
        +  "KEY_RETIRED_AFTER_SIGNING",
        +  "REVOKED_KEY",
        +  "REVOKED_KEY_UNDECIDABLE",
        +  "KEY_REVOKED",
        +  "REVOCATION_UNDECIDABLE",
        +  "AUTHORIZATION_UNDECIDABLE",
        +  "INVALID_SIGNATURE",
        +  "MALFORMED",
        +  "UNSUPPORTED_VERSION",
        +  "REGISTRY_UNREACHABLE"
        +]
  4. 1 tool update
    • Changedpreflight_change_set8 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"
        +}
  5. 1 tool update
    • Changedpreflight_change_set1 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"
        +  }
        +]
  6. 3 tool updates
    • Changedget_decision_details1 field changed
      • changedOutput schema / properties / decision_result / properties / derivation / description
        Previous value: -"ID637 6b additive. Present only when derivation:\"server\" produced this envelope. { source: github_compare, base_sha, head_sha }. Covered by body_hash; not fingerprint."New value: +"ID637 6b additive. Present only when derivation:\"server\" produced this envelope. { source, platform?, base_sha, head_sha }. Covered by body_hash; not fingerprint."
    • Changedpreflight_change_set1 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"
        +  }
        +]
    • Changedverify_receipt1 field changed
      • changedInput schema / properties / decision_result / properties / derivation / description
        Previous value: -"ID637 6b additive. Present only when derivation:\"server\" produced this envelope. { source: github_compare, base_sha, head_sha }. Covered by body_hash; not fingerprint."New value: +"ID637 6b additive. Present only when derivation:\"server\" produced this envelope. { source, platform?, base_sha, head_sha }. Covered by body_hash; not fingerprint."
  7. 3 tool updates
    • Changedget_decision_details1 field changed
      • addedOutput schema / properties / decision_result / properties / derivation
        Added value: +{
        +  "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"
        +  ]
        +}
    • Changedpreflight_change_set3 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"
        +  }
        +]
    • Changedverify_receipt1 field changed
      • addedInput schema / properties / decision_result / properties / derivation
        Added value: +{
        +  "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"
        +  ]
        +}
  8. 3 tool updates
    • Changedget_decision_details2 fields changed
      • addedOutput schema / properties / decision_result / properties / audience
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedOutput schema / properties / decision_result / properties / authority
        Added value: +{
        +  "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"
        +  ]
        +}
    • Changedpreflight_change_set1 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"
        +  }
        +]
    • Changedverify_receipt2 fields changed
      • addedInput schema / properties / decision_result / properties / audience
        Added value: +{
        +  "type": [
        +    "string",
        +    "null"
        +  ]
        +}
      • addedInput schema / properties / decision_result / properties / authority
        Added value: +{
        +  "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"
        +  ]
        +}
  9. 1 tool update
    • Changedpreflight_change_set2 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"
        +  }
        +]
  10. 1 tool update
    • Changedpreflight_change_set2 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"
        +  }
        +]
  11. 1 tool update
    • Changedpreflight_change_set3 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"
        +}
  12. 3 tool updates
    • Changedget_decision_details1 field changed
      • addedOutput schema / properties / decision_result / properties / blast_radius
        Added value: +{
        +  "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"
        +}
    • Changedpreflight_change_set1 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"
        +  }
        +]
    • Changedverify_receipt1 field changed
      • addedInput schema / properties / decision_result / properties / blast_radius
        Added value: +{
        +  "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"
        +}
  13. 2 tool updates
    • Changedpreflight_change_set1 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"
        +  }
        +]
    • Changedverify_receipt4 fields changed
      • changedInput schema / description
        Previous value: -"Two evaluation modes (schema-documented; no mode discriminator field). SIGNATURE: supply token only — signature + expiry; currently_authorized is null. AUTHORIZATION: also supply intended context (operation, environment, fingerprint, target_id, audience, and/or base/head) AND the body_hash-bound decision_result envelope so currently_authorized / authz_status / authz_reason can be evaluated. Token alone is always accepted; omitting the envelope when context fields are present yields a signature verdict plus fail-closed authorization (currently_authorized false), not a schema reject."New value: +"Two evaluation modes (schema-documented; no mode discriminator field). SIGNATURE: supply token only — signature + expiry; currently_authorized is null. AUTHORIZATION: also supply intended context (operation, environment, fingerprint, target_id, audience, repository/branch/pull_request, and/or base/head) AND the body_hash-bound decision_result envelope so currently_authorized / authz_status / authz_reason can be evaluated. Token alone is always accepted; omitting the envelope when context fields are present yields a signature verdict plus fail-closed authorization (currently_authorized false), not a schema reject."
      • addedInput schema / properties / branch
        Added value: +{
        +  "description": "Intended branch the receipt must bind (place binding; optional)",
        +  "type": "string"
        +}
      • addedInput schema / properties / pull_request
        Added value: +{
        +  "description": "Intended pull-request id the receipt must bind (place binding; optional)",
        +  "oneOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "number"
        +    }
        +  ]
        +}
      • addedInput schema / properties / repository
        Added value: +{
        +  "description": "Intended repository the receipt must bind (place binding; optional)",
        +  "type": "string"
        +}

Frequently Asked Questions

Discussions

No comments yet. Be the first to start the discussion!

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    An MCP server providing risk-aware API governance tools for AI agents. Agents call preflight checks before tool calls or merges to verify API contracts are safe. Returns risk score, blast radius, agent impact, economic cost, and a deterministic ALLOW/WARN/REQUIRE_APPROVAL/BLOCK decision. MCP endpoint: https://app.coderifts.com/mcp
    3
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI agents to call real API endpoints and verify responses against OpenAPI specs, supporting contract testing, auth presets, spec diffing, and health checks.
    8
    0
    MIT
  • A
    license
    A
    quality
    B
    maintenance
    A read-only API change deploy gate for AI coding agents that analyzes OpenAPI specs to determine if changes are safe to deploy. It provides tools for comparing specs, explaining breaking changes, and generating migration guides.
    5
    73
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

TDQS

A4.7/5.0
Disambiguation5/5

preflight_change_set is the sole creation/analysis entry point, get_decision_details is explicitly for retrieving past decisions, and verify_receipt is for validating an already-held receipt. Their descriptions include cross-references and negative usage guidance that make the boundaries unambiguous.

Naming Consistency5/5

All three tool names follow a consistent snake_case verb_noun pattern: preflight_change_set, get_decision_details, verify_receipt. There are no mixed conventions or vague verbs.

Tool Count5/5

Three tools map cleanly to the core governance workflow: create/analyze a change set, inspect a past decision, and verify a receipt before acting. The count is well-scoped and each tool earns its place.

Completeness5/5

The set covers the full decision lifecycle for its stated domain: preflight produces decisions/receipts, get_decision_details retrieves historical decision records, and verify_receipt validates current authorization. Decisions are immutable and revocation is checked via receipt validity, so no obvious lifecycle step is missing.