5.6 KiB
Root collection protocol (not executed by worker)
Read the fixed spec and condition matrix first. Freeze/commit through the authorized Root workflow. The worker has not committed or run this procedure. Use a clean checkout at the exact submitted HEAD, an installed native Godot, and a new output directory outside the source checkout:
python3 tools/run_p08_normal_placement.py --collect \
--project-root /absolute/frozen/checkout \
--output /absolute/build/p08-normal-placement-evidence \
--commit EXACT_FROZEN_HEAD --godot /absolute/Godot \
--input-mode native_os
BUILD_OUTPUT_DIR=/absolute/build python3 tools/check_p08_normal_placement_evidence.py \
--verify-only --project-root /absolute/frozen/checkout
--input-mode handler collects only the strict headless pair. Its index has
no OS proof and intentionally cannot pass the whole checker. native_os
first collects that same headless pair, then separately starts the passive
nonheadless writer/reader. Import and handler phases use unchanged
execute_phase guards, markers, owner/audio proof. OS phases reuse the
P08-02 collect_native_os.py / passive recorder protocol, read-only as reuse
sources, with P08-03 arguments and paths; no new OS automation framework.
Before native launch the controller checks live engines, exact HEAD, clean
checkout, copied source inventory, disk admission and default player.
Each OS role gets a UUID private profile. Writer receives the handler's
pair/initial-formal; reader receives the OS writer's os-pair/formal.
All four formal members are copied and SHA-checked. The staged project gets
only private-profile settings and is restored in finally. Only captured
Popen children are cleaned by owned_outer.finish_captured.
The repaired handler also saves only inside its private user:// profile,
then exports initial-formal and formal to the evidence directory.
formal.bak, *-slot-metadata.json (verbatim manifest), and *-export.json
retain backup/metadata bytes, source paths and SHA pins. Initial backup absence
is recorded explicitly. Each role's *-save-results.json references actual
typed result JSON and SHA-pinned raw Variant files, including failed returns.
Inspect the full returned dictionaries and paths on the next native run.
The r01 dictionaries were never captured; do not reconstruct them or append
new results to the historical r01 raw evidence.
Actual argv is [engine, --path, stage, --script, passive_os.gd], with no
headless flag or headless proof gate. started.json, process-started.json,
ended.json, raw engine log, actual profile/engine report, source/stage/default
player inventories and ordinary owner/audio records remain in the evidence.
Controller and recorder SHA appear in start/end documents. Each OS child
has a 900-second bound and each Root acknowledgement a 300-second bound.
Timeout/error preserves failure records and cleans only owned children.
CUA request / read-only acknowledgement bridge
The collector prints waiting_for_root_cua; the recorder prints each exact
request filename and writes:
os-pair/{writer|reader}-request-NNNN/request.json.
It contains PID, sequence, action, target window, instructions and applicable
expected world cell, transformed viewport/screen coordinate, window/screen
scale. The recorder waits; it never clicks or changes Accessibility settings.
Root uses its existing CUA tool on the indicated PID/window. A request may ask for normal palette scrolling, a button/cell click, ordinary non-Ctrl wheel, normal manual load, or normal play/speed/pause until construction finishes. Modal buttons include their own window ID and screen transform. If a cell is clipped, the recorder first asks for ordinary zoom-out framing, then recomputes coordinates. Do not substitute old pixels or injected input. Capture real CUA screenshots before and after each request. Retain the raw CUA result and tool-call identity; never manufacture a receipt to advance.
Root writes its own receipt file within the evidence directory. The bridge envelope references that raw tool call and records:
{
"method": "native_os",
"target_pid": 123,
"timestamp_ns": 123456789,
"collector_pid": 456,
"tool_name": "actual CUA tool name",
"tool_call_id": "actual tool call identity",
"events": [{"type": "actual input event", "raw_receipt": "retained raw CUA result"}]
}
After completing the requested operation, Root writes ack.json beside
the request. All artifact references are relative to the evidence root:
{
"target_pid": 123,
"sequence": 1,
"request_sha256": "actual request file SHA-256",
"input_receipt": "root-receipts/writer-0001.json",
"screen_before": "root-receipts/writer-0001-before.png",
"screen_after": "root-receipts/writer-0001-after.png"
}
These numbers/strings are format examples, never evidence. Recorder and controller only read Root's acknowledgement/receipt files. The recorder separately retains actual Godot input observations and world selection, whole typed/Variant snapshots, displayed reasons and Runtime results. The checker verifies request/ack hash and sequence/PID binding, raw input presence, PNG structure/CRC, affine coordinate conversions, formal members, model invariants, distinct processes, native lifecycle and real owner proof. Independent review must match tool-call identities/raw CUA results and actual screenshots; an integrity checker is not an OS attestation authority.
Keep final requests (including save/load) as well as row-specific requests. Do not edit evidence after collection to force a pass. Correct source/input defects through the fixed repair workflow. GDScript parsing, actual native and OS success, full regression, review and integration are all pending.