Tracker: issue #37
Candidate: PR #91
Frozen head: d638a2f78e4a89353b98e91052233e365f56f90a
Node CI: 33183974768
Phase 0 schema check: 33183974817
Issue #37 is a real-runtime safety gate. Static CI, synthetic fixtures, or a metadata-only verifier are not substitutes for a controlled Docker execution of the exact frozen PR #91 candidate.
scripts/pr91_acceptance.py reduces manual error around that gate while preserving the gate’s independence and fail-closed rules. The helper lives on main, not on PR #91, so improving the helper does not move the frozen candidate head and invalidate its exact-head evidence.
The helper does not grant merge authority and does not convert a successful worker run into acceptance.
Use two checkouts:
main checkout
-> scripts/pr91_acceptance.py
separate PR #91 checkout
-> exact commit d638a2f78e4a89353b98e91052233e365f56f90a
-> node implementation under test
The harness refuses a candidate checkout whose git rev-parse HEAD differs from the frozen SHA.
Use a machine intentionally selected for this MVP. It must have:
Preload the allowlisted image manually:
docker pull python:3.12-alpine
docker image inspect python:3.12-alpine
The node and harness require both:
sha256:... image ID;python@sha256:... repository digest.The harness does not pull the image implicitly.
For example, from a clean parent directory:
git clone https://github.com/MSKazemi/idkmesh.git idkmesh-pr91-acceptance
cd idkmesh-pr91-acceptance
git fetch origin pull/91/head
git checkout --detach d638a2f78e4a89353b98e91052233e365f56f90a
Confirm:
git rev-parse HEAD
must print exactly:
d638a2f78e4a89353b98e91052233e365f56f90a
If PR #91’s head moves, stop. Do not reuse acceptance from the old tree.
From a checkout that contains scripts/pr91_acceptance.py:
python scripts/pr91_acceptance.py preflight \
--repo /absolute/path/to/idkmesh-pr91-acceptance \
--report /tmp/idkmesh-pr91-preflight.json
Preflight checks:
python:3.12-alpine;python scripts/pr91_acceptance.py run-positive \
--repo /absolute/path/to/idkmesh-pr91-acceptance \
--output /tmp/idkmesh-node-acceptance \
--report /tmp/idkmesh-pr91-positive-report.json
The helper runs the equivalent of:
python -m pip install -e node
python -m unittest discover -s node/tests -v
python -m idkmesh_node validate node/examples/work-unit.canonical-smoke.json
python -m idkmesh_node run node/examples/work-unit.canonical-smoke.json \
--output /tmp/idkmesh-node-acceptance
It then independently inspects the bundle rather than trusting the worker’s summary fields.
The helper requires:
result-manifest.json, changes.patch, stdout.txt, and stderr.txt;status: succeeded;changed_paths consistent with independently parsed patch paths;candidate-patch requested for independent verification;The report contains observed hashes and identities suitable for attaching to issue #37 after human review.
The helper currently automates the positive path only. Issue #37 still requires controlled-host evidence for all five negative cases:
| ID | Negative case | Required behavior |
|---|---|---|
| A | tracked out-of-scope path | path-policy violation; fail closed |
| B | ignored untracked artifact | artifact still observed; fail closed |
| C | task-visible .git pointer tampering |
real metadata remains protected; tampering recorded; fail closed |
| D | oversized candidate patch | patch_truncated == 1; output-policy violation; fail closed |
| E | absent/local-retagged image without matching RepoDigest | refuse execution; no implicit pull |
Do not commit destructive negative fixtures. Use temporary local copies as specified in issue #37.
A future revision may safely automate these negatives, but it must not reduce them to mocked unit tests and call that runtime acceptance.
.github/workflows/pr91-acceptance-harness-check.yml only runs:
python -m py_compile scripts/pr91_acceptance.py
python scripts/pr91_acceptance.py self-test
That self-test verifies parsing, hash comparison, exact-path rules, a synthetic positive bundle, and tamper detection without Docker.
It does not count as issue #37 evidence.
After a real controlled-host run, retain at minimum:
Only after issue #37 has real positive and negative evidence should IDKMesh proceed with the full Phase B1 chain:
real node bundle
-> EvaluatorPlan v0.2
-> unified-diff verifier backend
-> VerificationResult v0.1
-> Evidence Report / replay
-> human integration decision
Then build the first 5–10 replayable repository-level benchmark tasks for issue #5.