Repository navigation
Conversation
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…proval (Spec 120) contractDelta (hint change either direction, recursive input-schema widening, output-schema change, hash-equal dispatch-tier change) runs at both scan-mode gate sites and holds whatever the verdict; tool_auto_approved carries the replaced contract, the signals evaluated, verdict and bundle; one-time startup WARN and doctor finding name servers running under the scan default; hold_signal terminology family and Web labels; shared Go/Web fixture; qapilot Shape, QP-20, S28/S29, mutations M15-M19; docs, spec 119 FR-007 amended, CHANGELOG. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…spec 120) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ripping, compacted gate signals (spec 120)
- decode schemas with json.Number so bounds and enum members beyond float64
precision compare exactly
- stripText/carriesSteering are schema-aware: properties/$defs keys are names,
text keywords are data (a property named description is structural)
- not: compare stripped forms, text-only changes pass
- additionalProperties {} is unconstrained, like true
- more gate signals than the record keeps are compacted per rule with a
<rule>:more:+n marker instead of being cut by MaxToolHeldSignals
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Deploying mcpproxy-docs with
|
| Latest commit: |
5b268c5
|
| Status: | ✅ Deploy successful! |
| Preview URL: | https://deed93e1.mcpproxy-docs.pages.dev |
| Branch Preview URL: | https://120-scan-structural-gate.mcpproxy-docs.pages.dev |
…le items steering, enum numeric identity, trailing JSON, prefixItems (spec 120) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…h steering, nested enum numbers, default-only schemas, draft-04 dependencies (spec 120) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…n for enum members, bounds, default and const (spec 120) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
… nothing (spec 120) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…es, unconstrained means no validation keyword (spec 120) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ic unconstrained subschemas, branch matching by value, output numbers by value (spec 120) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…ring, oneOf is constraining (spec 120) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
…required names (spec 120) Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Cross-model review log (opencode
|
…uired names and pattern/format (spec 120) newBranchSignals now also reports pattern/format anywhere in a new subtree and is used by the new-items and new-additionalProperties paths, so a brand-new items or additionalProperties schema carrying required, and a new allOf branch carrying pattern/format, hold like their top-level counterparts. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
|
Round-10 findings 25 and 26 fixed in 5b268c5 (maintainer decision on #1713's thread: fix without a further review round, the cap stands): |
| case string: | ||
| return []any{"s", t} | ||
| case []any: | ||
| out := make([]any, 0, len(t)+1) |
📦 Build ArtifactsWorkflow Run: View Run Available Artifacts
How to DownloadOption 1: GitHub Web UI (easiest)
Option 2: GitHub CLI gh run download 40178738383 --repo smart-mcp-proxy/mcpproxy-go
|
|
Codecov Report❌ Patch coverage is 📢 Thoughts on this report? Let us know! |
Summary
Spec 120 (
specs/120-scan-structural-gate/spec.md), follow-up to #1740 (Spec 119) and Phase 0 of the maintainer decision posted on #1713 on 2026-10-25 after the reviews by @james-crowley and @kaspermuutra-dotcom. Must merge before the release that carries thescandefault (#1740): the two ship together.Under
trust_mode: scana changed tool contract is approved when the offline TPA scan is clean. The scanner reads a schema as text and never sees the annotations, so a new requiredbccparameter, anopenWorldHintflipped tofalse, or a defaultedwebhook_urlall passed a clean scan. This PR puts a deterministic structural gate in front of that verdict.contractDelta(approved, live) []Signal(internal/runtime/tool_contract_delta.go) replaces the spec-119 safer-flip rule at bothcheckToolApprovalsgate sites. Any signal holds the change whatever the verdict; signals are prepended soMaxToolHeldSignalsnever drops them. Rules:GATE-HINT-CHANGE:<hint>:<old>>:<new>: any effective change of the four safety hints, either direction, MCP defaults applied (GATE-HINT-SAFER-FLIPkept as the label of the two safer flips).GATE-SCHEMA-SHAPE:<reason>:<path>: recursive keyword-path diff of the input schema (new required, type/$ref, enum member added or enum dropped, pattern/format, loosened or removed bound,additionalPropertiesrelaxed, default/const, new property whose subtree carries default/const/enum, anyOf/oneOf grew, allOf shrank, items form, unknown approved schema). Narrowing edits pass.GATE-OUTPUT-SCHEMA:added|removed|changed(text keywords stripped).GATE-HINT-CHANGE:dispatch:<old>>:<new>(FR-009): the hash folds hints in by effective value whileDeriveCallWithreads an explicit default differently from an absent hint, so{readOnlyHint:false, destructiveHint:true}→ no annotations kept the hash and moved the tool fromcall_tool_destructivetocall_tool_read. The failing test was written first (TestHashEqualDispatchDrop_Bites); it bit, so the hash-match, formula and content shortcuts are closed for a dispatch drift and the revert proof requires the variant too.tool_auto_approvedfor a changed contract (scan-approved andauto_approve_tool_changes) now carriesold_hash,old_description,old_schema,old_output_schema,old_annotations, the new values,approved_by,gate_signals,scan_verdict,scan_bundle.scan_default_notice_done, nothing on a fresh install) and amcpproxy doctorfinding name every enabled server with notrust_mode.hold_signal(Go, golden, generated TS consts, Web labels on the hold-evidence chips). Shared fixtureinternal/runtime/testdata/contract_delta_cases.json: Go asserts exact signals (51 cases), vitest asserts every held schema case yields a review line.qapilot.Contract.Shape, fixtureBenignWide, QP-20, scenarios S28/S29, mutations M15–M19.security-quarantine.md"Structural changes are held" with the residual risk stated plainly (paraphrase, one-word edit, text drift, behaviour behind an unchanged definition); spec 119 FR-007 amended; CHANGELOG Breaking Changes entry extended.Behaviour changes to existing tests (intentional)
approved-unknown), not scan-approved; a v4 collision whose live schema changes type is held under scan too.destructiveHint: trueon a tool approved without hints" as a hash-equal, still-approved change now use a title-only annotation change; that hint move is exactly the FR-009 hold.NewToolserves.Verification
go test ./internal/runtime ./internal/qapilot ./internal/config ./internal/telemetry ./internal/storage ./internal/contracts,internal/httpapiSpec 109 goldens, server-tag run ofinternal/server,httpapi,serveredition,cmdwith the CI skip regex,./scripts/test-api-e2e.sh, qapilot conformance +qapilot reportgate, frontend vitest (2762), both golangci-lint configs (only pre-existing findings outside this diff),check-upstream-write-sites.sh,check-no-unquarantine-callers.sh. Cross-model review: opencodegithub-copilot/gpt-6.1-sol, three chunks; findings and fixes listed in the first comment.🤖 Generated with Claude Code