diff --git a/contracts/contracts.go b/contracts/contracts.go index 09b6d68..80609e1 100644 --- a/contracts/contracts.go +++ b/contracts/contracts.go @@ -2,19 +2,16 @@ package contracts import ( "embed" - "encoding/json" "fmt" "path" ) -// Files contains the pinned upstream history and only the active local contract. +// Files contains only the active local machine contract. // Runtime code never reads a checkout or resolves schema refs online. // -//go:embed upstream local/*.json local/examples +//go:embed local/*.json local/examples var Files embed.FS -const SourceCommit = "v1" - // ReadCurrent reads the sole active project-local contract, with no fallback // to a historical bundle if a name is missing or invalid. func ReadCurrent(name string) ([]byte, error) { @@ -25,18 +22,3 @@ func ReadCurrent(name string) ([]byte, error) { return nil, fmt.Errorf("invalid current contract %q", name) } } - -func Read(name string) ([]byte, error) { - return Files.ReadFile(path.Join("upstream", SourceCommit, name)) -} - -func ReadJSON(name string, dst any) error { - data, err := Read(name) - if err != nil { - return fmt.Errorf("read contract %s: %w", name, err) - } - if err := json.Unmarshal(data, dst); err != nil { - return fmt.Errorf("decode contract %s: %w", name, err) - } - return nil -} diff --git a/contracts/current_read_test.go b/contracts/current_read_test.go index 92148b4..cb3d020 100644 --- a/contracts/current_read_test.go +++ b/contracts/current_read_test.go @@ -7,19 +7,6 @@ import ( "git.ipao.vip/rogee/go-sip/contracts" ) -func TestPinnedUpstreamBundleRemainsReadable(t *testing.T) { - if body, err := contracts.Read("mq.schema.json"); err != nil || len(body) == 0 { - t.Fatalf("pinned upstream schema missing: bytes=%d err=%v", len(body), err) - } - var schema any - if err := contracts.ReadJSON("mq.schema.json", &schema); err != nil || schema == nil { - t.Fatalf("pinned upstream schema is invalid: %v", err) - } - if _, err := contracts.Read("missing-contract.json"); err == nil { - t.Fatal("missing upstream source was accepted") - } -} - func TestRuntimeBundleExcludesHistoricalLocalContracts(t *testing.T) { for _, name := range []string{ "local/v0.1/call-result-v0.1-proposal.schema.json", diff --git a/contracts/v1_bundle_test.go b/contracts/v1_bundle_test.go index bb710a0..30724de 100644 --- a/contracts/v1_bundle_test.go +++ b/contracts/v1_bundle_test.go @@ -13,7 +13,7 @@ import ( "github.com/santhosh-tekuri/jsonschema/v6" ) -const v1Dir = "upstream/v1" +const v1Dir = "../docs/archive/upstream/v1" const v1Base = "https://go-sip.local/contracts/v1/" type offlineLoader struct{} diff --git a/contracts/v1_jcs_test.go b/contracts/v1_jcs_test.go index 1d3896e..ea41ad9 100644 --- a/contracts/v1_jcs_test.go +++ b/contracts/v1_jcs_test.go @@ -13,7 +13,7 @@ import ( ) func TestV1BundleHashesAndOfflineFixtures(t *testing.T) { - const dir = "upstream/v1" + const dir = "../docs/archive/upstream/v1" var manifest struct { Files map[string]string `json:"files"` } @@ -83,7 +83,7 @@ func TestV1BundleHashesAndOfflineFixtures(t *testing.T) { func TestV1PythonGoJCSGolden(t *testing.T) { var vectors []struct{ Name, Input, Canonical, SHA256 string } - if err := json.Unmarshal(readV1(t, "upstream/v1/jcs-golden.json"), &vectors); err != nil { + if err := json.Unmarshal(readV1(t, "../docs/archive/upstream/v1/jcs-golden.json"), &vectors); err != nil { t.Fatal(err) } for _, vector := range vectors { diff --git a/docs/archive/upstream/README.md b/docs/archive/upstream/README.md new file mode 100644 index 0000000..adc3718 --- /dev/null +++ b/docs/archive/upstream/README.md @@ -0,0 +1,5 @@ +# 上游 v1 原件(历史) + +`manifest.txt` 和 `v1/` 保留原字节,仍按原始路径及 SHA-256 记录来源。`scripts/check-contracts.sh` 将清单中的旧仓库路径映射到此目录做**离线哈希校验**;发布清单也记录这里的历史来源哈希。 + +这是已退役的上游基线,不嵌入 `contracts.Files`,不作为运行回退或当前 SaaS 合同。当前唯一人类可读规范是 [`../../thirds/saas-dispatcher.md`](../../thirds/saas-dispatcher.md);当前机器合同只在 `contracts/local/`。 diff --git a/contracts/upstream/manifest.txt b/docs/archive/upstream/manifest.txt similarity index 100% rename from contracts/upstream/manifest.txt rename to docs/archive/upstream/manifest.txt diff --git a/contracts/upstream/v1/README.md b/docs/archive/upstream/v1/README.md similarity index 100% rename from contracts/upstream/v1/README.md rename to docs/archive/upstream/v1/README.md diff --git a/contracts/upstream/v1/ai-authorization.schema.json b/docs/archive/upstream/v1/ai-authorization.schema.json similarity index 100% rename from contracts/upstream/v1/ai-authorization.schema.json rename to docs/archive/upstream/v1/ai-authorization.schema.json diff --git a/contracts/upstream/v1/ai-config.schema.json b/docs/archive/upstream/v1/ai-config.schema.json similarity index 100% rename from contracts/upstream/v1/ai-config.schema.json rename to docs/archive/upstream/v1/ai-config.schema.json diff --git a/contracts/upstream/v1/dispatcher-config.schema.json b/docs/archive/upstream/v1/dispatcher-config.schema.json similarity index 100% rename from contracts/upstream/v1/dispatcher-config.schema.json rename to docs/archive/upstream/v1/dispatcher-config.schema.json diff --git a/contracts/upstream/v1/event-payloads.schema.json b/docs/archive/upstream/v1/event-payloads.schema.json similarity index 100% rename from contracts/upstream/v1/event-payloads.schema.json rename to docs/archive/upstream/v1/event-payloads.schema.json diff --git a/contracts/upstream/v1/examples/agent-version-asr-only.json b/docs/archive/upstream/v1/examples/agent-version-asr-only.json similarity index 100% rename from contracts/upstream/v1/examples/agent-version-asr-only.json rename to docs/archive/upstream/v1/examples/agent-version-asr-only.json diff --git a/contracts/upstream/v1/examples/agent-version-full-explicit.json b/docs/archive/upstream/v1/examples/agent-version-full-explicit.json similarity index 100% rename from contracts/upstream/v1/examples/agent-version-full-explicit.json rename to docs/archive/upstream/v1/examples/agent-version-full-explicit.json diff --git a/contracts/upstream/v1/examples/agent-version-full-production-v1.json b/docs/archive/upstream/v1/examples/agent-version-full-production-v1.json similarity index 100% rename from contracts/upstream/v1/examples/agent-version-full-production-v1.json rename to docs/archive/upstream/v1/examples/agent-version-full-production-v1.json diff --git a/contracts/upstream/v1/examples/agent-version.json b/docs/archive/upstream/v1/examples/agent-version.json similarity index 100% rename from contracts/upstream/v1/examples/agent-version.json rename to docs/archive/upstream/v1/examples/agent-version.json diff --git a/contracts/upstream/v1/examples/ai-authorization.json b/docs/archive/upstream/v1/examples/ai-authorization.json similarity index 100% rename from contracts/upstream/v1/examples/ai-authorization.json rename to docs/archive/upstream/v1/examples/ai-authorization.json diff --git a/contracts/upstream/v1/examples/ai-config-request.json b/docs/archive/upstream/v1/examples/ai-config-request.json similarity index 100% rename from contracts/upstream/v1/examples/ai-config-request.json rename to docs/archive/upstream/v1/examples/ai-config-request.json diff --git a/contracts/upstream/v1/examples/ai-config-result.json b/docs/archive/upstream/v1/examples/ai-config-result.json similarity index 100% rename from contracts/upstream/v1/examples/ai-config-result.json rename to docs/archive/upstream/v1/examples/ai-config-result.json diff --git a/contracts/upstream/v1/examples/call-execute.json b/docs/archive/upstream/v1/examples/call-execute.json similarity index 100% rename from contracts/upstream/v1/examples/call-execute.json rename to docs/archive/upstream/v1/examples/call-execute.json diff --git a/contracts/upstream/v1/examples/call-query-result.json b/docs/archive/upstream/v1/examples/call-query-result.json similarity index 100% rename from contracts/upstream/v1/examples/call-query-result.json rename to docs/archive/upstream/v1/examples/call-query-result.json diff --git a/contracts/upstream/v1/examples/call-query.json b/docs/archive/upstream/v1/examples/call-query.json similarity index 100% rename from contracts/upstream/v1/examples/call-query.json rename to docs/archive/upstream/v1/examples/call-query.json diff --git a/contracts/upstream/v1/examples/call-replay.json b/docs/archive/upstream/v1/examples/call-replay.json similarity index 100% rename from contracts/upstream/v1/examples/call-replay.json rename to docs/archive/upstream/v1/examples/call-replay.json diff --git a/contracts/upstream/v1/examples/command-query-result.json b/docs/archive/upstream/v1/examples/command-query-result.json similarity index 100% rename from contracts/upstream/v1/examples/command-query-result.json rename to docs/archive/upstream/v1/examples/command-query-result.json diff --git a/contracts/upstream/v1/examples/command-query.json b/docs/archive/upstream/v1/examples/command-query.json similarity index 100% rename from contracts/upstream/v1/examples/command-query.json rename to docs/archive/upstream/v1/examples/command-query.json diff --git a/contracts/upstream/v1/examples/command-replay.json b/docs/archive/upstream/v1/examples/command-replay.json similarity index 100% rename from contracts/upstream/v1/examples/command-replay.json rename to docs/archive/upstream/v1/examples/command-replay.json diff --git a/contracts/upstream/v1/examples/dispatcher-config.json b/docs/archive/upstream/v1/examples/dispatcher-config.json similarity index 100% rename from contracts/upstream/v1/examples/dispatcher-config.json rename to docs/archive/upstream/v1/examples/dispatcher-config.json diff --git a/contracts/upstream/v1/examples/event-call-finished.json b/docs/archive/upstream/v1/examples/event-call-finished.json similarity index 100% rename from contracts/upstream/v1/examples/event-call-finished.json rename to docs/archive/upstream/v1/examples/event-call-finished.json diff --git a/contracts/upstream/v1/examples/event-call-status.json b/docs/archive/upstream/v1/examples/event-call-status.json similarity index 100% rename from contracts/upstream/v1/examples/event-call-status.json rename to docs/archive/upstream/v1/examples/event-call-status.json diff --git a/contracts/upstream/v1/examples/event-command-result.json b/docs/archive/upstream/v1/examples/event-command-result.json similarity index 100% rename from contracts/upstream/v1/examples/event-command-result.json rename to docs/archive/upstream/v1/examples/event-command-result.json diff --git a/contracts/upstream/v1/examples/event-contact-opt-out.json b/docs/archive/upstream/v1/examples/event-contact-opt-out.json similarity index 100% rename from contracts/upstream/v1/examples/event-contact-opt-out.json rename to docs/archive/upstream/v1/examples/event-contact-opt-out.json diff --git a/contracts/upstream/v1/examples/event-recording-failed.json b/docs/archive/upstream/v1/examples/event-recording-failed.json similarity index 100% rename from contracts/upstream/v1/examples/event-recording-failed.json rename to docs/archive/upstream/v1/examples/event-recording-failed.json diff --git a/contracts/upstream/v1/examples/event-recording-uploaded.json b/docs/archive/upstream/v1/examples/event-recording-uploaded.json similarity index 100% rename from contracts/upstream/v1/examples/event-recording-uploaded.json rename to docs/archive/upstream/v1/examples/event-recording-uploaded.json diff --git a/contracts/upstream/v1/examples/event-transcript-failed.json b/docs/archive/upstream/v1/examples/event-transcript-failed.json similarity index 100% rename from contracts/upstream/v1/examples/event-transcript-failed.json rename to docs/archive/upstream/v1/examples/event-transcript-failed.json diff --git a/contracts/upstream/v1/examples/event-transcript-updated.json b/docs/archive/upstream/v1/examples/event-transcript-updated.json similarity index 100% rename from contracts/upstream/v1/examples/event-transcript-updated.json rename to docs/archive/upstream/v1/examples/event-transcript-updated.json diff --git a/contracts/upstream/v1/examples/invalid-ai-authorization-revoked.json b/docs/archive/upstream/v1/examples/invalid-ai-authorization-revoked.json similarity index 100% rename from contracts/upstream/v1/examples/invalid-ai-authorization-revoked.json rename to docs/archive/upstream/v1/examples/invalid-ai-authorization-revoked.json diff --git a/contracts/upstream/v1/examples/invalid-asr-only-with-llm.json b/docs/archive/upstream/v1/examples/invalid-asr-only-with-llm.json similarity index 100% rename from contracts/upstream/v1/examples/invalid-asr-only-with-llm.json rename to docs/archive/upstream/v1/examples/invalid-asr-only-with-llm.json diff --git a/contracts/upstream/v1/examples/invalid-call-query-extra.json b/docs/archive/upstream/v1/examples/invalid-call-query-extra.json similarity index 100% rename from contracts/upstream/v1/examples/invalid-call-query-extra.json rename to docs/archive/upstream/v1/examples/invalid-call-query-extra.json diff --git a/contracts/upstream/v1/examples/invalid-correlation.json b/docs/archive/upstream/v1/examples/invalid-correlation.json similarity index 100% rename from contracts/upstream/v1/examples/invalid-correlation.json rename to docs/archive/upstream/v1/examples/invalid-correlation.json diff --git a/contracts/upstream/v1/examples/invalid-dispatcher.json b/docs/archive/upstream/v1/examples/invalid-dispatcher.json similarity index 100% rename from contracts/upstream/v1/examples/invalid-dispatcher.json rename to docs/archive/upstream/v1/examples/invalid-dispatcher.json diff --git a/contracts/upstream/v1/examples/invalid-oss-upload-http.json b/docs/archive/upstream/v1/examples/invalid-oss-upload-http.json similarity index 100% rename from contracts/upstream/v1/examples/invalid-oss-upload-http.json rename to docs/archive/upstream/v1/examples/invalid-oss-upload-http.json diff --git a/contracts/upstream/v1/examples/invalid-v1.json b/docs/archive/upstream/v1/examples/invalid-v1.json similarity index 100% rename from contracts/upstream/v1/examples/invalid-v1.json rename to docs/archive/upstream/v1/examples/invalid-v1.json diff --git a/contracts/upstream/v1/examples/invalid-wildcard.json b/docs/archive/upstream/v1/examples/invalid-wildcard.json similarity index 100% rename from contracts/upstream/v1/examples/invalid-wildcard.json rename to docs/archive/upstream/v1/examples/invalid-wildcard.json diff --git a/contracts/upstream/v1/examples/oss-upload-grant.json b/docs/archive/upstream/v1/examples/oss-upload-grant.json similarity index 100% rename from contracts/upstream/v1/examples/oss-upload-grant.json rename to docs/archive/upstream/v1/examples/oss-upload-grant.json diff --git a/contracts/upstream/v1/examples/query-pending.json b/docs/archive/upstream/v1/examples/query-pending.json similarity index 100% rename from contracts/upstream/v1/examples/query-pending.json rename to docs/archive/upstream/v1/examples/query-pending.json diff --git a/contracts/upstream/v1/examples/query-rejected.json b/docs/archive/upstream/v1/examples/query-rejected.json similarity index 100% rename from contracts/upstream/v1/examples/query-rejected.json rename to docs/archive/upstream/v1/examples/query-rejected.json diff --git a/contracts/upstream/v1/examples/static-cell-artifact-real-v1.json b/docs/archive/upstream/v1/examples/static-cell-artifact-real-v1.json similarity index 100% rename from contracts/upstream/v1/examples/static-cell-artifact-real-v1.json rename to docs/archive/upstream/v1/examples/static-cell-artifact-real-v1.json diff --git a/contracts/upstream/v1/examples/static-cell-artifact.json b/docs/archive/upstream/v1/examples/static-cell-artifact.json similarity index 100% rename from contracts/upstream/v1/examples/static-cell-artifact.json rename to docs/archive/upstream/v1/examples/static-cell-artifact.json diff --git a/contracts/upstream/v1/examples/task-control.json b/docs/archive/upstream/v1/examples/task-control.json similarity index 100% rename from contracts/upstream/v1/examples/task-control.json rename to docs/archive/upstream/v1/examples/task-control.json diff --git a/contracts/upstream/v1/fixtures.json b/docs/archive/upstream/v1/fixtures.json similarity index 100% rename from contracts/upstream/v1/fixtures.json rename to docs/archive/upstream/v1/fixtures.json diff --git a/contracts/upstream/v1/jcs-golden.json b/docs/archive/upstream/v1/jcs-golden.json similarity index 100% rename from contracts/upstream/v1/jcs-golden.json rename to docs/archive/upstream/v1/jcs-golden.json diff --git a/contracts/upstream/v1/manifest.json b/docs/archive/upstream/v1/manifest.json similarity index 100% rename from contracts/upstream/v1/manifest.json rename to docs/archive/upstream/v1/manifest.json diff --git a/contracts/upstream/v1/mq-topology.json b/docs/archive/upstream/v1/mq-topology.json similarity index 100% rename from contracts/upstream/v1/mq-topology.json rename to docs/archive/upstream/v1/mq-topology.json diff --git a/contracts/upstream/v1/mq.schema.json b/docs/archive/upstream/v1/mq.schema.json similarity index 100% rename from contracts/upstream/v1/mq.schema.json rename to docs/archive/upstream/v1/mq.schema.json diff --git a/contracts/upstream/v1/oss-upload.schema.json b/docs/archive/upstream/v1/oss-upload.schema.json similarity index 100% rename from contracts/upstream/v1/oss-upload.schema.json rename to docs/archive/upstream/v1/oss-upload.schema.json diff --git a/contracts/upstream/v1/p1-development-profile.json b/docs/archive/upstream/v1/p1-development-profile.json similarity index 100% rename from contracts/upstream/v1/p1-development-profile.json rename to docs/archive/upstream/v1/p1-development-profile.json diff --git a/contracts/upstream/v1/p1-development-profile.schema.json b/docs/archive/upstream/v1/p1-development-profile.schema.json similarity index 100% rename from contracts/upstream/v1/p1-development-profile.schema.json rename to docs/archive/upstream/v1/p1-development-profile.schema.json diff --git a/contracts/upstream/v1/static-cell-artifact.schema.json b/docs/archive/upstream/v1/static-cell-artifact.schema.json similarity index 100% rename from contracts/upstream/v1/static-cell-artifact.schema.json rename to docs/archive/upstream/v1/static-cell-artifact.schema.json diff --git a/scripts/build-release.sh b/scripts/build-release.sh index 212f334..2149ba6 100755 --- a/scripts/build-release.sh +++ b/scripts/build-release.sh @@ -70,7 +70,7 @@ manifest = { "contract_attestation": { "local_contract_manifest_sha256": project_sha256("contracts/local/manifest.json"), "local_mq_topology_sha256": project_sha256("contracts/local/mq-topology.json"), - "historical_upstream_manifest_sha256": project_sha256("contracts/upstream/manifest.txt"), + "historical_upstream_manifest_sha256": project_sha256("docs/archive/upstream/manifest.txt"), "proto_manifest_sha256": project_sha256("proto/manifest.json"), }, "security": { diff --git a/scripts/check-contracts.sh b/scripts/check-contracts.sh index 2c3fe3e..6acb782 100755 --- a/scripts/check-contracts.sh +++ b/scripts/check-contracts.sh @@ -2,13 +2,13 @@ set -eu root=$(CDPATH= cd -- "$(dirname -- "$0")/.." && pwd) -manifest="$root/contracts/upstream/manifest.txt" +manifest="$root/docs/archive/upstream/manifest.txt" [ -f "$manifest" ] || { echo "missing contract manifest" >&2; exit 1; } bundle=$(sed -n 's/^active_bundle=//p' "$manifest") [ -n "$bundle" ] || { echo "missing active contract bundle" >&2; exit 1; } -[ -d "$root/contracts/upstream/$bundle" ] || { echo "missing pinned contract directory: $bundle" >&2; exit 1; } +[ -d "$root/docs/archive/upstream/$bundle" ] || { echo "missing archived contract directory: $bundle" >&2; exit 1; } cd "$root" -grep '^sha256=' "$manifest" | sed 's/^sha256=//' | sha256sum -c - +grep '^sha256=' "$manifest" | sed -e 's/^sha256=//' -e "s% contracts/upstream/$bundle/% docs/archive/upstream/$bundle/%" | sha256sum -c - bash scripts/check-current-contracts.sh go test ./contracts ./internal/contract ./internal/ai diff --git a/scripts/check-release-gates-local.sh b/scripts/check-release-gates-local.sh index 69e57c9..bc9108e 100755 --- a/scripts/check-release-gates-local.sh +++ b/scripts/check-release-gates-local.sh @@ -68,7 +68,7 @@ assert topology["saas"]["result"]["queue"].endswith(".v1") expected_attestation = { "local_contract_manifest_sha256": hashlib.sha256((root / "contracts/local/manifest.json").read_bytes()).hexdigest(), "local_mq_topology_sha256": hashlib.sha256((root / "contracts/local/mq-topology.json").read_bytes()).hexdigest(), - "historical_upstream_manifest_sha256": hashlib.sha256((root / "contracts/upstream/manifest.txt").read_bytes()).hexdigest(), + "historical_upstream_manifest_sha256": hashlib.sha256((root / "docs/archive/upstream/manifest.txt").read_bytes()).hexdigest(), "proto_manifest_sha256": hashlib.sha256((root / "proto/manifest.json").read_bytes()).hexdigest(), } assert manifest["contract_attestation"] == expected_attestation