Skip to content

Commit 3df39c8

Browse files
committed
separate DeltaWire v4 measurement evidence
1 parent 07e341f commit 3df39c8

48 files changed

Lines changed: 1339 additions & 0 deletions

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
name: Verify DeltaWire preflight v4
2+
3+
on:
4+
push:
5+
branches: [eval/deltawire-preflight-v4]
6+
pull_request:
7+
paths:
8+
- "labs/20-deltawire/**"
9+
- ".github/workflows/deltawire-preflight-v4.yml"
10+
11+
permissions:
12+
contents: read
13+
14+
jobs:
15+
validate-v4:
16+
runs-on: ubuntu-latest
17+
steps:
18+
- uses: actions/checkout@v7
19+
with:
20+
fetch-depth: 0
21+
- uses: actions/setup-go@v7
22+
with:
23+
go-version-file: labs/20-deltawire/go.mod
24+
- uses: actions/setup-python@v6
25+
with:
26+
python-version: "3.11"
27+
- run: bash labs/20-deltawire/scripts/validate.sh
28+
- run: bash labs/20-deltawire/eval/scripts/v4/validate.sh
Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
{
2+
"immutable_files": {
3+
"labs/20-deltawire/eval/manifests/preflight-v2-evidence-lock.json": "dfaa4350681a36bcadef1e00d52bd90e16b2cf72638928ba2d0bc42b7af8f1b8",
4+
"labs/20-deltawire/eval/manifests/preflight-v3-range-large.json": "bc219bbabbc8765a036b873313bed7aed62ffdcee0da570c703b64130d278a29",
5+
"labs/20-deltawire/eval/matrices/72-run-matrix.json": "f9dcddc4b7336418c7e2b8e7a7e51ca1e42b5a137255ff0823a732618f3568d5",
6+
"labs/20-deltawire/eval/probes/range-large-v3/authoritative-schema.json": "2fe7bdc8de996a09ccc651f42611dc88faee60c7390b36c62443ed3e523800b5",
7+
"labs/20-deltawire/eval/probes/range-large-v3/environment/.deltawire/config.json": "673b9cf053e3ba2263bfbc49034360ed8dba8d959bd167f8ff4b1f7cb4302b6f",
8+
"labs/20-deltawire/eval/probes/range-large-v3/environment/.deltawire/schemas/range-large.schema.json": "2fe7bdc8de996a09ccc651f42611dc88faee60c7390b36c62443ed3e523800b5",
9+
"labs/20-deltawire/eval/probes/range-large-v3/environment/Dockerfile": "0d4281bcb20ed360a4815c6170b1bd3fa65beaf51942d7203809b075ca4d3ead",
10+
"labs/20-deltawire/eval/probes/range-large-v3/environment/task-contract.json": "d3e1b7b3e5a4576540b3a2969d59f49818c7c0a12197b26d271e7e277b0054e5",
11+
"labs/20-deltawire/eval/probes/range-large-v3/environment/verify_plan_contract.py": "8aafe73ab47213027a258f9abbebbca4803fa53f658abeb7b405d4a79202d4af",
12+
"labs/20-deltawire/eval/probes/range-large-v3/instruction.md": "2c1086bd55056b63c89bbb359fdb7a32168ce6c9598d02d6c084a52ad46e9af9",
13+
"labs/20-deltawire/eval/probes/range-large-v3/task-spec.json": "d3e1b7b3e5a4576540b3a2969d59f49818c7c0a12197b26d271e7e277b0054e5",
14+
"labs/20-deltawire/eval/probes/range-large-v3/task.toml": "854a1379edee3d090dfe85265753bcd045d192ccbd21e71a2003ac037436a49a",
15+
"labs/20-deltawire/eval/probes/range-large-v3/tests/semantic_oracle.py": "94b30fac117f40e977851966b5228e6c372bb48cbf2e5c29c24f428e1f98e91d",
16+
"labs/20-deltawire/eval/probes/range-large-v3/tests/task-spec.json": "d3e1b7b3e5a4576540b3a2969d59f49818c7c0a12197b26d271e7e277b0054e5",
17+
"labs/20-deltawire/eval/probes/range-large-v3/tests/test.sh": "8fc106530f63500be0aace428a5dbf3e08567feb2adc40968029cb7d7a95afbc",
18+
"labs/20-deltawire/eval/results/preflight-v3/index.json": "cab7fd3dffdf486d77b6ad7a144025d5c0b0bbd0708e823c9cf0c0261d6dfbe0",
19+
"labs/20-deltawire/eval/results/preflight-v3/readiness.json": "26ae7263a63c96d6565131080c1b95dfe92b954b31c408003cdd9cf5d9bb9875",
20+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/D1-derived-assessment.json": "a802fc15372556197d3e274aff8e308c0208b396bdf11bb3656a6a360b384172",
21+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/D1-plan-contract-receipt.json": "dcf531cd8e86207a951aa9e43e80d45d7a9f8df5e3baa224feafbc2de3dd6fa0",
22+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/D1-semantic-result.json": "3e80260f930364f1b72255ed9898862e641536a8c6e84a75e9a4cbea3d1b46bb",
23+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/D1-treatment-fidelity.json": "394054b28824efc34eb26cad91c135b10933657cf6c8ec788c19b219b15cb5ad",
24+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/raw/D1/2026-07-22__12-00-56/config.json": "e8c95ea651adc99ac412322e2e08b735ef002fdab283a1e9c2a2f968698fd60c",
25+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/raw/D1/2026-07-22__12-00-56/job.log": "689ee87a1b8ced2b1c159103d7a329c91b889c1e971637a428ee0847ba03412b",
26+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/raw/D1/2026-07-22__12-00-56/lock.json": "4fdb9e97b806a06eb7a952310e25329e9dd30b768392ce4062903b83f8e4a048",
27+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/raw/D1/2026-07-22__12-00-56/range-large-v3__wx2HCht/agent/gemini-cli.trajectory.jsonl": "069cfca7ba46baf5757e809de50e53a656973f5b0a0fbe597a1cf763dce4cd27",
28+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/raw/D1/2026-07-22__12-00-56/range-large-v3__wx2HCht/agent/gemini-cli.txt": "54f08f9e9112fe5b46cb1f17fa6866496b58293f07d3b65a96ce82d0b6eb38f6",
29+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/raw/D1/2026-07-22__12-00-56/range-large-v3__wx2HCht/agent/trajectory.json": "6ddaaa2b6b582fd56f600a29bf78fb6bf74d1bf39d2bb668c0b00793fa2e0a68",
30+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/raw/D1/2026-07-22__12-00-56/range-large-v3__wx2HCht/artifacts/.deltawire/config.json": "673b9cf053e3ba2263bfbc49034360ed8dba8d959bd167f8ff4b1f7cb4302b6f",
31+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/raw/D1/2026-07-22__12-00-56/range-large-v3__wx2HCht/artifacts/.deltawire/plan-contract-receipt.json": "dcf531cd8e86207a951aa9e43e80d45d7a9f8df5e3baa224feafbc2de3dd6fa0",
32+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/raw/D1/2026-07-22__12-00-56/range-large-v3__wx2HCht/artifacts/.deltawire/plans/range-large.dw.json": "2021238a6573d8cf11477fb1d2656b9586b84415335edf69be4ff8fc74ef3a77",
33+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/raw/D1/2026-07-22__12-00-56/range-large-v3__wx2HCht/artifacts/.deltawire/schemas/range-large.schema.json": "2fe7bdc8de996a09ccc651f42611dc88faee60c7390b36c62443ed3e523800b5",
34+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/raw/D1/2026-07-22__12-00-56/range-large-v3__wx2HCht/artifacts/manifest.json": "639ca0ff42307921ded25177e8d0343df7be9621011c7235f6593835f78a4188",
35+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/raw/D1/2026-07-22__12-00-56/range-large-v3__wx2HCht/artifacts/testdata/generated/output.ndjson": "9d205b57ab166d23c81927899f99b6ccece261c679c96979c58fbde975637776",
36+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/raw/D1/2026-07-22__12-00-56/range-large-v3__wx2HCht/config.json": "c6d8111f06134293971b16d7690b5f81b5a43c4d8356c04bd650fdb29a1f4a3c",
37+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/raw/D1/2026-07-22__12-00-56/range-large-v3__wx2HCht/lock.json": "66447eea0f175e275254a4f87ed377b6409328860335b917a2a390bd74e47a16",
38+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/raw/D1/2026-07-22__12-00-56/range-large-v3__wx2HCht/result.json": "e787ad6ecf1f83810124e0d9e0e1a63d829bbd6d587d2b5d9586735ecf89c068",
39+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/raw/D1/2026-07-22__12-00-56/range-large-v3__wx2HCht/trial.log": "689ee87a1b8ced2b1c159103d7a329c91b889c1e971637a428ee0847ba03412b",
40+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/raw/D1/2026-07-22__12-00-56/range-large-v3__wx2HCht/verifier/reward.json": "36a492513204040f04d7bdf4146d84ede71353d8cc7df112fc3ebff66327683a",
41+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/raw/D1/2026-07-22__12-00-56/range-large-v3__wx2HCht/verifier/test-stdout.txt": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
42+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/raw/D1/2026-07-22__12-00-56/result.json": "27356b5f2bee385d3d9ee465dbef77a518c10d76e7348deb99578eb395a1d7a3",
43+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/redaction.json": "afd1361d1db4b96aae9fbfdc972d80c67aa9d490567417bc47ed68bff29a62ca",
44+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/report.md": "b3cae2d8e3239d4667eb36dcd1c658fc1def98c4031fa6a6d252af8a3df65b41",
45+
"labs/20-deltawire/eval/results/preflight-v3/treatment-probe-range-large-v3/run-ledger.json": "3bcdc70b82afdfcf6b2200cba7042032d6f24abbf55dc7f148438d2e4234d99e",
46+
"labs/20-deltawire/eval/scripts/fidelity.py": "f5bd8c7bf1ae7f3d99f681f1c2edf9ffb3a7bface84e28fc96a9f2ec2bffd350",
47+
"labs/20-deltawire/eval/scripts/generate_preflight_v3_manifest.py": "a3b79335eac24626fddeb91b874151d42996ef9accfb40b72407c16c28f00515",
48+
"labs/20-deltawire/eval/scripts/runner.py": "ba28350a7546a7284834aed702a5934585b50cc4534a519c09332a1e28e17825",
49+
"labs/20-deltawire/eval/scripts/semantic_oracle.py": "94b30fac117f40e977851966b5228e6c372bb48cbf2e5c29c24f428e1f98e91d",
50+
"labs/20-deltawire/eval/scripts/task_contracts.py": "e72514979104f539d431fec7f400d2067a45c0d0814bc054bc937ff113c1fee2",
51+
"labs/20-deltawire/eval/scripts/test_fidelity.py": "90708e8f2c29b53fc2c5b6a3e2f3738ba179f96c2503e257445c3ff2fdf6bab3",
52+
"labs/20-deltawire/eval/scripts/test_runner_gates.py": "9c070d68893782362548b281eeccb4bdb6110a75624dee63a18b1e48948d278b",
53+
"labs/20-deltawire/eval/scripts/validate_preflight.py": "3220c8ecd8fb5139871fa7b93a64497efbea5c8ae57280a207184168f44ff159",
54+
"labs/20-deltawire/eval/scripts/verify_plan_contract.py": "8aafe73ab47213027a258f9abbebbca4803fa53f658abeb7b405d4a79202d4af",
55+
"labs/20-deltawire/eval/skills/deltawire/SKILL.md": "b1c5ed8e1abd0bf4e2031d887657bbfbc79204eed5c9d48a97fa1fbf50c5695f",
56+
"labs/20-deltawire/eval/tasks/range-large/authoritative-schema.json": "2fe7bdc8de996a09ccc651f42611dc88faee60c7390b36c62443ed3e523800b5",
57+
"labs/20-deltawire/eval/tasks/range-large/environment/.deltawire/config.json": "673b9cf053e3ba2263bfbc49034360ed8dba8d959bd167f8ff4b1f7cb4302b6f",
58+
"labs/20-deltawire/eval/tasks/range-large/environment/.deltawire/schemas/range-large.schema.json": "2fe7bdc8de996a09ccc651f42611dc88faee60c7390b36c62443ed3e523800b5",
59+
"labs/20-deltawire/eval/tasks/range-large/environment/Dockerfile": "0d4281bcb20ed360a4815c6170b1bd3fa65beaf51942d7203809b075ca4d3ead",
60+
"labs/20-deltawire/eval/tasks/range-large/environment/task-contract.json": "d3e1b7b3e5a4576540b3a2969d59f49818c7c0a12197b26d271e7e277b0054e5",
61+
"labs/20-deltawire/eval/tasks/range-large/environment/verify_plan_contract.py": "8aafe73ab47213027a258f9abbebbca4803fa53f658abeb7b405d4a79202d4af",
62+
"labs/20-deltawire/eval/tasks/range-large/instruction.md": "549f4047b1a4ba4f7a3f3dce9e60d1d70b141caa189aafdba942b15e6d022aee",
63+
"labs/20-deltawire/eval/tasks/range-large/task-spec.json": "d3e1b7b3e5a4576540b3a2969d59f49818c7c0a12197b26d271e7e277b0054e5",
64+
"labs/20-deltawire/eval/tasks/range-large/task.toml": "b7d4eff84bfbab08d514e1f39b58cdaaa1e925f4b28e09ec1e160041a45ef6b8",
65+
"labs/20-deltawire/eval/tasks/range-large/tests/semantic_oracle.py": "94b30fac117f40e977851966b5228e6c372bb48cbf2e5c29c24f428e1f98e91d",
66+
"labs/20-deltawire/eval/tasks/range-large/tests/task-spec.json": "d3e1b7b3e5a4576540b3a2969d59f49818c7c0a12197b26d271e7e277b0054e5",
67+
"labs/20-deltawire/eval/tasks/range-large/tests/test.sh": "8fc106530f63500be0aace428a5dbf3e08567feb2adc40968029cb7d7a95afbc"
68+
},
69+
"schema_version": "git-evidence-lock.v1",
70+
"source_commit": "07e341fd213b6deb17cce9115263cebe8ba2105f",
71+
"source_tree": "cfad619db42d4426e464836d0e2be2de8384ddac"
72+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"$schema": "https://json-schema.org/draft/2020-12/schema",
3+
"additionalProperties": false,
4+
"properties": {
5+
"index": {
6+
"maximum": 500,
7+
"minimum": 1,
8+
"type": "integer"
9+
}
10+
},
11+
"required": [
12+
"index"
13+
],
14+
"title": "range-large",
15+
"type": "object"
16+
}
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"limits": {
3+
"max_output_bytes": 104857600,
4+
"max_plan_bytes": 1048576,
5+
"max_records": 100000,
6+
"max_schema_bytes": 1048576
7+
},
8+
"plans_dir": ".deltawire/plans",
9+
"schemas_dir": ".deltawire/schemas",
10+
"state_file": ".deltawire/state.json",
11+
"version": "deltawire.config.v1"
12+
}
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
{
2+
"$schema": "https://json-schema.org/draft/2020-12/schema",
3+
"additionalProperties": false,
4+
"properties": {
5+
"index": {
6+
"maximum": 500,
7+
"minimum": 1,
8+
"type": "integer"
9+
}
10+
},
11+
"required": [
12+
"index"
13+
],
14+
"title": "range-large",
15+
"type": "object"
16+
}
Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
FROM ubuntu:22.04
2+
COPY .generated/deltawire /usr/local/bin/deltawire
3+
COPY task-contract.json /task-contract.json
4+
COPY .deltawire /.deltawire
5+
COPY verify_plan_contract.py /usr/local/bin/verify_plan_contract.py
6+
COPY environment_receipt.py /usr/local/bin/environment_receipt.py
7+
COPY deltawire-environment-expectations.json /deltawire-environment-expectations.json
8+
RUN chmod 0755 /usr/local/bin/deltawire /usr/local/bin/verify_plan_contract.py /usr/local/bin/environment_receipt.py && chmod a-w /task-contract.json /.deltawire/config.json /.deltawire/schemas/*.json /deltawire-environment-expectations.json
9+
RUN command -v deltawire && deltawire version
10+
RUN apt-get update && apt-get install -y python3
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
{
2+
"schema_version": "deltawire-environment-expectations.v1",
3+
"binary": {
4+
"path": "/usr/local/bin/deltawire",
5+
"realpath": "/usr/local/bin/deltawire",
6+
"sha256": "453819efd1afe30b7e1815507de67b3150374955970a77231ce89a7a738c33c6",
7+
"version": "deltawire version dev"
8+
},
9+
"files": {
10+
"config": {"path": "/.deltawire/config.json", "sha256": "673b9cf053e3ba2263bfbc49034360ed8dba8d959bd167f8ff4b1f7cb4302b6f"},
11+
"schema": {"path": "/.deltawire/schemas/range-large.schema.json", "sha256": "2fe7bdc8de996a09ccc651f42611dc88faee60c7390b36c62443ed3e523800b5"},
12+
"public_contract": {"path": "/task-contract.json", "sha256": "d3e1b7b3e5a4576540b3a2969d59f49818c7c0a12197b26d271e7e277b0054e5"}
13+
}
14+
}
Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#!/usr/bin/env python3
2+
"""Generate deterministic DeltaWire infrastructure evidence inside the task."""
3+
import argparse,hashlib,json,os,stat,subprocess
4+
from pathlib import Path
5+
6+
def sha(path):
7+
h=hashlib.sha256()
8+
with Path(path).open("rb") as f:
9+
for chunk in iter(lambda:f.read(1048576),b""): h.update(chunk)
10+
return h.hexdigest()
11+
def main():
12+
p=argparse.ArgumentParser(); p.add_argument("--expectations",required=True); p.add_argument("--receipt",required=True); a=p.parse_args()
13+
expected=json.loads(Path(a.expectations).read_text()); binary=Path(expected["binary"]["path"])
14+
exists=binary.exists(); lst=binary.lstat() if exists else None
15+
is_regular=bool(lst and stat.S_ISREG(lst.st_mode)); is_symlink=binary.is_symlink() if exists else False
16+
executable=exists and os.access(binary,os.X_OK); realpath=str(binary.resolve()) if exists else None
17+
try: version=subprocess.run([str(binary),"version"],capture_output=True,text=True,check=False) if exists else None
18+
except OSError: version=None
19+
files={}
20+
for name,item in expected["files"].items():
21+
path=Path(item["path"]); actual=sha(path) if path.is_file() else None
22+
files[name]={"path":item["path"],"exists":path.is_file(),"actual_sha256":actual,"expected_sha256":item["sha256"],"hash_match":actual==item["sha256"]}
23+
binary_hash=sha(binary) if is_regular else None
24+
checks={
25+
"binary_exists":exists,"binary_regular":is_regular,"binary_not_symlink":not is_symlink,
26+
"binary_executable":executable,"binary_path":str(binary)==expected["binary"]["path"],
27+
"binary_realpath":realpath==expected["binary"]["realpath"],
28+
"binary_hash":binary_hash==expected["binary"]["sha256"],
29+
"version_exit_0":bool(version and version.returncode==0),
30+
"version_exact":bool(version and version.stdout.splitlines() and version.stdout.splitlines()[0].strip()==expected["binary"]["version"]),
31+
**{f"{name}_hash":item["hash_match"] for name,item in files.items()},
32+
}
33+
receipt={"schema_version":"deltawire-environment-receipt.v1","binary":{"path":str(binary),"realpath":realpath,"exists":exists,"is_regular":is_regular,"is_symlink":is_symlink,"executable":executable,"actual_sha256":binary_hash,"expected_sha256":expected["binary"]["sha256"],"version_stdout":version.stdout.strip() if version else None,"version_stderr":version.stderr.strip() if version else None,"version_exit_code":version.returncode if version else None,"expected_version":expected["binary"]["version"]},"files":files,"checks":checks,"status":"pass" if all(checks.values()) else "fail"}
34+
target=Path(a.receipt); target.parent.mkdir(parents=True,exist_ok=True); target.write_text(json.dumps(receipt,indent=2,sort_keys=True)+"\n")
35+
print(json.dumps(receipt,sort_keys=True)); raise SystemExit(0 if receipt["status"]=="pass" else 1)
36+
if __name__=="__main__": main()
Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
{
2+
"authoritative_schema": {
3+
"path": ".deltawire/schemas/range-large.schema.json",
4+
"sha256": "2fe7bdc8de996a09ccc651f42611dc88faee60c7390b36c62443ed3e523800b5"
5+
},
6+
"deltawire_applicability": "expected",
7+
"family": "range",
8+
"generation": {
9+
"field": "index",
10+
"field_order": [
11+
"index"
12+
],
13+
"start": 1
14+
},
15+
"ordering": "canonical_generation_order",
16+
"output": {
17+
"format": "ndjson",
18+
"path": "testdata/generated/output.ndjson"
19+
},
20+
"record_count": 500,
21+
"schema_version": "task-spec.v1",
22+
"size": "large",
23+
"task": "range-large"
24+
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
#!/usr/bin/env python3
2+
import argparse, hashlib, json, subprocess
3+
from pathlib import Path
4+
5+
def sha(path): return hashlib.sha256(Path(path).read_bytes()).hexdigest()
6+
def write(path, value):
7+
if path:
8+
target=Path(path); target.parent.mkdir(parents=True,exist_ok=True); target.write_text(json.dumps(value,indent=2,sort_keys=True)+"\n")
9+
10+
def main():
11+
p=argparse.ArgumentParser(); p.add_argument("--contract",required=True); p.add_argument("--plan",required=True); p.add_argument("--repo",default="."); p.add_argument("--receipt"); p.add_argument("--deltawire",default="deltawire"); a=p.parse_args()
12+
repo=Path(a.repo).resolve(); contract_path=Path(a.contract).resolve(); plan=Path(a.plan).resolve(); contract=json.loads(contract_path.read_text())
13+
try: plan_arg=str(plan.relative_to(repo))
14+
except ValueError: plan_arg=str(plan)
15+
result={"schema_version":"plan-contract-receipt.v1","contract_sha256":sha(contract_path),"plan_sha256":sha(plan),"checks":{},"status":"fail"}
16+
try:
17+
run=subprocess.run([a.deltawire,"inspect","--repo",str(repo),"--format","json",plan_arg],capture_output=True,text=True)
18+
result["inspect_exit_code"]=run.returncode
19+
if run.returncode: result["error"]=run.stderr.strip() or run.stdout.strip()
20+
else:
21+
inspected=json.loads(run.stdout); schema=contract["authoritative_schema"]; schema_path=repo/schema["path"]
22+
checks={"output_path":inspected.get("output_path")==contract["output"]["path"],"output_format":inspected.get("output_format")==contract["output"]["format"],"projected_records":inspected.get("projected_records")==contract["record_count"],"schema_path":inspected.get("schema_path")==schema["path"],"schema_exists":schema_path.is_file(),"schema_sha256":schema_path.is_file() and sha(schema_path)==schema["sha256"],"exact_count_assertion":str(contract["record_count"]) in json.dumps(inspected.get("assertion_summary",{}))}
23+
result.update({"checks":checks,"inspect":inspected,"status":"pass" if all(checks.values()) else "fail"})
24+
except (OSError,ValueError,KeyError) as error: result["error"]=str(error)
25+
write(a.receipt,result)
26+
if result["status"]!="pass": raise SystemExit(1)
27+
print(json.dumps(result,sort_keys=True))
28+
if __name__=="__main__": main()

0 commit comments

Comments
 (0)