Two compatibility carve-outs, written alongside the existing interface_type retirement allowance. Both cover declarative provenance metadata that nothing reads at runtime: the tool a leaf invokes is decided in the CLI source, so a stale interface_ref or property misinforms a reader rather than misrouting a call. Neither carve-out can mask a change to the surface callers depend on. Cleared property through a reviewed mapping exclusion. A leaf whose backing RPC moves to a nested payload has no honest flat property to publish. The two alternatives are worse: keep naming a field the request no longer contains, or let assembly fall back to flag_name_inference and publish a name that appears in no request at all. Accepted only when the old value was non-empty, the new value is empty, and the new value resolved through reviewed_mapping_exclusion. A redirect to a different non-empty value, a clearing by inference or native annotation, a clearing with no recorded source, and populating a previously empty property all stay incompatible. The exclusion table cannot be abused to wave arbitrary clearing through: internal/cli/schema_parameter_bindings.go verifies every parameter claiming an exclusion really does deliver an empty property, and every entry carries a non-empty reviewed reason. Redirected interface_ref with an unchanged CLI contract. Accepted only when interface_mode is unchanged and stays mcp, both refs are non-empty, and no other compatibility failure was recorded for that tool. That last condition is the operative definition of "the contract is unchanged" — it is measured, not asserted, so it automatically covers a lost parameter, a newly required one, a moved type / default / format / enum, a tightened constraint, a positional or dry_run change, and any effect / risk / confirmation / idempotency move. Any one of them re-reports the redirect, so a surface change cannot ride along behind a backend move. Moving to or from composite is a change in kind rather than a redirect and stays reported; so does removing a ref outright. Deliberately still incompatible: mcp -> composite with the ref dropped. That is a leaf declaring it now orchestrates several RPCs, which is a semantic upgrade rather than a like-for-like substitution, and it belongs in review. For this branch the two carve-outs take schema-compatibility from 17 changed fields to 4 — the twelve sheet.range_set_style property clearings and its update_range -> set_cell_range redirect are now accepted. The remaining four are the interface_mode plus interface_ref pairs on sheet.create_workspace_sheet and sheet.submit_export_job. Tests: TestCrossPlatformCoverageSchemaCompatPropertyClearingExclusion and TestCrossPlatformCoverageSchemaCompatInterfaceRefRedirect assert the accepted shapes plus twelve neighbouring shapes that must stay incompatible; the drift table gains cases for clearing without an exclusion and redirecting despite one.
Go Bootstrap Scripts
These repo-local entrypoints are the supported shell entrypoints for building, testing, packaging, and policy checks.
make build: build thedwsCLI fromcmdmake test: run every default package returned bygo list ./...make test-plan: verify every default Go package belongs to exactly one CI test shardmake lint: run the repository-wide format check,go vet, and requiredstaticcheckmake format-check: check every tracked or non-ignored untracked repository Go source file withgofmtmake fmt: format every tracked or non-ignored untracked repository Go source filemake policy: reuse the currentdwsbinary and run the complete policy suite (make buildfirst)make package: build all release artifacts locallymake release-pre VERSION=vX.Y.Z-beta.N: validate a prerelease (PUBLISH=1pushes its tag)make release-stable VERSION=vX.Y.Z FROM_BETA=vX.Y.Z-beta.N: validate a stable promotion (PUBLISH=1pushes its tag)
Script groups:
- Root installers:
./scripts/install.sh,./scripts/install.ps1,./scripts/install-skills.sh - Product convenience installers:
./scripts/install-devapp.sh,./scripts/install-devapp.ps1,./scripts/install-event.sh - CI package plan:
./scripts/ci/test-packages.sh - Dev helpers:
./scripts/dev/build.sh,./scripts/dev/lint.sh,./scripts/dev/ci-local.sh,./scripts/dev/run-mock-e2e.sh,./scripts/dev/coverage.sh - Policy checks:
./scripts/policy/check-generated-drift.sh,./scripts/policy/check-command-surface.sh,./scripts/policy/check-command-compatibility.sh --base-ref <main-ref> --stable-ref <latest-GA-tag>,./scripts/policy/check-schema-catalog.sh,./scripts/policy/check-schema-binary.sh,./scripts/policy/check-open-source-assets.sh - Policy runtime files: set
DWS_POLICY_TMPDIRto override the default.worktrees/policy-tmpworkspace - Release entrypoint and contract:
./scripts/release/release.sh,./scripts/release/release-contract.sh; operator guide:docs/releasing.md - Release packaging helpers:
./scripts/release/post-goreleaser.sh,./scripts/release/stage-npm-package.sh,./scripts/release/pack-npm-package.sh,./scripts/release/verify-delivered-stable.sh,./scripts/release/verify-release-artifacts.sh,./scripts/release/verify-github-release-assets.sh,./scripts/release/verify-github-tag-authority.sh,./scripts/release/verify-package-managers.sh,./scripts/release/publish-homebrew-formula.sh