Document v0.3 Mock acceptance and enforce local release gates

This commit is contained in:
2026-09-26 21:37:44 +08:00
parent 210c728de8
commit a687351f25
10 changed files with 146 additions and 36 deletions
+1 -1
View File
@@ -30,4 +30,4 @@ go build -trimpath -buildvcs=false -o "$tmp/sip-go-agent" ./cmd/sip-go-agent
./scripts/mq-integration-local.sh
echo "P1 local F09 checks passed (business-module coverage only; see docs/evidence/f09-local-acceptance-v0.2.md); external SaaS/management, cloud, supplier, SIP, F06 deployment, and production acceptance remain unverified"
echo "P1 local F09 v0.3 checks passed (business-module coverage only; see docs/evidence/f09-local-acceptance-v0.3.md); external SaaS/management, tombstone capacity, cloud, supplier, SIP, deployment, and production acceptance remain unverified"
+5 -5
View File
@@ -56,10 +56,10 @@ def project_sha256(path):
return hashlib.sha256((project / path).read_bytes()).hexdigest()
v01 = json.loads((project / "docs/contracts/local-contract-manifest-v0.1.json").read_text())
v02 = json.loads((project / "docs/contracts/local-contract-manifest-v0.2.json").read_text())
v03 = json.loads((project / "docs/contracts/local-contract-manifest-v0.3.json").read_text())
topology = json.loads((project / "docs/contracts/mq-topology-v0.1-proposal.json").read_text())
if (v01["manifest_version"], v02["manifest_version"], topology["contract_version"]) != (
"local-contract-manifest.v0.1", "local-contract-manifest.v0.2", "project-saas-dispatcher.v0.1"
if (v01["manifest_version"], v03["manifest_version"], topology["contract_version"]) != (
"local-contract-manifest.v0.1", "local-contract-manifest.v0.3", "project-saas-dispatcher.v0.1"
):
raise SystemExit("unexpected project-local contract or queue topology version")
@@ -81,8 +81,8 @@ manifest = {
"manifest_sha256": project_sha256("docs/contracts/local-contract-manifest-v0.1.json"),
},
"task_discovery": {
"version": v02["manifest_version"],
"manifest_sha256": project_sha256("docs/contracts/local-contract-manifest-v0.2.json"),
"version": v03["manifest_version"],
"manifest_sha256": project_sha256("docs/contracts/local-contract-manifest-v0.3.json"),
},
"mq_topology": {
"version": topology["contract_version"],
+23 -9
View File
@@ -61,13 +61,13 @@ assert manifest["binary"]["sha256"] == hashlib.sha256((release / "sip-go-agent")
assert manifest["go_version"].startswith("go version go1.27.1 ")
v01 = json.loads((root / "docs/contracts/local-contract-manifest-v0.1.json").read_text())
v02 = json.loads((root / "docs/contracts/local-contract-manifest-v0.2.json").read_text())
v03 = json.loads((root / "docs/contracts/local-contract-manifest-v0.3.json").read_text())
topology = json.loads((root / "docs/contracts/mq-topology-v0.1-proposal.json").read_text())
assert v01["manifest_version"] == "local-contract-manifest.v0.1"
assert v02["manifest_version"] == "local-contract-manifest.v0.2"
assert v02["source"]["path"] == "docs/thirds/v0.2.md"
assert "docs/contracts/task-discovery-v0.2-proposal.schema.json" in {item["path"] for item in v02["artifacts"]}
assert all("task-discovery-v0.1" not in item["path"] for item in v02["artifacts"])
assert v03["manifest_version"] == "local-contract-manifest.v0.3"
assert v03["source"]["path"] == "docs/thirds/v0.3.md"
assert "docs/contracts/task-discovery-v0.3-proposal.schema.json" in {item["path"] for item in v03["artifacts"]}
assert all("task-discovery-v0.2" not in item["path"] for item in v03["artifacts"])
assert topology["contract_version"] == "project-saas-dispatcher.v0.1"
assert all(topology["queues"][kind]["owner"] == "saas" for kind in ("task", "control", "result"))
assert all(topology["queues"][kind]["queue_name"].endswith(".v3") for kind in ("task", "control", "result"))
@@ -77,8 +77,8 @@ expected_attestation = {
"manifest_sha256": hashlib.sha256((root / "docs/contracts/local-contract-manifest-v0.1.json").read_bytes()).hexdigest(),
},
"task_discovery": {
"version": v02["manifest_version"],
"manifest_sha256": hashlib.sha256((root / "docs/contracts/local-contract-manifest-v0.2.json").read_bytes()).hexdigest(),
"version": v03["manifest_version"],
"manifest_sha256": hashlib.sha256((root / "docs/contracts/local-contract-manifest-v0.3.json").read_bytes()).hexdigest(),
},
"mq_topology": {
"version": topology["contract_version"],
@@ -88,7 +88,7 @@ expected_attestation = {
}
assert manifest["contract_attestation"] == expected_attestation
print("local artifact SHA-256:", manifest["binary"]["sha256"])
print("task discovery source SHA-256:", v02["source"]["sha256"])
print("task discovery source SHA-256:", v03["source"]["sha256"])
print("source dirty:", manifest["source_dirty"])
print("production approved:", manifest["security"]["production_approval"])
PY
@@ -97,6 +97,20 @@ if "$WORK/release/sip-go-agent" dispatcher --help | grep -Eq -- '--tenant-key|--
echo 'release exposes deprecated Dispatcher queue/tenant switches' >&2
exit 1
fi
for mode in mixed real; do
blocked_db="$WORK/blocked-$mode.sqlite"
if SIP_GO_AGENT_MODE="$mode" DISPATCHER_DB="$blocked_db" RABBITMQ_URL='amqp://127.0.0.1:1/' \
DISPATCHER_GRPC_LISTEN='' DISPATCHER_AGENT_ENDPOINTS_FILE='' \
GO_SIP_OSS_ACCESS_KEY_ID='local-test-placeholder' GO_SIP_OSS_ACCESS_KEY_SECRET='local-test-placeholder' \
"$WORK/release/sip-go-agent" dispatcher --config "$ROOT/deploys/config/dispatcher.json.example" > "$WORK/blocked-$mode.log" 2>&1; then
echo "release accepted unapproved $mode execution" >&2
exit 1
fi
if ! grep -q 'isolated Mock only' "$WORK/blocked-$mode.log" || test -e "$blocked_db"; then
echo "release reached resources before rejecting $mode execution" >&2
exit 1
fi
done
rm -- "$PACKAGE_RELEASE/sentinel"
rmdir -- "$PACKAGE_RELEASE"
"$ROOT/deploys/build-package.sh" "$PACKAGE_VERSION" > "$WORK/package.log" 2>&1 || {
@@ -117,6 +131,6 @@ manifest = json.loads((package / "manifest.json").read_text())
assert manifest["version"] == version
assert manifest["scope"] == "local-development"
assert manifest["security"]["production_approval"] is False
assert manifest["contract_attestation"]["task_discovery"]["version"] == "local-contract-manifest.v0.2"
assert manifest["contract_attestation"]["task_discovery"]["version"] == "local-contract-manifest.v0.3"
PY
echo 'F06 local release/package artifact and contract/queue gates passed; no deployment or dial attempted'