Files
ARCADIA-Studio/harness/experiments/source-alias-rename-completed-20260912/build_archive.py
T

146 lines
10 KiB
Python

"""Archive only explicitly selected completed receipts; execute no project code."""
import hashlib
import io
import json
from pathlib import Path
import zipfile
ROOT = Path(__file__).resolve().parents[2]
OUT = Path(__file__).resolve().parent
PREFIX = "source-rename-completed-evidence/"
RUNS = ["attempt-6", "clipping-negative-1", "clipping-positive-diagnostic-1",
"nested-sync-diagnostic-1", "editor-patch-check-1"]
payload = {}
originals = {}
checks = []
def sha(data):
return hashlib.sha256(data).hexdigest()
def encoded(value):
return (json.dumps(value, ensure_ascii=True, indent=2) + "\n").encode()
def add(source, target):
path = ROOT / source
data = path.read_bytes()
assert target not in payload
assert path.suffix.lower() not in {".exe", ".dll", ".pyc"}
payload[target] = data
originals[str(path)] = data
for run in RUNS:
directory = ROOT / ".local/source-rename-integration-20260912" / run
names = ["inputs.zip", "inputs.json", "environment.json"]
phases = ["clippy", "tests", "timing", "gui"] if run == "attempt-6" else [""]
if run == "attempt-6":
names.append("complete.json")
complete = json.loads((directory / "complete.json").read_bytes())
assert complete["inputsUnchanged"] and complete["gates"] == phases
for phase in phases:
receipt_name = phase + "-result.json" if phase else "result.json"
receipt = json.loads((directory / receipt_name).read_bytes())
assert receipt["finished"] and receipt["inputsUnchanged"]
assert receipt["exitCode"] == (101 if run == "clipping-negative-1" else 0)
names.append(receipt_name)
for stream in ["stdout", "stderr"]:
log = (phase + "-" if phase else "") + stream + ".log"
assert sha((directory / log).read_bytes()) == receipt[stream + "Sha256"]
names.append(log)
checks.append({"run": run, "phase": phase or "command", "exitCode": receipt["exitCode"],
"finished": receipt["finished"], "command": receipt["command"]})
manifest = json.loads((directory / "inputs.json").read_bytes())
raw = (directory / "inputs.zip").read_bytes()
assert sha(raw) == manifest["archiveSha256"]
with zipfile.ZipFile(io.BytesIO(raw)) as inner:
expected = {entry["path"]: entry for entry in manifest["files"]}
assert len(inner.namelist()) == len(set(inner.namelist())) == len(expected)
assert set(inner.namelist()) == set(expected) and inner.testzip() is None
for name, entry in expected.items():
assert not Path(name).is_absolute() and ".." not in Path(name).parts
assert Path(name).suffix.lower() not in {".exe", ".dll", ".pyc"}
data = inner.read(name)
assert len(data) == entry["bytes"] and sha(data) == entry["sha256"]
checks.append({"run": run, "inputArchiveSha256": sha(raw), "inputMembers": len(expected),
"allInputBytesAndCrcVerified": True})
for name in names:
add(directory.relative_to(ROOT) / name, "runs/" + run + "/" + name)
diagnosis = ".local/source-rename-latency-diagnosis-20260912/"
notes = ["notes.md", "read-bindings.json", "nested-summary.json", "summarize.py",
"editor-initialization-candidates.md", "editor-initialization-bindings.json",
"same-line-patch-assessment.md", "editor-patch-independent-review.md",
"editor-patch-review-bindings.json", "prepare-instrumentation.ps1",
"candidate/editor_patch.rs", "candidate/README.md"]
for name in notes:
add(diagnosis + name, "diagnosis/" + name)
for path in sorted((ROOT / diagnosis / "instrumentation").rglob("*")):
if path.is_file():
add(path.relative_to(ROOT), "diagnosis/instrumentation/" + path.relative_to(ROOT / diagnosis / "instrumentation").as_posix())
for name in ["README.md", "source_rename.rs", "controller-tests.rs", "preview_glyph_tests.rs", "base-hashes.json", "staged-hashes.json"]:
add(".local/source-rename-preview-clipping-20260912/" + name, "clipping-stage/" + name)
for name in ["native-preview-clipping-review.md", "native-preview-clipping-bindings.json", "staged-clipping-review.md", "staged-clipping-review-bindings.json"]:
add(".local/source-rename-controller-independent-review-20260912/" + name, "reviews/" + name)
for name in ["gate.py", "focused.py"]:
add(".local/source-rename-integration-20260912/" + name, "helpers-current-readback/" + name)
assert sha(payload["diagnosis/candidate/editor_patch.rs"]) == "f301b8a043916b69dccb176da527a50ee85124b7e8b1da18921e4a0374a5153b"
# Bind the corrected helper from the completed check snapshot, never moving live source.
with zipfile.ZipFile(io.BytesIO(payload["runs/editor-patch-check-1/inputs.zip"])) as inner:
corrected = inner.read("crates/oa-desktop/src/app/source_rename/editor_patch.rs")
assert sha(corrected) == "049c9774c1ca28cda01f9a8e024604bef282366aa52c53c17c1918dbd09c3441"
negative = payload["runs/clipping-negative-1/stderr.log"].decode()
assert "source glyph under scrollbar" in negative and "cluster=92..93" in negative
native_path = "harness/experiments/source-alias-rename-native-20260912/source-rename-native-attempt-6-20260912.zip"
native = (ROOT / native_path).read_bytes()
assert sha(native) == "77adda5a33eb1def6dab23352ca0ab172300ea65fc21d2c215d545d7fcce0d08"
gui = json.loads(payload["runs/attempt-6/gui-result.json"])["binary"]
summary = {"scope": "Completed source gates and bounded experiments only; not candidate acceptance or native paint.",
"checks": checks, "externalBindings": [{"path": native_path, "sha256": sha(native), "bytes": len(native), "included": False},
{"path": ".local/source-rename-integration-20260912/attempt-6/arcadia-studio.exe", "sha256": gui["sha256"], "bytes": gui["bytes"], "included": False}],
"correctedHelperFromCheckInputSha256": sha(corrected),
"excluded": ["editor-patch-tests-1", "next-layout evaluator", "executable/DLL bytes", "private profiles", "caches", "duplicate native trial archive"]}
payload["SUMMARY.json"] = encoded(summary)
payload["INDEX.md"] = b"""# Completed alias source gates and bounded experiments
This private archive preserves five completed runs only. It is not a release or acceptance of an editor-reuse candidate. Native trial evidence is separately versioned and SHA-bound in SUMMARY.json, without duplicate payload.
| Run | Meaning |
| --- | --- |
| attempt-6 | Four successful Windows source gates: Clippy, tests, existing full Confirm timing, GUI executable build. The GUI JSON records the external binary; building it is not native acceptance. |
| clipping-negative-1 | Expected test failure (101): original layout allows actual shaped declaration glyph cluster92..93 beneath the scrollbar. |
| clipping-positive-diagnostic-1 | Successful focused rename tests with corrected preview layout and temporary timing instrumentation in source. This is an experimental capture, not clean production acceptance. |
| nested-sync-diagnostic-1 | Successful ignored real-Confirm timing experiment with nested instrumentation. Inclusive phase levels must not be added together; no GPU, first-paint or native responsiveness claim. |
| editor-patch-check-1 | Successful cargo check of corrected reuse helper integration only. It does not execute helper behavior, later layout timing or native rendering. |
Every run has its exact inputs.zip, complete membership/hash manifest, environment, commands/receipts and raw logs. All eight command receipt log hashes and all five nested ZIP memberships/member bytes/CRCs were independently checked during construction. Inputs manifests bind historical uncommitted snapshots; baseCommit alone is not their source identity.
diagnosis/instrumentation preserves removed diagnostic baseline/modified files, exact patch, bindings and generator. Historical notes retain their original time-scoped claims; later receipts qualify earlier hypotheses. diagnosis/candidate/editor_patch.rs is frozen f301b8a0 and has the known after-only LFCR counterexample documented in editor-patch-independent-review.md. Its original README's broad fallback claim is superseded by that review. Corrected helper049c9774 is preserved inside editor-patch-check-1/inputs.zip. The review is static, not proof of executed correctness.
clipping-stage and reviews preserve the earlier proposed repair/evaluator and source review; the exact executed evaluator is in each run's inputs.zip. helpers-current-readback are archive-time helper source snapshots, not independently proven historical executed versions. Historical absolute paths are evidence, not portable execution instructions. Reproduce with the recorded Windows compiler/dependencies and exact source snapshot; do not run relocated helpers blindly.
No current editor-patch-tests-1 or subsequent layout evaluation is included. No executables, DLLs, caches or private profiles are included, and no native trial payload is duplicated. PAYLOAD-MANIFEST.json covers all members except itself; external archive-result.json binds the entire archive.
"""
add(Path(__file__).relative_to(ROOT), "archive-tools/build_archive.py")
payload["READBACK-SOURCES.json"] = encoded([{"path": str(Path(path).relative_to(ROOT)), "sha256": sha(data), "bytes": len(data)} for path, data in originals.items()])
payload["PAYLOAD-MANIFEST.json"] = encoded({"selfExcluded": "PAYLOAD-MANIFEST.json", "members": [{"path": name, "bytes": len(data), "sha256": sha(data)} for name, data in sorted(payload.items())]})
archive = OUT / "source-rename-completed-evidence-20260912.zip"
with zipfile.ZipFile(archive, "x", compression=zipfile.ZIP_DEFLATED, compresslevel=9) as zipped:
for name, data in sorted(payload.items()):
info = zipfile.ZipInfo(PREFIX + name, date_time=(2026, 9, 12, 0, 0, 0))
info.compress_type = zipfile.ZIP_DEFLATED
zipped.writestr(info, data)
with zipfile.ZipFile(archive) as zipped:
assert zipped.testzip() is None and set(zipped.namelist()) == {PREFIX + n for n in payload}
for name, data in payload.items():
assert zipped.read(PREFIX + name) == data
for path, data in originals.items():
assert Path(path).read_bytes() == data, "Source changed during archive: " + path
receipt = {"archive": archive.name, "sha256": sha(archive.read_bytes()), "bytes": archive.stat().st_size,
"members": len(payload), "payloadBytes": sum(map(len, payload.values())), "completedRuns": RUNS,
"commandReceipts": 8, "inputArchivesVerified": 5, "sourceReadbacks": len(originals),
"allMemberBytesAndCrcVerified": True, "scope": summary["scope"]}
with (OUT / "archive-result.json").open("x", encoding="utf-8") as stream:
json.dump(receipt, stream, indent=2)
print(json.dumps(receipt))