{"spec":"coderifts-prose-claims.v1","scope":"Model-facing sentences emitted in tool RESULTS. FIXED entries are pinned whole; TEMPLATED entries pin the FRAME while the interpolated value stays free (it is per-request data, not a claim). Sentences are pinned at the PRODUCER: a sentence that reaches three fields is defined once here, so it cannot acquire three gates that disagree.","not_pinned":"This table does NOT cover: resume_condition (genuinely per-request — see the Class C proposal), explanatory prose that makes no product claim, or any text produced outside src/prose-claims.js. Absence from this table is not evidence that a string is fixed.","fixed_count":20,"templated_count":5,"pinning":{"table":"https://app.coderifts.com/.well-known/prose-claims.json","note_sha256":"sha256:98fd28283a7e26cb5406a22d56a8caecf0e5cedb20bd3acae87846cf069b7ce1","unpinned":[{"field":"analysis.detected_patterns[].consequence","reason":"per_request"},{"field":"analysis.remediations[].instruction","reason":"per_request"},{"field":"artifacts[].detected_patterns[].consequence","reason":"per_request"},{"field":"detected_patterns[].consequence","reason":"per_request"},{"field":"decision_result.evidence[].finding","reason":"per_request"},{"field":"decision_result.remediation_transaction.required_changes[].instruction","reason":"per_request"},{"field":"evidence[].finding","reason":"per_request"},{"field":"human_report.summary","reason":"per_request"},{"field":"human_report.breaking_highlights[].consequence","reason":"per_request"},{"field":"human_report.suggestions[].instruction","reason":"per_request"},{"field":"analysis.breaking_changes_details[].description","reason":"per_request"},{"field":"analysis.detected_patterns[].description","reason":"per_request"},{"field":"artifacts[].breaking_changes_details[].description","reason":"per_request"},{"field":"artifacts[].detected_patterns[].description","reason":"per_request"},{"field":"breaking_changes_details[].description","reason":"per_request"},{"field":"detected_patterns[].description","reason":"per_request"},{"field":"control_envelope.next_agent_step.resume_condition","reason":"not_yet_pinned"},{"field":"control_envelope.required_action.resume_condition","reason":"not_yet_pinned"},{"field":"control_envelope.required_action.choices[].label","reason":"not_yet_pinned"},{"field":"decision_result.policy_pin_status.note","reason":"not_yet_pinned"},{"field":"decision_result.policy_pin_status.scope","reason":"not_yet_pinned"},{"field":"policy_pin_status.note","reason":"not_yet_pinned"},{"field":"policy_pin_status.scope","reason":"not_yet_pinned"},{"field":"human_report.next_steps_prose","reason":"not_yet_pinned"},{"field":"severity_summary.note","reason":"not_yet_pinned"}],"unpinned_count":25},"fixed":{"enforcement.note":{"text":"This preflight evaluates the change only. Runtime enforcement for your tool calls is the client-side @coderifts/agent-guard fail-closed gate (an agent that wraps its mutating tools with the guard cannot execute an unauthorized contract change). Merge enforcement depends on the repository's GitHub branch protection, evaluated on the PR/webhook path (see the check_run enforcement_status) — it is NOT determined by this preflight response.","bytes":441,"sha256":"sha256:3caa4f0e5e31fe519b003838d399c5f3bbf80142f2d4424e4a72964933099688","gated_because":"claim-language, not imperative"},"reason.security_critical":{"text":"This PR is blocked because a CRITICAL security finding was detected in the API changes.","bytes":87,"sha256":"sha256:6cd2c5dc47817544a993167054785cbcc687846b8d10463766e4d88bcc5654fc"},"unblock.auth.communicate":{"text":"Communicate the auth scope change to all consumers before merging","bytes":65,"sha256":"sha256:0f79ba4ff29e4ffb6ff5c01269a6791f93b123ae0644209864902aa1849bb0d1"},"unblock.auth.window":{"text":"Provide a migration window with both old and new scopes supported simultaneously","bytes":80,"sha256":"sha256:c54a317c4a29ee5c2fadd4940c3dc4b977d10f3ba723b40976e5052c4d9fd1e0"},"unblock.budget":{"text":"Update the breaking change budget in `.coderifts.yml` if this change is intentional","bytes":83,"sha256":"sha256:1af0876902ef2a8ec40a1d140f5592aefaef2caa9ef8bda1784ffbd1d3d417d9"},"unblock.consult_governance":{"text":"Consult the API governance team before merging","bytes":46,"sha256":"sha256:c411507f3906b4be34e6dadd7ce49bda3d15751ce88507cd6fb2d0480e96dcee"},"unblock.deprecation_generic":{"text":"Add a deprecation notice before removing or changing existing fields","bytes":68,"sha256":"sha256:c1f6a813cd0af43f887b9eecc6a5d365f678409e44bf29e3ea3e52669dcfe403"},"unblock.freeze.dates":{"text":"Update the freeze window dates in `.coderifts.yml` if the window is incorrect","bytes":77,"sha256":"sha256:883d312ff10dab82d7c46f2b7856fbf72a3104d276fe90e6b9939d487027b6f9"},"unblock.freeze.exception":{"text":"If this change is urgent, request a freeze exception from the API owner","bytes":71,"sha256":"sha256:c118a1cabaf9a7d2b6c2eaa462fcb3dbc3d3bd0f9be69b8d41f001a4314a9258"},"unblock.freeze.wait":{"text":"Wait for the freeze window to expire before merging","bytes":51,"sha256":"sha256:f3053bee36776175331a3b23913860fda895a7d8012310f16dad33930015d67b"},"unblock.migration_guide":{"text":"Provide a migration guide in the changelog for consumers","bytes":56,"sha256":"sha256:410528182b1bd5b294c12d5371a349b31f1bd245b229e93c60ef3c0ae4dbdb3e"},"unblock.pagination.alias":{"text":"Maintain the old pagination field as an alias during a transition period","bytes":72,"sha256":"sha256:d9304d22cc1940158217911a675e4c5be9c77b1e368d34d92c5eab8ff83394c3"},"unblock.pagination.version":{"text":"Version the pagination change behind a new endpoint or API version","bytes":66,"sha256":"sha256:fe313e8de4d2ba813c073170a6b299a148675e304c4d6c2769c50fbb0f41777b"},"unblock.pattern.review":{"text":"Review the flagged pattern and assess its impact on existing consumers","bytes":70,"sha256":"sha256:03436d5bb18510ecc1c87f69531bfa091e3ca4ee614991e2ba37f67bf31712ab"},"unblock.pattern.version":{"text":"Consider versioning this change under a new API path","bytes":52,"sha256":"sha256:dea86709026f358660bc73289d113056134e3f1c1f1c760e4aa42f829096ba22"},"unblock.required_field.optional_first":{"text":"Make the new field optional first, then require it in a future major version","bytes":76,"sha256":"sha256:542ff1cb565c5d6c6f25be08eeecbf48dd6a20aa502f3d3e267345a53ef4d950"},"unblock.review_each_breaking":{"text":"Review each breaking change and determine if it can be made backward-compatible","bytes":79,"sha256":"sha256:618bee5af5569cd7c2319cc26b8ed3a2dd104f03f1c2adb0cfcbc8cf23491a90"},"unblock.security.consult":{"text":"Consult your security team before merging changes with critical security impact","bytes":79,"sha256":"sha256:801d80dfda6bab2d81480269e6235bc445c2ccee93c555b4d497fc55067294ba"},"unblock.security.resolve":{"text":"Review and resolve all CRITICAL security findings listed in the Security section above","bytes":86,"sha256":"sha256:402f43e54ed26910e2e6f4b428db1852efae6364b99f39656d63d407c88b03f4"},"unblock.split_pr":{"text":"Split this PR — merge non-breaking changes separately","bytes":55,"sha256":"sha256:6824c2e403d8d268c2c2d1257ff1ff130d392a98a11d0a63df0f51539d584ba0"}},"templated":{"reason.budget_exceeded":{"frame":"This PR is blocked because the breaking change budget ({budget} allowed) was exceeded with {count} breaking change{plural}.","slots":["budget","count","plural"],"sha256":"sha256:4adae5f1679d0a541d30464b4e22fff847e641ac85dcd2827beacfb3cbf6f39d","note":"Counts are per-request measurements, not claims."},"reason.freeze_active":{"frame":"This PR is blocked because a release freeze window is currently active{suffix}","slots":["suffix"],"sha256":"sha256:e32931db7b2ef73e28a27d218b184cf450a762041037c437fcf0ca4b704aacf0","note":"suffix is \": <operator reason>\" or \".\" — operator free text, deliberately unpinned."},"reason.policy_violated":{"frame":"This PR is blocked because a policy rule was violated: {message}","slots":["message"],"sha256":"sha256:eb8c051a5c50c161b45402255008c73e0beb9b8297f7ae027512b03ce9f09656","note":"message is the operator's own policy text, deliberately unpinned."},"reason.severity_detected":{"frame":"This PR is blocked because a {severity}-severity change was detected{path} — see What Breaks below.","slots":["severity","path"],"sha256":"sha256:ead195ae19ead29f3a98ad90caed1bd713a4e1e35dd56ba0969313b4b918d92a","note":"severity and path are per-case data."},"unblock.deprecation_notice":{"frame":"Add a deprecation notice to {target} before {action}","slots":["target","action"],"sha256":"sha256:3c87f6bc1bbe168e0aa61f37f16691248dcb8b7ebfdcfc0894287fd77d2bb0e7","note":"Class B merge of the former :76 / :78 variants. target is a path or a prose noun; action is \"removal\" or \"enforcing it\". Both are per-case data, not claims."}}}