Repository navigation
[spec-review] Update Safe Outputs conformance checker for recent spec changes - #70150
Merged
Merged
Conversation
This was referenced Oct 19, 2026
pelikhan
deleted the
safe-outputs-conformance-1-29-13-3a96f40f8f971200
branch
October 19, 2026 07:11
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Summary
Updates
scripts/check-safe-outputs-conformance.shto match the Safe Outputs specification v1.29.13. The script previously matched v1.29.8. This PR adds 6 checks for new normative requirements and fixes 1 false positive caused by a spec wording change.Specification Changes Reviewed (last 7 days)
020a1c6Recognize merged base ancestors when the base tip advances (Recognize merged base ancestors when the base tip advances #69998) — v1.29.13, BGO-001–008,allow-full-history-fetch0389684Bind safe-output patch and bundle application to validated bytes (Bind safe-output patch and bundle application to validated bytes #68732) — PTI-001–007, dash-only branch rejection5a79aa3Require explicit multi: true for multi-repository checkout (Require explicit multi: true for multi-repository checkout #68816) — v1.29.12, RCR8 scoped to literalmulti: true7f88694Add allowlisted dynamic repository checkout lists (Add allowlisted dynamic repository checkout lists #68593) — v1.29.10/11, RCR8–RCR1553db138Make add-comment link limits configurable and exclude footer links (Make add-comment link limits configurable and exclude footer links #68723) —max-links845b2e8Keep signed-delivery rebase attached for git push fallback (Keep signed-delivery rebase attached for git push fallback #68052) — v1.29.9, SCD-001–003ff43e6bAdd in-place replacement for add-comment status updates (Add in-place replacement for add-comment status updates #68013) —replace-older-comments📋 Script Updates & Testing Details
Script Updates
New Checks Added
add-comment.max-links. Checks that the limit is a positive integer in the schema, that it is enforced both when the tool is called (MCP server) and when the comment is posted (handler), that only agent-written content is counted (footer and metadata links are excluded), and that E008 reports the configured value.replace-older-comments. Checks that it cannot be combined withhide-older-comments(handler and schema), that only comments by the authenticated identity are matched (bot-only when the identity is unknown), that only issue/PR comments with a caller or workflow marker are eligible, and that staged mode returns before any lookup or update.HEADargument, which would detach HEAD. Also checks thatallowGitPushFallback: falserefuses an unsigned push, and that the real-git test evidence exists.transport_integrity.cjsandresolve_transport_paths.cjs. Also checks for: files opened withO_NOFOLLOW/O_NONBLOCK, regular-file checks, a sha256 digest plus a dev/inode identity check, private read-only (0o400) snapshots, the stableERR_TRANSPORT_INTEGRITYcode, retries rejected before custom classifiers run, and snapshot disposal.checkout.multimust be a literal boolean, that single mode allows only one repository, thatmax-reposdefaults to 10 and is enforced, that private/internal targets are denied by default behind a literalallow-private-repos, that a public host can never check out a private target, and that runtime lists hard-codelfs/submodulesto false and use--no-recurse-submodules.GIT_ALLOW_PROTOCOL=\"\"andGIT_NO_LAZY_FETCH=1). Checks thatallow-full-history-fetchis a literal opt-in with a boolean, default-false schema for both handlers, scoped to each handler, and warns that downloads have no byte limit. Checks thatallow-merged-base-baselineis a literal opt-in, and that discovery is bounded: 5s timeout, 1 MiB output, 100 records with a 101st record to detect overflow, at most 4 REST comparisons, retries disabled, and an abort signal.Checks Modified
add_commenttool description now says the link limit is the configuredmax-links(default: 50) instead of a fixed "50 links". The check now accepts either wording, which fixes a MEDIUM false positive.Checks Removed
Not automated (left to the runtime and TLA+ evidence the spec cites)
Grep checks cannot reliably verify these behavioral properties.
Testing
Negative test: temporarily setting
GIT_NO_LAZY_FETCH: \"0\", loosening theallowFullHistoryFetch !== truegate, and hard-coding the E008 maximum produced the expected BGO-001/BGO-002 CRITICAL and TYPE-016 MEDIUM failures. The files were restored afterwards.Related Files
docs/src/content/docs/specs/safe-outputs-specification.mdscripts/check-safe-outputs-conformance.sh