Compare commits

...
70 changed files with 14463 additions and 322 deletions
@@ -0,0 +1,2 @@
__pycache__/
*.pyc
@@ -1,4 +1,54 @@
# P04-01 current status — repair31
# P04-01 REPAIR51 canonical handoff
ACTUAL S50 historical evidence complete; S51 docs-only resubmission; S51 native admission pending at worker handoff (fresh native on Q51 required by S-binding, checker:368-371); post-submit admission determined only by Root version-pinned receipts; formal_acceptance false; P04=0.
ACTUAL S50: native6 / 24 phases PASS (historical; bound to S50/Q50).
ACTUAL S50: collector 15+EV, missing 0 (historical; bound to S50/Q50).
ACTUAL S50 receipts: build/audit-support/p04-root-acceptance-a9ef681f/.
ACTUAL S47: full184 retains its original label; conditional reuse only under the existing checker and applicability map. r22 remains historical.
S51 native admission is pending AT HANDOFF. After submission, only Root version-pinned receipts under build/audit-support/p04-root-acceptance-<S>/ and build/p04-evidence/index.json determine admission. Worker-time NOT RUN / UNDETERMINED / unexecuted text below is historical and never a reason to rebuild. Fresh native6 on Q51 is required by S/Q binding, not by that text. No future S51 SHA, Q51 or receipt is claimed.
All six D05 IDs remain approved; pending D05 is empty. PAUSE-REASON: S5B proves same-tick onset from ACTIVE gives RELATED. Power-first then dependency closure shows NO_POWER statically at M facility_service.gd:860-864; that sequential case is EXPLICITLY UNRESOLVED/UNPROVEN under the unchanged approval. It is not a defect, cured, proven, or silently narrowed. The :569 gate preserves P04 safety regardless of label. Any later product change needs a separate owner-authorised task; do not amend the contract or re-ask the owner.
Remaining Root gates:
- Root fixes Q51; compare actual hashes with REPAIR51_APPLICABILITY_MAP.json; stop reuse on executable differences
- clean exact-Q check-only; capacity and PID check; one heavy lease for fresh native6 on Q51
- reader/adapters then collector; full184 conditional reuse check; order CLI/complete_B conditional reuse or rerun once
- index regeneration; one p04-acceptance validate; separate Opus whole-unit independent review
- prepare / exactC / integration / final / RootDB join / ledger / main push
- nativeWindows individually pending
Scope: documentation-only repair within the original P04-01/W unit. Original total 30/88, formal 16, P04 credit 0; formal_acceptance false; unit incomplete. No partial credit. See REPAIR51_APPLICABILITY_MAP.json for hashes and reuse conditions.
# Historical, superseded
All older text below, including its current/status headings and worker-time execution statements, is superseded historical material.
## REPAIR49 current correction
Source-ready only; original 30/88, formal 16, P04=0, no partial credit.
REPAIR48's specification-mismatch blocker below is historical and corrected:
the immutable 7000-byte original has SHA256
d28aadb044633f7d804de5a92c8d4c4a7438dfbf44c3243dca978951f4def25f;
removing its single EOF LF gives
9ec722e7dfb0bee178d291624a026420c08412574e238bba1fde012c7a6f7881.
This is the existing Git/Runner strip/checker one-EOF-LF pin contract.
No specification, approval or normalization change. Older contradictory wording
below is superseded history, including blanket full-reuse prohibitions and
all-controls-unexecuted wording. Q47 admission/index failures remain failures.
See REPAIR49_STATUS.md for closure audit and verbatim complete_B FileNotFoundError.
Root handoff reports payload(B), all53, series/join/power PASS; order-typed remains
UNDETERMINED. Worker did not rerun them. Corrected complete_B remains unexecuted.
Old native/full successes confer no new-S acceptance or credit.
REPAIR48 current source status: see [REPAIR48_STATUS.md](REPAIR48_STATUS.md). Earlier run directions and successes below are historical; they grant no P04 credit.
RUN47 current harness status: see REPAIR47_STATUS.md, REPAIR47_PLAN.json and REPAIR47_VALIDATION.json. Original unit remains unaccepted; earlier status below is historical.
# Historical P04-01 status — repair31
**BLOCKED: partial implementation; do not start the once-only native/full run.**
Formal completed status is **16/88**, with **zero P04 credit**.
@@ -1,3 +1,16 @@
## RUN47 harness repair; original unit remains unaccepted
Q46 S4 failed before engine startup: `AssertionError: complete 316-script parse roster`.
Secondary guard: `AssertionError: exact source and planned UID set`. Captured S4
PIDs: `[]`; phases: `[]`; passed: `false`. No game verification ran. This failure
is historical reference only, never adopted as a pass. Current S4 admission derives
exact roster/sets from real selection; check-only and native share it. Import-not-
attempted cleanup requires the original inventory without generated UIDs.
REPAIR47_PLAN.json and REPAIR47_STATUS.md supersede earlier current-run count and
reuse instructions. Immutable spec, REQUIRED/REACH_REFS, product, caps, denominator,
permissions and historical raw are unchanged. Option B: Root freezes new final Q,
then fresh all-series runs once; no receipt rewriting or reuse adopter.
# Evidence collection — historical repair29 description
Repair30 supersedes current-use claims below: existing S1–S4/r22/full178 records
@@ -1,4 +1,114 @@
# P04-01 order audit — repair31
# P04-01 REPAIR51 canonical handoff
ACTUAL S50 historical evidence complete; S51 docs-only resubmission; S51 native admission pending at worker handoff (fresh native on Q51 required by S-binding, checker:368-371); post-submit admission determined only by Root version-pinned receipts; formal_acceptance false; P04=0.
ACTUAL S50: native6 / 24 phases PASS (historical; bound to S50/Q50).
ACTUAL S50: collector 15+EV, missing 0 (historical; bound to S50/Q50).
ACTUAL S50 receipts: build/audit-support/p04-root-acceptance-a9ef681f/.
ACTUAL S47: full184 retains its original label; conditional reuse only under the existing checker and applicability map. r22 remains historical.
S51 native admission is pending AT HANDOFF. After submission, only Root version-pinned receipts under build/audit-support/p04-root-acceptance-<S>/ and build/p04-evidence/index.json determine admission. Worker-time NOT RUN / UNDETERMINED / unexecuted text below is historical and never a reason to rebuild. Fresh native6 on Q51 is required by S/Q binding, not by that text. No future S51 SHA, Q51 or receipt is claimed.
All six D05 IDs remain approved; pending D05 is empty. PAUSE-REASON: S5B proves same-tick onset from ACTIVE gives RELATED. Power-first then dependency closure shows NO_POWER statically at M facility_service.gd:860-864; that sequential case is EXPLICITLY UNRESOLVED/UNPROVEN under the unchanged approval. It is not a defect, cured, proven, or silently narrowed. The :569 gate preserves P04 safety regardless of label. Any later product change needs a separate owner-authorised task; do not amend the contract or re-ask the owner.
Remaining Root gates:
- Root fixes Q51; compare actual hashes with REPAIR51_APPLICABILITY_MAP.json; stop reuse on executable differences
- clean exact-Q check-only; capacity and PID check; one heavy lease for fresh native6 on Q51
- reader/adapters then collector; full184 conditional reuse check; order CLI/complete_B conditional reuse or rerun once
- index regeneration; one p04-acceptance validate; separate Opus whole-unit independent review
- prepare / exactC / integration / final / RootDB join / ledger / main push
- nativeWindows individually pending
Scope: documentation-only repair within the original P04-01/W unit. Original total 30/88, formal 16, P04 credit 0; formal_acceptance false; unit incomplete. No partial credit. See REPAIR51_APPLICABILITY_MAP.json for hashes and reuse conditions.
# Historical, superseded
All older text below, including its current/status headings and worker-time execution statements, is superseded historical material.
## REPAIR49 normal-gate handoff
Required materials: exact B/native-first-current and fresh-run registry; each
runner-input/ended/source/UID/formal/raw/lifecycle receipt; original recorded Q
and engine context; B/p04-evidence/runner-materials and RELOCATION.json; matching
collection/MANIFEST and separate dependency invocation; original full run and
full_suite binding/raw receipts; final index and invocation receipt; immutable
authorities in frozen checkout. No raw or historical receipt is rewritten.
Two-placement identity requires the explicit closure in repair48_identity_controls.py,
missing-file rejection, and original/A/B complete path/bytes/SHA tables and tree
hash equality before and after positive execution. See REPAIR49_STATUS.md.
Submission is followed by new Q freeze, affected pure controls (complete_B included),
clean exact-Q check-only, capacity/PID checks, one fresh native lease for
S1/S2a/S2b/S3/S4 and all ten S5 cases, readers/adapters, 15EV collector, full
verification/binding under the conditions below (or one final full184 if any
condition fails), index generation, p04-acceptance once, separate Opus whole-unit
review, normal prepare/C/integration/final/Root DB join/ledger/main push.
If order-typed fails, preserve its result and stop before heavy execution.
Only whole-unit acceptance grants credit.
## REPAIR49 full184 conditional reuse candidate — all conditions UNVERIFIED
Native reuse is forbidden: all six series require fresh M/S/Q_tree provenance
(p04_native_series.py:1287; checker:370). Full uses the existing separate binding
(checker:1175-1186); no adopter or checker change is authorized.
The following are requirements, not results or approval:
1. New S5 source_before must equal old full selected_source_map: all 1369 keys
and SHA values, not counts alone.
2. Old project_root must remain unchanged: source-start == current source_refs
== post-verification source_refs (full_suite_verifier.py:115).
3. selected_source_map, roster184, parse329, settings, runner/marker module,
marker contract, suite-policy and UID plan/stage must all match (116-152,225).
4. inputs.engine must match current engine_pin (124-125).
5. Revalidate every phase PID, cleanup, marker and diagnostics (154-228).
6. Current s5/run_s5_native.py and full_suite_verifier.py SHA must equal the
Root rehearsal versions.
7. Never relabel old S/oldQ/project_root/PIDs/time. Describe reuse only as
revalidating the exact-source-identical old full through the existing
full_suite route; never claim full ran on new S.
8. A separate Opus whole-unit review must independently confirm applicability.
Conditions 1–6 require actual checks after final freeze. If any predicate is
unproved or differs, reject reuse and execute full184 once on the final version.
SourceRefs (tools/run_all_tests.py:40-45) excludes docs/private package, but that
fact is no substitute for complete source equality. No reuse is approved here.
## REPAIR49 current correction
Source-ready only; original 30/88, formal 16, P04=0, no partial credit.
REPAIR48's specification-mismatch blocker below is historical and corrected:
the immutable 7000-byte original has SHA256
d28aadb044633f7d804de5a92c8d4c4a7438dfbf44c3243dca978951f4def25f;
removing its single EOF LF gives
9ec722e7dfb0bee178d291624a026420c08412574e238bba1fde012c7a6f7881.
This is the existing Git/Runner strip/checker one-EOF-LF pin contract.
No specification, approval or normalization change. Older contradictory wording
below is superseded history, including blanket full-reuse prohibitions and
all-controls-unexecuted wording. Q47 admission/index failures remain failures.
See REPAIR49_STATUS.md for closure audit and verbatim complete_B FileNotFoundError.
Root handoff reports payload(B), all53, series/join/power PASS; order-typed remains
UNDETERMINED. Worker did not rerun them. Corrected complete_B remains unexecuted.
Old native/full successes confer no new-S acceptance or credit.
REPAIR48 current source status: see [REPAIR48_STATUS.md](REPAIR48_STATUS.md). Earlier run directions and successes below are historical; they grant no P04 credit.
## RUN47 harness repair; original unit remains unaccepted
Q46 S4 failed before engine startup: `AssertionError: complete 316-script parse roster`.
Secondary guard: `AssertionError: exact source and planned UID set`. Captured S4
PIDs: `[]`; phases: `[]`; passed: `false`. No game verification ran. This failure
is historical reference only, never adopted as a pass. Current S4 admission derives
exact roster/sets from real selection; check-only and native share it. Import-not-
attempted cleanup requires the original inventory without generated UIDs.
REPAIR47_PLAN.json and REPAIR47_STATUS.md supersede earlier current-run count and
reuse instructions. Immutable spec, REQUIRED/REACH_REFS, product, caps, denominator,
permissions and historical raw are unchanged. Option B: Root freezes new final Q,
then fresh all-series runs once; no receipt rewriting or reuse adopter.
# Historical P04-01 order audit — repair31
Formal status is **16/88, P04 credit 0**. Policy approvals are recorded; implementation and exact-Q evidence remain incomplete. No original-unit completion is claimed.
@@ -26,3 +136,36 @@ The preserved S1–S4, r22 index, old registered validation and f5 full178 run r
The eleven phases remain APPLY_COMMANDS, TIME_BOUNDARIES, MANA, CONSTRUCTION, LOGISTICS, FACILITY_COMPLETION, VITALS_AND_ENVIRONMENT, INCIDENTS_AND_EVENTS, FACILITY_QUEUES, AI_DECISIONS, PUBLISH_SNAPSHOT. See the structured audit for preserved phase analysis and the new source manifest for exact M references.
See [CURRENT_STATUS.md](CURRENT_STATUS.md) and [REPAIR31_STATUS.md](REPAIR31_STATUS.md) before any Root execution.
## REPAIR50 source preparation (2026-10-18; no acceptance claim)
The commander handoff reports an identity order mutation on an all-equal array
(`recent_events/17/payload/current_cell = [0,0,0]`), raw SHA prefix
`bb0ccb1d…`, and 761.085 seconds elapsed. These are supplied observations,
not measurements repeated by this worker; the full raw SHA/log remains Root
material. The old control reversed every multi-element array and classified
the resulting identical bytes as a negative. The oracle correctly accepted
that identity. Existing failure records remain unchanged.
REPAIR50 separates byte-identical identity positives from negatives, swaps the
first unequal typed byte pair, and lists collections with no genuine order
variant. All AFTER keys/values, journal/body fields and both copied modes
remain traversed. Type-invalid mutations still require ValueError rejection
and are also listed as parser rejections; copied records contain the changed
bytes in both AFTER and EXPECTED even when an intermediate parse is invalid.
The oracle, adapters, public checker, native-series implementation and R49
closure roster are unchanged. No Node patch optimization is used.
The temporary expected memo keys full BEFORE/command/guard bytes by SHA256
and length plus oracle/parser source SHA256. Its cache contains only genuine
derivation output bytes. It reconstructs fresh Nodes on each return, restores
the wrapper with finally, and retains verify for each parseable mutation.
Self-controls compare hit/nonmemo bytes for first/last and each mutated kind,
require a one-byte BEFORE miss and reject, and check normal/exception cleanup.
The SHA fixture now streams 1 MiB implementation chunks without changing
file selection, traversal, relative keys or digest semantics.
Worker validation: AST parsing only; pure, stream, native and formal checks
are unexecuted. See [REPAIR50_STATUS.md](REPAIR50_STATUS.md) for Root commands,
static estimation and reuse prerequisites. Original 30/88, formal 16 and P04
credit 0 remain unchanged; the whole unit is incomplete.
@@ -25,4 +25,4 @@ derived 184 suites / 329 parse; truthful index; Root exact-candidate qualificati
Root order is py_compile → wrapper fixtures → UID controls with explicit scratch
→ fresh check-only plan → exactly one new-name diagnostic. The failed r35
diagnostic is preserved. All 7 domains + EV, formal 16/88, original 30/88,
P04 credit 0, all six D05 approvals pending, M c0ea009 and allowed_paths stay fixed.
P04 credit 0, all six D05 approved in the actual human record; adoption verification pending, M c0ea009 and allowed_paths stay fixed.
@@ -0,0 +1,23 @@
{
"checks": [
{
"path": "s5/s5_power_adapter.py",
"sha256": "448f7a99cd08ead1d4e2b91907a66e8805261c9d24c9f55eed9a047fac48b57c",
"py_compile": "pass",
"ast_parse": "pass"
},
{
"path": "s5/s5_power_adapter_controls.py",
"sha256": "32d71db80994052b905829e6a2da38448ae789825c44570a901e67fe2d07fd33",
"py_compile": "pass",
"ast_parse": "pass"
}
],
"executed": [
"py_compile",
"ast.parse"
],
"functional_controls_executed": false,
"native_executed": false,
"accepted": false
}
@@ -0,0 +1,15 @@
# REPAIR37 — bounded preparation submitted; no acceptance
Two probe corrections preserve recovery inputs/save/restore: typed String snapshot staff versus StringName live staff, and rejected duplicate enqueue bound to the completed resource command. The completion hook still requires success; duplicate rejection must not emit command_completed. All payment, reservation, receipt, ledger, phase roster and Reader assertions remain unchanged.
The adapter loads the existing series parser by spec_from_file_location and records its SHA256. Typed staff and duplicate checks bind both roles to their own completed commands. New pure controls verify every INDEX member sha/bytes before scratch creation, use the actual q36 pair, and require ValueError for the specified mutations including JSON-equal typed changes. Controls remain unexecuted.
Read dependencies: local q36-writer-contract INDEX, TYPED_AUDIT, SAFETY_REAUDIT, command_queue.gd.reference, facility_instance.gd.reference, both before/resource-replay JSON records; series Node/variant and checker loader pattern. Raw fixture decoding and controls are reserved to Root. A shell heredoc failed before Python execution because shell temporary-file creation was denied; subsequent edits used python -c with no temporary files.
Only py_compile and AST parsing are run, as recorded in REPAIR37_STATIC_CHECKS.json. No engine, Git, Runner, native run, other agent or /tmp operation was performed. No functional pass is claimed. Source basis remains 8e25213; counters remain 37, original 30/88, formal 16/88, P04 credit 0 and M c0ea009 frozen. p04-s5-DIAG-r36 remains FAILED without retrospective pass. All six D05 decisions are approved in the actual human record; adoption verification remains pending.
Root order: py_compile → s5_uid_controls → adapter controls with explicit fresh BUILD scratch → fresh check-only plan → at most one fresh source-pinned diagnostic under a new name. UID sources/settings are unchanged. No full184 until the whole batch is ready.
Context gap: whether current runtime submit_command emits command_completed on enqueue rejection is grounded only by the command_queue reference and TYPED_AUDIT raw. Root must observe this in the diagnostic; any emission remains a failure.
Pending: S5 destruction/midnight/exit; S1–S4/collector fresh Q; full 184/329; whole independent Opus review; normal prepare/exact candidate/integration/final/Root join/ledger. No acceptance or completion is claimed.
@@ -0,0 +1,54 @@
# REPAIR38 — superseded by REPAIR39_STATUS.md
The shared-helper constraint below is historical and was explicitly resolved
by the REPAIR39 direction: generalize `_queue` and `_reader` through one
CASE_TABLE while preserving S5A/S5B behavior. It is no longer an open question.
See REPAIR39_STATUS.md for the current batch status and missing source context.
## Historical REPAIR38 record
No implementation or acceptance is submitted by this attempt. No Python or
GDScript source was changed. The A–F batch remains outstanding, not complete
or admitted for native execution.
The direction both freezes `_queue` and `_reader` as shared helpers and asks
for new reservation-bearing cases with before/boundary/next/replay points.
The existing helpers contain case-specific assertions and replay dispatch:
- `s5/p04_s5_power_probe.gd::_queue` requires exactly one reserved inventory ID
only when `_case == "S5B_DEPENDENCY"`; every other case must have zero.
Using this unchanged helper for the required reservation-bearing S5C/S5F
queued request would fail its assertion even with correct runtime behavior.
- `_reader` unconditionally calls `_assert_stopped` after loading boundary,
then replays the literal labels `held`, `recovered`, `duplicate_guard`.
Per-case `_labels` does not control that replay loop. New next/replay points
cannot be independently replayed through this loop as written.
Required clarification: does “shared helpers stay unchanged” allow replacing
these case-specific predicates/dispatch with case-table lookups while keeping
S5A/S5B behavior and every existing assertion equivalent? Alternatively, are
separate new-case queue/replay helpers authorized while the existing helpers
remain exclusively the power-case implementation? No selection between these
interpretations was silently made. This is an implementation-constraint
question, not a request to reopen D05 or A01.
Read context includes AGENTS.md, REPAIR37_STATUS.md, the existing S5 probe and
wrapper, S5_ROOT_RUN.md, PENDING.md, D05_REMAINING_APPROVAL.json, Root's local
q37-remaining-source-map/SOURCE_MAP.json and referenced facility and automatic
defense sources. Root's M runtime reference is present; the worktree runtime
is a different version and must not substitute for that reference.
Only read-only source inspection and this status documentation were performed.
No pure controls, py_compile, AST validation, probe_guard, engine, Git, Runner,
native run, other agent, integration or /tmp operation was performed. No
REPAIR38_STATIC_CHECKS.json claiming validation is supplied because no source
checks were run. PENDING.md is not marked superseded: cases remain unimplemented.
r35/r36 remain FAILED; Q37 remains a successful local diagnostic only. M
c0ea009, original 30/88, formal 16/88 and P04 credit 0 remain unchanged. The
15+EV requirements, seven domains, all six D05 decisions and A01 are unchanged.
After clarification and completion of the entire source batch, Root's required
order remains pure controls, check-only S1–S5 plan, focused fresh native S1–S5,
fresh collect, full184/329 on final Q, index, --verify-only, independent review,
and normal gates with Root join. None of these steps is authorized or claimed
as performed by this worker status record.
@@ -0,0 +1,11 @@
{
"task_id": "P04-01",
"repair": 39,
"status": "blocked",
"source_files_modified": [],
"checks_run": [],
"reason": "Documentation-only blocked record; required exact-version source context missing. No py_compile, AST, probe_guard or functional validation executed.",
"accepted": false,
"native_admissible": false,
"unit_accepted": false
}
@@ -0,0 +1,63 @@
# REPAIR39 — blocked: required exact-version source context unavailable
The REPAIR38 engineering constraint is resolved. The authorized implementation
choice is one CASE_TABLE with reserved-ID counts, replay labels and per-case
dispatch; `_queue` and `_reader` may be generalized without forking them.
No private-refactor or policy question remains open.
The complete A–F batch remains unimplemented in this attempt. No executable
source was changed, no partial batch is submitted, and no native admission or
acceptance is claimed. PENDING.md and S5_ROOT_RUN.md remain unchanged because
the cases and whole-batch prerequisites have not been implemented.
## Required context gap
REPAIR38 records reading Root's `q37-remaining-source-map/SOURCE_MAP.json`
and an M runtime reference, explicitly distinguishing that reference from
the worker runtime. Those materials are not present in this checkout or the
registered runtime directory in this session. Recursive file enumeration used
hidden and ignored files as well. The checkout has no `.review-material`.
The previous owner-handoff references documented in REPAIR36/37 are likewise
absent from the enumerated runtime files.
Direct reads establish:
| Available input | SHA256 / result |
| --- | --- |
| checkout autoload/simulation_runtime.gd | d52a995ae715542bbc550f68d35889540658275d12e04ae0b21ac276f5843f39 |
| relocated R17 product autoload/simulation_runtime.gd | 7f01b2dcdf28bc965c7588173c2dc70054633faf7204b1ac38ba0f4369331b47 |
| tools/run_all_tests.py in both locations | 320ca668732b4ff72fc4449998af2327d4e5c527b06896740806aaf0487282b4 |
| tools/run_p13_reference_tests.py in both locations | missing |
The matching runner file is available; it is not itself a missing dependency.
Neither available runtime is established here as the frozen M c0ea009 source.
The phase facts in the direction do not supply the missing function bodies,
exact source mapping or UID helper contract. Substituting the historical R17
product or the worker runtime would not meet exact-version grounding.
Required to resume the same full batch: restore the locally readable,
hash-bound M source map and its referenced source bodies (including runtime,
facility and defense dependencies), and the Q UID helper reference used by
REPAIR36/37. Restore the q36-writer-contract INDEX and its referenced typed
materials for the existing adapter-control dependency. These are context
requirements, not requests for a new policy, acceptance waiver or native run.
## Work and validation actually performed
Read-only file discovery, relevant existing status/probe/wrapper inspection,
local input inspection and SHA256 computation were performed. Only this status,
REPAIR39_STATIC_CHECKS.json and the REPAIR38 supersession notice were written.
No Python or GDScript was modified, so no py_compile, AST or probe_guard check
was run. No controls, engine, Git, Runner, native execution, other agent,
integration or /tmp operation was performed.
r35 and r36 remain FAILED; Q37 remains a successful local diagnostic only.
M c0ea009, formal 16/88, original 30/88, P04 credit 0, the 15+EV membership
and thresholds, seven domains, six D05 decisions, A01 and allowed_paths remain
unchanged. No original-unit completion is asserted.
After the complete source batch, Root's order remains: pure controls;
check-only S1–S5 plan; one heavy lease for fresh S1–S5 with capacity/PID checks
and verified restore manifest; fresh collect; full184/329 once on final Q;
index; --verify-only; independent review; normal prepare/final and Root join.
This blocked attempt does not authorize starting that sequence.
@@ -0,0 +1,118 @@
{
"task_id": "P04-01",
"repair": 40,
"scope": "static only; no execution of probes, wrappers, adapters, controls, engine or Runner",
"python": [
{
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/s1/run_s1_native.py",
"sha256": "bb7afc6cabc4f515318c30adcce5ab30a8932a893d1d358b8c05ff4750f4688f",
"AST": "passed",
"py_compile": "passed"
},
{
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/s2/run_s2a_native.py",
"sha256": "101431b3a84eeb9aaf8d6a1171a4ebdbba884ffb10fee32a709f04a28b8a1547",
"AST": "passed",
"py_compile": "passed"
},
{
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/s2b/run_s2b_native.py",
"sha256": "13398072583f9be02a2db3182298f572d77782ab39da8123c503ae8b951c9851",
"AST": "passed",
"py_compile": "passed"
},
{
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/s3/run_s3_native.py",
"sha256": "118843aa5bc69548634f958cb31f359777577239b54351e59df367f7d0a5e409",
"AST": "passed",
"py_compile": "passed"
},
{
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/s4/run_s4_native.py",
"sha256": "cb43895ee8ee5b22e81aca633dbe9621000f14aaa6999d4e0b77ca8eb0b5602f",
"AST": "passed",
"py_compile": "passed"
},
{
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/s5/run_s5_native.py",
"sha256": "9cfd1b7a4db638c65c0a66a4350b8acae5237d3aee568e72f8fe9fd3c451d2ad",
"AST": "passed",
"py_compile": "passed"
},
{
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/s5/s5_power_adapter.py",
"sha256": "307438660ec5ffbbb24e7a12a87374ddf3b0d0db7d0c0fd06e4841622e677525",
"AST": "passed",
"py_compile": "passed"
},
{
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/s5/s5_order_adapter.py",
"sha256": "abe02702027946778717aa0139b99d6986d3d03605c1afcd38763c65424b3c01",
"AST": "passed",
"py_compile": "passed"
},
{
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/s5/s5_order_adapter_controls.py",
"sha256": "58a13df13f01c5d46268c68a7e969cc38608f97f9990f79b1b77d56b1712736a",
"AST": "passed",
"py_compile": "passed"
},
{
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/p04_native_series.py",
"sha256": "2155e697a08bc5f4c38f320a08aedb4ded1fb6c5fcb046482312e1819829da98",
"AST": "passed",
"py_compile": "passed"
},
{
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/collect_p04_native.py",
"sha256": "662387af72d2bd7681b81ffff7ec2e54a0019c50e981f86c7cfcf1ed61440e04",
"AST": "passed",
"py_compile": "passed"
},
{
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/full_suite_verifier.py",
"sha256": "df3768b7755d603fc079e899da8f06ae4ebb529ae531824a30add0f4d6773a6e",
"AST": "passed",
"py_compile": "passed"
},
{
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/build_p04_index.py",
"sha256": "d9be9e773d84bf30f086cc25c157c089025896279e30c8db2eb2995d6616715c",
"AST": "passed",
"py_compile": "passed"
},
{
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/checker_series_fixtures.py",
"sha256": "5ec725ad77313287f4f86ab30332012e2092caccafde2d91594ddd2013d8f418",
"AST": "passed",
"py_compile": "passed"
},
{
"path": "tools/check_p04_order_evidence.py",
"sha256": "8f288c127217a9586ddaeba9b97d21351ee4b3dfc6c199632f66e4cdc0554042",
"AST": "passed",
"py_compile": "passed"
}
],
"gdscript": {
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/s5/p04_s5_power_probe.gd",
"sha256": "496dc6a9c828ae355fc129c4886ec83c6c6dcc9a9cd5e484b42060517059b1de",
"probe_guard_regexes": [
"\\bvar\\s+\\w+\\s*=",
"\\bfor\\s+\\w+\\s+in\\b",
"\\.(?:patience_remaining|elapsed_minutes|power_available|capacity|hold_until)\\s*=(?!=)"
],
"result": "passed",
"case_table_static_dispatch": "passed"
},
"not_run": [
"pure controls",
"Godot parse/native",
"S1-S5 check-only plans",
"fresh collection",
"full suite",
"index/verify-only",
"independent review"
],
"formal_acceptance": false
}
@@ -0,0 +1,173 @@
# REPAIR40 status
Step 0: context index SHA-256 verified: 6f0ee990b95a5a897511425cd86ae57ba0364c5b326afdeb9f556fabfea6915c.
| Absolute path | Expected SHA-256 | Observed SHA-256 |
| --- | --- | --- |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_ABSOLUTE_CONTEXT_INDEX.json | 6f0ee990b95a5a897511425cd86ae57ba0364c5b326afdeb9f556fabfea6915c | 6f0ee990b95a5a897511425cd86ae57ba0364c5b326afdeb9f556fabfea6915c |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ACTUAL_OPUS_NEXT_P04_PLAN.json | 217d9bf4ef593fb95a5e726fee0e4497863a0b06663d27ba20e742d81bb9c049 | 217d9bf4ef593fb95a5e726fee0e4497863a0b06663d27ba20e742d81bb9c049 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ACTUAL_OPUS_REPAIR30_DIRECT_CHECKER_PLAN.json | 77801cc6db2a4deb9f76118a746b32eb5e629b2d6980850b8813a12b45016806 | 77801cc6db2a4deb9f76118a746b32eb5e629b2d6980850b8813a12b45016806 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ACTUAL_OPUS_REPAIR30_RUN_DECISION.json | be7be3bfaa5a5ab412db8aecd1d951c213894e485b7869fcc12ab1c75b037c7f | be7be3bfaa5a5ab412db8aecd1d951c213894e485b7869fcc12ab1c75b037c7f |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ACTUAL_OPUS_REPAIR31_CONCRETE_PLAN.json | 857e1acaed2093de56afdd851e69b3129bf9edce72b5da3cdd160ce4b7bfc18a | 857e1acaed2093de56afdd851e69b3129bf9edce72b5da3cdd160ce4b7bfc18a |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ACTUAL_OPUS_REPAIR32_CONCRETE_PLAN.json | 5b69f850f835bd7af37e9c728c484c236c28efb0bd32113bb53bcbaf7d252c0a | 5b69f850f835bd7af37e9c728c484c236c28efb0bd32113bb53bcbaf7d252c0a |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/CURRENT_ROOT_P04_RESUME_FACTS.json | c826726368844a823c54c1df1cdaff43fde5a94a17e638bfc60d8fb2559f8d85 | c826726368844a823c54c1df1cdaff43fde5a94a17e638bfc60d8fb2559f8d85 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/D05_ACTUAL_HUMAN_APPROVAL.json | cd365ded1b777a0327d090709f0a4161f5005562819183455d9f2e106fba3e96 | cd365ded1b777a0327d090709f0a4161f5005562819183455d9f2e106fba3e96 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_FRESH_Q_INPUT_APPROACH_AFTER34.json | 7a7b91cbf04bb84cdef8e7a99ca2140a9eac2ac6a385570b4f0aa0d474e7da92 | 7a7b91cbf04bb84cdef8e7a99ca2140a9eac2ac6a385570b4f0aa0d474e7da92 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_P04_PRESERVED_TO_CURRENT_SOURCE_AUDIT.json | 6bb86959b06acb62d5cd3c5fd00bb6802a80b66184e69abca3f75c46ddeb7a12 | 6bb86959b06acb62d5cd3c5fd00bb6802a80b66184e69abca3f75c46ddeb7a12 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_PLAN_VERSION_NOTES.json | b4336f900a87f9bf0daa1e86728c3a913aed7c09425569e104cc01290be1c62f | b4336f900a87f9bf0daa1e86728c3a913aed7c09425569e104cc01290be1c62f |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/INDEX.json | b2ad602b7bd22dbc4778b60b4a015b1d2f8f06b71278959fb52910f2ee1af57a | b2ad602b7bd22dbc4778b60b4a015b1d2f8f06b71278959fb52910f2ee1af57a |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_CHECK_ONLY.json | aab7dcbfcc934f3bda7d937feb4e7638109ddf645da6ebd57f6190588b55287c | aab7dcbfcc934f3bda7d937feb4e7638109ddf645da6ebd57f6190588b55287c |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_NEGATIVE_GIT.json | e63b1b27244cd042f522a63b4392dea8c7211ce5ca5a927e91856115dfaa9f56 | e63b1b27244cd042f522a63b4392dea8c7211ce5ca5a927e91856115dfaa9f56 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_NEGATIVE_dirty.log | 3ad8ef5d71175bc265f93395fe64a39b05ab65252ad509abc108de15a2b9ab53 | 3ad8ef5d71175bc265f93395fe64a39b05ab65252ad509abc108de15a2b9ab53 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_NEGATIVE_untracked.log | 3ad8ef5d71175bc265f93395fe64a39b05ab65252ad509abc108de15a2b9ab53 | 3ad8ef5d71175bc265f93395fe64a39b05ab65252ad509abc108de15a2b9ab53 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_NEGATIVE_wrong-main.log | 006b9e83c3e106bada560371dda1fb9b4326e3f31fa48fa0c46e7d4903a91e55 | 006b9e83c3e106bada560371dda1fb9b4326e3f31fa48fa0c46e7d4903a91e55 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_NEGATIVE_wrong-submission.log | 6fefa0256b2dbc1596043fbff65fbaf87279baaa770a04d65a5fe70a6476671d | 6fefa0256b2dbc1596043fbff65fbaf87279baaa770a04d65a5fe70a6476671d |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_NEGATIVE_wrong-tree.log | 7fb7a1e4f00f201b7008b6d72957b3d4db450be156a1174b26a22c36d48b5e8f | 7fb7a1e4f00f201b7008b6d72957b3d4db450be156a1174b26a22c36d48b5e8f |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_RESOURCE_ADMISSION.json | 18ef80f33f36cdd6ab664c862a9ae651a649a532bd32c4c35a81640cb4f078a0 | 18ef80f33f36cdd6ab664c862a9ae651a649a532bd32c4c35a81640cb4f078a0 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_STAGE.json | f143045846cf06d79b81a0e52035300251fa576cde9a2d5eeda97d6610fd8591 | f143045846cf06d79b81a0e52035300251fa576cde9a2d5eeda97d6610fd8591 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_check-only.log | 4418f4b6bbe3d88cbf7f0b988084e05b5f0f52c15fe0f466ba82e584408427ce | 4418f4b6bbe3d88cbf7f0b988084e05b5f0f52c15fe0f466ba82e584408427ce |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_pure.log | f77640e0629497389baefc6424cf164d164fb96bbbd48cee6c4d83ed96c253c1 | f77640e0629497389baefc6424cf164d164fb96bbbd48cee6c4d83ed96c253c1 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_REPAIR30_EXECUTION_ORDER_FACTS.json | e18b031e790622929ec2c80ab9a6d5c3d883a364d625b58372fe33fd280ca93f | e18b031e790622929ec2c80ab9a6d5c3d883a364d625b58372fe33fd280ca93f |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_REPAIR31_ACTUAL_FACTS.json | 0ea352b442e88263b899d28d58422afed39855393233c35ed3a962fcab67e136 | 0ea352b442e88263b899d28d58422afed39855393233c35ed3a962fcab67e136 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/INDEX.json | ff43786d898ef3475c267cf22758074a001b3d46dbc2bea52782a3782dd5571e | ff43786d898ef3475c267cf22758074a001b3d46dbc2bea52782a3782dd5571e |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/autoload/simulation_runtime.gd | 45514aea9367ff678f4dc05166bb9b58121f240d4b5565edeb7ab258e3ded8e0 | 45514aea9367ff678f4dc05166bb9b58121f240d4b5565edeb7ab258e3ded8e0 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/scenes/main/main.gd | 92677e4ac57ed8d418a4a716bf0874cbbaea79cff893e5163c82ad1f75e7140a | 92677e4ac57ed8d418a4a716bf0874cbbaea79cff893e5163c82ad1f75e7140a |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/scenes/main/world_preview.gd | 4bc49a19a38b9c3b4d6bfc243ddf46f1f25469a8273adb5e812911ef9424a1f2 | 4bc49a19a38b9c3b4d6bfc243ddf46f1f25469a8273adb5e812911ef9424a1f2 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/scripts/core/save_service.gd | f4c270632225dd046bbff92f9472761d64d63740e93f274828c92dcf912db6a9 | f4c270632225dd046bbff92f9472761d64d63740e93f274828c92dcf912db6a9 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/scripts/relationship/relationship_service.gd | d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3 | d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/scripts/ui/guest_observation_panel.gd | f5de1004fce5445bbfd3ee8d6ec37b325e7a9813d47c19beaeeeb411f27a50a5 | f5de1004fce5445bbfd3ee8d6ec37b325e7a9813d47c19beaeeeb411f27a50a5 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/scripts/ui/room_presentation.gd | 2eda851534777575298ea005e2e6d0ee90785a81357d5b9c34cfb95f615a8181 | 2eda851534777575298ea005e2e6d0ee90785a81357d5b9c34cfb95f615a8181 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/tests/business/test_required_kitchen.gd | 3a9c92f80c24064ef0858fba10bd7caab63203932942837f7e142349578f6b2f | 3a9c92f80c24064ef0858fba10bd7caab63203932942837f7e142349578f6b2f |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/tools/regression/suite-policy.json | 7eb085d7e7a383785b4faedb503d0f6002bcad431e3188785aef901ce123769f | 7eb085d7e7a383785b4faedb503d0f6002bcad431e3188785aef901ce123769f |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/full-standard-schema-example/INDEX.json | a7a3299c4d70ea033368a707882856fd5c7f7f4d5a0d5f86bf2fb9b2fe2e53d1 | a7a3299c4d70ea033368a707882856fd5c7f7f4d5a0d5f86bf2fb9b2fe2e53d1 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/full-standard-schema-example/controller-input.json | 24d10b3a91553df54b3b2fd4b1a57dce683cc72a55576e0c73c9e142b335ad40 | 24d10b3a91553df54b3b2fd4b1a57dce683cc72a55576e0c73c9e142b335ad40 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/full-standard-schema-example/controller.py | 9e03ecba1819c449c83a9dfba0f60c0e01f94aad728c46f60dd1db179224a89b | 9e03ecba1819c449c83a9dfba0f60c0e01f94aad728c46f60dd1db179224a89b |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/full-standard-schema-example/run/003-receipt.json | 4ce015c160859612c89e215517826aa1da3582534d27c4688af6a44e37f1b641 | 4ce015c160859612c89e215517826aa1da3582534d27c4688af6a44e37f1b641 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/full-standard-schema-example/run/parse-receipt.json | 1ad82022669a3f197f53ed1e23f23aadc927220f0ba1f857c41f80721bafa443 | 1ad82022669a3f197f53ed1e23f23aadc927220f0ba1f857c41f80721bafa443 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/full-standard-schema-example/run/runner-ended.json | e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 | e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/full-standard-schema-example/run/runner-input.json | 2a76506e923a3a95288ce826b81ed9eab49d4ecee613a2c82ae35e970c68f961 | 2a76506e923a3a95288ce826b81ed9eab49d4ecee613a2c82ae35e970c68f961 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/normal-candidate-example/INDEX.json | 942181cc3efc8207e728233f89626b66eb0c34b582e5c9b0fae294dcf1600c00 | 942181cc3efc8207e728233f89626b66eb0c34b582e5c9b0fae294dcf1600c00 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/normal-candidate-example/ROOT_EXACT_NORMAL_CANDIDATE_72A50A4A.json | 5614c9b1c9eb222dbbcfd9ae1c3b438cc4129c779deba2841d660a8c96b6cfe6 | 5614c9b1c9eb222dbbcfd9ae1c3b438cc4129c779deba2841d660a8c96b6cfe6 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/normal-candidate-example/ROOT_NORMAL_FINAL_72A50A4A.json | b41069126e029c30ab644a62a54cb45ca2e0e504add150020500acba4e249469 | b41069126e029c30ab644a62a54cb45ca2e0e504add150020500acba4e249469 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/normal-candidate-example/ROOT_NORMAL_INTEGRATION_72A50A4A.json | 2f47d39d3f05b3735f0fb3e01adaabf1c66c6a784d60af247063bd90e5ec0d5c | 2f47d39d3f05b3735f0fb3e01adaabf1c66c6a784d60af247063bd90e5ec0d5c |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/INDEX.json | a23f17336a5e701100c224ebcb69f37a8de95aca82658675b692d503798a5232 | a23f17336a5e701100c224ebcb69f37a8de95aca82658675b692d503798a5232 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/OWNER_CLI_REFERENCE.json | 1e360ad1d8057ef649fabe97ac3e98263d2f8c1c4d976d8b6e0a907a49e9158e | 1e360ad1d8057ef649fabe97ac3e98263d2f8c1c4d976d8b6e0a907a49e9158e |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/ROOT_SOURCE_REVIEW_REJECTION_20D0AE5.json | d028dd3862ae663586d49b5843e88d9da82ad7985fa082551438e4a81311073e | d028dd3862ae663586d49b5843e88d9da82ad7985fa082551438e4a81311073e |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/SOURCE_REWORK_ADAPTER_LOCAL_CHECKS.json | 580f2f19d680a23ee4efe6beab68a1aad69e067bc551f623cc7531c6915d7a78 | 580f2f19d680a23ee4efe6beab68a1aad69e067bc551f623cc7531c6915d7a78 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/SOURCE_REWORK_CURRENT_REFERENCE_INDEX.json | b0ecce7ae523527fdc6272e9784eba6109d67c0cd3745a8aaab64d913ca8adbd | b0ecce7ae523527fdc6272e9784eba6109d67c0cd3745a8aaab64d913ca8adbd |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/core.py.reference | 4c6067bbd57034764873a468ff161a6882d232503043d5640fc83dea0b455856 | 4c6067bbd57034764873a468ff161a6882d232503043d5640fc83dea0b455856 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/current-owner-cli.py.reference | 0cfd9634e4a59755b89d2927d60b6092368529f2ca7188d949da7f88080359aa | 0cfd9634e4a59755b89d2927d60b6092368529f2ca7188d949da7f88080359aa |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/owner-cli.py.reference | 52c327e624334b51612ea3cb1653aeff4a7a192502d1ba9407ce874af1d92410 | 52c327e624334b51612ea3cb1653aeff4a7a192502d1ba9407ce874af1d92410 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/owner-source-rework-20d0ae5.py.reference | 9ecf7bebf666a67a8f13357d66e9c1d8d76940ef8212f0055537b728c75e0cbc | 9ecf7bebf666a67a8f13357d66e9c1d8d76940ef8212f0055537b728c75e0cbc |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/FAILED_EXECUTION.json | 6e48da89ce852dacdbff2d0f93a8903583dccd9e05f5e34bb68be0d63f540332 | 6e48da89ce852dacdbff2d0f93a8903583dccd9e05f5e34bb68be0d63f540332 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/FAILED_IMPORT_COMBINED.log | cd39b1711f530454b0ec263ab2d076d714f674d5a36e26f9ef16788799b76764 | cd39b1711f530454b0ec263ab2d076d714f674d5a36e26f9ef16788799b76764 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/FAILED_OUTER_OWNED_FINALLY.json | ee14a347724aedb2ae8afecc0775250b1e014c17e726210e2535d6108e57edc0 | ee14a347724aedb2ae8afecc0775250b1e014c17e726210e2535d6108e57edc0 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/INDEX.json | 0e4334442ce89b0388e10a4b62b5e00acbce2013e3ef1967508a3c48d72dc9c1 | 0e4334442ce89b0388e10a4b62b5e00acbce2013e3ef1967508a3c48d72dc9c1 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/P13_CONTROLLER_REFERENCE_INDEX.json | 48434362232d6b58cca720868c6d87f2af48675f365855b8a4a97eb5071dfee3 | 48434362232d6b58cca720868c6d87f2af48675f365855b8a4a97eb5071dfee3 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/P13_FULL_CONTROLLER_PATTERN.py.reference | 9e03ecba1819c449c83a9dfba0f60c0e01f94aad728c46f60dd1db179224a89b | 9e03ecba1819c449c83a9dfba0f60c0e01f94aad728c46f60dd1db179224a89b |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/ROOT_Q35_DIAGNOSTIC_IMPORT_SOURCE_DELTA.json | 1994e59a498f3dbca1fd589b16b5bc6305d2786c0fa730ac489590469f08b05d | 1994e59a498f3dbca1fd589b16b5bc6305d2786c0fa730ac489590469f08b05d |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/ROOT_Q35_FAILED_IMPORT_UID_CLASSIFICATION.json | bc0a863e52db4f98b4b2ee4bc0b513c73f841726789a2ca99521c1b8618dc6c3 | bc0a863e52db4f98b4b2ee4bc0b513c73f841726789a2ca99521c1b8618dc6c3 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/run_all_tests.py.reference | 320ca668732b4ff72fc4449998af2327d4e5c527b06896740806aaf0487282b4 | 320ca668732b4ff72fc4449998af2327d4e5c527b06896740806aaf0487282b4 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/run_p13_reference_tests.py.reference | 9adc8aa2a7662df8dd70386ddb0bff34574e44d7411de3b6128ddd15eb24675c | 9adc8aa2a7662df8dd70386ddb0bff34574e44d7411de3b6128ddd15eb24675c |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/INDEX.json | cef78b200268e27a6e73ccd926ac95d0b2b6e30b9338a8412da9ab48b68ca82a | cef78b200268e27a6e73ccd926ac95d0b2b6e30b9338a8412da9ab48b68ca82a |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/SAFETY_REAUDIT.json | 8edf11fe7893ced7c6450feb1ee3db45ab0a145db572254d2102ee70e26ac26e | 8edf11fe7893ced7c6450feb1ee3db45ab0a145db572254d2102ee70e26ac26e |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/TYPED_AUDIT.json | e1800e1679b570ecdd9d7537e87e0730c089fa3b4c6197d3e279e60959aad016 | e1800e1679b570ecdd9d7537e87e0730c089fa3b4c6197d3e279e60959aad016 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/command_queue.gd.reference | 09b22e6212fa3ce1bf08f5d6b52224a2d3362b3bc63f03a8c98e89af1c6f5895 | 09b22e6212fa3ce1bf08f5d6b52224a2d3362b3bc63f03a8c98e89af1c6f5895 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/facility_instance.gd.reference | 0c6aa493f3299611e05dd26aa429dda8cf7b5c479e4d09632036fb862f79a324 | 0c6aa493f3299611e05dd26aa429dda8cf7b5c479e4d09632036fb862f79a324 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/writer-S5A_PURE-before.json | af7b1f0099b37298b1bf0d683f98c0ec84fae96b74f16c33af310cab2efa955b | af7b1f0099b37298b1bf0d683f98c0ec84fae96b74f16c33af310cab2efa955b |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/writer-S5A_PURE-before.var | 61f749b6a10ddc8e70f6e5b1d6378fcf1c0ae5127161a10c9704d76bcf64813a | 61f749b6a10ddc8e70f6e5b1d6378fcf1c0ae5127161a10c9704d76bcf64813a |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/writer-S5A_PURE-resource-replay.json | 56a7fc36e0972eb64abb19189f1664b87d6a058511bbec0ef7e1497abd2c511e | 56a7fc36e0972eb64abb19189f1664b87d6a058511bbec0ef7e1497abd2c511e |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/writer-S5A_PURE-resource-replay.var | 92aa8694939e2b8b678b556227cce1cf4cda661b6fb1f5a478ac37deba1a072e | 92aa8694939e2b8b678b556227cce1cf4cda661b6fb1f5a478ac37deba1a072e |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/writer-S5B_DEPENDENCY-before.json | 0f821748eb7f12a8ac196c61bca34a7fe55af6adb3ab43d1acf8748fd2be8652 | 0f821748eb7f12a8ac196c61bca34a7fe55af6adb3ab43d1acf8748fd2be8652 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/writer-S5B_DEPENDENCY-before.var | 06b03c6a50a8832a9cab621b908332199e9ab4d10d4e547111a8860c70535bd2 | 06b03c6a50a8832a9cab621b908332199e9ab4d10d4e547111a8860c70535bd2 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/writer-S5B_DEPENDENCY-resource-replay.json | 49fb4df6bdaadd9c5146f716a108902c533b137427e2f90f86116393f12c6ea0 | 49fb4df6bdaadd9c5146f716a108902c533b137427e2f90f86116393f12c6ea0 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/writer-S5B_DEPENDENCY-resource-replay.var | 464b589fa206427a1becd6dd484fc9be05da1b619ffb26ca559dde83e7b09309 | 464b589fa206427a1becd6dd484fc9be05da1b619ffb26ca559dde83e7b09309 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-power-result/INDEX.json | a8f44235dc8a74e67c3463698619611131224de5048868259a729791614cf9a9 | a8f44235dc8a74e67c3463698619611131224de5048868259a729791614cf9a9 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-power-result/ROOT_Q36_REJECTED_ENQUEUE_STATIC_PATH.json | e8adc79d506491973289084c5ade7c3affe9e3e517896ef191f01cad6dcaed92 | e8adc79d506491973289084c5ade7c3affe9e3e517896ef191f01cad6dcaed92 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-power-result/ROOT_Q37_DIAGNOSTIC_SAFETY_REAUDIT.json | 4d4b059576b3b6d28f71d054eeaf367ead54a74bb499d64bf450d625a137cfa5 | 4d4b059576b3b6d28f71d054eeaf367ead54a74bb499d64bf450d625a137cfa5 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-power-result/ROOT_Q37_POWER_ADAPTER_RESULT.json | cce1132503457675b50d566ad1afc3f67e902a28135550a8e72b647dacd7d70d | cce1132503457675b50d566ad1afc3f67e902a28135550a8e72b647dacd7d70d |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-power-result/ROOT_Q37_PREFLIGHT.json | 3554d8f246c0d117c774ecfabcd9eb48eed311155e3a5a3b15413f3e663b6fd7 | 3554d8f246c0d117c774ecfabcd9eb48eed311155e3a5a3b15413f3e663b6fd7 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-power-result/ROOT_R37_ADAPTER_CONTROLS.json | f62fc981f3935bd969ea5c6fafa5d44a111b1264ad0d04fdb08b07fe4f27429e | f62fc981f3935bd969ea5c6fafa5d44a111b1264ad0d04fdb08b07fe4f27429e |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/ROOT_MANA_ADOPTION_CURRENT_APPLICABILITY_C0.json | 57ba42e1c92db194a5ddcb8dc80c8e0249bbab817e35a3ae00bd12b0f4c57731 | 57ba42e1c92db194a5ddcb8dc80c8e0249bbab817e35a3ae00bd12b0f4c57731 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/ROOT_Q37_FULL_ROSTER_PREPARE_ONLY.json | c547dcff95184d04bf7089e7c9f6a2cda800a91359c9ec318f48ad4ecf2887c0 | c547dcff95184d04bf7089e7c9f6a2cda800a91359c9ec318f48ad4ecf2887c0 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/SOURCE_MAP.json | d1333fc891342be5cc16795973fa71e7910a8c8af06ef4a3e51662537fed63c3 | d1333fc891342be5cc16795973fa71e7910a8c8af06ef4a3e51662537fed63c3 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/core/simulation_kernel.gd | 341c0c878c4894adbac628d0db6362ff69fc3347bdd9e61e50936e15dc2d1edb | 341c0c878c4894adbac628d0db6362ff69fc3347bdd9e61e50936e15dc2d1edb |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/economy/economy_service.gd | 95aedd0a0421c93e8fa39f0f76fa890cd0a46905d9a25c88c8b17c4d6d47728e | 95aedd0a0421c93e8fa39f0f76fa890cd0a46905d9a25c88c8b17c4d6d47728e |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/facility/facility_service.gd | ceb4a3e9224587423f273cdb2b56e6843ab176ac1fc4fe79dd498b5ed5c33b77 | ceb4a3e9224587423f273cdb2b56e6843ab176ac1fc4fe79dd498b5ed5c33b77 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/guest/guest_service.gd | 56880410e9a00816f9a95d30821982955532de8dd976980934e12016a9f2b21e | 56880410e9a00816f9a95d30821982955532de8dd976980934e12016a9f2b21e |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/operations/operations_coordinator.gd | 871a248ee101b6df543fd5cf0440b5d4b0f02c21fa145a99f0687888c1bc6f90 | 871a248ee101b6df543fd5cf0440b5d4b0f02c21fa145a99f0687888c1bc6f90 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/tests/s5/test_runtime_defense_autonomy.gd | 28ca81ddde4da49442b427ed4c55ddcf213ecb389712db585b64cd416636c403 | 28ca81ddde4da49442b427ed4c55ddcf213ecb389712db585b64cd416636c403 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/tests/s5/test_runtime_defense_cycle.gd | a909e2af73aae43590cdd91d07ed2548f4fd2f675d26fa63aa74f6a5cda34357 | a909e2af73aae43590cdd91d07ed2548f4fd2f675d26fa63aa74f6a5cda34357 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/tools/run_all_tests.py | 320ca668732b4ff72fc4449998af2327d4e5c527b06896740806aaf0487282b4 | 320ca668732b4ff72fc4449998af2327d4e5c527b06896740806aaf0487282b4 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/core/simulation_kernel.gd | 341c0c878c4894adbac628d0db6362ff69fc3347bdd9e61e50936e15dc2d1edb | 341c0c878c4894adbac628d0db6362ff69fc3347bdd9e61e50936e15dc2d1edb |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/autoload/simulation_runtime.gd | 45514aea9367ff678f4dc05166bb9b58121f240d4b5565edeb7ab258e3ded8e0 | 45514aea9367ff678f4dc05166bb9b58121f240d4b5565edeb7ab258e3ded8e0 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/facility/facility_service.gd | ceb4a3e9224587423f273cdb2b56e6843ab176ac1fc4fe79dd498b5ed5c33b77 | ceb4a3e9224587423f273cdb2b56e6843ab176ac1fc4fe79dd498b5ed5c33b77 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/economy/economy_service.gd | 95aedd0a0421c93e8fa39f0f76fa890cd0a46905d9a25c88c8b17c4d6d47728e | 95aedd0a0421c93e8fa39f0f76fa890cd0a46905d9a25c88c8b17c4d6d47728e |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/operations/operations_coordinator.gd | 871a248ee101b6df543fd5cf0440b5d4b0f02c21fa145a99f0687888c1bc6f90 | 871a248ee101b6df543fd5cf0440b5d4b0f02c21fa145a99f0687888c1bc6f90 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/guest/guest_service.gd | 56880410e9a00816f9a95d30821982955532de8dd976980934e12016a9f2b21e | 56880410e9a00816f9a95d30821982955532de8dd976980934e12016a9f2b21e |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/tests/s5/test_runtime_defense_autonomy.gd | 28ca81ddde4da49442b427ed4c55ddcf213ecb389712db585b64cd416636c403 | 28ca81ddde4da49442b427ed4c55ddcf213ecb389712db585b64cd416636c403 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/run_all_tests.py.reference | 320ca668732b4ff72fc4449998af2327d4e5c527b06896740806aaf0487282b4 | 320ca668732b4ff72fc4449998af2327d4e5c527b06896740806aaf0487282b4 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/tests/s5/test_runtime_defense_cycle.gd | a909e2af73aae43590cdd91d07ed2548f4fd2f675d26fa63aa74f6a5cda34357 | a909e2af73aae43590cdd91d07ed2548f4fd2f675d26fa63aa74f6a5cda34357 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/run_p13_reference_tests.py.reference | 9adc8aa2a7662df8dd70386ddb0bff34574e44d7411de3b6128ddd15eb24675c | 9adc8aa2a7662df8dd70386ddb0bff34574e44d7411de3b6128ddd15eb24675c |
## Source batch and helper choice
REPAIR38's helper restriction and REPAIR39's missing-context blocker text are
superseded for this attempt: the exact absolute context was readable and every
hash matched. The old status files and their stops are retained unchanged.
A: one CASE_TABLE dispatches all six S5 cases with reserved-ID counts and ordered
labels. _queue generalizes only its count predicate. _reader loads each boundary,
dispatches its stop assertion, then replays table labels. A/B keep recovery,
duplicate_guard and resource replay. C–F share private preparation/advancement
helpers using public commands, including the operations-enabled paid-midnight
path and the automatic-breach source fixture. No forced guest transition is used.
New-case receipt buffers are restored after formal load; _fresh/_cmd/_capture,
write/read, phase observation and resource replay implementations stay unchanged.
B: wrapper cases/labels/slots derive from the table. New order adapter reuses
Raw, typed parsing, staff_check, duplicate_check and series.variant by file spec;
its output records dependency SHA values. The typed mutation control program
uses explicit absent BUILD scratch and requires actual Root raw for positives.
The existing wrapper/UID controls do not read CASES and were left unchanged.
C: five wrappers select fresh Q through CLI arguments and shared S5 helpers.
UID policies preserve the original execute_phase code object. Historical mode
is read-only. FreshSeries verifies actual Root receipt pins, complete source,
UID/engine/PID/cleanup/formal material and recomputes existing semantic adapters.
Historical RUNS/NATIVE_PINS remain unchanged. Fresh collection is exclusive.
D: full_suite_verifier imports actual Q run_all_tests.py, derives the roster and
parse paths, rejoins raw markers/PIDs/logs/cleanup/source/settings/policy/engine
and UID seals, and binds required-kitchen separately. No totals imply original
acceptance. Its condition entries remain boundary-pending; checker uses fresh
boundary derivations. Normal C provenance is not an input to this verifier.
E: checker/index consume all FRESH_RUNS, enforce S5 approved-order gates and full
suite verification, and retain historical collection separately without union.
The index uses the fresh tested Q and fresh runner material descriptors.
The series fixture retains its existing negatives and adds the fresh roster.
F: this status, REPAIR40_STATIC_CHECKS.json, S5_ROOT_RUN.md and the narrowly
superseded PENDING.md describe the actual batch and Root's unchanged order.
## Verification and remaining evidence
Only static Python AST/py_compile and existing GDScript probe_guard regex checks
are permitted here. See REPAIR40_STATIC_CHECKS.json for checks actually executed.
No pure controls, engine, Git, Runner, native, integration or other agent was run.
The first shell here-document attempt was rejected before execution because the
shell could not create its temporary file; subsequent reads used python -c.
No /tmp file was created or used.
Native behavior, mutation controls, full suite, index verification and independent
review remain unexecuted. No required condition receives credit from this source
submission. In particular, absent fresh shift_completion/same_minute_replay/
paused_midnight evidence remains a failing gate rather than historical reuse.
S5 patience_release and paused_midnight remain pending unless actually observed.
A failed alignment, restore or typed assertion must remain a native failure.
Frozen: M c0ea009; formal 16/88; original 30/88; P04 credit 0; counters 40/unlimited;
seven domains; six D05 decisions and A01; REQUIRED membership/thresholds; product,
Clock, API, values and tests; allowed_paths; permissions, billing and policy.
r35/r36 are FAILED; Q37 is only local diagnostic evidence. No old proof relabelled.
@@ -0,0 +1,259 @@
[
{
"name": "checker_negative_fixtures",
"exit_code": 0,
"result": {
"scope": "Synthetic checker checks only; no engine evidence or formal acceptance",
"py_compile": true,
"results": [
{
"fixture": "synthetic_scalar_only_rejected",
"exit_code": 1,
"result": {
"error": "native bundle required; self-reported scalar evidence is insufficient"
}
},
{
"fixture": "forged_registered_pin",
"exit_code": 1,
"result": {
"error": "registered pin declaration"
}
},
{
"fixture": "false_delta",
"exit_code": 1,
"result": {
"error": "git diff/applicability_delta mismatch"
}
},
{
"fixture": "wrong_reach_anchor",
"exit_code": 1,
"result": {
"error": "unknown reachability anchor"
}
},
{
"fixture": "missing_index",
"exit_code": 1,
"result": {
"error": "missing/outside file: index.json"
}
},
{
"fixture": "duplicate_key",
"exit_code": 1,
"result": {
"error": "duplicate JSON key: schema_version"
}
},
{
"fixture": "symlink",
"exit_code": 1,
"result": {
"error": "symlink: stdout.json"
}
},
{
"fixture": "hash_mismatch",
"exit_code": 1,
"result": {
"error": "artifact hash: stdout"
}
},
{
"fixture": "stale_pin",
"exit_code": 1,
"result": {
"error": "tested game differs from Git: autoload/simulation_runtime.gd"
}
},
{
"fixture": "unexecuted_receipt",
"exit_code": 1,
"result": {
"error": "unexecuted/incomplete receipt"
}
},
{
"fixture": "pending_authority",
"exit_code": 1,
"result": {
"error": "pending/missing authority"
}
},
{
"fixture": "missing_condition",
"exit_code": 1,
"result": {
"error": "mandatory conditions missing: paused_midnight; unknown: "
}
},
{
"fixture": "unsupported_reach_false",
"exit_code": 1,
"result": {
"error": "unsupported reach=false: transport"
}
},
{
"fixture": "owner_hash_mismatch",
"exit_code": 1,
"result": {
"error": "owner approval hash mismatch: D05-P04-SHIFT-1800"
}
}
]
}
},
{
"name": "checker_join_fixtures",
"exit_code": 0,
"result": {
"scope": "semantic controls only; no new native execution",
"results": [
{
"case": "B1_cannot_supply_power_stop",
"result": "rejected",
"error": "power_stop requires S4; B1 is dependency/closure diagnostic only"
},
{
"case": "B1_real_despawn_positive",
"result": "accepted"
},
{
"case": "dependency_reason_relabelled_as_NO_POWER",
"result": "rejected",
"error": "B1 power Runtime facility/service join"
},
{
"case": "B1_missing_at_closure",
"result": "rejected",
"error": "B1 real B before/at closure"
},
{
"case": "B1_synthetic_later_guest",
"result": "rejected",
"error": "B1 normal despawn after departure"
},
{
"case": "B1_wrong_release_minute",
"result": "rejected",
"error": "B1 immutable reservation join"
},
{
"case": "B1_changed_wallet",
"result": "rejected",
"error": "B1 B wallet/no economy charge"
},
{
"case": "B1_missing_departure_history",
"result": "rejected",
"error": "B1 persisted departure join"
},
{
"case": "R2_real_first_1080_positive",
"result": "accepted"
},
{
"case": "R2_paid_midnight_substitution",
"result": "rejected",
"error": "shift raw service join"
},
{
"case": "R2_wrong_transaction",
"result": "rejected",
"error": "native receipt transaction"
},
{
"case": "R2_missing_DAY2",
"result": "rejected",
"error": "shift DAY2 before/after handover"
},
{
"case": "R2_after_staff_still_present",
"result": "rejected",
"error": "shift DAY2 before/after handover"
},
{
"case": "R2_next_extra_receipt",
"result": "rejected",
"error": "native duplicate/empty receipt"
},
{
"case": "R2_dynamic_PID_and_transaction_positive",
"result": "accepted"
},
{
"case": "R2_wrong_PID_join",
"result": "rejected",
"error": "native PID chain"
},
{
"case": "S1_pre_travel_mismatch",
"result": "rejected",
"error": "S1 pre-travel staff cell/task/raw reservation join"
},
{
"case": "S1_no_actual_outage",
"result": "rejected",
"error": "S1 actual reserve exhaustion/tick"
},
{
"case": "historical_receipt_checked_against_current_wrapper",
"result": "rejected",
"error": "S4 historical pin in fresh receipt"
},
{
"case": "current_wrapper_used_as_historical_receipt",
"result": "rejected",
"error": "S4 historical receipt wrapper pin"
},
{
"case": "fresh_receipt_carrying_historical_pin",
"result": "rejected",
"error": "S4 historical pin in fresh receipt"
},
{
"case": "tampered_historical_pinned_copy",
"result": "rejected",
"error": "S4 tampered historical wrapper pin"
},
{
"case": "S4_real_NO_POWER_positive",
"result": "accepted"
},
{
"case": "S4_related_facility_operating_false",
"result": "rejected",
"error": "S4 related facility must remain operating/powered"
},
{
"case": "S4_kitchen_unpowered",
"result": "rejected",
"error": "S4 related facility must remain operating/powered"
},
{
"case": "S4_closure_confound",
"result": "rejected",
"error": "S4 closure/damage/shift confound"
},
{
"case": "S4_no_actual_outage",
"result": "rejected",
"error": "S4 actual NO_POWER path, not relabelled dependency"
},
{
"case": "S4_wrong_transaction_join",
"result": "rejected",
"error": "S4 transaction/service join"
},
{
"case": "S4_dynamic_service_and_sale_positive",
"result": "accepted"
}
]
}
}
]
@@ -0,0 +1,65 @@
{
"M": "c0ea009b28a7649aca6a433a1a24dc0be5e7ab81",
"sources": {
"scripts/core/command_queue.gd": {
"sha256": "09b22e6212fa3ce1bf08f5d6b52224a2d3362b3bc63f03a8c98e89af1c6f5895",
"functions": {
"enqueue": {
"line": 15,
"body_sha256": "56a1fe8a5dfd00ad81f9844bc8e6f4a6ce9009dadbc9cd2b7ff07d14bff1938c",
"full_body": "func enqueue(command: SimulationCommand) -> CommandResult:\n\tif command == null:\n\t\treturn CommandResult.failed(\n\t\t\tCommandResult.Code.INVALID_COMMAND,\n\t\t\t0,\n\t\t\t\"Command is null.\"\n\t\t)\n\n\tvar validation_error := command.validation_error()\n\tif not validation_error.is_empty():\n\t\treturn CommandResult.failed(\n\t\t\tCommandResult.Code.INVALID_COMMAND,\n\t\t\tcommand.command_id,\n\t\t\tvalidation_error\n\t\t)\n\n\tif _known_command_ids.has(command.command_id):\n\t\treturn CommandResult.failed(\n\t\t\tCommandResult.Code.DUPLICATE_COMMAND_ID,\n\t\t\tcommand.command_id,\n\t\t\t\"command_id has already been accepted.\",\n\t\t\t{\"original_command_id\": command.command_id}\n\t\t)\n\n\tif not command.idempotency_key.is_empty():\n\t\tvar key := command.idempotency_key\n\t\tif _idempotency_to_command_id.has(key):\n\t\t\tvar original_id: int = _idempotency_to_command_id[key]\n\t\t\tvar duplicate_details := {\n\t\t\t\t\"idempotency_key\": String(key),\n\t\t\t\t\"original_command_id\": original_id,\n\t\t\t\t\"processed\": _processed_results.has(original_id),\n\t\t\t}\n\t\t\tif _processed_results.has(original_id):\n\t\t\t\tvar prior: CommandResult = _processed_results[original_id]\n\t\t\t\tduplicate_details[\"original_result\"] = prior.to_dictionary()\n\t\t\treturn CommandResult.failed(\n\t\t\t\tCommandResult.Code.DUPLICATE_IDEMPOTENCY_KEY,\n\t\t\t\tcommand.command_id,\n\t\t\t\t\"idempotency_key has already been accepted.\",\n\t\t\t\tduplicate_details\n\t\t\t)\n\n\tvar queued_command := command.copy()\n\t_pending.append(queued_command)\n\t_known_command_ids[queued_command.command_id] = true\n\t_accepted_metadata[queued_command.command_id] = {\n\t\t\"command_id\": queued_command.command_id,\n\t\t\"idempotency_key\": String(queued_command.idempotency_key),\n\t}\n\tif not queued_command.idempotency_key.is_empty():\n\t\t_idempotency_to_command_id[queued_command.idempotency_key] = queued_command.command_id\n\t_pending.sort_custom(_comes_before)\n\treturn CommandResult.succeeded(queued_command.command_id)\n\n\n"
},
"execute_ready": {
"line": 83,
"body_sha256": "d8c534217e704cd892401904768a883c9a3ec2f3852ae7c0438f2eb854b4f7aa",
"full_body": "func execute_ready(current_tick: int, executor: Callable) -> Array[CommandResult]:\n\tvar results: Array[CommandResult] = []\n\tfor command in drain_ready(current_tick):\n\t\tvar accepted_command_id := command.command_id\n\t\tvar result: CommandResult\n\t\tif not executor.is_valid():\n\t\t\tresult = CommandResult.failed(\n\t\t\t\tCommandResult.Code.EXECUTOR_FAILED,\n\t\t\t\tcommand.command_id,\n\t\t\t\t\"Executor is not callable.\"\n\t\t\t)\n\t\telse:\n\t\t\tvar returned: Variant = executor.call(command)\n\t\t\tif returned is CommandResult:\n\t\t\t\tresult = returned\n\t\t\telif returned is bool and returned:\n\t\t\t\tresult = CommandResult.succeeded(command.command_id)\n\t\t\telse:\n\t\t\t\tresult = CommandResult.failed(\n\t\t\t\t\tCommandResult.Code.EXECUTOR_FAILED,\n\t\t\t\t\tcommand.command_id,\n\t\t\t\t\t\"Executor did not return a successful CommandResult.\"\n\t\t\t\t)\n\n\t\tvar completed_result := complete(accepted_command_id, result)\n\t\tresults.append(completed_result)\n\treturn results\n\n\n"
},
"complete": {
"line": 112,
"body_sha256": "4290ebfe68d9245b4e8ebb6d8a09ba6172f16bcacb6e4294299ad6dc06c56ed7",
"full_body": "func complete(command_id: int, result: CommandResult) -> CommandResult:\n\tif not _in_flight.has(command_id):\n\t\treturn CommandResult.failed(\n\t\t\tCommandResult.Code.NOT_FOUND,\n\t\t\tcommand_id,\n\t\t\t\"Command is not in flight.\"\n\t\t)\n\tif result == null:\n\t\treturn CommandResult.failed(\n\t\t\tCommandResult.Code.INVALID_COMMAND,\n\t\t\tcommand_id,\n\t\t\t\"Result is null.\"\n\t\t)\n\n\tvar stored_result := result.copy()\n\tstored_result.command_id = command_id\n\t_processed_results[command_id] = stored_result\n\t_in_flight.erase(command_id)\n\treturn stored_result.copy()\n\n\n"
},
"get_accepted_command_metadata": {
"line": 174,
"body_sha256": "60841dbff80282e95460e8dfeaeb6ae37a0cc05f2c7654130e8b8c51729e5b39",
"full_body": "func get_accepted_command_metadata() -> Array[Dictionary]:\n\tvar result: Array[Dictionary] = []\n\tvar command_ids: Array = _accepted_metadata.keys()\n\tcommand_ids.sort()\n\tfor command_id: Variant in command_ids:\n\t\tresult.append((_accepted_metadata[command_id] as Dictionary).duplicate(true))\n\treturn result\n\n\n"
},
"create_snapshot": {
"line": 189,
"body_sha256": "15737e59018ae93092c1aca3ce268d2bc354c28a8261d4ffada4aba63af3d241",
"full_body": "func create_snapshot() -> Dictionary:\n\tvar pending_data: Array[Dictionary] = []\n\tfor command in _pending:\n\t\tpending_data.append(command.to_dictionary())\n\tvar in_flight_ids: Array = _in_flight.keys()\n\tin_flight_ids.sort()\n\tvar in_flight_data: Array[Dictionary] = []\n\tfor command_id: Variant in in_flight_ids:\n\t\tvar command: SimulationCommand = _in_flight[command_id]\n\t\tin_flight_data.append(command.to_dictionary())\n\tvar processed_ids: Array = _processed_results.keys()\n\tprocessed_ids.sort()\n\tvar processed_data: Array[Dictionary] = []\n\tfor command_id: Variant in processed_ids:\n\t\tvar result: CommandResult = _processed_results[command_id]\n\t\tprocessed_data.append(result.to_dictionary())\n\tvar idempotency_data := {}\n\tvar idempotency_keys: Array = _idempotency_to_command_id.keys()\n\tidempotency_keys.sort_custom(func(a: Variant, b: Variant) -> bool: return String(a) < String(b))\n\tfor key: Variant in idempotency_keys:\n\t\tidempotency_data[String(key)] = int(_idempotency_to_command_id[key])\n\treturn {\n\t\t\"version\": SNAPSHOT_VERSION,\n\t\t\"pending\": pending_data,\n\t\t\"in_flight\": in_flight_data,\n\t\t\"processed\": processed_data,\n\t\t\"idempotency\": idempotency_data,\n\t\t\"accepted\": get_accepted_command_metadata(),\n\t}\n\n\n"
}
}
},
"scripts/core/stable_id_generator.gd": {
"sha256": "78e0dd691ba18d1f159d9d7abba5894d2e10d36885aa6dc5be02a27f9edd5013",
"functions": {
"next_id": {
"line": 9,
"body_sha256": "cf1cf036adab2eb36acab25a069b5dfc42e7aa281c491bd89ade6d91f6eb2c1d",
"full_body": "func next_id(prefix: StringName) -> StringName:\n\tif not _is_valid_prefix(String(prefix)):\n\t\tpush_error(\"Stable ID prefix must be lowercase ASCII snake_case\")\n\t\treturn &\"\"\n\tvar next_value := int(_counters.get(prefix, 0)) + 1\n\tif next_value > MAX_COUNTER:\n\t\tpush_error(\"Stable ID counter exhausted for '%s'\" % prefix)\n\t\treturn &\"\"\n\t_counters[prefix] = next_value\n\treturn StringName(\"%s.%012d\" % [prefix, next_value])\n\n"
},
"create_snapshot": {
"line": 23,
"body_sha256": "cab243cf59d5d56ff03beb305070f83b66d7a55cce7f3f2f889c0d9a5303e76a",
"full_body": "func create_snapshot() -> Dictionary:\n\tvar counters := {}\n\tvar prefixes: Array = _counters.keys()\n\tprefixes.sort()\n\tfor prefix: Variant in prefixes:\n\t\tcounters[String(prefix)] = int(_counters[prefix])\n\treturn {\n\t\t\"version\": SNAPSHOT_VERSION,\n\t\t\"counters\": counters,\n\t}\n\n"
}
}
},
"scripts/core/domain_event_stream.gd": {
"sha256": "f9b57a4b4b53cf7d67132a159ea90378c633b4f19d8de28dbe7a33ebce8e3d79",
"functions": {
"publish_batch": {
"line": 40,
"body_sha256": "275be0d68c99217732ea3dc2821cf7dcec24a695035e455af7f716d901147167",
"full_body": "func publish_batch(events: Array) -> bool:\n\tif events.size() > MAX_BATCH_SIZE:\n\t\treturn false\n\tvar committed: Array[SimulationDomainEvent] = []\n\tvar batch_ids: Dictionary = {}\n\tfor event_value: Variant in events:\n\t\tif not event_value is SimulationDomainEvent:\n\t\t\treturn false\n\t\tvar event: SimulationDomainEvent = event_value\n\t\tif event == null or not event.is_valid() \\\n\t\tor _published_ids.has(event.event_id) or batch_ids.has(event.event_id):\n\t\t\treturn false\n\t\tbatch_ids[event.event_id] = true\n\t\tcommitted.append(event.copy())\n\tif not committed.is_empty():\n\t\t_snapshot_ids_dirty = true\n\tfor event: SimulationDomainEvent in committed:\n\t\t_published_ids[event.event_id] = true\n\t\t_recent_events.append(event.copy())\n\t\tif _recent_events.size() > RECENT_EVENT_LIMIT:\n\t\t\t_recent_events.pop_front()\n\t\t_pending_deliveries.append(event.copy())\n\t_drain_deliveries()\n\treturn true\n\n\n"
},
"create_snapshot": {
"line": 96,
"body_sha256": "94fc2dd3ef1a953ba7d9b3d3728c0d158bf0f69935874f48722a3c6025447dbf",
"full_body": "func create_snapshot() -> Dictionary:\n\tif _snapshot_ids_dirty:\n\t\t_snapshot_ids.clear()\n\t\tfor event_id: Variant in _published_ids:\n\t\t\t_snapshot_ids.append(String(event_id))\n\t\t_snapshot_ids.sort()\n\t\t_snapshot_ids_dirty = false\n\tvar saved_ids: Array[String] = _snapshot_ids.duplicate()\n\tvar saved_recent: Array[Dictionary] = []\n\tfor event in _recent_events:\n\t\tsaved_recent.append(event.to_dictionary())\n\treturn {\n\t\t\"version\": SNAPSHOT_VERSION,\n\t\t\"published_ids\": saved_ids,\n\t\t\"recent_events\": saved_recent,\n\t}\n\n"
}
}
}
}
}
@@ -0,0 +1,463 @@
{
"repair": 45,
"status": "ready",
"scope": "Worker implementation ready for submission only; whole unit incomplete",
"repair44_attempt": {
"repair": 44,
"status": "blocked",
"scope": "Actual worker checks only; no native or formal acceptance",
"blocker": {
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-root-q-r43-eb94e1d7/tools/run_all_tests.py",
"operation": "UID pure control module read",
"error": "PermissionError: [Errno 1] Operation not permitted",
"stop_authority": "REPAIR44: stop for an actually unreadable file"
},
"approval_sha256": {
"expected": "cd365ded1b777a0327d090709f0a4161f5005562819183455d9f2e106fba3e96",
"actual": "cd365ded1b777a0327d090709f0a4161f5005562819183455d9f2e106fba3e96",
"result": "PASS"
},
"spec": {
"raw_bytes": 7000,
"raw_sha256": "d28aadb044633f7d804de5a92c8d4c4a7438dfbf44c3243dca978951f4def25f",
"one_final_LF_removed_sha256": "9ec722e7dfb0bee178d291624a026420c08412574e238bba1fde012c7a6f7881",
"existing_protocol": "PASS"
},
"q43_handoff_INDEX": {
"entries": 14,
"exact_raw_bytes_and_sha256": "PASS"
},
"pure_controls": [
{
"name": "negative",
"exit_code": 0
},
{
"name": "join",
"exit_code": 0
},
{
"name": "encoder",
"exit_code": 0
},
{
"name": "approval",
"exit_code": 0
},
{
"name": "candidate",
"exit_code": 0
},
{
"name": "series",
"exit_code": 0
},
{
"name": "wrapper",
"exit_code": 0
},
{
"name": "full-suite-negatives",
"exit_code": 0
},
{
"name": "guard-mutations",
"exit_code": 0
},
{
"name": "UID",
"exit_code": 1
},
{
"name": "power-adapter",
"exit_code": 0
},
{
"name": "repair44",
"exit_code": 0
}
],
"pure_results": {
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/REPAIR44_PURE_RESULTS.json",
"sha256": "4a702903f9d3189af50b68383cc5bc7829a7480b3a0199459e5b9b3ed710733e"
},
"new_controls": {
"source": "s5/repair44_controls.py",
"synthetic_only": true,
"paid_mutations_rejected": 17,
"roster_name_sync_probe_regex_self_check": "PASS",
"no_pyc": "PASS"
},
"not_run": [
"AST and explicit build-cfile py_compile on every touched Python file (stopped before this stage)",
"Check-only S1-S5 plan (stopped before this stage)",
"Fresh native S1-S5 and independent Reader",
"Fresh collect, full184, index, verify-only, registered validation, independent whole-unit review and integration"
],
"formal_acceptance": false
},
"compile_checks": [
{
"file": "docs/plans/original-completion-2026-10-02/execution/p04-01/checker_negative_fixtures.py",
"AST_exit_code": 0,
"py_compile_exit_code": 0,
"cfile": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/11.pyc"
},
{
"file": "docs/plans/original-completion-2026-10-02/execution/p04-01/p04_native_series.py",
"AST_exit_code": 0,
"py_compile_exit_code": 0,
"cfile": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/12.pyc"
},
{
"file": "docs/plans/original-completion-2026-10-02/execution/p04-01/s5/repair44_controls.py",
"AST_exit_code": 0,
"py_compile_exit_code": 0,
"cfile": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/16.pyc"
},
{
"file": "docs/plans/original-completion-2026-10-02/execution/p04-01/s5/run_s5_native.py",
"AST_exit_code": 0,
"py_compile_exit_code": 0,
"cfile": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/17.pyc"
},
{
"file": "docs/plans/original-completion-2026-10-02/execution/p04-01/s5/s5_order_adapter.py",
"AST_exit_code": 0,
"py_compile_exit_code": 0,
"cfile": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/18.pyc"
},
{
"file": "docs/plans/original-completion-2026-10-02/execution/p04-01/s5/s5_order_adapter_controls.py",
"AST_exit_code": 0,
"py_compile_exit_code": 0,
"cfile": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/19.pyc"
},
{
"file": "docs/plans/original-completion-2026-10-02/execution/p04-01/s5/s5_power_adapter.py",
"AST_exit_code": 0,
"py_compile_exit_code": 0,
"cfile": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/20.pyc"
},
{
"file": "tools/check_p04_order_evidence.py",
"AST_exit_code": 0,
"py_compile_exit_code": 0,
"cfile": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/21.pyc"
}
],
"uid": {
"name": "UID-repair45",
"argv": [
"python3",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/s5/s5_uid_controls.py",
"--project-root",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/verified-m-engine-free-r45",
"--scratch",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/uid"
],
"exit_code": 0,
"stdout": "{\"accepted\": false, \"Root-only\": true, \"controls\": [\"positive\", \"extra\", \"original\", \"owner\", \"existing-collision\", \"generated-collision\", \"no-newline\", \"crlf\", \"uppercase\", \"too-long\", \"hardlink\", \"symlink\", \"missing\", \"post-seal-reports\"], \"uid_helper\": {\"helper_path\": \"tools/run_p13_reference_tests.py\", \"helper_sha256\": \"9adc8aa2a7662df8dd70386ddb0bff34574e44d7411de3b6128ddd15eb24675c\", \"helper_bytes\": 13957, \"functions\": {\"uid_plan\": \"c9b094e12e3ace11b4c81365d134f7a218dd73ca8e6501f5f860acd2af0e980d\", \"uid_snapshot\": \"2987194db9bcfaf781e25808c755a9d8c8b87cb7f57f92a8f8e4292c2823c4e9\"}, \"shared_module\": \"tools/run_all_tests.py\", \"shared_sha256\": \"320ca668732b4ff72fc4449998af2327d4e5c527b06896740806aaf0487282b4\"}, \"scratch\": \"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/uid\"}\n",
"stderr": ""
},
"no_pyc": {
"exit_code": 0,
"files": [],
"scope": "execution/p04-01/**/*.pyc and tools/check_p04_order_evidence.py source only"
},
"check_only_initial_argument_refusals": [
{
"series": "s1",
"argv": [
"python3",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/s1/run_s1_native.py",
"--project-root",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement",
"--main",
"c0ea009b28a7649aca6a433a1a24dc0be5e7ab81",
"--submission",
"eb94e1d7dbae3b0be84171b4ef0024b4f6b0ae97",
"--check-only",
"--plan",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/s1-plan.json",
"--output",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/s1-native"
],
"exit_code": 2,
"stdout": "",
"stderr": "ValueError: fresh-q requires a full HEX40 triple without --historical-r17\n"
},
{
"series": "s2a",
"argv": [
"python3",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/s2/run_s2a_native.py",
"--project-root",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement",
"--main",
"c0ea009b28a7649aca6a433a1a24dc0be5e7ab81",
"--submission",
"eb94e1d7dbae3b0be84171b4ef0024b4f6b0ae97",
"--check-only",
"--plan",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/s2a-plan.json",
"--output",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/s2a-native"
],
"exit_code": 2,
"stdout": "",
"stderr": "ValueError: fresh-q requires a full HEX40 triple without --historical-r17\n"
},
{
"series": "s2b",
"argv": [
"python3",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/s2b/run_s2b_native.py",
"--project-root",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement",
"--main",
"c0ea009b28a7649aca6a433a1a24dc0be5e7ab81",
"--submission",
"eb94e1d7dbae3b0be84171b4ef0024b4f6b0ae97",
"--check-only",
"--plan",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/s2b-plan.json",
"--output",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/s2b-native"
],
"exit_code": 2,
"stdout": "",
"stderr": "ValueError: fresh-q requires a full HEX40 triple without --historical-r17\n"
},
{
"series": "s3",
"argv": [
"python3",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/s3/run_s3_native.py",
"--project-root",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement",
"--main",
"c0ea009b28a7649aca6a433a1a24dc0be5e7ab81",
"--submission",
"eb94e1d7dbae3b0be84171b4ef0024b4f6b0ae97",
"--check-only",
"--plan",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/s3-plan.json",
"--output",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/s3-native"
],
"exit_code": 2,
"stdout": "",
"stderr": "ValueError: fresh-q requires a full HEX40 triple without --historical-r17\n"
},
{
"series": "s4",
"argv": [
"python3",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/s4/run_s4_native.py",
"--project-root",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement",
"--main",
"c0ea009b28a7649aca6a433a1a24dc0be5e7ab81",
"--submission",
"eb94e1d7dbae3b0be84171b4ef0024b4f6b0ae97",
"--check-only",
"--plan",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/s4-plan.json",
"--output",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/s4-native"
],
"exit_code": 2,
"stdout": "",
"stderr": "ValueError: fresh-q requires a full HEX40 triple without --historical-r17\n"
},
{
"series": "s5",
"argv": [
"python3",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/s5/run_s5_native.py",
"--project-root",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement",
"--main",
"c0ea009b28a7649aca6a433a1a24dc0be5e7ab81",
"--submission",
"eb94e1d7dbae3b0be84171b4ef0024b4f6b0ae97",
"--check-only",
"--plan",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/s5-plan.json",
"--output",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/s5-native"
],
"exit_code": 2,
"stdout": "",
"stderr": "ValueError: fresh-q requires a full HEX40 triple without --historical-r17\n"
}
],
"check_only": {
"tree_argument_scope": "Actual HEAD tree only; W is dirty, not a final Q or C claim",
"results": [
{
"series": "s1",
"argv": [
"python3",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/s1/run_s1_native.py",
"--project-root",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement",
"--main",
"c0ea009b28a7649aca6a433a1a24dc0be5e7ab81",
"--submission",
"eb94e1d7dbae3b0be84171b4ef0024b4f6b0ae97",
"--check-only",
"--plan",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/s1-plan.json",
"--output",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/s1-native",
"--tested-tree",
"af5256155815214dc73620d5a2ad04cbcd139274"
],
"exit_code": 2,
"stdout": "",
"stderr": "ValueError: checkout is not clean\n"
},
{
"series": "s2a",
"argv": [
"python3",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/s2/run_s2a_native.py",
"--project-root",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement",
"--main",
"c0ea009b28a7649aca6a433a1a24dc0be5e7ab81",
"--submission",
"eb94e1d7dbae3b0be84171b4ef0024b4f6b0ae97",
"--check-only",
"--plan",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/s2a-plan.json",
"--output",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/s2a-native",
"--tested-tree",
"af5256155815214dc73620d5a2ad04cbcd139274"
],
"exit_code": 2,
"stdout": "",
"stderr": "ValueError: checkout is not clean\n"
},
{
"series": "s2b",
"argv": [
"python3",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/s2b/run_s2b_native.py",
"--project-root",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement",
"--main",
"c0ea009b28a7649aca6a433a1a24dc0be5e7ab81",
"--submission",
"eb94e1d7dbae3b0be84171b4ef0024b4f6b0ae97",
"--check-only",
"--plan",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/s2b-plan.json",
"--output",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/s2b-native",
"--tested-tree",
"af5256155815214dc73620d5a2ad04cbcd139274"
],
"exit_code": 2,
"stdout": "",
"stderr": "ValueError: checkout is not clean\n"
},
{
"series": "s3",
"argv": [
"python3",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/s3/run_s3_native.py",
"--project-root",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement",
"--main",
"c0ea009b28a7649aca6a433a1a24dc0be5e7ab81",
"--submission",
"eb94e1d7dbae3b0be84171b4ef0024b4f6b0ae97",
"--check-only",
"--plan",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/s3-plan.json",
"--output",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/s3-native",
"--tested-tree",
"af5256155815214dc73620d5a2ad04cbcd139274"
],
"exit_code": 2,
"stdout": "",
"stderr": "ValueError: checkout is not clean\n"
},
{
"series": "s4",
"argv": [
"python3",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/s4/run_s4_native.py",
"--project-root",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement",
"--main",
"c0ea009b28a7649aca6a433a1a24dc0be5e7ab81",
"--submission",
"eb94e1d7dbae3b0be84171b4ef0024b4f6b0ae97",
"--check-only",
"--plan",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/s4-plan.json",
"--output",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/s4-native",
"--tested-tree",
"af5256155815214dc73620d5a2ad04cbcd139274"
],
"exit_code": 2,
"stdout": "",
"stderr": "ValueError: checkout is not clean\n"
},
{
"series": "s5",
"argv": [
"python3",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/s5/run_s5_native.py",
"--project-root",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement",
"--main",
"c0ea009b28a7649aca6a433a1a24dc0be5e7ab81",
"--submission",
"eb94e1d7dbae3b0be84171b4ef0024b4f6b0ae97",
"--check-only",
"--plan",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/s5-plan.json",
"--output",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair45-1792309312161922000/s5-native",
"--tested-tree",
"af5256155815214dc73620d5a2ad04cbcd139274"
],
"exit_code": 2,
"stdout": "",
"stderr": "ValueError: checkout is not clean\n"
}
]
},
"retained_passes": "REPAIR44 roster positives/negatives, all-consumer name-sync, probe_guard regex self-check, 17 paid-before-incident mutations; no source changed in REPAIR45",
"pure_results": {
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/REPAIR44_PURE_RESULTS.json",
"sha256": "569063467403bd004ff5b342486a822bba430f6e81a3e8081ed44cb50d23e5dd"
},
"formal_acceptance": false,
"not_run": [
"Clean exact-Q check-only after automatic submission (Root)",
"Fresh native S1-S4 and ten S5 cases; independent Reader and fresh order positives",
"Fresh adapters/collect/full184/index/verify-only/registered validation/independent whole-unit review/integration"
]
}
@@ -0,0 +1,468 @@
# REPAIR41 history and REPAIR45 status
## REPAIR45 — implementation ready for submission
The supplied byte-verified M engine-free context resolved the REPAIR44 UID dependency.
UID controls: all 14 PASS, exit 0. Both supplied helper SHA-256 pins match exactly.
AST and explicit fresh BUILD-cfile py_compile passed for all eight touched Python
files, with python3 -B and PYTHONDONTWRITEBYTECODE=1. No source was changed in
REPAIR45; retained passing controls were not rerun. The no-pyc static check
passed again (exit 0); generated compile files exist only under allocated BUILD.
The prior UID failure remains recorded as failed, not replaced with a PASS.
Sequential check-only S1, S2a, S2b, S3, S4 and S5 each returned exit 2:
`ValueError: checkout is not clean`
The initial missing-tested-tree argument refusals are also retained. The later
attempt used the actual HEAD tree solely as a guard input, not a claim of final
Q, clean source or C. No engine started. Root executes clean exact-Q check-only
after automatic submission. Full argv/stdout/stderr and compile paths are in
REPAIR41_STATIC_CHECKS.json. No Git writes, Runner or native run were performed.
Implementation is ready; the whole original unit remains incomplete and P04
credit remains 0. Deferred Root conditions, in order: freeze final Q; affected
pure controls; clean exact-Q check-only; capacity check; one heavy lease with
fresh native S1–S4 and all ten S5 cases; independent Reader and adapters on actual
raw (including fresh Reader order positives); fresh collect; full 184 suite once;
index; --verify-only; registered validation before review; independent whole-unit
Opus review; normal prepare / exact C / integration / final / Root DB join /
ledger / main push. Native Reader and acceptance remain pending.
patience_release stays pending unless fresh S3 raw shows it. Product freeze,
M, allowed paths, REQUIRED membership/thresholds, all seven domains, G1/G2,
R40–R44 and the existing one-trailing-LF spec protocol remain unchanged.
## REPAIR44
**Worker stopped: unreadable required check dependency.** The UID pure control
cannot read `/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-root-q-r43-eb94e1d7/tools/run_all_tests.py`:
`PermissionError: [Errno 1] Operation not permitted`. REPAIR44 explicitly requires
stopping for an actually unreadable file. No permission bypass or alternate
positive is claimed. REPAIR44_PURE_RESULTS.json retains the failed invocation.
Eleven other pure programs completed successfully (including the new 17 paid
mutation negatives and roster/name-sync/regex/no-pyc controls). The already
launched sequential batch finished power-adapter and repair44 controls after
the UID failure; these results are recorded within their limited scope.
AST/build-cfile compilation of all touched Python files and check-only S1–S5
were not reached. The implementation below is work in progress, not a completed
REPAIR44 submission. Resume requires a readable verified check dependency.
Same original unit, W and submitted S=eb94e1d7dbae3b0be84171b4ef0024b4f6b0ae97;
M=c0ea009b28a7649aca6a433a1a24dc0be5e7ab81. No reset or new counted work.
Original whole unit remains incomplete, formal 16/88, P04 credit 0.
R43 import/parse/Writer passed (2749/0), then run_s5_native.py:525 compared
sorted receipt branches to insertion-order CASES. G/H preceded E/F; all nine
cases were present but Reader never started. R43 native remains FAILED,
alongside r35/r36/R40 native. Q37 remains its own-version local PASS only.
Seven Writer-only typed derivers/G1/G2 and twelve pure/six check-only passes
are not independent Reader, replay or acceptance.
The canonical wrapper roster is now sorted(CASE_TABLE). LABELS, SLOTS and
receipt comparisons derive from it, with exact lengths, uniqueness and set
membership. Reader independently enumerates CASE_TABLE. The new pure controls
reproduce the old failure, accept insertion/reverse order and reject missing,
duplicate or unknown cases and missing/extra/duplicate slots. The ten cases are
`S5A_PURE`, `S5B_DEPENDENCY`, `S5C_DESTRUCTION_COMMAND`, `S5D_DESTRUCTION_RAID`,
`S5D_IN_FLIGHT`, `S5D_PAID_BEFORE_INCIDENT`, `S5E_MIDNIGHT`, `S5F_EXIT`,
`S5G_SHIFT_1080`, `S5H_PAUSED_MIDNIGHT`.
New fixture: primary queues at N-duration-1, starts at N-duration and completes
at N. Secondary queues at N-2 and starts at N-1, holding its own reservation;
two meals are stocked through _stock. Cafeteria definition capacity=12 (line22),
staff_min=2 (line18), base_service_minutes=45 (line24), base_price=25 (line26),
inventory_inputs=one meal (line27), exact file sha256
86d540fe2d78b9dcdbe5a0af6e4a001f4cec54934636ed01deb25a943c79128a.
Staff setup derives staff_min; prices/duration subsequently bind to the primary
service snapshot. Capacity permits the concurrent secondary; no product value
is changed. Seed 420558 is a distinct deterministic fixture seed following the
existing 42055x private-QA family, not a product RNG policy change.
M source proof (full bodies, file hashes and line ranges in
REPAIR44_SOURCE_FACTS.json): simulation_kernel.advance_one_minute line122,
body sha b9587ef722d8c8640248025462819374ae5eca1c3d8bbe600b6bc9c328567777,
runs FACILITY_COMPLETION, VITALS_AND_ENVIRONMENT, INCIDENTS_AND_EVENTS,
FACILITY_QUEUES in that order. _run_phase line236, body sha
52461eeb288892a4bb4b6a99570185af08a30758ef88b0046a911baaa6f318e1,
emits phase-start observations before handlers; therefore completion is
observed as ACTIVE at FACILITY_COMPLETION start and COMPLETED with one receipt
at VITALS_AND_ENVIRONMENT start. Receipt phase is FACILITY_COMPLETION.
Runtime registers the handlers at lines400–428. _advance_relationship_events
line8637, body sha 20ca7abfdcbbc914f91545c3eded46e3e87035ff4153541ffcbf92471b02b03f,
starts the queued automatic event in INCIDENTS_AND_EVENTS. Public registration
and enqueue functions are at lines6878/6887 (full hashes in the source facts).
_validate_event_action line9991, body sha
83e0cce3b59244440b11acdee6f87dd521859701769b1689ff2775db5c92c5f5,
allows SET_FACILITY_STATE for this non-Defense-owned facility. _apply_event_action
line10040, body sha d79e7aca02eed06f500ffc632c6160cd80d76c3d7c5c90dc097f71b60380d365,
calls set_operational_status with durability=0 and suspension_reason=DESTROYED.
The fixture never registers the busy facility as a Defense asset and expects no
guard. FacilityService.start_next_service line449 (body sha
2eb1cf1226fb1496b6b96c39184ad6a767b4fde747923df599097372435ffa4c) checks the
actual instance capacity and starts secondary work with ordinary active staff.
ServiceInstance.mark_failed line128 stores completed_at for failure timing,
body sha 178c6879e64385f0e3ff99fa98ae6ceb4dc67f6c2c981b0effb229f5d4d647fa.
The independent adapter retains payment/release/sales/phase helpers. It proves
the pre-completion state, single typed receipt/Runtime-ledger/idempotency joins,
surviving identical boundary/held sale, one primary wallet debit, financial day
from ledger absolute_minute, positive pre-event durability and BROKEN/DESTROYED
afterward. Secondary stays active/reserved through N and fails/releases once at
N+1 with unchanged wallet, no remaining request/reservation or generated service.
The checker adds this raw-recomputed sub-gate inside D05-P04-DESTRUCTION.
All previous gates and REQUIRED names/thresholds stay intact. Pure mutations
cover every requested failure, including AFTER-copy; they are serializer units,
not substitutes for fresh native Writer/Reader raw.
The six explicitly named __pycache__/*.repair43.pyc were read, byte sizes,
headers and SHA-256 inspected, then deleted; no source/evidence was deleted.
Execution-scope .gitignore now excludes __pycache__/ and *.pyc. Python checks
use -B and explicit py_compile cfile under allocated build. The static control
rejects any remaining *.pyc in the allowed execution tree.
All existing R40–R43 cases, G1/G2 shadow oracle and negatives, R41 diagnostic,
historical/fresh S4 pin separation, 43+ controls and the Step 0 table below are
preserved. Product source/values/guards, permissions, billing, all seven domains
and 15+EV thresholds are unchanged. Approval raw SHA-256 exactly matches
cd365ded1b777a0327d090709f0a4161f5005562819183455d9f2e106fba3e96.
The spec raw is 7000 bytes, sha
d28aadb044633f7d804de5a92c8d4c4a7438dfbf44c3243dca978951f4def25f;
stripping exactly its one final LF gives the registered
9ec722e7dfb0bee178d291624a026420c08412574e238bba1fde012c7a6f7881.
This is the existing spec-only EOF protocol; all other hashes compare raw bytes.
REPAIR41_STATIC_CHECKS.json records actual worker checks only. Native Reader,
formal acceptance and patience_release remain pending (the last needs fresh S3).
Root freezes final Q and follows the twelve steps in s5/S5_ROOT_RUN.md.
## REPAIR42/43 implementation submission
REPAIR43 supplies the coherent remaining QA batch for the same original unit.
Native applicability and acceptance are **not established**. Formal 16/88,
original 30/88 and P04 credit 0 are unchanged. r35, r36 and R40 native remain
FAILED; Q37 remains PASS only for its own version. D05 x6 and A01 stay approved.
The product, Clock, API, values, product tests, contract and 15+EV criteria are
unchanged. No Git write, engine, Runner, full regression or agent launch occurred.
R42 superseded the closed journal-field list and the literal QA file freeze.
The R41 mandatory-membership diagnostic and historical/fresh S4 pin separation
remain in place. Their 14 negative and 29 join controls passed again. The
118-entry Step 0 table below is retained unchanged; all 118 raw hashes were
recomputed and matched in this turn. The R42 directions were both read in full.
### Oracle and source bindings
`REPAIR43_SOURCE_FACTS.json` stores full function bodies read with `git show`
at M `c0ea009b28a7649aca6a433a1a24dc0be5e7ab81`, not signatures or excerpts.
The boundary is the declaration through the bytes before the next function,
including intervening blank lines, matching the R41 source-fact convention.
| Function | M line | Full-body SHA-256 |
| --- | --- | --- |
| CommandQueue.restore_snapshot | 220 | 60e76b45be29068cff5ba29d2006642ed447eea6daf832c75757103a0c70cfe3 |
| StableIdGenerator.restore_snapshot | 34 | 3142b592d4a54b4455949a69b775e280a2fe72b6592fc646644ec7c443b8718b |
| DomainEventStream.restore_snapshot | 113 | 934648473a09fd4276187ced78d51d551a4047d884bbe279722d798f1b94ef96 |
| Runtime.submit_command | 473 | 85e8d94bd933c11d1b7b2e88344b7f8839069d1b96930aa4ad4c76c7356a2e68 |
| Runtime._process_commands | 5737 | 6e2b20f73eeaa73882081526f8be566a484f11e1aa9fbfd697df22b4fc034aca |
| Runtime._publish_domain_event | 2389 | 6253ddb30d5470673285aef922a7caaff7611adaa855bb068e1d52e89b0761a1 |
| Runtime._execute_create_service_request | 7413 | 084a741b5590c691aafde9b8cf978674428cb21d4deb930a783a5039106da6fa |
| Runtime._execute_register_defense_asset | 7229 | 4834ecafd948ad0db04ef0230b4ecff733f3008679c903363ae577dd43e95a95 |
The private `_guard_failure` helper captures a deep typed BEFORE with the
public Clock paused. Public submit_command executes these guards immediately;
they are not tick-only commands, so a twin tick is unnecessary. Operations are
disabled and pending/in-flight queues are empty. Detached public restores feed
enqueue -> execute_ready -> complete. The independently constructed failed
result uses each exact M message, an empty target, fixed command payload, and
G1's independently known raid_id details. The M failed-result site publishes
exactly one COMMAND_FAILED through the shadow event stream and ID generator.
It increments Runtime.next_command_id once. Normal accepted/processed/
idempotency, sorting, ID counters, ring-buffer and drained delivery behavior
come from those public objects. No journal fields are masked or discarded.
EXPECTED is serialized before the actual command is submitted. Whole typed
Runtime bytes must then match, including all business domains. Consequently
there can be no new reservation/request, charge, wallet change or orphan.
G2's existing active service/reservation remains unchanged. An expected-failure
callback checks the exact failed result once; every other command still must
succeed. `s5_guard_oracle.py` independently derives the serializer output from
BEFORE and the fixed command for the pure adapter. It accepts no AFTER input.
The adapter binds G1 to the non-terminal raid asset and G2 to an actual active
service in BEFORE. Copied AFTER/EXPECTED corruptions fail the independent
derivation. Synthetic serializer controls exercise 968 typed mutations across
G1/G2; the same traversal is also applied to fresh native guard raw by Root.
### S5D reachability and coverage
A lawful in-flight path exists. Runtime `_validate_event_action` L9991
(`83e0cce3b59244440b11acdee6f87dd521859701769b1689ff2775db5c92c5f5`)
accepts SET_FACILITY_STATE conditions for an existing non-Defense-owned facility;
it does not reject active_services. `_execute_event_action_boundary` L9957
(`c53cf8153418237ebd0c45ba6eb4672a925fd06998c3cff8392657a5e3e019e0`)
validates and dispatches `_apply_event_action` L10040
(`d79e7aca02eed06f500ffc632c6160cd80d76c3d7c5c90dc097f71b60380d365`).
That calls FacilityService.set_operational_status L132
(`10275169f4a71ad490c432443c34068d1951f099e11132b3c18b48647e7845c8`),
which publicly accepts durability 0 and suspension_reason DESTROYED.
FacilityInstance.set_operational_conditions L165
(`8574adb2957c69e76219c8d34838cacc4df4ff660d5ccd649bbb577b6d60feea`)
evaluates the BROKEN state without completing/failing active services there.
EventService.start_next_event L273 and Runtime._advance_relationship_events
L8637 execute automatic actions in INCIDENTS_AND_EVENTS, after completion.
Their full bodies and hashes are in the source-facts file.
`S5D_IN_FLIGHT` schedules public enqueue_event for N, with natural completion
due at N+1. It requires active service at N after destruction, N+1 BROKEN
failure, one reservation release, zero charge, and formal snapshot replay.
FacilityService._prepare_service_for_tick L853
(`b35c2c0fb23a04258b71995dd7c3b6dfacbbcdf36106e2e3348acef0e18d21cc`)
defines that next-tick failure. This is a new S5 observation, not S3 B4 reuse.
`S5D_DESTRUCTION_RAID` retains its name/slots for a separate idle OBJECTIVE.
Public get_due_rounds L114
(`c8b469d4bd304e8325b60c17a63de07146a0040f9a1b5dde7f2aae60104bf34f`)
must report earliest_minute exactly N. Runtime._advance_defense L8599
(`db38b51531276d2620999d57eed7a6219b73f8b8d9ff3706cf569f4797918527`)
performs the automatic breach. The adapter requires G1, G2 and the idle breach
together, plus the independent in-flight case. All destruction_stop derivations
remain charges 0. No unreachable criterion or fabricated native PASS is claimed.
### Other cases and private abstractions
- S5G_SHIFT_1080 retains the six historical first-18:00 observation labels on
the current typed phase points. The receipt captures actual DAY staff before
handover; the adapter joins its shift ending at 1080 and subsequent OFF_DUTY
state. Exactly one snapshot-priced sale/payment ID and no extra 1081
completion/charge are required. M ShiftInstance.create_standard L71 and
StaffService._update_shift_states L1398 are included in source facts.
- S5H_PAUSED_MIDNIGHT depletes mana before the last pre-midnight MANA evaluation,
retaining the S5B RELATED_FACILITY_INACTIVE pattern. It checks elapsed,
reservation IDs and request preservation through DAILY_CLOSE, no paused
sale, one joined upkeep/payroll settlement, and one new-day recovered sale
with CONSUMED reservations. The boundary slot is formally restored/replayed.
- S5E Writer and restored Reader call the public coordinator advance_to at the
paid boundary minute and record is_replay plus entire typed BEFORE/AFTER.
This supplies same_minute_replay only after actual raw equality; rejected
enqueue is not used as that proof.
- The literal CASE_TABLE continues to define wrapper CASES/LABELS/SLOTS. The
shared Writer/Reader formal-slot machinery is reused for all nine cases.
Fresh verification and combination call the adapters again over fresh raw.
paused_midnight leaves the adapter's pending list only when derivation
succeeds; patience_release still requires fresh S3 evidence.
`REPAIR43_PURE_RESULTS.json` contains actual command outputs. UID controls first
failed because this base checkout lacks the M helper. The retry used a temporary
QA-only copy of exact `git show M` helper bytes, independently matching the
supplied raw pins; all 14 helper controls passed. That is pure-helper evidence,
not final-Q/native applicability. No product or tool file was added to the
checkout. `REPAIR41_STATIC_CHECKS.json` records only checks actually executed.
Fresh order positives and mutations requiring future Writer/Reader raw remain
Root-only; no such positive has been claimed here.
## REPAIR43 spec identity precheck
The complete recorded REPAIR42 and RUN42 files were read and their exact raw
SHA-256 values match the supplied pins. The R42 raw-only spec stop is withdrawn.
The existing `tools/check_p04_order_evidence.py::verify` condition accepts the
spec: raw SHA-256 is
`d28aadb044633f7d804de5a92c8d4c4a7438dfbf44c3243dca978951f4def25f`;
removing its single final LF gives the registered
`9ec722e7dfb0bee178d291624a026420c08412574e238bba1fde012c7a6f7881`.
This protocol applies only to the spec. All other material pins remain exact
raw comparisons. Root's protocol and six controls are recorded in
`build/owner-handoff/p04-after-p26-closure-r01/q43-spec-pin-protocol/ROOT_SPEC_PIN_EOF_PROTOCOL.json`.
The former closed journal-field restriction below is superseded by R42/R43;
allowed QA files may be extended while preserving existing behavior.
Historical REPAIR41 batch status: **BLOCKED**, partial independent fixes only. No native result,
worker-success claim, new counted unit or completion claim. Formal 16/88,
original 30/88 and P04 credit 0 remain unchanged. r35, r36 and R40 remain FAILED;
Q37 remains a local PASS for its own version only. D05 x6 and A01 remain approved.
## Historical source/immutable-oracle conflict (superseded by R42/R43 above)
The clarified G1/G2 oracle permits only the processed-result and idempotency
entries within `command_queue`. M also necessarily adds an `accepted` row.
`CommandQueue.enqueue` records `{ "command_id": command.command_id,
"idempotency_key": String(command.idempotency_key) }` before execution.
`complete` retains this metadata even for a failed result. `create_snapshot`
serializes it as the separate `accepted` array. Consequently an EXPECTED tree
restricted to the enumerated deltas cannot equal AFTER for either guard.
This is a deterministic source-contract conflict, not a routine refactor or a
product defect. No field has been masked and no product change is proposed.
Required clarification: explicitly include the single source-defined `accepted`
metadata row in delta (ii), with exact typed fields derived from the submitted
command, preserving sorted command IDs and every prior row. The row is fully
computable; the blocker is permission to include this additional serialized
delta under the instruction “only these ... deltas.” It is not a missing-file
or hash failure, nor a claim that the serializer is unknowable. The worker has
not silently broadened that oracle.
`REPAIR41_QUEUE_SOURCE_FACTS.json` preserves the full bodies obtained using
read-only `git show` at M `c0ea009b28a7649aca6a433a1a24dc0be5e7ab81`:
| Source function | M line | Full-body SHA-256 |
| --- | --- | --- |
| command_queue.gd enqueue | 15 | 56a1fe8a5dfd00ad81f9844bc8e6f4a6ce9009dadbc9cd2b7ff07d14bff1938c |
| command_queue.gd execute_ready | 83 | d8c534217e704cd892401904768a883c9a3ec2f3852ae7c0438f2eb854b4f7aa |
| command_queue.gd complete | 112 | 4290ebfe68d9245b4e8ebb6d8a09ba6172f16bcacb6e4294299ad6dc06c56ed7 |
| command_queue.gd get_accepted_command_metadata | 174 | 60841dbff80282e95460e8dfeaeb6ae37a0cc05f2c7654130e8b8c51729e5b39 |
| command_queue.gd create_snapshot | 189 | 15737e59018ae93092c1aca3ce268d2bc354c28a8261d4ffada4aba63af3d241 |
| stable_id_generator.gd next_id | 9 | cf1cf036adab2eb36acab25a069b5dfc42e7aa281c491bd89ade6d91f6eb2c1d |
| stable_id_generator.gd create_snapshot | 23 | cab243cf59d5d56ff03beb305070f83b66d7a55cce7f3f2f889c0d9a5303e76a |
| domain_event_stream.gd publish_batch | 40 | 275be0d68c99217732ea3dc2821cf7dcec24a695035e455af7f716d901147167 |
| domain_event_stream.gd create_snapshot | 96 | 94fc2dd3ef1a953ba7d9b3d3728c0d158bf0f69935874f48722a3c6025447dbf |
## Independent repairs implemented
- Mandatory membership is checked before applicability can dereference a missing
condition; the diagnostic names `paused_midnight`. REQUIRED is unchanged.
- Historical S4 receipt verification reads only
`s4/historical/run_s4_native_r28.py.reference`. Provenance:
`befa0ef1f634e734ee156347e8fd02e82eddea49:docs/plans/original-completion-2026-10-02/execution/p04-01/s4/run_s4_native.py`.
The unchanged copy hashes to
`2d3be39d2b310abac058e27336ac816c234043a0a1dd7b2c52d84994907dd31b`.
Fresh S4 verification binds the current wrapper and rejects the historical pin.
- Private helpers centralize mandatory membership and choose historical/current
wrapper verification explicitly. They preserve the required membership and all
existing join negatives; four additional version/pin negatives were added.
- Negative fixtures (14) and join fixtures (29) passed. These are pure controls,
not current native evidence. Full results: `REPAIR41_PURE_RESULTS.json`.
Touched Python AST/py_compile and the unchanged GDScript probe regex check passed.
## Historical REPAIR41 unimplemented work / source search status
S5D re-scope, G1/G2, automatic breach revisions, S5G, S5H, same-minute replay,
adapter derivations/mutations and fresh-condition wiring remain unimplemented.
The initial M runtime search found `EventAction.Type.SET_FACILITY_STATE` handling
in `_validate_event_action` around line 10012; this is a candidate requiring
public/natural triggering and phase-alignment analysis. No conclusion that an
in-flight destruction path exists or is absent is claimed. G1/G2 coverage cannot
be claimed before the exact permitted journal envelope is resolved and checked.
No adapter positive raw or future final-Q helper was invented. The full worker
check set has not passed. No engine, Runner, Git mutation or agent launch occurred.
## Step 0
Step 0 precheck: PASS.
q40/q41 INDEX digests are observed baselines; no independent expected digest was supplied for those indexes. Child expected digests come from their indexes.
| Absolute path | Expected SHA-256 | Observed SHA-256 |
| --- | --- | --- |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_ABSOLUTE_CONTEXT_INDEX.json | 6f0ee990b95a5a897511425cd86ae57ba0364c5b326afdeb9f556fabfea6915c | 6f0ee990b95a5a897511425cd86ae57ba0364c5b326afdeb9f556fabfea6915c |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ACTUAL_OPUS_NEXT_P04_PLAN.json | 217d9bf4ef593fb95a5e726fee0e4497863a0b06663d27ba20e742d81bb9c049 | 217d9bf4ef593fb95a5e726fee0e4497863a0b06663d27ba20e742d81bb9c049 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ACTUAL_OPUS_REPAIR30_DIRECT_CHECKER_PLAN.json | 77801cc6db2a4deb9f76118a746b32eb5e629b2d6980850b8813a12b45016806 | 77801cc6db2a4deb9f76118a746b32eb5e629b2d6980850b8813a12b45016806 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ACTUAL_OPUS_REPAIR30_RUN_DECISION.json | be7be3bfaa5a5ab412db8aecd1d951c213894e485b7869fcc12ab1c75b037c7f | be7be3bfaa5a5ab412db8aecd1d951c213894e485b7869fcc12ab1c75b037c7f |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ACTUAL_OPUS_REPAIR31_CONCRETE_PLAN.json | 857e1acaed2093de56afdd851e69b3129bf9edce72b5da3cdd160ce4b7bfc18a | 857e1acaed2093de56afdd851e69b3129bf9edce72b5da3cdd160ce4b7bfc18a |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ACTUAL_OPUS_REPAIR32_CONCRETE_PLAN.json | 5b69f850f835bd7af37e9c728c484c236c28efb0bd32113bb53bcbaf7d252c0a | 5b69f850f835bd7af37e9c728c484c236c28efb0bd32113bb53bcbaf7d252c0a |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/CURRENT_ROOT_P04_RESUME_FACTS.json | c826726368844a823c54c1df1cdaff43fde5a94a17e638bfc60d8fb2559f8d85 | c826726368844a823c54c1df1cdaff43fde5a94a17e638bfc60d8fb2559f8d85 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/D05_ACTUAL_HUMAN_APPROVAL.json | cd365ded1b777a0327d090709f0a4161f5005562819183455d9f2e106fba3e96 | cd365ded1b777a0327d090709f0a4161f5005562819183455d9f2e106fba3e96 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_FRESH_Q_INPUT_APPROACH_AFTER34.json | 7a7b91cbf04bb84cdef8e7a99ca2140a9eac2ac6a385570b4f0aa0d474e7da92 | 7a7b91cbf04bb84cdef8e7a99ca2140a9eac2ac6a385570b4f0aa0d474e7da92 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_P04_PRESERVED_TO_CURRENT_SOURCE_AUDIT.json | 6bb86959b06acb62d5cd3c5fd00bb6802a80b66184e69abca3f75c46ddeb7a12 | 6bb86959b06acb62d5cd3c5fd00bb6802a80b66184e69abca3f75c46ddeb7a12 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_PLAN_VERSION_NOTES.json | b4336f900a87f9bf0daa1e86728c3a913aed7c09425569e104cc01290be1c62f | b4336f900a87f9bf0daa1e86728c3a913aed7c09425569e104cc01290be1c62f |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/INDEX.json | b2ad602b7bd22dbc4778b60b4a015b1d2f8f06b71278959fb52910f2ee1af57a | b2ad602b7bd22dbc4778b60b4a015b1d2f8f06b71278959fb52910f2ee1af57a |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_CHECK_ONLY.json | aab7dcbfcc934f3bda7d937feb4e7638109ddf645da6ebd57f6190588b55287c | aab7dcbfcc934f3bda7d937feb4e7638109ddf645da6ebd57f6190588b55287c |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_NEGATIVE_GIT.json | e63b1b27244cd042f522a63b4392dea8c7211ce5ca5a927e91856115dfaa9f56 | e63b1b27244cd042f522a63b4392dea8c7211ce5ca5a927e91856115dfaa9f56 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_NEGATIVE_dirty.log | 3ad8ef5d71175bc265f93395fe64a39b05ab65252ad509abc108de15a2b9ab53 | 3ad8ef5d71175bc265f93395fe64a39b05ab65252ad509abc108de15a2b9ab53 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_NEGATIVE_untracked.log | 3ad8ef5d71175bc265f93395fe64a39b05ab65252ad509abc108de15a2b9ab53 | 3ad8ef5d71175bc265f93395fe64a39b05ab65252ad509abc108de15a2b9ab53 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_NEGATIVE_wrong-main.log | 006b9e83c3e106bada560371dda1fb9b4326e3f31fa48fa0c46e7d4903a91e55 | 006b9e83c3e106bada560371dda1fb9b4326e3f31fa48fa0c46e7d4903a91e55 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_NEGATIVE_wrong-submission.log | 6fefa0256b2dbc1596043fbff65fbaf87279baaa770a04d65a5fe70a6476671d | 6fefa0256b2dbc1596043fbff65fbaf87279baaa770a04d65a5fe70a6476671d |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_NEGATIVE_wrong-tree.log | 7fb7a1e4f00f201b7008b6d72957b3d4db450be156a1174b26a22c36d48b5e8f | 7fb7a1e4f00f201b7008b6d72957b3d4db450be156a1174b26a22c36d48b5e8f |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_RESOURCE_ADMISSION.json | 18ef80f33f36cdd6ab664c862a9ae651a649a532bd32c4c35a81640cb4f078a0 | 18ef80f33f36cdd6ab664c862a9ae651a649a532bd32c4c35a81640cb4f078a0 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_STAGE.json | f143045846cf06d79b81a0e52035300251fa576cde9a2d5eeda97d6610fd8591 | f143045846cf06d79b81a0e52035300251fa576cde9a2d5eeda97d6610fd8591 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_check-only.log | 4418f4b6bbe3d88cbf7f0b988084e05b5f0f52c15fe0f466ba82e584408427ce | 4418f4b6bbe3d88cbf7f0b988084e05b5f0f52c15fe0f466ba82e584408427ce |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_pure.log | f77640e0629497389baefc6424cf164d164fb96bbbd48cee6c4d83ed96c253c1 | f77640e0629497389baefc6424cf164d164fb96bbbd48cee6c4d83ed96c253c1 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_REPAIR30_EXECUTION_ORDER_FACTS.json | e18b031e790622929ec2c80ab9a6d5c3d883a364d625b58372fe33fd280ca93f | e18b031e790622929ec2c80ab9a6d5c3d883a364d625b58372fe33fd280ca93f |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_REPAIR31_ACTUAL_FACTS.json | 0ea352b442e88263b899d28d58422afed39855393233c35ed3a962fcab67e136 | 0ea352b442e88263b899d28d58422afed39855393233c35ed3a962fcab67e136 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/INDEX.json | ff43786d898ef3475c267cf22758074a001b3d46dbc2bea52782a3782dd5571e | ff43786d898ef3475c267cf22758074a001b3d46dbc2bea52782a3782dd5571e |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/autoload/simulation_runtime.gd | 45514aea9367ff678f4dc05166bb9b58121f240d4b5565edeb7ab258e3ded8e0 | 45514aea9367ff678f4dc05166bb9b58121f240d4b5565edeb7ab258e3ded8e0 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/scenes/main/main.gd | 92677e4ac57ed8d418a4a716bf0874cbbaea79cff893e5163c82ad1f75e7140a | 92677e4ac57ed8d418a4a716bf0874cbbaea79cff893e5163c82ad1f75e7140a |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/scenes/main/world_preview.gd | 4bc49a19a38b9c3b4d6bfc243ddf46f1f25469a8273adb5e812911ef9424a1f2 | 4bc49a19a38b9c3b4d6bfc243ddf46f1f25469a8273adb5e812911ef9424a1f2 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/scripts/core/save_service.gd | f4c270632225dd046bbff92f9472761d64d63740e93f274828c92dcf912db6a9 | f4c270632225dd046bbff92f9472761d64d63740e93f274828c92dcf912db6a9 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/scripts/relationship/relationship_service.gd | d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3 | d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/scripts/ui/guest_observation_panel.gd | f5de1004fce5445bbfd3ee8d6ec37b325e7a9813d47c19beaeeeb411f27a50a5 | f5de1004fce5445bbfd3ee8d6ec37b325e7a9813d47c19beaeeeb411f27a50a5 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/scripts/ui/room_presentation.gd | 2eda851534777575298ea005e2e6d0ee90785a81357d5b9c34cfb95f615a8181 | 2eda851534777575298ea005e2e6d0ee90785a81357d5b9c34cfb95f615a8181 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/tests/business/test_required_kitchen.gd | 3a9c92f80c24064ef0858fba10bd7caab63203932942837f7e142349578f6b2f | 3a9c92f80c24064ef0858fba10bd7caab63203932942837f7e142349578f6b2f |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/tools/regression/suite-policy.json | 7eb085d7e7a383785b4faedb503d0f6002bcad431e3188785aef901ce123769f | 7eb085d7e7a383785b4faedb503d0f6002bcad431e3188785aef901ce123769f |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/full-standard-schema-example/INDEX.json | a7a3299c4d70ea033368a707882856fd5c7f7f4d5a0d5f86bf2fb9b2fe2e53d1 | a7a3299c4d70ea033368a707882856fd5c7f7f4d5a0d5f86bf2fb9b2fe2e53d1 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/full-standard-schema-example/controller-input.json | 24d10b3a91553df54b3b2fd4b1a57dce683cc72a55576e0c73c9e142b335ad40 | 24d10b3a91553df54b3b2fd4b1a57dce683cc72a55576e0c73c9e142b335ad40 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/full-standard-schema-example/controller.py | 9e03ecba1819c449c83a9dfba0f60c0e01f94aad728c46f60dd1db179224a89b | 9e03ecba1819c449c83a9dfba0f60c0e01f94aad728c46f60dd1db179224a89b |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/full-standard-schema-example/run/003-receipt.json | 4ce015c160859612c89e215517826aa1da3582534d27c4688af6a44e37f1b641 | 4ce015c160859612c89e215517826aa1da3582534d27c4688af6a44e37f1b641 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/full-standard-schema-example/run/parse-receipt.json | 1ad82022669a3f197f53ed1e23f23aadc927220f0ba1f857c41f80721bafa443 | 1ad82022669a3f197f53ed1e23f23aadc927220f0ba1f857c41f80721bafa443 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/full-standard-schema-example/run/runner-ended.json | e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 | e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/full-standard-schema-example/run/runner-input.json | 2a76506e923a3a95288ce826b81ed9eab49d4ecee613a2c82ae35e970c68f961 | 2a76506e923a3a95288ce826b81ed9eab49d4ecee613a2c82ae35e970c68f961 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/normal-candidate-example/INDEX.json | 942181cc3efc8207e728233f89626b66eb0c34b582e5c9b0fae294dcf1600c00 | 942181cc3efc8207e728233f89626b66eb0c34b582e5c9b0fae294dcf1600c00 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/normal-candidate-example/ROOT_EXACT_NORMAL_CANDIDATE_72A50A4A.json | 5614c9b1c9eb222dbbcfd9ae1c3b438cc4129c779deba2841d660a8c96b6cfe6 | 5614c9b1c9eb222dbbcfd9ae1c3b438cc4129c779deba2841d660a8c96b6cfe6 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/normal-candidate-example/ROOT_NORMAL_FINAL_72A50A4A.json | b41069126e029c30ab644a62a54cb45ca2e0e504add150020500acba4e249469 | b41069126e029c30ab644a62a54cb45ca2e0e504add150020500acba4e249469 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/normal-candidate-example/ROOT_NORMAL_INTEGRATION_72A50A4A.json | 2f47d39d3f05b3735f0fb3e01adaabf1c66c6a784d60af247063bd90e5ec0d5c | 2f47d39d3f05b3735f0fb3e01adaabf1c66c6a784d60af247063bd90e5ec0d5c |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/INDEX.json | a23f17336a5e701100c224ebcb69f37a8de95aca82658675b692d503798a5232 | a23f17336a5e701100c224ebcb69f37a8de95aca82658675b692d503798a5232 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/OWNER_CLI_REFERENCE.json | 1e360ad1d8057ef649fabe97ac3e98263d2f8c1c4d976d8b6e0a907a49e9158e | 1e360ad1d8057ef649fabe97ac3e98263d2f8c1c4d976d8b6e0a907a49e9158e |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/ROOT_SOURCE_REVIEW_REJECTION_20D0AE5.json | d028dd3862ae663586d49b5843e88d9da82ad7985fa082551438e4a81311073e | d028dd3862ae663586d49b5843e88d9da82ad7985fa082551438e4a81311073e |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/SOURCE_REWORK_ADAPTER_LOCAL_CHECKS.json | 580f2f19d680a23ee4efe6beab68a1aad69e067bc551f623cc7531c6915d7a78 | 580f2f19d680a23ee4efe6beab68a1aad69e067bc551f623cc7531c6915d7a78 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/SOURCE_REWORK_CURRENT_REFERENCE_INDEX.json | b0ecce7ae523527fdc6272e9784eba6109d67c0cd3745a8aaab64d913ca8adbd | b0ecce7ae523527fdc6272e9784eba6109d67c0cd3745a8aaab64d913ca8adbd |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/core.py.reference | 4c6067bbd57034764873a468ff161a6882d232503043d5640fc83dea0b455856 | 4c6067bbd57034764873a468ff161a6882d232503043d5640fc83dea0b455856 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/current-owner-cli.py.reference | 0cfd9634e4a59755b89d2927d60b6092368529f2ca7188d949da7f88080359aa | 0cfd9634e4a59755b89d2927d60b6092368529f2ca7188d949da7f88080359aa |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/owner-cli.py.reference | 52c327e624334b51612ea3cb1653aeff4a7a192502d1ba9407ce874af1d92410 | 52c327e624334b51612ea3cb1653aeff4a7a192502d1ba9407ce874af1d92410 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/owner-source-rework-20d0ae5.py.reference | 9ecf7bebf666a67a8f13357d66e9c1d8d76940ef8212f0055537b728c75e0cbc | 9ecf7bebf666a67a8f13357d66e9c1d8d76940ef8212f0055537b728c75e0cbc |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/FAILED_EXECUTION.json | 6e48da89ce852dacdbff2d0f93a8903583dccd9e05f5e34bb68be0d63f540332 | 6e48da89ce852dacdbff2d0f93a8903583dccd9e05f5e34bb68be0d63f540332 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/FAILED_IMPORT_COMBINED.log | cd39b1711f530454b0ec263ab2d076d714f674d5a36e26f9ef16788799b76764 | cd39b1711f530454b0ec263ab2d076d714f674d5a36e26f9ef16788799b76764 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/FAILED_OUTER_OWNED_FINALLY.json | ee14a347724aedb2ae8afecc0775250b1e014c17e726210e2535d6108e57edc0 | ee14a347724aedb2ae8afecc0775250b1e014c17e726210e2535d6108e57edc0 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/INDEX.json | 0e4334442ce89b0388e10a4b62b5e00acbce2013e3ef1967508a3c48d72dc9c1 | 0e4334442ce89b0388e10a4b62b5e00acbce2013e3ef1967508a3c48d72dc9c1 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/P13_CONTROLLER_REFERENCE_INDEX.json | 48434362232d6b58cca720868c6d87f2af48675f365855b8a4a97eb5071dfee3 | 48434362232d6b58cca720868c6d87f2af48675f365855b8a4a97eb5071dfee3 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/P13_FULL_CONTROLLER_PATTERN.py.reference | 9e03ecba1819c449c83a9dfba0f60c0e01f94aad728c46f60dd1db179224a89b | 9e03ecba1819c449c83a9dfba0f60c0e01f94aad728c46f60dd1db179224a89b |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/ROOT_Q35_DIAGNOSTIC_IMPORT_SOURCE_DELTA.json | 1994e59a498f3dbca1fd589b16b5bc6305d2786c0fa730ac489590469f08b05d | 1994e59a498f3dbca1fd589b16b5bc6305d2786c0fa730ac489590469f08b05d |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/ROOT_Q35_FAILED_IMPORT_UID_CLASSIFICATION.json | bc0a863e52db4f98b4b2ee4bc0b513c73f841726789a2ca99521c1b8618dc6c3 | bc0a863e52db4f98b4b2ee4bc0b513c73f841726789a2ca99521c1b8618dc6c3 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/run_all_tests.py.reference | 320ca668732b4ff72fc4449998af2327d4e5c527b06896740806aaf0487282b4 | 320ca668732b4ff72fc4449998af2327d4e5c527b06896740806aaf0487282b4 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/run_p13_reference_tests.py.reference | 9adc8aa2a7662df8dd70386ddb0bff34574e44d7411de3b6128ddd15eb24675c | 9adc8aa2a7662df8dd70386ddb0bff34574e44d7411de3b6128ddd15eb24675c |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/INDEX.json | cef78b200268e27a6e73ccd926ac95d0b2b6e30b9338a8412da9ab48b68ca82a | cef78b200268e27a6e73ccd926ac95d0b2b6e30b9338a8412da9ab48b68ca82a |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/SAFETY_REAUDIT.json | 8edf11fe7893ced7c6450feb1ee3db45ab0a145db572254d2102ee70e26ac26e | 8edf11fe7893ced7c6450feb1ee3db45ab0a145db572254d2102ee70e26ac26e |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/TYPED_AUDIT.json | e1800e1679b570ecdd9d7537e87e0730c089fa3b4c6197d3e279e60959aad016 | e1800e1679b570ecdd9d7537e87e0730c089fa3b4c6197d3e279e60959aad016 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/command_queue.gd.reference | 09b22e6212fa3ce1bf08f5d6b52224a2d3362b3bc63f03a8c98e89af1c6f5895 | 09b22e6212fa3ce1bf08f5d6b52224a2d3362b3bc63f03a8c98e89af1c6f5895 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/facility_instance.gd.reference | 0c6aa493f3299611e05dd26aa429dda8cf7b5c479e4d09632036fb862f79a324 | 0c6aa493f3299611e05dd26aa429dda8cf7b5c479e4d09632036fb862f79a324 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/writer-S5A_PURE-before.json | af7b1f0099b37298b1bf0d683f98c0ec84fae96b74f16c33af310cab2efa955b | af7b1f0099b37298b1bf0d683f98c0ec84fae96b74f16c33af310cab2efa955b |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/writer-S5A_PURE-before.var | 61f749b6a10ddc8e70f6e5b1d6378fcf1c0ae5127161a10c9704d76bcf64813a | 61f749b6a10ddc8e70f6e5b1d6378fcf1c0ae5127161a10c9704d76bcf64813a |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/writer-S5A_PURE-resource-replay.json | 56a7fc36e0972eb64abb19189f1664b87d6a058511bbec0ef7e1497abd2c511e | 56a7fc36e0972eb64abb19189f1664b87d6a058511bbec0ef7e1497abd2c511e |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/writer-S5A_PURE-resource-replay.var | 92aa8694939e2b8b678b556227cce1cf4cda661b6fb1f5a478ac37deba1a072e | 92aa8694939e2b8b678b556227cce1cf4cda661b6fb1f5a478ac37deba1a072e |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/writer-S5B_DEPENDENCY-before.json | 0f821748eb7f12a8ac196c61bca34a7fe55af6adb3ab43d1acf8748fd2be8652 | 0f821748eb7f12a8ac196c61bca34a7fe55af6adb3ab43d1acf8748fd2be8652 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/writer-S5B_DEPENDENCY-before.var | 06b03c6a50a8832a9cab621b908332199e9ab4d10d4e547111a8860c70535bd2 | 06b03c6a50a8832a9cab621b908332199e9ab4d10d4e547111a8860c70535bd2 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/writer-S5B_DEPENDENCY-resource-replay.json | 49fb4df6bdaadd9c5146f716a108902c533b137427e2f90f86116393f12c6ea0 | 49fb4df6bdaadd9c5146f716a108902c533b137427e2f90f86116393f12c6ea0 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/writer-S5B_DEPENDENCY-resource-replay.var | 464b589fa206427a1becd6dd484fc9be05da1b619ffb26ca559dde83e7b09309 | 464b589fa206427a1becd6dd484fc9be05da1b619ffb26ca559dde83e7b09309 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-power-result/INDEX.json | a8f44235dc8a74e67c3463698619611131224de5048868259a729791614cf9a9 | a8f44235dc8a74e67c3463698619611131224de5048868259a729791614cf9a9 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-power-result/ROOT_Q36_REJECTED_ENQUEUE_STATIC_PATH.json | e8adc79d506491973289084c5ade7c3affe9e3e517896ef191f01cad6dcaed92 | e8adc79d506491973289084c5ade7c3affe9e3e517896ef191f01cad6dcaed92 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-power-result/ROOT_Q37_DIAGNOSTIC_SAFETY_REAUDIT.json | 4d4b059576b3b6d28f71d054eeaf367ead54a74bb499d64bf450d625a137cfa5 | 4d4b059576b3b6d28f71d054eeaf367ead54a74bb499d64bf450d625a137cfa5 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-power-result/ROOT_Q37_POWER_ADAPTER_RESULT.json | cce1132503457675b50d566ad1afc3f67e902a28135550a8e72b647dacd7d70d | cce1132503457675b50d566ad1afc3f67e902a28135550a8e72b647dacd7d70d |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-power-result/ROOT_Q37_PREFLIGHT.json | 3554d8f246c0d117c774ecfabcd9eb48eed311155e3a5a3b15413f3e663b6fd7 | 3554d8f246c0d117c774ecfabcd9eb48eed311155e3a5a3b15413f3e663b6fd7 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-power-result/ROOT_R37_ADAPTER_CONTROLS.json | f62fc981f3935bd969ea5c6fafa5d44a111b1264ad0d04fdb08b07fe4f27429e | f62fc981f3935bd969ea5c6fafa5d44a111b1264ad0d04fdb08b07fe4f27429e |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/ROOT_MANA_ADOPTION_CURRENT_APPLICABILITY_C0.json | 57ba42e1c92db194a5ddcb8dc80c8e0249bbab817e35a3ae00bd12b0f4c57731 | 57ba42e1c92db194a5ddcb8dc80c8e0249bbab817e35a3ae00bd12b0f4c57731 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/ROOT_Q37_FULL_ROSTER_PREPARE_ONLY.json | c547dcff95184d04bf7089e7c9f6a2cda800a91359c9ec318f48ad4ecf2887c0 | c547dcff95184d04bf7089e7c9f6a2cda800a91359c9ec318f48ad4ecf2887c0 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/SOURCE_MAP.json | d1333fc891342be5cc16795973fa71e7910a8c8af06ef4a3e51662537fed63c3 | d1333fc891342be5cc16795973fa71e7910a8c8af06ef4a3e51662537fed63c3 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/core/simulation_kernel.gd | 341c0c878c4894adbac628d0db6362ff69fc3347bdd9e61e50936e15dc2d1edb | 341c0c878c4894adbac628d0db6362ff69fc3347bdd9e61e50936e15dc2d1edb |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/economy/economy_service.gd | 95aedd0a0421c93e8fa39f0f76fa890cd0a46905d9a25c88c8b17c4d6d47728e | 95aedd0a0421c93e8fa39f0f76fa890cd0a46905d9a25c88c8b17c4d6d47728e |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/facility/facility_service.gd | ceb4a3e9224587423f273cdb2b56e6843ab176ac1fc4fe79dd498b5ed5c33b77 | ceb4a3e9224587423f273cdb2b56e6843ab176ac1fc4fe79dd498b5ed5c33b77 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/guest/guest_service.gd | 56880410e9a00816f9a95d30821982955532de8dd976980934e12016a9f2b21e | 56880410e9a00816f9a95d30821982955532de8dd976980934e12016a9f2b21e |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/operations/operations_coordinator.gd | 871a248ee101b6df543fd5cf0440b5d4b0f02c21fa145a99f0687888c1bc6f90 | 871a248ee101b6df543fd5cf0440b5d4b0f02c21fa145a99f0687888c1bc6f90 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/tests/s5/test_runtime_defense_autonomy.gd | 28ca81ddde4da49442b427ed4c55ddcf213ecb389712db585b64cd416636c403 | 28ca81ddde4da49442b427ed4c55ddcf213ecb389712db585b64cd416636c403 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/tests/s5/test_runtime_defense_cycle.gd | a909e2af73aae43590cdd91d07ed2548f4fd2f675d26fa63aa74f6a5cda34357 | a909e2af73aae43590cdd91d07ed2548f4fd2f675d26fa63aa74f6a5cda34357 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/tools/run_all_tests.py | 320ca668732b4ff72fc4449998af2327d4e5c527b06896740806aaf0487282b4 | 320ca668732b4ff72fc4449998af2327d4e5c527b06896740806aaf0487282b4 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/core/simulation_kernel.gd | 341c0c878c4894adbac628d0db6362ff69fc3347bdd9e61e50936e15dc2d1edb | 341c0c878c4894adbac628d0db6362ff69fc3347bdd9e61e50936e15dc2d1edb |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/autoload/simulation_runtime.gd | 45514aea9367ff678f4dc05166bb9b58121f240d4b5565edeb7ab258e3ded8e0 | 45514aea9367ff678f4dc05166bb9b58121f240d4b5565edeb7ab258e3ded8e0 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/facility/facility_service.gd | ceb4a3e9224587423f273cdb2b56e6843ab176ac1fc4fe79dd498b5ed5c33b77 | ceb4a3e9224587423f273cdb2b56e6843ab176ac1fc4fe79dd498b5ed5c33b77 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/economy/economy_service.gd | 95aedd0a0421c93e8fa39f0f76fa890cd0a46905d9a25c88c8b17c4d6d47728e | 95aedd0a0421c93e8fa39f0f76fa890cd0a46905d9a25c88c8b17c4d6d47728e |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/operations/operations_coordinator.gd | 871a248ee101b6df543fd5cf0440b5d4b0f02c21fa145a99f0687888c1bc6f90 | 871a248ee101b6df543fd5cf0440b5d4b0f02c21fa145a99f0687888c1bc6f90 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/guest/guest_service.gd | 56880410e9a00816f9a95d30821982955532de8dd976980934e12016a9f2b21e | 56880410e9a00816f9a95d30821982955532de8dd976980934e12016a9f2b21e |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/tests/s5/test_runtime_defense_autonomy.gd | 28ca81ddde4da49442b427ed4c55ddcf213ecb389712db585b64cd416636c403 | 28ca81ddde4da49442b427ed4c55ddcf213ecb389712db585b64cd416636c403 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/run_all_tests.py.reference | 320ca668732b4ff72fc4449998af2327d4e5c527b06896740806aaf0487282b4 | 320ca668732b4ff72fc4449998af2327d4e5c527b06896740806aaf0487282b4 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/tests/s5/test_runtime_defense_cycle.gd | a909e2af73aae43590cdd91d07ed2548f4fd2f675d26fa63aa74f6a5cda34357 | a909e2af73aae43590cdd91d07ed2548f4fd2f675d26fa63aa74f6a5cda34357 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/run_p13_reference_tests.py.reference | 9adc8aa2a7662df8dd70386ddb0bff34574e44d7411de3b6128ddd15eb24675c | 9adc8aa2a7662df8dd70386ddb0bff34574e44d7411de3b6128ddd15eb24675c |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q40-source-and-native-findings/INDEX.json | 1e72f10784d639ff509e8175f73c46e8e2479dda8263365f51dd9f67c753709e | 1e72f10784d639ff509e8175f73c46e8e2479dda8263365f51dd9f67c753709e |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q40-source-and-native-findings/ROOT_Q40_NATIVE_FAILURE_AUDIT.json | 622edabc16a3e9ef6528b4009d44d8307f998bf9aa0c441b4b223bf5a40efeb5 | 622edabc16a3e9ef6528b4009d44d8307f998bf9aa0c441b4b223bf5a40efeb5 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q40-source-and-native-findings/ROOT_R40_CURRENT_SOURCE_GAPS.json | 306195acb5661f9c4c087428ba16f0a46fe54cf1f8b2dea9933c035b90ad7511 | 306195acb5661f9c4c087428ba16f0a46fe54cf1f8b2dea9933c035b90ad7511 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q40-source-and-native-findings/ROOT_R40_AFFECTED_PURE_CONTROLS.json | 736860fe730d7b7fa744783f74a0de875afe8ba3ff65e74598bd4c07e29d955a | 736860fe730d7b7fa744783f74a0de875afe8ba3ff65e74598bd4c07e29d955a |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q40-source-and-native-findings/ROOT_R40_ALL_CHECK_ONLY.json | ffec08fd3ed45d346ae27de4c502fbc7768fc51ccadce433ca30805faf127a68 | ffec08fd3ed45d346ae27de4c502fbc7768fc51ccadce433ca30805faf127a68 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q40-source-and-native-findings/writer-stderr.log | 75ddd2af006162c702751853f9f3931086bded7544a8addd0d65383c47a59a67 | 75ddd2af006162c702751853f9f3931086bded7544a8addd0d65383c47a59a67 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q40-source-and-native-findings/writer-stdout.log | eebf10b3f84916338ab651af117852cbe852bef28f79032472fdb01342ac0608 | eebf10b3f84916338ab651af117852cbe852bef28f79032472fdb01342ac0608 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q40-source-and-native-findings/writer.json | ceb971f39afe131fbeccb0fbe06be37ada0d31ef3ee86f216701a1618abe444a | ceb971f39afe131fbeccb0fbe06be37ada0d31ef3ee86f216701a1618abe444a |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q40-source-and-native-findings/writer-S5D_DESTRUCTION_RAID-commands.json | 19be61a849204ce72731d586f9685ad129231a55fca57a006ddbc723d52d9879 | 19be61a849204ce72731d586f9685ad129231a55fca57a006ddbc723d52d9879 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q40-source-and-native-findings/execution.json | 7c00af3acee008927faf7f1b99b6a7407671674668674f30acc3504ea6ee21d9 | 7c00af3acee008927faf7f1b99b6a7407671674668674f30acc3504ea6ee21d9 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q41-oracle-source-facts/INDEX.json | 903601cfec6be397f99c30aeba9301f2312c1f659a73f30d5d8a04e1f07ef468 | 903601cfec6be397f99c30aeba9301f2312c1f659a73f30d5d8a04e1f07ef468 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q41-oracle-source-facts/ACTUAL_FAILED_COMMAND_JOURNAL_SOURCE.json | 27d39ab2b01e1e73d4bd38e335a87fe26ddbea3e748fc9c95d82c886dfd14187 | 27d39ab2b01e1e73d4bd38e335a87fe26ddbea3e748fc9c95d82c886dfd14187 |
| /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q41-oracle-source-facts/HISTORICAL_S4_WRAPPER_R28.py.reference | 2d3be39d2b310abac058e27336ac816c234043a0a1dd7b2c52d84994907dd31b | 2d3be39d2b310abac058e27336ac816c234043a0a1dd7b2c52d84994907dd31b |
@@ -0,0 +1,631 @@
{
"spec": {
"raw_sha256": "d28aadb044633f7d804de5a92c8d4c4a7438dfbf44c3243dca978951f4def25f",
"one_LF_stripped_sha256": "9ec722e7dfb0bee178d291624a026420c08412574e238bba1fde012c7a6f7881",
"accepted": true,
"controls": [
{
"case": "canonical_without_LF",
"accepted": true,
"expected": true
},
{
"case": "tracked_single_LF",
"accepted": true,
"expected": true
},
{
"case": "double_final_LF",
"accepted": false,
"expected": false
},
{
"case": "CRLF_final",
"accepted": false,
"expected": false
},
{
"case": "BOM",
"accepted": false,
"expected": false
},
{
"case": "interior_mutation",
"accepted": false,
"expected": false
}
]
},
"step0": [
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_ABSOLUTE_CONTEXT_INDEX.json",
"expected": "6f0ee990b95a5a897511425cd86ae57ba0364c5b326afdeb9f556fabfea6915c",
"observed": "6f0ee990b95a5a897511425cd86ae57ba0364c5b326afdeb9f556fabfea6915c"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ACTUAL_OPUS_NEXT_P04_PLAN.json",
"expected": "217d9bf4ef593fb95a5e726fee0e4497863a0b06663d27ba20e742d81bb9c049",
"observed": "217d9bf4ef593fb95a5e726fee0e4497863a0b06663d27ba20e742d81bb9c049"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ACTUAL_OPUS_REPAIR30_DIRECT_CHECKER_PLAN.json",
"expected": "77801cc6db2a4deb9f76118a746b32eb5e629b2d6980850b8813a12b45016806",
"observed": "77801cc6db2a4deb9f76118a746b32eb5e629b2d6980850b8813a12b45016806"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ACTUAL_OPUS_REPAIR30_RUN_DECISION.json",
"expected": "be7be3bfaa5a5ab412db8aecd1d951c213894e485b7869fcc12ab1c75b037c7f",
"observed": "be7be3bfaa5a5ab412db8aecd1d951c213894e485b7869fcc12ab1c75b037c7f"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ACTUAL_OPUS_REPAIR31_CONCRETE_PLAN.json",
"expected": "857e1acaed2093de56afdd851e69b3129bf9edce72b5da3cdd160ce4b7bfc18a",
"observed": "857e1acaed2093de56afdd851e69b3129bf9edce72b5da3cdd160ce4b7bfc18a"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ACTUAL_OPUS_REPAIR32_CONCRETE_PLAN.json",
"expected": "5b69f850f835bd7af37e9c728c484c236c28efb0bd32113bb53bcbaf7d252c0a",
"observed": "5b69f850f835bd7af37e9c728c484c236c28efb0bd32113bb53bcbaf7d252c0a"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/CURRENT_ROOT_P04_RESUME_FACTS.json",
"expected": "c826726368844a823c54c1df1cdaff43fde5a94a17e638bfc60d8fb2559f8d85",
"observed": "c826726368844a823c54c1df1cdaff43fde5a94a17e638bfc60d8fb2559f8d85"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/D05_ACTUAL_HUMAN_APPROVAL.json",
"expected": "cd365ded1b777a0327d090709f0a4161f5005562819183455d9f2e106fba3e96",
"observed": "cd365ded1b777a0327d090709f0a4161f5005562819183455d9f2e106fba3e96"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_FRESH_Q_INPUT_APPROACH_AFTER34.json",
"expected": "7a7b91cbf04bb84cdef8e7a99ca2140a9eac2ac6a385570b4f0aa0d474e7da92",
"observed": "7a7b91cbf04bb84cdef8e7a99ca2140a9eac2ac6a385570b4f0aa0d474e7da92"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_P04_PRESERVED_TO_CURRENT_SOURCE_AUDIT.json",
"expected": "6bb86959b06acb62d5cd3c5fd00bb6802a80b66184e69abca3f75c46ddeb7a12",
"observed": "6bb86959b06acb62d5cd3c5fd00bb6802a80b66184e69abca3f75c46ddeb7a12"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_PLAN_VERSION_NOTES.json",
"expected": "b4336f900a87f9bf0daa1e86728c3a913aed7c09425569e104cc01290be1c62f",
"observed": "b4336f900a87f9bf0daa1e86728c3a913aed7c09425569e104cc01290be1c62f"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/INDEX.json",
"expected": "b2ad602b7bd22dbc4778b60b4a015b1d2f8f06b71278959fb52910f2ee1af57a",
"observed": "b2ad602b7bd22dbc4778b60b4a015b1d2f8f06b71278959fb52910f2ee1af57a"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_CHECK_ONLY.json",
"expected": "aab7dcbfcc934f3bda7d937feb4e7638109ddf645da6ebd57f6190588b55287c",
"observed": "aab7dcbfcc934f3bda7d937feb4e7638109ddf645da6ebd57f6190588b55287c"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_NEGATIVE_GIT.json",
"expected": "e63b1b27244cd042f522a63b4392dea8c7211ce5ca5a927e91856115dfaa9f56",
"observed": "e63b1b27244cd042f522a63b4392dea8c7211ce5ca5a927e91856115dfaa9f56"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_NEGATIVE_dirty.log",
"expected": "3ad8ef5d71175bc265f93395fe64a39b05ab65252ad509abc108de15a2b9ab53",
"observed": "3ad8ef5d71175bc265f93395fe64a39b05ab65252ad509abc108de15a2b9ab53"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_NEGATIVE_untracked.log",
"expected": "3ad8ef5d71175bc265f93395fe64a39b05ab65252ad509abc108de15a2b9ab53",
"observed": "3ad8ef5d71175bc265f93395fe64a39b05ab65252ad509abc108de15a2b9ab53"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_NEGATIVE_wrong-main.log",
"expected": "006b9e83c3e106bada560371dda1fb9b4326e3f31fa48fa0c46e7d4903a91e55",
"observed": "006b9e83c3e106bada560371dda1fb9b4326e3f31fa48fa0c46e7d4903a91e55"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_NEGATIVE_wrong-submission.log",
"expected": "6fefa0256b2dbc1596043fbff65fbaf87279baaa770a04d65a5fe70a6476671d",
"observed": "6fefa0256b2dbc1596043fbff65fbaf87279baaa770a04d65a5fe70a6476671d"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_NEGATIVE_wrong-tree.log",
"expected": "7fb7a1e4f00f201b7008b6d72957b3d4db450be156a1174b26a22c36d48b5e8f",
"observed": "7fb7a1e4f00f201b7008b6d72957b3d4db450be156a1174b26a22c36d48b5e8f"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_RESOURCE_ADMISSION.json",
"expected": "18ef80f33f36cdd6ab664c862a9ae651a649a532bd32c4c35a81640cb4f078a0",
"observed": "18ef80f33f36cdd6ab664c862a9ae651a649a532bd32c4c35a81640cb4f078a0"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_STAGE.json",
"expected": "f143045846cf06d79b81a0e52035300251fa576cde9a2d5eeda97d6610fd8591",
"observed": "f143045846cf06d79b81a0e52035300251fa576cde9a2d5eeda97d6610fd8591"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_check-only.log",
"expected": "4418f4b6bbe3d88cbf7f0b988084e05b5f0f52c15fe0f466ba82e584408427ce",
"observed": "4418f4b6bbe3d88cbf7f0b988084e05b5f0f52c15fe0f466ba82e584408427ce"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_Q35_LOCAL_DIAGNOSTIC_INPUTS/ROOT_Q35_pure.log",
"expected": "f77640e0629497389baefc6424cf164d164fb96bbbd48cee6c4d83ed96c253c1",
"observed": "f77640e0629497389baefc6424cf164d164fb96bbbd48cee6c4d83ed96c253c1"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_REPAIR30_EXECUTION_ORDER_FACTS.json",
"expected": "e18b031e790622929ec2c80ab9a6d5c3d883a364d625b58372fe33fd280ca93f",
"observed": "e18b031e790622929ec2c80ab9a6d5c3d883a364d625b58372fe33fd280ca93f"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/ROOT_REPAIR31_ACTUAL_FACTS.json",
"expected": "0ea352b442e88263b899d28d58422afed39855393233c35ed3a962fcab67e136",
"observed": "0ea352b442e88263b899d28d58422afed39855393233c35ed3a962fcab67e136"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/INDEX.json",
"expected": "ff43786d898ef3475c267cf22758074a001b3d46dbc2bea52782a3782dd5571e",
"observed": "ff43786d898ef3475c267cf22758074a001b3d46dbc2bea52782a3782dd5571e"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/autoload/simulation_runtime.gd",
"expected": "45514aea9367ff678f4dc05166bb9b58121f240d4b5565edeb7ab258e3ded8e0",
"observed": "45514aea9367ff678f4dc05166bb9b58121f240d4b5565edeb7ab258e3ded8e0"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/scenes/main/main.gd",
"expected": "92677e4ac57ed8d418a4a716bf0874cbbaea79cff893e5163c82ad1f75e7140a",
"observed": "92677e4ac57ed8d418a4a716bf0874cbbaea79cff893e5163c82ad1f75e7140a"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/scenes/main/world_preview.gd",
"expected": "4bc49a19a38b9c3b4d6bfc243ddf46f1f25469a8273adb5e812911ef9424a1f2",
"observed": "4bc49a19a38b9c3b4d6bfc243ddf46f1f25469a8273adb5e812911ef9424a1f2"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/scripts/core/save_service.gd",
"expected": "f4c270632225dd046bbff92f9472761d64d63740e93f274828c92dcf912db6a9",
"observed": "f4c270632225dd046bbff92f9472761d64d63740e93f274828c92dcf912db6a9"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/scripts/relationship/relationship_service.gd",
"expected": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3",
"observed": "d2f6304aa643b98914c5d65bf3eb673ca8cc427476187f43e76b4b941410b1d3"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/scripts/ui/guest_observation_panel.gd",
"expected": "f5de1004fce5445bbfd3ee8d6ec37b325e7a9813d47c19beaeeeb411f27a50a5",
"observed": "f5de1004fce5445bbfd3ee8d6ec37b325e7a9813d47c19beaeeeb411f27a50a5"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/scripts/ui/room_presentation.gd",
"expected": "2eda851534777575298ea005e2e6d0ee90785a81357d5b9c34cfb95f615a8181",
"observed": "2eda851534777575298ea005e2e6d0ee90785a81357d5b9c34cfb95f615a8181"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/tests/business/test_required_kitchen.gd",
"expected": "3a9c92f80c24064ef0858fba10bd7caab63203932942837f7e142349578f6b2f",
"observed": "3a9c92f80c24064ef0858fba10bd7caab63203932942837f7e142349578f6b2f"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/tools/regression/suite-policy.json",
"expected": "7eb085d7e7a383785b4faedb503d0f6002bcad431e3188785aef901ce123769f",
"observed": "7eb085d7e7a383785b4faedb503d0f6002bcad431e3188785aef901ce123769f"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/full-standard-schema-example/INDEX.json",
"expected": "a7a3299c4d70ea033368a707882856fd5c7f7f4d5a0d5f86bf2fb9b2fe2e53d1",
"observed": "a7a3299c4d70ea033368a707882856fd5c7f7f4d5a0d5f86bf2fb9b2fe2e53d1"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/full-standard-schema-example/controller-input.json",
"expected": "24d10b3a91553df54b3b2fd4b1a57dce683cc72a55576e0c73c9e142b335ad40",
"observed": "24d10b3a91553df54b3b2fd4b1a57dce683cc72a55576e0c73c9e142b335ad40"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/full-standard-schema-example/controller.py",
"expected": "9e03ecba1819c449c83a9dfba0f60c0e01f94aad728c46f60dd1db179224a89b",
"observed": "9e03ecba1819c449c83a9dfba0f60c0e01f94aad728c46f60dd1db179224a89b"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/full-standard-schema-example/run/003-receipt.json",
"expected": "4ce015c160859612c89e215517826aa1da3582534d27c4688af6a44e37f1b641",
"observed": "4ce015c160859612c89e215517826aa1da3582534d27c4688af6a44e37f1b641"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/full-standard-schema-example/run/parse-receipt.json",
"expected": "1ad82022669a3f197f53ed1e23f23aadc927220f0ba1f857c41f80721bafa443",
"observed": "1ad82022669a3f197f53ed1e23f23aadc927220f0ba1f857c41f80721bafa443"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/full-standard-schema-example/run/runner-ended.json",
"expected": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855",
"observed": "e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/full-standard-schema-example/run/runner-input.json",
"expected": "2a76506e923a3a95288ce826b81ed9eab49d4ecee613a2c82ae35e970c68f961",
"observed": "2a76506e923a3a95288ce826b81ed9eab49d4ecee613a2c82ae35e970c68f961"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/normal-candidate-example/INDEX.json",
"expected": "942181cc3efc8207e728233f89626b66eb0c34b582e5c9b0fae294dcf1600c00",
"observed": "942181cc3efc8207e728233f89626b66eb0c34b582e5c9b0fae294dcf1600c00"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/normal-candidate-example/ROOT_EXACT_NORMAL_CANDIDATE_72A50A4A.json",
"expected": "5614c9b1c9eb222dbbcfd9ae1c3b438cc4129c779deba2841d660a8c96b6cfe6",
"observed": "5614c9b1c9eb222dbbcfd9ae1c3b438cc4129c779deba2841d660a8c96b6cfe6"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/normal-candidate-example/ROOT_NORMAL_FINAL_72A50A4A.json",
"expected": "b41069126e029c30ab644a62a54cb45ca2e0e504add150020500acba4e249469",
"observed": "b41069126e029c30ab644a62a54cb45ca2e0e504add150020500acba4e249469"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/normal-candidate-example/ROOT_NORMAL_INTEGRATION_72A50A4A.json",
"expected": "2f47d39d3f05b3735f0fb3e01adaabf1c66c6a784d60af247063bd90e5ec0d5c",
"observed": "2f47d39d3f05b3735f0fb3e01adaabf1c66c6a784d60af247063bd90e5ec0d5c"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/INDEX.json",
"expected": "a23f17336a5e701100c224ebcb69f37a8de95aca82658675b692d503798a5232",
"observed": "a23f17336a5e701100c224ebcb69f37a8de95aca82658675b692d503798a5232"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/OWNER_CLI_REFERENCE.json",
"expected": "1e360ad1d8057ef649fabe97ac3e98263d2f8c1c4d976d8b6e0a907a49e9158e",
"observed": "1e360ad1d8057ef649fabe97ac3e98263d2f8c1c4d976d8b6e0a907a49e9158e"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/ROOT_SOURCE_REVIEW_REJECTION_20D0AE5.json",
"expected": "d028dd3862ae663586d49b5843e88d9da82ad7985fa082551438e4a81311073e",
"observed": "d028dd3862ae663586d49b5843e88d9da82ad7985fa082551438e4a81311073e"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/SOURCE_REWORK_ADAPTER_LOCAL_CHECKS.json",
"expected": "580f2f19d680a23ee4efe6beab68a1aad69e067bc551f623cc7531c6915d7a78",
"observed": "580f2f19d680a23ee4efe6beab68a1aad69e067bc551f623cc7531c6915d7a78"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/SOURCE_REWORK_CURRENT_REFERENCE_INDEX.json",
"expected": "b0ecce7ae523527fdc6272e9784eba6109d67c0cd3745a8aaab64d913ca8adbd",
"observed": "b0ecce7ae523527fdc6272e9784eba6109d67c0cd3745a8aaab64d913ca8adbd"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/core.py.reference",
"expected": "4c6067bbd57034764873a468ff161a6882d232503043d5640fc83dea0b455856",
"observed": "4c6067bbd57034764873a468ff161a6882d232503043d5640fc83dea0b455856"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/current-owner-cli.py.reference",
"expected": "0cfd9634e4a59755b89d2927d60b6092368529f2ca7188d949da7f88080359aa",
"observed": "0cfd9634e4a59755b89d2927d60b6092368529f2ca7188d949da7f88080359aa"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/owner-cli.py.reference",
"expected": "52c327e624334b51612ea3cb1653aeff4a7a192502d1ba9407ce874af1d92410",
"observed": "52c327e624334b51612ea3cb1653aeff4a7a192502d1ba9407ce874af1d92410"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/owner-normal-gates-reference/owner-source-rework-20d0ae5.py.reference",
"expected": "9ecf7bebf666a67a8f13357d66e9c1d8d76940ef8212f0055537b728c75e0cbc",
"observed": "9ecf7bebf666a67a8f13357d66e9c1d8d76940ef8212f0055537b728c75e0cbc"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/FAILED_EXECUTION.json",
"expected": "6e48da89ce852dacdbff2d0f93a8903583dccd9e05f5e34bb68be0d63f540332",
"observed": "6e48da89ce852dacdbff2d0f93a8903583dccd9e05f5e34bb68be0d63f540332"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/FAILED_IMPORT_COMBINED.log",
"expected": "cd39b1711f530454b0ec263ab2d076d714f674d5a36e26f9ef16788799b76764",
"observed": "cd39b1711f530454b0ec263ab2d076d714f674d5a36e26f9ef16788799b76764"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/FAILED_OUTER_OWNED_FINALLY.json",
"expected": "ee14a347724aedb2ae8afecc0775250b1e014c17e726210e2535d6108e57edc0",
"observed": "ee14a347724aedb2ae8afecc0775250b1e014c17e726210e2535d6108e57edc0"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/INDEX.json",
"expected": "0e4334442ce89b0388e10a4b62b5e00acbce2013e3ef1967508a3c48d72dc9c1",
"observed": "0e4334442ce89b0388e10a4b62b5e00acbce2013e3ef1967508a3c48d72dc9c1"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/P13_CONTROLLER_REFERENCE_INDEX.json",
"expected": "48434362232d6b58cca720868c6d87f2af48675f365855b8a4a97eb5071dfee3",
"observed": "48434362232d6b58cca720868c6d87f2af48675f365855b8a4a97eb5071dfee3"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/P13_FULL_CONTROLLER_PATTERN.py.reference",
"expected": "9e03ecba1819c449c83a9dfba0f60c0e01f94aad728c46f60dd1db179224a89b",
"observed": "9e03ecba1819c449c83a9dfba0f60c0e01f94aad728c46f60dd1db179224a89b"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/ROOT_Q35_DIAGNOSTIC_IMPORT_SOURCE_DELTA.json",
"expected": "1994e59a498f3dbca1fd589b16b5bc6305d2786c0fa730ac489590469f08b05d",
"observed": "1994e59a498f3dbca1fd589b16b5bc6305d2786c0fa730ac489590469f08b05d"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/ROOT_Q35_FAILED_IMPORT_UID_CLASSIFICATION.json",
"expected": "bc0a863e52db4f98b4b2ee4bc0b513c73f841726789a2ca99521c1b8618dc6c3",
"observed": "bc0a863e52db4f98b4b2ee4bc0b513c73f841726789a2ca99521c1b8618dc6c3"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/run_all_tests.py.reference",
"expected": "320ca668732b4ff72fc4449998af2327d4e5c527b06896740806aaf0487282b4",
"observed": "320ca668732b4ff72fc4449998af2327d4e5c527b06896740806aaf0487282b4"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/run_p13_reference_tests.py.reference",
"expected": "9adc8aa2a7662df8dd70386ddb0bff34574e44d7411de3b6128ddd15eb24675c",
"observed": "9adc8aa2a7662df8dd70386ddb0bff34574e44d7411de3b6128ddd15eb24675c"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/INDEX.json",
"expected": "cef78b200268e27a6e73ccd926ac95d0b2b6e30b9338a8412da9ab48b68ca82a",
"observed": "cef78b200268e27a6e73ccd926ac95d0b2b6e30b9338a8412da9ab48b68ca82a"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/SAFETY_REAUDIT.json",
"expected": "8edf11fe7893ced7c6450feb1ee3db45ab0a145db572254d2102ee70e26ac26e",
"observed": "8edf11fe7893ced7c6450feb1ee3db45ab0a145db572254d2102ee70e26ac26e"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/TYPED_AUDIT.json",
"expected": "e1800e1679b570ecdd9d7537e87e0730c089fa3b4c6197d3e279e60959aad016",
"observed": "e1800e1679b570ecdd9d7537e87e0730c089fa3b4c6197d3e279e60959aad016"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/command_queue.gd.reference",
"expected": "09b22e6212fa3ce1bf08f5d6b52224a2d3362b3bc63f03a8c98e89af1c6f5895",
"observed": "09b22e6212fa3ce1bf08f5d6b52224a2d3362b3bc63f03a8c98e89af1c6f5895"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/facility_instance.gd.reference",
"expected": "0c6aa493f3299611e05dd26aa429dda8cf7b5c479e4d09632036fb862f79a324",
"observed": "0c6aa493f3299611e05dd26aa429dda8cf7b5c479e4d09632036fb862f79a324"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/writer-S5A_PURE-before.json",
"expected": "af7b1f0099b37298b1bf0d683f98c0ec84fae96b74f16c33af310cab2efa955b",
"observed": "af7b1f0099b37298b1bf0d683f98c0ec84fae96b74f16c33af310cab2efa955b"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/writer-S5A_PURE-before.var",
"expected": "61f749b6a10ddc8e70f6e5b1d6378fcf1c0ae5127161a10c9704d76bcf64813a",
"observed": "61f749b6a10ddc8e70f6e5b1d6378fcf1c0ae5127161a10c9704d76bcf64813a"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/writer-S5A_PURE-resource-replay.json",
"expected": "56a7fc36e0972eb64abb19189f1664b87d6a058511bbec0ef7e1497abd2c511e",
"observed": "56a7fc36e0972eb64abb19189f1664b87d6a058511bbec0ef7e1497abd2c511e"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/writer-S5A_PURE-resource-replay.var",
"expected": "92aa8694939e2b8b678b556227cce1cf4cda661b6fb1f5a478ac37deba1a072e",
"observed": "92aa8694939e2b8b678b556227cce1cf4cda661b6fb1f5a478ac37deba1a072e"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/writer-S5B_DEPENDENCY-before.json",
"expected": "0f821748eb7f12a8ac196c61bca34a7fe55af6adb3ab43d1acf8748fd2be8652",
"observed": "0f821748eb7f12a8ac196c61bca34a7fe55af6adb3ab43d1acf8748fd2be8652"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/writer-S5B_DEPENDENCY-before.var",
"expected": "06b03c6a50a8832a9cab621b908332199e9ab4d10d4e547111a8860c70535bd2",
"observed": "06b03c6a50a8832a9cab621b908332199e9ab4d10d4e547111a8860c70535bd2"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/writer-S5B_DEPENDENCY-resource-replay.json",
"expected": "49fb4df6bdaadd9c5146f716a108902c533b137427e2f90f86116393f12c6ea0",
"observed": "49fb4df6bdaadd9c5146f716a108902c533b137427e2f90f86116393f12c6ea0"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract/writer-S5B_DEPENDENCY-resource-replay.var",
"expected": "464b589fa206427a1becd6dd484fc9be05da1b619ffb26ca559dde83e7b09309",
"observed": "464b589fa206427a1becd6dd484fc9be05da1b619ffb26ca559dde83e7b09309"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-power-result/INDEX.json",
"expected": "a8f44235dc8a74e67c3463698619611131224de5048868259a729791614cf9a9",
"observed": "a8f44235dc8a74e67c3463698619611131224de5048868259a729791614cf9a9"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-power-result/ROOT_Q36_REJECTED_ENQUEUE_STATIC_PATH.json",
"expected": "e8adc79d506491973289084c5ade7c3affe9e3e517896ef191f01cad6dcaed92",
"observed": "e8adc79d506491973289084c5ade7c3affe9e3e517896ef191f01cad6dcaed92"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-power-result/ROOT_Q37_DIAGNOSTIC_SAFETY_REAUDIT.json",
"expected": "4d4b059576b3b6d28f71d054eeaf367ead54a74bb499d64bf450d625a137cfa5",
"observed": "4d4b059576b3b6d28f71d054eeaf367ead54a74bb499d64bf450d625a137cfa5"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-power-result/ROOT_Q37_POWER_ADAPTER_RESULT.json",
"expected": "cce1132503457675b50d566ad1afc3f67e902a28135550a8e72b647dacd7d70d",
"observed": "cce1132503457675b50d566ad1afc3f67e902a28135550a8e72b647dacd7d70d"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-power-result/ROOT_Q37_PREFLIGHT.json",
"expected": "3554d8f246c0d117c774ecfabcd9eb48eed311155e3a5a3b15413f3e663b6fd7",
"observed": "3554d8f246c0d117c774ecfabcd9eb48eed311155e3a5a3b15413f3e663b6fd7"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-power-result/ROOT_R37_ADAPTER_CONTROLS.json",
"expected": "f62fc981f3935bd969ea5c6fafa5d44a111b1264ad0d04fdb08b07fe4f27429e",
"observed": "f62fc981f3935bd969ea5c6fafa5d44a111b1264ad0d04fdb08b07fe4f27429e"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/ROOT_MANA_ADOPTION_CURRENT_APPLICABILITY_C0.json",
"expected": "57ba42e1c92db194a5ddcb8dc80c8e0249bbab817e35a3ae00bd12b0f4c57731",
"observed": "57ba42e1c92db194a5ddcb8dc80c8e0249bbab817e35a3ae00bd12b0f4c57731"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/ROOT_Q37_FULL_ROSTER_PREPARE_ONLY.json",
"expected": "c547dcff95184d04bf7089e7c9f6a2cda800a91359c9ec318f48ad4ecf2887c0",
"observed": "c547dcff95184d04bf7089e7c9f6a2cda800a91359c9ec318f48ad4ecf2887c0"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/SOURCE_MAP.json",
"expected": "d1333fc891342be5cc16795973fa71e7910a8c8af06ef4a3e51662537fed63c3",
"observed": "d1333fc891342be5cc16795973fa71e7910a8c8af06ef4a3e51662537fed63c3"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/core/simulation_kernel.gd",
"expected": "341c0c878c4894adbac628d0db6362ff69fc3347bdd9e61e50936e15dc2d1edb",
"observed": "341c0c878c4894adbac628d0db6362ff69fc3347bdd9e61e50936e15dc2d1edb"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/economy/economy_service.gd",
"expected": "95aedd0a0421c93e8fa39f0f76fa890cd0a46905d9a25c88c8b17c4d6d47728e",
"observed": "95aedd0a0421c93e8fa39f0f76fa890cd0a46905d9a25c88c8b17c4d6d47728e"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/facility/facility_service.gd",
"expected": "ceb4a3e9224587423f273cdb2b56e6843ab176ac1fc4fe79dd498b5ed5c33b77",
"observed": "ceb4a3e9224587423f273cdb2b56e6843ab176ac1fc4fe79dd498b5ed5c33b77"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/guest/guest_service.gd",
"expected": "56880410e9a00816f9a95d30821982955532de8dd976980934e12016a9f2b21e",
"observed": "56880410e9a00816f9a95d30821982955532de8dd976980934e12016a9f2b21e"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/operations/operations_coordinator.gd",
"expected": "871a248ee101b6df543fd5cf0440b5d4b0f02c21fa145a99f0687888c1bc6f90",
"observed": "871a248ee101b6df543fd5cf0440b5d4b0f02c21fa145a99f0687888c1bc6f90"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/tests/s5/test_runtime_defense_autonomy.gd",
"expected": "28ca81ddde4da49442b427ed4c55ddcf213ecb389712db585b64cd416636c403",
"observed": "28ca81ddde4da49442b427ed4c55ddcf213ecb389712db585b64cd416636c403"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/tests/s5/test_runtime_defense_cycle.gd",
"expected": "a909e2af73aae43590cdd91d07ed2548f4fd2f675d26fa63aa74f6a5cda34357",
"observed": "a909e2af73aae43590cdd91d07ed2548f4fd2f675d26fa63aa74f6a5cda34357"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/tools/run_all_tests.py",
"expected": "320ca668732b4ff72fc4449998af2327d4e5c527b06896740806aaf0487282b4",
"observed": "320ca668732b4ff72fc4449998af2327d4e5c527b06896740806aaf0487282b4"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/core/simulation_kernel.gd",
"expected": "341c0c878c4894adbac628d0db6362ff69fc3347bdd9e61e50936e15dc2d1edb",
"observed": "341c0c878c4894adbac628d0db6362ff69fc3347bdd9e61e50936e15dc2d1edb"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/current-main-source/autoload/simulation_runtime.gd",
"expected": "45514aea9367ff678f4dc05166bb9b58121f240d4b5565edeb7ab258e3ded8e0",
"observed": "45514aea9367ff678f4dc05166bb9b58121f240d4b5565edeb7ab258e3ded8e0"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/facility/facility_service.gd",
"expected": "ceb4a3e9224587423f273cdb2b56e6843ab176ac1fc4fe79dd498b5ed5c33b77",
"observed": "ceb4a3e9224587423f273cdb2b56e6843ab176ac1fc4fe79dd498b5ed5c33b77"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/economy/economy_service.gd",
"expected": "95aedd0a0421c93e8fa39f0f76fa890cd0a46905d9a25c88c8b17c4d6d47728e",
"observed": "95aedd0a0421c93e8fa39f0f76fa890cd0a46905d9a25c88c8b17c4d6d47728e"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/operations/operations_coordinator.gd",
"expected": "871a248ee101b6df543fd5cf0440b5d4b0f02c21fa145a99f0687888c1bc6f90",
"observed": "871a248ee101b6df543fd5cf0440b5d4b0f02c21fa145a99f0687888c1bc6f90"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/scripts/guest/guest_service.gd",
"expected": "56880410e9a00816f9a95d30821982955532de8dd976980934e12016a9f2b21e",
"observed": "56880410e9a00816f9a95d30821982955532de8dd976980934e12016a9f2b21e"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/tests/s5/test_runtime_defense_autonomy.gd",
"expected": "28ca81ddde4da49442b427ed4c55ddcf213ecb389712db585b64cd416636c403",
"observed": "28ca81ddde4da49442b427ed4c55ddcf213ecb389712db585b64cd416636c403"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/run_all_tests.py.reference",
"expected": "320ca668732b4ff72fc4449998af2327d4e5c527b06896740806aaf0487282b4",
"observed": "320ca668732b4ff72fc4449998af2327d4e5c527b06896740806aaf0487282b4"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q37-remaining-source-map/source/tests/s5/test_runtime_defense_cycle.gd",
"expected": "a909e2af73aae43590cdd91d07ed2548f4fd2f675d26fa63aa74f6a5cda34357",
"observed": "a909e2af73aae43590cdd91d07ed2548f4fd2f675d26fa63aa74f6a5cda34357"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q35-uid-diagnostic/run_p13_reference_tests.py.reference",
"expected": "9adc8aa2a7662df8dd70386ddb0bff34574e44d7411de3b6128ddd15eb24675c",
"observed": "9adc8aa2a7662df8dd70386ddb0bff34574e44d7411de3b6128ddd15eb24675c"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q40-source-and-native-findings/INDEX.json",
"expected": "1e72f10784d639ff509e8175f73c46e8e2479dda8263365f51dd9f67c753709e",
"observed": "1e72f10784d639ff509e8175f73c46e8e2479dda8263365f51dd9f67c753709e"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q40-source-and-native-findings/ROOT_Q40_NATIVE_FAILURE_AUDIT.json",
"expected": "622edabc16a3e9ef6528b4009d44d8307f998bf9aa0c441b4b223bf5a40efeb5",
"observed": "622edabc16a3e9ef6528b4009d44d8307f998bf9aa0c441b4b223bf5a40efeb5"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q40-source-and-native-findings/ROOT_R40_CURRENT_SOURCE_GAPS.json",
"expected": "306195acb5661f9c4c087428ba16f0a46fe54cf1f8b2dea9933c035b90ad7511",
"observed": "306195acb5661f9c4c087428ba16f0a46fe54cf1f8b2dea9933c035b90ad7511"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q40-source-and-native-findings/ROOT_R40_AFFECTED_PURE_CONTROLS.json",
"expected": "736860fe730d7b7fa744783f74a0de875afe8ba3ff65e74598bd4c07e29d955a",
"observed": "736860fe730d7b7fa744783f74a0de875afe8ba3ff65e74598bd4c07e29d955a"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q40-source-and-native-findings/ROOT_R40_ALL_CHECK_ONLY.json",
"expected": "ffec08fd3ed45d346ae27de4c502fbc7768fc51ccadce433ca30805faf127a68",
"observed": "ffec08fd3ed45d346ae27de4c502fbc7768fc51ccadce433ca30805faf127a68"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q40-source-and-native-findings/writer-stderr.log",
"expected": "75ddd2af006162c702751853f9f3931086bded7544a8addd0d65383c47a59a67",
"observed": "75ddd2af006162c702751853f9f3931086bded7544a8addd0d65383c47a59a67"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q40-source-and-native-findings/writer-stdout.log",
"expected": "eebf10b3f84916338ab651af117852cbe852bef28f79032472fdb01342ac0608",
"observed": "eebf10b3f84916338ab651af117852cbe852bef28f79032472fdb01342ac0608"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q40-source-and-native-findings/writer.json",
"expected": "ceb971f39afe131fbeccb0fbe06be37ada0d31ef3ee86f216701a1618abe444a",
"observed": "ceb971f39afe131fbeccb0fbe06be37ada0d31ef3ee86f216701a1618abe444a"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q40-source-and-native-findings/writer-S5D_DESTRUCTION_RAID-commands.json",
"expected": "19be61a849204ce72731d586f9685ad129231a55fca57a006ddbc723d52d9879",
"observed": "19be61a849204ce72731d586f9685ad129231a55fca57a006ddbc723d52d9879"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q40-source-and-native-findings/execution.json",
"expected": "7c00af3acee008927faf7f1b99b6a7407671674668674f30acc3504ea6ee21d9",
"observed": "7c00af3acee008927faf7f1b99b6a7407671674668674f30acc3504ea6ee21d9"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q41-oracle-source-facts/INDEX.json",
"expected": "903601cfec6be397f99c30aeba9301f2312c1f659a73f30d5d8a04e1f07ef468",
"observed": "903601cfec6be397f99c30aeba9301f2312c1f659a73f30d5d8a04e1f07ef468"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q41-oracle-source-facts/ACTUAL_FAILED_COMMAND_JOURNAL_SOURCE.json",
"expected": "27d39ab2b01e1e73d4bd38e335a87fe26ddbea3e748fc9c95d82c886dfd14187",
"observed": "27d39ab2b01e1e73d4bd38e335a87fe26ddbea3e748fc9c95d82c886dfd14187"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/q41-oracle-source-facts/HISTORICAL_S4_WRAPPER_R28.py.reference",
"expected": "2d3be39d2b310abac058e27336ac816c234043a0a1dd7b2c52d84994907dd31b",
"observed": "2d3be39d2b310abac058e27336ac816c234043a0a1dd7b2c52d84994907dd31b"
}
]
}
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,131 @@
{
"M": "c0ea009b28a7649aca6a433a1a24dc0be5e7ab81",
"files": {
"scripts/core/simulation_kernel.gd": {
"sha256": "341c0c878c4894adbac628d0db6362ff69fc3347bdd9e61e50936e15dc2d1edb",
"bytes": 7602,
"functions": {
"advance_one_minute": {
"line": 122,
"end_line": 158,
"sha256": "b9587ef722d8c8640248025462819374ae5eca1c3d8bbe600b6bc9c328567777",
"body": "func advance_one_minute() -> void:\n\t_abort_current_tick_requested = false\n\t_last_tick_advanced = false\n\ttick_started.emit(absolute_minute)\n\t_run_phase(TickPhase.APPLY_COMMANDS)\n\t# A Runtime gate can reject the tick before the Clock changes. This is\n\t# distinct from an ordinary pause raised by a command that already committed\n\t# for the upcoming minute.\n\tif _abort_current_tick_requested:\n\t\t_abort_current_tick_requested = false\n\t\treturn\n\n\tvar previous_absolute_minute := absolute_minute\n\tabsolute_minute += 1\n\t_sync_calendar_fields()\n\t_handle_time_boundaries(previous_absolute_minute)\n\t_run_phase(TickPhase.TIME_BOUNDARIES)\n\n\tfor phase in [\n\t\tTickPhase.MANA,\n\t\tTickPhase.CONSTRUCTION,\n\t\tTickPhase.LOGISTICS,\n\t\tTickPhase.FACILITY_COMPLETION,\n\t\tTickPhase.VITALS_AND_ENVIRONMENT,\n\t\tTickPhase.INCIDENTS_AND_EVENTS,\n\t\tTickPhase.FACILITY_QUEUES,\n\t\tTickPhase.AI_DECISIONS,\n\t\tTickPhase.PUBLISH_SNAPSHOT,\n\t]:\n\t\t_run_phase(phase)\n\n\tsnapshot_version += 1\n\ttick_completed.emit(absolute_minute)\n\t_emit_current_time()\n\t_abort_current_tick_requested = false\n\t_last_tick_advanced = true\n\n"
},
"_run_phase": {
"line": 236,
"end_line": 249,
"sha256": "52461eeb288892a4bb4b6a99570185af08a30758ef88b0046a911baaa6f318e1",
"body": "func _run_phase(phase: TickPhase) -> void:\n\ttick_phase_started.emit(phase, absolute_minute)\n\tif not _phase_handlers.has(phase):\n\t\treturn\n\tvar handlers: Dictionary = _phase_handlers[phase]\n\tvar handler_ids: Array = handlers.keys()\n\thandler_ids.sort_custom(func(left: Variant, right: Variant) -> bool:\n\t\treturn String(left) < String(right)\n\t)\n\tfor handler_id: Variant in handler_ids:\n\t\tvar callback: Callable = handlers[handler_id]\n\t\tif callback.is_valid():\n\t\t\tcallback.call(absolute_minute)\n\n"
}
}
},
"autoload/simulation_runtime.gd": {
"sha256": "45514aea9367ff678f4dc05166bb9b58121f240d4b5565edeb7ab258e3ded8e0",
"bytes": 616434,
"functions": {
"_execute_register_event_definition": {
"line": 6878,
"end_line": 6886,
"sha256": "6c271786ca52115a233f9c3ad2d19f93ef101f2da533672118165757aac3347d",
"body": "func _execute_register_event_definition(command: SimulationCommand) -> CommandResult:\n\tvar raw_definition: Variant = command.payload.get(&\"definition\", command.payload.get(\"definition\", null))\n\tvar definition := EventDefinition.from_variant(raw_definition)\n\tif definition == null:\n\t\treturn CommandResult.failed(CommandResult.Code.INVALID_PAYLOAD, command.command_id, \"Event definition is malformed.\")\n\tvar result := event_service.register_definition(definition)\n\tresult.command_id = command.command_id\n\treturn result\n\n"
},
"_execute_enqueue_event": {
"line": 6887,
"end_line": 6895,
"sha256": "5e5d5fb5e225dbcb09aeb2addb92c0011965c7e8f6b12cda91ca05d98e240c08",
"body": "func _execute_enqueue_event(command: SimulationCommand) -> CommandResult:\n\tvar event_id := StringName(command.payload.get(&\"event_id\", command.payload.get(\"event_id\", \"\")))\n\tvar actor_ids := _name_array(command.payload.get(&\"actor_ids\", command.payload.get(\"actor_ids\", [])))\n\tvar raw_options: Variant = command.payload.get(&\"options\", command.payload.get(\"options\", {}))\n\tvar options: Dictionary = raw_options.duplicate(true) if raw_options is Dictionary else {}\n\tvar result := event_service.enqueue_candidate(event_id, actor_ids, _runtime_event_minute(), options)\n\tresult.command_id = command.command_id\n\treturn result\n\n"
},
"_advance_relationship_events": {
"line": 8637,
"end_line": 8655,
"sha256": "20ca7abfdcbbc914f91545c3eded46e3e87035ff4153541ffcbf92471b02b03f",
"body": "func _advance_relationship_events(absolute_minute: int) -> void:\n\tif _operations_tick_blocked:\n\t\treturn\n\tif _operations_morning_already_processed(absolute_minute):\n\t\treturn\n\tevent_service.process_expired(absolute_minute)\n\tevent_service.audit_actor_availability(absolute_minute)\n\t_enqueue_pending_relationship_candidates()\n\tif event_service.get_foreground_instance() == null:\n\t\tvar started := event_service.start_next_event(\n\t\t\tabsolute_minute,\n\t\t\t_build_event_context(absolute_minute)\n\t\t)\n\t\tif started.is_success() and bool(started.details.get(&\"waiting_for_choice\", false)):\n\t\t\t_clock.set_paused(true)\n\tif event_service.pause_requested:\n\t\t_clock.set_paused(true)\n\n\n"
},
"_validate_event_action": {
"line": 9991,
"end_line": 10039,
"sha256": "83e0cce3b59244440b11acdee6f87dd521859701769b1689ff2775db5c92c5f5",
"body": "func _validate_event_action(action: EventAction) -> Dictionary:\n\tmatch action.type:\n\t\tEventAction.Type.ADD_LEDGER_ENTRY:\n\t\t\tvar from_account := StringName(action.payload.get(&\"from_account\", action.payload.get(\"from_account\", PLAYER_CASH_ACCOUNT)))\n\t\t\tvar to_account := StringName(action.payload.get(&\"to_account\", action.payload.get(\"to_account\", OPERATING_EXPENSE_ACCOUNT)))\n\t\t\tvar amount := int(action.payload.get(&\"amount\", action.payload.get(\"amount\", 0)))\n\t\t\tif amount <= 0 or not economy_service.has_account(from_account) or not economy_service.has_account(to_account):\n\t\t\t\treturn {&\"ok\": false, &\"error\": \"Ledger Action has invalid accounts or amount.\"}\n\t\t\tif not economy_service.account_allows_negative(from_account) and economy_service.get_balance(from_account) < amount:\n\t\t\t\treturn {&\"ok\": false, &\"error\": \"Ledger Action source cannot fund the amount.\"}\n\t\tEventAction.Type.ADD_OR_REMOVE_ITEM:\n\t\t\tvar inventory_id := StringName(action.payload.get(&\"inventory_id\", action.payload.get(\"inventory_id\", \"\")))\n\t\t\tvar item_id := StringName(action.payload.get(&\"item_id\", action.payload.get(\"item_id\", \"\")))\n\t\t\tvar delta := int(action.payload.get(&\"quantity_delta\", action.payload.get(\"quantity_delta\", 0)))\n\t\t\tif inventory_id.is_empty() or item_id.is_empty() or delta == 0:\n\t\t\t\treturn {&\"ok\": false, &\"error\": \"Inventory Action requires inventory, item and non-zero delta.\"}\n\t\t\tif delta < 0 and inventory_service.available_quantity(inventory_id, item_id) < -delta:\n\t\t\t\treturn {&\"ok\": false, &\"error\": \"Inventory Action stock is unavailable.\"}\n\t\tEventAction.Type.CREATE_TASK:\n\t\t\tif StringName(action.payload.get(&\"task_type\", action.payload.get(\"task_type\", \"\"))).is_empty():\n\t\t\t\treturn {&\"ok\": false, &\"error\": \"CREATE_TASK requires task_type.\"}\n\t\tEventAction.Type.SET_FACILITY_STATE:\n\t\t\tvar facility_id := StringName(action.payload.get(&\"facility_id\", action.payload.get(\"facility_id\", \"\")))\n\t\t\tvar conditions_value: Variant = action.payload.get(&\"conditions\", action.payload.get(\"conditions\", null))\n\t\t\tif not facility_service.has_instance(facility_id) or not conditions_value is Dictionary:\n\t\t\t\treturn {&\"ok\": false, &\"error\": \"Facility Action target or conditions are invalid.\"}\n\t\t\tvar defense_owner: StringName = _defense_lock_owner(facility_id, &\"ASSET\")\n\t\t\tif not defense_owner.is_empty() \\\n\t\t\t\t\tand (conditions_value.has(&\"durability\") or conditions_value.has(\"durability\")):\n\t\t\t\treturn {&\"ok\": false, &\"error\": \"Event Action cannot mutate Defense-owned Facility durability.\"}\n\t\tEventAction.Type.TELEPORT_ENTITY_FOR_RECOVERY:\n\t\t\tvar entity_id := StringName(action.payload.get(&\"entity_id\", action.payload.get(\"entity_id\", \"\")))\n\t\t\tvar cell_value: Variant = _parse_world_cell(\n\t\t\t\taction.payload.get(&\"cell\", action.payload.get(\"cell\", null))\n\t\t\t)\n\t\t\tif not _event_actor_exists(entity_id) or cell_value == null:\n\t\t\t\treturn {&\"ok\": false, &\"error\": \"Recovery teleport target is invalid.\"}\n\t\t\tvar target_cell: Vector3i = cell_value\n\t\t\tvar traffic := path_service.get_cell_traffic(target_cell)\n\t\t\tvar actor_id := (\n\t\t\t\t_guest_path_actor_id(entity_id)\n\t\t\t\tif guest_service.has_guest(entity_id)\n\t\t\t\telse _staff_path_actor_id(entity_id)\n\t\t\t)\n\t\t\tif traffic.is_empty() or bool(traffic.get(&\"temporary_block\", false)) \\\n\t\t\t\t\tor not path_service.has_actor_projection(actor_id):\n\t\t\t\treturn {&\"ok\": false, &\"error\": \"Recovery teleport requires a projected actor and an unblocked walkable target.\"}\n\treturn {&\"ok\": true}\n\n"
},
"_apply_event_action": {
"line": 10040,
"end_line": 10123,
"sha256": "d79e7aca02eed06f500ffc632c6160cd80d76c3d7c5c90dc097f71b60380d365",
"body": "func _apply_event_action(action: EventAction, context: Dictionary) -> Dictionary:\n\tvar instance_id := StringName(context.get(&\"event_instance_id\", \"\"))\n\tmatch action.type:\n\t\tEventAction.Type.CREATE_DEFENSE_RAID:\n\t\t\treturn _apply_event_defense_raid(action, context)\n\t\tEventAction.Type.ADD_LEDGER_ENTRY:\n\t\t\tvar from_account := StringName(action.payload.get(&\"from_account\", action.payload.get(\"from_account\", PLAYER_CASH_ACCOUNT)))\n\t\t\tvar to_account := StringName(action.payload.get(&\"to_account\", action.payload.get(\"to_account\", OPERATING_EXPENSE_ACCOUNT)))\n\t\t\tvar amount := int(action.payload.get(&\"amount\", action.payload.get(\"amount\", 0)))\n\t\t\tvar result := economy_service.transfer(\n\t\t\t\tfrom_account, to_account, amount, _runtime_event_minute(),\n\t\t\t\t&\"EVENT_ACTION\", instance_id,\n\t\t\t\tStringName(\"event.action.%s.%s\" % [instance_id, action.action_id])\n\t\t\t)\n\t\t\treturn {&\"ok\": result.is_success(), &\"error\": result.message}\n\t\tEventAction.Type.ADD_OR_REMOVE_ITEM:\n\t\t\tvar inventory_id := StringName(action.payload.get(&\"inventory_id\", action.payload.get(\"inventory_id\", \"\")))\n\t\t\tvar item_id := StringName(action.payload.get(&\"item_id\", action.payload.get(\"item_id\", \"\")))\n\t\t\tvar delta := int(action.payload.get(&\"quantity_delta\", action.payload.get(\"quantity_delta\", 0)))\n\t\t\tif delta > 0:\n\t\t\t\tvar added := inventory_service.add_stack(inventory_id, item_id, delta, 100, -1, _runtime_event_minute())\n\t\t\t\treturn {&\"ok\": bool(added.get(&\"ok\", false)), &\"error\": added.get(&\"message\", \"\")}\n\t\t\tvar reserved := inventory_service.reserve_item(\n\t\t\t\tinventory_id, item_id, -delta, instance_id, &\"event_action\",\n\t\t\t\t_runtime_event_minute(), _runtime_event_minute() + 1,\n\t\t\t\tStringName(\"event.item.reserve.%s.%s\" % [instance_id, action.action_id])\n\t\t\t)\n\t\t\tif not bool(reserved.get(&\"ok\", false)):\n\t\t\t\treturn {&\"ok\": false, &\"error\": reserved.get(&\"message\", \"Item reservation failed.\")}\n\t\t\tvar consumed := inventory_service.consume_reservations(\n\t\t\t\t_name_array(reserved.get(&\"reservation_ids\", [])),\n\t\t\t\tStringName(\"event.item.consume.%s.%s\" % [instance_id, action.action_id]),\n\t\t\t\t_runtime_event_minute()\n\t\t\t)\n\t\t\treturn {&\"ok\": bool(consumed.get(&\"ok\", false)), &\"error\": consumed.get(&\"message\", \"\")}\n\t\tEventAction.Type.CREATE_TASK:\n\t\t\tvar raw_options: Variant = action.payload.get(&\"options\", action.payload.get(\"options\", {}))\n\t\t\tvar options: Dictionary = raw_options.duplicate(true) if raw_options is Dictionary else {}\n\t\t\tvar created := staff_service.create_task(\n\t\t\t\tStringName(action.payload.get(&\"task_type\", action.payload.get(\"task_type\", \"\"))),\n\t\t\t\tint(action.payload.get(&\"priority\", action.payload.get(\"priority\", 50))),\n\t\t\t\t_runtime_event_minute(),\n\t\t\t\toptions,\n\t\t\t\tStringName(action.payload.get(&\"task_id\", action.payload.get(\"task_id\", \"\")))\n\t\t\t)\n\t\t\treturn {&\"ok\": created.is_success(), &\"error\": created.message}\n\t\tEventAction.Type.SET_FACILITY_STATE:\n\t\t\tvar updated := facility_service.set_operational_status(\n\t\t\t\tStringName(action.payload.get(&\"facility_id\", action.payload.get(\"facility_id\", \"\"))),\n\t\t\t\taction.payload.get(&\"conditions\", action.payload.get(\"conditions\", {})),\n\t\t\t\t_runtime_event_minute()\n\t\t\t)\n\t\t\treturn {&\"ok\": updated.is_success(), &\"error\": updated.message}\n\t\tEventAction.Type.TELEPORT_ENTITY_FOR_RECOVERY:\n\t\t\tvar entity_id := StringName(action.payload.get(&\"entity_id\", action.payload.get(\"entity_id\", \"\")))\n\t\t\tvar cell: Vector3i = _parse_world_cell(action.payload.get(&\"cell\", action.payload.get(\"cell\", null)))\n\t\t\tvar guest := guest_service.get_guest(entity_id)\n\t\t\tvar actor_id: StringName\n\t\t\tvar moved := false\n\t\t\tif guest != null:\n\t\t\t\tactor_id = _guest_path_actor_id(entity_id)\n\t\t\t\tmoved = guest_service.record_path_success(\n\t\t\t\t\tentity_id, cell, _runtime_event_minute()\n\t\t\t\t)\n\t\t\telse:\n\t\t\t\tvar staff := staff_service.get_staff(entity_id)\n\t\t\t\tactor_id = _staff_path_actor_id(entity_id)\n\t\t\t\tstaff.current_cell = cell\n\t\t\t\tmoved = true\n\t\t\tif not moved or not path_service.project_actor_position(\n\t\t\t\tactor_id, cell, _runtime_event_minute()\n\t\t\t):\n\t\t\t\treturn {&\"ok\": false, &\"error\": \"Recovery teleport could not commit its Path projection.\"}\n\t\t\t_movement_credits[actor_id] = {\n\t\t\t\t&\"credit\": 0,\n\t\t\t\t&\"updated_at\": _runtime_event_minute(),\n\t\t\t}\n\t\t\t_publish_actor_event(&\"ENTITY_RECOVERY_TELEPORTED\", &\"event_service\", [entity_id, actor_id], {\n\t\t\t\t&\"cell\": cell,\n\t\t\t\t&\"path_actor_id\": actor_id,\n\t\t\t})\n\t\t\treturn {&\"ok\": true}\n\treturn {&\"ok\": false, &\"error\": \"Unsupported Event Action.\"}\n\n"
},
"_advance_facilities": {
"line": 8504,
"end_line": 8509,
"sha256": "f1efd0c23bdd60d1ef19a21879640b53b8b4d88844c0c881fe7cd724387ec274",
"body": "func _advance_facilities(absolute_minute: int) -> void:\n\tif _operations_tick_blocked:\n\t\treturn\n\tfacility_service.advance_one_minute(absolute_minute)\n\tkitchen_production.advance_one_minute(absolute_minute)\n\n"
},
"_process_tick_commands": {
"line": 5765,
"end_line": 5775,
"sha256": "9de66a4bb84b12304300d49085f44546412319bd4aee91e67b61becf97e50294",
"body": "func _process_tick_commands(current_absolute_minute: int) -> void:\n\tif _operations_enabled:\n\t\t_operations_tick_blocked = _operations_should_block_tick()\n\t\tif _operations_tick_blocked:\n\t\t\t_clock.set_paused(true)\n\t\t\t_clock.request_current_tick_abort()\n\t\t\treturn\n\t_process_commands(current_absolute_minute + 1)\n\t_synchronize_operations_population()\n\n\n"
}
}
},
"scripts/facility/facility_service.gd": {
"sha256": "ceb4a3e9224587423f273cdb2b56e6843ab176ac1fc4fe79dd498b5ed5c33b77",
"bytes": 44951,
"functions": {
"start_next_service": {
"line": 449,
"end_line": 524,
"sha256": "2eb1cf1226fb1496b6b96c39184ad6a767b4fde747923df599097372435ffa4c",
"body": "func start_next_service(\n\tinstance_id: StringName,\n\tabsolute_minute: int = -1,\n\tvalidator: Callable = Callable()\n) -> CommandResult:\n\tvar instance := get_instance(instance_id)\n\tif instance == null:\n\t\treturn _not_found(\"Facility instance\", instance_id)\n\tvar minute := _resolve_minute(absolute_minute)\n\t_resolve_operating_dependency(instance_id, minute, {}, {})\n\tinstance.apply_pending_policy(minute)\n\tvar old_state := instance.state\n\tinstance.evaluate_state(minute)\n\t_emit_state_change(instance, old_state)\n\tif not instance.can_start_service(minute):\n\t\treturn _invalid(\n\t\t\t\"Facility cannot start a service in its current state.\",\n\t\t\t{\n\t\t\t\t&\"instance_id\": instance_id,\n\t\t\t\t&\"state\": FacilityInstanceType.State.keys()[instance.state],\n\t\t\t\t&\"reasons\": instance.state_reasons.duplicate(),\n\t\t\t}\n\t\t)\n\t_cleanup_missing_queue_requests(instance)\n\tif instance.queue_entries.is_empty():\n\t\treturn _not_found(\"Queued service request\", &\"\")\n\tvar request := get_request(instance.queue_entries[0])\n\tif request == null:\n\t\treturn _invalid(\"The next queue entry is corrupt.\")\n\tif not instance.can_accept_customers(request.guest_ids):\n\t\treturn _invalid(\"Simultaneous customer limit reached.\", {&\"reason\": &\"CUSTOMER_CAPACITY\"})\n\tvar effective_validator := validator if validator.is_valid() else _start_validator\n\tvar callback_failure := _run_boundary_callback(\n\t\teffective_validator,\n\t\t[request, instance, minute],\n\t\t\"Service start validation failed.\",\n\t\tCommandResultType.Code.VALIDATION_FAILED\n\t)\n\tif callback_failure != null:\n\t\tcallback_failure.details[&\"request_id\"] = request.request_id\n\t\tcallback_failure.details[&\"instance_id\"] = instance_id\n\t\treturn callback_failure\n\n\tvar service_id := _next_service_id()\n\tvar service := ServiceInstanceType.new().configure(\n\t\tservice_id,\n\t\trequest.request_id,\n\t\tinstance_id,\n\t\tminute,\n\t\trequest.service_minutes if request.service_minutes > 0 else instance.base_service_minutes,\n\t\trequest.guest_ids,\n\t\tinstance.active_staff_ids,\n\t\t{\n\t\t\t&\"quality_snapshot\": request.expected_quality,\n\t\t\t&\"price_snapshot\": request.quoted_price,\n\t\t\t&\"policy_snapshot\": request.policy_snapshot,\n\t\t\t&\"inventory_reservations\": request.reserved_inventory_ids,\n\t\t}\n\t)\n\tinstance.queue_entries.remove_at(0)\n\t# Report this start's service index, independent of customer headcount and callbacks.\n\tvar slot := instance.active_services.size()\n\tinstance.active_services[service_id] = service\n\t_known_service_ids[service_id] = true\n\t_increment_stat(instance.statistics_today, &\"services_started\")\n\t_increment_stat(instance.lifetime_statistics, &\"services_started\")\n\tservice_started.emit(service)\n\tlast_error = \"\"\n\treturn _success({\n\t\t&\"instance_id\": instance_id,\n\t\t&\"request_id\": request.request_id,\n\t\t&\"service_id\": service_id,\n\t\t&\"slot\": slot,\n\t})\n\n\n"
},
"_fail_service": {
"line": 933,
"end_line": 947,
"sha256": "56f61b255217bddb4c8a6ad3af6ed1f9edc3b6a6e928dacf2105be6698936de5",
"body": "func _fail_service(\n\tinstance: FacilityInstance,\n\tservice: ServiceInstance,\n\treason: StringName,\n\tabsolute_minute: int\n) -> void:\n\tservice.mark_failed(reason, absolute_minute)\n\tinstance.active_services.erase(service.service_id)\n\t_requests.erase(service.request_id)\n\t_service_history[service.service_id] = service\n\t_increment_stat(instance.statistics_today, &\"services_failed\")\n\t_increment_stat(instance.lifetime_statistics, &\"services_failed\")\n\tservice_failed.emit(service, reason)\n\n\n"
},
"set_operational_status": {
"line": 132,
"end_line": 177,
"sha256": "10275169f4a71ad490c432443c34068d1951f099e11132b3c18b48647e7845c8",
"body": "func set_operational_status(\n\tinstance_id: StringName,\n\tconditions: Dictionary,\n\tabsolute_minute: int = -1\n) -> CommandResult:\n\tvar instance := get_instance(instance_id)\n\tif instance == null:\n\t\treturn _not_found(\"Facility instance\", instance_id)\n\tvar old_state := instance.state\n\tif _has_value(conditions, &\"related_facility_id\"):\n\t\tvar raw_related: Variant = _value(conditions, &\"related_facility_id\", null)\n\t\tif typeof(raw_related) not in [TYPE_STRING, TYPE_STRING_NAME]:\n\t\t\treturn _invalid(\"Related facility must be one facility ID.\")\n\t\tvar related := StringName(raw_related)\n\t\tif related == instance_id or (not related.is_empty() and not has_instance(related)):\n\t\t\treturn _invalid(\"Related facility is missing or refers to itself.\")\n\t\tif instance.requires_operating_kitchen() and not related.is_empty():\n\t\t\tvar kitchen := get_instance(related)\n\t\t\tif kitchen.definition_id != &\"kitchen\" or kitchen.origin.z != WorldService.LAYER_BACK:\n\t\t\t\treturn _invalid(\"Dining facilities require one existing BACK kitchen.\", {&\"reason\": &\"INVALID_RELATED_KITCHEN\"})\n\t\t\tif not _required_related_placement_matches(instance, kitchen):\n\t\t\t\treturn _invalid(\"The BACK kitchen must lie inside this FRONT dining facility's XY footprint.\", {&\"reason\": &\"INVALID_RELATED_KITCHEN_PLACEMENT\"})\n\t\tvar seen := {instance_id: true}\n\t\tvar cursor := related\n\t\twhile not cursor.is_empty() and has_instance(cursor):\n\t\t\tif seen.has(cursor):\n\t\t\t\treturn _invalid(\"Related facilities cannot form a cycle.\")\n\t\t\tseen[cursor] = true\n\t\t\tcursor = get_instance(cursor).related_facility_id\n\tif _has_value(conditions, &\"related_facility_operating\") or _has_value(conditions, &\"operation_state\"):\n\t\treturn _invalid(\"Operating flags are computed from actual facility conditions.\")\n\tif _has_value(conditions, &\"suspension_reason\") and (typeof(_value(conditions, &\"suspension_reason\", null)) not in [TYPE_STRING, TYPE_STRING_NAME] or StringName(_value(conditions, &\"suspension_reason\", &\"\")) not in [&\"DESTROYED\", &\"RAIDED\"]):\n\t\treturn _invalid(\"Suspension recovery is not specified.\")\n\tvar minute := _resolve_minute(absolute_minute)\n\tinstance.set_operational_conditions(conditions, minute)\n\tif old_state != instance.state or _has_value(conditions, &\"related_facility_id\"):\n\t\trefresh_operating_dependencies(minute)\n\t_emit_state_change(instance, old_state)\n\tlast_error = \"\"\n\treturn _success({\n\t\t&\"instance_id\": instance_id,\n\t\t&\"state\": FacilityInstanceType.State.keys()[instance.state],\n\t\t&\"state_reasons\": instance.state_reasons.duplicate(),\n\t})\n\n\n"
}
}
},
"scripts/facility/facility_instance.gd": {
"sha256": "0c6aa493f3299611e05dd26aa429dda8cf7b5c479e4d09632036fb862f79a324",
"bytes": 22815,
"functions": {
"can_start_service": {
"line": 243,
"end_line": 247,
"sha256": "39ab5458947ddce7d26129d0174f82dfcec0e87358c058220f61c483f43a9cd5",
"body": "func can_start_service(absolute_minute: int) -> bool:\n\tevaluate_state(absolute_minute)\n\treturn state in [State.OPEN, State.DEGRADED] and available_slots() > 0\n\n\n"
},
"can_accept_customers": {
"line": 267,
"end_line": 278,
"sha256": "3d0984f009ca82b40057c57e0a10a1b68200026843b55a9e63d821064292046f",
"body": "func can_accept_customers(guest_ids: Array[StringName]) -> bool:\n\tif customer_capacity < 0:\n\t\treturn true\n\tvar customers: Dictionary = {}\n\tfor service: ServiceInstance in active_services.values():\n\t\tfor guest_id: StringName in service.guest_ids:\n\t\t\tcustomers[guest_id] = true\n\tfor guest_id: StringName in guest_ids:\n\t\tcustomers[guest_id] = true\n\treturn customers.size() <= customer_capacity\n\n\n"
}
}
},
"scripts/facility/service_instance.gd": {
"sha256": "629a142f80cbc31b97b6d08483d94e029e448969bb6d39fdc8dd39931654dd35",
"bytes": 7320,
"functions": {
"mark_failed": {
"line": 128,
"end_line": 134,
"sha256": "178c6879e64385f0e3ff99fa98ae6ceb4dc67f6c2c981b0effb229f5d4d647fa",
"body": "func mark_failed(reason: StringName, absolute_minute: int) -> void:\n\tstate = State.FAILED\n\tfailure_reason = reason\n\tcompleted_at = absolute_minute\n\tstaff_grace_deadline = NO_DEADLINE\n\n\n"
}
}
},
"data/facilities/cafeteria.tres": {
"sha256": "86d540fe2d78b9dcdbe5a0af6e4a001f4cec54934636ed01deb25a943c79128a",
"bytes": 867,
"functions": {},
"source": "[gd_resource type=\"Resource\" script_class=\"FacilityDefinition\" load_steps=2 format=3]\n\n[ext_resource type=\"Script\" path=\"res://scripts/data/facility_definition.gd\" id=\"1\"]\n\n[resource]\nscript = ExtResource(\"1\")\nid = &\"cafeteria\"\ndisplay_name = \"大衆食堂\"\ndescription = \"低価格で多くの客の食欲を満たす。裏層の厨房から料理を受け取る。\"\nzone = 0\nlayer = 0\nfootprint = Vector2i(4, 2)\nconstruction_cost = {&\"gold\": 800, &\"materials\": 12}\nbuild_minutes = 180\nweight_per_cell = 2\nmaintenance_gold = 4\nmaintenance_mana = 2\nstaff_min = 2\nstaff_max = 4\nrequired_roles = Array[StringName]([&\"cook\", &\"server\", &\"attendant\"])\nprimary_skill = &\"cooking\"\ncapacity = 12\nqueue_capacity = 24\nbase_service_minutes = 45\nbase_quality = 55\nbase_price = 25\ninventory_inputs = {&\"ingredient/basic_meal\": 1}\ntags = Array[StringName]([&\"dining\", &\"social\"])\n"
}
}
}
@@ -0,0 +1,354 @@
{
"task_id": "P04-01",
"status": "submitted-preparation-only",
"accepted": false,
"option": "B-no-reuse-adopter",
"worker_scope": "engine-free bounded harness repair",
"retained_M": "build/owner-handoff/p04-after-p26-closure-r01/verified-m-engine-free-r45",
"affected_pure": [
{
"name": "pure:series",
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/checker_series_fixtures.py",
"sha256": "5779b05505d6c7118f40cff3b8c309211142603d04c69183c3e68e88efaee4a9",
"baseline_sha256": "5ec725ad77313287f4f86ab30332012e2092caccafde2d91594ddd2013d8f418",
"unchanged": false,
"prior_result": {
"name": "pure:series",
"argv": [
"/Users/korizatou114/Antigravity/環境構築/agent-control/.venv/bin/python",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-root-q-r46-e7f22711/docs/plans/original-completion-2026-10-02/execution/p04-01/checker_series_fixtures.py",
"--build",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build"
],
"returncode": 0,
"passed": true,
"wall_seconds": 9.860904957633466,
"log": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/coordinator-p04-repair30-current-main-r01/q46-pure-plans-logs/pure_series.log"
}
},
{
"name": "pure:join",
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/checker_join_fixtures.py",
"sha256": "c80cb694fe3b7498f294fb10d7cd08aff9c93623bee442018e120d6b475cc4dd",
"baseline_sha256": "c80cb694fe3b7498f294fb10d7cd08aff9c93623bee442018e120d6b475cc4dd",
"unchanged": true,
"prior_result": {
"name": "pure:join",
"argv": [
"/Users/korizatou114/Antigravity/環境構築/agent-control/.venv/bin/python",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-root-q-r46-e7f22711/docs/plans/original-completion-2026-10-02/execution/p04-01/checker_join_fixtures.py",
"--build",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build"
],
"returncode": 0,
"passed": true,
"wall_seconds": 19.733827583957464,
"log": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/coordinator-p04-repair30-current-main-r01/q46-pure-plans-logs/pure_join.log"
}
}
],
"reused_pure": [
{
"name": "pure:encoder",
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/checker_encoder_fixtures.py",
"sha256": "aa286736657c025cc0c759102969a5fc1fcbae277c06ce4e418a8d4325dec6ac",
"baseline_sha256": "aa286736657c025cc0c759102969a5fc1fcbae277c06ce4e418a8d4325dec6ac",
"unchanged": true,
"prior_result": {
"name": "pure:encoder",
"argv": [
"/Users/korizatou114/Antigravity/環境構築/agent-control/.venv/bin/python",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-root-q-r46-e7f22711/docs/plans/original-completion-2026-10-02/execution/p04-01/checker_encoder_fixtures.py"
],
"returncode": 0,
"passed": true,
"wall_seconds": 0.08287249971181154,
"log": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/coordinator-p04-repair30-current-main-r01/q46-pure-plans-logs/pure_encoder.log"
}
},
{
"name": "pure:candidate",
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/checker_candidate_fixtures.py",
"sha256": "957a01f3c4ec8d167a10e276d9eb76a56352281aafb4d0a678c6e7c843c71903",
"baseline_sha256": "957a01f3c4ec8d167a10e276d9eb76a56352281aafb4d0a678c6e7c843c71903",
"unchanged": true,
"prior_result": {
"name": "pure:candidate",
"argv": [
"/Users/korizatou114/Antigravity/環境構築/agent-control/.venv/bin/python",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-root-q-r46-e7f22711/docs/plans/original-completion-2026-10-02/execution/p04-01/checker_candidate_fixtures.py",
"--pure-only"
],
"returncode": 0,
"passed": true,
"wall_seconds": 0.06956258416175842,
"log": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/coordinator-p04-repair30-current-main-r01/q46-pure-plans-logs/pure_candidate.log"
}
},
{
"name": "pure:negative",
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/checker_negative_fixtures.py",
"sha256": "1fbef5f248ca435c4983c4085023c74d9bf7811c3482dad3805e3bb8ba1846a9",
"baseline_sha256": "1fbef5f248ca435c4983c4085023c74d9bf7811c3482dad3805e3bb8ba1846a9",
"unchanged": true,
"prior_result": {
"name": "pure:negative",
"argv": [
"/Users/korizatou114/Antigravity/環境構築/agent-control/.venv/bin/python",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-root-q-r46-e7f22711/docs/plans/original-completion-2026-10-02/execution/p04-01/checker_negative_fixtures.py"
],
"returncode": 0,
"passed": true,
"wall_seconds": 34.31273220805451,
"log": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/coordinator-p04-repair30-current-main-r01/q46-pure-plans-logs/pure_negative-with-build-environment.log",
"controlled_environment": {
"BUILD_OUTPUT_DIR": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build",
"PYTHONDONTWRITEBYTECODE": "1"
}
}
},
{
"name": "pure:approval",
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/checker_approval_fixtures.py",
"sha256": "b218ad8fb8aaa9c58ec91c3e917b97307829cb1a3c2f09a2e3e2c856e7fff634",
"baseline_sha256": "b218ad8fb8aaa9c58ec91c3e917b97307829cb1a3c2f09a2e3e2c856e7fff634",
"unchanged": true,
"prior_result": {
"name": "pure:approval",
"argv": [
"/Users/korizatou114/Antigravity/環境構築/agent-control/.venv/bin/python",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-root-q-r46-e7f22711/docs/plans/original-completion-2026-10-02/execution/p04-01/checker_approval_fixtures.py"
],
"returncode": 0,
"passed": true,
"wall_seconds": 0.2860210002399981,
"log": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/coordinator-p04-repair30-current-main-r01/q46-pure-plans-logs/pure_approval.log"
}
},
{
"name": "pure:applicability",
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/checker_applicability_fixtures.py",
"sha256": "f993e0d8f5085f11799f7053de87cda7fc32225473a80a82c0d4d36663fc2235",
"baseline_sha256": "f993e0d8f5085f11799f7053de87cda7fc32225473a80a82c0d4d36663fc2235",
"unchanged": true,
"prior_result": {
"name": "pure:applicability",
"argv": [
"/Users/korizatou114/Antigravity/環境構築/agent-control/.venv/bin/python",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-root-q-r46-e7f22711/docs/plans/original-completion-2026-10-02/execution/p04-01/checker_applicability_fixtures.py"
],
"returncode": 0,
"passed": true,
"wall_seconds": 21.79465250018984,
"log": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/coordinator-p04-repair30-current-main-r01/q46-pure-plans-logs/pure_applicability.log"
}
},
{
"name": "pure:UID",
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/s5/s5_uid_controls.py",
"sha256": "17069b87b98c385e1298152c9c5c2f23c8710b79eb19aef073c64ce215f6c902",
"baseline_sha256": "17069b87b98c385e1298152c9c5c2f23c8710b79eb19aef073c64ce215f6c902",
"unchanged": true,
"prior_result": {
"name": "pure:UID",
"argv": [
"/Users/korizatou114/Antigravity/環境構築/agent-control/.venv/bin/python",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-root-q-r46-e7f22711/docs/plans/original-completion-2026-10-02/execution/p04-01/s5/s5_uid_controls.py",
"--project-root",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-root-q-r46-e7f22711",
"--scratch",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/s5-uid-root-controls-r46"
],
"returncode": 0,
"passed": true,
"wall_seconds": 0.7516515422612429,
"log": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/coordinator-p04-repair30-current-main-r01/q46-pure-plans-logs/pure_UID.log"
}
},
{
"name": "pure:power-adapter",
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/s5/s5_power_adapter_controls.py",
"sha256": "32d71db80994052b905829e6a2da38448ae789825c44570a901e67fe2d07fd33",
"baseline_sha256": "32d71db80994052b905829e6a2da38448ae789825c44570a901e67fe2d07fd33",
"unchanged": true,
"prior_result": {
"name": "pure:power-adapter",
"argv": [
"/Users/korizatou114/Antigravity/環境構築/agent-control/.venv/bin/python",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-root-q-r46-e7f22711/docs/plans/original-completion-2026-10-02/execution/p04-01/s5/s5_power_adapter_controls.py",
"--fixture-dir",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/owner-handoff/p04-after-p26-closure-r01/q36-writer-contract",
"--scratch",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/s5-power-controls-r46"
],
"returncode": 0,
"passed": true,
"wall_seconds": 0.8173460410907865,
"log": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/coordinator-p04-repair30-current-main-r01/q46-pure-plans-logs/pure_power-adapter.log"
}
},
{
"name": "pure:full-suite-negatives",
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/full_suite_verifier.py",
"sha256": "df3768b7755d603fc079e899da8f06ae4ebb529ae531824a30add0f4d6773a6e",
"baseline_sha256": "df3768b7755d603fc079e899da8f06ae4ebb529ae531824a30add0f4d6773a6e",
"unchanged": true,
"prior_result": {
"name": "pure:full-suite-negatives",
"argv": [
"/Users/korizatou114/Antigravity/環境構築/agent-control/.venv/bin/python",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-root-q-r46-e7f22711/docs/plans/original-completion-2026-10-02/execution/p04-01/full_suite_verifier.py",
"--controls"
],
"returncode": 0,
"passed": true,
"wall_seconds": 0.03479995811358094,
"log": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/coordinator-p04-repair30-current-main-r01/q46-pure-plans-logs/pure_full-suite-negatives.log"
}
},
{
"name": "pure:wrapper",
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/s5/s5_wrapper_fixtures.py",
"sha256": "1a4daebf46051e975a9cc740660c4672371ea6a9e6cb04cbc1d458ece5f0151d",
"baseline_sha256": "1a4daebf46051e975a9cc740660c4672371ea6a9e6cb04cbc1d458ece5f0151d",
"unchanged": true,
"prior_result": {
"name": "pure:wrapper",
"argv": [
"/Users/korizatou114/Antigravity/環境構築/agent-control/.venv/bin/python",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-root-q-r46-e7f22711/docs/plans/original-completion-2026-10-02/execution/p04-01/s5/s5_wrapper_fixtures.py"
],
"returncode": 0,
"passed": true,
"wall_seconds": 0.045466875191777945,
"log": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/coordinator-p04-repair30-current-main-r01/q46-pure-plans-logs/pure_wrapper.log"
}
},
{
"name": "pure:guard-mutations",
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/s5/s5_order_adapter_controls.py",
"sha256": "f1f90b9847830c6505a176bf78442e619b1d297c818ec561c92c498a4db74b53",
"baseline_sha256": "f1f90b9847830c6505a176bf78442e619b1d297c818ec561c92c498a4db74b53",
"unchanged": true,
"prior_result": {
"name": "pure:guard-mutations",
"argv": [
"/Users/korizatou114/Antigravity/環境構築/agent-control/.venv/bin/python",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-root-q-r46-e7f22711/docs/plans/original-completion-2026-10-02/execution/p04-01/s5/s5_order_adapter_controls.py",
"--pure-only"
],
"returncode": 0,
"passed": true,
"wall_seconds": 1.5057093752548099,
"log": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/coordinator-p04-repair30-current-main-r01/q46-pure-plans-logs/pure_guard-mutations.log"
}
},
{
"name": "pure:repair44-new-roster-paid-mutations",
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/s5/repair44_controls.py",
"sha256": "3eeaa1e17b7e27ba00c42be5fba3bbf907a8e82a75e834d7aec6bf62586c3781",
"baseline_sha256": "3eeaa1e17b7e27ba00c42be5fba3bbf907a8e82a75e834d7aec6bf62586c3781",
"unchanged": true,
"prior_result": {
"name": "pure:repair44-new-roster-paid-mutations",
"argv": [
"/Users/korizatou114/Antigravity/環境構築/agent-control/.venv/bin/python",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-root-q-r46-e7f22711/docs/plans/original-completion-2026-10-02/execution/p04-01/s5/repair44_controls.py"
],
"returncode": 0,
"passed": true,
"wall_seconds": 0.11979149980470538,
"log": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/coordinator-p04-repair30-current-main-r01/q46-pure-plans-logs/pure_repair44-new-roster-paid-mutations.log"
}
}
],
"unchanged_series_top_level_functions": {
"require": "9775a8b3969599d5d1f620d9717824195d7ab69490eafb5e7b8d1bacbf14df85",
"digest": "b46c442db8153d4caa4e3d7ebb3560f6dc261f2c614ac20722d41b32fb1785fd",
"unique": "72abe6f619eb97c8d540b8f74ddf0939c11d0c1c786d540a3e23a36a4beded9b",
"function_bodies": "7b69fa546fdc7a22f1acc531be141ec9627fd0212509f328e910c2401b0e6128",
"source_body_pins": "c83b75bb2ba1f3728cbc7aa8cb89455cdb7921d6cc02220c15d687f825b52be3",
"loads": "e35a9b9819e7efaf7e83b0a0b694cb220624888b765856ceb3054c37ee66c612",
"ordinary": "8b39c612330ac0844e593cb6f806e3fa38adfa53c829641f72082a1aad97295f",
"checked": "9cf3869795a79d420fda3c15ff21fa6d322d3090135e3687704eb6b33a8652df",
"variant": "60d89a476b547aaa511bc74525d881f3b35f060d98341165700e37b6b51d7cd6",
"normalized": "e63426c2f2de5ef8b97c4e12b96273c1ef73ae2961361a75293c09f5654c28d7",
"persistence_pins": "7fd541bfa754547aed89a0dcb019ac418fd44c7fbbecb65211c2cbcf2072704d",
"getter_array_headers": "c6f9c21b685fa96ca2d092af294acb7a125a107817c62cd17cd1a0d5fa65a79b",
"persisted_day_projection": "7c4e84529b2a262a66e12a3833b6c1dec328518e330ebc1cdb96a1ec8378305d",
"runtime": "d249848c71d3b0cab1d37e4b6b8631f76dab0f4a8f4ae8c7dcf6b9c9bc25d1a0",
"service_reservations": "79a8d64dddb277fd965c1965b92524df4616843f04900b3f8ba413bce4515f09",
"sales": "bec5cc78ac364aaa1ac78fd3d5fe099cf22afed188d8ddbd7047a299eb850b9e",
"s1_pretravel": "f02ee9c5071ceef71aa3ab530f9d3e9b0628b4003782ac28c86721c28b971f01",
"s1_semantics": "7cc52a4fd173bddf1f0e3f47c1c5266de06202f526195ad2e97b520ff34bc755",
"settlement": "c2b1a2d54446bb583977ea8fecb9a6577f5de736882a0990deae62cc70e20d38",
"recall": "31961e7c264046b805be3c0473f9ec2412841fc17e5cce2729ca8b5f32078528",
"s2a_semantics": "f87f4312d7e4643415e6268a2683cbd4d5967d2c94dd5ff45381fed0db4e6ac5",
"s2b_semantics": "ccb4cffd5bdbc31e5f0ecfa28e1b98dd527f348a1c341805aa68664fe35bf65f",
"s3_semantics": "a93e0acd0b67844992ae9dee285230c928d2ca365a628171d1a99e4856832fd7",
"dependency_closure_diagnostic": "9e352050aa9f23daaaa8cac0d02ff380d5dfb2e4076398906eaa0c5c1fcc5d0f",
"power_stop": "07d9bcef32320e33c92f1afe7e5be35e1e37a4debe751ebceb1d6279b67868c5",
"verify_s4_engine": "8f0761a68c3adbbd69a47a3358952bc458d0a885a72ca9e64694ff5c5bc3dbd8",
"verify_s4_wrapper": "ed7b19fb2f50c9aa30ef34ad355ef7eea884688aaf61aee77583698fffe2b042",
"verify_s4": "efc8d32132db9e498d20eec6bc36e4cdf56a415439349339cbb20c592276d849",
"verify_s1": "13cccc10c8758fec02e9b655fd0d97a5139dfe92d65a40ba73f7a514886163ac",
"verify_s2a": "0a1e24648ccb1432156fd946fc2c797a519cc461af798a7d7395f4a6363b8f6c",
"paid_series": "47dcd6b17e7e5e80caff6517234ed529d5bc6221efb140ec1c9b78652c81c018",
"verify_s2b": "5234b429ac310818d2e9163dcb977770670305fa6b4b90b6f07fb282f8de2764",
"verify_s3": "22800abeda3292013f95241121657e1a5129e71c4731e45c592a642db2ad5794",
"fresh_bindings": "8021bd1d2d8ac820a574a86c7148bc699514f63dc88f79abca47fcb043641434",
"verify_fresh_s1": "b6841f48bae307744e434df5bcdd58827acc8d3346f4b81822d07e8ef5ffc4df",
"verify_fresh_s2a": "b7b7d96b2db9faf45cad377cfb2228247714885bd08d0afe24646e914e1565d4",
"verify_fresh_s2b": "b693e93f6f3a17223e6f4fde890ad20abb525a25a97bc3d45b80c328ac2d3851",
"verify_fresh_s3": "e7ab78bce70ba47a0506fda1cb4791a3d7d282c8a57dc674ce1d5b6c63c565bd",
"verify_fresh_s4": "1be49dd54ed4885e15c577c159f5a0565ef78966774dca9edc71f9f7054e80db",
"verify_fresh_s5": "f6f58e84346f5e8b674dd60f94712684825a1404832e70704ab9bac23fac7f6d",
"main": "5f67e808cb4fd765f6809fe8ad06b2518dfd6c13db0c96fa5813330a85891d74"
},
"additional_controls": "s4/admission_controls.py",
"historical_controls": "s4/receipt_lifecycle_fixtures.py (explicit pinned r28 path)",
"six_check_only": [
"s1",
"s2a",
"s2b",
"s3",
"s4",
"s5"
],
"s4_check_only_admission": "same admission as native, before writing plan",
"root_sequence": [
"Freeze final Q/Qt",
"Affected pure controls",
"Clean exact-Q S1-S5 six check-only plans",
"Capacity and PID-end checks",
"One heavy lease: fresh S1,S2a,S2b,S3,S4 and all ten S5",
"Reader/adapters on actual raw",
"Fresh all 15 EV/approved subclauses",
"Full 184 once",
"Index",
"verify-only",
"Registered p04-acceptance before independent whole-unit Opus review",
"prepare/exact C/integration/final/Root DB join/ledger/main push"
],
"worker_prohibited": [
"Git writes",
"engine/native/full runs",
"Runner actions",
"other agents"
],
"old_artifacts": "Q46 historical only; no rewriting or adoption",
"native_pending": true
}
@@ -0,0 +1,18 @@
{
"provenance": "build/owner-handoff/p04-after-p26-closure-r01/q46-s4-admission-gap/actual-native/s4/execution.json",
"sha256": "c44550114d47a5332cefead105a039d437802e3e5eae709b9e62d03631dab2d6",
"verbatim_failure_fields": {
"passed": false,
"error": "AssertionError: complete 316-script parse roster",
"guard_errors": [
"AssertionError: exact source and planned UID set"
],
"phases": [],
"actual_captured_PIDs": [],
"cleanup": [],
"cleanup_errors": [],
"whole_goal_accepted": false,
"unit_accepted": false
},
"classification": "Q46 actual failure; not adopted; zero S4 native PIDs and no game verification"
}
@@ -0,0 +1,44 @@
{
"task_id": "P04-01",
"scope_ok": true,
"changed_paths": [
"docs/plans/original-completion-2026-10-02/execution/p04-01/CURRENT_STATUS.md",
"docs/plans/original-completion-2026-10-02/execution/p04-01/EVIDENCE_COLLECTION.md",
"docs/plans/original-completion-2026-10-02/execution/p04-01/ORDER_AUDIT.md",
"docs/plans/original-completion-2026-10-02/execution/p04-01/checker_series_fixtures.py",
"docs/plans/original-completion-2026-10-02/execution/p04-01/p04_native_series.py",
"docs/plans/original-completion-2026-10-02/execution/p04-01/s2b/S2B_ROOT_RUN.md",
"docs/plans/original-completion-2026-10-02/execution/p04-01/s3/S3_ROOT_RUN.md",
"docs/plans/original-completion-2026-10-02/execution/p04-01/s4/S4_ROOT_RUN.md",
"docs/plans/original-completion-2026-10-02/execution/p04-01/s4/receipt_lifecycle_fixtures.py",
"docs/plans/original-completion-2026-10-02/execution/p04-01/s4/run_s4_native.py",
"docs/plans/original-completion-2026-10-02/execution/p04-01/REPAIR47_PLAN.json",
"docs/plans/original-completion-2026-10-02/execution/p04-01/REPAIR47_Q46_FAILURE_REFERENCE.json",
"docs/plans/original-completion-2026-10-02/execution/p04-01/REPAIR47_STATUS.md",
"docs/plans/original-completion-2026-10-02/execution/p04-01/REPAIR47_VALIDATION.json",
"docs/plans/original-completion-2026-10-02/execution/p04-01/s4/admission_controls.py"
],
"immutable": [
{
"path": "tools/check_p04_order_evidence.py",
"unchanged": true,
"sha256": "3bb0cde776bc295f6f18e74f1e23bf3d832d8e4f71aed260601c82d287c655fd"
},
{
"path": "docs/spec/acceptance/P04-01.json",
"unchanged": true,
"sha256": "d28aadb044633f7d804de5a92c8d4c4a7438dfbf44c3243dca978951f4def25f"
},
{
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/s4/historical/run_s4_native_r28.py.reference",
"unchanged": true,
"sha256": "2d3be39d2b310abac058e27336ac816c234043a0a1dd7b2c52d84994907dd31b"
}
],
"compiled_sources_match_final_bytes": true,
"git_diff_check": true,
"engine_launches": 0,
"git_writes": 0,
"runner_actions": 0,
"whole_unit_accepted": false
}
@@ -0,0 +1,105 @@
# RUN47 submission — bounded S4 admission repair
P04-01 remains **unaccepted**. This is the same original 30/88 unit, formal credit
16, P04 credit 0. No completion, integration or native-success claim is made.
All edits are under the contracted execution directory. Product code, registered
spec, checker (including REQUIRED/REACH_REFS), denominator, caps and permissions
are unchanged. No Git writes, other agents, Runner actions or engine launches.
## Changes and count/roster audit
- `s4/run_s4_native.py`, former line 301: removed current 316-script admission.
`admission` compares the whole sorted source-derived `.gd` res:// list. It runs
before check-only writes its plan and again before native writes parse-paths.
Plans carry the exact list; missing/extra/duplicate/non-.gd/same-count changes fail.
- Former line 240: removed selected/product 1339/1338 assumptions. Cache admission
requires the exact current product map, with precisely the checker as its extra;
the real product/selection difference allows no other input. Existing hashes,
failed-cache rejection and no-adoption guards remain. Option B uses no cache.
- `p04_native_series.py`, former lines 73/187/1030: removed literal source counts;
retained whole source/manifest/input/source_after equalities and pin checks.
Result count comes from the actual manifest. FreshSeries S4 also calls the
admission function and compares plan and actual parse-paths.
- `s4/receipt_lifecycle_fixtures.py`, former lines 81/92: split historical-pinned
lifecycle from current-derived admission. It now explicitly loads the unchanged,
hash-pinned r28 wrapper, retaining historical 1338/316 synthetic fixtures. The
standard runner comes from the supplied retained M copy. Current cases live in
`s4/admission_controls.py`; another valid derived roster is accepted as well.
- Remaining 316 in current controls is only the deliberately stale negative and
the historical AST/receipt fixture. The current wrapper has none. The 329 pin
diagnoses this supplied M fixture only; production has no fixed roster size.
- Resolver's 1721 members/71488772 bytes are the immutable historical relocation
identity, already bound to the fixed manifest hash; retained. S4 phase-cut
121/132, eleven kernel phases, three slots, four engine phases and case roster
are scenario/receipt invariants rather than source counts; retained unchanged.
- `S4_ROOT_RUN.md` now distinguishes the current derived rules from historical
relocation/count descriptions. Its parse-path receipt row describes the new
admission. Earlier 1338/316 observations remain historical. S2b/S3 normative
fixed-product instructions are explicitly superseded. S1/S2 source-count
observations describe earlier runs, not current admission. ORDER_AUDIT,
EVIDENCE_COLLECTION, CURRENT_STATUS and REPAIR47_PLAN are synchronized.
- `checker_series_fixtures.py` uses BUILD for disposable fixtures. No test was
removed or disabled.
Before import is attempted (`phase is None`), cleanup requires the complete
original source inventory with no generated UID. After import is attempted, the
existing exact planned UID snapshot/seal still applies. Partial/unknown UID sets
and changed source fail in both branches. The original exception stays in `error`;
cleanup errors remain separate guards, and the pass predicate still requires a
sealed import, all four successful phases and owned PID cleanup. Engine identity,
fixed inputs, default-player protection, source checks and first-failure behavior
are preserved.
## Q46 failure, preserved verbatim
```json
{
"passed": false,
"error": "AssertionError: complete 316-script parse roster",
"guard_errors": ["AssertionError: exact source and planned UID set"],
"phases": [],
"actual_captured_PIDs": []
}
```
No S4 game verification ran. REPAIR47_Q46_FAILURE_REFERENCE.json records the raw
file hash and verbatim failure fields. The original raw and historical wrapper
were not modified. Q46 successes elsewhere are reference only, never adopted.
## Engine-free verification
REPAIR47_VALIDATION.json includes commands, exit codes, raw-log hashes and full
finite outputs. The final current admission program passed 34 controls: actual
329 scripts, another derived roster, checker-only selection extra, every required
roster rejection, actual check-only main admission and its six rejected mutations,
the real FreshSeries roster block, the real cache set guard, historical 316 via
pinned r28 AST, and pre-import/attempted-import UID/source rejection cases.
Its check-only unit explicitly stubs historical template and engine identity;
this is a synthetic control, not a fresh-Q provenance plan or native proof.
Affected series (62 controls), join (29 controls), and historical lifecycle (six
cases) passed. Historical lifecycle was finally confirmed against retained M.
Five changed Python files passed AST and compile checks; bytecode and scratch are
in allocated BUILD. Initial control-development failures (two absent contract
paths in the product-only M copy and one synthetic UID owner outside the existing
plan's allowed selection) are recorded, not treated as passes. Their fixture
references/owners were corrected; the final finite runs passed.
REPAIR47_PLAN.json records unchanged hashes against S46 for the eleven unaffected
pure programs, their prior Q46 results, and unchanged top-level series function
hashes. Those eleven programs were not rerun. This is reuse of unchanged pure
checks only, not adoption of native receipts. The affected series/join checks were
rerun. The checker file is byte-for-byte unchanged (SHA256
`3bb0cde776bc295f6f18e74f1e23bf3d832d8e4f71aed260601c82d287c655fd`).
The historical wrapper remains
`2d3be39d2b310abac058e27336ac816c234043a0a1dd7b2c52d84994907dd31b`.
Spec raw bytes remain unchanged; the existing one-final-LF dispatch identity
protocol yields the contracted `9ec722e7…` hash (REPAIR43_PRECHECK records it).
Formal six-series check-only plans were not run by this worker: they require
Root's clean final Q/provenance. No claim that W check-only passed, or failed only
because of dirtiness, is made. No native/full/registered acceptance test ran.
Root must follow the complete option-B sequence in REPAIR47_PLAN.json: freeze Q,
affected pure, six clean plans, capacity/PID checks, one fresh native batch,
readers/adapters, fresh all-15/EV/subclauses, full 184 once, index, verify-only,
registered p04-acceptance before independent Opus review, then normal integration.
@@ -0,0 +1,984 @@
{
"results": [
{
"name": "admission",
"argv": [
"/Applications/Xcode.app/Contents/Developer/usr/bin/python3",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/s4/admission_controls.py",
"--project-root",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/verified-m-engine-free-r45",
"--scratch",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair47-finite-validation-r01/admission"
],
"exit_code": 0,
"log": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair47-finite-validation-r01/admission.log",
"sha256": "93b3976b5a79fd3c046f07e0f8f0a336e046e77a5bc914e54a255a7461cba182",
"output": {
"passed": true,
"controls": [
{
"case": "real-329",
"result": "pass"
},
{
"case": "another-derived-roster",
"result": "pass"
},
{
"case": "missing",
"result": "rejected"
},
{
"case": "extra",
"result": "rejected"
},
{
"case": "same-count-substitution",
"result": "rejected"
},
{
"case": "duplicate",
"result": "rejected"
},
{
"case": "non-gd",
"result": "rejected"
},
{
"case": "stale-literal-count",
"result": "rejected"
},
{
"case": "checker-as-product",
"result": "rejected"
},
{
"case": "missing-product",
"result": "rejected"
},
{
"case": "extra-selected-input",
"result": "rejected"
},
{
"case": "real-check-only-shared-admission",
"result": "pass"
},
{
"case": "check-only-missing",
"result": "rejected"
},
{
"case": "check-only-extra",
"result": "rejected"
},
{
"case": "check-only-same-count-substitution",
"result": "rejected"
},
{
"case": "check-only-duplicate",
"result": "rejected"
},
{
"case": "check-only-non-gd",
"result": "rejected"
},
{
"case": "check-only-stale-literal-count",
"result": "rejected"
},
{
"case": "historical-316-receipt",
"result": "pass"
},
{
"case": "historical-rejects-current-roster",
"result": "rejected"
},
{
"case": "pre-import-original-no-uid",
"result": "pass"
},
{
"case": "pre-import-partial-import",
"result": "rejected"
},
{
"case": "attempted-import-partial-import",
"result": "rejected"
},
{
"case": "pre-import-unknown-uid",
"result": "rejected"
},
{
"case": "attempted-import-unknown-uid",
"result": "rejected"
},
{
"case": "pre-import-changed-source",
"result": "rejected"
},
{
"case": "attempted-import-changed-source",
"result": "rejected"
}
],
"source_files": 1368,
"product_files": 1368,
"scripts": 329,
"engine_launches": 0,
"formal_acceptance": false
}
},
{
"name": "series",
"argv": [
"/Applications/Xcode.app/Contents/Developer/usr/bin/python3",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/checker_series_fixtures.py",
"--build",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build"
],
"exit_code": 0,
"log": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair47-finite-validation-r01/series.log",
"sha256": "33d8711aa6481841088938f4c4b8fc492c71ead6e1419e9558419a329adcf73b",
"output": {
"formal_acceptance": false,
"results": [
{
"class": "fresh_roster_and_entrypoints",
"result": "pass",
"series": "fresh"
},
{
"class": "small_synthetic_positive",
"result": "pass",
"series": "shared"
},
{
"class": "full_body_positive",
"result": "pass",
"series": "s1"
},
{
"class": "wrong_source_pin",
"error": "SHA drift: native /native/body.gd",
"result": "rejected",
"series": "s1"
},
{
"class": "signature_only_pin",
"error": "full-function-body pin mismatch",
"result": "rejected",
"series": "s1"
},
{
"class": "symlink",
"error": "symlink: /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/.series-fixtures-u1xfy7kc/symlink.gd",
"result": "rejected",
"series": "s1"
},
{
"class": "traversal",
"error": "raw traversal",
"result": "rejected",
"series": "s1"
},
{
"class": "unmapped_original_path",
"error": "unmapped original path: /native/unknown.gd",
"result": "rejected",
"series": "s1"
},
{
"class": "relocated_manifest_native_mismatch",
"error": "byte length drift: native /native/body.gd",
"result": "rejected",
"series": "s1"
},
{
"class": "relocated_byte_manifest_mismatch",
"error": "SHA drift: relocation /native/body.gd",
"result": "rejected",
"series": "s1"
},
{
"class": "JSON_only_getter_substitute",
"error": "unsupported Variant flags 8827:25959 at 0",
"result": "rejected",
"series": "s1"
},
{
"class": "forged_scalar",
"error": "SHA drift: p04-s1-native-r02/raw/writer.json",
"result": "rejected",
"series": "s1"
},
{
"class": "changed_raw_byte",
"error": "SHA drift: p04-s1-native-r02/raw/writer.json",
"result": "rejected",
"series": "s1"
},
{
"class": "formal_member_SHA_drift",
"error": "SHA drift: p04-s1-native-r02/execution.json",
"result": "rejected",
"series": "s1"
},
{
"class": "unowned_missing_PID_end",
"error": "missing PID end",
"result": "rejected",
"series": "s1"
},
{
"class": "altered_phase_pair",
"error": "SHA drift: p04-s1-native-r02/raw/reader-landing-held.var",
"result": "rejected",
"series": "s1"
},
{
"class": "relabeled_interruption_reason",
"error": "SHA drift: p04-s1-native-r02/raw/writer-landing-depleted.json",
"result": "rejected",
"series": "s1"
},
{
"class": "full_body_positive",
"result": "pass",
"series": "s2a"
},
{
"class": "wrong_source_pin",
"error": "SHA drift: native /native/body.gd",
"result": "rejected",
"series": "s2a"
},
{
"class": "signature_only_pin",
"error": "full-function-body pin mismatch",
"result": "rejected",
"series": "s2a"
},
{
"class": "symlink",
"error": "symlink: /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/.series-fixtures-u1xfy7kc/symlink.gd",
"result": "rejected",
"series": "s2a"
},
{
"class": "traversal",
"error": "raw traversal",
"result": "rejected",
"series": "s2a"
},
{
"class": "unmapped_original_path",
"error": "unmapped original path: /native/unknown.gd",
"result": "rejected",
"series": "s2a"
},
{
"class": "relocated_manifest_native_mismatch",
"error": "byte length drift: native /native/body.gd",
"result": "rejected",
"series": "s2a"
},
{
"class": "relocated_byte_manifest_mismatch",
"error": "SHA drift: relocation /native/body.gd",
"result": "rejected",
"series": "s2a"
},
{
"class": "JSON_only_getter_substitute",
"error": "unsupported Variant flags 8827:25959 at 0",
"result": "rejected",
"series": "s2a"
},
{
"class": "forged_scalar",
"error": "SHA drift: p04-s2a-native-r03/raw/writer.json",
"result": "rejected",
"series": "s2a"
},
{
"class": "changed_raw_byte",
"error": "SHA drift: p04-s2a-native-r03/raw/writer.json",
"result": "rejected",
"series": "s2a"
},
{
"class": "formal_member_SHA_drift",
"error": "SHA drift: p04-s2a-native-r03/execution.json",
"result": "rejected",
"series": "s2a"
},
{
"class": "unowned_missing_PID_end",
"error": "missing PID end",
"result": "rejected",
"series": "s2a"
},
{
"class": "altered_phase_pair",
"error": "SHA drift: p04-s2a-native-r03/raw/reader-C3-recall.var",
"result": "rejected",
"series": "s2a"
},
{
"class": "relabeled_interruption_reason",
"error": "SHA drift: p04-s2a-native-r03/raw/writer-C1-midnight.json",
"result": "rejected",
"series": "s2a"
},
{
"class": "full_body_positive",
"result": "pass",
"series": "s2b"
},
{
"class": "wrong_source_pin",
"error": "SHA drift: native /native/body.gd",
"result": "rejected",
"series": "s2b"
},
{
"class": "signature_only_pin",
"error": "full-function-body pin mismatch",
"result": "rejected",
"series": "s2b"
},
{
"class": "symlink",
"error": "symlink: /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/.series-fixtures-u1xfy7kc/symlink.gd",
"result": "rejected",
"series": "s2b"
},
{
"class": "traversal",
"error": "raw traversal",
"result": "rejected",
"series": "s2b"
},
{
"class": "unmapped_original_path",
"error": "unmapped original path: /native/unknown.gd",
"result": "rejected",
"series": "s2b"
},
{
"class": "relocated_manifest_native_mismatch",
"error": "byte length drift: native /native/body.gd",
"result": "rejected",
"series": "s2b"
},
{
"class": "relocated_byte_manifest_mismatch",
"error": "SHA drift: relocation /native/body.gd",
"result": "rejected",
"series": "s2b"
},
{
"class": "JSON_only_getter_substitute",
"error": "unsupported Variant flags 8827:25959 at 0",
"result": "rejected",
"series": "s2b"
},
{
"class": "forged_scalar",
"error": "SHA drift: p04-s2b-native-r02/raw/writer.json",
"result": "rejected",
"series": "s2b"
},
{
"class": "changed_raw_byte",
"error": "SHA drift: p04-s2b-native-r02/raw/writer.json",
"result": "rejected",
"series": "s2b"
},
{
"class": "formal_member_SHA_drift",
"error": "SHA drift: p04-s2b-native-r02/execution.json",
"result": "rejected",
"series": "s2b"
},
{
"class": "unowned_missing_PID_end",
"error": "missing PID end",
"result": "rejected",
"series": "s2b"
},
{
"class": "altered_phase_pair",
"error": "SHA drift: p04-s2b-native-r02/raw/reader-night_absent-1080-before-facility.var",
"result": "rejected",
"series": "s2b"
},
{
"class": "relabeled_interruption_reason",
"error": "SHA drift: p04-s2b-native-r02/raw/writer-night_absent-1081.json",
"result": "rejected",
"series": "s2b"
},
{
"class": "full_body_positive",
"result": "pass",
"series": "s3"
},
{
"class": "wrong_source_pin",
"error": "SHA drift: native /native/body.gd",
"result": "rejected",
"series": "s3"
},
{
"class": "signature_only_pin",
"error": "full-function-body pin mismatch",
"result": "rejected",
"series": "s3"
},
{
"class": "symlink",
"error": "symlink: /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/.series-fixtures-u1xfy7kc/symlink.gd",
"result": "rejected",
"series": "s3"
},
{
"class": "traversal",
"error": "raw traversal",
"result": "rejected",
"series": "s3"
},
{
"class": "unmapped_original_path",
"error": "unmapped original path: /native/unknown.gd",
"result": "rejected",
"series": "s3"
},
{
"class": "relocated_manifest_native_mismatch",
"error": "byte length drift: native /native/body.gd",
"result": "rejected",
"series": "s3"
},
{
"class": "relocated_byte_manifest_mismatch",
"error": "SHA drift: relocation /native/body.gd",
"result": "rejected",
"series": "s3"
},
{
"class": "JSON_only_getter_substitute",
"error": "unsupported Variant flags 8827:25959 at 0",
"result": "rejected",
"series": "s3"
},
{
"class": "forged_scalar",
"error": "SHA drift: p04-s3-native-r01/raw/writer.json",
"result": "rejected",
"series": "s3"
},
{
"class": "changed_raw_byte",
"error": "SHA drift: p04-s3-native-r01/raw/writer.json",
"result": "rejected",
"series": "s3"
},
{
"class": "formal_member_SHA_drift",
"error": "SHA drift: p04-s3-native-r01/execution.json",
"result": "rejected",
"series": "s3"
},
{
"class": "unowned_missing_PID_end",
"error": "missing PID end",
"result": "rejected",
"series": "s3"
},
{
"class": "altered_phase_pair",
"error": "SHA drift: p04-s3-native-r01/raw/reader-B1-phase-960-TIME_BOUNDARIES.var",
"result": "rejected",
"series": "s3"
},
{
"class": "relabeled_interruption_reason",
"error": "SHA drift: p04-s3-native-r01/raw/writer-B1-after.json",
"result": "rejected",
"series": "s3"
}
],
"scope": "file-only Stage R controls; immutable descriptor and primitive negatives"
}
},
{
"name": "join",
"argv": [
"/Applications/Xcode.app/Contents/Developer/usr/bin/python3",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/checker_join_fixtures.py",
"--build",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build"
],
"exit_code": 0,
"log": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair47-finite-validation-r01/join.log",
"sha256": "6cc0a89527b5e8192f11c0d3d503536aab1ea03db08d2af4f440dd0da9525dc8",
"output": {
"scope": "semantic controls only; no new native execution",
"results": [
{
"case": "B1_cannot_supply_power_stop",
"result": "rejected",
"error": "power_stop requires S4; B1 is dependency/closure diagnostic only"
},
{
"case": "B1_real_despawn_positive",
"result": "accepted"
},
{
"case": "dependency_reason_relabelled_as_NO_POWER",
"result": "rejected",
"error": "B1 power Runtime facility/service join"
},
{
"case": "B1_missing_at_closure",
"result": "rejected",
"error": "B1 real B before/at closure"
},
{
"case": "B1_synthetic_later_guest",
"result": "rejected",
"error": "B1 normal despawn after departure"
},
{
"case": "B1_wrong_release_minute",
"result": "rejected",
"error": "B1 immutable reservation join"
},
{
"case": "B1_changed_wallet",
"result": "rejected",
"error": "B1 B wallet/no economy charge"
},
{
"case": "B1_missing_departure_history",
"result": "rejected",
"error": "B1 persisted departure join"
},
{
"case": "R2_real_first_1080_positive",
"result": "accepted"
},
{
"case": "R2_paid_midnight_substitution",
"result": "rejected",
"error": "shift raw service join"
},
{
"case": "R2_wrong_transaction",
"result": "rejected",
"error": "native receipt transaction"
},
{
"case": "R2_missing_DAY2",
"result": "rejected",
"error": "shift DAY2 before/after handover"
},
{
"case": "R2_after_staff_still_present",
"result": "rejected",
"error": "shift DAY2 before/after handover"
},
{
"case": "R2_next_extra_receipt",
"result": "rejected",
"error": "native duplicate/empty receipt"
},
{
"case": "R2_dynamic_PID_and_transaction_positive",
"result": "accepted"
},
{
"case": "R2_wrong_PID_join",
"result": "rejected",
"error": "native PID chain"
},
{
"case": "S1_pre_travel_mismatch",
"result": "rejected",
"error": "S1 pre-travel staff cell/task/raw reservation join"
},
{
"case": "S1_no_actual_outage",
"result": "rejected",
"error": "S1 actual reserve exhaustion/tick"
},
{
"case": "historical_receipt_checked_against_current_wrapper",
"result": "rejected",
"error": "S4 historical pin in fresh receipt"
},
{
"case": "current_wrapper_used_as_historical_receipt",
"result": "rejected",
"error": "S4 historical receipt wrapper pin"
},
{
"case": "fresh_receipt_carrying_historical_pin",
"result": "rejected",
"error": "S4 historical pin in fresh receipt"
},
{
"case": "tampered_historical_pinned_copy",
"result": "rejected",
"error": "S4 tampered historical wrapper pin"
},
{
"case": "S4_real_NO_POWER_positive",
"result": "accepted"
},
{
"case": "S4_related_facility_operating_false",
"result": "rejected",
"error": "S4 related facility must remain operating/powered"
},
{
"case": "S4_kitchen_unpowered",
"result": "rejected",
"error": "S4 related facility must remain operating/powered"
},
{
"case": "S4_closure_confound",
"result": "rejected",
"error": "S4 closure/damage/shift confound"
},
{
"case": "S4_no_actual_outage",
"result": "rejected",
"error": "S4 actual NO_POWER path, not relabelled dependency"
},
{
"case": "S4_wrong_transaction_join",
"result": "rejected",
"error": "S4 transaction/service join"
},
{
"case": "S4_dynamic_service_and_sale_positive",
"result": "accepted"
}
]
}
},
{
"name": "historical-lifecycle",
"argv": [
"/Applications/Xcode.app/Contents/Developer/usr/bin/python3",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/s4/receipt_lifecycle_fixtures.py"
],
"exit_code": 0,
"log": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair47-finite-validation-r01/historical-lifecycle.log",
"sha256": "e2bc93824d2152de4aac320d5fbf0fd7497c09cb07d61c630abc299d15d785cb",
"output": {
"results": [
{
"case": "success",
"passed": true,
"native_engine_launches": 0
},
{
"case": "parse",
"passed": true,
"native_engine_launches": 0
},
{
"case": "cleanup",
"passed": true,
"native_engine_launches": 0
},
{
"case": "setup",
"passed": true,
"native_engine_launches": 0
},
{
"case": "output",
"passed": true,
"native_engine_launches": 0
},
{
"case": "identity-write",
"passed": true,
"native_engine_launches": 0
}
],
"formal_acceptance": false
}
},
{
"name": "final-admission",
"argv": [
"/Applications/Xcode.app/Contents/Developer/usr/bin/python3",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/s4/admission_controls.py",
"--project-root",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/verified-m-engine-free-r45",
"--scratch",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair47-finite-validation-r02/admission"
],
"exit_code": 0,
"log": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair47-finite-validation-r02/admission.log",
"sha256": "1644a127dd89fc318e348dddc43e347b10e88e36b202328a6292b8d76ea66865",
"output": {
"passed": true,
"controls": [
{
"case": "real-329",
"result": "pass"
},
{
"case": "selected-checker-only-extra",
"result": "pass"
},
{
"case": "another-derived-roster",
"result": "pass"
},
{
"case": "missing",
"result": "rejected"
},
{
"case": "extra",
"result": "rejected"
},
{
"case": "same-count-substitution",
"result": "rejected"
},
{
"case": "duplicate",
"result": "rejected"
},
{
"case": "non-gd",
"result": "rejected"
},
{
"case": "stale-literal-count",
"result": "rejected"
},
{
"case": "checker-as-product",
"result": "rejected"
},
{
"case": "missing-product",
"result": "rejected"
},
{
"case": "extra-selected-input",
"result": "rejected"
},
{
"case": "real-check-only-shared-admission",
"result": "pass"
},
{
"case": "check-only-missing",
"result": "rejected"
},
{
"case": "check-only-extra",
"result": "rejected"
},
{
"case": "check-only-same-count-substitution",
"result": "rejected"
},
{
"case": "check-only-duplicate",
"result": "rejected"
},
{
"case": "check-only-non-gd",
"result": "rejected"
},
{
"case": "check-only-stale-literal-count",
"result": "rejected"
},
{
"case": "FreshSeries-exact-roster",
"result": "pass"
},
{
"case": "FreshSeries-actual-substitution",
"result": "rejected"
},
{
"case": "FreshSeries-plan-substitution",
"result": "rejected"
},
{
"case": "cache-exact-product-plus-checker",
"result": "pass"
},
{
"case": "cache-missing-checker",
"result": "rejected"
},
{
"case": "cache-same-count-substitution",
"result": "rejected"
},
{
"case": "historical-316-receipt",
"result": "pass"
},
{
"case": "historical-rejects-current-roster",
"result": "rejected"
},
{
"case": "pre-import-original-no-uid",
"result": "pass"
},
{
"case": "pre-import-partial-import",
"result": "rejected"
},
{
"case": "attempted-import-partial-import",
"result": "rejected"
},
{
"case": "pre-import-unknown-uid",
"result": "rejected"
},
{
"case": "attempted-import-unknown-uid",
"result": "rejected"
},
{
"case": "pre-import-changed-source",
"result": "rejected"
},
{
"case": "attempted-import-changed-source",
"result": "rejected"
}
],
"source_files": 1368,
"product_files": 1368,
"scripts": 329,
"engine_launches": 0,
"formal_acceptance": false
}
},
{
"name": "final-historical-lifecycle-retained-M",
"argv": [
"/Applications/Xcode.app/Contents/Developer/usr/bin/python3",
"-B",
"/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/s4/receipt_lifecycle_fixtures.py"
],
"exit_code": 0,
"log": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/repair47-finite-validation-r03/historical-lifecycle.log",
"sha256": "e2bc93824d2152de4aac320d5fbf0fd7497c09cb07d61c630abc299d15d785cb",
"output": {
"results": [
{
"case": "success",
"passed": true,
"native_engine_launches": 0
},
{
"case": "parse",
"passed": true,
"native_engine_launches": 0
},
{
"case": "cleanup",
"passed": true,
"native_engine_launches": 0
},
{
"case": "setup",
"passed": true,
"native_engine_launches": 0
},
{
"case": "output",
"passed": true,
"native_engine_launches": 0
},
{
"case": "identity-write",
"passed": true,
"native_engine_launches": 0
}
],
"formal_acceptance": false
}
}
],
"compile": [
{
"path": "p04_native_series.py",
"sha256": "4d8fd60f209a6827eadfa2bf036deee8bf88aa0dbaa89f366e71b8ae46adf594",
"ast": true,
"compile": true
},
{
"path": "checker_series_fixtures.py",
"sha256": "5779b05505d6c7118f40cff3b8c309211142603d04c69183c3e68e88efaee4a9",
"ast": true,
"compile": true
},
{
"path": "s4/run_s4_native.py",
"sha256": "628a7aa8108a6b41a2ddc9139cbca21bec8723f0ce9829df67b8bb52f6a38203",
"ast": true,
"compile": true
},
{
"path": "s4/receipt_lifecycle_fixtures.py",
"sha256": "3c0331c190874ed602ef845eff62c2bf52a8178542067e5d104d3a7d8aa61b88",
"ast": true,
"compile": true
},
{
"path": "s4/admission_controls.py",
"sha256": "96b3545d741c0495eb20b2a4786c9ce67ce5721229535dc2dae3214bf27b6b76",
"ast": true,
"compile": true
}
],
"native_launches": 0,
"formal_acceptance": false,
"development_control_failures": [
{
"scratch": "repair47-admission-controls-r01",
"error": "ValueError: missing exact input: retained M tools/completion_marker_contracts.json"
},
{
"scratch": "repair47-admission-controls-r02",
"error": "ValueError: missing exact input: retained M docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json"
},
{
"scratch": "repair47-admission-controls-r03",
"error": "AssertionError: len(plan) >= 2; synthetic owner paths outside existing UID-plan selection"
}
],
"formal_six_check_only": "not run by worker: exact clean final Q and provenance are Root responsibility; synthetic S4 main control is explicitly stubbed, not a fresh-Q plan",
"retained_M": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/build/owner-handoff/p04-after-p26-closure-r01/verified-m-engine-free-r45",
"unchanged_proof_reuse": "REPAIR47_PLAN.json: 11 program hashes and unchanged top-level series function hashes; no native evidence adoption"
}
@@ -0,0 +1,14 @@
Traceback (most recent call last):
File "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/build_p04_index.py", line 159, in <module>
main()
File "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/build_p04_index.py", line 141, in main
index = payload(args.build, gate)
^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/build_p04_index.py", line 37, in payload
raw = gate.combine_native_series(build, c)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/tools/check_p04_order_evidence.py", line 1150, in combine_native_series
require({k: v for k, v in recorded.items() if k != 'verifier_sha256'} == actual, 'fresh raw recomputation drift')
File "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/tools/check_p04_order_evidence.py", line 97, in require
raise ValueError(message)
ValueError: fresh raw recomputation drift
@@ -0,0 +1,53 @@
{
"S": "2cd734062a2226b5006bbecf96e6024a26982665",
"checker_sha256": "3bb0cde776bc295f6f18e74f1e23bf3d832d8e4f71aed260601c82d287c655fd",
"actual_function": "supplied_file",
"source_call_site": "build_p04_index.payload lines 50-55 calls descriptor of actual runner fixed paths then supplied_file on all those paths",
"scope": "narrow pure actual material admission only; NOT complete checker/index or engine execution",
"rows": [
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/audit-support/p04-fresh-context-r47/docs/plans/original-completion-2026-10-02/execution/p04-01/s4/p04_s4_power_probe.gd",
"admitted": false,
"error": "unsupplied external material: /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/audit-support/p04-fresh-context-r47/docs/plans/original-completion-2026-10-02/execution/p04-01/s4/p04_s4_power_probe.gd"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/audit-support/p04-fresh-context-r47/docs/plans/original-completion-2026-10-02/execution/p04-01/s4/run_s4_native.py",
"admitted": false,
"error": "unsupplied external material: /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/audit-support/p04-fresh-context-r47/docs/plans/original-completion-2026-10-02/execution/p04-01/s4/run_s4_native.py"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/audit-support/p04-fresh-context-r47/docs/plans/original-completion-2026-10-02/execution/p04-01/s4/S4_ROOT_RUN.md",
"admitted": false,
"error": "unsupplied external material: /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/audit-support/p04-fresh-context-r47/docs/plans/original-completion-2026-10-02/execution/p04-01/s4/S4_ROOT_RUN.md"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-root-q-r47-2cd73406/tests/transport/test_runtime_transport.gd",
"admitted": false,
"error": "unsupplied external material: /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-root-q-r47-2cd73406/tests/transport/test_runtime_transport.gd"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-root-q-r47-2cd73406/tests/staff/test_rescue_elevator.gd",
"admitted": false,
"error": "unsupplied external material: /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-root-q-r47-2cd73406/tests/staff/test_rescue_elevator.gd"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-root-q-r47-2cd73406/docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json",
"admitted": false,
"error": "unsupplied external material: /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-root-q-r47-2cd73406/docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/audit-support/p04-fresh-context-r47/docs/plans/original-completion-2026-10-02/execution/p04-01/s5/run_s5_native.py",
"admitted": false,
"error": "unsupplied external material: /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/audit-support/p04-fresh-context-r47/docs/plans/original-completion-2026-10-02/execution/p04-01/s5/run_s5_native.py"
},
{
"path": "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/audit-support/p04-fresh-context-r47/docs/plans/original-completion-2026-10-02/execution/p04-01/s4/p04_s4_power_probe.gd",
"admitted": false,
"error": "unsupplied external material: /Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build/audit-support/p04-fresh-context-r47/docs/plans/original-completion-2026-10-02/execution/p04-01/s4/p04_s4_power_probe.gd"
}
],
"rejected": 8,
"full184_status": "still running; retain without restarting",
"formal_acceptance": false,
"at_unix_ns": 1792318056557763000
}
@@ -0,0 +1,88 @@
{
"task_id": "P04-01",
"kind": "static inspection only; no tests executed",
"syntax": [
"build_p04_index.py",
"p04_native_series.py",
"full_suite_verifier.py",
"collect_p04_native.py",
"s5/s5_order_adapter.py",
"s5/s5_power_adapter.py",
"repair48_transport_controls.py",
"repair48_identity_controls.py"
],
"source_sha256": {
"build_p04_index.py": "35b1b35f94e64f0f8c93ad5de17b35a16c2a81ca802691ba77251ad4256ca515",
"p04_native_series.py": "c33f8abb7f4ad143f75a1b761447a84afddb2dd0ac67b782e4cf9a8a67b67e4a",
"full_suite_verifier.py": "779ab0c0b5be31dcee462f04cbd6b765d44f9bef95fb52b03d3b676ec9f80c9c",
"collect_p04_native.py": "70a12149c770ef4dca97d3d5aa0b59270cf1547efde79ee7346ba340e1bebca6",
"s5/s5_order_adapter.py": "91344410b3441049fbce316cef9c227c9355747ae56890b45fcf348dac401d7e",
"s5/s5_power_adapter.py": "41d33e8d6b4e986611bdf7a0eedbde3f0b92f724ea37d3b2502ba4965a298462",
"repair48_transport_controls.py": "b2df097bc20bde89a7a738d4c1fe855bfa0bd1ac82a12936aa2b106980685628",
"repair48_identity_controls.py": "1c4f81e13715a2ab4b73b633265d3279772a3a8a90115e78098f0ecbd895d9ef"
},
"engine_runs": 0,
"git_writes": 0,
"runner_actions": 0,
"immutable": [
{
"path": "tools/check_p04_order_evidence.py",
"sha256": "3bb0cde776bc295f6f18e74f1e23bf3d832d8e4f71aed260601c82d287c655fd",
"matches_repair47_record": true
},
{
"path": "docs/spec/acceptance/P04-01.json",
"sha256": "d28aadb044633f7d804de5a92c8d4c4a7438dfbf44c3243dca978951f4def25f",
"matches_repair47_record": true
},
{
"path": "docs/plans/original-completion-2026-10-02/execution/p04-01/s4/historical/run_s4_native_r28.py.reference",
"sha256": "2d3be39d2b310abac058e27336ac816c234043a0a1dd7b2c52d84994907dd31b",
"matches_repair47_record": true
}
],
"historical_failure_copies": [
{
"name": "ROOT_Q47_ACTUAL_INDEX_GENERATION.log",
"byte_identical": true,
"sha256": "0250e523aeeecde5d81d298e30cd7e4e18a5415ac4e762401697256be6d514f9"
},
{
"name": "ROOT_Q47_ACTUAL_MATERIAL_ADMISSION_FAILURE.json",
"byte_identical": true,
"sha256": "a86b93150c33620854938c040f57db49e5627171f8f0633b399c527b7c08ec55"
}
],
"status": "blocked",
"specification_version_gap": {
"contract_sha256": "9ec722e7dfb0bee178d291624a026420c08412574e238bba1fde012c7a6f7881",
"actual_sha256": "d28aadb044633f7d804de5a92c8d4c4a7438dfbf44c3243dca978951f4def25f",
"specification_modified": false
},
"tests_executed": [],
"historical_test_results_reused": [],
"changed_source_files": [
"build_p04_index.py",
"p04_native_series.py",
"full_suite_verifier.py",
"collect_p04_native.py",
"s5/s5_order_adapter.py",
"s5/s5_power_adapter.py",
"repair48_transport_controls.py",
"repair48_identity_controls.py"
],
"changed_documentation": [
"REPAIR48_STATUS.md",
"REPAIR48_STATIC_INSPECTION.json",
"REPAIR48_HISTORICAL_ROOT_Q47_ACTUAL_INDEX_GENERATION.log",
"REPAIR48_HISTORICAL_ROOT_Q47_ACTUAL_MATERIAL_ADMISSION_FAILURE.json",
"ORDER_AUDIT.md",
"CURRENT_STATUS.md",
"s1/S1_ROOT_RUN.md",
"s2/S2_ROOT_RUN.md",
"s2b/S2B_ROOT_RUN.md",
"s3/S3_ROOT_RUN.md",
"s4/S4_ROOT_RUN.md",
"s5/S5_ROOT_RUN.md"
]
}
@@ -0,0 +1,160 @@
## REPAIR49 current correction
Source-ready only; original 30/88, formal 16, P04=0, no partial credit.
REPAIR48's specification-mismatch blocker below is historical and corrected:
the immutable 7000-byte original has SHA256
d28aadb044633f7d804de5a92c8d4c4a7438dfbf44c3243dca978951f4def25f;
removing its single EOF LF gives
9ec722e7dfb0bee178d291624a026420c08412574e238bba1fde012c7a6f7881.
This is the existing Git/Runner strip/checker one-EOF-LF pin contract.
No specification, approval or normalization change. Older contradictory wording
below is superseded history, including blanket full-reuse prohibitions and
all-controls-unexecuted wording. Q47 admission/index failures remain failures.
See REPAIR49_STATUS.md for closure audit and verbatim complete_B FileNotFoundError.
Root handoff reports payload(B), all53, series/join/power PASS; order-typed remains
UNDETERMINED. Worker did not rerun them. Corrected complete_B remains unexecuted.
Old native/full successes confer no new-S acceptance or credit.
# REPAIR48 implementation status
BLOCKED on exact specification-version context; source changes are retained for
review. No acceptance or new credit is claimed.
Original scope remains 30/88; formal credit is 16; P04 credit is 0.
Engine runs, Git writes, Runner actions and delegation are prohibited.
The supplied task contract declares spec_sha256
`9ec722e7dfb0bee178d291624a026420c08412574e238bba1fde012c7a6f7881`.
The actual immutable docs/spec/acceptance/P04-01.json hashes to
`d28aadb044633f7d804de5a92c8d4c4a7438dfbf44c3243dca978951f4def25f`.
That local hash agrees with REPAIR47_STATIC_CHECKS.json. This worker has not
changed the specification or selected a replacement authority. Root must resolve
which exact specification bytes govern the retained repair before gate use.
This is an exact-version context gap, not a proposed acceptance change.
## Current changes
`build_p04_index.py` separates exclusive generation (`relocate_materials`) from
read-only `payload`. The exact output is resolved B/p04-evidence, with no existing
output, traversal or parent symlinks. Fixed pins plus QA are checked for exact
duplicates and conflicting identities, including across series. Copies are
content-addressed under the first referencing series, created exclusively, and
rehashed. Exact (original path, bytes, SHA) identities share one copy across all
series; different original paths are never silently merged. RELOCATION.json
keeps original pin paths as keys. Raw inputs are never rewritten. Every payload
call checks map membership, declared relative form, hashes, unmapped files and
exactly one wrapper candidate. Materials and wrapper descriptors are relative;
the relocation-map SHA is included in the index. The obsolete absolute material
admission pre-check is removed. Main relocates, derives, checks refs and roles,
then writes index and the separate invocation receipt. Failure leaves a failed
output attempt without a usable index; an existing output cannot be resumed.
S5 dependency identity uses the package-relative power, series and guard module
paths. Each module is read once and those same bytes are compiled and executed,
without cached bytecode. Symlinks, outside dependencies and mismatched mappings
are rejected. The roster is checked against the modules loaded. Dependency maps
are checked against the executed roster before deriving facts. Absolute observed
paths and checkout are retained in collection/dependency-invocation.json, outside
the compared s5.json and the collection manifest's series mapping. The adapter's
own observed path and executed-byte SHA are also retained there.
## Static path audit
| Value | Result and required context |
| --- | --- |
| fixed pins and QA | Source placement is free-form. Generation reads original pinned paths; verification admits relocated relative copies under B/p04-evidence. |
| wrapper | Exactly one distinct original pin path must match wrapper_sha256; descriptor uses that relocated copy. |
| runner-input row | Absolute path is constructed from the current B and the registered series run. supplied_file admits each registered run root. No earlier Root B is embedded by the builder. |
| C references | Constructed under current B/audit-support/native-first-current, one of supplied_file's fixed roots. |
| native_bundle | Same fixed native-first-current root under the supplied B. |
| authorities | ROOT-relative source paths, resolved against the invocation's gate.ROOT. |
| native and full raw references | Relative to each retained run/B, with original provenance retained. No analysis checkout is used as a payload identity. |
| S1–S4 / verify_fresh_* | Shared implementations in p04_native_series.py; no separate checkout-keyed dependency maps. Current metadata modules are found via __file__; that path is not returned as a fresh fact. Fresh wrapper loading now executes source bytes directly. |
| S5 adapters | Checkout-keyed dependency map corrected. Raw hash keys refer to the immutable raw input, not the analysis checkout. Explicit raw root is resolved before writer/reader references are formed. |
| readers | Independent Reader data is validated from raw run-relative references and recorded original provenance. bulk_reader_equivalence.py is a fixture using explicit scratch checkouts, not a production payload producer. |
| full_suite_verifier | Explicit Q root and retained run are inputs. Its reference map uses run-relative names. Metadata module loading now executes source bytes directly. |
| scratch_fixture_adapter | Explicit scratch routing only; no production compared payload. |
Transport does not make the entire B portable by itself. FreshSeries still
requires original Q source paths/project_root, the retained stage/formal copies,
and the exact engine file for identity reads (no engine launch). full-suite
verification also reads its recorded actual Q. If a later invocation changes B,
the registry/run hierarchy and these original-source contexts must still be
supplied. Missing context is a blocker; do not rewrite raw pins or the checker
to conceal it. Static supplied_file inspection found no additional absolute
descriptor admission gap in the builder's rows above. Runtime admission has
not been claimed.
## Historical failures and successes
The Q47 material admission failure is preserved verbatim in
REPAIR48_HISTORICAL_ROOT_Q47_ACTUAL_MATERIAL_ADMISSION_FAILURE.json.
All eight recorded attempts failed with their original `unsupplied external
material: ...` messages. The index generation traceback is preserved verbatim
in REPAIR48_HISTORICAL_ROOT_Q47_ACTUAL_INDEX_GENERATION.log, ending:
```text
ValueError: fresh raw recomputation drift
```
These are failures, not passing receipts. Original raw and historical receipts
remain unchanged. Their retained source is
build/owner-handoff/p04-after-p26-closure-r01/repair48-final-index-transport.
Root actually staged the S47 context under p04-fresh-context-r47, deviating from
the fixed p04-fresh-context name in the pre-REPAIR48 S5_ROOT_RUN.md line 167.
The old direction is retained as history. Material placement is now free-form
for builder relocation; no historical receipt is renamed or adopted.
Q47 native successes and the historical full 184 result (21903 checks, zero
reported failures, 329 parse paths, 186 ended PIDs, no guard/cleanup failures)
remain historical only. They are not C and cannot be reused under the new S.
The immutable checker still binds M/S/Q_tree; no adopter is introduced.
## Verification handoff
The worker performed syntax parsing and static source/path inspection only.
Per the final worker instruction that tests are formally executed by Runner,
no pure control, check-only plan, registered checker or engine was executed.
No result is inferred from a historical test count. No unaffected pure result
is reused without a complete code/dependency SHA proof; none is claimed here.
Runner controls added:
- repair48_transport_controls.py --retained <retained repair48-final-index-transport>
checks the real immutable S47 inputs/copies, r47 context and out-of-B Q pins,
relocation repeatability, duplicate/conflict rules, material adversaries,
wrapper failures, and the actual checker's old-S/new-S binding rejection
using simulated Git observations without Git writes.
- repair48_identity_controls.py --raw <retained S5 raw> --writer-sha <pin>
--reader-sha <pin> --build <complete retained relocated B> checks independent
same-byte complete analysis directories (S5 results and builder payload),
dependency mutations and mappings, symlinks,
outside paths, two read-only payload calls and unchanged B tree, index drift,
and external absolute descriptor rejection. The optional B section must be
supplied for the complete control, not omitted as an implicit pass.
All these controls remain UNEXECUTED. Required affected existing controls and
fresh check-only S1/S2a/S2b/S3/S4/S5 plans also remain Runner work. A dirty-only
failure has not been observed and is not invented. Source-ready is not a gate
pass. Runner must verify full negative coverage, including exclusive output,
pin-SHA mismatch and ambiguous wrapper bindings, before the native lease.
## Normal-gate material roster and Root order
Supply the exact B with native-first-current, historical relocation inputs,
fresh-run registry, every fresh run's runner-input/ended/source/UID/formal/raw
and lifecycle receipts, the exact recorded Q source and engine identity context;
B/p04-evidence/runner-materials with all pin copies and RELOCATION.json;
the matching fresh collection including MANIFEST and separate dependency
invocation record; and the matching full 184 run and its binding/raw receipts.
The final index and generation-invocation receipt belong to this same attempt.
Required original authorities and sources must exist in the frozen checkout.
Root's next order is unchanged: freeze new Q; affected pure controls; clean
exact-Q check-only; capacity/PID-end checks; one heavy native lease for
S1/S2a/S2b/S3/S4 and all ten S5 cases; readers/adapters; collect 15 EV and all
subclauses; full 184 once; index generation with relocation; registered
p04-acceptance once (no duplicate Root --verify-only); separate Opus whole-unit
review; normal prepare/C/integration/final/Root DB join/ledger/main push.
Only whole-unit acceptance can grant credit.
@@ -0,0 +1,41 @@
{
"before": {
"build_p04_index.py": "35b1b35f94e64f0f8c93ad5de17b35a16c2a81ca802691ba77251ad4256ca515",
"p04_native_series.py": "c33f8abb7f4ad143f75a1b761447a84afddb2dd0ac67b782e4cf9a8a67b67e4a",
"full_suite_verifier.py": "779ab0c0b5be31dcee462f04cbd6b765d44f9bef95fb52b03d3b676ec9f80c9c",
"collect_p04_native.py": "70a12149c770ef4dca97d3d5aa0b59270cf1547efde79ee7346ba340e1bebca6",
"s5/s5_order_adapter.py": "91344410b3441049fbce316cef9c227c9355747ae56890b45fcf348dac401d7e",
"s5/s5_power_adapter.py": "41d33e8d6b4e986611bdf7a0eedbde3f0b92f724ea37d3b2502ba4965a298462",
"s5/s5_guard_oracle.py": "b58ee46f5c8a82de796bffd88ff8cab89f1f9e7e5c9417414310a1b649dc6c1c",
"s5/s5_order_adapter_controls.py": "f1f90b9847830c6505a176bf78442e619b1d297c818ec561c92c498a4db74b53",
"s5/s5_power_adapter_controls.py": "32d71db80994052b905829e6a2da38448ae789825c44570a901e67fe2d07fd33"
},
"root_expected": {
"build_p04_index.py": "35b1b35f94e64f0f8c93ad5de17b35a16c2a81ca802691ba77251ad4256ca515",
"p04_native_series.py": "c33f8abb7f4ad143f75a1b761447a84afddb2dd0ac67b782e4cf9a8a67b67e4a",
"full_suite_verifier.py": "779ab0c0b5be31dcee462f04cbd6b765d44f9bef95fb52b03d3b676ec9f80c9c",
"collect_p04_native.py": "70a12149c770ef4dca97d3d5aa0b59270cf1547efde79ee7346ba340e1bebca6",
"s5/s5_order_adapter.py": "91344410b3441049fbce316cef9c227c9355747ae56890b45fcf348dac401d7e",
"s5/s5_power_adapter.py": "41d33e8d6b4e986611bdf7a0eedbde3f0b92f724ea37d3b2502ba4965a298462",
"s5/s5_guard_oracle.py": "b58ee46f5c8a82de796bffd88ff8cab89f1f9e7e5c9417414310a1b649dc6c1c",
"s5/s5_order_adapter_controls.py": "f1f90b9847830c6505a176bf78442e619b1d297c818ec561c92c498a4db74b53",
"s5/s5_power_adapter_controls.py": "32d71db80994052b905829e6a2da38448ae789825c44570a901e67fe2d07fd33"
},
"after": {
"build_p04_index.py": "35b1b35f94e64f0f8c93ad5de17b35a16c2a81ca802691ba77251ad4256ca515",
"p04_native_series.py": "c33f8abb7f4ad143f75a1b761447a84afddb2dd0ac67b782e4cf9a8a67b67e4a",
"full_suite_verifier.py": "779ab0c0b5be31dcee462f04cbd6b765d44f9bef95fb52b03d3b676ec9f80c9c",
"collect_p04_native.py": "70a12149c770ef4dca97d3d5aa0b59270cf1547efde79ee7346ba340e1bebca6",
"s5/s5_order_adapter.py": "91344410b3441049fbce316cef9c227c9355747ae56890b45fcf348dac401d7e",
"s5/s5_power_adapter.py": "41d33e8d6b4e986611bdf7a0eedbde3f0b92f724ea37d3b2502ba4965a298462",
"s5/s5_guard_oracle.py": "b58ee46f5c8a82de796bffd88ff8cab89f1f9e7e5c9417414310a1b649dc6c1c",
"s5/s5_order_adapter_controls.py": "f1f90b9847830c6505a176bf78442e619b1d297c818ec561c92c498a4db74b53",
"s5/s5_power_adapter_controls.py": "32d71db80994052b905829e6a2da38448ae789825c44570a901e67fe2d07fd33"
},
"unchanged": true,
"parse": "pass",
"tests_run": false,
"additional_protected": {
"s5/run_s5_native.py": "28d54f061a9a07ee7ab12e043170ae43760bb686354b1c682166e82d04ec35b3"
}
}
@@ -0,0 +1,225 @@
## REPAIR49 current correction
Source-ready only; original 30/88, formal 16, P04=0, no partial credit.
REPAIR48's specification-mismatch blocker below is historical and corrected:
the immutable 7000-byte original has SHA256
d28aadb044633f7d804de5a92c8d4c4a7438dfbf44c3243dca978951f4def25f;
removing its single EOF LF gives
9ec722e7dfb0bee178d291624a026420c08412574e238bba1fde012c7a6f7881.
This is the existing Git/Runner strip/checker one-EOF-LF pin contract.
No specification, approval or normalization change. Older contradictory wording
below is superseded history, including blanket full-reuse prohibitions and
all-controls-unexecuted wording. Q47 admission/index failures remain failures.
See REPAIR49_STATUS.md for closure audit and verbatim complete_B FileNotFoundError.
Root handoff reports payload(B), all53, series/join/power PASS; order-typed remains
UNDETERMINED. Worker did not rerun them. Corrected complete_B remains unexecuted.
Old native/full successes confer no new-S acceptance or credit.
## REPAIR49 full184 conditional reuse candidate — all conditions UNVERIFIED
Native reuse is forbidden: all six series require fresh M/S/Q_tree provenance
(p04_native_series.py:1287; checker:370). Full uses the existing separate binding
(checker:1175-1186); no adopter or checker change is authorized.
The following are requirements, not results or approval:
1. New S5 source_before must equal old full selected_source_map: all 1369 keys
and SHA values, not counts alone.
2. Old project_root must remain unchanged: source-start == current source_refs
== post-verification source_refs (full_suite_verifier.py:115).
3. selected_source_map, roster184, parse329, settings, runner/marker module,
marker contract, suite-policy and UID plan/stage must all match (116-152,225).
4. inputs.engine must match current engine_pin (124-125).
5. Revalidate every phase PID, cleanup, marker and diagnostics (154-228).
6. Current s5/run_s5_native.py and full_suite_verifier.py SHA must equal the
Root rehearsal versions.
7. Never relabel old S/oldQ/project_root/PIDs/time. Describe reuse only as
revalidating the exact-source-identical old full through the existing
full_suite route; never claim full ran on new S.
8. A separate Opus whole-unit review must independently confirm applicability.
Conditions 1–6 require actual checks after final freeze. If any predicate is
unproved or differs, reject reuse and execute full184 once on the final version.
SourceRefs (tools/run_all_tests.py:40-45) excludes docs/private package, but that
fact is no substitute for complete source equality. No reuse is approved here.
# REPAIR49 source-ready status
Original 30/88, formal 16, P04=0; no partial credit or whole-unit acceptance.
Worker static audit/parse only; all new controls remain Runner work.
## Explicit closure audit
All .py files are explicitly enumerated in CLOSURE, plus the six probe .gd files
and six ROOT_RUN documents used by package-local runner material references.
The list is fixed in source; a missing member cannot vanish through globbing.
No package-local JSON is read by the identity execution path: JSON inputs are
supplied B/raw/recorded Q. These external contexts remain required, not rewritten.
The original checker is loaded from the original checkout and supplied to both builders.
- `build_p04_index.py:46`: `path = Path(__file__).with_name('p04_native_series.py')`
- `build_p04_index.py:184`: `series_spec = importlib.util.spec_from_file_location('p04_index_series', Path(__file__).with_name('p04_native_series.py'))`
- `checker_join_fixtures.py:111`: `current_wrapper = series.digest((series.HERE / 's4/run_s4_native.py').read_bytes())`
- `full_suite_verifier.py:111`: `wrapper = module('p04_full_uid', Path(__file__).parent / 's5/run_s5_native.py')`
- `normal_c_join_fixtures.py:12`: `spec = importlib.util.spec_from_file_location("normal_c_join", HERE / "normal_c_join.py")`
- `p04_native_series.py:1001`: `S4_HISTORICAL_WRAPPER = HERE / 's4/historical/run_s4_native_r28.py.reference'`
- `p04_native_series.py:1013`: `require(receipt_sha256 == digest((HERE / 's4/run_s4_native.py').read_bytes()),`
- `p04_native_series.py:1035`: `qa = HERE / 's4/p04_s4_power_probe.gd'`
- `p04_native_series.py:1332`: `wrapper_path = Path(__file__).parent / 's5/run_s5_native.py'`
- `p04_native_series.py:1340`: `admission = wrapper.module('fresh_s4_admission', HERE / 's4/run_s4_native.py')`
- `p04_native_series.py:1432`: `path = Path(__file__).parent / 's5/s5_order_adapter.py'`
- `repair48_identity_controls.py:38`: `CLOSURE = ('build_p04_index.py', 'bulk_reader_equivalence.py', 'checker_applicability_fixtures.py', 'checker_approval_fixtures.py', 'checker_candidate_fixtures.py', 'checker_encoder_fixtures.py', 'checker_join_fixtures.py', 'checker_native_fixtures.py', 'checker_negative_fixtures.py', 'checker_role_fixtures.py', 'checker_series_fixtures.py', 'collect_p04_native.py', 'full_suite_verifier.py', 'normal_c_join.py', 'normal_c_join_fixtures.py', 'p04_native_series.py', 'repair48_identity_controls.py', 'repair48_transport_controls.py', 's1/S1_ROOT_RUN.md', 's1/p04_s1_ev_power_probe.gd', 's1/run_s1_native.py', 's2/S2_ROOT_RUN.md', 's2/p04_s2a_midnight_probe.gd', 's2/run_s2a_native.py', 's2b/S2B_ROOT_RUN.md', 's2b/p04_s2b_shift_probe.gd', 's2b/run_s2b_native.py', 's3/S3_ROOT_RUN.md', 's3/p04_s3_closure_probe.gd', 's3/run_s3_native.py', 's4/S4_ROOT_RUN.md', 's4/admission_controls.py', 's4/engine_identity_negative_fixtures.py', 's4/p04_s4_power_probe.gd', 's4/phase_cut_regression.py', 's4/receipt_lifecycle_fixtures.py', 's4/run_s4_native.py', 's5/S5_ROOT_RUN.md', 's5/p04_s5_power_probe.gd', 's5/repair44_controls.py', 's5/run_s5_native.py', 's5/s5_guard_oracle.py', 's5/s5_order_adapter.py', 's5/s5_order_adapter_controls.py', 's5/s5_power_adapter.py', 's5/s5_power_adapter_controls.py', 's5/s5_uid_controls.py', 's5/s5_wrapper_fixtures.py', 'scratch_fixture_adapter.py')`
- `repair48_identity_controls.py:71`: `shutil.copyfile(HERE / relative, target)`
- `repair48_identity_controls.py:86`: `original_builder = load(HERE / 'build_p04_index.py', 'original_builder')`
- `repair48_identity_controls.py:125`: `rejects(lambda: a.module('outside_identity', HERE / 's5/s5_guard_oracle.py'))`
- `repair48_identity_controls.py:128`: `builder = load(HERE / 'build_p04_index.py', 'identity_builder')`
- `repair48_transport_controls.py:14`: `spec = importlib.util.spec_from_file_location('transport', Path(__file__).with_name('build_p04_index.py'))`
- `s1/run_s1_native.py:20`: `QA = HERE / "p04_s1_ev_power_probe.gd"`
- `s1/run_s1_native.py:61`: `shared = module("fresh_q_shared", HERE.parent / "s5/run_s5_native.py")`
- `s1/run_s1_native.py:89`: `QA, Path(__file__), HERE / "S1_ROOT_RUN.md",`
- `s1/run_s1_native.py:119`: `fixed.append(pin(HERE.parent / "s5/run_s5_native.py"))`
- `s2/run_s2a_native.py:20`: `QA = HERE / "p04_s2a_midnight_probe.gd"`
- `s2/run_s2a_native.py:33`: `]] + [HERE.parent / "s1" / n for n in ["run_s1_native.py", "p04_s1_ev_power_probe.gd", "S1_ROOT_RUN.md"]]`
- `s2/run_s2a_native.py:82`: `shared = module("fresh_q_shared", HERE.parent / "s5/run_s5_native.py")`
- `s2/run_s2a_native.py:111`: `QA, Path(__file__), HERE / "S2_ROOT_RUN.md",`
- `s2/run_s2a_native.py:141`: `fixed.append(pin(HERE.parent / "s5/run_s5_native.py"))`
- `s2b/run_s2b_native.py:20`: `QA = HERE / "p04_s2b_shift_probe.gd"`
- `s2b/run_s2b_native.py:25`: `HERE.parent / folder / name for folder, name in [`
- `s2b/run_s2b_native.py:26`: `("s1", "run_s1_native.py"), ("s1", "S1_ROOT_RUN.md"),`
- `s2b/run_s2b_native.py:28`: `("s2", "S2_ROOT_RUN.md"),`
- `s2b/run_s2b_native.py:71`: `shared = module("fresh_q_shared", HERE.parent / "s5/run_s5_native.py")`
- `s2b/run_s2b_native.py:102`: `QA, Path(__file__), HERE / "S2B_ROOT_RUN.md",`
- `s2b/run_s2b_native.py:132`: `fixed.append(pin(HERE.parent / "s5/run_s5_native.py"))`
- `s3/run_s3_native.py:20`: `QA = HERE / "p04_s3_closure_probe.gd"`
- `s3/run_s3_native.py:31`: `MATERIALS = [MANIFEST, AUDIT, HERE.parent / "s2b/run_s2b_native.py",`
- `s3/run_s3_native.py:32`: `HERE.parent / "s2b/p04_s2b_shift_probe.gd", HERE.parent / "s2b/S2B_ROOT_RUN.md"]`
- `s3/run_s3_native.py:90`: `shared = module("fresh_q_shared", HERE.parent / "s5/run_s5_native.py")`
- `s3/run_s3_native.py:121`: `QA, Path(__file__), HERE / "S3_ROOT_RUN.md",`
- `s3/run_s3_native.py:151`: `fixed.append(pin(HERE.parent / "s5/run_s5_native.py"))`
- `s4/admission_controls.py:99`: `series = s4.module('admission_series', s4.HERE.parent / 'p04_native_series.py')`
- `s4/admission_controls.py:100`: `series_tree = ast.parse((s4.HERE.parent / 'p04_native_series.py').read_text())`
- `s4/admission_controls.py:105`: `wrapper = s4.module('admission_fresh_wrapper', s4.HERE.parent / 's5/run_s5_native.py')`
- `s4/admission_controls.py:124`: `historical = s4.HERE / 'historical/run_s4_native_r28.py.reference'`
- `s4/admission_controls.py:134`: `uid_plan, snapshot, _ = s4.module('admission_uid', s4.HERE.parent / 's5/run_s5_native.py').load_uid_helper(root, r, selected)`
- `s4/engine_identity_negative_fixtures.py:12`: `spec = importlib.util.spec_from_file_location("series", HERE.parent / "p04_native_series.py")`
- `s4/engine_identity_negative_fixtures.py:15`: `spec = importlib.util.spec_from_file_location("s4", HERE / "run_s4_native.py")`
- `s4/receipt_lifecycle_fixtures.py:36`: `s4 = load('receipt_s4_historical', HERE / 'historical/run_s4_native_r28.py.reference')`
- `s4/receipt_lifecycle_fixtures.py:38`: `series = load('receipt_series', HERE.parent / 'p04_native_series.py')`
- `s4/receipt_lifecycle_fixtures.py:42`: `tree = ast.parse((HERE.parent / 'p04_native_series.py').read_text())`
- `s4/receipt_lifecycle_fixtures.py:97`: `put(staged / 'run_s4_native.py', (HERE / 'historical/run_s4_native_r28.py.reference').read_bytes())`
- `s4/receipt_lifecycle_fixtures.py:98`: `put(staged / 'S4_ROOT_RUN.md', b'synthetic fixture material\n')`
- `s4/run_s4_native.py:21`: `QA = HERE / "p04_s4_power_probe.gd"`
- `s4/run_s4_native.py:136`: `shared = module("fresh_q_shared", HERE.parent / "s5/run_s5_native.py")`
- `s4/run_s4_native.py:177`: `QA, Path(__file__), HERE / "S4_ROOT_RUN.md",`
- `s4/run_s4_native.py:214`: `fixed.append(pin(HERE.parent / "s5/run_s5_native.py"))`
- `s4/run_s4_native.py:365`: `# The shared runner log is not write-once; see S4_ROOT_RUN.md.`
- `s5/repair44_controls.py:148`: `for name in ('S5_ROOT_RUN.md', 'PENDING.md'):`
- `s5/run_s5_native.py:26`: `QA = HERE / "p04_s5_power_probe.gd"`
- `s5/run_s5_native.py:33`: `matches = re.findall(r"^const CASE_TABLE: Dictionary = (\{.*?^\})", Path(path).read_text(), re.M | re.S)`
- `s5/run_s5_native.py:45`: `CASE_TABLE = case_table(QA)`
- `s5/run_s5_native.py:77`: `if len(seeds) != 1 or sorted(json.loads(seeds[0])) != CASES or sorted(case_table(QA)) != CASES:`
- `s5/run_s5_native.py:334`: `QA, Path(__file__), HERE / "S5_ROOT_RUN.md",`
- `s5/run_s5_native.py:527`: `# The shared runner log is not write-once; see S5_ROOT_RUN.md.`
- `s5/s5_order_adapter.py:46`: `POWER_PATH = Path(__file__).with_name('s5_power_adapter.py')`
- `s5/s5_order_adapter.py:50`: `GUARD_PATH = Path(__file__).with_name('s5_guard_oracle.py')`
- `s5/s5_order_adapter_controls.py:12`: `mutation = a.module('order_typed_mutation', Path(__file__).with_name('s5_power_adapter_controls.py'))`
- `s5/s5_power_adapter_controls.py:12`: `spec = importlib.util.spec_from_file_location("s5_power_adapter", Path(__file__).with_name("s5_power_adapter.py"))`
- `s5/s5_uid_controls.py:28`: `w = module('s5_uid_wrapper', Path(__file__).with_name('run_s5_native.py'))`
- `s5/s5_wrapper_fixtures.py:13`: `path = Path(__file__).parent / "run_s5_native.py"`
- `scratch_fixture_adapter.py:43`: `source = HERE / (args.fixture + ".py")`
Explicit closure membership:
- `build_p04_index.py`
- `bulk_reader_equivalence.py`
- `checker_applicability_fixtures.py`
- `checker_approval_fixtures.py`
- `checker_candidate_fixtures.py`
- `checker_encoder_fixtures.py`
- `checker_join_fixtures.py`
- `checker_native_fixtures.py`
- `checker_negative_fixtures.py`
- `checker_role_fixtures.py`
- `checker_series_fixtures.py`
- `collect_p04_native.py`
- `full_suite_verifier.py`
- `normal_c_join.py`
- `normal_c_join_fixtures.py`
- `p04_native_series.py`
- `repair48_identity_controls.py`
- `repair48_transport_controls.py`
- `s1/S1_ROOT_RUN.md`
- `s1/p04_s1_ev_power_probe.gd`
- `s1/run_s1_native.py`
- `s2/S2_ROOT_RUN.md`
- `s2/p04_s2a_midnight_probe.gd`
- `s2/run_s2a_native.py`
- `s2b/S2B_ROOT_RUN.md`
- `s2b/p04_s2b_shift_probe.gd`
- `s2b/run_s2b_native.py`
- `s3/S3_ROOT_RUN.md`
- `s3/p04_s3_closure_probe.gd`
- `s3/run_s3_native.py`
- `s4/S4_ROOT_RUN.md`
- `s4/admission_controls.py`
- `s4/engine_identity_negative_fixtures.py`
- `s4/p04_s4_power_probe.gd`
- `s4/phase_cut_regression.py`
- `s4/receipt_lifecycle_fixtures.py`
- `s4/run_s4_native.py`
- `s5/S5_ROOT_RUN.md`
- `s5/p04_s5_power_probe.gd`
- `s5/repair44_controls.py`
- `s5/run_s5_native.py`
- `s5/s5_guard_oracle.py`
- `s5/s5_order_adapter.py`
- `s5/s5_order_adapter_controls.py`
- `s5/s5_power_adapter.py`
- `s5/s5_power_adapter_controls.py`
- `s5/s5_uid_controls.py`
- `s5/s5_wrapper_fixtures.py`
- `scratch_fixture_adapter.py`
The fixture compares complete relative-path/bytes/SHA tables and canonical table
tree hashes for original/A/B before execution and after positive identity work.
Missing, traversal, outside paths and symlinks reject. Negative mutation phase is
separate; existing byte/missing/extra/mapping/symlink/outside cases remain.
A missing S5 .gd negative is added. complete_B_controls=true requires both
placements' S5 facts and entire payload equality. No raw or compared fields are
excluded or normalized. Actual three-placement proof is UNEXECUTED by worker;
Runner must retain the emitted before/after tables.
## Root handoff
Read ROOT_REPAIR49_CURRENT_EVIDENCE_AND_INDEPENDENT_SCOPE.json directly:
payload(B), all53, series/join/power PASS per Root report, engine0, no acceptance.
order-typed is UNDETERMINED and is not pass. Transport/raw-only/synthetic and
q4801 six-series collection are historical S47 successes, not new-S evidence.
Only the observed complete_B closure failure is repaired.
## Historical complete_B failure (verbatim)
```text
Traceback (most recent call last):
File "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/repair48_identity_controls.py", line 115, in <module>
run(parser.parse_args())
File "/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/P04-01-implement/docs/plans/original-completion-2026-10-02/execution/p04-01/repair48_identity_controls.py", line 60, in run
assert native[0].verify_fresh_s5(build) == native[1].verify_fresh_s5(build)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/private/var/folders/41/j8fq6vqj2993cmyprl6p76pw0000gn/T/p04-r48-identity-8veppaza/first/docs/plans/original-completion-2026-10-02/execution/p04-01/p04_native_series.py", line 1430, in verify_fresh_s5
s = FreshSeries(build, 's5')
^^^^^^^^^^^^^^^^^^^^^^^^
File "/private/var/folders/41/j8fq6vqj2993cmyprl6p76pw0000gn/T/p04-r48-identity-8veppaza/first/docs/plans/original-completion-2026-10-02/execution/p04-01/p04_native_series.py", line 1338, in __init__
exec(compile(wrapper_path.read_bytes(), str(wrapper_path), 'exec'), wrapper.__dict__)
File "/private/var/folders/41/j8fq6vqj2993cmyprl6p76pw0000gn/T/p04-r48-identity-8veppaza/first/docs/plans/original-completion-2026-10-02/execution/p04-01/s5/run_s5_native.py", line 45, in <module>
File "/private/var/folders/41/j8fq6vqj2993cmyprl6p76pw0000gn/T/p04-r48-identity-8veppaza/first/docs/plans/original-completion-2026-10-02/execution/p04-01/s5/run_s5_native.py", line 33, in case_table
File "/opt/homebrew/Cellar/python@3.12/3.12.13_2/Frameworks/Python.framework/Versions/3.12/lib/python3.12/pathlib.py", line 1027, in read_text
with self.open(mode='r', encoding=encoding, errors=errors) as f:
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
File "/opt/homebrew/Cellar/python@3.12/3.12.13_2/Frameworks/Python.framework/Versions/3.12/lib/python3.12/pathlib.py", line 1013, in open
return io.open(self, mode, buffering, encoding, errors, newline)
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
FileNotFoundError: [Errno 2] No such file or directory: '/private/var/folders/41/j8fq6vqj2993cmyprl6p76pw0000gn/T/p04-r48-identity-8veppaza/first/docs/plans/original-completion-2026-10-02/execution/p04-01/s5/p04_s5_power_probe.gd'
```
@@ -0,0 +1,68 @@
# REPAIR50 source-ready handoff
Scope: control classification/memo, tree() read method only, stream equivalence
control and documentation. No Git write, engine, Runner, integration or formal
test was performed. Three changed/new Python sources passed AST parsing.
## Root-only execution and estimation
From this package directory, run the following pure controls once and retain
their separate JSON output and external elapsed/RSS measurements:
```
python3 s5/s5_order_adapter_controls.py --pure-only
python3 repair50_stream_controls.py
```
The first emits separate negative counts/lists, identity positive counts/lists,
no-genuine-order lists, memo hit/miss, parser-rejection list and elapsed per
guard. The second compares the complete whole-read and streamed SHA maps and
key insertion order for empty, Unicode name/content, binary, sparse, chunk
boundary -1/exact/+1, multiple chunks and nested files. It uses temporary
synthetic files only and creates no native acceptance evidence.
Before heavy typed controls, parse each actual retained guard record with:
```
python3 s5/s5_order_adapter_controls.py --estimate-record /absolute/path/to/guard.var
```
This performs no derivation or verify: output includes record byte size,
AFTER node count, kind histogram, replacement count and replacement count x2
(including identities, never reported as negatives). Guard mutation disk
estimate is zero; stream control logical fixture size is about 10 MiB, with
the sparse part filesystem-dependent. Memory scales with retained parsed
representatives (at most one per mutated kind, plus first/last), record bytes,
parser overhead and output labels. Memo holds one pair of expected/result raw
bytes for unchanged inputs; it never caches AFTER or recorded EXPECTED.
Time scales with mutation count x record bytes: parse/verify still examine
whole records. Use the synthetic run's external peak RSS and elapsed, together
with its emitted counts/bytes, as an initial calibration; real record shape
and source-derivation costs make this an estimate, not an ETA or resource cap.
Actual guard bytes/counts and calibrated measurements are Root-pending.
## complete_B scope reuse remains conditional
The supplied commander handoff reports R49 session56645 exit 0, 49-file map,
S5 facts/payload equality, no B changes, log SHA prefix bdef6715 and closure
tree prefix b54a35ed. This worker has not independently verified that run.
Root must mechanically compare its saved full raw map with the new tree and
record only the authorized control/tree-read/new-control/document changes.
Inspect import/exec and input closure for builder, collector, native-series,
reader, oracle, wrapper, probe and helper; preserve S47 raw, 21pin, legacy5,
full184 originals, oldQ source/engine SHA and public run_all_tests.py SHA.
Important: repair48_identity_controls.CLOSURE explicitly lists the changed
order control, identity control and S5_ROOT_RUN.md as snapshot material.
The roster is unchanged. Direct searches in builder/native-series/order
adapter did not reference these names, but this is not a complete graph proof
and does not establish reuse. Root must distinguish the actual two-directory
analysis/payload execution/input closure from this snapshot roster and apply
all commander conditions. If any condition fails, rerun complete_B once.
No R49 closure bytes or raw evidence were rewritten to obtain reuse.
Then preserve the recorded Root order: pure controls → clean exact-Q check-only
→ capacity/PID confirmation → fresh native6 → reader/collector → all eight
full exact-source reuse conditions (failure means one full run) → index → one
registered p04-acceptance validation → independent whole-unit review → normal
gates/RootDB join/ledger/main push. Only whole-unit acceptance awards credit.
@@ -0,0 +1,19 @@
# REPAIR51 pre-submit worker handoff
code_ready: documentation-only batch prepared for submission. This file records worker-time static results only; it does not establish post-submit admission.
Changed: order-audit.json, CURRENT_STATUS.md, ORDER_AUDIT.md, this handoff and REPAIR51_APPLICABILITY_MAP.json. Checker, all executables, product/config/spec/values/engine/oracle, fixtures, approvals and historical REPAIR*_STATUS bodies remain byte-identical. Git writes 0; Runner 0; engine 0; delegation 0.
ACTUAL S50 native6/24 phases PASS and collector 15+EV missing 0 remain historical, bound to S50/Q50. ACTUAL S47 full184 retains its original label. No run is relabelled S51. S51 native admission pending AT HANDOFF; Root must freeze Q51 and run fresh native6 because checker:368-371 binds S/Q. Full184, order CLI and complete_B reuse require the map predicates; Root checks actual hashes.
Post-submit state is decided only by Root version-pinned receipts under build/audit-support/p04-root-acceptance-<S>/ and build/p04-evidence/index.json. S50 receipt location: build/audit-support/p04-root-acceptance-a9ef681f/. A worker NOT RUN statement is never a reason to rebuild. No future submitted SHA, Q51 or new receipt is claimed.
All six D05 approvals remain valid; pending D05 empty. Same-tick ACTIVE onset gives RELATED (S5B native proof). Power-first then dependency closure gives NO_POWER by static source observation only; sequential interpretation remains EXPLICITLY UNRESOLVED/UNPROVEN, neither defect nor cure nor proof. Original approval remains unchanged. P04 safety holds through :569 regardless of label. A later product change needs a separate owner-authorised task.
Static checks: JSON parsing, current-table stale-anchor search, empty pending D05, five-path scope check and immutable SHA comparisons. These are worker static checks, not Runner acceptance tests. See applicability map for unchanged SHA256 and source-consumer grep evidence.
Root order: fix Q51; compare map/stop reuse on executable difference; clean exact-Q check-only; capacity/PID check; one native6 heavy lease; readers/adapters then collector; full184 reuse check; order CLI/complete_B conditional reuse or one rerun; index; one p04-acceptance validate; separate Opus whole-unit review; prepare/exactC/integration/final/RootDB join/ledger/main push. NativeWindows individually pending.
Original 30/88, formal 16 and P04 credit 0 unchanged; unit incomplete; formal_acceptance false.
Worker static verification results: 594 JSON files parsed with zero errors; all 3,096 immutable-file SHA256 values matched; exactly the five declared doc-scope non-executables changed; six D05 IDs approved and pending D05 empty; no listed stale anchors in current phase_order/safety_cases. No formal tests were run. code_ready handoff.
@@ -29,42 +29,177 @@ def descriptor(path):
return {'path': str(path.absolute()), 'bytes': len(data), 'sha256': hashlib.sha256(data).hexdigest()}
def require(value, message):
if not value:
raise ValueError(message)
def ordinary(path):
path = Path(path)
require('..' not in path.parts, 'parent traversal')
require(not any(p.is_symlink() for p in (path, *path.parents)), 'symlink path')
return path
def series_inputs(build):
registry = json.loads(ordinary(build / 'audit-support/p04-fresh-runs.json').read_bytes())
path = Path(__file__).with_name('p04_native_series.py')
spec = importlib.util.spec_from_file_location('transport_series', path)
module = importlib.util.module_from_spec(spec)
exec(compile(path.read_bytes(), str(path), 'exec'), module.__dict__)
require(set(registry['series']) == set(module.FRESH_RUNS), 'fresh series roster')
result = {}
for name in module.FRESH_RUNS:
run = Path(registry['series'][name]['run'])
require(not run.is_absolute() and '..' not in run.parts, 'fresh run path')
result[name] = json.loads(ordinary(build / run / 'runner-input.json').read_bytes())
return result
def pin_roster(inputs):
result = {}
for pin in inputs['fixed_input_pins'] + [inputs['QA']]:
path = pin['path']
ordinary(path)
require(Path(path).is_absolute(), 'pin source must be absolute')
require(type(pin['bytes']) is int and pin['bytes'] >= 0, 'pin bytes')
digest = pin['sha256']
require(isinstance(digest, str) and len(digest) == 64
and all(c in '0123456789abcdef' for c in digest), 'pin SHA')
identity = {'bytes': pin['bytes'], 'sha256': digest}
require(path not in result or result[path] == identity, 'conflicting duplicate pin')
result[path] = identity
return result
def relative_material(series, original, pin):
return f"runner-materials/{series}/{pin['sha256']}/{Path(original).name}"
def all_rosters(inputs):
rosters, seen = {}, {}
for name, raw in inputs.items():
rosters[name] = pin_roster(raw)
for original, pin in rosters[name].items():
require(original not in seen or seen[original] == pin, 'conflicting duplicate pin across series')
seen[original] = pin
return rosters
def material_layout(inputs):
rosters = all_rosters(inputs)
layout, seen, destinations = {}, {}, {}
for name, roster in rosters.items():
layout[name] = {}
for original, pin in roster.items():
identity = (original, pin['bytes'], pin['sha256'])
relative = seen.setdefault(identity, relative_material(name, original, pin))
require(relative not in destinations or destinations[relative] == identity,
'distinct pins collide at material destination')
destinations[relative] = identity
layout[name][original] = relative
return rosters, layout
def checked_material(path, pin):
data = ordinary(path).read_bytes()
require(len(data) == pin['bytes'] and hashlib.sha256(data).hexdigest() == pin['sha256'],
'material pin mismatch')
return data
def relocate_materials(build, output):
build = ordinary(Path(build).absolute()).resolve(strict=True)
output = ordinary(Path(output).absolute())
require(output == build / 'p04-evidence', 'output must be B/p04-evidence')
output.mkdir()
mapping = {}
inputs = series_inputs(build)
rosters, layout = material_layout(inputs)
written = set()
for name, roster in rosters.items():
mapping[name] = {}
for original, pin in roster.items():
relative = layout[name][original]
target = output / relative
if relative not in written:
data = checked_material(original, pin)
target.parent.mkdir(parents=True, exist_ok=True)
with target.open('xb') as stream:
stream.write(data)
written.add(relative)
checked_material(target, pin)
mapping[name][original] = {'relative': relative, **pin}
with (output / 'runner-materials/RELOCATION.json').open('x') as stream:
json.dump(mapping, stream, sort_keys=True, indent=2)
stream.write('\n')
return mapping
def relocated_materials(build):
output = ordinary(build / 'p04-evidence')
map_path = ordinary(output / 'runner-materials/RELOCATION.json')
def unique(pairs):
result = {}
for key, value in pairs:
require(key not in result, 'duplicate relocation key')
result[key] = value
return result
mapping = json.loads(map_path.read_bytes(), object_pairs_hook=unique)
inputs = series_inputs(build)
rosters, layout = material_layout(inputs)
require(set(mapping) == set(inputs), 'relocation series roster')
descriptors = {}
expected_files = {'runner-materials/RELOCATION.json'}
for name, raw in inputs.items():
roster = rosters[name]
require(set(mapping[name]) == set(roster), 'relocation material roster')
descriptors[name] = {}
for original, pin in roster.items():
relative = layout[name][original]
require(mapping[name][original] == {'relative': relative, **pin}, 'relocation mapping mismatch')
checked_material(output / relative, pin)
expected_files.add(relative)
descriptors[name][original] = {'path': relative, **pin}
wrappers = [path for path, pin in roster.items() if pin['sha256'] == raw['wrapper_sha256']]
require(len(wrappers) == 1, 'exactly one wrapper pin required')
actual_files = set()
for path in (output / 'runner-materials').rglob('*'):
ordinary(path)
if path.is_file():
actual_files.add(path.relative_to(output).as_posix())
require(actual_files == expected_files, 'unmapped material')
return inputs, descriptors, {'path': 'runner-materials/RELOCATION.json',
'bytes': map_path.stat().st_size,
'sha256': hashlib.sha256(map_path.read_bytes()).hexdigest()}
def payload(build, gate=None):
gate = gate or checker()
build = Path(build).resolve(strict=True)
build = ordinary(Path(build).absolute()).resolve(strict=True)
inputs_by_series, materials_by_series, relocation_descriptor = relocated_materials(build)
native = build / 'audit-support/native-first-current'
c = gate.verify_native(native)
raw = gate.combine_native_series(build, c)
tested = c['production_commit']
series_spec = importlib.util.spec_from_file_location('p04_index_series', Path(__file__).with_name('p04_native_series.py'))
series_module = importlib.util.module_from_spec(series_spec)
series_spec.loader.exec_module(series_module)
fresh_bindings = series_module.fresh_bindings(build)
tested = fresh_bindings['Q_tree']
source = gate.selected_manifest(gate.tree_entries(tested))
source_map = {p: v['sha256'] for p, v in source.items()}
# Resolve content from supplied roots only; never open original provenance
# paths, never omit required source/config/input/environment material.
supplied = {}
roots = [build / 'audit-support' / name for name in
('native-first-current', 'p04-whole-closure-r01', 'p04-current-native-series-r01',
'p04-r17-full-inputs-r01')]
for root in roots:
if not root.exists():
continue
for path in sorted(root.rglob('*')):
if path.is_file():
gate.safe(root, path.relative_to(root).as_posix())
pin = descriptor(path)
supplied.setdefault(pin['sha256'], pin)
runners = []
for run in gate.NATIVE_RUNS:
path = native / run / 'runner-input.json'
for name in series_module.FRESH_RUNS:
run_binding = fresh_bindings['series'][name]
path = gate.safe(build, run_binding['run'] + '/runner-input.json')
inputs = gate.load(path)
row = descriptor(path)
row['materials'] = {}
for pin in inputs.get('fixed_input_pins', []) + [inputs['QA']]:
gate.require(pin['sha256'] in supplied, 'missing supplied runner material: ' + pin['path'])
actual = supplied[pin['sha256']]
gate.require(actual['bytes'] == pin['bytes'], 'runner material length')
row['materials'][pin['path']] = actual
gate.require(inputs['wrapper_sha256'] in supplied, 'missing supplied native wrapper')
row['wrapper'] = supplied[inputs['wrapper_sha256']]
require(inputs == inputs_by_series[name], 'runner input changed during payload')
row['materials'] = materials_by_series[name]
wrappers = [p for p in row['materials']
if row['materials'][p]['sha256'] == inputs['wrapper_sha256']]
require(len(wrappers) == 1, 'exactly one wrapper pin required')
row['wrapper'] = row['materials'][wrappers[0]]
runners.append(row)
# C references retain every lifecycle, raw phase, source, environment and
# formal member mapping; Stage R retains its complete original->relocated map.
@@ -74,8 +209,8 @@ def payload(build, gate=None):
for row in gate.load(native / 'OWNERSHIP_RAW_PROVENANCE.json')['copied']:
references['C/' + row['target']] = descriptor(gate.safe(native, row['target']))
series = {}
collection = build / 'audit-support/p04-raw-collect-r22'
for name in ('s1', 's2a', 's2b', 's3', 's4'):
collection = build / raw['fresh_collection']
for name in series_module.FRESH_RUNS:
series[name] = gate.load(collection / (name + '.json'))
relocation = gate.load(build / 'audit-support/p04-r17-full-inputs-r01/MANIFEST.json')
authorities = {}
@@ -109,7 +244,8 @@ def payload(build, gate=None):
reachability[name] = {'reach': name == 'EV', 'case_id': 'EV' if name == 'EV' else None, 'source_refs': refs,
'raw_verified': 'EV' in raw['verified_conditions'] if name == 'EV' else None}
delta = gate.source_delta(gate.REGISTERED_COMMIT, tested)
index = {'schema_version': 2, 'task_id': 'P04-01', 'formal_acceptance': False,
index = {'runner_material_relocation': relocation_descriptor,
'schema_version': 2, 'task_id': 'P04-01', 'formal_acceptance': False,
'versions': {'registered': gate.REGISTERED_COMMIT, 'execution_origin': gate.EXECUTION_ORIGIN,
'tested': tested},
'product_binding': {'tested_product': tested, 'runner_inputs': runners},
@@ -119,7 +255,8 @@ def payload(build, gate=None):
gate.boundary_conditions(r['path'], r['function'])} for r in delta},
'domains': domains, 'authority': authorities, 'conditions': conditions,
'reachability': reachability, 'raw_conditions': raw, 'raw_references': references,
'series': series, 'source_config_input_environment_and_formal': relocation,
'series': series, 'fresh_run_bindings': fresh_bindings,
'historical_source_config_input_environment_and_formal': relocation,
'native_bundle': descriptor(native / 'OWNERSHIP_RAW_PROVENANCE.json'),
'original_audit': {'sha256': gate.sha(gate.ROOT / gate.DOC_SCOPE / 'order-audit.json'),
'content': gate.load(gate.ROOT / gate.DOC_SCOPE / 'order-audit.json')},
@@ -133,17 +270,16 @@ def payload(build, gate=None):
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--build', required=True, type=Path)
parser.add_argument('--output', required=True, type=Path, help='fresh directory; exclusive creation')
parser.add_argument('--output', type=Path, help='exact B/p04-evidence; exclusive creation')
parser.add_argument('--invocation', required=True, choices=('validate', 'prepare-integration', 'final'))
parser.add_argument('--registered-ref', required=True)
parser.add_argument('--tested-ref', required=True)
args = parser.parse_args()
gate = checker()
os.environ['BUILD_OUTPUT_DIR'] = str(args.build.resolve(strict=True))
output = args.output.absolute()
gate.require(not output.exists() and not output.is_symlink(), 'output must be fresh')
for path in output.parents:
gate.require(not path.is_symlink(), 'output parent symlink')
output = args.output or Path(os.environ.get('P04_EVIDENCE_DIR', str(args.build.resolve() / 'p04-evidence')))
output = output.absolute()
relocate_materials(args.build, output)
index = payload(args.build, gate)
gate.require(args.registered_ref == gate.REGISTERED_COMMIT and
args.tested_ref == index['versions']['tested'],
@@ -153,11 +289,15 @@ def main():
# The historical invocation is separate from the reusable evidence index.
receipt = {'invocation': args.invocation, 'actual_head': role['actual_head'],
'actual_tree': role['actual_tree'], 'role': role['role'], 'formal_acceptance': False}
output.mkdir(parents=False)
for name, value in (('index.json', index), ('generation-invocation.json', receipt)):
with (output / name).open('x', encoding='utf-8') as stream:
json.dump(value, stream, ensure_ascii=False, sort_keys=True, indent=2)
stream.write('\n')
try:
for name, value in (('index.json', index), ('generation-invocation.json', receipt)):
with (output / name).open('x', encoding='utf-8') as stream:
json.dump(value, stream, ensure_ascii=False, sort_keys=True, indent=2)
stream.write('\n')
except BaseException:
# The exclusively created directory is a failed attempt, never evidence.
(output / 'index.json').unlink(missing_ok=True)
raise
print(json.dumps({'evidence_directory': str(output), **receipt}))
@@ -108,6 +108,25 @@ def run(build):
# S4 is deliberately unavailable until the single Root collection exists.
# Never substitute B1 or manufacture a positive raw fixture for it.
s4 = series.S4Series(build)
current_wrapper = series.digest((series.HERE / 's4/run_s4_native.py').read_bytes())
historical_wrapper = series.S4_HISTORICAL_WRAPPER_SHA256
series.verify_s4_wrapper(historical_wrapper, historical=True)
series.verify_s4_wrapper(current_wrapper, historical=False)
reject('historical_receipt_checked_against_current_wrapper',
lambda: series.verify_s4_wrapper(historical_wrapper, historical=False))
reject('current_wrapper_used_as_historical_receipt',
lambda: series.verify_s4_wrapper(current_wrapper, historical=True))
reject('fresh_receipt_carrying_historical_pin',
lambda: series.verify_s4_wrapper(historical_wrapper, historical=False))
original_read_bytes = Path.read_bytes
def tampered_pin(path):
data = original_read_bytes(path)
return data + b'\n' if path == series.S4_HISTORICAL_WRAPPER else data
with patch.object(Path, 'read_bytes', tampered_pin):
reject('tampered_historical_pinned_copy',
lambda: series.verify_s4_wrapper(historical_wrapper, historical=True))
series.power_stop(s4)
results.append({'case': 'S4_real_NO_POWER_positive', 'result': 'accepted'})
s4_value = s4.value
@@ -5,6 +5,7 @@ import hashlib
import importlib.util
import json
import os
import py_compile
from pathlib import Path
import subprocess
import sys
@@ -23,9 +24,10 @@ def run():
results = []
with tempfile.TemporaryDirectory(prefix='.checker-fixtures-', dir=Path(__file__).parent) as temp:
base = Path(temp)
# Keep py_compile output inside allowed_paths; delete with the fixture.
env = dict(os.environ, PYTHONPYCACHEPREFIX=str(base / 'pycache'))
subprocess.run(['python3', '-m', 'py_compile', str(CHECKER)], env=env, check=True)
# Generated bytecode belongs in allocated build, never tracked docs.
build = Path(os.environ['BUILD_OUTPUT_DIR']).resolve(strict=True)
with tempfile.TemporaryDirectory(prefix='p04-compile-', dir=build) as compiled:
py_compile.compile(str(CHECKER), cfile=str(Path(compiled) / 'checker.pyc'), doraise=True)
evidence = base / 'p04-evidence'
evidence.mkdir()
artifacts = {}
@@ -19,6 +19,9 @@ import p04_native_series as s
def run(build):
results = []
assert set(s.FRESH_RUNS) == {'s1', 's2a', 's2b', 's3', 's4', 's5'}
assert all(callable(getattr(s, 'verify_fresh_' + name)) for name in s.FRESH_RUNS)
results.append({'series': 'fresh', 'class': 'fresh_roster_and_entrypoints', 'result': 'pass'})
def reject(series, name, action):
try:
@@ -28,14 +31,14 @@ def run(build):
else:
raise AssertionError('negative accepted: ' + series + '/' + name)
with tempfile.TemporaryDirectory(prefix='.series-fixtures-', dir=s.HERE) as tmp:
with tempfile.TemporaryDirectory(prefix='.series-fixtures-', dir=build) as tmp:
base = Path(tmp)
data = b'func boundary():\n\treturn 42\n# included trailing comment\n'
path = base / 'body.gd'
path.write_bytes(data)
pin = {'sha256': s.digest(data), 'bytes': len(data)}
# A deliberately small resolver fixture bypasses the production-only
# fixed 1721-file constructor, but exercises its exact read path.
# historical pinned relocation constructor, but exercises its exact read path.
resolver = s.Resolver.__new__(s.Resolver)
resolver.base, resolver.used = base, {}
resolver.mapping = {'/native/body.gd': dict(pin, relocated=str(path))}
@@ -2,6 +2,7 @@
"""Deterministic reference-only Stage R collector; never writes the final index."""
import argparse
import json
import re
from pathlib import Path
import shutil
import sys
@@ -14,29 +15,39 @@ def encoded(value):
return (json.dumps(value, sort_keys=True, indent=2, ensure_ascii=False) + '\n').encode()
def collect(build):
def collect(build, fresh=None):
build = Path(build).absolute()
destination = build / 'audit-support/p04-raw-collect-r22'
if fresh is not None:
series.require(re.fullmatch(r'q[0-9]+', fresh) is not None, 'fresh collection must be q<N>')
destination = build / ('audit-support/p04-raw-collect-' + fresh if fresh else 'audit-support/p04-raw-collect-r22')
series.require(not destination.exists() and not destination.is_symlink(), 'collection destination already exists')
for p in (destination.parent, *destination.parents):
series.require(not p.is_symlink(), 'collection parent symlink')
payloads = {}
bindings = {}
for name in series.RUNS:
result = getattr(series, 'verify_' + name)(build)
for name in (series.FRESH_RUNS if fresh else series.RUNS):
result = getattr(series, ('verify_fresh_' if fresh else 'verify_') + name)(build)
result['verifier_sha256'] = series.digest(Path(series.__file__).read_bytes())
data = encoded(result)
filename = name + '.json'
payloads[filename] = data
bindings[name] = {'path': filename, 'bytes': len(data), 'sha256': series.digest(data),
'relocation_manifest_sha256': series.MANIFEST_SHA256}
**({} if fresh else {'relocation_manifest_sha256': series.MANIFEST_SHA256})}
manifest = {'protocol': 'p04-native-series-collection-v1', 'formal_acceptance': False,
'stage_A': 'candidate binding stage A pending', 'series': bindings,
'relocation_manifest_sha256': series.MANIFEST_SHA256,
'relocation_manifest': 'audit-support/p04-r17-full-inputs-r01/MANIFEST.json',
'collector_sha256': series.digest(Path(__file__).read_bytes()),
'large_payloads_copied': 0}
if fresh:
manifest = {'protocol': 'p04-fresh-native-series-collection-v1', 'series': bindings,
'collection': fresh, 'formal_acceptance': False,
'collector_sha256': series.digest(Path(__file__).read_bytes()),
'historical_merged': False, 'large_payloads_copied': 0}
payloads['MANIFEST.json'] = encoded(manifest)
if fresh:
# This is an invocation/transport record, never compared as S5 facts.
payloads['dependency-invocation.json'] = encoded(series.S5_DEPENDENCY_INVOCATION)
estimate = sum(len(v) for v in payloads.values())
# The estimate precedes all writes. Reserve extra directory/allocation space.
print(json.dumps({'estimated_payload_bytes': estimate, 'files': len(payloads),
@@ -54,8 +65,10 @@ def collect(build):
if __name__ == '__main__':
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--build', type=Path, required=True)
parser.add_argument('--fresh', metavar='qN')
try:
collect(parser.parse_args().build)
args = parser.parse_args()
collect(args.build, args.fresh)
except (ValueError, OSError, KeyError, TypeError) as exc:
print(json.dumps({'collected': False, 'error': str(exc)}))
sys.exit(1)
@@ -0,0 +1,254 @@
#!/usr/bin/env python3
"""Read-only full Q verification. No normal-C join and no acceptance from counts."""
import hashlib
import importlib.util
import json
from pathlib import Path
def require(value, message):
if not value:
raise ValueError(message)
def module(name, path):
path = Path(path).absolute()
require('..' not in path.parts and all(not p.is_symlink() for p in (path, *path.parents)),
'module ordinary path')
data = path.read_bytes()
spec = importlib.util.spec_from_file_location(name, path)
result = importlib.util.module_from_spec(spec)
exec(compile(data, str(path), 'exec'), result.__dict__)
return result
def sha(path):
return hashlib.sha256(Path(path).read_bytes()).hexdigest()
def content(refs):
return {name: {key: row[key] for key in ('bytes', 'sha256')} for name, row in refs.items()}
def roster_gate(expected, actual):
require(len(expected) == len(set(expected)) and actual == expected, 'missing/extra/reordered suite')
def pid_gate(row, start, end, owner):
pid = row['actual_pid']
require(type(pid) is int and pid > 0 and start['actual_pid'] == end['actual_pid'] == pid
and row['native_process']['pid'] == pid, 'PID mismatch')
require(start['owner_pid'] == end['owner_pid'] == owner
and start['current_process_identity']['pid'] == pid
and start['current_process_identity']['ppid'] == owner, 'PID owner')
require(start['command'] == end['command'] == row['command'] == row['native_process']['argv'], 'PID argv')
require(start['monotonic_ns'] < end['monotonic_ns'] and end['engine_ended'] is True
and end['exit_code'] == end['actual_process_exit_code'] == 0
and end['timed_out'] is False and end['lifecycle_error'] is None, 'PID end')
def cleanup_gate(rows, count):
require(len(rows) == count, 'cleanup roster')
for row in rows:
cleanup = row['cleanup']
require(row['engine_ended'] is True and row['outer_cleanup_errors'] == []
and cleanup['engine_ended'] is True and cleanup['errors'] == []
and cleanup['actual_process_exit_code'] == 0, 'dirty cleanup')
require(cleanup['attempts'], 'cleanup attempts')
for attempt in cleanup['attempts']:
require(attempt['errors'] == [] and attempt['kill_attempted'] is False
and attempt['wait_completed'] is True and attempt['wait_returned_code'] == 0,
'dirty cleanup wait')
def settings_gate(before, after, selected):
for name in ('project.godot', 'export_presets.cfg'):
require(before[name] == after[name] == selected[name], 'settings drift: ' + name)
def controls():
"""Pure contract negatives, independent of native success or test totals."""
import copy
results = []
def reject(name, callback):
try:
callback()
except ValueError:
results.append(name)
return
raise ValueError('negative accepted: ' + name)
roster_gate(['a', 'b'], ['a', 'b'])
reject('missing-suite', lambda: roster_gate(['a', 'b'], ['a']))
reject('extra-suite', lambda: roster_gate(['a', 'b'], ['a', 'b', 'c']))
row = {'actual_pid': 1, 'native_process': {'pid': 2}}
reject('PID-mismatch', lambda: pid_gate(row, {'actual_pid': 1}, {'actual_pid': 1}, 9))
dirty = [{'engine_ended': False, 'outer_cleanup_errors': [], 'cleanup': {}}]
reject('dirty-cleanup', lambda: cleanup_gate(dirty, 1))
source = {name: {'bytes': 1, 'sha256': 'a'} for name in ('project.godot', 'export_presets.cfg')}
settings_gate(source, source, source)
changed = copy.deepcopy(source)
changed['project.godot']['sha256'] = 'b'
reject('settings-drift', lambda: settings_gate(source, changed, source))
return {'controls': results, 'native_run': False, 'formal_acceptance': False}
def verify(root, run, required):
root, run = Path(root).resolve(strict=True), Path(run).resolve(strict=True)
references = {}
def read(relative):
require(not Path(relative).is_absolute() and '..' not in Path(relative).parts, 'full raw traversal')
path = run / relative
require(path.is_file() and all(not p.is_symlink() for p in (path, *path.parents)), 'full raw ordinary file')
data = path.read_bytes()
references[relative] = {'bytes': len(data), 'sha256': hashlib.sha256(data).hexdigest()}
return data
def load(relative):
return json.loads(read(relative))
full = module('p04_actual_q_full', root / 'tools/run_all_tests.py')
wrapper = module('p04_full_uid', Path(__file__).parent / 's5/run_s5_native.py')
source = full.source_refs(root)
before = load('source-start.json')
after = full.source_refs(root)
require(before == source == after, 'full source before/after/current')
roster = full.roster(root)
parse_paths = ['res://' + n for n in sorted(source) if n.endswith('.gd')]
inputs, ended = load('runner-input.json'), load('runner-ended.json')
roster_gate(roster, inputs['roster'])
require(inputs['selected_source_map'] == {n: p['sha256'] for n, p in source.items()}, 'full exact Q source map')
settings_gate(content(before), content(after), content(source))
require(inputs['runner_sha256'] == sha(root / 'tools/run_all_tests.py')
and inputs['marker_module_sha256'] == sha(root / 'tools/strict_test_markers.py'), 'actual runner/marker module')
engine = wrapper.engine_pin(Path(inputs['engine']))
require(inputs['engine_sha256'] == engine['sha256'], 'full engine pin')
require(ended['passed'] is True and ended['error'] is None
and ended['cleanup_errors'] == ended['guard_errors'] == [] and ended['engine_ended'] is True,
'full run failed')
require(inputs['run_id'] == ended['run_id'] and inputs['owner_runner_pid'] == ended['owner_runner_pid'], 'full run identity')
require(inputs['default_player_before'] == ended['default_player_after'], 'protected profile changed')
markers = module('p04_full_markers', root / 'tools/strict_test_markers.py')
contract_path = root / wrapper.C_REL
require(sha(contract_path) == inputs['marker_contract_sha256'], 'full contracts SHA')
contracts = markers.load_contracts(contract_path)
policy_path = full.SUPPORT / 'suite-policy.json'
policy = full.read(policy_path)
require(source['tools/regression/suite-policy.json']['sha256'] == sha(policy_path), 'source-bound full policy')
full.policy_coverage(roster, source, policy)
diagnostics = module('p04_full_diagnostics', full.SUPPORT / 'diagnostic_gate.py')
native = module('p04_full_native', full.SUPPORT / 'owned_diagnostic_process.py')
owners = module('p04_full_owners', full.SUPPORT / 'ordinary_proof_gate.py')
audio = module('p04_full_audio', full.SUPPORT / 'audio_evidence_gate.py')
sequence = [('import', None), ('parse', None)] + [(str(i).zfill(3), n) for i, n in enumerate(roster)]
require([(p['phase'], p['test']) for p in ended['phases']] == sequence, 'entire derived phase roster')
all_tests = load('all-tests.json')
require(references['all-tests.json']['sha256'] == ended['all_tests_sha256'], 'full all-tests SHA')
roster_gate(roster, [p['test'] for p in all_tests])
require(load('parse-paths.json') == parse_paths, 'complete parse roster')
uid_plan, uid_snapshot, binding = wrapper.load_uid_helper(root, full, source)
plan = uid_plan(source)
accepted = load('accepted-uids.json')
require(load('uid-plan.json') == plan, 'derived full UID plan')
generated, pids, suite_rows = {}, [], {}
for index, (label, test) in enumerate(sequence):
row = load(label + '-receipt.json')
enriched = dict(row)
if test:
enriched.update(sequence=index - 2, godot=inputs['engine'])
require(enriched == all_tests[index - 2], 'full test raw row join')
require(enriched == ended['phases'][index] and row['passed'] is True and row['failed'] is False
and row['validation_error'] is None and not row.get('guard_error')
and row['default_player_entire_profile_unchanged'] is True, 'full phase guards')
process = load(label + '/process.json')
require(process == row['native_process'], 'native process receipt binding')
pid_gate(row, load(label + '/started.json'), load(label + '/ended.json'), inputs['owner_runner_pid'])
pids.append(row['actual_pid'])
stdout, stderr, logger = [read(label + '/' + name).decode() for name in ('stdout.log', 'stderr.log', 'engine-native.log')]
require(references[label + '/stdout.log']['sha256'] == process['stdout_sha256']
and references[label + '/stderr.log']['sha256'] == process['stderr_sha256'], 'full streams SHA')
require(all(references[label + '/engine-native.log'][k] == row['raw_native_log'][k]
for k in ('bytes', 'sha256')), 'native logger pin')
raw = stdout + stderr
require(read(row['log']).decode() == raw and references[row['log']]['sha256'] == row['log_sha256'], 'full raw log join')
review = diagnostics.review_streams(native, {'stdout': stdout, 'stderr': stderr, 'native_file': logger},
test, root / test if test else None)
require(review == row['finite_original_diagnostic_review']
and diagnostics.diagnostic_result_gate(process, review)
and full.process_gate(process, review['allowed_e31_error_lines']), 'full strict diagnostics')
require(row['outer_actual_capture']['passed'] is True
and row['outer_actual_capture']['foreign_process_or_group_signals'] == 0, 'owned capture')
if test:
parsed = markers.parse_raw(test, raw, contracts, source[test]['sha256'])
require(parsed == row['completion'] and parsed['passed'] is True and parsed['failures'] == 0,
'literal source-bound marker')
require(row['policy'] == full.phase_policy(test, root / test, policy['suite_policies']), 'phase policy drift')
p = row['policy']
route = policy['outside_routes'].get(test)
if route:
require(full.routed_report(run / (label + '-evidence'), route, test, row['actual_pid'], raw,
run / 'stage', source[test]['sha256']) == row['outside_report'],
'full routed proof')
proof = run / (label + '-teardown')
if p['ordinary_cleanup_prepared']:
require(owners.ordinary_gate(proof, row['actual_pid'], run, p['ordinary_control_labels']) ==
row['ordinary_owner_pairs'], 'full ordinary ownership proof')
if p['old_bounded_teardown'] or test == 'tests/ui/test_ui_audio_feedback.gd':
require(audio.teardown_gate(proof, row['actual_pid'], run) == row['old_bounded_proof'],
'full bounded teardown proof')
if test == 'tests/ui/test_ui_audio_feedback.gd':
audio_dir = run / (label + '-audio-proof')
require(audio.command_gate(audio_dir / 'actual-command-result-buffer-proof.json', audio_dir,
row['actual_pid']) == row['actual_command_evidence'], 'full audio commands')
require(audio.ogg_gate(audio_dir / 'actual-ogg-decode-player-state.json', row['actual_pid'],
inputs['selected_source_map']) == row['actual_ogg_evidence'], 'full actual OGG')
suite_rows[test] = {'phase': label, 'pid': row['actual_pid'], 'source_sha256': source[test]['sha256'],
'marker': parsed, 'log_sha256': row['log_sha256']}
if label == 'parse':
require(row['actual_parse_checks'] == len(parse_paths), 'derived parse count')
uid = load(label + '-uids.json')
require(uid.get('error') is None and uid['before'] == ({} if label == 'import' else accepted)
and uid['after'] == accepted, 'full phase UID seals')
for kind in ('startup', 'runtime'):
snapshot = row.get('whole_' + kind + '_profile_after')
if snapshot:
require(full.inventory(run / 'profiles' / label / kind) == snapshot['files'],
'complete retained private profile')
for name, descriptor in row['generated_reports'].items():
require(name not in source and name not in generated, 'unique generated report')
pin = {k: descriptor[k] for k in ('bytes', 'sha256')}
read('stage/' + name)
require(references['stage/' + name] == pin, 'generated report raw')
generated[name] = pin
require(len(set(pids)) == len(sequence) and pids == ended['actual_captured_PIDs'], 'all full unique PIDs')
cleanup_gate(ended['final_owned_cleanup'], len(sequence))
require(uid_snapshot(run / 'stage', dict(content(source), **generated), plan) == accepted, 'retained exact stage/UID/settings')
totals = full.totals(all_tests, roster)
require(all(ended[k] == v for k, v in totals.items()) and not totals['remaining_unexecuted_tests']
and not totals['missing_marker_paths'], 'recomputed full totals')
kitchen = [n for n in roster if Path(n).name == 'test_required_kitchen.gd']
require(len(kitchen) == 1, 'separate required-kitchen roster binding')
# A suite pass supplies exact-version applicability, not domain boundary proof.
conditions = {name: {'status': 'pending_boundary_raw', 'full_suite_applicable': True}
for name in sorted(set(required) | {'EV'})}
return {'verified': True, 'suites': len(roster), 'parse_files': len(parse_paths),
'source_files': len(source), 'totals': totals, 'owned_pids': pids,
'required_kitchen': dict(suite_rows[kitchen[0]], test=kitchen[0]),
'conditions': conditions, 'references': references, 'source_sha256': inputs['selected_source_map'],
'policy_sha256': sha(policy_path), 'engine_sha256': engine['sha256'],
'normal_c_join': 'Root post-final only', 'formal_acceptance': False}
if __name__ == '__main__':
import argparse
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--controls', action='store_true')
parser.add_argument('--root', type=Path)
parser.add_argument('--run', type=Path)
args = parser.parse_args()
if args.controls:
print(json.dumps(controls(), sort_keys=True))
else:
require(args.root is not None and args.run is not None, 'root and run required')
gate = module('full_required_membership', args.root / 'tools/check_p04_order_evidence.py')
print(json.dumps(verify(args.root, args.run, gate.REQUIRED), sort_keys=True))
@@ -1,8 +1,8 @@
{
"revision": "repair30",
"status": "BLOCKED: partial implementation; no native admission",
"revision": "REPAIR51 pre-submit documentation handoff",
"status": "ACTUAL S50 historical evidence complete; S51 docs-only resubmission; S51 native admission pending at worker handoff (fresh native on Q51 required by S-binding, checker:368-371); post-submit admission determined only by Root version-pinned receipts; formal_acceptance false; P04=0",
"task_id": "P04-01",
"current_table": true,
"current_table": "M c0ea009; current source facts, policy approvals and ACTUAL S50 historical evidence; S51 admission pending AT HANDOFF",
"scope": {
"conditions": 15,
"additional_EV_obligation": true,
@@ -16,12 +16,13 @@
"deliveries": 88,
"original_credit": "16/88 formal; P04 receives zero credit",
"CurrentAlphaScope": "unchanged",
"frozen_main": "c0ea009b28a7649aca6a433a1a24dc0be5e7ab81"
"frozen_main": "c0ea009b28a7649aca6a433a1a24dc0be5e7ab81",
"summary": "Documentation-only REPAIR51 within existing P04-01/W; original 30/88, formal 16, P04=0; unit incomplete."
},
"domains": [
{
"domain": "閉店",
"normative_rule": "D-034 preserves started services on direct closure and releases waiting requests. Dependency closure stops progress and charging, retains reservations/service identity, and completes once after recovery. RELATED_FACILITY_INACTIVE wins over NO_POWER when both apply.",
"normative_rule": "D-034 preserves started services on direct closure and releases waiting requests. Dependency closure stops progress and charging, retains reservations/service identity, and completes once after recovery. RELATED_FACILITY_INACTIVE wins over NO_POWER when both apply. PAUSE-REASON scope: same-tick onset from ACTIVE only is natively proven; sequential power-first scope explicitly unresolved/unproven.",
"current_source": [
{
"path": "autoload/simulation_runtime.gd",
@@ -53,10 +54,10 @@
"pending_D05": [],
"phase": "APPLY_COMMANDS / FACILITY_COMPLETION / FACILITY_QUEUES",
"relative_priority": "Command closure before completion; dependency hold during preparation; closed queue release after completion.",
"status": "approved policy; fresh Q evidence pending",
"observation_status": "historical observations; current M source inspected",
"status": "approved policy",
"observation_status": "M source observations; ACTUAL S50 historical evidence; S51 admission pending AT HANDOFF",
"historical_evidence": "I native_bundle C; R/s2a.json; R/s3.json B1",
"evidence": "Fresh exact-Q native proof pending; no old raw reused as Q",
"evidence": "ACTUAL S50 native6/24 phases PASS, collector 15+EV missing 0 (historical, bound to S50/Q50); S51 requires fresh native6 (checker:368-371); nativeWindows pending",
"nativeWindows": "pending"
},
{
@@ -86,11 +87,11 @@
"pending_D05": [],
"phase": "MANA → FACILITY_COMPLETION",
"relative_priority": "Projection before completion; RELATED chosen before NO_POWER.",
"status": "approved policy; fresh Q evidence pending",
"observation_status": "historical observations; current M source inspected",
"status": "approved policy",
"observation_status": "M source observations; ACTUAL S50 historical evidence; S51 admission pending AT HANDOFF",
"evidence_scope": "S4 probe calls disconnect_nodes directly: isolated NO_POWER, not global depletion. Global depletion appears only in S3 B1 combined diagnostic. S1 covers separate staff/EV safety.",
"historical_evidence": "R/s4.json; B/p04-s4-native-r28; R/s3.json B1 combined diagnostic",
"evidence": "Fresh exact-Q native proof pending; no old raw reused as Q",
"evidence": "ACTUAL S50 native6/24 phases PASS, collector 15+EV missing 0 (historical, bound to S50/Q50); S51 requires fresh native6 (checker:368-371); nativeWindows pending",
"nativeWindows": "pending"
},
{
@@ -132,10 +133,10 @@
"pending_D05": [],
"phase": "APPLY_COMMANDS vs INCIDENTS_AND_EVENTS",
"relative_priority": "Command destruction before completion; incident destruction after completion: B4a charges25G then destroys in same tick; B4b next-tick failure/release.",
"status": "approved policy; fresh Q evidence pending",
"observation_status": "historical observations; current M source inspected",
"status": "approved policy",
"observation_status": "M source observations; ACTUAL S50 historical evidence; S51 admission pending AT HANDOFF",
"historical_evidence": "R/s3.json B4a/B4b",
"evidence": "Fresh exact-Q native proof pending; no old raw reused as Q",
"evidence": "ACTUAL S50 native6/24 phases PASS, collector 15+EV missing 0 (historical, bound to S50/Q50); S51 requires fresh native6 (checker:368-371); nativeWindows pending",
"nativeWindows": "pending"
},
{
@@ -165,10 +166,10 @@
"pending_D05": [],
"phase": "APPLY_COMMANDS vs AI_DECISIONS",
"relative_priority": "Command exit before completion/charging; AI PLANNED_EXIT after them; despawn later.",
"status": "approved policy; fresh Q evidence pending",
"observation_status": "historical observations; current M source inspected",
"status": "approved policy",
"observation_status": "M source observations; ACTUAL S50 historical evidence; S51 admission pending AT HANDOFF",
"historical_evidence": "R/s3.json B2a/B2b/B3 and B1 departure history",
"evidence": "Fresh exact-Q native proof pending; no old raw reused as Q",
"evidence": "ACTUAL S50 native6/24 phases PASS, collector 15+EV missing 0 (historical, bound to S50/Q50); S51 requires fresh native6 (checker:368-371); nativeWindows pending",
"nativeWindows": "pending"
},
{
@@ -213,10 +214,10 @@
"pending_D05": [],
"phase": "TIME_BOUNDARIES → FACILITY_COMPLETION",
"relative_priority": "Upkeep/daily close before sale; post-increment sale timestamp, exclusive close period_end;00:00 sale belongs to new day.",
"status": "approved policy; fresh Q evidence pending",
"observation_status": "historical observations; current M source inspected",
"status": "approved policy",
"observation_status": "M source observations; ACTUAL S50 historical evidence; S51 admission pending AT HANDOFF",
"historical_evidence": "I native_bundle C; R/s2a.json; R/s4.json",
"evidence": "Fresh exact-Q native proof pending; no old raw reused as Q",
"evidence": "ACTUAL S50 native6/24 phases PASS, collector 15+EV missing 0 (historical, bound to S50/Q50); S51 requires fresh native6 (checker:368-371); nativeWindows pending",
"nativeWindows": "pending"
},
{
@@ -246,10 +247,10 @@
"pending_D05": [],
"phase": "FACILITY_COMPLETION → AI_DECISIONS",
"relative_priority": "18:00 completion/payment before shift handover; day staff [17:59,18:00), night [18:00,18:01).",
"status": "approved policy; fresh Q evidence pending",
"observation_status": "historical observations; current M source inspected",
"status": "approved policy",
"observation_status": "M source observations; ACTUAL S50 historical evidence; S51 admission pending AT HANDOFF",
"historical_evidence": "I C first1080 sale joins; R/s2b.json no-night1081/overtime",
"evidence": "Fresh exact-Q native proof pending; no old raw reused as Q",
"evidence": "ACTUAL S50 native6/24 phases PASS, collector 15+EV missing 0 (historical, bound to S50/Q50); S51 requires fresh native6 (checker:368-371); nativeWindows pending",
"nativeWindows": "pending"
},
{
@@ -295,10 +296,10 @@
"pending_D05": [],
"phase": "pre-TIME_BOUNDARIES signals → TIME_BOUNDARIES → FACILITY_COMPLETION",
"relative_priority": "Midnight signals, then upkeep/close, then completion.",
"status": "approved policy; fresh Q evidence pending",
"observation_status": "historical observations; current M source inspected",
"status": "approved policy",
"observation_status": "M source observations; ACTUAL S50 historical evidence; S51 admission pending AT HANDOFF",
"historical_evidence": "I C paused/formal; R/s2a.json nonzero payroll/upkeep, replay and typed restore",
"evidence": "Fresh exact-Q native proof pending; no old raw reused as Q",
"evidence": "ACTUAL S50 native6/24 phases PASS, collector 15+EV missing 0 (historical, bound to S50/Q50); S51 requires fresh native6 (checker:368-371); nativeWindows pending",
"nativeWindows": "pending"
}
],
@@ -314,16 +315,22 @@
"REPAIR21_STATUS.md",
"REPAIR22–28 creation-time status and runbooks"
],
"history_policy": "Historical source/proof pins retain their original revisions; CURRENT_STATUS.md is canonical. New approvals are not new native evidence.",
"evidence_policy": "All old S1-S4/r22/native/full178 records are historical. None is relabelled as Q. Fresh native S1-S5 and full184/329 on final Q remain NOT RUN.",
"history_policy": "Raw and historical material retain original S50/S47/r22 labels. Canonical top sections describe handoff only; Root version-pinned receipts decide post-submit state.",
"evidence_policy": {
"S50_actual": "ACTUAL S50 native6/24 phases PASS, collector 15+EV missing 0 (historical, bound to S50/Q50); S51 requires fresh native6 (checker:368-371); nativeWindows pending",
"S47_full184": "ACTUAL S47 full184 historical; reusable only if checker:1185-1186 full source_sha256 equals new S5 source_before and product, checker and every doc-scope executable are byte-identical; all full verifier input/environment predicates must hold.",
"r22_historical": "r22 and earlier raw retain historical labels and bindings; no new-S native admission."
},
"pending": [
"Complete current-Q collector/wrapper/index binding and S5 drivers; see REPAIR30_STATUS.md",
"Fresh native S1-S5 on final Q, then full184/329 on the same Q including checker",
"Truthful index, formal registered validation on S --verify-only, whole-unit independent review, normal C integration",
"nativeWindows individually pending for every condition"
"Root fixes Q51; compare actual hashes with REPAIR51_APPLICABILITY_MAP.json; stop reuse on executable differences",
"clean exact-Q check-only; capacity and PID check; one heavy lease for fresh native6 on Q51",
"reader/adapters then collector; full184 conditional reuse check; order CLI/complete_B conditional reuse or rerun once",
"index regeneration; one p04-acceptance validate; separate Opus whole-unit independent review",
"prepare / exactC / integration / final / RootDB join / ledger / main push",
"nativeWindows individually pending"
],
"priority_candidates_if_required": "D05_REMAINING_ORDER_CANDIDATE.json (superseded history)",
"collection_plan": "REPAIR30_STATUS.md",
"collection_plan": "REPAIR51_STATUS.md; Root-only post-submit order",
"formal_acceptance": false,
"original_unit_complete": false,
"phase_order": [
@@ -336,10 +343,11 @@
"phase": "APPLY_COMMANDS",
"handler_id": "simulation_runtime.commands",
"function": "_process_tick_commands",
"registration_line": 369
"registration_line": 375
}
],
"behavior": "Previous minute: commands → _process_tick_commands:5743. Operations gate requests current tick abort and returns before Clock changes; otherwise commands apply for minute+1."
"behavior": "Previous minute: commands → _process_tick_commands:5765. Operations gate requests current tick abort and returns before Clock changes; otherwise commands apply for minute+1.",
"line_authority": "M c0ea009 actual Git source; main handler registration 371-438; operations registration 1787-1791. Explicitly marked ranges remain unverified-M-line."
},
{
"priority": 2,
@@ -350,22 +358,23 @@
"phase": "TIME_BOUNDARIES",
"handler_id": "simulation_runtime.0_weather",
"function": "_advance_weather",
"registration_line": 366
"registration_line": 372
},
{
"phase": "TIME_BOUNDARIES",
"handler_id": "simulation_runtime.a_upkeep",
"function": "_advance_facility_upkeep",
"registration_line": 368
"registration_line": 374
},
{
"phase": "TIME_BOUNDARIES",
"handler_id": "simulation_runtime.operations",
"function": "_advance_operations_time",
"registration_line": 1766
"registration_line": 1787
}
],
"behavior": "After APPLY: absolute_minute += 1, _sync_calendar_fields, _handle_time_boundaries:254 emits settlement_requested(completed_day) then day_started at00:00, before TIME_BOUNDARIES handlers. Handler order: weather, upkeep, operations. Runtime upkeep:1855; operations:1898 → coordinator _process_minute_boundaries:882: 00:00 upkeep, daily close, 06:00 morning, demand, arrivals (conditional boundaries and early returns)."
"behavior": "After APPLY: absolute_minute += 1, _sync_calendar_fields, _handle_time_boundaries:254 emits settlement_requested(completed_day) then day_started at00:00, before TIME_BOUNDARIES handlers. Handler order: weather, upkeep, operations. Runtime upkeep:1876; operations:1919 → coordinator _process_minute_boundaries:882: 00:00 upkeep, daily close, 06:00 morning, demand, arrivals (conditional boundaries and early returns).",
"line_authority": "M c0ea009 actual Git source; main handler registration 371-438; operations registration 1787-1791. Explicitly marked ranges remain unverified-M-line."
},
{
"priority": 3,
@@ -376,10 +385,11 @@
"phase": "MANA",
"handler_id": "simulation_runtime.mana",
"function": "_advance_mana",
"registration_line": 379
"registration_line": 385
}
],
"behavior": "Runtime _advance_mana:10694: proxy preflight → mana_network advance → mana_power_projection.apply → MANA_STATE_CHANGED events."
"behavior": "Runtime _advance_mana:10716: proxy preflight → mana_network advance → mana_power_projection.apply → MANA_STATE_CHANGED events.",
"line_authority": "M c0ea009 actual Git source; main handler registration 371-438; operations registration 1787-1791. Explicitly marked ranges remain unverified-M-line."
},
{
"priority": 4,
@@ -390,10 +400,11 @@
"phase": "CONSTRUCTION",
"handler_id": "simulation_runtime.construction",
"function": "_advance_construction",
"registration_line": 384
"registration_line": 390
}
],
"behavior": "Construction:8064 follows power and precedes logistics."
"behavior": "Construction:8086 follows power and precedes logistics.",
"line_authority": "M c0ea009 actual Git source; main handler registration 371-438; operations registration 1787-1791. Explicitly marked ranges remain unverified-M-line."
},
{
"priority": 5,
@@ -404,10 +415,11 @@
"phase": "LOGISTICS",
"handler_id": "simulation_runtime.logistics",
"function": "_advance_inventory_and_logistics",
"registration_line": 389
"registration_line": 395
}
],
"behavior": "Logistics:8472 precedes completion."
"behavior": "Logistics:8494 precedes completion.",
"line_authority": "M c0ea009 actual Git source; main handler registration 371-438; operations registration 1787-1791. Explicitly marked ranges remain unverified-M-line."
},
{
"priority": 6,
@@ -418,10 +430,11 @@
"phase": "FACILITY_COMPLETION",
"handler_id": "simulation_runtime.facilities",
"function": "_advance_facilities",
"registration_line": 394
"registration_line": 400
}
],
"behavior": "Runtime _advance_facilities:8482: facility_service.advance_one_minute then kitchen. FacilityService _prepare_service_for_tick:853 checks BROKEN, related_facility_operating (RELATED_FACILITY_INACTIVE), power_available (NO_POWER), staff grace. Only ACTIVE services advance (:569). _complete_service:895 → Runtime _complete_service_transaction:11769 → _apply_service_transaction:11785 posts SERVICE_SALE / SERVICE_CASH_SWEEP at the post-increment minute (:11826–11838)."
"behavior": "Runtime _advance_facilities:8504: facility_service.advance_one_minute then kitchen. FacilityService _prepare_service_for_tick:853 checks BROKEN, related_facility_operating (RELATED_FACILITY_INACTIVE), power_available (NO_POWER), staff grace. Only ACTIVE services advance (:569). _complete_service:895 → Runtime _complete_service_transaction:11817 → _apply_service_transaction:11833 posts SERVICE_SALE / SERVICE_CASH_SWEEP at the post-increment minute (:11826–11838 [unverified-M-line]).",
"line_authority": "M c0ea009 actual Git source; main handler registration 371-438; operations registration 1787-1791. Explicitly marked ranges remain unverified-M-line."
},
{
"priority": 7,
@@ -432,10 +445,11 @@
"phase": "VITALS_AND_ENVIRONMENT",
"handler_id": "simulation_runtime.guest_vitals",
"function": "_advance_guest_vitals",
"registration_line": 399
"registration_line": 405
}
],
"behavior": "Guest vitals:8488 follows completion."
"behavior": "Guest vitals:8510 follows completion.",
"line_authority": "M c0ea009 actual Git source; main handler registration 371-438; operations registration 1787-1791. Explicitly marked ranges remain unverified-M-line."
},
{
"priority": 8,
@@ -446,22 +460,23 @@
"phase": "INCIDENTS_AND_EVENTS",
"handler_id": "simulation_runtime.authority_incidents",
"function": "_advance_authority_incidents",
"registration_line": 409
"registration_line": 415
},
{
"phase": "INCIDENTS_AND_EVENTS",
"handler_id": "simulation_runtime.defense",
"function": "_advance_defense",
"registration_line": 414
"registration_line": 420
},
{
"phase": "INCIDENTS_AND_EVENTS",
"handler_id": "simulation_runtime.relationship_events",
"function": "_advance_relationship_events",
"registration_line": 419
"registration_line": 425
}
],
"behavior": "String-sorted authority_incidents:8551 → defense:8577 → relationship_events:8615; after completion/charging."
"behavior": "String-sorted authority_incidents:8573 → defense:8599 → relationship_events:8637; after completion/charging.",
"line_authority": "M c0ea009 actual Git source; main handler registration 371-438; operations registration 1787-1791. Explicitly marked ranges remain unverified-M-line."
},
{
"priority": 9,
@@ -472,10 +487,11 @@
"phase": "FACILITY_QUEUES",
"handler_id": "simulation_runtime.guest_queues",
"function": "_advance_guest_queues",
"registration_line": 404
"registration_line": 410
}
],
"behavior": "_advance_guest_queues:8502 releases closed queues first (_release_closed_business_queues:12624); closed queues spend no patience (:8516–8517)."
"behavior": "_advance_guest_queues:8524 releases closed queues first (_release_closed_business_queues:12672); closed queues spend no patience (:8516–8517 [unverified-M-line]).",
"line_authority": "M c0ea009 actual Git source; main handler registration 371-438; operations registration 1787-1791. Explicitly marked ranges remain unverified-M-line."
},
{
"priority": 10,
@@ -486,10 +502,11 @@
"phase": "AI_DECISIONS",
"handler_id": "simulation_runtime.staff_ai",
"function": "_advance_staff_ai",
"registration_line": 424
"registration_line": 430
}
],
"behavior": "_advance_staff_ai:8658: prune elevator waits, elevators, rescue, staff_service, prune waits, staff_commute (shift handover), staffing sync, cleaning, fatigue, rescue and staffing sync again, then _advance_guest_ai_decisions:8738. DECIDING PLANNED_EXIT → LEAVING; despawn occurs only on later minute (:8760–8762)."
"behavior": "_advance_staff_ai:8680: prune elevator waits, elevators, rescue, staff_service, prune waits, staff_commute (shift handover), staffing sync, cleaning, fatigue, rescue and staffing sync again, then _advance_guest_ai_decisions:8760. DECIDING PLANNED_EXIT → LEAVING; despawn occurs only on later minute (:8760–8762 [unverified-M-line]).",
"line_authority": "M c0ea009 actual Git source; main handler registration 371-438; operations registration 1787-1791. Explicitly marked ranges remain unverified-M-line."
},
{
"priority": 11,
@@ -500,16 +517,17 @@
"phase": "PUBLISH_SNAPSHOT",
"handler_id": "simulation_runtime.snapshot",
"function": "_publish_snapshot",
"registration_line": 374
"registration_line": 380
},
{
"phase": "PUBLISH_SNAPSHOT",
"handler_id": "simulation_runtime.zz_save_checkpoints",
"function": "_process_save_checkpoints",
"registration_line": 431
"registration_line": 437
}
],
"behavior": "snapshot:12476 then zz_save_checkpoints:4514; persistence follows publication."
"behavior": "snapshot:12524 then zz_save_checkpoints:4535; persistence follows publication.",
"line_authority": "M c0ea009 actual Git source; main handler registration 371-438; operations registration 1787-1791. Explicitly marked ranges remain unverified-M-line."
}
],
"safety_cases": [
@@ -519,8 +537,9 @@
"phase": "FACILITY_COMPLETION",
"source": "FacilityService _prepare_service_for_tick:853, ACTIVE-only gate:569, _complete_service:895",
"priority": "Preparation before advance/completion/payment",
"proof": "R/s4.json isolated power; I C and R/s2a.json dependency hold",
"approval": "Dependency hold approved; both D05(a) options preserve safety"
"proof": "ACTUAL S50 native6/24 phases PASS, collector 15+EV missing 0 (historical, bound to S50/Q50); S51 requires fresh native6 (checker:368-371); nativeWindows pending",
"approval": "All six D05 policies approved; pause_reason_scope preserves unresolved sequential interpretation.",
"approval_scope": "See authority_statuses.pause_reason_scope; no sequential display-rule interpretation is claimed."
},
{
"item": "Double-settlement idempotency",
@@ -528,15 +547,17 @@
"phase": "TIME_BOUNDARIES",
"source": "coordinator _process_daily_close:1125; _day_summaries replay:1127–1130; daily-close:N:1137",
"priority": "Before facility completion",
"proof": "I C; R/s2a.json same-boundary replay and separate-PID restore, unchanged accounting"
"proof": "ACTUAL S50 native6/24 phases PASS, collector 15+EV missing 0 (historical, bound to S50/Q50); S51 requires fresh native6 (checker:368-371); nativeWindows pending",
"approval_scope": "See authority_statuses.pause_reason_scope; no sequential display-rule interpretation is claimed."
},
{
"item": "Orphan reservation release",
"status": "original",
"phase": "APPLY_COMMANDS / FACILITY_QUEUES",
"source": "Runtime _execute_leave_facility_queue:7553 (release keys:7565–7569); _leave_guest_queue_boundary:9178; _release_closed_business_queues:12624; _release_closed_business_request:12642",
"source": "Runtime _execute_leave_facility_queue:7575 (release keys:7565–7569 [unverified-M-line]); _leave_guest_queue_boundary:9200; _release_closed_business_queues:12672; _release_closed_business_request:12690",
"priority": "Command release before completion; closed-queue release afterward; closed patience not spent",
"proof": "R/s3.json B2a/B2b/B3/B4b; I C; R/s2a.json reservation/service identity and restore"
"proof": "ACTUAL S50 native6/24 phases PASS, collector 15+EV missing 0 (historical, bound to S50/Q50); S51 requires fresh native6 (checker:368-371); nativeWindows pending",
"approval_scope": "See authority_statuses.pause_reason_scope; no sequential display-rule interpretation is claimed."
}
],
"proof_legend": {
@@ -554,15 +575,22 @@
"A01 midnight ownership upkeep",
"D05-P04-DEPENDENCY",
"D05-P04-SHIFT-1800",
"D-034 direct business closure"
"D-034 direct business closure",
"D05-P04-DESTRUCTION",
"D05-P04-MIDNIGHT-DAY",
"D05-P04-PAUSE-REASON",
"D05-P04-EXIT"
],
"pending D05": [
"a power vs closure/dependency",
"b destruction",
"c exit",
"d cost time/day beyond A01 and18:00"
],
"observed-current": "All phase and source behavior observations; not approval"
"pending D05": [],
"observed-current": "All phase and source behavior observations; not approval",
"pause_reason_scope": {
"authority": "D05_REMAINING_APPROVAL.json:30-33 unchanged; all six approvals remain valid",
"proven": "Same-tick onset from ACTIVE gives RELATED; natively proven only by S5B.",
"sequential": "Power loss first, then dependency closure: M facility_service.gd:860-864 shows NO_POWER. Static observation only; never executed natively. EXPLICITLY UNRESOLVED/UNPROVEN under the original approval text. Not a defect, not cured, not proven, and not silently narrowed into an approved meaning.",
"dependency_first": "Dependency closure first returns at :864 and retains RELATED.",
"safety": "M facility_service.gd:569 ACTIVE gate stops progress and charging and holds reservations in every order; no stopped charging, no double settlement and no orphan reservations do not depend on the label.",
"next_action": "No product change needed for P04 acceptance. Any later change at :860-864 is outside allowed_paths and needs a separate owner-authorised task. Do not amend the contract or ask the owner."
}
},
"full178_applicability_context": "REPAIR29_STATIC_SOURCE.json full_source_static_comparison: full178 selected1339 includes f5; one test-source mismatch (test_required_kitchen.gd), no game-source mismatch; preserve Runner applicability binding, no blanket1338 identity or a61 full proof.",
"current_source_commit": "c0ea009b28a7649aca6a433a1a24dc0be5e7ab81",
@@ -70,7 +70,7 @@ class Series:
('runner-input.json', 'raw-inventory.json', 'execution.json'), NATIVE_PINS[name])]
self.inputs, self.inventory, self.execution = inputs, inventory, execution
source = loads(self.read('source_before.json', {'sha256': self.resolver.manifest['source_before_sha'][self.run]}))
require(source == inputs['source_before'] == self.resolver.manifest['product_source'] and len(source) == 1338,
require(source == inputs['source_before'] == self.resolver.manifest['product_source'],
'source_before product set mismatch')
selected = {k: v['sha256'] for k, v in source.items()}
require(inputs['QA_overrides'] == ['tests/s3/test_runtime_staff_assignment.gd'], 'QA override membership')
@@ -184,7 +184,7 @@ class Series:
def result(self, conditions, facts=None):
return {'series': self.name, 'verified_conditions': sorted(conditions), 'facts': facts or {},
'product_content': PRODUCT, 'relocation_manifest_sha256': MANIFEST_SHA256,
'source_files': 1338, 'owned_pids': self.pids, 'phase_pairs': self.phase_pairs,
'source_files': len(self.resolver.manifest['product_source']), 'owned_pids': self.pids, 'phase_pairs': self.phase_pairs,
'references': self.references,
'relocated_references': self.resolver.used, 'formal_acceptance': False}
@@ -381,6 +381,10 @@ def persistence_pins(s):
pin = s.resolver.manifest['product_source'][path]
source = s.resolver.read(pin['path'], pin)
bodies = function_bodies(source)
if getattr(s, 'fresh', False):
for function, expected in PERSISTENCE_BODIES.items():
require(digest(bodies[function]) == expected, 'fresh persistence function: ' + function)
return
report = loads(s.read_build('audit-support/p04-repair19-close-r01/ROOT_ACTUAL_PERSISTENCE_CALL_CHAIN.json'))
require(digest(source) == report['full_file_sha256'] ==
'871a248ee101b6df543fd5cf0440b5d4b0f02c21fa145a99f0687888c1bc6f90', 'persistence whole-source pin')
@@ -993,6 +997,23 @@ def verify_s4_engine(pin, identity):
all(value == pin for value in identity['during']), 'S4 before/during/after engine identity')
S4_HISTORICAL_WRAPPER_SHA256 = '2d3be39d2b310abac058e27336ac816c234043a0a1dd7b2c52d84994907dd31b'
S4_HISTORICAL_WRAPPER = HERE / 's4/historical/run_s4_native_r28.py.reference'
def verify_s4_wrapper(receipt_sha256, *, historical):
if historical:
# befa0ef1f634e734ee156347e8fd02e82eddea49:s4/run_s4_native.py
# Never read the mutable current wrapper in this branch.
expected = digest(S4_HISTORICAL_WRAPPER.read_bytes())
require(expected == S4_HISTORICAL_WRAPPER_SHA256, 'S4 tampered historical wrapper pin')
require(receipt_sha256 == expected, 'S4 historical receipt wrapper pin')
else:
require(receipt_sha256 != S4_HISTORICAL_WRAPPER_SHA256, 'S4 historical pin in fresh receipt')
require(receipt_sha256 == digest((HERE / 's4/run_s4_native.py').read_bytes()),
'S4 current receipt wrapper pin')
class S4Series(Series):
"""Fresh S4: own-B materials and exact installed engine; profiles are provenance."""
def __init__(self, build):
@@ -1006,14 +1027,14 @@ class S4Series(Series):
inputs, execution = self.inputs, self.execution
source = loads(self.read('source_before.json'))
product = self.resolver.manifest['product_source']
require(set(source) == set(product) and len(source) == 1338 and
require(set(source) == set(product) and
source == inputs['source_before'] == loads(self.read('source_after.json')), 'S4 complete unchanged product set')
for name, pin in source.items():
require(all(pin[k] == product[name][k] for k in ('bytes', 'sha256')), 'S4 product pin')
self.resolver.read(product[name]['path'], product[name])
qa = HERE / 's4/p04_s4_power_probe.gd'
require(inputs['QA']['sha256'] == digest(qa.read_bytes()) and
inputs['wrapper_sha256'] == digest((HERE / 's4/run_s4_native.py').read_bytes()), 'S4 exact QA/wrapper version')
require(inputs['QA']['sha256'] == digest(qa.read_bytes()), 'S4 exact QA version')
verify_s4_wrapper(inputs['wrapper_sha256'], historical=True)
selected = {k: v['sha256'] for k, v in source.items()}
require(inputs['QA_overrides'] == ['tests/s3/test_runtime_staff_assignment.gd'], 'S4 sole QA override')
selected[inputs['QA_overrides'][0]] = digest(qa.read_bytes())
@@ -1221,6 +1242,227 @@ def verify_s3(build):
return s.result(conditions, facts)
FRESH_RUNS = ('s1', 's2a', 's2b', 's3', 's4', 's5')
FRESH_BINDINGS = 'audit-support/p04-fresh-runs.json'
def fresh_bindings(build):
value = loads(ordinary(Path(build) / FRESH_BINDINGS).read_bytes())
require(value['protocol'] == 'p04-fresh-runs-v1' and set(value['series']) == set(FRESH_RUNS),
'Root fresh run binding roster')
return value
class FreshResolver:
def __init__(self, source):
self.manifest = {'product_source': source}
self.allowed = {r['path']: r for r in source.values()}
self.used = {}
def read(self, path, pin):
require(path in self.allowed and pin == self.allowed[path], 'fresh source membership')
data = checked(ordinary(path).read_bytes(), pin, path)
self.used[path] = pin
return data
class FreshSeries(Series):
"""Actual Root input/receipt pins; no historical native pin or relocation fallback."""
fresh = True
def __init__(self, build, name):
self.name, self.build = name, Path(build).resolve(strict=True)
bindings = fresh_bindings(self.build)
binding = bindings['series'][name]
self.run = binding['run']
require(not Path(self.run).is_absolute() and '..' not in Path(self.run).parts, 'fresh run relative path')
self.base = self.build / self.run
self.references, self.nodes, self.pids, self.phase_pairs = {}, {}, [], 0
self.inputs = loads(self.read('runner-input.json', binding['runner_input']))
self.execution = loads(self.read('runner-ended.json', binding['runner_ended']))
require(self.inputs['mode'] == 'fresh-q' and not self.inputs['historical_r17'], 'fresh input only')
if name == 's4':
verify_s4_wrapper(self.inputs['wrapper_sha256'], historical=False)
provenance = self.inputs['provenance']
require(all(provenance[k] == bindings[k] for k in ('M', 'S', 'Q_tree')), 'same fresh Q across all runs')
self.source = loads(self.read('source_before.json'))
require(self.source == self.inputs['source_before'] == loads(self.read('source_after.json')), 'whole fresh source before/after')
self.resolver = FreshResolver(self.source)
for pin in self.source.values():
self.resolver.read(pin['path'], pin)
qa = self.inputs['QA']
checked(ordinary(qa['path']).read_bytes(), qa, 'fresh QA')
require(self.inputs['QA_overrides'] == ['tests/s3/test_runtime_staff_assignment.gd'], 'single fresh QA override')
selected = {k: v['sha256'] for k, v in self.source.items()}
selected[self.inputs['QA_overrides'][0]] = qa['sha256']
require(self.inputs['selected_source_map'] == selected, 'fresh selected manifest')
for pin in self.inputs['fixed_input_pins']:
checked(ordinary(pin['path']).read_bytes(), pin, 'fresh fixed input')
execution = self.execution
require(execution['passed'] is True and execution['error'] is None
and execution['guard_errors'] == execution['cleanup_errors'] == [], 'fresh native guards')
require([p['phase'] for p in execution['phases']] == ['import', 'parse', 'writer', 'reader'], 'fresh four phases')
for phase_row in execution['phases']:
require(phase_row['passed'] is True and phase_row['engine_ended'] is True, 'fresh phase passed/ended')
self.ownership(phase_row)
require(len(set(self.pids)) == 4 and self.pids == execution['actual_captured_PIDs'], 'fresh PID roster')
pid_set = loads(self.read('PID-set.json'))
require(pid_set['engine_PIDs'] == self.pids and
pid_set['owner_runner_pid'] == self.inputs['owner_runner_pid'], 'fresh PID set binding')
require(len(execution['cleanup']) == 4 and all(r['engine_ended'] is True for r in execution['cleanup']), 'fresh strict cleanup')
for row in execution['cleanup']:
cleanup = row['cleanup']
require(row['outer_cleanup_errors'] == [] and cleanup['errors'] == []
and cleanup['actual_process_exit_code'] == 0 and cleanup['attempts'], 'fresh cleanup errors')
require(all(a['errors'] == [] and a['kill_attempted'] is False
and a['wait_completed'] is True and a['wait_returned_code'] == 0
for a in cleanup['attempts']), 'fresh cleanup abnormal wait')
self.inventory = loads(self.read('raw-inventory.json', binding['raw_inventory']))
for name, pin in self.inventory.items():
self.read('raw/' + name, pin)
if self.name in ('s1', 's2a', 's2b', 's3'):
for path in self.inventory:
if path.startswith('writer-') and '-phase-' in path:
other = 'reader-' + path[len('writer-'):]
require(other in self.inventory and self.read('raw/' + path) == self.read('raw/' + other),
'fresh altered phase pair')
if path.endswith('.var'): self.phase_pairs += 1
if self.name == 's3':
require(self.phase_pairs == 176, 'unchanged S3 complete phase roster')
wrapper_path = Path(__file__).parent / 's5/run_s5_native.py'
import importlib.util
spec = importlib.util.spec_from_file_location('fresh_series_wrapper', wrapper_path)
wrapper = importlib.util.module_from_spec(spec)
require(all(not p.is_symlink() for p in (wrapper_path, *wrapper_path.parents)),
'fresh wrapper ordinary path')
exec(compile(wrapper_path.read_bytes(), str(wrapper_path), 'exec'), wrapper.__dict__)
if self.name == 's4':
admission = wrapper.module('fresh_s4_admission', HERE / 's4/run_s4_native.py')
product = {n: p for n, p in selected.items() if n != admission.CHECKER}
paths = loads(self.read('parse-paths.json'))
admission.admission(selected, product, paths)
require(paths == self.inputs['parse_paths'], 'S4 plan/actual parse roster')
root = Path(self.inputs['project_root'])
runner = wrapper.module('fresh_series_runner', root / 'tools/run_all_tests.py')
refs = dict(self.source)
refs[self.inputs['QA_overrides'][0]] = qa
uid_plan, uid_snapshot, uid_binding = wrapper.load_uid_helper(root, runner, self.source)
plan = uid_plan(refs)
require(plan == self.inputs['uid_plan'], 'independently derived fresh UID plan')
source = {n: {k: p[k] for k in ('bytes', 'sha256')} for n, p in refs.items()}
accepted = uid_snapshot(self.base / 'stage', source, plan)
require(accepted == loads(self.read('accepted-uids.json')), 'retained fresh UID seal')
for role in ('import', 'parse', 'writer', 'reader'):
require(loads(self.read(role + '-uids.json')) ==
{'before': {} if role == 'import' else accepted, 'after': accepted}, 'phase UID seals')
require(wrapper.engine_pin(Path(self.inputs['engine']['path'])) == self.inputs['engine'], 'fresh engine identity')
if self.name == 's5':
verify_s4_engine(self.inputs['engine'], execution['engine_identity'])
else:
observations = loads(self.read('fresh-engine-checks.json'))
require([r['label'] for r in observations] ==
['fixed', 'before-import', 'before-parse', 'before-writer', 'before-reader', 'fixed'],
'fresh engine observation roster')
require(all(r['descriptor'] == self.inputs['engine'] for r in observations), 'fresh engine drift')
self.formal_pin = binding['formal_relocation']
self.formal()
def formal(self):
before = self.execution['formal_before']
require(before and before == self.execution['formal_after'], 'fresh formal source unchanged')
relocated = loads(self.read('formal-relocation.json', self.formal_pin))
require(set(relocated) == {'writer', 'reader'}, 'fresh whole formal mirror')
writer, reader = [loads(self.read('raw/' + role + '.json')) for role in ('writer', 'reader')]
require(writer['profile'] != reader['profile'] and writer['pid'] != reader['pid'], 'fresh independent Reader')
inodes = set()
for role in ('writer', 'reader'):
receipt = loads(self.read('raw/' + role + '.json'))
require(set(receipt['slots']) == set(before) == set(relocated[role]), 'fresh formal roster')
for slot, original in receipt['slots'].items():
row = relocated[role][slot]
require(row['provenance'] == original and row['members'] == before[slot], 'fresh restore manifest binding')
require(set(row['members']) == {'journal.log', 'manifest.json', 'thumbnail.png', 'world.bin'}, 'all four members')
require(row['relative'] == 'formal/' + role + '/' + slot and
{p.name for p in (self.base / row['relative']).iterdir()} == set(row['members']),
'exact formal directory membership')
for member, pin in row['members'].items():
self.read(row['relative'] + '/' + member, pin)
st = ordinary(self.base / row['relative'] / member).stat()
require((st.st_dev, st.st_ino) not in inodes, 'formal independent inodes')
inodes.add((st.st_dev, st.st_ino))
def result(self, conditions, facts=None):
return {'series': self.name, 'mode': 'fresh-q', 'verified_conditions': sorted(set(conditions)),
'facts': facts or {}, 'provenance': self.inputs['provenance'],
'source_files': len(self.source), 'owned_pids': self.pids,
'references': self.references, 'formal_acceptance': False}
def verify_fresh_s1(build):
s = FreshSeries(build, 's1')
return s.result(s1_semantics(s))
def verify_fresh_s2a(build):
s = FreshSeries(build, 's2a')
return s.result(s2a_semantics(s))
def verify_fresh_s2b(build):
s = FreshSeries(build, 's2b')
return s.result(s2b_semantics(s))
def verify_fresh_s3(build):
s = FreshSeries(build, 's3')
conditions, facts = s3_semantics(s)
# Event B4 is historical case logic, never the approved automatic-raid gate.
return s.result([c for c in conditions if c != 'destruction_stop'], facts)
def verify_fresh_s4(build):
s = FreshSeries(build, 's4')
S4Series.formal_s4(s)
return s.result(['power_stop'], power_stop(s))
def verify_fresh_s5(build):
s = FreshSeries(build, 's5')
import importlib.util
path = Path(__file__).parent / 's5/s5_order_adapter.py'
spec = importlib.util.spec_from_file_location('fresh_order_adapter', path)
adapter = importlib.util.module_from_spec(spec)
require('..' not in path.parts and all(not p.is_symlink() for p in (path, *path.parents)),
'S5 adapter ordinary package path')
adapter_bytes = path.read_bytes()
exec(compile(adapter_bytes, str(path), 'exec'), adapter.__dict__)
# Transport-only observations are retained by collect(), outside s5.json.
global S5_DEPENDENCY_INVOCATION
S5_DEPENDENCY_INVOCATION = {
'checkout': str(HERE.parents[4]),
'adapter': {'path': str(path.absolute()), 'sha256': digest(adapter_bytes)},
'dependencies': dict(adapter.DEPENDENCY_OBSERVATIONS),
'dependency_sha256': dict(adapter.DEPENDENCIES),
}
arguments = (s.base / 'raw', s.inventory['writer.json']['sha256'], s.inventory['reader.json']['sha256'])
power = adapter.power.derive(*arguments)
order = adapter.derive(*arguments)
require(set(order['cases']) == set(adapter.DERIVERS)
and set(power['cases']) == set(adapter.power.CASES), 'complete fresh adapter case sets')
conditions = ['power_stop', 'dependency_stop', 'recovery_completion', 'destruction_stop', 'exit_release',
'midnight_settlement', 'midnight_replay', 'save_restore', 'shift_completion',
'paused_midnight', 'same_minute_replay']
require(order['cases']['S5D_DESTRUCTION_RAID']['G1'] is True
and order['cases']['S5D_IN_FLIGHT']['G2'] is True
and order['cases']['S5D_DESTRUCTION_RAID']['idle_objective_breach'] is True
and order['cases']['S5D_PAID_BEFORE_INCIDENT']['paid_before_incident'] is True,
'fresh destruction requires both guards and exact-N idle breach')
for case, key in [('S5G_SHIFT_1080', 'shift_completion'), ('S5H_PAUSED_MIDNIGHT', 'paused_midnight'),
('S5E_MIDNIGHT', 'same_minute_replay')]:
require(type(order['cases'][case][key]) is dict, 'fresh typed adapter derivation: ' + key)
return s.result(conditions, {'power': power, 'order': order})
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--build', type=Path, required=True)
@@ -0,0 +1,160 @@
#!/usr/bin/env python3
"""Runner-only retained-raw identity controls; no engine or acceptance run."""
import argparse
import copy
import hashlib
import importlib.util
import json
from pathlib import Path
import shutil
import sys
import tempfile
sys.dont_write_bytecode = True
HERE = Path(__file__).resolve().parent
def load(path, name):
spec = importlib.util.spec_from_file_location(name, path)
value = importlib.util.module_from_spec(spec)
exec(compile(path.read_bytes(), str(path), 'exec'), value.__dict__)
return value
def rejects(call):
try:
call()
except (ValueError, OSError, KeyError, TypeError):
return
raise AssertionError('negative admitted')
def tree(root):
rows = {}
for p in root.rglob('*'):
if p.is_file():
digest = hashlib.sha256()
with p.open('rb') as source:
for chunk in iter(lambda: source.read(1024 * 1024), b''):
digest.update(chunk)
rows[p.relative_to(root).as_posix()] = digest.hexdigest()
return rows
# Explicit audited package-local closure; see REPAIR49_STATUS.md.
CLOSURE = ('build_p04_index.py', 'bulk_reader_equivalence.py', 'checker_applicability_fixtures.py', 'checker_approval_fixtures.py', 'checker_candidate_fixtures.py', 'checker_encoder_fixtures.py', 'checker_join_fixtures.py', 'checker_native_fixtures.py', 'checker_negative_fixtures.py', 'checker_role_fixtures.py', 'checker_series_fixtures.py', 'collect_p04_native.py', 'full_suite_verifier.py', 'normal_c_join.py', 'normal_c_join_fixtures.py', 'p04_native_series.py', 'repair48_identity_controls.py', 'repair48_transport_controls.py', 's1/S1_ROOT_RUN.md', 's1/p04_s1_ev_power_probe.gd', 's1/run_s1_native.py', 's2/S2_ROOT_RUN.md', 's2/p04_s2a_midnight_probe.gd', 's2/run_s2a_native.py', 's2b/S2B_ROOT_RUN.md', 's2b/p04_s2b_shift_probe.gd', 's2b/run_s2b_native.py', 's3/S3_ROOT_RUN.md', 's3/p04_s3_closure_probe.gd', 's3/run_s3_native.py', 's4/S4_ROOT_RUN.md', 's4/admission_controls.py', 's4/engine_identity_negative_fixtures.py', 's4/p04_s4_power_probe.gd', 's4/phase_cut_regression.py', 's4/receipt_lifecycle_fixtures.py', 's4/run_s4_native.py', 's5/S5_ROOT_RUN.md', 's5/p04_s5_power_probe.gd', 's5/repair44_controls.py', 's5/run_s5_native.py', 's5/s5_guard_oracle.py', 's5/s5_order_adapter.py', 's5/s5_order_adapter_controls.py', 's5/s5_power_adapter.py', 's5/s5_power_adapter_controls.py', 's5/s5_uid_controls.py', 's5/s5_wrapper_fixtures.py', 'scratch_fixture_adapter.py')
def package_snapshot(root):
root = Path(root).absolute()
rows = {}
for name in CLOSURE:
relative = Path(name)
if relative.is_absolute() or '..' in relative.parts:
raise ValueError('closure traversal/outside')
path = root / relative
if (any(p.is_symlink() for p in (path, *path.parents))
or not path.resolve(strict=True).is_relative_to(root.resolve(strict=True))
or not path.is_file()):
raise ValueError('closure missing/symlink/outside: ' + name)
data = path.read_bytes()
rows[name] = {'bytes': len(data), 'sha256': hashlib.sha256(data).hexdigest()}
encoded = json.dumps(rows, sort_keys=True, separators=(',', ':')).encode()
return {'files': rows, 'tree_sha256': hashlib.sha256(encoded).hexdigest()}
def run(args):
raw = args.raw.resolve(strict=True)
with tempfile.TemporaryDirectory(prefix='p04-r48-identity-') as directory:
base = Path(directory).resolve()
suffix = Path('docs/plans/original-completion-2026-10-02/execution/p04-01')
packages = [base / name / suffix for name in ('first', 'second')]
original_package = package_snapshot(HERE)
names = [Path(name) for name in CLOSURE]
for package in packages:
for relative in names:
target = package / relative
target.parent.mkdir(parents=True, exist_ok=True)
shutil.copyfile(HERE / relative, target)
snapshots_before = [package_snapshot(root) for root in (HERE, *packages)]
assert all(row == original_package for row in snapshots_before)
a, b = [load(p / 's5/s5_order_adapter.py', 'identity_' + str(i))
for i, p in enumerate(packages)]
first = a.derive(raw, args.writer_sha, args.reader_sha)
assert b.derive(raw, args.writer_sha, args.reader_sha) == first
assert a.DEPENDENCY_OBSERVATIONS != b.DEPENDENCY_OBSERVATIONS
if args.build:
build = args.build.resolve(strict=True)
before = tree(build)
# These independent packages execute the same complete analysis bytes.
native = [load(p / 'p04_native_series.py', 'native_' + str(i))
for i, p in enumerate(packages)]
assert native[0].verify_fresh_s5(build) == native[1].verify_fresh_s5(build)
original_builder = load(HERE / 'build_p04_index.py', 'original_builder')
gate = original_builder.checker()
builders = [load(p / 'build_p04_index.py', 'builder_' + str(i))
for i, p in enumerate(packages)]
assert builders[0].payload(build, gate) == builders[1].payload(build, gate)
assert tree(build) == before
snapshots_after = [package_snapshot(root) for root in (HERE, *packages)]
assert snapshots_after == snapshots_before
missing = packages[1] / 's5/p04_s5_power_probe.gd'
saved = missing.read_bytes()
missing.unlink()
rejects(lambda: package_snapshot(packages[1]))
missing.write_bytes(saved)
assert package_snapshot(packages[1]) == original_package
for kind in ('byte', 'missing', 'extra', 'mapping'):
original = copy.deepcopy(a.DEPENDENCIES)
key = next(iter(original))
if kind == 'byte':
a.DEPENDENCIES[key] = '0' * 64
elif kind == 'missing':
del a.DEPENDENCIES[key]
elif kind == 'extra':
a.DEPENDENCIES['extra.py'] = '0' * 64
else:
a.DEPENDENCY_OBSERVATIONS[key] = '/outside-package.py'
rejects(lambda: a.derive(raw, args.writer_sha, args.reader_sha))
a.DEPENDENCIES.clear()
a.DEPENDENCIES.update(original)
a.DEPENDENCY_OBSERVATIONS.update(a._EXECUTED_OBSERVATIONS)
target = packages[1] / 's5/s5_guard_oracle.py'
target.write_bytes(target.read_bytes() + b'\n')
changed = load(packages[1] / 's5/s5_order_adapter.py', 'changed_identity')
assert changed.DEPENDENCIES != a.DEPENDENCIES
# Reject the changed payload at the same equality boundary used for recomputation.
rejects(lambda: a.require(changed.derive(raw, args.writer_sha, args.reader_sha) == first,
'fresh raw recomputation drift'))
target.unlink()
target.symlink_to(packages[0] / 's5/s5_guard_oracle.py')
rejects(lambda: load(packages[1] / 's5/s5_order_adapter.py', 'symlink_identity'))
rejects(lambda: a.module('outside_identity', HERE / 's5/s5_guard_oracle.py'))
target.unlink()
target.write_bytes((HERE / 's5/s5_guard_oracle.py').read_bytes())
assert [package_snapshot(root) for root in (HERE, *packages)] == snapshots_before
if args.build:
# A retained complete B is required. Never call the registered checker main().
builder = load(HERE / 'build_p04_index.py', 'identity_builder')
build = args.build.resolve(strict=True)
before = tree(build)
first = builder.payload(build)
assert builder.payload(build) == first and tree(build) == before
changed = copy.deepcopy(first)
changed['runner_material_relocation']['sha256'] = '0' * 64
rejects(lambda: builder.require(changed == builder.payload(build), 'index recomputation mismatch'))
rejects(lambda: builder.checker().supplied_file(build, {
'path': '/outside-B/material', 'bytes': 0, 'sha256': '0' * 64}))
assert package_snapshot(HERE) == original_package
print(json.dumps({'identity_controls': 'pass', 'complete_B_controls': bool(args.build),
'formal_acceptance': False,
'closure_before': snapshots_before, 'closure_after': snapshots_after}))
if __name__ == '__main__':
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--raw', type=Path, required=True)
parser.add_argument('--writer-sha', required=True)
parser.add_argument('--reader-sha', required=True)
parser.add_argument('--build', type=Path)
run(parser.parse_args())
@@ -0,0 +1,159 @@
#!/usr/bin/env python3
"""Runner-only, engine-free retained-copy transport controls. No acceptance."""
import argparse
import copy
import hashlib
import importlib.util
import json
from pathlib import Path
import tempfile
from unittest.mock import patch
import sys
sys.dont_write_bytecode = True
spec = importlib.util.spec_from_file_location('transport', Path(__file__).with_name('build_p04_index.py'))
builder = importlib.util.module_from_spec(spec)
spec.loader.exec_module(builder)
def sha(data):
return hashlib.sha256(data).hexdigest()
def tree(root):
return {p.relative_to(root).as_posix(): sha(p.read_bytes())
for p in root.rglob('*') if p.is_file()}
def rejects(call):
try:
call()
except (ValueError, OSError, KeyError, TypeError):
return
raise AssertionError('negative admitted')
def run(retained):
manifest = json.loads((retained / 'REAL_S47_PINNED_MATERIAL_COPIES.json').read_bytes())
inputs, sources = {}, {}
for name, row in manifest['series'].items():
data = (retained / row['raw_input']).read_bytes()
assert len(data) == row['bytes'] and sha(data) == row['sha256']
inputs[name] = json.loads(data)
for original, row in manifest['materials'].items():
data = (retained / row['retained_copy']).read_bytes()
assert len(data) == row['bytes'] and sha(data) == row['sha256']
sources[original] = data
assert any('p04-fresh-context-r47' in p for p in sources)
assert any('P04-01-root-q-r47' in p for p in sources)
original_checked = builder.checked_material
def retained_checked(path, pin):
if str(path) in sources:
data = sources[str(path)]
builder.require(len(data) == pin['bytes'] and sha(data) == pin['sha256'], 'retained pin')
return data
return original_checked(path, pin)
with tempfile.TemporaryDirectory(prefix='p04-repair48-') as directory:
build = Path(directory).resolve()
with patch.object(builder, 'series_inputs', return_value=inputs), \
patch.object(builder, 'checked_material', side_effect=retained_checked):
output = build / 'p04-evidence'
rejects(lambda: builder.relocate_materials(build, build / 'wrong'))
assert not output.exists()
builder.relocate_materials(build, output)
rejects(lambda: builder.relocate_materials(build, output))
before = tree(build)
first = builder.relocated_materials(build)
assert builder.relocated_materials(build) == first and tree(build) == before
map_path = output / 'runner-materials/RELOCATION.json'
map_bytes = map_path.read_bytes()
mapping = json.loads(map_bytes)
identities = {(pin['path'], pin['bytes'], pin['sha256'])
for raw in inputs.values() for pin in raw['fixed_input_pins'] + [raw['QA']]}
assert len({row['relative'] for rows in mapping.values() for row in rows.values()}) == len(identities)
series = next(iter(inputs))
original = next(iter(mapping[series]))
target = output / mapping[series][original]['relative']
data = target.read_bytes()
target.write_bytes(data + b'x')
rejects(lambda: builder.relocated_materials(build))
target.write_bytes(data)
target.unlink()
target.symlink_to(map_path)
rejects(lambda: builder.relocated_materials(build))
target.unlink()
target.write_bytes(data)
for kind in ('missing', 'extra', 'mapping', 'traversal', 'external'):
changed = copy.deepcopy(mapping)
if kind == 'missing':
del changed[series][original]
elif kind == 'extra':
changed[series]['/extra'] = changed[series][original]
else:
changed[series][original]['relative'] = {
'mapping': 'runner-materials/wrong', 'traversal': '../outside',
'external': '/outside-B'}[kind]
map_path.write_text(json.dumps(changed))
rejects(lambda: builder.relocated_materials(build))
map_path.write_bytes(map_bytes)
extra = output / 'runner-materials/unmapped'
extra.write_bytes(b'extra')
rejects(lambda: builder.relocated_materials(build))
extra.unlink()
for digest in ('0' * 64, None):
altered = copy.deepcopy(inputs)
altered[series]['wrapper_sha256'] = digest
with patch.object(builder, 'series_inputs', return_value=altered):
rejects(lambda: builder.relocated_materials(build))
# A second distinct pin carrying wrapper bytes is ambiguous.
altered = copy.deepcopy(inputs)
wrapper = next(p for p in altered[series]['fixed_input_pins']
if p['sha256'] == altered[series]['wrapper_sha256'])
altered[series]['fixed_input_pins'].append(dict(wrapper, path='/different-wrapper'))
with patch.object(builder, 'series_inputs', return_value=altered):
rejects(lambda: builder.relocated_materials(build))
assert tree(build) == before
raw = copy.deepcopy(next(iter(inputs.values())))
pin = copy.deepcopy(raw['QA'])
raw['fixed_input_pins'].append(pin)
assert len(builder.pin_roster(raw)) == len({p['path'] for p in raw['fixed_input_pins'] + [raw['QA']]})
with tempfile.TemporaryDirectory(prefix='p04-r48-dedup-') as directory:
build = Path(directory).resolve()
with patch.object(builder, 'series_inputs', return_value={'s1': raw}), \
patch.object(builder, 'checked_material', side_effect=retained_checked):
mapping = builder.relocate_materials(build, build / 'p04-evidence')
assert len(mapping['s1']) == len(builder.pin_roster(raw))
builder.relocated_materials(build)
raw['fixed_input_pins'].append(dict(pin, bytes=pin['bytes'] + 1))
rejects(lambda: builder.pin_roster(raw))
rejects(lambda: builder.ordinary('/a/../b'))
changed = copy.deepcopy(inputs)
series = next(iter(changed))
changed[series]['QA']['sha256'] = '0' * 64
rejects(lambda: builder.all_rosters(changed))
# Exercise the actual immutable checker's role binding predicate, with
# simulated Git observations only. No objects, refs or checkouts are written.
gate = builder.checker()
old = next(iter(inputs.values()))['provenance']
new_submission, composed = 'f' * 40, 'e' * 40
assert old['S'] != new_submission
with patch.object(gate, 'actual_checkout', return_value=(new_submission, composed, {})), \
patch.object(gate, '_GIT_ENV', {}), \
patch.object(gate, 'ancestor', return_value=False), \
patch.object(gate, 'submission_role'), \
patch.object(gate, 'git_bytes', return_value=composed.encode()):
try:
gate.verify_roles({'fresh_run_bindings': old}, Path('/retained-B'))
except ValueError as error:
assert str(error) == 'fresh evidence does not bind recomputed Q'
else:
raise AssertionError('old S47 bindings admitted under new S')
print(json.dumps({'retained_S47_transport_controls': 'pass', 'formal_acceptance': False}))
if __name__ == '__main__':
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--retained', type=Path, required=True)
run(parser.parse_args().retained.resolve(strict=True))
@@ -0,0 +1,44 @@
#!/usr/bin/env python3
"""Root-only engine-free whole-read/stream SHA equivalence controls."""
import hashlib
import importlib.util
import json
from pathlib import Path
import sys
import tempfile
import time
sys.dont_write_bytecode = True
def main():
started = time.monotonic()
path = Path(__file__).with_name('repair48_identity_controls.py')
spec = importlib.util.spec_from_file_location('r50_identity', path)
module = importlib.util.module_from_spec(spec)
exec(compile(path.read_bytes(), str(path), 'exec'), module.__dict__)
chunk = 1024 * 1024 # Implementation boundary, never an acceptance limit.
with tempfile.TemporaryDirectory(prefix='p04-r50-stream-') as directory:
root = Path(directory)
(root / 'empty').write_bytes(b'')
(root / '日本語🌳').write_bytes('木と水\n🌳'.encode())
(root / 'binary').write_bytes(bytes(range(256)) * 5)
for size in (chunk - 1, chunk, chunk + 1, chunk * 3 + 17):
(root / str(size)).write_bytes((bytes(range(256)) * (size // 256 + 1))[:size])
with (root / 'sparse').open('wb') as stream:
stream.seek(chunk * 4 + 3)
stream.write(b'\xff')
nested = root / 'nested'
nested.mkdir()
(nested / '全bytes').write_bytes(b'\x00\xff\x80\n')
whole = {p.relative_to(root).as_posix(): hashlib.sha256(p.read_bytes()).hexdigest()
for p in root.rglob('*') if p.is_file()}
streamed = module.tree(root)
assert list(streamed) == list(whole), 'same traversal/key insertion order'
assert streamed == whole, 'complete SHA map equality'
print(json.dumps({'stream_equivalence': 'pass', 'files': whole,
'elapsed': time.monotonic() - started, 'formal_acceptance': False}, sort_keys=True))
if __name__ == '__main__':
main()
@@ -1,3 +1,26 @@
## REPAIR49 normal-gate handoff
Required materials: exact B/native-first-current and fresh-run registry; each
runner-input/ended/source/UID/formal/raw/lifecycle receipt; original recorded Q
and engine context; B/p04-evidence/runner-materials and RELOCATION.json; matching
collection/MANIFEST and separate dependency invocation; original full run and
full_suite binding/raw receipts; final index and invocation receipt; immutable
authorities in frozen checkout. No raw or historical receipt is rewritten.
Two-placement identity requires the explicit closure in repair48_identity_controls.py,
missing-file rejection, and original/A/B complete path/bytes/SHA tables and tree
hash equality before and after positive execution. See REPAIR49_STATUS.md.
Submission is followed by new Q freeze, affected pure controls (complete_B included),
clean exact-Q check-only, capacity/PID checks, one fresh native lease for
S1/S2a/S2b/S3/S4 and all ten S5 cases, readers/adapters, 15EV collector, full
verification/binding under the conditions below (or one final full184 if any
condition fails), index generation, p04-acceptance once, separate Opus whole-unit
review, normal prepare/C/integration/final/Root DB join/ledger/main push.
If order-typed fails, preserve its result and stop before heavy execution.
Only whole-unit acceptance grants credit.
REPAIR48 current source status: see [REPAIR48_STATUS.md](../REPAIR48_STATUS.md). Earlier run directions and successes below are historical; they grant no P04 credit.
# S1 Root run(コード準備のみ)
S1コード準備完了・未実測・原P04 whole未達。D05 pending、A未検証。
@@ -2,6 +2,7 @@
"""S1-only native entry. --check-only never loads ownership helpers or starts Godot."""
from pathlib import Path
import argparse
import copy
import hashlib
import importlib.util
import json
@@ -52,16 +53,39 @@ def main():
parser.add_argument("--cache-run", type=Path, default=CACHE_RUN)
parser.add_argument("--godot", type=Path, default=ENGINE)
parser.add_argument("--check-only", action="store_true")
parser.add_argument("--main")
parser.add_argument("--submission")
parser.add_argument("--tested-tree")
parser.add_argument("--historical-r17", action="store_true")
args = parser.parse_args()
shared = module("fresh_q_shared", HERE.parent / "s5/run_s5_native.py")
mode = shared.select_mode(args)
fresh = mode == "fresh-q"
if fresh and "--project-root" not in sys.argv:
raise ValueError("fresh-q requires explicit --project-root")
if fresh and "--cache-run" not in sys.argv:
args.cache_run = None
engine_descriptor = shared.engine_pin(args.godot) if fresh else None
provenance = None
if args.project_root.is_symlink():
raise ValueError("project root symlink")
root = args.project_root.resolve()
out = args.output.resolve()
if fresh:
if not out.is_relative_to(BUILD.resolve()) or not args.plan.resolve().is_relative_to(BUILD.resolve()):
raise ValueError("fresh plan/output must stay inside BUILD")
if out.exists() or out.is_symlink() or (args.check_only and args.plan.exists()):
raise ValueError("fresh output and plan required")
r = module("s1_standard_runner", root / "tools/run_all_tests.py")
# Preserve the reviewed source_refs -> exactly one QA override order.
source_before = r.source_refs(root)
if fresh:
provenance = shared.fresh_q_guard(root, args.main, args.submission, args.tested_tree)
refs = dict(source_before)
refs[TEST] = pin(QA)
expected = {n: dict(bytes=p["bytes"], sha256=p["sha256"]) for n, p in refs.items()}
fixed = [pin(p) for p in MATERIALS + [
fixed = [pin(p) for p in ([] if fresh else MATERIALS) + [
QA, Path(__file__), HERE / "S1_ROOT_RUN.md",
root / "tests/transport/test_runtime_transport.gd",
root / "tests/staff/test_rescue_elevator.gd",
@@ -70,7 +94,7 @@ def main():
selected = dict(root_before=source_before, map={n: p["sha256"] for n, p in refs.items()}, timeout=1200)
cache_note = None
cache_receipts = []
for leaf in ["runner-ended.json", "runner-input.json"]:
for leaf in (["runner-ended.json", "runner-input.json"] if args.cache_run is not None else []):
path = args.cache_run / leaf
try:
cache_receipts.append(pin(path))
@@ -84,6 +108,16 @@ def main():
cache_receipts=cache_receipts, cache_access=cache_note,
phases=["import", "parse", "writer", "reader"],
native_engine_launches=0, whole_goal_accepted=False, unit_accepted=False)
if fresh:
uid_plan, uid_snapshot, uid_binding = shared.load_uid_helper(root, r, source_before)
uid_source = copy.deepcopy(expected)
uid_plan_map = uid_plan(refs)
plan.update(protocol="p04-s1-fresh-q-v1", mode=mode, provenance=provenance, engine=engine_descriptor,
engine_sha256=engine_descriptor["sha256"], uid_helper=uid_binding,
uid_plan=uid_plan_map, import_mode="fresh" if args.cache_run is None else "cache",
historical_r17=False, fresh_q_evidence=False)
fixed.append(pin(HERE.parent / "s5/run_s5_native.py"))
# No historical execution is admitted.
# Check-only only reads source/materials and writes the plan in task build.
# It deliberately does not read default-player data, inspect processes or stat Godot.
if args.check_only:
@@ -96,18 +130,30 @@ def main():
QA_overrides=[TEST], fixed_pins=len(fixed), plan=str(args.plan),
plan_sha256=r.sha(args.plan), cache_access=cache_note), ensure_ascii=False))
return 0
r.require(fresh, "historical mode is read-only")
r.require(args.plan.is_file() and r.read(args.plan) == plan, "run exact check-only plan first")
reports, phase_call, uid_state = shared.make_uid_policy(r, uid_snapshot, uid_source, uid_plan_map, out)
engine_checks = []
def fresh_engine_check(label):
value = shared.engine_pin(args.godot, engine_descriptor)
engine_checks.append(dict(label=label, descriptor=value))
def fixed_guard():
fresh_engine_check("fixed")
r.require(shared.fresh_q_guard(root, args.main, args.submission, args.tested_tree) == provenance,
"fresh Q provenance changed")
r.require(pin(root / uid_binding["helper_path"])["sha256"] == uid_binding["helper_sha256"],
"UID helper changed")
for value in fixed + cache_receipts:
r.require(pin(value["path"]) == value, "fixed input changed: " + value["path"])
fixed_guard()
# Native admission is Root-only and fails closed on unreadable cache.
r.require(cache_note is None, "Root must read exact cache receipts: " + str(cache_note))
old = args.cache_run
r.require(r.read(old / "runner-ended.json")["passed"], "ended cache run must have passed")
old_map = r.read(old / "runner-input.json")["selected_source_map"]
current_map = {n: p["sha256"] for n, p in source_before.items()}
r.require(old_map == current_map, "ended cache selected source must equal current product")
if old is not None:
r.require(r.read(old / "runner-ended.json")["passed"], "ended cache run must have passed")
old_map = r.read(old / "runner-input.json")["selected_source_map"]
current_map = {n: p["sha256"] for n, p in source_before.items()}
r.require(old_map == current_map, "ended cache selected source must equal current product")
protected = r.default_player(root)
outer = module("s1_owned_outer", r.SUPPORT / "owned_outer.py")
r.require(not outer.native.helper["live_engines"](), "another Godot owns CPU")
@@ -152,20 +198,21 @@ def main():
data = value["text"].encode()
r.require(hashlib.sha256(data).hexdigest() == value["sha256"], "bootstrap pin")
(out / "bootstrap" / name).write_bytes(data)
cache = old / "stage/.godot"
cache_before = r.inventory(cache)
r.require(bool(cache_before), "nonempty ended cache")
for name in cache_before:
src = cache / name
dst = stage / ".godot" / name
dst.parent.mkdir(parents=True, exist_ok=True)
subprocess.run(["/bin/cp", "-c", str(src), str(dst)], check=True)
r.require((src.stat().st_dev, src.stat().st_ino) != (dst.stat().st_dev, dst.stat().st_ino),
"cache clone is a separate inode")
r.require(r.inventory(stage / ".godot") == cache_before, "whole cache clone hashes")
r.write(out / "cache-reuse.json", dict(ended_run=str(old), receipts=cache_receipts,
whole_cache=cache_before, independent_inode=True,
ordinary_import_required=True, ordinary_parse_required=True))
if old is not None:
cache = old / "stage/.godot"
cache_before = r.inventory(cache)
r.require(bool(cache_before), "nonempty ended cache")
for name in cache_before:
src = cache / name
dst = stage / ".godot" / name
dst.parent.mkdir(parents=True, exist_ok=True)
subprocess.run(["/bin/cp", "-c", str(src), str(dst)], check=True)
r.require((src.stat().st_dev, src.stat().st_ino) != (dst.stat().st_dev, dst.stat().st_ino),
"cache clone is a separate inode")
r.require(r.inventory(stage / ".godot") == cache_before, "whole cache clone hashes")
r.write(out / "cache-reuse.json", dict(ended_run=str(old), receipts=cache_receipts,
whole_cache=cache_before, independent_inode=True,
ordinary_import_required=True, ordinary_parse_required=True))
paths = ["res://" + n for n in sorted(refs) if n.endswith(".gd")]
r.write(out / "parse-paths.json", paths)
markers = module("s1_markers", root / "tools/strict_test_markers.py")
@@ -187,7 +234,10 @@ def main():
writer = r.read(out / "raw/writer.json")
formal_before = {n: r.inventory(Path(p)) for n, p in writer["slots"].items()}
r.require(len(formal_before) == 14, "all fourteen formal writer points")
row = r.execute_phase(str(engine), stage, out, phase, test, selected, expected,
fresh_engine_check("before-" + phase)
if phase == "import" and old is None:
r.require(not (stage / ".godot").exists(), "fresh import cache absent")
row = phase_call(str(engine), stage, out, phase, test, selected, expected,
previous, policy, contracts, paths, public, protected, root,
outer, markers, diagnostics, owners, audio)
phases.append(row)
@@ -220,6 +270,8 @@ def main():
# Fixed guard always follows ownership cleanup, even if setup or an engine failed.
try:
fixed_guard()
r.require(uid_snapshot(stage, uid_source, uid_plan_map) == uid_state["accepted"], "UID seal after cleanup")
r.write(out / "fresh-engine-checks.json", engine_checks)
after = r.source_refs(root)
r.write(out / "source_after.json", after)
r.require(after == source_before, "whole product source unchanged")
@@ -231,9 +283,15 @@ def main():
except BaseException as caught:
guards.append(type(caught).__name__ + ": " + str(caught))
pids = [p.pid for p in outer.OWNED]
passed = (error is None and not guards and not cleanup_errors and len(phases) == 4
passed = (uid_state["accepted"] is not None and error is None and not guards and not cleanup_errors and len(phases) == 4
and all(p["passed"] for p in phases) and len(pids) == len(set(pids)) == 4
and all(p["engine_ended"] for p in cleanup))
if passed:
try:
shared.mirror_formal(r, out, formal_before)
except BaseException as caught:
guards.append("formal mirror: " + str(caught))
passed = False
execution = dict(passed=passed, error=error, guard_errors=guards, phases=phases,
actual_captured_PIDs=pids, cleanup=cleanup, cleanup_errors=cleanup_errors,
formal_before=formal_before, formal_after=formal_after,
@@ -1,3 +1,26 @@
## REPAIR49 normal-gate handoff
Required materials: exact B/native-first-current and fresh-run registry; each
runner-input/ended/source/UID/formal/raw/lifecycle receipt; original recorded Q
and engine context; B/p04-evidence/runner-materials and RELOCATION.json; matching
collection/MANIFEST and separate dependency invocation; original full run and
full_suite binding/raw receipts; final index and invocation receipt; immutable
authorities in frozen checkout. No raw or historical receipt is rewritten.
Two-placement identity requires the explicit closure in repair48_identity_controls.py,
missing-file rejection, and original/A/B complete path/bytes/SHA tables and tree
hash equality before and after positive execution. See REPAIR49_STATUS.md.
Submission is followed by new Q freeze, affected pure controls (complete_B included),
clean exact-Q check-only, capacity/PID checks, one fresh native lease for
S1/S2a/S2b/S3/S4 and all ten S5 cases, readers/adapters, 15EV collector, full
verification/binding under the conditions below (or one final full184 if any
condition fails), index generation, p04-acceptance once, separate Opus whole-unit
review, normal prepare/C/integration/final/Root DB join/ledger/main push.
If order-typed fails, preserve its result and stop before heavy execution.
Only whole-unit acceptance grants credit.
REPAIR48 current source status: see [REPAIR48_STATUS.md](../REPAIR48_STATUS.md). Earlier run directions and successes below are historical; they grant no P04 credit.
# P04-01 S2a Root run(code-ready提出用・実測未実施)
repair12確認: worktreeのoperations_coordinator.gd SHA256は
@@ -2,6 +2,7 @@
"""S2a-only native entry. --check-only never loads ownership helpers or starts Godot."""
from pathlib import Path
import argparse
import copy
import hashlib
import importlib.util
import json
@@ -73,17 +74,40 @@ def main():
parser.add_argument("--cache-run", type=Path, default=CACHE_RUN)
parser.add_argument("--godot", type=Path, default=ENGINE)
parser.add_argument("--check-only", action="store_true")
parser.add_argument("--main")
parser.add_argument("--submission")
parser.add_argument("--tested-tree")
parser.add_argument("--historical-r17", action="store_true")
args = parser.parse_args()
shared = module("fresh_q_shared", HERE.parent / "s5/run_s5_native.py")
mode = shared.select_mode(args)
fresh = mode == "fresh-q"
if fresh and "--project-root" not in sys.argv:
raise ValueError("fresh-q requires explicit --project-root")
if fresh and "--cache-run" not in sys.argv:
args.cache_run = None
engine_descriptor = shared.engine_pin(args.godot) if fresh else None
provenance = None
if args.project_root.is_symlink():
raise ValueError("project root symlink")
root = args.project_root.resolve()
out = args.output.resolve()
if fresh:
if not out.is_relative_to(BUILD.resolve()) or not args.plan.resolve().is_relative_to(BUILD.resolve()):
raise ValueError("fresh plan/output must stay inside BUILD")
if out.exists() or out.is_symlink() or (args.check_only and args.plan.exists()):
raise ValueError("fresh output and plan required")
r = module("s2a_standard_runner", root / "tools/run_all_tests.py")
# Preserve the reviewed source_refs -> exactly one QA override order.
source_before = r.source_refs(root)
if fresh:
provenance = shared.fresh_q_guard(root, args.main, args.submission, args.tested_tree)
refs = dict(source_before)
refs[TEST] = pin(QA)
template_guard()
if not fresh: template_guard()
expected = {n: dict(bytes=p["bytes"], sha256=p["sha256"]) for n, p in refs.items()}
fixed = [pin(p) for p in MATERIALS + [
fixed = [pin(p) for p in ([] if fresh else MATERIALS) + [
QA, Path(__file__), HERE / "S2_ROOT_RUN.md",
root / "tests/transport/test_runtime_transport.gd",
root / "tests/staff/test_rescue_elevator.gd",
@@ -92,7 +116,7 @@ def main():
selected = dict(root_before=source_before, map={n: p["sha256"] for n, p in refs.items()}, timeout=1200)
cache_note = None
cache_receipts = []
for leaf in ["runner-ended.json", "runner-input.json"]:
for leaf in (["runner-ended.json", "runner-input.json"] if args.cache_run is not None else []):
path = args.cache_run / leaf
try:
cache_receipts.append(pin(path))
@@ -106,6 +130,16 @@ def main():
cache_receipts=cache_receipts, cache_access=cache_note,
phases=["import", "parse", "writer", "reader"],
native_engine_launches=0, whole_goal_accepted=False, unit_accepted=False)
if fresh:
uid_plan, uid_snapshot, uid_binding = shared.load_uid_helper(root, r, source_before)
uid_source = copy.deepcopy(expected)
uid_plan_map = uid_plan(refs)
plan.update(protocol="p04-s2a-fresh-q-v1", mode=mode, provenance=provenance, engine=engine_descriptor,
engine_sha256=engine_descriptor["sha256"], uid_helper=uid_binding,
uid_plan=uid_plan_map, import_mode="fresh" if args.cache_run is None else "cache",
historical_r17=False, fresh_q_evidence=False)
fixed.append(pin(HERE.parent / "s5/run_s5_native.py"))
# No historical execution is admitted.
# Check-only only reads source/materials and writes the plan in task build.
# It deliberately does not read default-player data, inspect processes or stat Godot.
if args.check_only:
@@ -118,19 +152,31 @@ def main():
QA_overrides=[TEST], fixed_pins=len(fixed), plan=str(args.plan),
plan_sha256=r.sha(args.plan), cache_access=cache_note), ensure_ascii=False))
return 0
r.require(fresh, "historical mode is read-only")
r.require(args.plan.is_file() and r.read(args.plan) == plan, "run exact check-only plan first")
reports, phase_call, uid_state = shared.make_uid_policy(r, uid_snapshot, uid_source, uid_plan_map, out)
engine_checks = []
def fresh_engine_check(label):
value = shared.engine_pin(args.godot, engine_descriptor)
engine_checks.append(dict(label=label, descriptor=value))
def fixed_guard():
template_guard()
fresh_engine_check("fixed")
r.require(shared.fresh_q_guard(root, args.main, args.submission, args.tested_tree) == provenance,
"fresh Q provenance changed")
r.require(pin(root / uid_binding["helper_path"])["sha256"] == uid_binding["helper_sha256"],
"UID helper changed")
if not fresh: template_guard()
for value in fixed + cache_receipts:
r.require(pin(value["path"]) == value, "fixed input changed: " + value["path"])
fixed_guard()
# Native admission is Root-only and fails closed on unreadable cache.
r.require(cache_note is None, "Root must read exact cache receipts: " + str(cache_note))
old = args.cache_run
r.require(r.read(old / "runner-ended.json")["passed"], "ended cache run must have passed")
old_map = r.read(old / "runner-input.json")["selected_source_map"]
current_map = {n: p["sha256"] for n, p in source_before.items()}
r.require(old_map == current_map, "ended cache selected source must equal current product")
if old is not None:
r.require(r.read(old / "runner-ended.json")["passed"], "ended cache run must have passed")
old_map = r.read(old / "runner-input.json")["selected_source_map"]
current_map = {n: p["sha256"] for n, p in source_before.items()}
r.require(old_map == current_map, "ended cache selected source must equal current product")
protected = r.default_player(root)
outer = module("s2a_owned_outer", r.SUPPORT / "owned_outer.py")
r.require(not outer.native.helper["live_engines"](), "another Godot owns CPU")
@@ -175,20 +221,21 @@ def main():
data = value["text"].encode()
r.require(hashlib.sha256(data).hexdigest() == value["sha256"], "bootstrap pin")
(out / "bootstrap" / name).write_bytes(data)
cache = old / "stage/.godot"
cache_before = r.inventory(cache)
r.require(bool(cache_before), "nonempty ended cache")
for name in cache_before:
src = cache / name
dst = stage / ".godot" / name
dst.parent.mkdir(parents=True, exist_ok=True)
subprocess.run(["/bin/cp", "-c", str(src), str(dst)], check=True)
r.require((src.stat().st_dev, src.stat().st_ino) != (dst.stat().st_dev, dst.stat().st_ino),
"cache clone is a separate inode")
r.require(r.inventory(stage / ".godot") == cache_before, "whole cache clone hashes")
r.write(out / "cache-reuse.json", dict(ended_run=str(old), receipts=cache_receipts,
whole_cache=cache_before, independent_inode=True,
ordinary_import_required=True, ordinary_parse_required=True))
if old is not None:
cache = old / "stage/.godot"
cache_before = r.inventory(cache)
r.require(bool(cache_before), "nonempty ended cache")
for name in cache_before:
src = cache / name
dst = stage / ".godot" / name
dst.parent.mkdir(parents=True, exist_ok=True)
subprocess.run(["/bin/cp", "-c", str(src), str(dst)], check=True)
r.require((src.stat().st_dev, src.stat().st_ino) != (dst.stat().st_dev, dst.stat().st_ino),
"cache clone is a separate inode")
r.require(r.inventory(stage / ".godot") == cache_before, "whole cache clone hashes")
r.write(out / "cache-reuse.json", dict(ended_run=str(old), receipts=cache_receipts,
whole_cache=cache_before, independent_inode=True,
ordinary_import_required=True, ordinary_parse_required=True))
paths = ["res://" + n for n in sorted(refs) if n.endswith(".gd")]
r.write(out / "parse-paths.json", paths)
markers = module("s2a_markers", root / "tools/strict_test_markers.py")
@@ -210,7 +257,10 @@ def main():
writer = r.read(out / "raw/writer.json")
formal_before = {n: r.inventory(Path(p)) for n, p in writer["slots"].items()}
r.require(len(formal_before) == 1, "one C3 formal writer point")
row = r.execute_phase(str(engine), stage, out, phase, test, selected, expected,
fresh_engine_check("before-" + phase)
if phase == "import" and old is None:
r.require(not (stage / ".godot").exists(), "fresh import cache absent")
row = phase_call(str(engine), stage, out, phase, test, selected, expected,
previous, policy, contracts, paths, public, protected, root,
outer, markers, diagnostics, owners, audio)
phases.append(row)
@@ -245,6 +295,8 @@ def main():
# Fixed guard always follows ownership cleanup, even if setup or an engine failed.
try:
fixed_guard()
r.require(uid_snapshot(stage, uid_source, uid_plan_map) == uid_state["accepted"], "UID seal after cleanup")
r.write(out / "fresh-engine-checks.json", engine_checks)
after = r.source_refs(root)
r.write(out / "source_after.json", after)
r.require(after == source_before, "whole product source unchanged")
@@ -260,9 +312,15 @@ def main():
except BaseException as caught:
guards.append(type(caught).__name__ + ": " + str(caught))
pids = [p.pid for p in outer.OWNED]
passed = (error is None and not guards and not cleanup_errors and len(phases) == 4
passed = (uid_state["accepted"] is not None and error is None and not guards and not cleanup_errors and len(phases) == 4
and all(p["passed"] for p in phases) and len(pids) == len(set(pids)) == 4
and all(p["engine_ended"] for p in cleanup))
if passed:
try:
shared.mirror_formal(r, out, formal_before)
except BaseException as caught:
guards.append("formal mirror: " + str(caught))
passed = False
execution = dict(passed=passed, error=error, guard_errors=guards, phases=phases,
actual_captured_PIDs=pids, cleanup=cleanup, cleanup_errors=cleanup_errors,
formal_before=formal_before, formal_after=formal_after,
@@ -1,3 +1,28 @@
## REPAIR49 normal-gate handoff
Required materials: exact B/native-first-current and fresh-run registry; each
runner-input/ended/source/UID/formal/raw/lifecycle receipt; original recorded Q
and engine context; B/p04-evidence/runner-materials and RELOCATION.json; matching
collection/MANIFEST and separate dependency invocation; original full run and
full_suite binding/raw receipts; final index and invocation receipt; immutable
authorities in frozen checkout. No raw or historical receipt is rewritten.
Two-placement identity requires the explicit closure in repair48_identity_controls.py,
missing-file rejection, and original/A/B complete path/bytes/SHA tables and tree
hash equality before and after positive execution. See REPAIR49_STATUS.md.
Submission is followed by new Q freeze, affected pure controls (complete_B included),
clean exact-Q check-only, capacity/PID checks, one fresh native lease for
S1/S2a/S2b/S3/S4 and all ten S5 cases, readers/adapters, 15EV collector, full
verification/binding under the conditions below (or one final full184 if any
condition fails), index generation, p04-acceptance once, separate Opus whole-unit
review, normal prepare/C/integration/final/Root DB join/ledger/main push.
If order-typed fails, preserve its result and stop before heavy execution.
Only whole-unit acceptance grants credit.
REPAIR48 current source status: see [REPAIR48_STATUS.md](../REPAIR48_STATUS.md). Earlier run directions and successes below are historical; they grant no P04 credit.
RUN47 note: Earlier 1338-source native instructions below describe the historical relocation. Current fresh-Q selection uses exact source/manifest equality, never a literal file count. See ../REPAIR47_PLAN.json.
# P04-01 S2b code preparation
変更は本ディレクトリの `p04_s2b_shift_probe.gd`、`run_s2b_native.py`、本書の3ファイルのみ。
@@ -2,6 +2,7 @@
"""S2b-only native entry. --check-only never loads ownership helpers or starts Godot."""
from pathlib import Path
import argparse
import copy
import hashlib
import importlib.util
import json
@@ -62,19 +63,42 @@ def main():
parser.add_argument("--cache-run", type=Path, default=CACHE_RUN)
parser.add_argument("--godot", type=Path, default=ENGINE)
parser.add_argument("--check-only", action="store_true")
parser.add_argument("--main")
parser.add_argument("--submission")
parser.add_argument("--tested-tree")
parser.add_argument("--historical-r17", action="store_true")
args = parser.parse_args()
shared = module("fresh_q_shared", HERE.parent / "s5/run_s5_native.py")
mode = shared.select_mode(args)
fresh = mode == "fresh-q"
if fresh and "--project-root" not in sys.argv:
raise ValueError("fresh-q requires explicit --project-root")
if fresh and "--cache-run" not in sys.argv:
args.cache_run = None
engine_descriptor = shared.engine_pin(args.godot) if fresh else None
provenance = None
if args.project_root.is_symlink():
raise ValueError("project root symlink")
root = args.project_root.resolve()
out = args.output.resolve()
if fresh:
if not out.is_relative_to(BUILD.resolve()) or not args.plan.resolve().is_relative_to(BUILD.resolve()):
raise ValueError("fresh plan/output must stay inside BUILD")
if out.exists() or out.is_symlink() or (args.check_only and args.plan.exists()):
raise ValueError("fresh output and plan required")
if not out.is_relative_to(BUILD.resolve()) or not args.plan.resolve().is_relative_to(BUILD.resolve()):
raise ValueError("plan/output must stay in task build")
r = module("s2b_standard_runner", root / "tools/run_all_tests.py")
# Preserve the reviewed source_refs -> exactly one QA override order.
source_before = r.source_refs(root)
if fresh:
provenance = shared.fresh_q_guard(root, args.main, args.submission, args.tested_tree)
refs = dict(source_before)
refs[TEST] = pin(QA)
template_guard(root)
if not fresh: template_guard(root)
expected = {n: dict(bytes=p["bytes"], sha256=p["sha256"]) for n, p in refs.items()}
fixed = [pin(p) for p in MATERIALS + [
fixed = [pin(p) for p in ([] if fresh else MATERIALS) + [
QA, Path(__file__), HERE / "S2B_ROOT_RUN.md",
root / "tests/transport/test_runtime_transport.gd",
root / "tests/staff/test_rescue_elevator.gd",
@@ -83,7 +107,7 @@ def main():
selected = dict(root_before=source_before, map={n: p["sha256"] for n, p in refs.items()}, timeout=1200)
cache_note = None
cache_receipts = []
for leaf in ["runner-ended.json", "runner-input.json"]:
for leaf in (["runner-ended.json", "runner-input.json"] if args.cache_run is not None else []):
path = args.cache_run / leaf
try:
cache_receipts.append(pin(path))
@@ -97,6 +121,16 @@ def main():
cache_receipts=cache_receipts, cache_access=cache_note,
phases=["import", "parse", "writer", "reader"],
native_engine_launches=0, whole_goal_accepted=False, unit_accepted=False)
if fresh:
uid_plan, uid_snapshot, uid_binding = shared.load_uid_helper(root, r, source_before)
uid_source = copy.deepcopy(expected)
uid_plan_map = uid_plan(refs)
plan.update(protocol="p04-s2b-fresh-q-v1", mode=mode, provenance=provenance, engine=engine_descriptor,
engine_sha256=engine_descriptor["sha256"], uid_helper=uid_binding,
uid_plan=uid_plan_map, import_mode="fresh" if args.cache_run is None else "cache",
historical_r17=False, fresh_q_evidence=False)
fixed.append(pin(HERE.parent / "s5/run_s5_native.py"))
# No historical execution is admitted.
# Check-only only reads source/materials and writes the plan in task build.
# It deliberately does not read default-player data, inspect processes or stat Godot.
if args.check_only:
@@ -109,20 +143,31 @@ def main():
QA_overrides=[TEST], fixed_pins=len(fixed), plan=str(args.plan),
plan_sha256=r.sha(args.plan), cache_access=cache_note), ensure_ascii=False))
return 0
r.require(root == PRODUCT.resolve() and len(source_before) == 1338, "Root native requires product 1338; worker plan is not native evidence")
r.require(fresh, "historical mode is read-only")
r.require(args.plan.is_file() and r.read(args.plan) == plan, "run exact check-only plan first")
reports, phase_call, uid_state = shared.make_uid_policy(r, uid_snapshot, uid_source, uid_plan_map, out)
engine_checks = []
def fresh_engine_check(label):
value = shared.engine_pin(args.godot, engine_descriptor)
engine_checks.append(dict(label=label, descriptor=value))
def fixed_guard():
template_guard(root)
fresh_engine_check("fixed")
r.require(shared.fresh_q_guard(root, args.main, args.submission, args.tested_tree) == provenance,
"fresh Q provenance changed")
r.require(pin(root / uid_binding["helper_path"])["sha256"] == uid_binding["helper_sha256"],
"UID helper changed")
if not fresh: template_guard(root)
for value in fixed + cache_receipts:
r.require(pin(value["path"]) == value, "fixed input changed: " + value["path"])
fixed_guard()
# Native admission is Root-only and fails closed on unreadable cache.
r.require(cache_note is None, "Root must read exact cache receipts: " + str(cache_note))
old = args.cache_run
r.require(r.read(old / "runner-ended.json")["passed"], "ended cache run must have passed")
old_map = r.read(old / "runner-input.json")["selected_source_map"]
current_map = {n: p["sha256"] for n, p in source_before.items()}
r.require(old_map == current_map, "ended cache selected source must equal current product")
if old is not None:
r.require(r.read(old / "runner-ended.json")["passed"], "ended cache run must have passed")
old_map = r.read(old / "runner-input.json")["selected_source_map"]
current_map = {n: p["sha256"] for n, p in source_before.items()}
r.require(old_map == current_map, "ended cache selected source must equal current product")
protected = r.default_player(root)
outer = module("s2b_owned_outer", r.SUPPORT / "owned_outer.py")
r.require(not outer.native.helper["live_engines"](), "another Godot owns CPU")
@@ -167,20 +212,21 @@ def main():
data = value["text"].encode()
r.require(hashlib.sha256(data).hexdigest() == value["sha256"], "bootstrap pin")
(out / "bootstrap" / name).write_bytes(data)
cache = old / "stage/.godot"
cache_before = r.inventory(cache)
r.require(bool(cache_before), "nonempty ended cache")
for name in cache_before:
src = cache / name
dst = stage / ".godot" / name
dst.parent.mkdir(parents=True, exist_ok=True)
subprocess.run(["/bin/cp", "-c", str(src), str(dst)], check=True)
r.require((src.stat().st_dev, src.stat().st_ino) != (dst.stat().st_dev, dst.stat().st_ino),
"cache clone is a separate inode")
r.require(r.inventory(stage / ".godot") == cache_before, "whole cache clone hashes")
r.write(out / "cache-reuse.json", dict(ended_run=str(old), receipts=cache_receipts,
whole_cache=cache_before, independent_inode=True,
ordinary_import_required=True, ordinary_parse_required=True))
if old is not None:
cache = old / "stage/.godot"
cache_before = r.inventory(cache)
r.require(bool(cache_before), "nonempty ended cache")
for name in cache_before:
src = cache / name
dst = stage / ".godot" / name
dst.parent.mkdir(parents=True, exist_ok=True)
subprocess.run(["/bin/cp", "-c", str(src), str(dst)], check=True)
r.require((src.stat().st_dev, src.stat().st_ino) != (dst.stat().st_dev, dst.stat().st_ino),
"cache clone is a separate inode")
r.require(r.inventory(stage / ".godot") == cache_before, "whole cache clone hashes")
r.write(out / "cache-reuse.json", dict(ended_run=str(old), receipts=cache_receipts,
whole_cache=cache_before, independent_inode=True,
ordinary_import_required=True, ordinary_parse_required=True))
paths = ["res://" + n for n in sorted(refs) if n.endswith(".gd")]
r.write(out / "parse-paths.json", paths)
markers = module("s2b_markers", root / "tools/strict_test_markers.py")
@@ -202,7 +248,10 @@ def main():
writer = r.read(out / "raw/writer.json")
formal_before = {n: r.inventory(Path(p)) for n, p in writer["slots"].items()}
r.require(len(formal_before) == 6, "three formal points for each of two fresh branches")
row = r.execute_phase(str(engine), stage, out, phase, test, selected, expected,
fresh_engine_check("before-" + phase)
if phase == "import" and old is None:
r.require(not (stage / ".godot").exists(), "fresh import cache absent")
row = phase_call(str(engine), stage, out, phase, test, selected, expected,
previous, policy, contracts, paths, public, protected, root,
outer, markers, diagnostics, owners, audio)
phases.append(row)
@@ -237,6 +286,8 @@ def main():
# Fixed guard always follows ownership cleanup, even if setup or an engine failed.
try:
fixed_guard()
r.require(uid_snapshot(stage, uid_source, uid_plan_map) == uid_state["accepted"], "UID seal after cleanup")
r.write(out / "fresh-engine-checks.json", engine_checks)
after = r.source_refs(root)
r.write(out / "source_after.json", after)
r.require(after == source_before, "whole product source unchanged")
@@ -252,9 +303,15 @@ def main():
except BaseException as caught:
guards.append(type(caught).__name__ + ": " + str(caught))
pids = [p.pid for p in outer.OWNED]
passed = (error is None and not guards and not cleanup_errors and len(phases) == 4
passed = (uid_state["accepted"] is not None and error is None and not guards and not cleanup_errors and len(phases) == 4
and all(p["passed"] for p in phases) and len(pids) == len(set(pids)) == 4
and all(p["engine_ended"] for p in cleanup))
if passed:
try:
shared.mirror_formal(r, out, formal_before)
except BaseException as caught:
guards.append("formal mirror: " + str(caught))
passed = False
execution = dict(passed=passed, error=error, guard_errors=guards, phases=phases,
actual_captured_PIDs=pids, cleanup=cleanup, cleanup_errors=cleanup_errors,
formal_before=formal_before, formal_after=formal_after,
@@ -1,3 +1,28 @@
## REPAIR49 normal-gate handoff
Required materials: exact B/native-first-current and fresh-run registry; each
runner-input/ended/source/UID/formal/raw/lifecycle receipt; original recorded Q
and engine context; B/p04-evidence/runner-materials and RELOCATION.json; matching
collection/MANIFEST and separate dependency invocation; original full run and
full_suite binding/raw receipts; final index and invocation receipt; immutable
authorities in frozen checkout. No raw or historical receipt is rewritten.
Two-placement identity requires the explicit closure in repair48_identity_controls.py,
missing-file rejection, and original/A/B complete path/bytes/SHA tables and tree
hash equality before and after positive execution. See REPAIR49_STATUS.md.
Submission is followed by new Q freeze, affected pure controls (complete_B included),
clean exact-Q check-only, capacity/PID checks, one fresh native lease for
S1/S2a/S2b/S3/S4 and all ten S5 cases, readers/adapters, 15EV collector, full
verification/binding under the conditions below (or one final full184 if any
condition fails), index generation, p04-acceptance once, separate Opus whole-unit
review, normal prepare/C/integration/final/Root DB join/ledger/main push.
If order-typed fails, preserve its result and stop before heavy execution.
Only whole-unit acceptance grants credit.
REPAIR48 current source status: see [REPAIR48_STATUS.md](../REPAIR48_STATUS.md). Earlier run directions and successes below are historical; they grant no P04 credit.
RUN47 note: Earlier 1338-source native instructions below describe the historical relocation. Current fresh-Q selection uses exact source/manifest equality, never a literal file count. See ../REPAIR47_PLAN.json.
# P04-01 S3 code-ready preparation
変更は本ディレクトリのGD、Python wrapper、本書の3本のみ。製品修正0。
@@ -2,6 +2,7 @@
"""S3-only native entry. --check-only never loads ownership helpers or starts Godot."""
from pathlib import Path
import argparse
import copy
import hashlib
import importlib.util
import json
@@ -30,21 +31,22 @@ SLOTS = sorted(case + "-" + label for case in CASES for label in LABELS[case])
MATERIALS = [MANIFEST, AUDIT, HERE.parent / "s2b/run_s2b_native.py",
HERE.parent / "s2b/p04_s2b_shift_probe.gd", HERE.parent / "s2b/S2B_ROOT_RUN.md"]
def template_guard(root):
if pin(MANIFEST)["sha256"] != MANIFEST_SHA:
raise ValueError("supplied seven-source manifest changed")
manifest = json.loads(MANIFEST.read_text())
if len(manifest["files"]) != 7:
raise ValueError("exact seven source files required")
for row in manifest["files"]:
actual = pin(row["supplied"])
if (actual["bytes"], actual["sha256"]) != (row["bytes"], row["sha256"]):
raise ValueError("supplied template SHA mismatch: " + row["supplied"])
audit = json.loads(AUDIT.read_text())
for row in audit["source_pins"]:
actual = pin(root / row["path"])
if (actual["bytes"], actual["sha256"]) != (row["production_bytes"], row["production_sha256"]):
raise ValueError("Root source audit mismatch: " + row["path"])
def template_guard(root, historical=True):
if historical:
if pin(MANIFEST)["sha256"] != MANIFEST_SHA:
raise ValueError("supplied seven-source manifest changed")
manifest = json.loads(MANIFEST.read_text())
if len(manifest["files"]) != 7:
raise ValueError("exact seven source files required")
for row in manifest["files"]:
actual = pin(row["supplied"])
if (actual["bytes"], actual["sha256"]) != (row["bytes"], row["sha256"]):
raise ValueError("supplied template SHA mismatch: " + row["supplied"])
audit = json.loads(AUDIT.read_text())
for row in audit["source_pins"]:
actual = pin(root / row["path"])
if (actual["bytes"], actual["sha256"]) != (row["production_bytes"], row["production_sha256"]):
raise ValueError("Root source audit mismatch: " + row["path"])
probe = QA.read_text()
if ":=" in probe:
raise ValueError("probe requires explicit typed declarations")
@@ -80,19 +82,42 @@ def main():
parser.add_argument("--cache-run", type=Path, default=CACHE_RUN)
parser.add_argument("--godot", type=Path, default=ENGINE)
parser.add_argument("--check-only", action="store_true")
parser.add_argument("--main")
parser.add_argument("--submission")
parser.add_argument("--tested-tree")
parser.add_argument("--historical-r17", action="store_true")
args = parser.parse_args()
shared = module("fresh_q_shared", HERE.parent / "s5/run_s5_native.py")
mode = shared.select_mode(args)
fresh = mode == "fresh-q"
if fresh and "--project-root" not in sys.argv:
raise ValueError("fresh-q requires explicit --project-root")
if fresh and "--cache-run" not in sys.argv:
args.cache_run = None
engine_descriptor = shared.engine_pin(args.godot) if fresh else None
provenance = None
if args.project_root.is_symlink():
raise ValueError("project root symlink")
root = args.project_root.resolve()
out = args.output.resolve()
if fresh:
if not out.is_relative_to(BUILD.resolve()) or not args.plan.resolve().is_relative_to(BUILD.resolve()):
raise ValueError("fresh plan/output must stay inside BUILD")
if out.exists() or out.is_symlink() or (args.check_only and args.plan.exists()):
raise ValueError("fresh output and plan required")
if not out.is_relative_to(BUILD.resolve()) or not args.plan.resolve().is_relative_to(BUILD.resolve()):
raise ValueError("plan/output must stay in task build")
r = module("s3_standard_runner", root / "tools/run_all_tests.py")
# Preserve the reviewed source_refs -> exactly one QA override order.
source_before = r.source_refs(root)
if fresh:
provenance = shared.fresh_q_guard(root, args.main, args.submission, args.tested_tree)
refs = dict(source_before)
refs[TEST] = pin(QA)
template_guard(root)
template_guard(root, historical=not fresh)
expected = {n: dict(bytes=p["bytes"], sha256=p["sha256"]) for n, p in refs.items()}
fixed = [pin(p) for p in MATERIALS + [Path(row["supplied"]) for row in json.loads(MANIFEST.read_text())["files"]] + [
fixed = [pin(p) for p in ([] if fresh else MATERIALS + [Path(row["supplied"]) for row in json.loads(MANIFEST.read_text())["files"]]) + [
QA, Path(__file__), HERE / "S3_ROOT_RUN.md",
root / "tests/transport/test_runtime_transport.gd",
root / "tests/staff/test_rescue_elevator.gd",
@@ -101,7 +126,7 @@ def main():
selected = dict(root_before=source_before, map={n: p["sha256"] for n, p in refs.items()}, timeout=1200)
cache_note = None
cache_receipts = []
for leaf in ["runner-ended.json", "runner-input.json"]:
for leaf in (["runner-ended.json", "runner-input.json"] if args.cache_run is not None else []):
path = args.cache_run / leaf
try:
cache_receipts.append(pin(path))
@@ -115,6 +140,16 @@ def main():
cache_receipts=cache_receipts, cache_access=cache_note,
phases=["import", "parse", "writer", "reader"],
native_engine_launches=0, whole_goal_accepted=False, unit_accepted=False)
if fresh:
uid_plan, uid_snapshot, uid_binding = shared.load_uid_helper(root, r, source_before)
uid_source = copy.deepcopy(expected)
uid_plan_map = uid_plan(refs)
plan.update(protocol="p04-s3-fresh-q-v1", mode=mode, provenance=provenance, engine=engine_descriptor,
engine_sha256=engine_descriptor["sha256"], uid_helper=uid_binding,
uid_plan=uid_plan_map, import_mode="fresh" if args.cache_run is None else "cache",
historical_r17=False, fresh_q_evidence=False)
fixed.append(pin(HERE.parent / "s5/run_s5_native.py"))
# No historical execution is admitted.
# Check-only only reads source/materials and writes the plan in task build.
# It deliberately does not read default-player data, inspect processes or stat Godot.
if args.check_only:
@@ -127,20 +162,31 @@ def main():
QA_overrides=[TEST], fixed_pins=len(fixed), plan=str(args.plan),
plan_sha256=r.sha(args.plan), cache_access=cache_note), ensure_ascii=False))
return 0
r.require(root == PRODUCT.resolve() and len(source_before) == 1338, "Root native requires product 1338; worker plan is not native evidence")
r.require(fresh, "historical mode is read-only")
r.require(args.plan.is_file() and r.read(args.plan) == plan, "run exact check-only plan first")
reports, phase_call, uid_state = shared.make_uid_policy(r, uid_snapshot, uid_source, uid_plan_map, out)
engine_checks = []
def fresh_engine_check(label):
value = shared.engine_pin(args.godot, engine_descriptor)
engine_checks.append(dict(label=label, descriptor=value))
def fixed_guard():
template_guard(root)
fresh_engine_check("fixed")
r.require(shared.fresh_q_guard(root, args.main, args.submission, args.tested_tree) == provenance,
"fresh Q provenance changed")
r.require(pin(root / uid_binding["helper_path"])["sha256"] == uid_binding["helper_sha256"],
"UID helper changed")
template_guard(root, historical=not fresh)
for value in fixed + cache_receipts:
r.require(pin(value["path"]) == value, "fixed input changed: " + value["path"])
fixed_guard()
# Native admission is Root-only and fails closed on unreadable cache.
r.require(cache_note is None, "Root must read exact cache receipts: " + str(cache_note))
old = args.cache_run
r.require(r.read(old / "runner-ended.json")["passed"], "ended cache run must have passed")
old_map = r.read(old / "runner-input.json")["selected_source_map"]
current_map = {n: p["sha256"] for n, p in source_before.items()}
r.require(old_map == current_map, "ended cache selected source must equal current product")
if old is not None:
r.require(r.read(old / "runner-ended.json")["passed"], "ended cache run must have passed")
old_map = r.read(old / "runner-input.json")["selected_source_map"]
current_map = {n: p["sha256"] for n, p in source_before.items()}
r.require(old_map == current_map, "ended cache selected source must equal current product")
protected = r.default_player(root)
outer = module("s3_owned_outer", r.SUPPORT / "owned_outer.py")
r.require(not outer.native.helper["live_engines"](), "another Godot owns CPU")
@@ -185,20 +231,21 @@ def main():
data = value["text"].encode()
r.require(hashlib.sha256(data).hexdigest() == value["sha256"], "bootstrap pin")
(out / "bootstrap" / name).write_bytes(data)
cache = old / "stage/.godot"
cache_before = r.inventory(cache)
r.require(bool(cache_before), "nonempty ended cache")
for name in cache_before:
src = cache / name
dst = stage / ".godot" / name
dst.parent.mkdir(parents=True, exist_ok=True)
subprocess.run(["/bin/cp", "-c", str(src), str(dst)], check=True)
r.require((src.stat().st_dev, src.stat().st_ino) != (dst.stat().st_dev, dst.stat().st_ino),
"cache clone is a separate inode")
r.require(r.inventory(stage / ".godot") == cache_before, "whole cache clone hashes")
r.write(out / "cache-reuse.json", dict(ended_run=str(old), receipts=cache_receipts,
whole_cache=cache_before, independent_inode=True,
ordinary_import_required=True, ordinary_parse_required=True))
if old is not None:
cache = old / "stage/.godot"
cache_before = r.inventory(cache)
r.require(bool(cache_before), "nonempty ended cache")
for name in cache_before:
src = cache / name
dst = stage / ".godot" / name
dst.parent.mkdir(parents=True, exist_ok=True)
subprocess.run(["/bin/cp", "-c", str(src), str(dst)], check=True)
r.require((src.stat().st_dev, src.stat().st_ino) != (dst.stat().st_dev, dst.stat().st_ino),
"cache clone is a separate inode")
r.require(r.inventory(stage / ".godot") == cache_before, "whole cache clone hashes")
r.write(out / "cache-reuse.json", dict(ended_run=str(old), receipts=cache_receipts,
whole_cache=cache_before, independent_inode=True,
ordinary_import_required=True, ordinary_parse_required=True))
paths = ["res://" + n for n in sorted(refs) if n.endswith(".gd")]
r.write(out / "parse-paths.json", paths)
markers = module("s3_markers", root / "tools/strict_test_markers.py")
@@ -220,7 +267,10 @@ def main():
writer = r.read(out / "raw/writer.json")
formal_before = {n: r.inventory(Path(p)) for n, p in writer["slots"].items()}
r.require(sorted(formal_before) == SLOTS, "all 22 formal points for six fresh cases")
row = r.execute_phase(str(engine), stage, out, phase, test, selected, expected,
fresh_engine_check("before-" + phase)
if phase == "import" and old is None:
r.require(not (stage / ".godot").exists(), "fresh import cache absent")
row = phase_call(str(engine), stage, out, phase, test, selected, expected,
previous, policy, contracts, paths, public, protected, root,
outer, markers, diagnostics, owners, audio)
phases.append(row)
@@ -256,6 +306,8 @@ def main():
# Fixed guard always follows ownership cleanup, even if setup or an engine failed.
try:
fixed_guard()
r.require(uid_snapshot(stage, uid_source, uid_plan_map) == uid_state["accepted"], "UID seal after cleanup")
r.write(out / "fresh-engine-checks.json", engine_checks)
after = r.source_refs(root)
r.write(out / "source_after.json", after)
r.require(after == source_before, "whole product source unchanged")
@@ -271,9 +323,15 @@ def main():
except BaseException as caught:
guards.append(type(caught).__name__ + ": " + str(caught))
pids = [p.pid for p in outer.OWNED]
passed = (error is None and not guards and not cleanup_errors and len(phases) == 4
passed = (uid_state["accepted"] is not None and error is None and not guards and not cleanup_errors and len(phases) == 4
and all(p["passed"] for p in phases) and len(pids) == len(set(pids)) == 4
and all(p["engine_ended"] for p in cleanup))
if passed:
try:
shared.mirror_formal(r, out, formal_before)
except BaseException as caught:
guards.append("formal mirror: " + str(caught))
passed = False
execution = dict(passed=passed, error=error, guard_errors=guards, phases=phases,
actual_captured_PIDs=pids, cleanup=cleanup, cleanup_errors=cleanup_errors,
formal_before=formal_before, formal_after=formal_after,
@@ -1,3 +1,47 @@
## REPAIR49 normal-gate handoff
Required materials: exact B/native-first-current and fresh-run registry; each
runner-input/ended/source/UID/formal/raw/lifecycle receipt; original recorded Q
and engine context; B/p04-evidence/runner-materials and RELOCATION.json; matching
collection/MANIFEST and separate dependency invocation; original full run and
full_suite binding/raw receipts; final index and invocation receipt; immutable
authorities in frozen checkout. No raw or historical receipt is rewritten.
Two-placement identity requires the explicit closure in repair48_identity_controls.py,
missing-file rejection, and original/A/B complete path/bytes/SHA tables and tree
hash equality before and after positive execution. See REPAIR49_STATUS.md.
Submission is followed by new Q freeze, affected pure controls (complete_B included),
clean exact-Q check-only, capacity/PID checks, one fresh native lease for
S1/S2a/S2b/S3/S4 and all ten S5 cases, readers/adapters, 15EV collector, full
verification/binding under the conditions below (or one final full184 if any
condition fails), index generation, p04-acceptance once, separate Opus whole-unit
review, normal prepare/C/integration/final/Root DB join/ledger/main push.
If order-typed fails, preserve its result and stop before heavy execution.
Only whole-unit acceptance grants credit.
REPAIR48 current source status: see [REPAIR48_STATUS.md](../REPAIR48_STATUS.md). Earlier run directions and successes below are historical; they grant no P04 credit.
## RUN47 current admission (supersedes earlier execution instructions)
Current S4 check-only and native call the same engine-free `admission` function.
The real selected source map determines the sorted unique res:// `.gd` roster;
the whole list must match, including membership and order. Product is exactly
selected minus `tools/check_p04_order_evidence.py`; no other extra is allowed.
There is no current fixed product/script count. The supplied M copy happens to
select 1368 product files and 329 scripts; fresh Q additionally selects the checker.
Plans now carry `parse_paths`, and FreshSeries checks plan/actual/source equality.
Before import is attempted, cleanup requires the complete original inventory and
no generated UID. After import starts, the existing exact planned UID seal applies.
Failure stays failure; no previous native receipt is adopted.
The older relocation, counts, runs and receipts below are historical context only.
The historical r28 wrapper and data retain 1338/316. `receipt_lifecycle_fixtures.py`
now explicitly loads that pinned historical wrapper. Current-derived finite cases
are in `admission_controls.py`, using the retained verified-M copy and BUILD scratch.
Root must freeze final Q and run six clean check-only plans, then all fresh native
boundaries and ten S5 cases once in one heavy lease. See REPAIR47_PLAN.json and
REPAIR47_STATUS.md; worker does not execute that native sequence.
# S4 finite Root collection r28 — NOT RUN
This adds only the existing `power_stop` evidence obligation. It adds no counted
@@ -141,7 +185,7 @@ the descriptor it just appended and the index of that exact observation.
| `write_bytes` to `bootstrap/<name>` | 1 per pinned bootstrap key | The reviewed map names `profile_guard.gd` and `parse_full_dependencies.gd`; setup only |
| `/bin/cp -c` to `stage/.godot/<name>` | 1 per cache inventory key | Optional eligible-cache branch only; fresh mode never accesses cache |
| `cache-reuse.json` | 0 or 1 | Only after all optional cache clones and guards |
| `parse-paths.json` | 1 | Setup after 316-script guard |
| `parse-paths.json` | 1 | Setup after source-derived roster admission (historical r28 used 316) |
| `contracts.json` | 1 | Setup after unchanged suite-policy guard |
| `runner-input.json` | 1 | Setup; no final read/rewrite; absent if earlier setup fails |
| `engine-identity-before-<phase>.json` | 1 each for import, parse, writer, reader | Immediately after that phase's repin; failure stops loop, never resumes it |
@@ -0,0 +1,164 @@
#!/usr/bin/env python3
"""Finite engine-free admission controls. Synthetic plans are never evidence."""
import argparse
import ast
from contextlib import redirect_stdout
import hashlib
import io
import json
from pathlib import Path
import sys
from types import SimpleNamespace
from unittest.mock import patch
sys.dont_write_bytecode = True
import run_s4_native as s4
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--project-root', required=True, type=Path)
parser.add_argument('--scratch', required=True, type=Path)
args = parser.parse_args()
root = args.project_root.resolve(strict=True)
expected_root = Path(__file__).resolve().parents[6] / 'build/owner-handoff/p04-after-p26-closure-r01/verified-m-engine-free-r45'
assert root == expected_root.resolve(strict=True), 'retained M only; never Root Q'
scratch = args.scratch.resolve()
assert scratch.is_relative_to(s4.BUILD.resolve()) and not scratch.exists()
scratch.mkdir(parents=True)
r = s4.module('admission_real_selection', root / 'tools/run_all_tests.py')
selected = r.source_refs(root)
product = {n: p for n, p in selected.items() if n != s4.CHECKER}
paths = ['res://' + n for n in sorted(product) if n.endswith('.gd')]
results = []
def check(label, action, reject=False):
try:
action()
except (ValueError, AssertionError):
assert reject, label
results.append(dict(case=label, result='rejected'))
else:
assert not reject, label
results.append(dict(case=label, result='pass'))
assert len(paths) == 329, 'diagnostic pin for supplied M, not production admission'
check('real-329', lambda: s4.admission(selected, product, paths))
check('selected-checker-only-extra', lambda: s4.admission(
dict(product, **{s4.CHECKER: {'sha256': 'synthetic-checker'}}), product, paths))
other = dict(product, **{'scripts/another_valid.gd': {'sha256': 'synthetic'}})
other_paths = sorted(paths + ['res://scripts/another_valid.gd'])
check('another-derived-roster', lambda: s4.admission(other, other, other_paths))
mutations = {
'missing': paths[:-1],
'extra': sorted(paths + ['res://scripts/extra.gd']),
'same-count-substitution': sorted(paths[:-1] + ['res://scripts/substitute.gd']),
'duplicate': sorted(paths + [paths[0]]),
'non-gd': sorted(paths + ['res://project.godot']),
'stale-literal-count': paths[:316],
}
for label, roster in mutations.items():
check(label, lambda roster=roster: s4.admission(selected, product, roster), True)
check('checker-as-product', lambda: s4.admission(
dict(selected, **{s4.CHECKER: {}}), dict(product, **{s4.CHECKER: {}}), paths), True)
check('missing-product', lambda: s4.admission(selected, dict(list(product.items())[1:]), paths), True)
check('extra-selected-input', lambda: s4.admission(dict(selected, unexpected={}), product, paths), True)
# Execute the real check-only main with explicit historical template/engine
# stubs. Source selection and admission are real; no fresh-Q claim is made.
real_admission = s4.admission
calls = []
def observed(a, b, c):
calls.append((a, b, c))
return real_admission(a, b, c)
argv = ['run_s4_native.py', '--historical-r17', '--project-root', str(root),
'--output', str(scratch / 'never-native'), '--plan', str(scratch / 'synthetic-plan.json'), '--check-only']
with patch.object(s4, 'engine_pin', return_value={'synthetic': True}), \
patch.object(s4, 'template_guard'), patch.object(s4, 'MATERIALS', []), \
patch.object(s4, 'CONTRACTS', s4.HERE.parent.parent / 'completion_marker_contracts.json'), \
patch.object(s4, 'admission', side_effect=observed), \
patch.object(sys, 'argv', argv), redirect_stdout(io.StringIO()):
assert s4.main() == 0
assert len(calls) == 1 and calls[0][2] == paths
assert not (scratch / 'never-native').exists()
assert r.read(scratch / 'synthetic-plan.json')['parse_paths'] == paths
results.append(dict(case='real-check-only-shared-admission', result='pass'))
for label, roster in mutations.items():
def mutated(a, b, c):
return real_admission(a, b, roster)
bad_plan = scratch / ('rejected-plan-' + label + '.json')
bad_argv = list(argv)
bad_argv[bad_argv.index('--plan') + 1] = str(bad_plan)
with patch.object(s4, 'engine_pin', return_value={'synthetic': True}), \
patch.object(s4, 'template_guard'), patch.object(s4, 'admission', side_effect=mutated), \
patch.object(sys, 'argv', bad_argv):
check('check-only-' + label, s4.main, True)
assert not bad_plan.exists(), 'admission must precede plan write'
# Historical admission executes the original pinned r28 AST unchanged.
series = s4.module('admission_series', s4.HERE.parent / 'p04_native_series.py')
series_tree = ast.parse((s4.HERE.parent / 'p04_native_series.py').read_text())
fresh = next(n for n in series_tree.body if isinstance(n, ast.ClassDef) and n.name == 'FreshSeries')
roster_block = next(n for n in ast.walk(fresh) if isinstance(n, ast.If)
and "'S4 plan/actual parse roster'" in ast.unparse(n))
roster_code = compile(ast.Module(body=[roster_block], type_ignores=[]), '<actual FreshSeries roster block>', 'exec')
wrapper = s4.module('admission_fresh_wrapper', s4.HERE.parent / 's5/run_s5_native.py')
def series_roster(actual, planned):
obj = SimpleNamespace(name='s4', read=lambda _: json.dumps(actual).encode(), inputs={'parse_paths': planned})
exec(roster_code, dict(wrapper=wrapper, HERE=s4.HERE.parent, selected=selected,
self=obj, loads=series.loads, require=series.require))
check('FreshSeries-exact-roster', lambda: series_roster(paths, paths))
check('FreshSeries-actual-substitution', lambda: series_roster(mutations['same-count-substitution'], paths), True)
check('FreshSeries-plan-substitution', lambda: series_roster(paths, mutations['same-count-substitution']), True)
main_tree = ast.parse(Path(s4.__file__).read_text())
cache_guard = next(n for n in ast.walk(main_tree) if isinstance(n, ast.Expr)
and 'cache selection is exact product plus checker' in ast.unparse(n))
cache_code = compile(ast.Module(body=[cache_guard], type_ignores=[]), '<actual cache set guard>', 'exec')
def cache_keys(old):
exec(cache_code, dict(r=r, old_map=old, current_map=product, CHECKER=s4.CHECKER))
s4.admission(old, product, paths)
cache = dict(product, **{s4.CHECKER: {}})
check('cache-exact-product-plus-checker', lambda: cache_keys(cache))
check('cache-missing-checker', lambda: cache_keys(product), True)
check('cache-same-count-substitution', lambda: cache_keys(dict(list(cache.items())[1:], unexpected={})), True)
historical = s4.HERE / 'historical/run_s4_native_r28.py.reference'
series.verify_s4_wrapper(hashlib.sha256(historical.read_bytes()).hexdigest(), historical=True)
tree = ast.parse(historical.read_text())
guard = next(n for n in ast.walk(tree) if isinstance(n, ast.Expr)
and 'complete 316-script parse roster' in ast.unparse(n))
code = compile(ast.Module(body=[guard], type_ignores=[]), str(historical), 'exec')
# A finite synthetic historical receipt; not a replacement for native raw.
check('historical-316-receipt', lambda: exec(code, {'r': r, 'paths': paths[:316]}))
check('historical-rejects-current-roster', lambda: exec(code, {'r': r, 'paths': paths}), True)
uid_plan, snapshot, _ = s4.module('admission_uid', s4.HERE.parent / 's5/run_s5_native.py').load_uid_helper(root, r, selected)
for label in ('original-no-uid', 'partial-import', 'unknown-uid', 'changed-source'):
stage = scratch / label
(stage / 'tests/special').mkdir(parents=True)
(stage / 'tests/special/a.gd').write_text('extends Node\n')
(stage / 'tests/special/b.gd').write_text('extends Node\n')
source = r.inventory(stage, stage=True)
refs = {n: dict(p, path=str(stage / n)) for n, p in source.items()}
plan = uid_plan(refs)
assert len(plan) >= 2
if label == 'partial-import':
(stage / next(iter(plan))).write_text('uid://partial\n')
elif label == 'unknown-uid':
(stage / 'unknown.uid').write_text('uid://unknown\n')
elif label == 'changed-source':
(stage / 'tests/special/a.gd').write_text('changed\n')
state = dict(phase=None, accepted=None)
check('pre-import-' + label, lambda: s4.cleanup_uid_guard(r, snapshot, stage, source, plan, state), label != 'original-no-uid')
if label != 'original-no-uid':
state['phase'] = 'import'
check('attempted-import-' + label, lambda: s4.cleanup_uid_guard(r, snapshot, stage, source, plan, state), True)
result = dict(passed=True, controls=results, source_files=len(selected),
product_files=len(product), scripts=len(paths), engine_launches=0,
formal_acceptance=False)
(scratch / 'results.json').write_text(json.dumps(result, indent=2) + '\n')
print(json.dumps(result, indent=2))
if __name__ == '__main__':
main()
@@ -0,0 +1,405 @@
#!/usr/bin/env python3
"""S4-only native entry. --check-only never loads ownership helpers or starts Godot."""
from pathlib import Path
import argparse
import copy
import hashlib
import importlib.util
import json
import os
import shutil
import subprocess
import stat
import sys
sys.dont_write_bytecode = True
HERE = Path(__file__).resolve().parent
BUILD = Path("/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build")
PRODUCT = BUILD / "audit-support/p04-r17-full-inputs-r01/product"
CACHE_RUN = BUILD / "p04-final-product-full-r01"
TEST = "tests/s3/test_runtime_staff_assignment.gd"
QA = HERE / "p04_s4_power_probe.gd"
ENGINE = Path("/Applications/Godot.app/Contents/MacOS/Godot")
ENGINE_SHA256 = "c7cccbf8fb143e34e02fd6521e09be2c2b974f0d5db080b19071c9c570718ccf"
MANIFEST = BUILD / "audit-support/p04-r17-full-inputs-r01/MANIFEST.json"
MANIFEST_SHA = "a15f29fa12537f6d8aaf7cabea390922a9f16e3eb9c10981e5742aafc8c4c8a8"
CONTRACTS = BUILD / "audit-support/p04-r17-full-inputs-r01/fixed/6ce6b28c5985e8a4f13b78bfeb1f1e09f6216d874fb01e0656ec1633bfa01cd7/completion_marker_contracts.json"
CASES = ["S4"]
LABELS = {"S4": ["boundary", "held", "recovered"]}
SLOTS = ["S4-" + label for label in sorted(LABELS["S4"])]
MATERIALS = [MANIFEST, BUILD / "audit-support/p04-review-repair22-r01/ACTUAL_CURRENT_PUBLIC_POWER_FUNCTIONS.json"]
def template_guard(root):
if root != PRODUCT.resolve() or not HERE.is_relative_to(BUILD.resolve()):
raise ValueError("Root must stage this exact QA/wrapper/plan inside own B")
if pin(MANIFEST)["sha256"] != MANIFEST_SHA:
raise ValueError("immutable full R17 relocation manifest")
manifest = json.loads(MANIFEST.read_text())
for name, source in manifest["product_source"].items():
# Old absolute paths are lookup keys only. Never open them.
row = manifest["original_to_relocated"][source["path"]]
actual = pin(root / name)
if Path(row["relocated"]).resolve() != root / name or any(
actual[k] != source[k] or actual[k] != row[k] for k in ("bytes", "sha256")):
raise ValueError("relocated product differs: " + name)
probe = QA.read_text()
import re
if ":=" in probe or re.search(r"\bvar\s+\w+\s*=", probe) or re.search(r"\bfor\s+\w+\s+in\b", probe):
raise ValueError("explicit typed declarations/loops required")
if re.search(r"\.(?:patience_remaining|elapsed_minutes|power_available|capacity|hold_until)\s*=(?!=)", probe):
raise ValueError("forbidden direct state mutation")
for forbidden in ["evaluate_now(", "configure_operations(", "._update_shift_states(", ".record_duty_minute("]:
if forbidden in probe:
raise ValueError("forbidden bypass: " + forbidden)
# Constants and public bodies are read from the actual selected source, not a memo.
mana = (root / "scripts/mana/mana_network_service.gd").read_text()
for key in ("EVALUATION_INTERVAL_MINUTES", "MINIMUM_OFF_HOLD_MINUTES"):
if not re.search(r"const " + key + r" := 10\b", mana):
raise ValueError("source timing changed: " + key)
def module(name, path):
spec = importlib.util.spec_from_file_location(name, path)
value = importlib.util.module_from_spec(spec)
spec.loader.exec_module(value)
return value
def pin(path):
path = Path(path)
if path.is_symlink() or not path.is_file():
raise ValueError("missing exact input: " + str(path))
data = path.read_bytes()
return dict(path=str(path), bytes=len(data), sha256=hashlib.sha256(data).hexdigest())
def engine_pin(path, expected=None):
path = Path(path)
if path != ENGINE or any(p.is_symlink() for p in (path, *path.parents)):
raise ValueError("exact installed engine required; no symlink or relocated input")
if path.resolve(strict=True) != ENGINE:
raise ValueError("installed engine resolved path changed")
before = path.stat()
if not stat.S_ISREG(before.st_mode):
raise ValueError("installed engine must be regular")
digest = hashlib.sha256(path.read_bytes()).hexdigest()
after = path.stat()
fields = ("st_dev", "st_ino", "st_size", "st_mtime_ns", "st_ctime_ns", "st_mode")
if any(getattr(before, k) != getattr(after, k) for k in fields):
raise ValueError("engine changed while hashing")
if any(p.is_symlink() for p in (path, *path.parents)) or path.resolve(strict=True) != ENGINE:
raise ValueError("engine path changed while hashing")
value = dict(path=str(path), resolved_path=str(path.resolve(strict=True)),
bytes=after.st_size, mtime_ns=after.st_mtime_ns, mode=after.st_mode,
device=after.st_dev, inode=after.st_ino, ctime_ns=after.st_ctime_ns, sha256=digest)
if digest != ENGINE_SHA256:
raise ValueError("engine differs from installed engine constant")
if expected is not None and value != expected:
raise ValueError("engine identity changed")
return value
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--project-root", type=Path, default=PRODUCT)
parser.add_argument("--output", type=Path, default=BUILD / "p04-s4-native-r28")
parser.add_argument("--plan", type=Path, default=BUILD / "p04-s4-plan-r28.json")
parser.add_argument("--cache-run", type=Path, default=None,
help="optional passed registered cache; default is fresh, without cache access")
parser.add_argument("--godot", type=Path, default=ENGINE)
parser.add_argument("--check-only", action="store_true")
args = parser.parse_args()
engine_descriptor = engine_pin(args.godot)
if args.cache_run is not None and args.cache_run.resolve() != CACHE_RUN.resolve():
raise ValueError("only registered own-B full-run cache")
root = args.project_root.resolve()
out = args.output.resolve()
if not out.is_relative_to(BUILD.resolve()) or not args.plan.resolve().is_relative_to(BUILD.resolve()):
raise ValueError("plan/output must stay in task build")
if out.exists() or out.is_symlink():
raise ValueError("fresh output required")
if args.check_only and (args.plan.exists() or args.plan.is_symlink()):
raise ValueError("fresh plan required")
r = module("s4_standard_runner", root / "tools/run_all_tests.py")
# Preserve the reviewed source_refs -> exactly one QA override order.
source_before = r.source_refs(root)
refs = dict(source_before)
refs[TEST] = pin(QA)
template_guard(root)
expected = {n: dict(bytes=p["bytes"], sha256=p["sha256"]) for n, p in refs.items()}
fixed = [pin(p) for p in MATERIALS + [
QA, Path(__file__), HERE / "S4_ROOT_RUN.md",
root / "tests/transport/test_runtime_transport.gd",
root / "tests/staff/test_rescue_elevator.gd",
CONTRACTS,
]]
selected = dict(root_before=source_before, map={n: p["sha256"] for n, p in refs.items()}, timeout=1200)
cache_note = None
cache_receipts = []
if args.cache_run is not None:
# Reject failed caches before reading their inputs or cache contents.
r.require(r.read(args.cache_run / "runner-ended.json")["passed"] is True,
"failed cache is ineligible")
for leaf in (["runner-ended.json", "runner-input.json"] if args.cache_run is not None else []):
path = args.cache_run / leaf
try:
cache_receipts.append(pin(path))
except OSError as caught:
cache_note = dict(path=str(path), error=type(caught).__name__ + ": " + str(caught),
required_before_native=True)
break
plan = dict(protocol="p04-s4-preparation-v1", project_root=str(root), output=str(out), engine_path=str(args.godot.resolve()),
source_before=source_before, selected_source_map=selected["map"],
QA_overrides=[TEST], fixed_input_pins=fixed,
cache_run=str(args.cache_run) if args.cache_run is not None else None,
import_mode="cache" if args.cache_run is not None else "fresh",
engine_sha256=ENGINE_SHA256, engine=engine_descriptor,
cache_receipts=cache_receipts, cache_access=cache_note,
phases=["import", "parse", "writer", "reader"],
native_engine_launches=0, whole_goal_accepted=False, unit_accepted=False)
# Check-only only reads source/materials and writes the plan in task build.
# Reads engine identity; never launches Godot or inspects players/processes.
if args.check_only:
args.plan.parent.mkdir(parents=True, exist_ok=True)
r.write(args.plan, plan)
print(json.dumps(dict(check_only=True, engines=0, source_files=len(source_before),
QA_overrides=[TEST], fixed_pins=len(fixed), plan=str(args.plan),
plan_sha256=r.sha(args.plan), cache_access=cache_note), ensure_ascii=False))
return 0
r.require(root == PRODUCT.resolve() and len(source_before) == 1338, "Root native requires product 1338; worker plan is not native evidence")
r.require(args.plan.is_file() and r.read(args.plan) == plan, "run exact check-only plan first")
engine_observations = []
engine_identity = dict(before=engine_descriptor, during=[], after=None)
def repin(label):
try:
value = engine_pin(args.godot, engine_descriptor)
engine_observations.append(dict(stage=label, descriptor=value))
if label == "after-cleanup":
engine_identity["after"] = value
else:
engine_identity["during"].append(value)
except BaseException as caught:
engine_observations.append(dict(stage=label, error=str(caught)))
raise
def fixed_guard():
repin("cleanup-fixed-guard")
template_guard(root)
for value in fixed + cache_receipts:
r.require(pin(value["path"]) == value, "fixed input changed: " + value["path"])
fixed_guard()
old = args.cache_run
if old is not None:
# Native cache admission remains Root-only and fails closed.
r.require(cache_note is None, "Root must read exact cache receipts: " + str(cache_note))
r.require(r.read(old / "runner-ended.json")["passed"], "ended cache run must have passed")
cache_input = r.read(old / "runner-input.json")
r.require(cache_input["engine_sha256"] == ENGINE_SHA256, "cache engine identity")
old_map = cache_input["selected_source_map"]
current_map = {n: p["sha256"] for n, p in source_before.items()}
r.require({k: v for k, v in old_map.items() if k != "tools/check_p04_order_evidence.py"} == current_map and len(old_map) == 1339, "immutable full cache: all 1338 product inputs equal; checker is not parsed/executed by product suites")
protected = r.default_player(root)
outer = module("s4_owned_outer", r.SUPPORT / "owned_outer.py")
r.require(not outer.native.helper["live_engines"](), "another Godot owns CPU")
engine = ENGINE
repin("native-admission")
r.require(shutil.disk_usage(out.parent).free >= 1024**3 + engine.stat().st_size + 136*1024**2,
"reviewed native disk admission")
r.require(not out.exists(), "fresh output required; preserve previous attempts")
out.mkdir()
stage = out / "stage"
stage.mkdir()
(out / "starters").mkdir()
(out / "bootstrap").mkdir()
phases = []
previous = {}
error = None
guards = []
cleanup = []
cleanup_errors = []
cache_before = None
formal_before = None
formal_after = None
original_phase = outer.run_phase
def run_phase(argv, folder, timeout, env, **kwargs):
env = dict(env)
if folder.name in ["writer", "reader"]:
env.update(THE_TREE_S4_EVIDENCE=str(out / "raw"), THE_TREE_S4_MODE=folder.name)
return original_phase(argv, folder, timeout, env, **kwargs)
outer.run_phase = run_phase
try:
r.write(out / "runner-started.json", dict(started=r.now(), owner_runner_pid=os.getpid(),
plan=pin(args.plan), engines_launched=0))
r.write(out / "source_before.json", source_before)
r.write(out / "selected-source-map.json", refs)
# Private source stage first, then literal reviewed bootstrap.
for name, value in refs.items():
target = stage / name
target.parent.mkdir(parents=True, exist_ok=True)
r.copy_source(Path(value["path"]), target)
r.require(r.inventory(stage, stage=True) == expected, "whole private source")
for name, value in r.read(r.SUPPORT / "bootstrap-scripts.json").items():
data = value["text"].encode()
r.require(hashlib.sha256(data).hexdigest() == value["sha256"], "bootstrap pin")
(out / "bootstrap" / name).write_bytes(data)
if old is not None:
cache = old / "stage/.godot"
cache_before = r.inventory(cache)
r.require(bool(cache_before), "nonempty ended cache")
for name in cache_before:
src = cache / name
dst = stage / ".godot" / name
dst.parent.mkdir(parents=True, exist_ok=True)
subprocess.run(["/bin/cp", "-c", str(src), str(dst)], check=True)
r.require((src.stat().st_dev, src.stat().st_ino) != (dst.stat().st_dev, dst.stat().st_ino),
"cache clone is a separate inode")
r.require(r.inventory(stage / ".godot") == cache_before, "whole cache clone hashes")
r.write(out / "cache-reuse.json", dict(ended_run=str(old), receipts=cache_receipts,
whole_cache=cache_before, independent_inode=True,
ordinary_import_required=True, ordinary_parse_required=True))
paths = ["res://" + n for n in sorted(refs) if n.endswith(".gd")]
r.require(len(paths) == 316, "complete 316-script parse roster")
r.write(out / "parse-paths.json", paths)
markers = module("s4_markers", root / "tools/strict_test_markers.py")
contracts = markers.load_contracts(CONTRACTS)
contracts[TEST] = dict(test=TEST, template="S4 power: <checks> checks, <failures> failures", required=True)
policy = r.read(r.SUPPORT / "suite-policy.json")
r.require(TEST not in policy["suite_policies"], "no normal suite watchdog/policy override")
r.write(out / "contracts.json", contracts)
r.write(out / "runner-input.json", dict(plan, owner_runner_pid=os.getpid(),
wrapper_sha256=r.sha(__file__), QA=pin(QA), engine=engine_descriptor,
engine_identity_before=engine_descriptor, engine_identity_initial=copy.deepcopy(engine_identity),
runner_sha256=r.sha(root / "tools/run_all_tests.py"),
default_player_before=protected, fixed_input_pins=fixed,
functional_watchdog_seconds=1200, source_adoption=False))
diagnostics = module("s4_diagnostics", r.SUPPORT / "diagnostic_gate.py")
owners = module("s4_owners", r.SUPPORT / "ordinary_proof_gate.py")
audio = module("s4_audio", r.SUPPORT / "audio_evidence_gate.py")
public = (stage / "project.godot").read_bytes()
for phase, test in [("import", None), ("parse", None), ("writer", TEST), ("reader", TEST)]:
if phase == "reader":
writer = r.read(out / "raw/writer.json")
formal_before = {n: r.inventory(Path(p)) for n, p in writer["slots"].items()}
r.require(sorted(formal_before) == SLOTS, "exact three formal points for isolated power case")
if phase == "import" and old is None:
r.require(not (stage / ".godot").exists() and not (stage / ".godot").is_symlink(),
"fresh private .godot absent at actual import")
repin("before-" + phase)
r.write(out / ("engine-identity-before-" + phase + ".json"),
dict(engine_observations[-1], observation_index=len(engine_observations)-1))
row = r.execute_phase(str(engine), stage, out, phase, test, selected, expected,
previous, policy, contracts, paths, public, protected, root,
outer, markers, diagnostics, owners, audio)
phases.append(row)
# execute_phase writer/reader share out/<test>.log via write_text.
# Keep binary per-phase copies under these existing unique names.
# The shared runner log is not write-once; see S4_ROOT_RUN.md.
if test and row.get("log"):
(out / (phase + "-combined-raw.log")).write_bytes((out / row["log"]).read_bytes())
row["strict_runner_log_path"] = row["log"]
row["log"] = phase + "-combined-raw.log"
r.write(out / (phase + "-actual-phase.json"), row)
print(json.dumps(dict(phase=phase, passed=row["passed"], error=row.get("validation_error"))), flush=True)
r.require(row["passed"], "first strict phase failure: " + phase)
if phase in ["writer", "reader"]:
receipt = r.read(out / ("raw/" + phase + ".json"))
r.require(receipt["checks"] > 0 and receipt["failures"] == 0,
"S4 actual outcome receipt")
r.require(sorted(receipt["branches"]) == CASES,
"exact one independent Writer/Reader case")
r.require(sorted(receipt["slots"]) == SLOTS, "all formal point slots")
r.require(receipt["pid"] == row["actual_pid"], "actual native PID/receipt")
repin("after-collection")
writer = r.read(out / "raw/writer.json")
reader = r.read(out / "raw/reader.json")
r.require(writer["pid"] != reader["pid"] and writer["profile"] != reader["profile"], "distinct formal processes")
formal_after = {n: r.inventory(Path(p)) for n, p in writer["slots"].items()}
r.require(formal_before == formal_after, "Reader leaves Writer packages unchanged")
except BaseException as caught:
error = type(caught).__name__ + ": " + str(caught)
finally:
try:
cleanup, cleanup_errors = outer.finish_captured(outer.OWNED)
except BaseException as caught:
cleanup_errors.append(str(caught))
try:
r.write(out / "outer-owned-finally.json", dict(cleanup=cleanup, errors=cleanup_errors))
except BaseException as caught:
guards.append("finally receipt: " + type(caught).__name__ + ": " + str(caught))
# Explicit re-pin after cleanup is independent of other fixed-input guards.
try:
repin("after-cleanup")
except BaseException as caught:
guards.append(type(caught).__name__ + ": " + str(caught))
# Fixed guard always follows ownership cleanup, even if setup or an engine failed.
try:
fixed_guard()
after = r.source_refs(root)
r.write(out / "source_after.json", after)
r.require(after == source_before, "whole product source unchanged")
r.require(r.default_player(root) == protected, "default player unchanged")
if (stage / "project.godot").exists():
r.require(r.inventory(stage, stage=True) == dict(expected, **previous), "whole private source unchanged")
if cache_before is not None:
r.require(r.inventory(old / "stage/.godot") == cache_before, "original cache unchanged")
if formal_before is not None:
writer = r.read(out / "raw/writer.json")
formal_after = {n: r.inventory(Path(p)) for n, p in writer["slots"].items()}
r.require(formal_before == formal_after, "Writer formal packages unchanged after Reader, including failure")
except BaseException as caught:
guards.append(type(caught).__name__ + ": " + str(caught))
pids = [p.pid for p in outer.OWNED]
passed = (error is None and not guards and not cleanup_errors and len(phases) == 4
and all(p["passed"] for p in phases) and len(pids) == len(set(pids)) == 4
and all(p["engine_ended"] for p in cleanup))
execution = dict(passed=passed, error=error, guard_errors=guards, phases=phases,
actual_captured_PIDs=pids, cleanup=cleanup, cleanup_errors=cleanup_errors,
formal_before=formal_before, formal_after=formal_after,
whole_goal_accepted=False, unit_accepted=False)
# IO1 has already copied all four members into a separate Reader profile.
# Mirror those exact complete directories to own B for read-only R verification.
# Original profile paths are provenance after this step, never verifier inputs.
try:
if passed:
relocated = {}
for role in ("writer", "reader"):
receipt = r.read(out / ("raw/" + role + ".json"))
relocated[role] = {}
for slot, original in receipt["slots"].items():
target = out / "formal" / role / slot
target.mkdir(parents=True)
members = r.inventory(Path(original))
r.require(set(members) == {"journal.log", "manifest.json", "thumbnail.png", "world.bin"}, "all formal members")
for member in members:
shutil.copyfile(Path(original) / member, target / member)
r.require(r.inventory(target) == members == formal_before[slot], "whole formal mirror")
relocated[role][slot] = dict(provenance=original, relative=str(target.relative_to(out)), members=members)
r.write(out / "formal-relocation.json", relocated)
r.write(out / "raw-inventory.json", r.inventory(out / "raw"))
r.write(out / "PID-set.json", dict(owner_runner_pid=os.getpid(), engine_PIDs=pids))
except BaseException as caught:
guards.append("output collection: " + type(caught).__name__ + ": " + str(caught))
passed = False
execution["passed"] = False
try:
repin("after-output-collection")
except BaseException as caught:
guards.append(str(caught))
passed = False
execution["passed"] = False
try:
r.write(out / "engine-identity.json",
dict(observations=engine_observations, identity=engine_identity))
except BaseException as caught:
guards.append("engine identity receipt: " + type(caught).__name__ + ": " + str(caught))
passed = False
execution["passed"] = False
execution["engine_observations"] = engine_observations
execution["engine_identity"] = engine_identity
r.write(out / "execution.json", execution)
r.write(out / "runner-ended.json", dict(execution, ended=r.now()))
print(json.dumps(dict(passed=passed, error=error, guard_errors=guards, output=str(out))))
return 0 if passed else 1
if __name__ == "__main__":
try:
raise SystemExit(main())
except Exception as caught:
print(type(caught).__name__ + ": " + str(caught), file=sys.stderr)
raise SystemExit(2)
@@ -1,5 +1,5 @@
#!/usr/bin/env python3
"""Root-only synthetic receipt lifecycle fixtures. No engine/process is started.
"""Historical-pinned r28 synthetic lifecycle fixtures. No engine/process starts.
Uses the real main, exclusive JSON writer, source_refs and inventories. The
identity section is compiled directly from S4Series.__init__, not reimplemented.
@@ -10,6 +10,7 @@ from collections import Counter
from contextlib import ExitStack, redirect_stdout
import copy
import importlib.util
from importlib.machinery import SourceFileLoader
import io
import json
from pathlib import Path
@@ -21,17 +22,18 @@ from unittest.mock import patch
sys.dont_write_bytecode = True
HERE = Path(__file__).resolve().parent
ROOT = next(p for p in HERE.parents if (p / 'tools/run_all_tests.py').is_file())
WORKTREE = next(p for p in HERE.parents if (p / 'tools/run_all_tests.py').is_file())
ROOT = WORKTREE / 'build/owner-handoff/p04-after-p26-closure-r01/verified-m-engine-free-r45'
def load(name, path):
spec = importlib.util.spec_from_file_location(name, path)
spec = importlib.util.spec_from_file_location(name, path, loader=SourceFileLoader(name, str(path)))
value = importlib.util.module_from_spec(spec)
spec.loader.exec_module(value)
return value
s4 = load('receipt_s4', HERE / 'run_s4_native.py')
s4 = load('receipt_s4_historical', HERE / 'historical/run_s4_native_r28.py.reference')
r = load('receipt_standard', ROOT / 'tools/run_all_tests.py')
series = load('receipt_series', HERE.parent / 'p04_native_series.py')
@@ -78,7 +80,7 @@ def case(base, failure=None):
path.parent.mkdir(parents=True, exist_ok=True)
path.write_bytes(data)
# Real 1338-entry source_refs and 316-entry script roster, synthetic bytes.
# Historical-pinned r28 fixture only. Current-derived cases: admission_controls.py.
scripts = [s4.TEST, 'tests/transport/test_runtime_transport.gd',
'tests/staff/test_rescue_elevator.gd']
scripts += ['scripts/fixture_%03d.gd' % i for i in range(313)]
@@ -92,7 +94,7 @@ def case(base, failure=None):
assert len(r.source_refs(product)) == 1338
qa = staged / 'p04_s4_power_probe.gd'
put(qa, b'extends Node\n# synthetic override\n')
put(staged / 'run_s4_native.py', (HERE / 'run_s4_native.py').read_bytes())
put(staged / 'run_s4_native.py', (HERE / 'historical/run_s4_native_r28.py.reference').read_bytes())
put(staged / 'S4_ROOT_RUN.md', b'synthetic fixture material\n')
contracts = base / 'contracts.json'
r.write(contracts, {})
@@ -29,19 +29,20 @@ LABELS = {"S4": ["boundary", "held", "recovered"]}
SLOTS = ["S4-" + label for label in sorted(LABELS["S4"])]
MATERIALS = [MANIFEST, BUILD / "audit-support/p04-review-repair22-r01/ACTUAL_CURRENT_PUBLIC_POWER_FUNCTIONS.json"]
def template_guard(root):
if root != PRODUCT.resolve() or not HERE.is_relative_to(BUILD.resolve()):
raise ValueError("Root must stage this exact QA/wrapper/plan inside own B")
if pin(MANIFEST)["sha256"] != MANIFEST_SHA:
raise ValueError("immutable full R17 relocation manifest")
manifest = json.loads(MANIFEST.read_text())
for name, source in manifest["product_source"].items():
# Old absolute paths are lookup keys only. Never open them.
row = manifest["original_to_relocated"][source["path"]]
actual = pin(root / name)
if Path(row["relocated"]).resolve() != root / name or any(
actual[k] != source[k] or actual[k] != row[k] for k in ("bytes", "sha256")):
raise ValueError("relocated product differs: " + name)
def template_guard(root, historical=True):
if historical:
if root != PRODUCT.resolve() or not HERE.is_relative_to(BUILD.resolve()):
raise ValueError("Root must stage this exact QA/wrapper/plan inside own B")
if pin(MANIFEST)["sha256"] != MANIFEST_SHA:
raise ValueError("immutable full R17 relocation manifest")
manifest = json.loads(MANIFEST.read_text())
for name, source in manifest["product_source"].items():
# Old absolute paths are lookup keys only. Never open them.
row = manifest["original_to_relocated"][source["path"]]
actual = pin(root / name)
if Path(row["relocated"]).resolve() != root / name or any(
actual[k] != source[k] or actual[k] != row[k] for k in ("bytes", "sha256")):
raise ValueError("relocated product differs: " + name)
probe = QA.read_text()
import re
if ":=" in probe or re.search(r"\bvar\s+\w+\s*=", probe) or re.search(r"\bfor\s+\w+\s+in\b", probe):
@@ -96,6 +97,28 @@ def engine_pin(path, expected=None):
raise ValueError("engine identity changed")
return value
CHECKER = "tools/check_p04_order_evidence.py"
def admission(selected, product, paths):
"""Engine-free exact selection and parse admission; no historical counts."""
if CHECKER in product:
raise ValueError("checker is not a product input")
if set(selected) - set(product) not in (set(), {CHECKER}):
raise ValueError("only checker may be a selected extra")
if {n: p for n, p in selected.items() if n != CHECKER} != product:
raise ValueError("exact selected/product source map")
expected = ["res://" + n for n in sorted(product) if n.endswith(".gd")]
if paths != expected:
raise ValueError("exact source-derived parse roster")
return paths
def cleanup_uid_guard(r, snapshot, stage, source, plan, state):
if state["phase"] is None:
r.require(state["accepted"] is None and r.inventory(stage, stage=True) == source,
"exact original source and no generated UID before import")
else:
r.require(snapshot(stage, source, plan) == state["accepted"], "UID seal after cleanup")
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--project-root", type=Path, default=PRODUCT)
@@ -105,12 +128,33 @@ def main():
help="optional passed registered cache; default is fresh, without cache access")
parser.add_argument("--godot", type=Path, default=ENGINE)
parser.add_argument("--check-only", action="store_true")
parser.add_argument("--main")
parser.add_argument("--submission")
parser.add_argument("--tested-tree")
parser.add_argument("--historical-r17", action="store_true")
args = parser.parse_args()
shared = module("fresh_q_shared", HERE.parent / "s5/run_s5_native.py")
mode = shared.select_mode(args)
fresh = mode == "fresh-q"
if fresh and "--project-root" not in sys.argv:
raise ValueError("fresh-q requires explicit --project-root")
if fresh and "--cache-run" not in sys.argv:
args.cache_run = None
engine_descriptor = shared.engine_pin(args.godot) if fresh else None
provenance = None
engine_descriptor = engine_pin(args.godot)
if args.cache_run is not None and args.cache_run.resolve() != CACHE_RUN.resolve():
raise ValueError("only registered own-B full-run cache")
if args.project_root.is_symlink():
raise ValueError("project root symlink")
root = args.project_root.resolve()
out = args.output.resolve()
if fresh:
if not out.is_relative_to(BUILD.resolve()) or not args.plan.resolve().is_relative_to(BUILD.resolve()):
raise ValueError("fresh plan/output must stay inside BUILD")
if out.exists() or out.is_symlink() or (args.check_only and args.plan.exists()):
raise ValueError("fresh output and plan required")
if not out.is_relative_to(BUILD.resolve()) or not args.plan.resolve().is_relative_to(BUILD.resolve()):
raise ValueError("plan/output must stay in task build")
if out.exists() or out.is_symlink():
@@ -120,15 +164,20 @@ def main():
r = module("s4_standard_runner", root / "tools/run_all_tests.py")
# Preserve the reviewed source_refs -> exactly one QA override order.
source_before = r.source_refs(root)
if fresh:
provenance = shared.fresh_q_guard(root, args.main, args.submission, args.tested_tree)
refs = dict(source_before)
refs[TEST] = pin(QA)
template_guard(root)
template_guard(root, historical=not fresh)
product_refs = {n: p for n, p in refs.items() if n != CHECKER}
paths = ["res://" + n for n in sorted(product_refs) if n.endswith(".gd")]
admission(refs, product_refs, paths)
expected = {n: dict(bytes=p["bytes"], sha256=p["sha256"]) for n, p in refs.items()}
fixed = [pin(p) for p in MATERIALS + [
fixed = [pin(p) for p in ([] if fresh else MATERIALS) + [
QA, Path(__file__), HERE / "S4_ROOT_RUN.md",
root / "tests/transport/test_runtime_transport.gd",
root / "tests/staff/test_rescue_elevator.gd",
CONTRACTS,
root / shared.C_REL if fresh else CONTRACTS,
]]
selected = dict(root_before=source_before, map={n: p["sha256"] for n, p in refs.items()}, timeout=1200)
cache_note = None
@@ -147,13 +196,23 @@ def main():
break
plan = dict(protocol="p04-s4-preparation-v1", project_root=str(root), output=str(out), engine_path=str(args.godot.resolve()),
source_before=source_before, selected_source_map=selected["map"],
QA_overrides=[TEST], fixed_input_pins=fixed,
QA_overrides=[TEST], parse_paths=paths, fixed_input_pins=fixed,
cache_run=str(args.cache_run) if args.cache_run is not None else None,
import_mode="cache" if args.cache_run is not None else "fresh",
engine_sha256=ENGINE_SHA256, engine=engine_descriptor,
cache_receipts=cache_receipts, cache_access=cache_note,
phases=["import", "parse", "writer", "reader"],
native_engine_launches=0, whole_goal_accepted=False, unit_accepted=False)
if fresh:
uid_plan, uid_snapshot, uid_binding = shared.load_uid_helper(root, r, source_before)
uid_source = copy.deepcopy(expected)
uid_plan_map = uid_plan(refs)
plan.update(protocol="p04-s4-fresh-q-v1", mode=mode, provenance=provenance, engine=engine_descriptor,
engine_sha256=engine_descriptor["sha256"], uid_helper=uid_binding,
uid_plan=uid_plan_map, import_mode="fresh" if args.cache_run is None else "cache",
historical_r17=False, fresh_q_evidence=False)
fixed.append(pin(HERE.parent / "s5/run_s5_native.py"))
# No historical execution is admitted.
# Check-only only reads source/materials and writes the plan in task build.
# Reads engine identity; never launches Godot or inspects players/processes.
if args.check_only:
@@ -163,7 +222,7 @@ def main():
QA_overrides=[TEST], fixed_pins=len(fixed), plan=str(args.plan),
plan_sha256=r.sha(args.plan), cache_access=cache_note), ensure_ascii=False))
return 0
r.require(root == PRODUCT.resolve() and len(source_before) == 1338, "Root native requires product 1338; worker plan is not native evidence")
r.require(fresh, "historical mode is read-only")
r.require(args.plan.is_file() and r.read(args.plan) == plan, "run exact check-only plan first")
engine_observations = []
engine_identity = dict(before=engine_descriptor, during=[], after=None)
@@ -178,9 +237,19 @@ def main():
except BaseException as caught:
engine_observations.append(dict(stage=label, error=str(caught)))
raise
reports, phase_call, uid_state = shared.make_uid_policy(r, uid_snapshot, uid_source, uid_plan_map, out)
engine_checks = []
def fresh_engine_check(label):
value = shared.engine_pin(args.godot, engine_descriptor)
engine_checks.append(dict(label=label, descriptor=value))
def fixed_guard():
fresh_engine_check("fixed")
r.require(shared.fresh_q_guard(root, args.main, args.submission, args.tested_tree) == provenance,
"fresh Q provenance changed")
r.require(pin(root / uid_binding["helper_path"])["sha256"] == uid_binding["helper_sha256"],
"UID helper changed")
repin("cleanup-fixed-guard")
template_guard(root)
template_guard(root, historical=not fresh)
for value in fixed + cache_receipts:
r.require(pin(value["path"]) == value, "fixed input changed: " + value["path"])
fixed_guard()
@@ -193,7 +262,9 @@ def main():
r.require(cache_input["engine_sha256"] == ENGINE_SHA256, "cache engine identity")
old_map = cache_input["selected_source_map"]
current_map = {n: p["sha256"] for n, p in source_before.items()}
r.require({k: v for k, v in old_map.items() if k != "tools/check_p04_order_evidence.py"} == current_map and len(old_map) == 1339, "immutable full cache: all 1338 product inputs equal; checker is not parsed/executed by product suites")
r.require(set(old_map) == (set(current_map) - {CHECKER}) | {CHECKER},
"cache selection is exact product plus checker")
admission(old_map, {k: v for k, v in current_map.items() if k != CHECKER}, paths)
protected = r.default_player(root)
outer = module("s4_owned_outer", r.SUPPORT / "owned_outer.py")
r.require(not outer.native.helper["live_engines"](), "another Godot owns CPU")
@@ -253,11 +324,10 @@ def main():
r.write(out / "cache-reuse.json", dict(ended_run=str(old), receipts=cache_receipts,
whole_cache=cache_before, independent_inode=True,
ordinary_import_required=True, ordinary_parse_required=True))
paths = ["res://" + n for n in sorted(refs) if n.endswith(".gd")]
r.require(len(paths) == 316, "complete 316-script parse roster")
admission(refs, product_refs, paths)
r.write(out / "parse-paths.json", paths)
markers = module("s4_markers", root / "tools/strict_test_markers.py")
contracts = markers.load_contracts(CONTRACTS)
contracts = markers.load_contracts(root / shared.C_REL if fresh else CONTRACTS)
contracts[TEST] = dict(test=TEST, template="S4 power: <checks> checks, <failures> failures", required=True)
policy = r.read(r.SUPPORT / "suite-policy.json")
r.require(TEST not in policy["suite_policies"], "no normal suite watchdog/policy override")
@@ -283,7 +353,10 @@ def main():
repin("before-" + phase)
r.write(out / ("engine-identity-before-" + phase + ".json"),
dict(engine_observations[-1], observation_index=len(engine_observations)-1))
row = r.execute_phase(str(engine), stage, out, phase, test, selected, expected,
fresh_engine_check("before-" + phase)
if phase == "import" and old is None:
r.require(not (stage / ".godot").exists(), "fresh import cache absent")
row = phase_call(str(engine), stage, out, phase, test, selected, expected,
previous, policy, contracts, paths, public, protected, root,
outer, markers, diagnostics, owners, audio)
phases.append(row)
@@ -330,6 +403,8 @@ def main():
# Fixed guard always follows ownership cleanup, even if setup or an engine failed.
try:
fixed_guard()
cleanup_uid_guard(r, uid_snapshot, stage, uid_source, uid_plan_map, uid_state)
r.write(out / "fresh-engine-checks.json", engine_checks)
after = r.source_refs(root)
r.write(out / "source_after.json", after)
r.require(after == source_before, "whole product source unchanged")
@@ -345,7 +420,7 @@ def main():
except BaseException as caught:
guards.append(type(caught).__name__ + ": " + str(caught))
pids = [p.pid for p in outer.OWNED]
passed = (error is None and not guards and not cleanup_errors and len(phases) == 4
passed = (uid_state["accepted"] is not None and error is None and not guards and not cleanup_errors and len(phases) == 4
and all(p["passed"] for p in phases) and len(pids) == len(set(pids)) == 4
and all(p["engine_ended"] for p in cleanup))
execution = dict(passed=passed, error=error, guard_errors=guards, phases=phases,
@@ -1,3 +1,117 @@
# REPAIR45 — whole unit remains incomplete
## REPAIR45 — implementation ready for submission
The supplied byte-verified M engine-free context resolved the REPAIR44 UID dependency.
UID controls: all 14 PASS, exit 0. Both supplied helper SHA-256 pins match exactly.
AST and explicit fresh BUILD-cfile py_compile passed for all eight touched Python
files, with python3 -B and PYTHONDONTWRITEBYTECODE=1. No source was changed in
REPAIR45; retained passing controls were not rerun. The no-pyc static check
passed again (exit 0); generated compile files exist only under allocated BUILD.
The prior UID failure remains recorded as failed, not replaced with a PASS.
Sequential check-only S1, S2a, S2b, S3, S4 and S5 each returned exit 2:
`ValueError: checkout is not clean`
The initial missing-tested-tree argument refusals are also retained. The later
attempt used the actual HEAD tree solely as a guard input, not a claim of final
Q, clean source or C. No engine started. Root executes clean exact-Q check-only
after automatic submission. Full argv/stdout/stderr and compile paths are in
REPAIR41_STATIC_CHECKS.json. No Git writes, Runner or native run were performed.
Implementation is ready; the whole original unit remains incomplete and P04
credit remains 0. Deferred Root conditions, in order: freeze final Q; affected
pure controls; clean exact-Q check-only; capacity check; one heavy lease with
fresh native S1–S4 and all ten S5 cases; independent Reader and adapters on actual
raw (including fresh Reader order positives); fresh collect; full 184 suite once;
index; --verify-only; registered validation before review; independent whole-unit
Opus review; normal prepare / exact C / integration / final / Root DB join /
ledger / main push. Native Reader and acceptance remain pending.
patience_release stays pending unless fresh S3 raw shows it. Product freeze,
M, allowed paths, REQUIRED membership/thresholds, all seven domains, G1/G2,
R40–R44 and the existing one-trailing-LF spec protocol remain unchanged.
# REPAIR44 — original whole unit incomplete
Worker status is **blocked**, not ready for Root native execution. UID pure
control could not read the supplied Q checkout's tools/run_all_tests.py
(PermissionError). See ../REPAIR41_STATUS.md and ../REPAIR41_STATIC_CHECKS.json.
AST/build compilation for every touched Python file and check-only S1–S5
remain unexecuted; resume worker verification before freezing a final Q.
Native Reader and acceptance remain pending. The current ten-case roster is
`S5A_PURE`, `S5B_DEPENDENCY`, `S5C_DESTRUCTION_COMMAND`, `S5D_DESTRUCTION_RAID`,
`S5D_IN_FLIGHT`, `S5D_PAID_BEFORE_INCIDENT`, `S5E_MIDNIGHT`, `S5F_EXIT`,
`S5G_SHIFT_1080`, `S5H_PAUSED_MIDNIGHT`.
The new case supplies a typed raw derivation for N completion/payment, public
event destruction after payment, and N+1 failure/release of the secondary.
It does not supply executed native evidence. The D05 destruction gate requires
it in addition to every existing command/guard/idle/in-flight gate.
patience_release stays pending unless fresh S3 raw proves it.
r35, r36, R40 native and R43 native remain FAILED. Q37 is a local PASS for its
own version only. R43 Writer 2749/0, seven Writer-only derivers plus G1/G2, twelve
pure controls and six check-only steps retain their limited historical scope;
none is independent Reader proof. Original credit 30/88, formal credit 16/88,
P04 credit 0; no new task/unit/worker or completion claim.
REPAIR41_STATIC_CHECKS.json records only worker checks actually executed.
Root must freeze final Q, then follow S5_ROOT_RUN.md, including fresh S1–S5,
Reader/adapters, collect, full 184 suite once, index, verify-only, registered
validation, independent review and normal integration. Historical text below
does not replace this order or the current ten-case roster.
# Historical REPAIR43 — native evidence and formal acceptance pending
The R42/R43 implementation batch now includes the public-restored G1/G2
journal shadows, independent typed adapter oracle, exact-N idle OBJECTIVE
breach, S5D_IN_FLIGHT event destruction, S5G_SHIFT_1080, S5H_PAUSED_MIDNIGHT,
and S5E public same-minute advance_to after formal restore. See
`../REPAIR41_STATUS.md` and `../REPAIR43_SOURCE_FACTS.json` for source bodies,
lines, hashes and the spec EOF protocol. The closed-field/file-freeze blockers
are superseded. The spec passes its existing checker protocol without edits.
Implementation is not native proof. Root must run the fresh nine-case S5
Writer/Reader and adapters alongside fresh S1–S4 in the prescribed single
batch. The new shift/paused/replay keys are emitted only after fresh typed raw
derivation; paused_midnight is then removed from the adapter pending list.
patience_release remains pending unless fresh S3 independently supplies it.
Future-raw positives and mutations are Root-only. No historical run supplies
these new keys. All 15+EV requirements and thresholds remain mandatory.
Pure results are in `../REPAIR43_PURE_RESULTS.json`; static results are in
`../REPAIR41_STATIC_CHECKS.json`. r35/r36/R40 native remain FAILED, Q37 is only
its own-version local PASS, and P04 credit remains 0. Registered validation
precedes formal independent whole-unit review. No native/full run was performed
by this worker; no completion claim or new counted unit is made.
## Historical REPAIR41 partial repair (superseded implementation status)
See `../REPAIR41_STATUS.md`: M serializes an additional `command_queue.accepted`
metadata row for both guard failures, outside the explicitly enumerated G1/G2
queue deltas. Its inclusion needs clarification before claiming exact equality.
Only the mandatory-condition diagnostic and historical/fresh S4 wrapper
separation are implemented and supersede their earlier repair-pending entries.
S5D re-scope/G1/G2/breach, S5G/S5H, same-minute replay, adapter derivations and
fresh-condition wiring remain pending. R40 native S5D remains FAILED; its prior
source implementation below is not an accepted fixture. No P04 credit is earned.
## Historical REPAIR40 implementation supersession
The implementation-pending statements below are superseded only for S5A/S5B
power, S5C command destruction, S5D automatic raid destruction, S5E paid midnight
and S5F command/planned exit. The single CASE_TABLE now dispatches these cases.
No case is relabelled as an executed proof. Root must establish every outcome
from fresh Q raw; an unalignable raid or unsupported condition fails normally.
The S5 order adapter does not infer patience_release or paused_midnight.
Fresh S3 can supply patience_release only from its own actually observed raw.
The remaining frozen REQUIRED conditions, including shift_completion,
same_minute_replay and paused_midnight, are not supplied by historical union.
The final checker must remain failed if any required condition is missing.
The earlier text is retained as historical planning context:
# S5 — pending implementation, not a native run plan
No S5 executable driver or native receipt is supplied by this partial repair.
@@ -1,3 +1,268 @@
## REPAIR49 normal-gate handoff
Required materials: exact B/native-first-current and fresh-run registry; each
runner-input/ended/source/UID/formal/raw/lifecycle receipt; original recorded Q
and engine context; B/p04-evidence/runner-materials and RELOCATION.json; matching
collection/MANIFEST and separate dependency invocation; original full run and
full_suite binding/raw receipts; final index and invocation receipt; immutable
authorities in frozen checkout. No raw or historical receipt is rewritten.
Two-placement identity requires the explicit closure in repair48_identity_controls.py,
missing-file rejection, and original/A/B complete path/bytes/SHA tables and tree
hash equality before and after positive execution. See REPAIR49_STATUS.md.
Submission is followed by new Q freeze, affected pure controls (complete_B included),
clean exact-Q check-only, capacity/PID checks, one fresh native lease for
S1/S2a/S2b/S3/S4 and all ten S5 cases, readers/adapters, 15EV collector, full
verification/binding under the conditions below (or one final full184 if any
condition fails), index generation, p04-acceptance once, separate Opus whole-unit
review, normal prepare/C/integration/final/Root DB join/ledger/main push.
If order-typed fails, preserve its result and stop before heavy execution.
Only whole-unit acceptance grants credit.
## REPAIR49 full184 conditional reuse candidate — all conditions UNVERIFIED
Native reuse is forbidden: all six series require fresh M/S/Q_tree provenance
(p04_native_series.py:1287; checker:370). Full uses the existing separate binding
(checker:1175-1186); no adopter or checker change is authorized.
The following are requirements, not results or approval:
1. New S5 source_before must equal old full selected_source_map: all 1369 keys
and SHA values, not counts alone.
2. Old project_root must remain unchanged: source-start == current source_refs
== post-verification source_refs (full_suite_verifier.py:115).
3. selected_source_map, roster184, parse329, settings, runner/marker module,
marker contract, suite-policy and UID plan/stage must all match (116-152,225).
4. inputs.engine must match current engine_pin (124-125).
5. Revalidate every phase PID, cleanup, marker and diagnostics (154-228).
6. Current s5/run_s5_native.py and full_suite_verifier.py SHA must equal the
Root rehearsal versions.
7. Never relabel old S/oldQ/project_root/PIDs/time. Describe reuse only as
revalidating the exact-source-identical old full through the existing
full_suite route; never claim full ran on new S.
8. A separate Opus whole-unit review must independently confirm applicability.
Conditions 1–6 require actual checks after final freeze. If any predicate is
unproved or differs, reject reuse and execute full184 once on the final version.
SourceRefs (tools/run_all_tests.py:40-45) excludes docs/private package, but that
fact is no substitute for complete source equality. No reuse is approved here.
REPAIR48 current source status: see [REPAIR48_STATUS.md](../REPAIR48_STATUS.md). Earlier run directions and successes below are historical; they grant no P04 credit.
# REPAIR45 handoff
## REPAIR45 — implementation ready for submission
The supplied byte-verified M engine-free context resolved the REPAIR44 UID dependency.
UID controls: all 14 PASS, exit 0. Both supplied helper SHA-256 pins match exactly.
AST and explicit fresh BUILD-cfile py_compile passed for all eight touched Python
files, with python3 -B and PYTHONDONTWRITEBYTECODE=1. No source was changed in
REPAIR45; retained passing controls were not rerun. The no-pyc static check
passed again (exit 0); generated compile files exist only under allocated BUILD.
The prior UID failure remains recorded as failed, not replaced with a PASS.
Sequential check-only S1, S2a, S2b, S3, S4 and S5 each returned exit 2:
`ValueError: checkout is not clean`
The initial missing-tested-tree argument refusals are also retained. The later
attempt used the actual HEAD tree solely as a guard input, not a claim of final
Q, clean source or C. No engine started. Root executes clean exact-Q check-only
after automatic submission. Full argv/stdout/stderr and compile paths are in
REPAIR41_STATIC_CHECKS.json. No Git writes, Runner or native run were performed.
Implementation is ready; the whole original unit remains incomplete and P04
credit remains 0. Deferred Root conditions, in order: freeze final Q; affected
pure controls; clean exact-Q check-only; capacity check; one heavy lease with
fresh native S1–S4 and all ten S5 cases; independent Reader and adapters on actual
raw (including fresh Reader order positives); fresh collect; full 184 suite once;
index; --verify-only; registered validation before review; independent whole-unit
Opus review; normal prepare / exact C / integration / final / Root DB join /
ledger / main push. Native Reader and acceptance remain pending.
patience_release stays pending unless fresh S3 raw shows it. Product freeze,
M, allowed paths, REQUIRED membership/thresholds, all seven domains, G1/G2,
R40–R44 and the existing one-trailing-LF spec protocol remain unchanged.
# REPAIR44 — ten cases, final Q must be frozen by Root
**Worker blocked on an unreadable UID-check dependency; do not start native
execution from this partial repair.** See ../REPAIR41_STATUS.md. Remaining
worker AST/compile and check-only checks must finish before this Root order.
The complete roster is `S5A_PURE`, `S5B_DEPENDENCY`, `S5C_DESTRUCTION_COMMAND`,
`S5D_DESTRUCTION_RAID`, `S5D_IN_FLIGHT`, `S5D_PAID_BEFORE_INCIDENT`,
`S5E_MIDNIGHT`, `S5F_EXIT`, `S5G_SHIFT_1080`, `S5H_PAUSED_MIDNIGHT`.
CASES is sorted from CASE_TABLE; LABELS and all 23 slots derive from it.
Receipt membership is order-independent and rejects missing/duplicate/extra
cases or slots. Reader independently enumerates CASE_TABLE.
The new case completes and pays the primary at N, destroys through the public
automatic event in INCIDENTS_AND_EVENTS at N, and fails/releases the unfinished
secondary at N+1. See ../REPAIR44_SOURCE_FACTS.json and the REPAIR44 section in
../REPAIR41_STATUS.md. No Defense asset registration or guard bypass is used.
Run repair44_controls.py in addition to every existing pure control. Synthetic
typed controls are not native evidence. R43 Writer 2749/0 and Writer-only typed
analysis did not run the Reader; R43 native remains FAILED.
Authoritative Root order, after freezing the final Q:
1. Affected pure controls, including repair44_controls.py.
2. Check-only S1–S5 plan (after controls finish writing temporary fixtures).
3. Capacity check.
4. One heavy lease: fresh native S1–S5, all ten S5 cases.
5. Independent Reader and adapters on actual raw.
6. Fresh collect, recomputing the new D05 sub-gate from raw.
7. Full 184 exact-Q regression once.
8. Index.
9. --verify-only.
10. Registered validation.
11. Independent whole-unit Opus review.
12. Normal prepare / exact C / integration / final / Root DB join / ledger / main push.
No worker engine/native/full regression or Git write is authorized. Whole-unit
acceptance and patience_release remain pending. Local checks earn no credit.
# Historical REPAIR43 submission — superseded current roster
The R41 closed journal-field restriction and R42 raw-only spec stop are
superseded. The spec passes the existing one-final-LF checker condition.
`../REPAIR41_STATUS.md` describes the complete R42/R43 implementation and
`../REPAIR43_SOURCE_FACTS.json` contains full current-M source bodies/hashes.
This is a QA submission, not admission, native PASS or formal completion.
The case table now includes S5A/B/C, S5D_DESTRUCTION_RAID (idle OBJECTIVE plus
G1), S5D_IN_FLIGHT (event path plus G2), S5E/F, S5G_SHIFT_1080 and
S5H_PAUSED_MIDNIGHT. The wrapper already derives CASES/LABELS/SLOTS from this
table. Preserve the table-driven full roster. G1/G2 use public paused immediate
submission with detached public-restored shadows; business state is identical
and the whole typed journal is independently recomputed by the adapter.
Stage the entire QA hierarchy, including new `s5_guard_oracle.py`, with the
selected exact Q. Worker static/pure outputs do not establish Q applicability.
Run `s5_order_adapter_controls.py --pure-only` among affected pure controls.
After fresh Reader raw exists, run its ordinary explicit
`--raw-root/--writer-sha256/--reader-sha256/--scratch` mode as well; this executes
the actual-data derivations and all typed order/guard mutations. Preserve the
failed R40 native result and never reuse its missing Reader as a positive.
Authoritative corrected Root order:
1. Affected pure controls.
2. Check-only S1–S5 plans.
3. Capacity check under existing permissions, with no unapproved deletion.
4. One heavy lease for fresh native S1–S5 including S5D/G/H, PID/cleanup checks
and complete restore manifests.
5. Reader and adapter on actual raw, including the fresh-raw mutation controls.
6. Fresh collect.
7. Full suite once, after source and controls are ready.
8. Index.
9. --verify-only.
10. Registered validation.
11. Formal independent whole-unit Opus review.
12. Prepare / exact-C standing authorization / integration / final / DB join /
ledger / push under the existing Root workflow.
No heavy tests while the worker is active. A second batch is only for defects
revealed by observed native raw. The obsolete 500000-byte review-material cap
does not apply; do not omit source/evidence or compress merely to meet it.
## Historical REPAIR41 direction (superseded by the order above)
The exact G1/G2 oracle has a source-contract conflict documented in
`../REPAIR41_STATUS.md`. M also serializes one new `command_queue.accepted` row.
Only the mandatory-condition diagnostic and historical/fresh S4 wrapper pin
separation are repaired. S5D/G/H and adapter/fresh wiring remain unimplemented.
Do not treat the partial pure-check results as worker success or native evidence.
After a complete submission, the recorded Root order remains:
1. Affected pure controls.
2. Check-only S1–S5 plan.
3. Capacity check before the single heavy lease (about 3 GB free; OS swap is
separate from evidence); only verified compression or approved cold-drive
offload if needed, with no unapproved deletion.
4. One heavy lease for fresh native S1–S5 including S5D/G/H, PID/cleanup checks,
complete Git restore manifest and reuse of the ended Q.
5. Reader and S5 order adapter on actual raw.
6. Fresh collect.
7. Full suite 184/329 once on final Q.
8. Index.
9. --verify-only.
10. Independent Opus review of the whole unit.
11. Registered validation.
12. Normal prepare/final, exact-C approval, integration, Root DB join, ledger
and main push.
This list preserves the latest recorded order over the earlier condensed list
below. A second batch is only for defects revealed by observed native raw.
# REPAIR40 A–F source batch — Root verification required
This section supersedes earlier implementation-pending directions below only
for the code now supplied. It is not admission, a native result, original credit,
or permission to repeat the once-only final full run.
Root order (unchanged):
1. Affected pure controls. Keep every previous negative. Run full_suite_verifier.py
--controls. New S5 typed mutation controls require actual fresh native raw;
their positives remain unexecuted until that raw exists.
2. Check-only S1–S5 plans on the final Q.
3. One heavy lease: fresh native S1–S5, capacity/PID checks and verified complete
Writer/Reader restore manifests. Within this step, evaluate the order adapter
and its typed mutation controls against actual S5 raw when available.
4. Fresh collect to a new exclusive audit-support/p04-raw-collect-q<N>.
5. Full 184/329 once on final Q; derive actual roster/parse/source counts.
6. Index.
7. --verify-only.
8. Independent review.
9. Normal prepare/final and Root post-final normal_c_join.
Stage the complete unchanged directory hierarchy (including shared s5 wrapper,
adapters and series dependencies) under BUILD/audit-support/p04-fresh-context.
Stage the actual Q source there as well, preserving source bytes. Native outputs
must be separate directories under BUILD, outside that context directory.
Use --main M --submission S --tested-tree Qt --project-root <actual-Q> for every
run_s*_native.py. No global monkeypatching is used to select Q.
Historical --historical-r17 --check-only remains read-only. No historical native
execution is admissible. All fresh plans/outputs are exclusive and must be absent.
The single QA override and the selected source/UID/engine/ownership gates remain.
Before fresh collection Root writes audit-support/p04-fresh-runs.json from the
actual receipts (no baked receipt SHA values):
- protocol: p04-fresh-runs-v1
- M, S, Q_tree: the actual full HEX40 inputs
- collection: audit-support/p04-raw-collect-q<N>
- series: exactly s1, s2a, s2b, s3, s4, s5; each entry has run (BUILD-relative)
and byte/SHA descriptors named runner_input, runner_ended, raw_inventory,
formal_relocation, read from the corresponding actual output files.
- full_suite: run (BUILD-relative), runner_input and runner_ended descriptors
from the final full run. These fields are consumed at index/checker time,
so fresh collection precedes and does not depend on the full run.
Use collect_p04_native.py --build <BUILD> --fresh q<N>.
Never overwrite r22 and never merge its verified_conditions.
The full run uses the actual Q tools/run_all_tests.py standard schema and the
Root finite-UID controller contract illustrated in the hash-verified context.
Retain source-start.json, runner-input/ended, all-tests, parse-paths, every phase
receipt/process/started/ended/log, UID plan/seals, retained stage and generated
reports. full_suite_verifier imports that actual Q runner and marker/diagnostic
modules. Its 15+EV entries explicitly distinguish suite applicability from
boundary proof. test_required_kitchen is separately bound. It consumes no C,
prepare/final or independent-review result; normal C remains Root's later join.
S5 has one CASE_TABLE for reserved counts, ordered labels and prepare/advance/
stop/assert methods. S5A/B retain their original recovery and duplicate path.
S5C–F use public commands and ordinary ticks. The automatic raid uses the
autonomy fixture strengths with the service facility as OBJECTIVE; its queried
earliest_minute must equal N. New cases replay independently after formal load.
The adapter uses typed nodes, complete typed restore/replay equality and raw
phase/receipt joins. It fails rather than fabricating an unavailable observation.
The private receipt buffer is restored for C–F because their boundary already
contains transactions; the A/B boundary receipt behavior is unchanged.
No worker engine, Git, Runner, native or controls run occurred. Only the recorded
static checks were performed. r35/r36 remain FAILED; worker38/39 stops remain
historical records; Q37 remains a local diagnostic. Original credit remains zero.
## Retained earlier directions
# Concrete32 power pair — unexecuted, not batch admission
`p04_s5_power_probe.gd` supplies S5A_PURE (paid public bath, genuine mana
@@ -31,12 +296,12 @@ After the final submission, Root alone prepares Q using these steps (not perform
checkout carrier of Q, never normal Runner C. R34 and Root normal_c_join
remain unchanged.
3. Stage the s5 directory under Root's own B, the registered BUILD directory.
4. Follow the REPAIR36 order below, with fresh output and plan paths:
4. Follow the REPAIR37 order below, with fresh output and plan paths:
```sh
BUILD_OUTPUT_DIR="$B" python3 "$B/.../run_s5_native.py" \
--project-root "$wt" --main "$M" --submission "$S" --tested-tree "$Qt" \
--check-only --plan "$B/p04-s5-plan-r36.json" --output "$B/p04-s5-DIAG-r36"
--check-only --plan "$B/p04-s5-plan-r37.json" --output "$B/p04-s5-DIAG-r37"
```
5. Pure fixtures and controls follow the order below. Their JSON has accepted=false.
@@ -69,16 +334,24 @@ replace declared_reports while preserving the execute_phase code object.
All four phase UID receipts and the post-cleanup seal are required.
Historical mode has no UID instrumentation and remains read-only.
Root order, all unexecuted by this worker:
Root order for REPAIR37, all unexecuted by this worker (supersedes the earlier r36 order):
1. py_compile the wrapper and both pure control files.
2. Run s5_wrapper_fixtures.py.
3. Run `python3 "$B/.../s5_uid_controls.py" --project-root "$wt" --scratch "$B/p04-s5-uid-controls-r36"`.
Scratch must be absolute, absent, outside Q, with an existing parent in BUILD.
4. Produce a fresh check-only plan with the command above.
5. Perform exactly one fresh diagnostic with the identical command and paths,
removing only --check-only. Use a new output name; preserve
`p04-s5-DIAG-r35` as FAILED. This is a bounded diagnostic, not full admission.
1. py_compile the wrapper, adapter and pure controls.
2. Run s5_uid_controls with explicit fresh BUILD scratch; UID sources/settings remain unchanged.
3. Run the adapter controls against the read-only q36-writer-contract bundle:
`python3 "$B/.../s5_power_adapter_controls.py" --fixture-dir "$fixture" --scratch "$B/p04-s5-adapter-controls-r37"`.
Scratch must be explicit, absolute, absent, outside project/fixture, with existing parent inside registered BUILD.
Verify accepted=false and root_only=true; this grants no acceptance.
4. Produce a fresh source-pinned check-only plan with the command above.
5. Perform at most one fresh source-pinned diagnostic under a new name, removing only --check-only.
Preserve p04-s5-DIAG-r36 as FAILED without retrospective pass. No full184 run.
Observe whether submit_command enqueue rejection emits command_completed: the probe's existing success expectation is unchanged, so such emission remains a failure.
Current grounding for this behavior is limited to command_queue.gd.reference and TYPED_AUDIT raw.
All six D05 decisions are approved in the actual human record; adoption verification is pending.
Counters stay 37; M c0ea009, original 30/88, formal 16/88 and P04 credit 0 remain frozen.
Whole independent Opus review and normal prepare/exact candidate/integration/final/Root join/ledger remain pending.
No full184 until the whole batch is ready.
Root must confirm the actual Q run_all_tests.py matches the supplied reference
(sha256 prefix 320ca668); the worker read only the mirror for Q API context.
@@ -86,3 +359,25 @@ Runtime helper fingerprints and source/provenance guards bind the actual Q.
No full regression, 15+EV batch or original credit is claimed. The S5
destruction/midnight/exit drivers, S1–S4/collector fresh Q, derived 184 suites /
329 parse, truthful index and Root exact-candidate qualification remain pending.
## REPAIR50 preparation (2026-10-18)
Commander-reported prior observation: all-equal array reversal produced
identical bytes (raw SHA prefix `bb0ccb1d…`), correctly accepted by the oracle;
the old control incorrectly required reject. Reported elapsed: 761.085 seconds.
This worker has not rerun that observation and does not supply a full SHA
from the abbreviated handoff. Earlier failure records are preserved.
The order control now records identity accept separately, swaps unequal typed
bytes, lists no-genuine-order cases, avoids duplicate parsing of the uncopied
record and memoizes only genuine BEFORE/command/guard derivations under strict
source-bound keys with finally restoration. Both copied modes and all
AFTER/journal/body traversal remain. Negative rejection is still ValueError;
parser rejection is separately visible. Synthetic equal-array, swap, type,
value, AFTER-copy and memo controls are prepared in --pure-only.
repair48_identity_controls.tree now hashes fixed-size chunks; its roster and
all other fixture logic remain unchanged. Root must run the new
repair50_stream_controls.py equivalence control. Only AST parse was performed
by this worker. No pure/native/formal pass, reuse approval or credit is claimed.
See ../REPAIR50_STATUS.md before running the existing Root sequence.
@@ -1,7 +1,18 @@
extends "res://tests/s3/test_runtime_actor_hardening.gd"
const CASES: Array[String] = ["S5A_PURE", "S5B_DEPENDENCY"]
const SEEDS: Dictionary = {"S5A_PURE": 420550, "S5B_DEPENDENCY": 420551}
const CASE_TABLE: Dictionary = {
"S5A_PURE": {"expected_reserved_ids": 0, "labels": ["boundary", "held", "recovered", "duplicate_guard"], "prepare": "_prepare", "advance": "_advance", "stop": "_assert_stopped", "assert": "_assert_outcome"},
"S5B_DEPENDENCY": {"expected_reserved_ids": 1, "labels": ["boundary", "held", "recovered", "duplicate_guard"], "prepare": "_prepare", "advance": "_advance", "stop": "_assert_stopped", "assert": "_assert_outcome"},
"S5C_DESTRUCTION_COMMAND": {"expected_reserved_ids": 1, "labels": ["boundary", "held"], "prepare": "_prepare_order", "advance": "_advance_order", "stop": "_assert_order_stop", "assert": "_assert_order"},
"S5D_DESTRUCTION_RAID": {"expected_reserved_ids": 0, "labels": ["boundary", "held"], "prepare": "_prepare_idle_breach", "advance": "_advance_order", "stop": "_assert_idle_breach", "assert": "_assert_idle_order"},
"S5D_IN_FLIGHT": {"expected_reserved_ids": 1, "labels": ["boundary", "held"], "prepare": "_prepare_order", "advance": "_advance_order", "stop": "_assert_in_flight", "assert": "_assert_in_flight_order"},
"S5D_PAID_BEFORE_INCIDENT": {"expected_reserved_ids": 1, "labels": ["boundary", "held"], "prepare": "_prepare_order", "advance": "_advance_order", "stop": "_assert_paid_incident", "assert": "_assert_paid_incident_order"},
"S5G_SHIFT_1080": {"expected_reserved_ids": 1, "labels": ["boundary", "held"], "prepare": "_prepare_order", "advance": "_advance_order", "stop": "_assert_order_stop", "assert": "_assert_order"},
"S5H_PAUSED_MIDNIGHT": {"expected_reserved_ids": 1, "labels": ["boundary", "held", "recovered"], "prepare": "_prepare_order", "advance": "_advance_paused_midnight", "stop": "_assert_paused_midnight", "assert": "_assert_paused_midnight_order"},
"S5E_MIDNIGHT": {"expected_reserved_ids": 1, "labels": ["boundary", "recalled"], "prepare": "_prepare_order", "advance": "_advance_order", "stop": "_assert_order_stop", "assert": "_assert_order"},
"S5F_EXIT": {"expected_reserved_ids": 1, "labels": ["boundary", "held"], "prepare": "_prepare_order", "advance": "_advance_order", "stop": "_assert_order_stop", "assert": "_assert_order"}
}
const SEEDS: Dictionary = {"S5A_PURE": 420550, "S5B_DEPENDENCY": 420551, "S5C_DESTRUCTION_COMMAND": 420552, "S5D_DESTRUCTION_RAID": 420553, "S5D_IN_FLIGHT": 420553, "S5D_PAID_BEFORE_INCIDENT": 420558, "S5E_MIDNIGHT": 424242, "S5F_EXIT": 420555, "S5G_SHIFT_1080": 420556, "S5H_PAUSED_MIDNIGHT": 424242}
const GUEST: StringName = &"p04.s5.guest.a"
const REQUEST: StringName = &"p04.s5.request.a"
const QUEUED_GUEST: StringName = &"p04.s5.guest.b"
@@ -19,6 +30,7 @@ var _price: int = 0
var _duration: int = 0
var _patience: int = 0
var _reserve: int = 0
var _resource_command: Dictionary = {}
var _recovery: Dictionary = {}
var _commands: Array = []
var _results: Array = []
@@ -28,6 +40,9 @@ var _points: Dictionary = {}
var _branches: Dictionary = {}
var _slots: Dictionary = {}
var _replay_reference: Dictionary = {}
var _guard_references: Dictionary = {}
var _expected_failure: Dictionary = {}
var _observed_phase: String = ""
func _run() -> void:
_evidence_dir = OS.get_environment("THE_TREE_S5_EVIDENCE")
@@ -37,7 +52,7 @@ func _run() -> void:
return
_expect(DirAccess.make_dir_recursive_absolute(_evidence_dir) == OK, "external evidence directory")
if _mode == "writer":
for branch: String in CASES:
for branch: String in CASE_TABLE:
_case = branch
_writer_case()
else:
@@ -58,8 +73,12 @@ func _fresh() -> void:
_duration = 0
_patience = 0
_reserve = 0
_resource_command = {}
_recovery = {}
_replay_reference = {}
_guard_references = {}
_expected_failure = {}
_observed_phase = ""
_commands = []
_results = []
_receipts = []
@@ -69,7 +88,10 @@ func _fresh() -> void:
_runtime.configure_save_policy({&"enabled": false, &"daily_checkpoint_enabled": false})
_runtime.command_completed.connect(func(result: CommandResult) -> void:
_results.append({&"minute": _clock.absolute_minute, &"result": result.to_dictionary()})
_expect(result.is_success(), "actual public command completion " + str(result.command_id))
if not _expected_failure.is_empty() and result.command_id == _expected_failure["command_id"]:
_expect(var_to_bytes(result.to_dictionary()) == var_to_bytes(_expected_failure), "independently bound expected guard failure")
else:
_expect(result.is_success(), "actual public command completion " + str(result.command_id))
)
func _cmd(kind: StringName, payload: Dictionary, at: int = -1) -> CommandResult:
@@ -90,7 +112,7 @@ func _queue(guest_id: StringName, request_id: StringName, exit_at: int) -> void:
_expect(guest != null and request != null, "actual Guest and request exist")
if guest == null or request == null: return
_expect(guest.state == GuestRuntime.State.QUEUING and guest.queue_request_id == request_id, "actual queued ownership before advancing clock")
_expect(request.quoted_price == _price and request.service_minutes == _duration and request.reserved_inventory_ids.size() == (1 if _case == "S5B_DEPENDENCY" else 0), "definition price/duration and one meal reservation")
_expect(request.quoted_price == _price and request.service_minutes == _duration and request.reserved_inventory_ids.size() == CASE_TABLE[_case]["expected_reserved_ids"], "definition price/duration and one meal reservation")
for id: StringName in request.reserved_inventory_ids:
var reservation: InventoryReservation = _runtime.inventory_service.get_reservation(id)
_expect(reservation != null and reservation.is_active() and reservation.requester_id == request_id, "public queue actually reserves meal")
@@ -146,16 +168,291 @@ func _prepare() -> bool:
_expect(_reserve > 0 and service.elapsed_minutes == _duration - 1, "positive reserve and duration-1 progress")
return _clock.absolute_minute == _boundary - 1
func _prepare_order() -> bool:
_fresh()
var midnight: bool = _case in ["S5E_MIDNIGHT", "S5H_PAUSED_MIDNIGHT"]
if _case == "S5G_SHIFT_1080": _boundary = 1080
if midnight:
_boundary = 1440
var enabled: Dictionary = _runtime.enable_production_operations()
_expect(bool(enabled.get(&"ok", false)), "S2a public operations path")
if not bool(enabled.get(&"ok", false)): return false
var facility: FacilityInstance = _build_cafeteria(true)
if facility == null: return false
_facility_id = facility.instance_id
var definition: FacilityDefinition = _runtime.definition_registry.get_facility(facility.definition_id)
_price = definition.base_price
_duration = definition.base_service_minutes
_patience = _runtime.guest_service.get_definition(&"traveler").base_patience
if midnight:
_prepare_paid_reception()
_cmd(&"set_staff_work_assignment", {&"staff_id": StringName("fixture.kitchen.worker.%s" % _facility_id), &"template_id": &"NIGHT", &"facility_id": facility.related_facility_id})
var staff_ids: Array[StringName] = []
for index: int in range(definition.staff_min):
var id: StringName = StringName("p04.s5.staff.%d" % index)
staff_ids.append(id)
_cmd(&"register_staff", {&"staff_id": id, &"role_id": &"server", &"options": {&"state": StaffRuntime.State.OFF_DUTY, &"current_cell": Vector3i.ZERO}})
_cmd(&"set_staff_work_assignment", {&"staff_id": id, &"template_id": &"NIGHT" if midnight else &"DAY", &"facility_id": _facility_id})
var queue_at: int = _boundary - _duration - 1
if _case == "S5D_IN_FLIGHT": queue_at += 1
_expect(_price > 0 and _duration > 1 and queue_at > _clock.absolute_minute, "natural paid service before boundary")
if queue_at <= _clock.absolute_minute or _duration <= 1: return false
if _case == "S5D_DESTRUCTION_RAID":
_expect(_duration > 5, "raid setup fits before natural completion")
if _duration <= 5: return false
_clock.advance_minutes(queue_at - _clock.absolute_minute)
_expect(facility.active_staff_ids == staff_ids, "ordinary physical attendance")
var second: bool = _case in ["S5D_DESTRUCTION_RAID", "S5F_EXIT", "S5D_PAID_BEFORE_INCIDENT"]
_expect(_stock(facility.local_inventory_id, &"ingredient/basic_meal", 2 if second else 1, &"p04.s5.order.stock"), "actual reservable meals")
_queue(GUEST, REQUEST, _boundary if _case == "S5F_EXIT" else _boundary + _duration + 1)
_clock.advance_one_minute()
var active: Array = _runtime.facility_service.get_active_services(_facility_id)
_expect(active.size() == 1, "one natural primary service")
if active.size() != 1: return false
var service: ServiceInstance = active[0]
_service_id = service.service_id
_expect(service.started_at + _duration == _boundary + (1 if _case == "S5D_IN_FLIGHT" else 0), "natural completion from snapshot duration")
_price = service.price_snapshot
_duration = service.duration_minutes
if _case == "S5D_PAID_BEFORE_INCIDENT":
_expect(definition.capacity >= 2 and facility.active_staff_ids.size() >= definition.staff_min, "definition supports concurrent services with ordinary staff")
if definition.capacity < 2: return false
_clock.advance_minutes(_boundary - 2 - _clock.absolute_minute)
_queue(QUEUED_GUEST, QUEUED_REQUEST, _boundary + _duration + 1)
if _case == "S5D_DESTRUCTION_RAID":
_clock.advance_minutes(_boundary - 5 - _clock.absolute_minute)
_prepare_breach()
_clock.advance_minutes(_boundary - 2 - _clock.absolute_minute)
_queue(QUEUED_GUEST, QUEUED_REQUEST, _boundary + _duration + 1)
if _case == "S5H_PAUSED_MIDNIGHT":
_expect(_duration > 11, "pause begins before last pre-midnight MANA evaluation")
_clock.advance_minutes(_boundary - 11 - _clock.absolute_minute)
_reserve = _state.get_resource(&"mana")
_cmd(&"spend_resources", {&"cost": {&"mana": _reserve}})
_clock.advance_minutes(_boundary - 1 - _clock.absolute_minute)
if _case == "S5F_EXIT": _queue(QUEUED_GUEST, QUEUED_REQUEST, _boundary + _duration + 1)
if _case != "S5H_PAUSED_MIDNIGHT": _reserve = _state.get_resource(&"mana")
_recovery = {&"staff_ids": staff_ids, &"resume_minute": _boundary}
if _case == "S5D_IN_FLIGHT":
_guard_failure("G2", &"register_defense_asset", {&"raid_id": &"p04.s5.guard.raid", &"asset_id": _facility_id, &"kind": &"OBJECTIVE", &"max_integrity": 10000}, "A busy Facility cannot become a Defense asset.", {})
if _case in ["S5D_IN_FLIGHT", "S5D_PAID_BEFORE_INCIDENT"]:
_cmd(&"register_event_definition", {&"definition": {&"event_id": &"p04.s5.break", &"category": &"FLAVOR", &"priority": 100, &"foreground": false, &"transaction_policy": &"ROLLBACK_ALL", &"automatic_actions": [{&"action_id": &"break", &"type": &"SET_FACILITY_STATE", &"payload": {&"facility_id": _facility_id, &"conditions": {&"durability": 0, &"suspension_reason": &"DESTROYED"}}}]}})
if _case not in ["S5D_IN_FLIGHT", "S5H_PAUSED_MIDNIGHT"]:
_expect(service.elapsed_minutes == _duration - 1, "duration minus one at N-1")
return _clock.absolute_minute == _boundary - 1
func _prepare_paid_reception() -> void:
# S2a paid-midnight fixture, with catalog wages and ordinary assignments.
var definition: FacilityDefinition = _runtime.definition_registry.get_facility(&"reception")
_cmd(&"build_facility", {&"definition_id": &"reception", &"origin": Vector3i(2, 0, WorldService.LAYER_FRONT)})
_clock.advance_minutes(definition.build_minutes)
var reception_id: StringName = &""
for instance: FacilityInstance in _runtime.facility_service.get_instances():
if instance.definition_id == &"reception": reception_id = instance.instance_id
_expect(not reception_id.is_empty(), "public paid reception completed")
var catalog: Dictionary = JSON.parse_string(FileAccess.get_file_as_string("res://data/characters/mvp_staff_candidates.json"))
for candidate_id: StringName in [&"staff_akane", &"staff_bardo"]:
var wage: int = -1
for row: Dictionary in catalog["entries"]:
if StringName(row["id"]) == candidate_id: wage = int(row["daily_wage"])
_cmd(&"hire_staff_candidate", {&"candidate_id": candidate_id})
var worker: StaffRuntime = _runtime.staff_service.get_staff(candidate_id)
_expect(worker != null and wage > 0 and worker.get_effective_daily_wage() == wage, "unchanged paid catalog wage")
_cmd(&"set_staff_work_assignment", {&"staff_id": candidate_id, &"template_id": &"DAY" if candidate_id == &"staff_akane" else &"NIGHT", &"facility_id": reception_id})
func _prepare_breach() -> void:
# Exact autonomy fixture strengths; the real service facility is the objective.
_cmd(&"set_facility_conditions", {&"facility_id": _facility_id, &"conditions": {&"durability": 1}})
_cmd(&"register_staff", {&"staff_id": &"p04.s5.guard", &"role_id": &"security", &"options": {&"state": StaffRuntime.State.AVAILABLE, &"health": 100, &"fatigue": 0, &"skills": {&"combat": 100}}})
var wave: Dictionary = {&"wave_id": &"p04.s5.wave", &"threat_strength": 1000, &"retreat_threshold": 0, &"max_rounds": 1, &"entry_points": [&"gate.north"]}
_cmd(&"create_defense_raid", {&"raid_id": &"p04.s5.raid", &"definition": {&"source_id": &"runtime_test", &"entry_points": [&"gate.north", &"gate.south"], &"objective_ids": [_facility_id], &"waves": [wave], &"round_minutes": 5, &"max_duration_minutes": 180, &"retreat_policy": &"HOLD", &"defender_retreat_threshold": 0}})
_cmd(&"register_defense_combatant", {&"raid_id": &"p04.s5.raid", &"actor_id": &"p04.s5.guard", &"side": &"DEFENDER", &"combat": 0, &"max_health": 100, &"options": {&"armor": 2}})
_cmd(&"register_defense_asset", {&"raid_id": &"p04.s5.raid", &"asset_id": _facility_id, &"kind": &"OBJECTIVE", &"max_integrity": 10000, &"defense": 0, &"options": {&"target_order": 1}})
_cmd(&"register_defense_combatant", {&"raid_id": &"p04.s5.raid", &"actor_id": &"p04.s5.attacker", &"side": &"ATTACKER", &"combat": 1000, &"max_health": 100, &"options": {&"wave_id": &"p04.s5.wave", &"entry_point_id": &"gate.north"}})
_cmd(&"start_defense_raid", {&"raid_id": &"p04.s5.raid"})
var due: Array[Dictionary] = _runtime.defense_service.get_due_rounds(_boundary)
_expect(due.size() == 1 and due[0][&"earliest_minute"] == _boundary and due[0][&"raid_id"] == &"p04.s5.raid", "automatic breach due at exactly N; no substitute")
_recovery[&"due_rounds"] = due.duplicate(true)
func _guard_failure(label: String, kind: StringName, payload: Dictionary, message: String, details: Dictionary) -> void:
# Paused immediate public execution: no tick/business transition is permitted.
_clock.set_paused(true)
var before: Dictionary = _runtime.create_snapshot().duplicate(true)
var expected: Dictionary = before.duplicate(true)
var journal: Dictionary = expected[&"systems"][&"runtime"]
_expect(journal[&"command_queue"]["pending"].is_empty() and journal[&"command_queue"]["in_flight"].is_empty(), "isolated guard command")
_expect(not journal[&"operations"][&"enabled"], "guard has no population synchronization")
var queue: CommandQueue = CommandQueue.new()
var ids: StableIdGenerator = StableIdGenerator.new()
var events: DomainEventStream = DomainEventStream.new()
_expect(queue.restore_snapshot(journal[&"command_queue"]), "shadow queue public restore")
_expect(ids.restore_snapshot(journal[&"id_generator"]), "shadow ID public restore")
_expect(events.restore_snapshot(journal[&"domain_events"]), "shadow stream public restore")
_serial += 1
var key: StringName = StringName("p04.s5.%s.command.%d" % [_case, _serial])
var command: SimulationCommand = SimulationCommand.new(journal[&"next_command_id"], _clock.absolute_minute, _clock.absolute_minute, 10, kind, &"player", &"", payload, key)
var failure: CommandResult = CommandResult.failed(CommandResult.Code.VALIDATION_FAILED, command.command_id, message, details)
_expected_failure = failure.to_dictionary()
_expect(queue.enqueue(command).is_success(), "shadow enqueue")
var completed: Array[CommandResult] = queue.execute_ready(_clock.absolute_minute, func(_command: SimulationCommand) -> CommandResult: return failure.copy())
_expect(completed.size() == 1, "one shadow failure")
var entities: Array[StringName] = []
var event: SimulationDomainEvent = SimulationDomainEvent.new(ids.next_id(&"domain_event"), &"COMMAND_FAILED", _clock.absolute_minute, &"simulation_runtime", entities, failure.to_dictionary(), command.command_id)
_expect(events.publish(event), "exact M failed-result event")
journal[&"next_command_id"] += 1
journal[&"command_queue"] = queue.create_snapshot()
journal[&"id_generator"] = ids.create_snapshot()
journal[&"domain_events"] = events.create_snapshot()
# EXPECTED is complete before submit, never read back from AFTER.
var expected_bytes: PackedByteArray = var_to_bytes(expected)
var actual: CommandResult = _runtime.submit_command(kind, payload, &"player", &"", 10, -1, key)
var after: Dictionary = _runtime.create_snapshot()
_expect(var_to_bytes(actual.to_dictionary()) == var_to_bytes(failure.to_dictionary()), "guard exact failed result")
_expect(expected_bytes == var_to_bytes(after), "whole typed guard equality with no masks")
var callbacks: int = 0
for row: Dictionary in _results:
if row[&"result"]["command_id"] == command.command_id: callbacks += 1
_expect(callbacks == 1, "one failed command_completed callback")
_guard_references[label] = _write(label, {&"before": before, &"expected": expected, &"after": after, &"command": command.to_dictionary(), &"result": actual.to_dictionary(), &"guard": label})
_expected_failure = {}
func _prepare_idle_breach() -> bool:
_fresh()
var facility: FacilityInstance = _build_cafeteria(true)
if facility == null: return false
_facility_id = facility.instance_id
_recovery = {&"staff_ids": [], &"resume_minute": _boundary}
_clock.advance_minutes(_boundary - 5 - _clock.absolute_minute)
_prepare_breach()
_guard_failure("G1", &"create_service_request", {&"facility_id": _facility_id, &"request_id": REQUEST, &"guest_ids": [GUEST]}, "A Facility assigned to a non-terminal Defense Raid cannot accept service requests.", {&"raid_id": &"p04.s5.raid"})
_clock.advance_minutes(_boundary - 1 - _clock.absolute_minute)
return _clock.absolute_minute == _boundary - 1
func _assert_idle_breach(point: Dictionary) -> void:
_expect(point[&"facility"][&"durability"] == 0 and point[&"facility"][&"state"] == "BROKEN" and point[&"facility"][&"suspension_reason"] == "DESTROYED", "idle OBJECTIVE automatically destroyed")
_expect(point[&"active_services"] == 0 and point[&"service"].is_empty() and point[&"reservations"].is_empty(), "idle breach has no services or reservations")
for request: Dictionary in point[&"requests"].values(): _expect(request.is_empty(), "idle breach no request/orphan")
for entry: Dictionary in point[&"ledger"]: _expect(entry[&"category"] != "SERVICE_SALE", "idle breach no sale")
func _assert_idle_order(_before: Dictionary, point: Dictionary) -> void:
_assert_idle_breach(point)
func _assert_in_flight(point: Dictionary) -> void:
_expect(point[&"facility"][&"durability"] == 0 and point[&"facility"][&"state"] == "BROKEN", "event destroys active facility")
_expect(point[&"service"][&"state"] == ("ACTIVE" if point[&"minute"] == _boundary else "FAILED"), "N active then N+1 failure")
func _assert_in_flight_order(before: Dictionary, point: Dictionary) -> void:
_assert_in_flight(point)
_expect(point[&"wallets"] == before[&"wallets"], "in-flight destruction zero charge")
if point[&"minute"] > _boundary: _assert_reservation(before, point, REQUEST, "RELEASED", _boundary + 1)
else: _assert_reservation(before, point, REQUEST, "ACTIVE", -1)
func _advance_paused_midnight(label: String) -> void:
if label != "recovered":
_clock.advance_one_minute()
return
_cmd(&"change_resources", {&"deltas": {&"mana": _reserve}})
_recovery[&"resume_minute"] = -1
while _clock.absolute_minute < _boundary + _duration + 20:
_clock.advance_one_minute()
if _runtime.facility_service.get_service(_service_id).state == ServiceInstance.State.COMPLETED:
_recovery[&"resume_minute"] = _clock.absolute_minute
break
_expect(_recovery[&"resume_minute"] > _boundary, "bounded new-day completion")
func _assert_paused_midnight(point: Dictionary) -> void:
_expect(point[&"service"][&"state"] == "PAUSED" and point[&"service"][&"interruption_reason"] == "RELATED_FACILITY_INACTIVE", "legitimate dependency pause across DAILY_CLOSE")
_expect(point[&"operations_enabled"] and not point[&"actual_coordinator_absent"], "real DAILY_CLOSE coordinator")
func _assert_paused_midnight_order(before: Dictionary, point: Dictionary) -> void:
if point[&"minute"] <= _boundary + 1:
_assert_paused_midnight(point)
_expect(point[&"service"][&"elapsed_minutes"] == before[&"service"][&"elapsed_minutes"], "paused elapsed unchanged")
_expect(point[&"wallets"] == before[&"wallets"], "no paused payment")
_assert_reservation(before, point, REQUEST, "ACTIVE", -1)
else:
_expect(point[&"service"][&"state"] == "COMPLETED", "new-day recovered completion")
_expect(point[&"wallets"][String(GUEST)] == before[&"wallets"][String(GUEST)] - _price, "one recovered price snapshot debit")
_assert_reservation(before, point, REQUEST, "CONSUMED", point[&"minute"])
func _advance_order(label: String) -> void:
if label == "boundary":
if _case in ["S5D_IN_FLIGHT", "S5D_PAID_BEFORE_INCIDENT"]: _cmd(&"enqueue_event", {&"event_id": &"p04.s5.break", &"actor_ids": [&"player"]}, _boundary)
if _case == "S5C_DESTRUCTION_COMMAND": _cmd(&"set_facility_conditions", {&"facility_id": _facility_id, &"conditions": {&"durability": 0}}, _boundary)
if _case == "S5F_EXIT": _cmd(&"leave_facility_queue", {&"facility_id": _facility_id, &"request_id": QUEUED_REQUEST}, _boundary)
if label == "recalled":
var before: Dictionary = _runtime.create_snapshot()
var replay: CommandResult = _runtime.operations_coordinator.advance_to(_boundary)
_expect(replay.is_success() and replay.is_replay, "same midnight is a replay")
_expect(var_to_bytes(before) == var_to_bytes(_runtime.create_snapshot()), "same-minute replay changes no typed state")
_recovery[&"midnight_replay"] = replay.to_dictionary()
_replay_reference = _write("same-minute-replay", {&"before": before, &"after": _runtime.create_snapshot(), &"result": replay.to_dictionary(), &"minute": _boundary})
else:
_clock.advance_one_minute()
func _assert_paid_incident(point: Dictionary) -> void:
_expect(point[&"service"][&"state"] == "COMPLETED" and point[&"service"][&"completed_at"] == _boundary, "primary paid at N")
_expect(point[&"facility"][&"durability"] == 0 and point[&"facility"][&"state"] == "BROKEN" and point[&"facility"][&"suspension_reason"] == "DESTROYED", "public event destruction after completion")
var secondary: Array = []
var facilities: Dictionary = point[&"snapshot"][&"systems"][&"runtime"][&"facilities"]
for instance: Dictionary in facilities[&"instances"]:
for service: Dictionary in instance[&"active_services"]:
if service[&"request_id"] == QUEUED_REQUEST: secondary.append(service)
for service: Dictionary in facilities[&"service_history"]:
if service[&"request_id"] == QUEUED_REQUEST: secondary.append(service)
_expect(secondary.size() == 1, "one secondary service without duplicate generation")
if secondary.size() != 1: return
_expect(secondary[0][&"state"] == ("ACTIVE" if point[&"minute"] == _boundary else "FAILED"), "secondary unfinished at N and failed at N+1")
if point[&"minute"] > _boundary:
_expect(secondary[0][&"failure_reason"] == "BROKEN" and secondary[0][&"completed_at"] == _boundary + 1, "secondary broken failure timestamp")
func _assert_paid_incident_order(before: Dictionary, point: Dictionary) -> void:
_assert_paid_incident(point)
_expect(point[&"wallets"][String(GUEST)] == before[&"wallets"][String(GUEST)] - _price, "one primary snapshot price debit")
_expect(point[&"wallets"][String(QUEUED_GUEST)] == before[&"wallets"][String(QUEUED_GUEST)], "secondary uncharged")
_assert_reservation(before, point, REQUEST, "CONSUMED", _boundary)
_assert_reservation(before, point, QUEUED_REQUEST, "ACTIVE" if point[&"minute"] == _boundary else "RELEASED", -1 if point[&"minute"] == _boundary else _boundary + 1)
func _assert_order_stop(point: Dictionary) -> void:
if _case == "S5C_DESTRUCTION_COMMAND":
_expect(point[&"service"][&"state"] == "FAILED" and point[&"service"][&"failure_reason"] == String(FacilityService.INTERRUPTION_BROKEN), "command destruction interrupts before payment")
else:
_expect(point[&"service"][&"state"] == "COMPLETED", "natural completion precedes later boundary effects")
if _case in ["S5C_DESTRUCTION_COMMAND", "S5D_DESTRUCTION_RAID"]:
_expect(point[&"facility"][&"durability"] == 0 and point[&"facility"][&"state"] == "BROKEN", "destroyed facility")
if _case == "S5D_DESTRUCTION_RAID":
_expect(point[&"facility"][&"suspension_reason"] == "DESTROYED", "automatic breach suspension")
if _case == "S5E_MIDNIGHT":
_expect(point[&"operations_enabled"] and not point[&"actual_coordinator_absent"], "operations-enabled midnight")
func _assert_order(before: Dictionary, point: Dictionary) -> void:
_assert_order_stop(point)
var paid: bool = _case != "S5C_DESTRUCTION_COMMAND"
_expect(point[&"wallets"][String(GUEST)] == before[&"wallets"][String(GUEST)] - (_price if paid else 0), "exact primary wallet delta")
_assert_reservation(before, point, REQUEST, "CONSUMED" if paid else "RELEASED", _boundary)
if _case == "S5F_EXIT" or (_case == "S5D_DESTRUCTION_RAID" and point[&"minute"] > _boundary):
_assert_reservation(before, point, QUEUED_REQUEST, "RELEASED", _boundary if _case == "S5F_EXIT" else _boundary + 1)
_expect(point[&"wallets"][String(QUEUED_GUEST)] == before[&"wallets"][String(QUEUED_GUEST)], "secondary request never charged")
if _case == "S5F_EXIT" and point[&"minute"] == _boundary:
_expect(point[&"guests"][String(GUEST)][&"state"] == "LEAVING", "planned exit after completed service")
func _connect_observations() -> void:
_runtime.economy_service.transaction_posted.connect(func(id: StringName, entries: Array) -> void:
var rows: Array = []
for entry: LedgerEntry in entries: rows.append(entry.to_dictionary())
_receipts.append({&"id": id, &"minute": _clock.absolute_minute, &"entries": rows})
var staff_at_receipt: Array = []
for staff_id: StringName in _recovery.get(&"staff_ids", []):
staff_at_receipt.append(_runtime.staff_service.get_staff(staff_id).create_snapshot())
_receipts.append({&"id": id, &"minute": _clock.absolute_minute, &"phase": _observed_phase, &"entries": rows, &"staff_at_receipt": staff_at_receipt})
)
_clock.tick_phase_started.connect(func(phase: int, minute: int) -> void:
_observed_phase = SimulationKernel.TickPhase.keys()[phase]
var label: String = "phase-%d-%s" % [minute, SimulationKernel.TickPhase.keys()[phase]]
var row: Dictionary = _capture()
row[&"phase"] = SimulationKernel.TickPhase.keys()[phase]
if _case == "S5G_SHIFT_1080" and minute == 1080:
var historical: Dictionary = {SimulationKernel.TickPhase.FACILITY_COMPLETION: "first-18-00-before-facility", SimulationKernel.TickPhase.VITALS_AND_ENVIRONMENT: "first-18-00-after-facility", SimulationKernel.TickPhase.PUBLISH_SNAPSHOT: "first-18-00-after-staff"}
row[&"order_label"] = historical.get(phase, "")
_assert_phase(row)
_phases.append(_write(label, row))
)
@@ -185,6 +482,7 @@ func _capture() -> Dictionary:
var ledger: Array = []
for entry: LedgerEntry in _runtime.economy_service.get_entries(): ledger.append(entry.to_dictionary())
return {&"snapshot": snapshot, &"minute": _clock.absolute_minute,
&"order_label": ({1079: "first-before-17-59", 1080: "first-18-00-tick-complete", 1081: "first-18-01-tick-complete"}.get(_clock.absolute_minute, "") if _case == "S5G_SHIFT_1080" else ""),
&"inputs": {&"case": _case, &"seed": SEEDS[_case], &"serial": _serial, &"facility_id": _facility_id, &"service_id": _service_id,
&"boundary": _boundary, &"price": _price, &"duration": _duration, &"patience": _patience, &"reserve": _reserve, &"recovery": _recovery.duplicate(true),
&"kitchen_premise": "ActorHardening physical FLEX fixture; not natural hire/unlock"},
@@ -199,7 +497,10 @@ func _capture() -> Dictionary:
&"actual_coordinator_absent": _runtime.operations_coordinator == null, &"unrelated_getters_called": false}
func _labels() -> Array[String]:
return ["boundary", "held", "recovered"]
var labels: Array[String] = []
for label: String in CASE_TABLE[_case]["labels"]:
if label != "duplicate_guard": labels.append(label)
return labels
func _advance(label: String) -> void:
if label == "boundary":
@@ -208,6 +509,7 @@ func _advance(label: String) -> void:
elif label == "recovered":
_expect(_clock.absolute_minute == _boundary + 1, "recover only after held")
_cmd(&"change_resources", {&"deltas": {&"mana": _reserve}})
_resource_command = {&"key": _commands.back()[&"idempotency_key"], &"command_id": int(_commands.back()[&"result"][&"command_id"])}
_recovery[&"key"] = _commands.back()[&"idempotency_key"]
while _clock.absolute_minute < _boundary + _duration:
_clock.advance_one_minute()
@@ -221,28 +523,48 @@ func _advance(label: String) -> void:
var before_replay: Dictionary = _runtime.create_snapshot()
var replay: CommandResult = _runtime.submit_command(&"change_resources", {&"deltas": {&"mana": _reserve}}, &"player", &"", 10, -1, _recovery[&"key"])
var after_replay: Dictionary = _runtime.create_snapshot()
_expect(replay.is_success() and replay.is_replay and var_to_bytes(before_replay) == var_to_bytes(after_replay), "same key replay changes no Runtime field")
_replay_reference = _write("resource-replay", {&"before": before_replay, &"after": after_replay, &"result": replay.to_dictionary()})
var key: StringName = _resource_command[&"key"]
var command_id: int = _resource_command[&"command_id"]
var originals: Array[Dictionary] = []
for row: Dictionary in _results:
if int(row[&"result"][&"command_id"]) == command_id: originals.append(row[&"result"])
_expect(originals.size() == 1, "one completed original resource command")
if originals.size() != 1: return
var original: Dictionary = originals[0]
var result: Dictionary = replay.to_dictionary()
var details: Dictionary = result[&"details"]
_expect(result[&"code"] == "DUPLICATE_IDEMPOTENCY_KEY" and not replay.is_replay, "duplicate enqueue rejected without replay")
_expect(details["processed"] == true and details["idempotency_key"] == String(key) and int(details["original_command_id"]) == command_id and var_to_bytes(details["original_result"]) == var_to_bytes(original), "duplicate details bind completed original")
var queue: Dictionary = before_replay[&"systems"][&"runtime"][&"command_queue"]
_expect(queue["idempotency"][String(key)] == command_id, "typed idempotency binding")
var processed: Array[Dictionary] = []
for row: Dictionary in queue["processed"]:
if int(row["command_id"]) == command_id: processed.append(row)
_expect(processed.size() == 1, "one typed processed original")
if processed.size() == 1: _expect(var_to_bytes(processed[0]) == var_to_bytes(original), "typed processed original bytes")
_expect(var_to_bytes(before_replay) == var_to_bytes(after_replay), "same key replay changes no Runtime field")
_replay_reference = _write("resource-replay", {&"before": before_replay, &"after": after_replay, &"result": result, &"recorded_command": {&"key": key, &"command_id": command_id, &"original": original}})
_clock.advance_one_minute()
else:
_clock.advance_one_minute()
func _writer_case() -> void:
if not _prepare(): return
if not Callable(self, CASE_TABLE[_case]["prepare"]).call(): return
var before: Dictionary = _capture()
_assert_before(before)
if _case in ["S5A_PURE", "S5B_DEPENDENCY"]: _assert_before(before)
_points["before"] = _write("before", before)
_connect_observations()
for label: String in _labels():
_advance(label)
Callable(self, CASE_TABLE[_case]["advance"]).call(label)
var actual: Dictionary = _capture()
_assert_outcome(before, actual)
Callable(self, CASE_TABLE[_case]["assert"]).call(before, actual)
_save_point(label, actual)
_advance("duplicate_guard")
var guard: Dictionary = _capture()
_assert_outcome(before, guard)
_points["duplicate_guard"] = _write("duplicate_guard", guard)
_branches[_case] = _write("case", {&"resource_replay": _replay_reference, &"points": _points.duplicate(true), &"phases": _phases.duplicate(true),
if "duplicate_guard" in CASE_TABLE[_case]["labels"]:
_advance("duplicate_guard")
var guard: Dictionary = _capture()
_assert_outcome(before, guard)
_points["duplicate_guard"] = _write("duplicate_guard", guard)
_branches[_case] = _write("case", {&"resource_replay": _replay_reference, &"guards": _guard_references, &"points": _points.duplicate(true), &"phases": _phases.duplicate(true),
&"commands": _write("commands", {&"submitted": _commands, &"completed_including_fixture": _results})})
func _assert_before(point: Dictionary) -> void:
@@ -250,10 +572,16 @@ func _assert_before(point: Dictionary) -> void:
_expect(point[&"mana"] > 0 and point[&"facility"][&"power_available"] and point[&"related_facility_operating"], "initial power and dependency")
_expect(point[&"service"][&"state"] == "ACTIVE" and point[&"service"][&"elapsed_minutes"] == _duration - 1, "natural pre-completion point")
func _snapshot_staff_ids() -> Array[String]:
var result: Array[String] = []
for id: StringName in _recovery[&"staff_ids"]: result.append(String(id))
return result
func _assert_unconfounded(point: Dictionary) -> void:
_expect(not point[&"operations_enabled"] and point[&"actual_coordinator_absent"], "isolated fixture")
_expect(point[&"facility"][&"operator_open"] and point[&"facility"][&"durability"] > 0 and point[&"event"].is_empty(), "no closure or destruction")
_expect(point[&"facility"][&"active_staff_ids"] == _recovery[&"staff_ids"], "no shift confound")
var ids: Variant = point[&"facility"][&"active_staff_ids"]
_expect(ids is Array and ids.is_typed() and ids.get_typed_builtin() == TYPE_STRING and ids.size() == _recovery[&"staff_ids"].size() and ids == _snapshot_staff_ids() and var_to_bytes(ids) == var_to_bytes(_snapshot_staff_ids()) and _runtime.facility_service.get_instance(_facility_id).active_staff_ids == _recovery[&"staff_ids"], "no shift confound")
_expect(point[&"graph_invariants"][&"valid"], "graph invariants")
if point[&"service"][&"state"] != "COMPLETED":
_expect(point[&"guests"][String(GUEST)][&"state"] == "RECEIVING_SERVICE" and point[&"guests"][String(GUEST)][&"planned_exit_at"] > point[&"minute"], "guest ownership and no exit")
@@ -382,6 +710,8 @@ func _load_point(path: String, expected: Dictionary) -> bool:
var restored: bool = _runtime.restore_snapshot(loaded[&"snapshot"])
_expect(restored, "public Runtime restore")
_expect(var_to_bytes(_runtime.create_snapshot()) == var_to_bytes(expected[&"snapshot"]), "all restored typed fields equal Writer")
if _case not in ["S5A_PURE", "S5B_DEPENDENCY"]:
_receipts = expected[&"receipts"].duplicate(true)
return restored
func _is_replayed_phase(row: Dictionary) -> bool:
@@ -390,6 +720,8 @@ func _is_replayed_phase(row: Dictionary) -> bool:
func _assert_expected_phase_roster(references: Array) -> void:
var expected_pairs: Array = []
var end: int = int(_recovery[&"resume_minute"]) + 1
if _case == "S5E_MIDNIGHT": end = _boundary
if _case == "S5H_PAUSED_MIDNIGHT": end = int(_recovery[&"resume_minute"])
for minute: int in range(_boundary, end):
for phase: int in range(SimulationKernel.TickPhase.size()):
expected_pairs.append([minute if phase == SimulationKernel.TickPhase.APPLY_COMMANDS else minute + 1, SimulationKernel.TickPhase.keys()[phase]])
@@ -406,7 +738,7 @@ func _reader() -> void:
var writer: Dictionary = JSON.parse_string(file.get_as_text())
file.close()
_expect(int(writer["pid"]) != OS.get_process_id() and writer["profile"] != OS.get_user_data_dir(), "independent Reader PID/profile")
for branch: String in CASES:
for branch: String in CASE_TABLE:
_case = branch
var writer_case: Dictionary = _read(writer["branches"][branch])
var hashes: Dictionary = {}
@@ -437,15 +769,16 @@ func _reader() -> void:
var before: Dictionary = _read(writer_case[&"points"]["before"])
var boundary: Dictionary = _read(writer_case[&"points"]["boundary"])
if not _load_point(_slots[branch + "-boundary"], boundary): return
_assert_stopped(_capture())
Callable(self, CASE_TABLE[_case]["stop"]).call(_capture())
_connect_observations()
var replay_refs: Dictionary = {}
for label: String in ["held", "recovered", "duplicate_guard"]:
_advance(label)
for label: String in CASE_TABLE[_case]["labels"]:
if label == "boundary": continue
Callable(self, CASE_TABLE[_case]["advance"]).call(label)
var actual: Dictionary = _capture()
var expected: Dictionary = _read(writer_case[&"points"][label])
_expect(var_to_bytes(actual) == var_to_bytes(expected), "replay complete typed point including Runtime, inputs, receipts " + label)
_assert_outcome(before, actual)
Callable(self, CASE_TABLE[_case]["assert"]).call(before, actual)
replay_refs[label] = _write(label + "-replay", actual)
var expected_phases: Array = []
for reference: Dictionary in writer_case[&"phases"]:
@@ -0,0 +1,171 @@
#!/usr/bin/env python3
"""Engine-free REPAIR44 units. Synthetic typed inputs are never native evidence."""
import copy
import json
from pathlib import Path
import sys
sys.dont_write_bytecode = True
import s5_order_adapter as a
import run_s5_native as wrapper
def typed(value):
o = a.guard_oracle
def encode(v):
if isinstance(v, bool):
return o.atom(1, v)
if isinstance(v, int):
return o.atom(2, v)
if isinstance(v, str):
return o.atom(4, v)
if isinstance(v, list):
return o.array([encode(x) for x in v])
return o.strings_dict([(k, encode(v)) for k, v in v.items()])
return a.series.variant(encode(value))
def fixture():
"""Small source-shaped serializer unit for the deriver, not a game replay."""
n, price = 960, 25
primary = dict(service_id='primary', request_id=a.REQUEST, price_snapshot=price,
duration_minutes=45, started_at=n-45, elapsed_minutes=44,
state='ACTIVE', completed_at=-1, failure_reason='')
secondary = dict(service_id='secondary', request_id=a.SECOND_REQUEST, price_snapshot=price,
duration_minutes=45, started_at=n-1, elapsed_minutes=0,
state='ACTIVE', completed_at=-1, failure_reason='')
sale = dict(transaction_id='sale', category='SERVICE_SALE', amount=price,
absolute_minute=n, source_entity_id='facility', credit_account='GUEST_WALLET:'+a.GUEST)
reservation = dict(reservation_id='reservation.b', requester_id=a.SECOND_REQUEST, state='ACTIVE', terminal_at=-1)
def point(minute, completed=False, broken=False, failed=False):
s, second, r = copy.deepcopy((primary, secondary, reservation))
history = []
active = [s, second]
if completed:
s.update(state='COMPLETED', completed_at=n, elapsed_minutes=45)
history.append(s)
active.remove(s)
if failed:
second.update(state='FAILED', failure_reason='BROKEN', completed_at=n+1)
history.append(second)
active.remove(second)
r.update(state='RELEASED', terminal_at=n+1)
ledger = [copy.deepcopy(sale)] if completed else []
requests = [] if failed else [dict(request_id=a.SECOND_REQUEST)]
return dict(minute=minute, inputs=dict(boundary=n, price=price, duration=45, facility_id='facility'),
service=s, facility=dict(durability=0 if broken else 100, state='BROKEN' if broken else 'OPERATING',
suspension_reason='DESTROYED' if broken else ''),
ledger=ledger, wallets={a.GUEST: 50-price if completed else 50, a.SECOND: 50},
receipts=[dict(id='sale', minute=n, phase='FACILITY_COMPLETION', entries=copy.deepcopy(ledger))] if completed else [],
reservations=[r], requests={a.SECOND_REQUEST: {} if failed else dict(request_id=a.SECOND_REQUEST)},
active_services=len(active), snapshot=dict(systems=dict(runtime=dict(
facilities=dict(service_history=history, instances=[dict(active_services=active)], requests=requests,
known_service_ids=['primary', 'secondary'], known_request_ids=[a.REQUEST, a.SECOND_REQUEST],
next_service_sequence=3),
economy=dict(entries=copy.deepcopy(ledger), idempotency=[dict(key='service.payment.primary', transaction_id='sale')] if completed else []),
inventory=dict(idempotency_results=[dict(action='release', result=dict(reservation_id='reservation.b', ok=True))] if failed else [])))))
phases = []
for name, completed, broken in [('FACILITY_COMPLETION', False, False),
('VITALS_AND_ENVIRONMENT', True, False),
('INCIDENTS_AND_EVENTS', True, False), ('FACILITY_QUEUES', True, True)]:
p = point(n, completed, broken)
p['phase'] = name
phases.append(p)
return dict(before=point(n-1), boundary=point(n, True, True), held=point(n+1, True, True, True)), phases
def paid_controls():
original = fixture()
def derive(data):
points, phases = data
return a.paid_before_incident({k: typed(v) for k, v in points.items()}, [typed(v) for v in phases])
assert derive(original) == {'paid_before_incident': True, 'duplicate_generations': 0}
checks = []
def negative(name, change):
data = copy.deepcopy(original)
change(*data)
try:
derive(data)
except (ValueError, KeyError):
checks.append(name)
return
raise AssertionError('accepted mutation: ' + name)
runtime = lambda p: p['snapshot']['systems']['runtime']
second = lambda p: next(s for s in runtime(p)['facilities']['service_history'] if s['request_id'] == a.SECOND_REQUEST)
negative('sale-removed', lambda p, h: p['boundary']['ledger'].clear())
negative('sale-duplicated', lambda p, h: p['held']['ledger'].append(copy.deepcopy(p['held']['ledger'][0])))
negative('sale-after-incidents', lambda p, h: p['boundary']['receipts'][0].update(phase='FACILITY_QUEUES'))
negative('destruction-before-completion', lambda p, h: h[0]['facility'].update(durability=0))
negative('primary-not-completed', lambda p, h: p['boundary']['service'].update(state='ACTIVE'))
negative('secondary-charged', lambda p, h: p['held']['wallets'].update({a.SECOND: 25}))
negative('secondary-not-failed', lambda p, h: second(p['held']).update(state='ACTIVE'))
negative('secondary-failed-at-N', lambda p, h: second(p['held']).update(completed_at=960))
negative('reservation-not-released', lambda p, h: p['held']['reservations'][0].update(state='ACTIVE'))
negative('reservation-released-twice', lambda p, h: runtime(p['held'])['inventory']['idempotency_results'].append(copy.deepcopy(runtime(p['held'])['inventory']['idempotency_results'][0])))
negative('idempotency-missing', lambda p, h: runtime(p['held'])['economy']['idempotency'].clear())
negative('idempotency-duplicated', lambda p, h: runtime(p['held'])['economy']['idempotency'].append(copy.deepcopy(runtime(p['held'])['economy']['idempotency'][0])))
negative('wrong-financial-day', lambda p, h: p['held']['ledger'][0].update(absolute_minute=2400))
negative('AFTER-copy-tautology', lambda p, h: p.update(before=copy.deepcopy(p['held'])))
negative('phase-order-reversed', lambda p, h: h.reverse())
negative('duplicate-generation', lambda p, h: runtime(p['held'])['facilities']['service_history'].append(copy.deepcopy(second(p['held']))))
negative('hidden-generation-counter', lambda p, h: runtime(p['held'])['facilities'].update(next_service_sequence=4))
return checks
def roster_controls():
cases, slots = list(wrapper.CASE_TABLE), wrapper.SLOTS
old = [c for c in cases if c != 'S5D_PAID_BEFORE_INCIDENT']
assert sorted(old) != old, 'old R43 comparison must fail on actual insertion order'
assert wrapper.exact_roster(cases, slots)
assert wrapper.exact_roster(cases[::-1], slots[::-1])
assert not wrapper.exact_roster(cases[:-1], slots)
assert not wrapper.exact_roster(cases + [cases[0]], slots)
assert not wrapper.exact_roster(cases + ['UNKNOWN'], slots)
assert not wrapper.exact_roster(cases, slots[:-1])
assert not wrapper.exact_roster(cases, slots + ['UNKNOWN-slot'])
assert not wrapper.exact_roster(cases, slots + [slots[0]])
assert set(cases) == set(a.DERIVERS) | set(a.power.CASES)
import re
probe = wrapper.QA.read_text()
seeds = json.loads(re.search(r'^const SEEDS: Dictionary = (.*)$', probe, re.M)[1])
assert set(seeds) == set(cases)
for row in wrapper.CASE_TABLE.values():
for key in ('prepare', 'advance', 'stop', 'assert'):
assert 'func ' + row[key] + '(' in probe
# Reader obtains its own branches directly from CASE_TABLE (never Writer's list).
reader = probe.split('func _reader()', 1)[1]
assert 'for branch: String in CASE_TABLE:' in reader
expected_line = next(l for l in a.POWER_PATH.read_text().splitlines() if 'expected = set(CASES)' in l)
assert set(re.findall(r'"(S5[^"]+)"', expected_line)) | set(a.power.CASES) == set(cases)
root = Path(__file__).resolve().parents[1]
project = next(p for p in root.parents if (p / 'tools/check_p04_order_evidence.py').is_file())
checker = (project / 'tools/check_p04_order_evidence.py').read_text()
assert set(re.findall(r"['\"](S5[A-Z][A-Z0-9_]*)['\"]", checker)) == set(cases)
collector = (root / 'p04_native_series.py').read_text()
assert "set(order['cases']) == set(adapter.DERIVERS)" in collector
assert "set(power['cases']) == set(adapter.power.CASES)" in collector
assert 'order = adapter.derive(*arguments)' in collector
for name in ('S5_ROOT_RUN.md', 'PENDING.md'):
assert set(re.findall(r'`(S5[A-Z][A-Z0-9_]*)`', (root / 's5' / name).read_text())) == set(cases)
status = (root / 'REPAIR41_STATUS.md').read_text().split('## REPAIR44', 1)[1]
assert set(re.findall(r'`(S5[A-Z][A-Z0-9_]*)`', status.split('## ', 1)[0])) == set(cases)
wrapper.probe_guard(project)
patterns = [r'\bvar\s+\w+\s*=', r'\bfor\s+\w+\s+in\b',
r'\.(?:patience_remaining|elapsed_minutes|power_available|capacity|hold_until)\s*=(?!=)']
for regex, bad in zip(patterns, ['var x = 1', 'for x in values:', 'f.capacity = 2']):
assert not re.search(regex, probe) and re.search(regex, bad)
return ['R43-old-comparison-reproduced', 'insertion-order', 'reverse-order',
'missing-case', 'duplicate-case', 'unknown-case', 'missing-slot', 'extra-slot',
'duplicate-slot', 'probe-seeds-wrapper-reader-adapter-collector-checker-docs-name-sync',
'probe-guard-regex-self-check']
def main():
root = Path(__file__).resolve().parents[1]
assert not list(root.rglob('*.pyc')), 'no generated bytecode under allowed execution paths'
print(json.dumps(dict(synthetic_units_only=True, formal_acceptance=False,
paid_mutations=paid_controls(), roster=roster_controls(), no_pyc=True), indent=2))
if __name__ == '__main__':
main()
@@ -29,9 +29,31 @@ ENGINE_SHA256 = "c7cccbf8fb143e34e02fd6521e09be2c2b974f0d5db080b19071c9c570718cc
MANIFEST = BUILD / "audit-support/p04-r17-full-inputs-r01/MANIFEST.json"
MANIFEST_SHA = "a15f29fa12537f6d8aaf7cabea390922a9f16e3eb9c10981e5742aafc8c4c8a8"
CONTRACTS = BUILD / "audit-support/p04-r17-full-inputs-r01/fixed/6ce6b28c5985e8a4f13b78bfeb1f1e09f6216d874fb01e0656ec1633bfa01cd7/completion_marker_contracts.json"
CASES = ["S5A_PURE", "S5B_DEPENDENCY"]
LABELS = {case: ["boundary", "held", "recovered"] for case in CASES}
def case_table(path):
matches = re.findall(r"^const CASE_TABLE: Dictionary = (\{.*?^\})", Path(path).read_text(), re.M | re.S)
if len(matches) != 1:
raise ValueError("exactly one literal CASE_TABLE required")
table = json.loads(matches[0])
for case, row in table.items():
if (set(row) != {"expected_reserved_ids", "labels", "prepare", "advance", "stop", "assert"}
or not row["labels"] or row["labels"][0] != "boundary"
or len(row["labels"]) != len(set(row["labels"]))):
raise ValueError("invalid case table: " + case)
return table
CASE_TABLE = case_table(QA)
CASES = sorted(CASE_TABLE)
LABELS = {case: [label for label in CASE_TABLE[case]["labels"] if label != "duplicate_guard"]
for case in CASES}
SLOTS = sorted(case + "-" + label for case in CASES for label in LABELS[case])
def exact_roster(branches, slots):
return (len(branches) == len(set(branches)) == len(CASES)
and sorted(branches) == CASES
and len(slots) == len(set(slots)) == len(SLOTS)
and sorted(slots) == SLOTS)
MATERIALS = [MANIFEST, BUILD / "audit-support/p04-review-repair22-r01/ACTUAL_CURRENT_PUBLIC_POWER_FUNCTIONS.json"]
def r17_relocation_guard(root):
@@ -51,6 +73,13 @@ def r17_relocation_guard(root):
def probe_guard(root):
probe = QA.read_text()
import re
seeds = re.findall(r"^const SEEDS: Dictionary = (.*)$", probe, re.M)
if len(seeds) != 1 or sorted(json.loads(seeds[0])) != CASES or sorted(case_table(QA)) != CASES:
raise ValueError("probe/seed canonical roster mismatch")
for case in CASES:
for key in ("prepare", "advance", "stop", "assert"):
if "func " + CASE_TABLE[case][key] + "(" not in probe:
raise ValueError("missing case dispatch function")
if ":=" in probe or re.search(r"\bvar\s+\w+\s*=", probe) or re.search(r"\bfor\s+\w+\s+in\b", probe):
raise ValueError("explicit typed declarations/loops required")
if re.search(r"\.(?:patience_remaining|elapsed_minutes|power_available|capacity|hold_until)\s*=(?!=)", probe):
@@ -171,6 +200,27 @@ def engine_pin(path, expected=None):
raise ValueError("engine identity changed")
return value
def mirror_formal(r, out, before):
"""Mirror complete Writer and Reader packages, preserving original receipts."""
relocated = {}
for role in ("writer", "reader"):
receipt = r.read(out / ("raw/" + role + ".json"))
r.require(set(receipt["slots"]) == set(before), "formal slot roster")
relocated[role] = {}
for slot, original in receipt["slots"].items():
r.require(Path(slot).name == slot and slot not in (".", ".."), "formal slot name")
target = out / "formal" / role / slot
target.mkdir(parents=True)
members = r.inventory(Path(original))
r.require(set(members) == {"journal.log", "manifest.json", "thumbnail.png", "world.bin"}
and members == before[slot], "complete unchanged formal package")
for member in members:
shutil.copyfile(Path(original) / member, target / member)
r.require(r.inventory(target) == members, "all copied formal hashes")
relocated[role][slot] = dict(provenance=original, relative=str(target.relative_to(out)), members=members)
r.write(out / "formal-relocation.json", relocated)
C_REL = "docs/plans/original-completion-2026-10-02/execution/completion_marker_contracts.json"
@@ -486,7 +536,7 @@ def main():
receipt = r.read(out / ("raw/" + phase + ".json"))
r.require(receipt["checks"] > 0 and receipt["failures"] == 0,
"S5 actual outcome receipt")
r.require(sorted(receipt["branches"]) == CASES,
r.require(exact_roster(receipt["branches"], receipt["slots"]),
"exact one independent Writer/Reader case")
r.require(sorted(receipt["slots"]) == SLOTS, "all formal point slots")
r.require(receipt["pid"] == row["actual_pid"], "actual native PID/receipt")
@@ -0,0 +1,127 @@
"""Engine-free mirror of M journal serialization; EXPECTED never accepts AFTER.
The native probe uses detached public restores. This independent derivation
binds that recorded EXPECTED to BEFORE and the fixed guard command, so copying
AFTER into EXPECTED cannot turn a mutation into evidence.
"""
import struct
MESSAGES = {
'G1': 'A Facility assigned to a non-terminal Defense Raid cannot accept service requests.',
'G2': 'A busy Facility cannot become a Defense asset.',
}
def atom(kind, value):
if kind in (4, 21):
data = value.encode()
return struct.pack('<II', kind, len(data)) + data + b'\0' * (-len(data) % 4)
if kind == 2 and not -(2**31) <= value < 2**31:
return struct.pack('<Iq', kind | 65536, value)
return struct.pack('<Ii', kind, value)
def dictionary(pairs):
return struct.pack('<II', 27, len(pairs)) + b''.join(k + v for k, v in pairs)
def strings_dict(pairs):
return dictionary([(atom(4, k), v) for k, v in pairs])
def array(rows, element=None):
header = struct.pack('<II', 28, len(rows)) if element is None else struct.pack('<III', 65564, element, len(rows))
return header + b''.join(rows)
def update(node, changes):
"""Retain all untouched typed keys, values and order, with no field masks."""
if node.kind != 27 or set(changes) - {k.value for k, _ in node.value}:
raise ValueError('journal dictionary keys')
return dictionary([(k.raw, changes.get(k.value, v.raw)) for k, v in node.value])
def expected(before, command, guard, parse, require):
require(guard in MESSAGES, 'fixed guard')
rt = before.at('systems').at('runtime')
q = rt.at('command_queue')
require(q.at('version').kind == 2 and q.at('version').value == 2, 'M queue version')
require(rt.at('next_command_id').kind == 2, 'typed next_command_id')
for name in ('pending', 'in_flight', 'processed', 'accepted'):
require(q.at(name).raw[:8] == struct.pack('<II', 65564, 27), 'M typed queue array: ' + name)
prior_ids = {}
for name in ('accepted', 'processed'):
members = q.at(name).value
require(all(r.at('command_id').kind == 2 for r in members), 'typed prior command IDs')
numbers = [r.at('command_id').value for r in members]
require(numbers == sorted(set(numbers)) and all(i > 0 for i in numbers), 'sorted unique ' + name)
prior_ids[name] = numbers
require(prior_ids['accepted'] == prior_ids['processed'], 'complete isolated prior journal')
mapping = q.at('idempotency')
require(all(k.kind == 4 and v.kind == 2 for k, v in mapping.value), 'typed idempotency mapping')
require([k.value for k, _ in mapping.value] == sorted(k.value for k, _ in mapping.value), 'sorted idempotency')
require(not q.at('pending').value and not q.at('in_flight').value, 'isolated guard queue')
require(rt.at('operations').at('enabled').value is False, 'guard operations disabled')
ident = rt.at('next_command_id').value
minute = command.at('issued_tick').value
key = command.at('idempotency_key').value
kind = 'create_service_request' if guard == 'G1' else 'register_defense_asset'
require(command.at('command_id').kind == 2 and command.at('command_id').value == ident
and command.at('execute_tick').value == minute
and command.at('priority').value == 10 and command.at('command_type').value == kind
and command.at('actor_id').value == 'player' and command.at('target_id').value == ''
and key.startswith('p04.s5.') and key not in q.at('idempotency').plain(), 'fixed guard command binding')
payload = command.at('payload').plain()
if guard == 'G1':
require(set(payload) == {'facility_id', 'request_id', 'guest_ids'}
and payload['request_id'] == 'p04.s5.request.a'
and payload['guest_ids'] == ['p04.s5.guest.a'], 'G1 payload')
else:
require(set(payload) == {'raid_id', 'asset_id', 'kind', 'max_integrity'}
and payload['raid_id'] == 'p04.s5.guard.raid' and payload['kind'] == 'OBJECTIVE'
and payload['max_integrity'] == 10000, 'G2 payload')
details = dictionary([(atom(21, 'raid_id'), atom(21, 'p04.s5.raid'))]) if guard == 'G1' else dictionary([])
result = strings_dict([
('code', atom(4, 'VALIDATION_FAILED')), ('command_id', atom(2, ident)),
('target_id', atom(4, '')), ('message', atom(4, MESSAGES[guard])),
('resolution_hints', array([], 4)), ('details', details), ('is_replay', atom(1, 0))])
accepted = q.at('accepted').value
processed = q.at('processed').value
for row in accepted:
old_key = row.at('idempotency_key')
require(old_key.kind == 4, 'accepted String key')
if old_key.value:
require(mapping.at(old_key.value).value == row.at('command_id').value, 'prior accepted/idempotency join')
require(all(r.at('command_id').value < ident for r in accepted + processed), 'prior journal IDs')
metadata = strings_dict([('command_id', atom(2, ident)), ('idempotency_key', atom(4, key))])
idem = [(k.value, v.raw) for k, v in q.at('idempotency').value] + [(key, atom(2, ident))]
queue = update(q, {'accepted': array([r.raw for r in accepted] + [metadata], 27),
'processed': array([r.raw for r in processed] + [result], 27),
'idempotency': strings_dict(sorted(idem))})
generator = rt.at('id_generator')
counters = generator.at('counters').plain()
require(all(k.kind == 4 and v.kind == 2 for k, v in generator.at('counters').value), 'typed counters')
counters['domain_event'] = counters.get('domain_event', 0) + 1
eid = 'domain_event.%012d' % counters['domain_event']
ids = update(generator, {'counters': strings_dict([(k, atom(2, v)) for k, v in sorted(counters.items())])})
event = strings_dict([('event_id', atom(4, eid)), ('event_type', atom(4, 'COMMAND_FAILED')),
('absolute_minute', atom(2, minute)), ('source_service', atom(4, 'simulation_runtime')),
('entity_ids', array([], 4)), ('payload', result), ('causation_command_id', atom(2, ident))])
stream = rt.at('domain_events')
published = stream.at('published_ids').plain()
require(eid not in published, 'new event ID')
events = update(stream, {'published_ids': array([atom(4, k) for k in sorted(published + [eid])], 4),
'recent_events': array(([r.raw for r in stream.at('recent_events').value] + [event])[-256:], 27)})
runtime = update(rt, {'next_command_id': atom(2, ident + 1), 'command_queue': queue,
'id_generator': ids, 'domain_events': events})
envelope = update(before, {'systems': update(before.at('systems'), {'runtime': runtime})})
return parse(envelope), parse(result)
def verify(record, parse, require):
before, command = record.at('before'), record.at('command')
tree, result = expected(before, command, record.at('guard').value, parse, require)
require(record.at('expected').raw == tree.raw, 'EXPECTED must independently derive from BEFORE; AFTER-copy forbidden')
require(record.at('after').raw == tree.raw, 'whole typed guard Runtime; no business or journal masks')
require(record.at('result').raw == result.raw, 'independent exact failed result')
return True
@@ -0,0 +1,512 @@
#!/usr/bin/env python3
"""Typed S5 ordering derivations. Native provenance is verified separately."""
import hashlib
import importlib.util
import json
from pathlib import Path
PACKAGE_ROOT = Path(__file__).absolute().parents[1]
DEPENDENCIES = {}
DEPENDENCY_OBSERVATIONS = {}
_EXECUTED_DEPENDENCIES = {}
_EXECUTED_OBSERVATIONS = {}
def module(name, path):
path = Path(path).absolute()
if '..' in path.parts or any(p.is_symlink() for p in (path, *path.parents)):
raise ValueError('dependency traversal/symlink')
if not path.resolve(strict=True).is_relative_to(PACKAGE_ROOT.resolve(strict=True)):
raise ValueError('dependency outside package')
relative = path.relative_to(PACKAGE_ROOT).as_posix()
data = path.read_bytes()
spec = importlib.util.spec_from_file_location(name, path)
value = importlib.util.module_from_spec(spec)
exec(compile(data, str(path), 'exec'), value.__dict__)
DEPENDENCIES[relative] = hashlib.sha256(data).hexdigest()
DEPENDENCY_OBSERVATIONS[relative] = str(path)
for key, digest in getattr(value, 'DEPENDENCIES', {}).items():
dependency = Path(key)
if dependency.is_absolute() or '..' in dependency.parts:
raise ValueError('dependency key must be package relative')
observed = Path(value.DEPENDENCY_OBSERVATIONS[key])
if (observed != PACKAGE_ROOT / dependency
or any(p.is_symlink() for p in (observed, *observed.parents))
or not observed.resolve(strict=True).is_relative_to(PACKAGE_ROOT.resolve(strict=True))):
raise ValueError('dependency mapping outside package/symlink')
if key in DEPENDENCIES and DEPENDENCIES[key] != digest:
raise ValueError('dependency mapping conflict')
DEPENDENCIES[key] = digest
DEPENDENCY_OBSERVATIONS[key] = value.DEPENDENCY_OBSERVATIONS[key]
_EXECUTED_DEPENDENCIES.update(DEPENDENCIES)
_EXECUTED_OBSERVATIONS.update(DEPENDENCY_OBSERVATIONS)
return value
POWER_PATH = Path(__file__).with_name('s5_power_adapter.py')
power = module('s5_order_power', POWER_PATH)
Raw, staff_check, duplicate_check = power.Raw, power.staff_check, power.duplicate_check
series, require = power.series, power.require
GUARD_PATH = Path(__file__).with_name('s5_guard_oracle.py')
guard_oracle = module('s5_guard_oracle', GUARD_PATH)
if (set(DEPENDENCIES) != {'s5/s5_power_adapter.py', 'p04_native_series.py', 's5/s5_guard_oracle.py'}
or power.DEPENDENCIES != {'p04_native_series.py': power.SERIES_SHA256}):
raise ValueError('loaded dependency roster mismatch')
GUEST, REQUEST = power.GUEST, power.REQUEST
SECOND, SECOND_REQUEST = 'p04.s5.guest.b', 'p04.s5.request.b'
def field(node, *keys):
for key in keys:
node = node.at(key)
return node
def scalar(node, *keys):
node = field(node, *keys)
require(node.kind in (1, 2, 4, 21), 'typed scalar required')
return node.value
def rows(node, *keys):
node = field(node, *keys)
require(node.kind == 28, 'typed array required')
return node.value
def phase(phases, name, minute):
found = [p for p in phases if scalar(p, 'phase') == name and scalar(p, 'minute') == minute]
require(len(found) == 1, 'one raw phase: ' + name)
return found[0]
def sales(point):
return [r for r in rows(point, 'ledger') if scalar(r, 'category') == 'SERVICE_SALE'
and scalar(r, 'credit_account') == 'GUEST_WALLET:' + GUEST]
def release(before, after, request, minute):
old = [r for r in rows(before, 'reservations') if scalar(r, 'requester_id') == request]
new = [r for r in rows(after, 'reservations') if scalar(r, 'requester_id') == request]
require(len(old) == len(new) == 1, 'one original reservation')
ident = scalar(old[0], 'reservation_id')
require(scalar(new[0], 'reservation_id') == ident and scalar(old[0], 'state') == 'ACTIVE'
and scalar(new[0], 'state') == 'RELEASED' and scalar(new[0], 'terminal_at') == minute,
'reservation release identity/state/time')
operations = rows(after, 'snapshot', 'systems', 'runtime', 'inventory', 'idempotency_results')
matches = [r for r in operations if scalar(r, 'action') == 'release'
and scalar(r, 'result', 'reservation_id') == ident]
require(len(matches) == 1 and scalar(matches[0], 'result', 'ok') is True,
'exactly one successful release')
require(field(after, 'requests', request).plain() == {}, 'no orphan request')
return ident
def payment(before, after, minute):
sale = sales(after)
require(not sales(before) and len(sale) == 1, 'exactly one new sale')
price = scalar(before, 'inputs', 'price')
require(price == scalar(before, 'service', 'price_snapshot')
and scalar(before, 'inputs', 'duration') == scalar(before, 'service', 'duration_minutes'),
'values derived from service snapshot')
require(price > 0 and scalar(sale[0], 'amount') == price
and scalar(sale[0], 'absolute_minute') == minute
and scalar(sale[0], 'source_entity_id') == scalar(after, 'inputs', 'facility_id'),
'sale amount/time/facility')
require(scalar(after, 'wallets', GUEST) == scalar(before, 'wallets', GUEST) - price,
'single wallet debit')
require(scalar(after, 'service', 'state') == 'COMPLETED'
and scalar(after, 'service', 'completed_at') == minute, 'completed before payment')
runtime = field(after, 'snapshot', 'systems', 'runtime')
history = [r for r in rows(runtime, 'facilities', 'service_history')
if scalar(r, 'service_id') == scalar(after, 'service', 'service_id')]
require(len(history) == 1 and history[0].raw == field(after, 'service').raw, 'completed service joins typed Runtime')
require(sum(r.raw == sale[0].raw for r in rows(runtime, 'economy', 'entries')) == 1,
'sale joins typed Runtime ledger once')
key = 'service.payment.' + scalar(after, 'service', 'service_id')
idem = [r for r in rows(runtime, 'economy', 'idempotency') if scalar(r, 'key') == key]
require(len(idem) == 1 and scalar(idem[0], 'transaction_id') == scalar(sale[0], 'transaction_id'),
'independent service/payment idempotency join')
receipt_entries = [r for receipt in rows(after, 'receipts') for r in rows(receipt, 'entries')]
require(sum(r.raw == sale[0].raw for r in receipt_entries) == 1, 'sale bound to one typed receipt')
return sale[0]
def destruction_command(points, phases):
before, end = points['before'], points['held']
n = scalar(before, 'inputs', 'boundary')
prior = phase(phases, 'FACILITY_COMPLETION', n)
require(scalar(prior, 'facility', 'durability') == 0
and scalar(prior, 'facility', 'state') == 'BROKEN', 'command destroys before completion')
for p in (points['boundary'], end):
require(scalar(p, 'service', 'state') == 'FAILED'
and scalar(p, 'service', 'failure_reason') == 'BROKEN', 'INTERRUPTION_BROKEN')
require(not sales(p) and scalar(p, 'wallets', GUEST) == scalar(before, 'wallets', GUEST),
'zero destroyed charge')
release(before, p, REQUEST, n)
return {'destruction_stop': {'charges': 0}, 'command_destruction_before_completion': True}
def destruction_raid_r40(points, phases):
before, end = points['before'], points['held']
n = scalar(before, 'inputs', 'boundary')
pre = phase(phases, 'INCIDENTS_AND_EVENTS', n)
post = phase(phases, 'FACILITY_QUEUES', n)
payment(before, phase(phases, 'VITALS_AND_ENVIRONMENT', n), n)
payment(before, pre, n)
require(scalar(pre, 'facility', 'durability') > 0 and scalar(post, 'facility', 'durability') == 0
and scalar(post, 'facility', 'state') == 'BROKEN'
and scalar(post, 'facility', 'suspension_reason') == 'DESTROYED', 'sale before automatic destruction')
require(scalar(end, 'minute') == n + 1, 'unfinished failure at N+1')
release(before, end, SECOND_REQUEST, n + 1)
failed = [r for r in rows(end, 'snapshot', 'systems', 'runtime', 'facilities', 'service_history')
if scalar(r, 'request_id') == SECOND_REQUEST]
require(len(failed) == 1 and scalar(failed[0], 'state') == 'FAILED'
and scalar(failed[0], 'failure_reason') == 'BROKEN', 'unfinished service failed by broken facility')
require(scalar(end, 'wallets', SECOND) == scalar(before, 'wallets', SECOND), 'no unfinished charge')
require([r.raw for r in sales(end)] == [r.raw for r in sales(pre)], 'no extra raid sale')
return {'raid_sale_before_destruction': True, 'raid_unfinished_release': True}
def paid_before_incident(points, phases):
"""Phase-start snapshots bracket completion and the public automatic event."""
before, boundary, end = (points[k] for k in ('before', 'boundary', 'held'))
n = scalar(before, 'inputs', 'boundary')
completion = phase(phases, 'FACILITY_COMPLETION', n)
completed = phase(phases, 'VITALS_AND_ENVIRONMENT', n)
incident = phase(phases, 'INCIDENTS_AND_EVENTS', n)
queues = phase(phases, 'FACILITY_QUEUES', n)
require([phases.index(p) for p in (completion, completed, incident, queues)] ==
sorted(phases.index(p) for p in (completion, completed, incident, queues)),
'completion/event/queue phase order')
require(scalar(before, 'minute') == n - 1 and scalar(boundary, 'minute') == n
and scalar(end, 'minute') == n + 1, 'exact boundary points')
for p in (before, completion):
require(scalar(p, 'service', 'state') == 'ACTIVE' and not sales(p)
and scalar(p, 'service', 'started_at') + scalar(p, 'service', 'duration_minutes') == n
and scalar(p, 'service', 'elapsed_minutes') == scalar(p, 'service', 'duration_minutes') - 1
and scalar(p, 'facility', 'durability') > 0, 'independent pre-completion state')
sale = payment(before, completed, n)
for p in (completed, incident, queues, boundary, end):
require(payment(before, p, n).raw == sale.raw, 'identical surviving sale')
require([r.raw for r in rows(p, 'ledger') if scalar(r, 'category') == 'SERVICE_SALE'] == [sale.raw],
'one total sale; secondary never charged')
require(scalar(p, 'wallets', SECOND) == scalar(before, 'wallets', SECOND), 'unchanged second wallet')
receipts = [r for r in rows(p, 'receipts') if scalar(r, 'id') == scalar(sale, 'transaction_id')]
require(len(receipts) == 1 and scalar(receipts[0], 'phase') == 'FACILITY_COMPLETION'
and scalar(receipts[0], 'minute') == n, 'payment emitted in completion phase')
require(scalar(sale, 'absolute_minute') // 1440 + 1 == n // 1440 + 1,
'financial day derived from ledger absolute_minute')
require(scalar(completed, 'facility', 'durability') > 0
and scalar(incident, 'facility', 'durability') > 0, 'destruction not before incidents')
for p in (queues, boundary, end):
require(scalar(p, 'facility', 'durability') == 0 and scalar(p, 'facility', 'state') == 'BROKEN'
and scalar(p, 'facility', 'suspension_reason') == 'DESTROYED', 'event destruction at N')
def services(p):
facilities = field(p, 'snapshot', 'systems', 'runtime', 'facilities')
return (rows(facilities, 'service_history') +
[s for f in rows(facilities, 'instances') for s in rows(f, 'active_services')])
baseline = services(before)
ids = [scalar(s, 'service_id') for s in baseline]
require(len(ids) == len(set(ids)) == 2, 'exactly two independent original service IDs')
second_id = None
for p in (before, completion, completed, incident, queues, boundary, end):
current = services(p)
require(sorted(scalar(s, 'service_id') for s in current) == sorted(ids), 'zero duplicate generations')
for key in ('known_service_ids', 'known_request_ids', 'next_service_sequence'):
require(field(p, 'snapshot', 'systems', 'runtime', 'facilities', key).raw ==
field(before, 'snapshot', 'systems', 'runtime', 'facilities', key).raw,
'stable service/request generation bookkeeping: ' + key)
secondary = [s for s in current if scalar(s, 'request_id') == SECOND_REQUEST]
require(len(secondary) == 1, 'one secondary request/service join')
s = secondary[0]
if second_id is None:
second_id = scalar(s, 'service_id')
require(scalar(s, 'service_id') == second_id, 'secondary identity unchanged')
if p is end:
require(scalar(s, 'state') == 'FAILED' and scalar(s, 'failure_reason') == 'BROKEN'
and scalar(s, 'completed_at') == n + 1, 'secondary failed once at N+1')
else:
require(scalar(s, 'state') == 'ACTIVE' and scalar(s, 'elapsed_minutes') < scalar(s, 'duration_minutes')
and scalar(s, 'started_at') == n - 1, 'secondary unfinished through N')
reservation = [r for r in rows(p, 'reservations') if scalar(r, 'requester_id') == SECOND_REQUEST]
require(len(reservation) == 1 and scalar(reservation[0], 'state') == 'ACTIVE', 'secondary reservation held through N')
require(not [r for r in rows(p, 'snapshot', 'systems', 'runtime', 'inventory', 'idempotency_results')
if scalar(r, 'action') == 'release'
and scalar(r, 'result', 'reservation_id') == scalar(reservation[0], 'reservation_id')],
'no early secondary release')
release(before, end, SECOND_REQUEST, n + 1)
require(not rows(end, 'snapshot', 'systems', 'runtime', 'facilities', 'requests')
and all(scalar(r, 'state') != 'ACTIVE' for r in rows(end, 'reservations'))
and scalar(end, 'active_services') == 0, 'no reservation or orphan request remains')
return {'paid_before_incident': True, 'duplicate_generations': 0}
def destruction_raid(points, phases):
before = points['before']
n = scalar(before, 'inputs', 'boundary')
due = rows(before, 'inputs', 'recovery', 'due_rounds')
require(len(due) == 1 and scalar(due[0], 'earliest_minute') == n
and scalar(due[0], 'raid_id') == 'p04.s5.raid', 'idle OBJECTIVE due exactly N')
pre = phase(phases, 'INCIDENTS_AND_EVENTS', n)
require(scalar(pre, 'facility', 'durability') > 0, 'idle breach not before incidents')
for point in (phase(phases, 'FACILITY_QUEUES', n), points['boundary'], points['held']):
require(scalar(point, 'facility', 'durability') == 0 and scalar(point, 'facility', 'state') == 'BROKEN'
and scalar(point, 'facility', 'suspension_reason') == 'DESTROYED', 'automatic idle destruction in INCIDENTS_AND_EVENTS')
require(not rows(point, 'reservations') and field(point, 'service').plain() == {}
and scalar(point, 'active_services') == 0
and not rows(point, 'snapshot', 'systems', 'runtime', 'facilities', 'requests')
and all(v.plain() == {} for _, v in field(point, 'requests').value), 'idle no requests/reservations/orphans')
require(not any(scalar(r, 'category') == 'SERVICE_SALE' for r in rows(point, 'ledger')),
'idle raid zero SERVICE_SALE')
return {'idle_objective_breach': True, 'destruction_stop': {'charges': 0}}
def destruction_in_flight(points, phases):
before, boundary, end = points['before'], points['boundary'], points['held']
n = scalar(before, 'inputs', 'boundary')
pre = phase(phases, 'INCIDENTS_AND_EVENTS', n)
post = phase(phases, 'FACILITY_QUEUES', n)
require(scalar(pre, 'facility', 'durability') > 0 and scalar(pre, 'service', 'state') == 'ACTIVE'
and scalar(pre, 'service', 'elapsed_minutes') < scalar(pre, 'service', 'duration_minutes'),
'in-flight completion phase precedes destruction')
require(scalar(post, 'facility', 'durability') == 0 and scalar(post, 'facility', 'state') == 'BROKEN'
and scalar(boundary, 'service', 'state') == 'ACTIVE', 'event breaks active service at N')
require(scalar(end, 'minute') == n + 1 and scalar(end, 'service', 'state') == 'FAILED'
and scalar(end, 'service', 'failure_reason') == 'BROKEN', 'N+1 in-flight failure')
for p in (boundary, end):
require(not sales(p) and field(p, 'wallets').raw == field(before, 'wallets').raw, 'in-flight zero charge')
release(before, end, REQUEST, n + 1)
return {'in_flight_destruction': True, 'destruction_stop': {'charges': 0}}
def shift_completion(points, phases):
before, end, held = points['before'], points['boundary'], points['held']
require(scalar(before, 'inputs', 'boundary') == 1080, 'DAY end exactly 1080')
require(scalar(before, 'minute') == 1079 and scalar(before, 'service', 'state') == 'ACTIVE'
and scalar(before, 'service', 'started_at') + scalar(before, 'service', 'duration_minutes') == 1080
and scalar(before, 'service', 'elapsed_minutes') == scalar(before, 'service', 'duration_minutes') - 1,
'natural snapshot duration aligns completion to 1080')
for point, label in [(before, 'first-before-17-59'), (end, 'first-18-00-tick-complete'),
(held, 'first-18-01-tick-complete'),
(phase(phases, 'FACILITY_COMPLETION', 1080), 'first-18-00-before-facility'),
(phase(phases, 'VITALS_AND_ENVIRONMENT', 1080), 'first-18-00-after-facility'),
(phase(phases, 'PUBLISH_SNAPSHOT', 1080), 'first-18-00-after-staff')]:
require(scalar(point, 'order_label') == label, 'historical shift observation label: ' + label)
require(not sales(phase(phases, 'FACILITY_COMPLETION', 1080)), 'not charged before FACILITY_COMPLETION')
sale = payment(before, phase(phases, 'VITALS_AND_ENVIRONMENT', 1080), 1080)
payment(before, end, 1080)
payment(before, held, 1080)
require(scalar(held, 'minute') == 1081 and field(end, 'service').raw == field(held, 'service').raw,
'1081 no second completion')
receipts = [r for r in rows(end, 'receipts') if scalar(r, 'id') == scalar(sale, 'transaction_id')]
require(len(receipts) == 1 and scalar(receipts[0], 'phase') == 'FACILITY_COMPLETION', 'sale before handover')
staff = rows(receipts[0], 'staff_at_receipt')
ids = field(before, 'service', 'staff_ids').plain()
require(ids and [scalar(r, 'staff_id') for r in staff] == ids, 'DAY staff captured at receipt')
shifts = rows(before, 'snapshot', 'systems', 'runtime', 'staff', 'shifts')
final_shifts = rows(end, 'snapshot', 'systems', 'runtime', 'staff', 'shifts')
final_staff = rows(end, 'snapshot', 'systems', 'runtime', 'staff', 'staff')
for worker in staff:
ident = scalar(worker, 'staff_id')
shift = [s for s in shifts if scalar(s, 'shift_instance_id') == scalar(worker, 'shift_id')]
require(len(shift) == 1 and scalar(shift[0], 'end_at') == 1080 and scalar(shift[0], 'template_id') == 'DAY'
and scalar(worker, 'state') != 'OFF_DUTY', 'DAY not NIGHT staff before handover')
after = [s for s in final_shifts if scalar(s, 'shift_instance_id') == scalar(worker, 'shift_id')]
require(len(after) == 1 and scalar(after[0], 'actual_ended_at') == scalar(after[0], 'end_at') == 1080,
'DAY shift ended after receipt')
workers = [s for s in final_staff if scalar(s, 'staff_id') == ident]
require(len(workers) == 1 and scalar(workers[0], 'state') == 'OFF_DUTY', 'DAY now OFF_DUTY')
return {'shift_completion': {'minute': 1080, 'completions': 1, 'charges': 1, 'completion_before_shift': True}}
def paused_midnight(points, phases):
before, end = points['before'], points['recovered']
n = scalar(before, 'inputs', 'boundary')
require(n > 0 and n % 1440 == 0, 'paused midnight multiple')
for p in (before, phase(phases, 'TIME_BOUNDARIES', n), phase(phases, 'MANA', n), points['boundary'], points['held']):
require(scalar(p, 'service', 'state') == 'PAUSED'
and scalar(p, 'service', 'interruption_reason') == 'RELATED_FACILITY_INACTIVE'
and scalar(p, 'service', 'elapsed_minutes') == scalar(before, 'service', 'elapsed_minutes'),
'legitimate pause unchanged through DAILY_CLOSE')
require(field(p, 'reservations').raw == field(before, 'reservations').raw
and field(p, 'requests', REQUEST).raw == field(before, 'requests', REQUEST).raw,
'identical active reservations and preserved request')
require(not sales(p) and field(p, 'wallets').raw == field(before, 'wallets').raw, 'no paused sale')
active = rows(before, 'reservations')
require(len(active) == 1 and scalar(active[0], 'state') == 'ACTIVE', 'one active meal reservation')
post = phase(phases, 'MANA', n)
summaries = rows(post, 'snapshot', 'systems', 'runtime', 'operations', 'coordinator', 'day_summaries')
summaries = [s for s in summaries if scalar(s, 'closed_at') == n]
require(len(summaries) == 1, 'one DAILY_CLOSE during TIME_BOUNDARIES')
settlement_rows = [r for r in rows(post, 'ledger') if scalar(r, 'absolute_minute') == n]
upkeep = [r for r in settlement_rows if scalar(r, 'category') == 'MAINTENANCE_PAYMENT']
require(upkeep and len({scalar(r, 'transaction_id') for r in upkeep}) == 1, 'one paused upkeep settlement')
require(len({scalar(r, 'source_entity_id') for r in upkeep}) == len(upkeep), 'one upkeep row per owned facility')
for row in upkeep:
accrual = [r for r in rows(post, 'ledger') if scalar(r, 'category') == 'MAINTENANCE_ACCRUAL'
and scalar(r, 'transaction_id') == scalar(row, 'transaction_id')
and scalar(r, 'source_entity_id') == scalar(row, 'source_entity_id')
and scalar(r, 'amount') == scalar(row, 'amount') and scalar(r, 'absolute_minute') == n - 1]
require(len(accrual) == 1, 'paused upkeep accrual joined once')
wages = [r for r in settlement_rows if scalar(r, 'category') == 'WAGE']
require(len(wages) == 1, 'one paused payroll transaction')
payroll = [r for r in rows(post, 'snapshot', 'systems', 'runtime', 'staff', 'payroll_settlements')
if scalar(r, 'settlement_id') == scalar(wages[0], 'source_entity_id')]
require(len(payroll) == 1 and scalar(payroll[0], 'day') == n // 1440, 'paused payroll day/ledger join')
paid = [r for r in rows(payroll[0], 'rows') if scalar(r, 'payment') > 0]
require(paid and len({scalar(r, 'staff_id') for r in paid}) == len(paid)
and sum(scalar(r, 'payment') for r in paid) == scalar(wages[0], 'amount'), 'paused payroll paid once')
for p in (points['boundary'], points['held'], end):
require([r.raw for r in rows(p, 'ledger') if scalar(r, 'absolute_minute') == n] == [r.raw for r in settlement_rows],
'no double settlement or midnight sale')
current = [s for s in rows(p, 'snapshot', 'systems', 'runtime', 'operations', 'coordinator', 'day_summaries')
if scalar(s, 'closed_at') == n]
require([s.raw for s in current] == [s.raw for s in summaries], 'settlement summary posted once')
completion = scalar(end, 'service', 'completed_at')
require(n < completion < n + 1440, 'recovery in new day')
payment(before, end, completion)
consumed = rows(end, 'reservations')
require(len(consumed) == 1 and scalar(consumed[0], 'reservation_id') == scalar(active[0], 'reservation_id')
and scalar(consumed[0], 'state') == 'CONSUMED' and field(end, 'requests', REQUEST).plain() == {},
'consumed original reservation no orphan')
return {'paused_midnight': {'orphan_reservations': 0, 'crossed_midnight_while_paused': True,
'stopped_charges': 0, 'completions': 1, 'charges': 1}}
def midnight_day(points, phases):
before, end, replay = points['before'], points['boundary'], points['recalled']
n = scalar(before, 'inputs', 'boundary')
require(n > 0 and n % 1440 == 0, 'midnight multiple')
pre = phase(phases, 'FACILITY_COMPLETION', n)
require(not sales(pre), 'settlement before sale')
coordinator = field(pre, 'snapshot', 'systems', 'runtime', 'operations', 'coordinator')
days = [r for r in rows(coordinator, 'day_summaries') if scalar(r, 'closed_at') == n]
require(len(days) == 1 and scalar(days[0], 'period_end_minute_exclusive') == n,
'one half-open DAILY_CLOSE at N')
upkeep = [r for r in rows(pre, 'ledger') if scalar(r, 'category') == 'MAINTENANCE_PAYMENT'
and scalar(r, 'absolute_minute') == n]
require(upkeep and len({scalar(r, 'transaction_id') for r in upkeep}) == 1, 'a_upkeep before sale')
mana = phase(phases, 'MANA', n)
require(all(any(r.raw == u.raw for r in rows(mana, 'ledger')) for u in upkeep),
'upkeep posted during TIME_BOUNDARIES')
sale = payment(before, end, n)
payment(before, phase(phases, 'VITALS_AND_ENVIRONMENT', n), n)
require(n <= scalar(sale, 'absolute_minute') < n + 1440, 'new day sale')
require(field(end, 'snapshot').raw == field(replay, 'snapshot').raw,
'same-minute replay preserves every typed Runtime field')
require(scalar(replay, 'inputs', 'recovery', 'midnight_replay', 'is_replay') is True,
'same minute is_replay')
def paid_view(point):
value = point.plain()
runtime = value['snapshot']['systems']['runtime']
value.update(staff=runtime['staff'], payroll=runtime['staff']['payroll_settlements'],
shifts=runtime['staff']['shifts'], operations=runtime['operations']['coordinator'],
idempotency={'economy': runtime['economy']['idempotency']})
return value
# Reuse the unchanged paid-midnight ledger/duty joins after the typed order gates.
series.settlement(paid_view(before), paid_view(end))
return {'midnight_settlement': {'settlements': 1, 'sales_payments': 1, 'payroll_payments': 1,
'upkeep_payments': 1, 'duty_payments': 1, 'nonzero_payroll': True},
'midnight_replay': {'settlements': 1, 'same_minute_replayed': True, 'duplicate_payments': 0},
'midnight_close_upkeep_before_sale': True, 'midnight_new_day_sale': True}
def exit_order(points, phases):
before = points['before']
n = scalar(before, 'inputs', 'boundary')
pre = phase(phases, 'FACILITY_COMPLETION', n)
release(before, pre, SECOND_REQUEST, n)
for p in [pre, points['boundary'], points['held']]:
services = rows(p, 'snapshot', 'systems', 'runtime', 'facilities', 'service_history')
services = services + [s for facility in rows(p, 'snapshot', 'systems', 'runtime', 'facilities', 'instances')
for s in rows(facility, 'active_services')]
require(not any(scalar(s, 'request_id') == SECOND_REQUEST for s in services), 'command exit before start')
require(scalar(p, 'wallets', SECOND) == scalar(before, 'wallets', SECOND), 'command exit no charge')
ai = phase(phases, 'AI_DECISIONS', n)
published = phase(phases, 'PUBLISH_SNAPSHOT', n)
payment(before, ai, n)
payment(before, phase(phases, 'VITALS_AND_ENVIRONMENT', n), n)
require(scalar(ai, 'guests', GUEST, 'state') == 'DECIDING'
and scalar(ai, 'guests', GUEST, 'planned_exit_at') <= n
and scalar(published, 'guests', GUEST, 'state') == 'LEAVING'
and scalar(published, 'guests', GUEST, 'exit_reason') == 'PLANNED_EXIT',
'AI exit only after DECIDING and paid completion')
return {'exit_release': {'orphan_reservations': 0, 'released_once': True}, 'command_exit_before_start': True,
'planned_exit_after_completion': True}
DERIVERS = {'S5C_DESTRUCTION_COMMAND': destruction_command, 'S5D_DESTRUCTION_RAID': destruction_raid,
'S5D_IN_FLIGHT': destruction_in_flight, 'S5D_PAID_BEFORE_INCIDENT': paid_before_incident,
'S5G_SHIFT_1080': shift_completion,
'S5H_PAUSED_MIDNIGHT': paused_midnight, 'S5E_MIDNIGHT': midnight_day, 'S5F_EXIT': exit_order}
def derive(root, writer_sha, reader_sha):
require(DEPENDENCIES == _EXECUTED_DEPENDENCIES
and DEPENDENCY_OBSERVATIONS == _EXECUTED_OBSERVATIONS,
'dependency identity differs from executed module roster')
root = Path(root).resolve(strict=True)
raw = Raw(root)
writer = json.loads(raw.pin(root / 'writer.json', writer_sha), object_pairs_hook=power.unique)
reader = json.loads(raw.pin(root / 'reader.json', reader_sha), object_pairs_hook=power.unique)
require(writer['pid'] != reader['pid'] and writer['profile'] != reader['profile'], 'independent Reader')
expected = set(DERIVERS) | set(power.CASES)
require(set(writer['branches']) == set(reader['branches']) == expected, 'complete S5 roster')
result = {}
for case, function in DERIVERS.items():
branch = raw.reference(writer['branches'][case])
replay = raw.reference(reader['branches'][case])
points = {k: raw.typed(v) for k, v in branch['points'].items()}
phases = [raw.typed(r) for r in branch['phases']]
raw.typed(branch['commands'])
for p in points.values():
if case not in ('S5D_DESTRUCTION_RAID', 'S5G_SHIFT_1080'):
staff_check(p, field(p, 'inputs', 'recovery'))
if case == 'S5G_SHIFT_1080':
staff_check(points['before'], field(points['before'], 'inputs', 'recovery'))
result[case] = function(points, phases)
expected_guards = {'G1'} if case == 'S5D_DESTRUCTION_RAID' else {'G2'} if case == 'S5D_IN_FLIGHT' else set()
require(set(branch['guards']) == expected_guards, 'complete fixed guard roster')
for label, ref in branch['guards'].items():
guard = raw.typed(ref)
require(scalar(guard, 'guard') == label, 'guard label binding')
facility_id = scalar(points['before'], 'inputs', 'facility_id')
payload_field = 'facility_id' if label == 'G1' else 'asset_id'
require(scalar(guard, 'command', 'payload', payload_field) == facility_id, 'guard binds case facility')
facilities = rows(guard, 'before', 'systems', 'runtime', 'facilities', 'instances')
facility = [f for f in facilities if scalar(f, 'instance_id') == facility_id]
require(len(facility) == 1, 'guard facility exists in BEFORE')
if label == 'G2':
require(rows(facility[0], 'active_services'), 'G2 independently busy BEFORE')
else:
raids = rows(guard, 'before', 'systems', 'runtime', 'defense', 'raids')
raid = [r for r in raids if scalar(r, 'raid_id') == 'p04.s5.raid']
require(len(raid) == 1 and scalar(raid[0], 'state') in ('PREPARING', 'ACTIVE', 'BETWEEN_WAVES')
and any(scalar(asset, 'asset_id') == facility_id for asset in rows(raid[0], 'assets')),
'G1 independently non-terminal Defense ownership')
result[case][label] = guard_oracle.verify(guard, series.variant, require)
for label, ref in replay['restored'].items():
require(field(raw.typed(ref), 'snapshot').raw == field(points[label], 'snapshot').raw,
'whole typed formal restore')
require(set(replay['restored']) == set(points) - {'before'}, 'complete restore roster')
require(set(replay['replay']) == set(points) - {'before', 'boundary'}, 'complete replay roster')
for label, ref in replay['replay'].items():
require(raw.typed(ref).raw == points[label].raw, 'whole typed independent replay')
n = scalar(points['before'], 'inputs', 'boundary')
expected_phases = [p.raw for p in phases if scalar(p, 'minute') > n or
(scalar(p, 'minute') == n and scalar(p, 'phase') == 'APPLY_COMMANDS')]
require([raw.typed(r).raw for r in replay['phases']] == expected_phases, 'complete phase replay')
result[case]['formal_restore_verified'] = True
if case == 'S5E_MIDNIGHT':
for reference in (branch['resource_replay'], replay['resource_replay']):
record = raw.typed(reference)
require(field(record, 'before').raw == field(record, 'after').raw == field(points['boundary'], 'snapshot').raw
and scalar(record, 'result', 'is_replay') is True and scalar(record, 'result', 'code') == 'OK'
and scalar(record, 'minute') == n, 'public advance_to after formal boundary restore')
result[case]['same_minute_replay'] = {'completions': 1, 'charges': 1, 'duplicate_generations': 0, 'same_minute_replayed': True}
result[case]['save_restore'] = {'settlements': 1, 'duplicate_payments': 0, 'formal_save_restored': True}
return {'cases': result, 'dependency_sha256': DEPENDENCIES, 'raw_sha256': raw.hashes,
'pending': ['patience_release'], 'formal_acceptance': False}
@@ -0,0 +1,419 @@
#!/usr/bin/env python3
"""Root-only typed mutations against fresh native S5 raw; never synthetic positives."""
import argparse
from contextlib import contextmanager
import hashlib
import json
from pathlib import Path
import struct
import sys
import time
sys.dont_write_bytecode = True
import s5_order_adapter as a
mutation = a.module('order_typed_mutation', Path(__file__).with_name('s5_power_adapter_controls.py'))
BUILD = Path('/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build')
def order_variant(node):
"""Swap the first unequal typed byte pair, preserving the header."""
rows = [r.raw if node.kind == 28 else r[0].raw + r[1].raw for r in node.value]
for i in range(len(rows)):
for j in range(i + 1, len(rows)):
if rows[i] != rows[j]:
header = len(node.raw) - sum(map(len, rows))
rows[i], rows[j] = rows[j], rows[i]
return node.raw[:header] + b''.join(rows)
return None
def static_estimate(record):
kinds, nodes, candidates = {}, 0, 0
def visit(node):
nonlocal nodes, candidates
nodes += 1
kinds[str(node.kind)] = kinds.get(str(node.kind), 0) + 1
candidates += (2 if node.kind in (4, 21, 2) else 1 if node.kind == 1 else
int(bool(node.value)) + int(len(node.value) > 1) if node.kind == 28 else
int(len(node.value) > 1) if node.kind == 27 else 0)
if node.kind == 28:
for child in node.value:
visit(child)
elif node.kind == 27:
for key, child in node.value:
visit(key)
visit(child)
visit(record.at('after'))
return {'record_bytes': len(record.raw), 'after_nodes': nodes, 'kind_counts': kinds,
'candidate_count': candidates, 'verify_mutations': candidates * 2,
'disk_mutation_bytes': 0,
'memory_model': 'O(record_bytes * (mutated_kinds + 2) + after_nodes + output_labels); parser overhead unmeasured',
'time_model': 'O(verify_mutations * record_bytes); calibrate with --pure-only; not a measured ETA'}
@contextmanager
def expected_memo(stats, guard_raw):
oracle = a.guard_oracle
original = oracle.expected
sources = tuple(hashlib.sha256(Path(m.__file__).read_bytes()).digest()
for m in (oracle, a.series))
cache = {}
def wrapped(before, command, guard, parse, require):
require(parse(guard_raw).value == guard, 'memo exact guard binding')
blobs = (before.raw, command.raw, guard_raw)
key = (tuple((len(b), hashlib.sha256(b).digest()) for b in blobs), sources)
if key not in cache:
stats['miss'] += 1
tree, result = original(before, command, guard, parse, require)
cache[key] = (tree.raw, result.raw)
else:
stats['hit'] += 1
return tuple(parse(b) for b in cache[key])
oracle.expected = wrapped
try:
yield original
finally:
oracle.expected = original
def guard_mutations(record):
"""All typed AFTER nodes are tested, including every changed journal field.
Also copy each corrupted AFTER into EXPECTED: the independent derivation
must still reject it. No native evidence is produced by these controls.
"""
oracle = a.guard_oracle
estimate = static_estimate(record)
a.require(oracle.verify(record, a.series.variant, a.require), 'guard control prerequisite')
started = time.monotonic()
checks, identities, no_order = [], [], []
stats = {'hit': 0, 'miss': 0}
kinds, nodes, candidates = {}, 0, 0
representatives, first_last = {}, []
parser_rejections = []
after = record.at('after')
def visit(node, path):
nonlocal nodes, candidates
nodes += 1
kinds[str(node.kind)] = kinds.get(str(node.kind), 0) + 1
replacements = []
if node.kind in (4, 21):
replacements = [('value', oracle.atom(node.kind, node.value + '.mutated')),
('string-type', oracle.atom(21 if node.kind == 4 else 4, node.value))]
elif node.kind == 2:
replacements = [('value', oracle.atom(2, node.value + 1)),
('int-float', struct.pack('<If', 3, float(node.value)))]
elif node.kind == 1:
replacements = [('bool', oracle.atom(1, not node.value))]
elif node.kind == 28:
start = 12 if node.raw[:4] == struct.pack('<I', 65564) else 8
if node.value:
replacements.append(('extra-row', node.raw[:start-4] + struct.pack('<I', len(node.value)+1)
+ node.raw[start:] + node.value[-1].raw))
if len(node.value) > 1:
encoded = order_variant(node)
if encoded is None:
no_order.append(path + ':order-no-genuine-variant')
replacements.append(('identity-order' if encoded is None else 'unsorted',
node.raw if encoded is None else encoded))
for i, child in enumerate(node.value):
visit(child, path + '/' + str(i))
elif node.kind == 27:
if len(node.value) > 1:
encoded = order_variant(node)
if encoded is None:
no_order.append(path + ':order-no-genuine-variant')
replacements.append(('identity-order' if encoded is None else 'unsorted',
node.raw if encoded is None else encoded))
for key, child in node.value:
visit(key, path + '/key:' + str(key.value))
visit(child, path + '/' + str(key.value))
for label, encoded in replacements:
candidates += 1
identity = encoded == node.raw
changed_after = mutation.replace(after, node, encoded)
changed_bytes = mutation.replace(record, after, changed_after)
try:
changed = a.series.variant(changed_bytes)
except ValueError:
if identity:
raise
changed = None
for copied in (False, True):
name = path + ':' + label + (':AFTER-copy' if copied else '')
# Copy even malformed typed AFTER bytes into EXPECTED, without
# parsing the invalid intermediate record a second time.
copied_bytes = (record.raw[:8] + b''.join(
k.raw + (changed_after if v is after or v is record.at('expected') else v.raw)
for k, v in record.value)) if copied else None
try:
tested = a.series.variant(copied_bytes) if copied else changed
except ValueError:
if identity:
raise
tested = None
if tested is None:
checks.append(name)
parser_rejections.append(name)
# Derivation inputs remain the original record's inputs.
tested = record
elif identity:
a.require(oracle.verify(tested, a.series.variant, a.require), 'identity accepted')
identities.append(name)
else:
try:
oracle.verify(tested, a.series.variant, a.require)
except ValueError:
checks.append(name)
else:
raise ValueError('guard mutation accepted: ' + name)
representatives.setdefault(node.kind, tested)
first_last[:] = [first_last[0] if first_last else tested, tested]
original = oracle.expected
with expected_memo(stats, record.at('guard').raw) as derive:
visit(after, 'after')
for tested in first_last + list(representatives.values()):
args = (tested.at('before'), tested.at('command'), tested.at('guard').value,
a.series.variant, a.require)
hit, plain = oracle.expected(*args), derive(*args)
a.require(tuple(n.raw for n in hit) == tuple(n.raw for n in plain), 'memo bytes')
before = record.at('before')
target = before.at('systems').at('runtime').at('next_command_id')
bad = bytearray(target.raw)
bad[4] ^= 1
changed_before = a.series.variant(mutation.replace(before, target, bytes(bad)))
changed_record = a.series.variant(mutation.replace(record, before, changed_before.raw))
misses = stats['miss']
try:
oracle.verify(changed_record, a.series.variant, a.require)
except ValueError:
pass
else:
raise ValueError('one-byte BEFORE mutation accepted')
a.require(stats['miss'] == misses + 1, 'one-byte BEFORE cache miss')
a.require(oracle.expected is original, 'memo wrapper restored')
try:
with expected_memo({'hit': 0, 'miss': 0}, record.at('guard').raw):
raise ValueError('cleanup sentinel')
except ValueError:
pass
a.require(oracle.expected is original, 'exceptional memo wrapper restored')
a.require(estimate['verify_mutations'] == candidates * 2 and estimate['after_nodes'] == nodes
and estimate['kind_counts'] == kinds, 'static enumeration agrees')
return {'negative_controls': checks, 'negative_count': len(checks),
'identity_positive_count': len(identities), 'identity_positive_list': identities,
'no_genuine_order_variant': no_order, 'memo': stats,
'parser_rejections': parser_rejections,
'elapsed': time.monotonic() - started,
'static_estimate': estimate}
def pure_controls():
"""Source-shaped synthetic serializer units, never Writer/Reader positives."""
o = a.guard_oracle
atom, d, arr = o.atom, o.strings_dict, o.array
prior = lambda ident: d([('code', atom(4, 'OK')), ('command_id', atom(2, ident)),
('target_id', atom(4, '')), ('message', atom(4, '')),
('resolution_hints', arr([], 4)), ('details', d([])), ('is_replay', atom(1, 0))])
q = d([('version', atom(2, 2)), ('pending', arr([], 27)), ('in_flight', arr([], 27)),
('processed', arr([prior(1), prior(2)], 27)),
('idempotency', d([('a', atom(2, 1)), ('b', atom(2, 2))])),
('accepted', arr([d([('command_id', atom(2, i)), ('idempotency_key', atom(4, k))])
for i, k in [(1, 'a'), (2, 'b')]], 27))])
runtime = d([('next_command_id', atom(2, 3)), ('command_queue', q),
('id_generator', d([('version', atom(2, 1)), ('counters', d([('domain_event', atom(2, 2))]))])),
('domain_events', d([('version', atom(2, 1)), ('published_ids', arr([atom(4, 'domain_event.000000000001'), atom(4, 'domain_event.000000000002')], 4)), ('recent_events', arr([], 27))])),
('operations', d([('enabled', atom(1, 0))])),
('business', d([('wallet', atom(2, 100)), ('reservations', arr([], 27)),
('equal_array', arr([atom(2, 0)] * 3, 2)),
('swap_array', arr([atom(2, 1), atom(2, 2)], 2))]))])
before = a.series.variant(d([('systems', d([('runtime', runtime)]))]))
results = {}
for guard in ('G1', 'G2'):
payload = (o.dictionary([(atom(21, 'facility_id'), atom(21, 'facility.1')),
(atom(21, 'request_id'), atom(21, a.REQUEST)),
(atom(21, 'guest_ids'), arr([atom(21, a.GUEST)]))]) if guard == 'G1' else
o.dictionary([(atom(21, 'raid_id'), atom(21, 'p04.s5.guard.raid')),
(atom(21, 'asset_id'), atom(21, 'facility.1')),
(atom(21, 'kind'), atom(21, 'OBJECTIVE')),
(atom(21, 'max_integrity'), atom(2, 10000))]))
command = a.series.variant(d([('command_id', atom(2, 3)), ('issued_tick', atom(2, 959)),
('execute_tick', atom(2, 959)), ('priority', atom(2, 10)),
('command_type', atom(4, 'create_service_request' if guard == 'G1' else 'register_defense_asset')),
('actor_id', atom(4, 'player')), ('target_id', atom(4, '')),
('payload', payload), ('idempotency_key', atom(4, 'p04.s5.unit.3'))]))
expected, result = o.expected(before, command, guard, a.series.variant, a.require)
record = a.series.variant(d([('before', before.raw), ('command', command.raw), ('guard', atom(4, guard)),
('expected', expected.raw), ('after', expected.raw), ('result', result.raw)]))
results[guard] = guard_mutations(record)
report = results[guard]
a.require(any('equal_array:identity-order' in x for x in report['identity_positive_list']), 'equal array positive')
for label in ('swap_array:unsorted', 'wallet:value', 'wallet:int-float', 'wallet:value:AFTER-copy'):
a.require(any(label in x for x in report['negative_controls']), 'synthetic coverage: ' + label)
return {'synthetic_serializer_controls_only': True, 'negative_controls': results, 'formal_acceptance': False}
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument('--pure-only', action='store_true')
parser.add_argument('--estimate-record', type=Path, help='parse one guard record and print static estimate only')
parser.add_argument('--raw-root', type=Path)
parser.add_argument('--writer-sha256')
parser.add_argument('--reader-sha256')
parser.add_argument('--scratch', type=Path)
args = parser.parse_args()
if args.estimate_record:
print(json.dumps(static_estimate(a.series.variant(args.estimate_record.read_bytes())), sort_keys=True))
return
if args.pure_only:
print(json.dumps(pure_controls(), sort_keys=True))
return
a.require(all((args.raw_root, args.writer_sha256, args.reader_sha256, args.scratch)), 'explicit fresh raw arguments')
scratch = args.scratch
a.require(scratch.is_absolute() and not scratch.exists() and not scratch.is_symlink(), 'explicit absent scratch')
a.require(scratch.parent.resolve(strict=True).is_relative_to(BUILD.resolve(strict=True)), 'scratch inside BUILD')
a.require(not scratch.resolve().is_relative_to(args.raw_root.resolve()), 'scratch outside native raw')
for parent in scratch.parents:
a.require(not parent.is_symlink(), 'scratch ancestor symlink')
positive = a.derive(args.raw_root, args.writer_sha256, args.reader_sha256)
scratch.mkdir()
raw = a.Raw(args.raw_root)
writer = json.loads(raw.pin(args.raw_root / 'writer.json', args.writer_sha256))
cases = {}
for case in a.DERIVERS:
branch = raw.reference(writer['branches'][case])
cases[case] = ({k: raw.typed(v) for k, v in branch['points'].items()},
[raw.typed(r) for r in branch['phases']])
checks = []
guard_reports = {}
def negative(label, case, owner, target, replacement):
points, phases = cases[case]
encoded = mutation.replace(owner, target, replacement)
(scratch / (label + '.var')).write_bytes(encoded)
changed = a.series.variant(encoded)
changed_points = {k: changed if v is owner else v for k, v in points.items()}
changed_phases = [changed if v is owner else v for v in phases]
try:
a.DERIVERS[case](changed_points, changed_phases)
except ValueError:
checks.append(label)
return
raise ValueError('mutation accepted: ' + label)
paid = 'S5D_PAID_BEFORE_INCIDENT'
points, phases = cases[paid]
end, boundary = points['held'], points['boundary']
n = a.scalar(points['before'], 'inputs', 'boundary')
def changed_array(node, members):
start = 12 if node.raw[:4] == struct.pack('<I', 65564) else 8
return node.raw[:start-4] + struct.pack('<I', len(members)) + b''.join(r.raw for r in members)
sale = a.sales(end)[0]
ledger = a.field(end, 'ledger')
negative('paid-sale-removed', paid, end, ledger, changed_array(ledger, [r for r in ledger.value if r is not sale]))
negative('paid-sale-duplicated', paid, end, ledger, changed_array(ledger, ledger.value + [sale]))
receipt = next(r for r in a.rows(end, 'receipts') if a.scalar(r, 'id') == a.scalar(sale, 'transaction_id'))
negative('paid-sale-after-incidents', paid, end, a.field(receipt, 'phase'), mutation.scalar(4, 'FACILITY_QUEUES'))
pre = a.phase(phases, 'FACILITY_COMPLETION', n)
negative('paid-destruction-before-completion', paid, pre, a.field(pre, 'facility', 'durability'), mutation.scalar(2, 0))
negative('paid-primary-not-completed', paid, end, a.field(end, 'service', 'state'), mutation.scalar(4, 'ACTIVE'))
negative('paid-secondary-charged', paid, end, a.field(end, 'wallets', a.SECOND), mutation.scalar(2, a.scalar(end, 'wallets', a.SECOND)-1))
secondary = next(r for r in a.rows(end, 'snapshot', 'systems', 'runtime', 'facilities', 'service_history')
if a.scalar(r, 'request_id') == a.SECOND_REQUEST)
negative('paid-secondary-not-failed', paid, end, a.field(secondary, 'state'), mutation.scalar(4, 'ACTIVE'))
negative('paid-secondary-failed-at-N', paid, end, a.field(secondary, 'completed_at'), mutation.scalar(2, n))
reservation = next(r for r in a.rows(end, 'reservations') if a.scalar(r, 'requester_id') == a.SECOND_REQUEST)
negative('paid-reservation-held', paid, end, a.field(reservation, 'state'), mutation.scalar(4, 'ACTIVE'))
operations = a.field(end, 'snapshot', 'systems', 'runtime', 'inventory', 'idempotency_results')
released = next(r for r in operations.value if a.scalar(r, 'action') == 'release'
and a.scalar(r, 'result', 'reservation_id') == a.scalar(reservation, 'reservation_id'))
negative('paid-double-release', paid, end, operations, changed_array(operations, operations.value + [released]))
idem = a.field(end, 'snapshot', 'systems', 'runtime', 'economy', 'idempotency')
key = 'service.payment.' + a.scalar(end, 'service', 'service_id')
payment = next(r for r in idem.value if a.scalar(r, 'key') == key)
negative('paid-idempotency-missing', paid, end, idem, changed_array(idem, [r for r in idem.value if r is not payment]))
negative('paid-idempotency-duplicate', paid, end, idem, changed_array(idem, idem.value + [payment]))
negative('paid-wrong-day', paid, end, a.field(sale, 'absolute_minute'), mutation.scalar(2, n+1440))
negative('paid-AFTER-copy', paid, points['before'], points['before'], end.raw)
midnight = 'S5E_MIDNIGHT'
points, phases = cases[midnight]
n = a.scalar(points['before'], 'inputs', 'boundary')
end = points['boundary']
negative('sale-old-day', midnight, end, a.field(a.sales(end)[0], 'absolute_minute'), mutation.scalar(2, n - 1))
pre = a.phase(phases, 'FACILITY_COMPLETION', n)
days = a.field(pre, 'snapshot', 'systems', 'runtime', 'operations', 'coordinator', 'day_summaries')
empty = days.raw[:-sum(len(r.raw) for r in days.value)] if days.value else days.raw
# Preserve the original typed-array header and replace its element count.
start = 12 if days.raw[:4] == struct.pack('<I', 28 | (1 << 16)) else 8
empty = days.raw[:start-4] + struct.pack('<I', 0)
negative('settlement-after-sale', midnight, pre, days, empty)
raid = 'S5D_DESTRUCTION_RAID'
points, phases = cases[raid]
pre = a.phase(phases, 'INCIDENTS_AND_EVENTS', a.scalar(points['before'], 'inputs', 'boundary'))
negative('idle-breach-too-early', raid, pre, a.field(pre, 'facility', 'durability'), mutation.scalar(2, 0))
for case in ('S5D_DESTRUCTION_RAID', 'S5D_IN_FLIGHT'):
branch = raw.reference(writer['branches'][case])
for label, reference in branch['guards'].items():
report = guard_mutations(raw.typed(reference))
guard_reports[case + ':' + label] = report
checks.extend(label + ':' + name for name in report['negative_controls'])
command = 'S5C_DESTRUCTION_COMMAND'
points, phases = cases[command]
end = points['held']
ops = a.field(end, 'snapshot', 'systems', 'runtime', 'inventory', 'idempotency_results')
release = next(r for r in ops.value if a.scalar(r, 'action') == 'release')
start = 12 if ops.raw[:4] == struct.pack('<I', 28 | (1 << 16)) else 8
doubled = ops.raw[:start-4] + struct.pack('<I', len(ops.value) + 1) + ops.raw[start:] + release.raw
negative('double-release', command, end, ops, doubled)
exit_case = 'S5F_EXIT'
points, phases = cases[exit_case]
n = a.scalar(points['before'], 'inputs', 'boundary')
ai = a.phase(phases, 'AI_DECISIONS', n)
negative('ai-exit-during-service', exit_case, ai, a.field(ai, 'guests', a.GUEST, 'state'), mutation.scalar(4, 'RECEIVING_SERVICE'))
pre = a.phase(phases, 'FACILITY_COMPLETION', n)
reservation = next(r for r in a.rows(pre, 'reservations') if a.scalar(r, 'requester_id') == a.SECOND_REQUEST)
negative('command-exit-after-start', exit_case, pre, a.field(reservation, 'terminal_at'), mutation.scalar(2, n + 1))
shift = 'S5G_SHIFT_1080'
points, phases = cases[shift]
end = points['boundary']
receipt = next(r for r in a.rows(end, 'receipts') if a.scalar(r, 'id') == a.scalar(a.sales(end)[0], 'transaction_id'))
negative('sale-after-handover', shift, end, a.field(receipt, 'phase'), mutation.scalar(4, 'AI_DECISIONS'))
staff = a.field(receipt, 'staff_at_receipt')
negative('empty-staff-at-receipt', shift, end, staff, a.guard_oracle.array([]))
negative('night-staff-at-receipt', shift, end, a.field(staff.value[0], 'shift_id'), mutation.scalar(4, 'NIGHT'))
paused = 'S5H_PAUSED_MIDNIGHT'
points, phases = cases[paused]
end = points['boundary']
reservation = a.rows(end, 'reservations')[0]
negative('reservation-released-at-midnight', paused, end, a.field(reservation, 'state'), mutation.scalar(4, 'RELEASED'))
negative('reservation-changed-at-midnight', paused, end, a.field(reservation, 'quantity'), mutation.scalar(2, a.scalar(reservation, 'quantity') + 1))
negative('paused-elapsed-typed-different', paused, end, a.field(end, 'service', 'elapsed_minutes'), struct.pack('<If', 3, float(a.scalar(end, 'service', 'elapsed_minutes'))))
ledger = a.field(end, 'ledger')
sale = a.sales(points['recovered'])[0]
start = 12 if ledger.raw[:4] == struct.pack('<I', 65564) else 8
def appended(row):
return ledger.raw[:start-4] + struct.pack('<I', len(ledger.value)+1) + ledger.raw[start:] + row.raw
negative('sale-while-paused', paused, end, ledger, appended(sale))
settlement = next(r for r in ledger.value if a.scalar(r, 'absolute_minute') == a.scalar(end, 'inputs', 'boundary'))
negative('double-paused-settlement', paused, end, ledger, appended(settlement))
points, phases = cases[midnight]
replay = points['recalled']
counter = a.field(replay, 'snapshot', 'systems', 'runtime', 'next_command_id')
negative('replay-extra-id', midnight, replay, counter, mutation.scalar(2, counter.value + 1))
negative('replay-json-equal-type-difference', midnight, replay, counter, struct.pack('<If', 3, float(counter.value)))
ledger = a.field(replay, 'snapshot', 'systems', 'runtime', 'economy', 'entries')
start = 12 if ledger.raw[:4] == struct.pack('<I', 65564) else 8
negative('replay-extra-row', midnight, replay, ledger, ledger.raw[:start-4] + struct.pack('<I', len(ledger.value)+1) + ledger.raw[start:] + ledger.value[-1].raw)
print(json.dumps({'positive_cases': list(positive['cases']), 'negative_controls': checks,
'negative_count': len(checks), 'guard_reports': guard_reports,
'formal_acceptance': False}, sort_keys=True))
if __name__ == '__main__':
main()
@@ -6,9 +6,26 @@ Its output is preparation only and cannot replace the registered evidence gate.
"""
import argparse
import hashlib
import importlib.util
import struct
import json
from pathlib import Path
PACKAGE_ROOT = Path(__file__).absolute().parents[1]
SERIES_PATH = PACKAGE_ROOT / 'p04_native_series.py'
for _path in (SERIES_PATH, *SERIES_PATH.parents):
if _path.is_symlink():
raise ValueError('dependency symlink')
if not SERIES_PATH.resolve(strict=True).is_relative_to(PACKAGE_ROOT.resolve(strict=True)):
raise ValueError('dependency outside package')
_series_bytes = SERIES_PATH.read_bytes()
SERIES_SHA256 = hashlib.sha256(_series_bytes).hexdigest()
_spec = importlib.util.spec_from_file_location('s5_power_series', SERIES_PATH)
series = importlib.util.module_from_spec(_spec)
exec(compile(_series_bytes, str(SERIES_PATH), 'exec'), series.__dict__)
DEPENDENCIES = {'p04_native_series.py': SERIES_SHA256}
DEPENDENCY_OBSERVATIONS = {'p04_native_series.py': str(SERIES_PATH)}
CASES = ("S5A_PURE", "S5B_DEPENDENCY")
GUEST = "p04.s5.guest.a"
REQUEST = "p04.s5.request.a"
@@ -46,24 +63,78 @@ class Raw:
self.pin(reference["var"]["path"], reference["var"]["sha256"])
return json.loads(self.pin(reference["json"]["path"], reference["json"]["sha256"]), object_pairs_hook=unique)
def typed(self, reference):
require(set(reference) == {"var", "json"}, "typed and JSON raw references required")
data = self.pin(reference["var"]["path"], reference["var"]["sha256"])
self.pin(reference["json"]["path"], reference["json"]["sha256"])
return series.variant(data)
def staff_check(point_node, recovery_node):
ids = point_node.at("facility").at("active_staff_ids")
expected = recovery_node.at("staff_ids")
for node, element in ((ids, 4), (expected, 21)):
require(node.kind == 28 and node.raw[:8] == struct.pack("<II", 28 | (1 << 16), element)
and all(member.kind == element for member in node.value), "typed staff representation")
require(len(ids.value) > 0 and ids.plain() == expected.plain(), "staff values/order/count")
def command_queue(snapshot):
return snapshot.at("systems").at("runtime").at("command_queue")
def duplicate_check(replay_node, recorded):
before, after = replay_node.at("before"), replay_node.at("after")
require(before.raw == after.raw, "resource replay changes no typed Runtime field")
result = replay_node.at("result")
require(result.at("code").value == "DUPLICATE_IDEMPOTENCY_KEY", "duplicate rejection code")
flag = result.at("is_replay")
require(flag.kind == 1 and flag.value is False, "duplicate is not replay")
details = result.at("details")
processed = details.at("processed")
require(processed.kind == 1 and processed.value is True, "original processed")
key, ident, original = recorded.at("key"), recorded.at("command_id"), recorded.at("original")
require(key.kind in (4, 21) and ident.kind == 2, "recorded command types")
require(details.at("idempotency_key").value == key.value
and details.at("original_command_id").value == ident.value
and details.at("original_result").raw == original.raw, "duplicate original binding")
queue = command_queue(before)
require(queue.at("idempotency").at(key.value).value == ident.value, "typed idempotency binding")
rows = [row for row in queue.at("processed").value if row.at("command_id").value == ident.value]
require(len(rows) == 1 and rows[0].raw == original.raw, "typed processed original")
def derive(root, writer_sha, reader_sha):
root = Path(root).resolve(strict=True)
raw = Raw(root)
writer = json.loads(raw.pin(root / "writer.json", writer_sha), object_pairs_hook=unique)
reader = json.loads(raw.pin(root / "reader.json", reader_sha), object_pairs_hook=unique)
require(writer["pid"] != reader["pid"] and writer["profile"] != reader["profile"], "independent reader required")
require(set(writer["branches"]) == set(reader["branches"]) == set(CASES), "exact case pair")
expected = set(CASES) | {"S5C_DESTRUCTION_COMMAND", "S5D_DESTRUCTION_RAID", "S5D_IN_FLIGHT", "S5D_PAID_BEFORE_INCIDENT", "S5E_MIDNIGHT", "S5F_EXIT", "S5G_SHIFT_1080", "S5H_PAUSED_MIDNIGHT"}
historical_roster = set(CASES) | {"S5C_DESTRUCTION_COMMAND", "S5D_DESTRUCTION_RAID", "S5E_MIDNIGHT", "S5F_EXIT"}
require(set(writer["branches"]) == set(reader["branches"]) and
set(writer["branches"]) in (set(CASES), historical_roster, expected), "exact pair or full case table roster")
output = {}
for case in CASES:
branch = raw.reference(writer["branches"][case])
replay = raw.reference(reader["branches"][case])
raw.reference(branch["commands"])
for role in (branch, replay):
guard = raw.reference(role["resource_replay"])
require(guard["result"]["is_replay"] is True and guard["result"]["code"] == "OK"
and guard["before"] == guard["after"], "resource replay changes no Runtime field")
for role, reference in ((branch, writer["branches"][case]), (replay, reader["branches"][case])):
typed_role = raw.typed(reference)
guard = raw.typed(role["resource_replay"])
recorded = guard.at("recorded_command")
commands = (raw.typed(branch["commands"]).at("completed_including_fixture")
if role is branch else typed_role.at("replay_completed_commands"))
rows = [row.at("result") for row in commands.value
if row.at("result").at("command_id").value == recorded.at("command_id").value]
require(len(rows) == 1 and rows[0].raw == recorded.at("original").raw,
"recorded original cross-check against typed commands")
duplicate_check(guard, recorded)
points = {name: raw.reference(ref) for name, ref in branch["points"].items()}
require(set(points) == {"before", "boundary", "held", "recovered", "duplicate_guard"}, "full point roster")
for reference in branch["points"].values():
point = raw.typed(reference)
staff_check(point, point.at("inputs").at("recovery"))
before = points["before"]
price, duration = before["inputs"]["price"], before["inputs"]["duration"]
require(price > 0 and duration > 1 and before["mana"] > 0, "paid natural service")
@@ -123,7 +194,7 @@ def derive(root, writer_sha, reader_sha):
{"dependency_stop": {"charges": 0, "progress_delta": 0, "reservation_ids_preserved": True, "service_id_preserved": True}}),
"recovery_completion": {"completions": 1, "charges": 1}},
reason_sequence=reasons, resume_minute=resume)
return dict(cases=output, raw_sha256=raw.hashes, native_provenance_verified=False,
return dict(cases=output, series_sha256=SERIES_SHA256, raw_sha256=raw.hashes, native_provenance_verified=False,
whole_goal_accepted=False, unit_accepted=False)
@@ -0,0 +1,137 @@
#!/usr/bin/env python3
"""Pure actual-fixture controls. Root runs this with a fresh BUILD scratch."""
import argparse
import hashlib
import importlib.util
import json
from pathlib import Path
import struct
import sys
sys.dont_write_bytecode = True
spec = importlib.util.spec_from_file_location("s5_power_adapter", Path(__file__).with_name("s5_power_adapter.py"))
a = importlib.util.module_from_spec(spec)
spec.loader.exec_module(a)
def scalar(kind, value):
if kind in (4, 21):
data = value.encode()
return struct.pack("<II", kind, len(data)) + data + b"\0" * (-len(data) % 4)
return struct.pack("<Ii", kind, value)
def replace(node, target, replacement):
"""Re-encode only ancestors of the targeted typed node, preserving other bytes."""
if node is target:
return replacement
if node.kind == 27:
return node.raw[:8] + b"".join(replace(k, target, replacement) + replace(v, target, replacement)
for k, v in node.value)
if node.kind == 28:
start = 12 if node.raw[:4] == struct.pack("<I", 28 | (1 << 16)) else 8
return node.raw[:start] + b"".join(replace(v, target, replacement) for v in node.value)
return node.raw
def array(element, members):
return struct.pack("<III", 28 | (1 << 16), element, len(members)) + b"".join(members)
def main():
parser = argparse.ArgumentParser(description=__doc__)
parser.add_argument("--fixture-dir", required=True, type=Path)
parser.add_argument("--scratch", required=True, type=Path)
args = parser.parse_args()
fixture = args.fixture_dir.resolve(strict=True)
projects = {parent for origin in (Path(__file__).resolve(), fixture)
for parent in origin.parents if (parent / "project.godot").is_file()}
a.require(bool(projects), "project ancestry required for scratch exclusion")
index = json.loads((fixture / "INDEX.json").read_text(), object_pairs_hook=a.unique)
for name, row in index["files"].items():
path = fixture / name
a.require(path.is_file() and not path.is_symlink() and path.resolve().is_relative_to(fixture), "fixture path")
data = path.read_bytes()
a.require(len(data) == row["bytes"] and hashlib.sha256(data).hexdigest() == row["sha256"], "INDEX sha/bytes")
scratch = args.scratch
a.require(scratch.is_absolute() and not scratch.exists() and not scratch.is_symlink(), "explicit absolute fresh scratch")
parent = scratch.parent.resolve(strict=True)
# BUILD is the registered allocation, never inferred from fixture provenance.
build = Path("/Users/korizatou114/Projects/TheTree-managed-worktrees/p04-01/.runtime/P04-01/build").resolve(strict=True)
scratch = parent / scratch.name
a.require(parent.is_dir() and parent.is_relative_to(build)
and all(not scratch.is_relative_to(project) for project in projects) and not scratch.is_relative_to(fixture), "scratch inside BUILD outside project/fixture")
scratch.mkdir()
audit = json.loads((fixture / "TYPED_AUDIT.json").read_text())
results = []
def negative(label, data, check):
path = scratch / (label + ".var")
path.write_bytes(data)
try:
check(a.series.variant(path.read_bytes()))
except ValueError:
results.append(label)
return
raise ValueError("negative accepted: " + label)
for case in a.CASES:
point = a.series.variant((fixture / ("writer-" + case + "-before.var")).read_bytes())
replay = a.series.variant((fixture / ("writer-" + case + "-resource-replay.var")).read_bytes())
recovery = point.at("inputs").at("recovery")
a.staff_check(point, recovery)
queue = a.command_queue(replay.at("before"))
key = audit["cases"][case]["replay_result"]["details"]["idempotency_key"]
ident = queue.at("idempotency").at(key)
rows = [row for row in queue.at("processed").value if row.at("command_id").value == ident.value]
a.require(len(rows) == 1, "actual processed binding")
original = rows[0]
# Derived exclusively from actual typed queue, not duplicate result details.
recorded_bytes = struct.pack("<II", 27, 3) + scalar(4, "key") + scalar(4, key) + scalar(4, "command_id") + ident.raw + scalar(4, "original") + original.raw
recorded = a.series.variant(recorded_bytes)
a.duplicate_check(replay, recorded)
results.append(case + "-positive")
ids = point.at("facility").at("active_staff_ids")
members = [v.raw for v in ids.value]
staff_bad = {
"wrong-id": array(4, [scalar(4, "wrong")] + members[1:]),
"stringname": array(21, [scalar(21, v.value) for v in ids.value]),
"missing": array(4, members[:-1]),
"extra": array(4, members + [scalar(4, "extra")]),
}
if case == "S5B_DEPENDENCY":
staff_bad["swapped"] = array(4, members[::-1])
for label, data in staff_bad.items():
negative(case + "-staff-" + label, replace(point, ids, data),
lambda n: a.staff_check(n, recovery))
result = replay.at("result")
details = result.at("details")
mutations = [
("key", details.at("idempotency_key"), scalar(4, "wrong")),
("id", details.at("original_command_id"), scalar(2, -1)),
("original", details.at("original_result"), struct.pack("<II", 27, 0)),
("processed-false", details.at("processed"), scalar(1, 0)),
("code", result.at("code"), scalar(4, "OK")),
("replay", result.at("is_replay"), scalar(1, 1)),
]
for label, target, data in mutations:
negative(case + "-duplicate-" + label, replace(replay, target, data),
lambda n: a.duplicate_check(n, recorded))
pairs = [(k, v) for k, v in details.value if k.value != "processed"]
missing = struct.pack("<II", 27, len(pairs)) + b"".join(k.raw + v.raw for k, v in pairs)
negative(case + "-processed-missing", replace(replay, details, missing),
lambda n: a.duplicate_check(n, recorded))
after = replay.at("after")
target = a.command_queue(after).at("idempotency")
value = target.at(key)
changed = replace(replay, value, struct.pack("<If", 3, float(value.value)))
changed_node = a.series.variant(changed)
a.require(changed_node.plain() == replay.plain() and changed_node.at("after").raw != after.raw,
"typed-only mutation retains JSON plain value")
negative(case + "-typed-after", changed, lambda n: a.duplicate_check(n, recorded))
print(json.dumps(dict(accepted=False, root_only=True, checks=results,
series_sha256=a.SERIES_SHA256), sort_keys=True))
if __name__ == "__main__":
main()
+105 -3
View File
@@ -283,6 +283,15 @@ def supplied_file(directory, descriptor):
support = directory / 'audit-support'
roots = [support / n for n in ('p04-whole-closure-r01', 'native-first-current',
'p04-current-native-series-r01', 'p04-r17-full-inputs-r01')]
fresh_path = support / 'p04-fresh-runs.json'
if fresh_path.is_file():
fresh = load(fresh_path)
require(fresh['protocol'] == 'p04-fresh-runs-v1', 'fresh material registry')
roots.append(support / 'p04-fresh-context')
for row in fresh['series'].values():
relative = Path(row['run'])
require(not relative.is_absolute() and '..' not in relative.parts, 'fresh material run path')
roots.append(directory / relative)
matches = [root for root in roots if path.is_relative_to(root)]
require(len(matches) == 1, 'unsupplied external material: ' + name)
path = safe(matches[0], path.relative_to(matches[0]).as_posix())
@@ -356,6 +365,10 @@ def verify_roles(index, directory):
composed = git_bytes('-c', 'rerere.enabled=false', 'merge-tree', '--write-tree',
main, submitted).decode().strip()
require(re.fullmatch('[0-9a-f]{40}', composed) is not None, 'conflicted composition')
if 'fresh_run_bindings' in index:
fresh = index['fresh_run_bindings']
require((fresh['M'], fresh['S'], fresh['Q_tree']) == (main, submitted, composed),
'fresh evidence does not bind recomputed Q')
main_entries, patch, target = [tree_entries(t) for t in (main, submitted, composed)]
anchor_entries = tree_entries(MAIN_ANCHOR)
for path in main_entries.keys() | target.keys():
@@ -498,7 +511,18 @@ def boundary_conditions(path, function):
return set(REQUIRED) | {'EV'}
def mandatory_conditions(index):
conditions = index.get('conditions')
require(isinstance(conditions, dict), 'mandatory conditions must be a dictionary')
missing = sorted(set(REQUIRED) - set(conditions))
unknown = sorted(set(conditions) - set(REQUIRED))
require(not missing and not unknown,
'mandatory conditions missing: ' + ', '.join(missing) + '; unknown: ' + ', '.join(unknown))
return conditions
def applicability(index, spec, source, head):
mandatory_conditions(index)
tested = index.get('versions', {}).get('tested')
require(isinstance(tested, str) and tree_entries(tested) and
product_manifest(tree_entries(tested)) == product_manifest(tree_entries(head)),
@@ -562,8 +586,7 @@ def coverage(index, raw, source, product_tree):
'docs/DESIGN_DECISIONS.md' if ref == 'D-034' else
'docs/plans/original-completion-2026-10-02/execution/p04-01-input-r01/ORDER_CONTRACT_DRAFT.md')
require(sha(raw[aid]) == sha(safe(ROOT, path)), 'authority document mismatch: ' + ref)
conditions = index.get('conditions')
require(isinstance(conditions, dict) and set(conditions) == set(REQUIRED), 'mandatory conditions missing/unknown')
conditions = mandatory_conditions(index)
for cid, (domain_name, refs, expected) in REQUIRED.items():
condition = conditions[cid]
require(condition.get('authority_refs') == list(refs), 'condition authority: ' + cid)
@@ -1050,7 +1073,7 @@ def verify_shift_completion(base):
return {'verified_conditions': ['shift_completion'], 'phases': points, 'transaction_id': transaction_id}
def combine_native_series(directory, native):
def combine_historical_native_series(directory, native):
"""Independent R composition; rerun raw checks, never trust condition scalars.
The C verifier and its fixtures remain unchanged. This function does not
@@ -1095,6 +1118,85 @@ def combine_native_series(directory, native):
'stage_A': 'candidate binding stage A pending', 'formal_acceptance': False}
def combine_native_series(directory, native):
"""Fresh raw supplies conditions; historical collection is separate provenance."""
import importlib.util
def module(name, path):
spec = importlib.util.spec_from_file_location(name, path)
value = importlib.util.module_from_spec(spec)
spec.loader.exec_module(value)
return value
module_path = ROOT / DOC_SCOPE / 'p04_native_series.py'
series = module('p04_fresh_series', module_path)
root_bindings = series.fresh_bindings(directory)
collection = root_bindings['collection']
require(re.fullmatch(r'audit-support/p04-raw-collect-q[0-9]+', collection) is not None,
'exclusive fresh collection name')
base = directory / collection
manifest_path = safe(base, 'MANIFEST.json')
manifest = load(manifest_path)
require(manifest['protocol'] == 'p04-fresh-native-series-collection-v1'
and manifest['historical_merged'] is False
and set(manifest['series']) == set(series.FRESH_RUNS), 'fresh series roster')
verified, bindings, results, pids = set(), {}, {}, []
for name in series.FRESH_RUNS:
binding = manifest['series'][name]
path = safe(base, binding['path'])
require(path.name == name + '.json' and sha(path) == binding['sha256']
and path.stat().st_size == binding['bytes'], 'fresh series collection pin')
recorded = load(path)
require(recorded['verifier_sha256'] == sha(module_path), 'fresh verifier drift')
actual = getattr(series, 'verify_fresh_' + name)(directory)
require({k: v for k, v in recorded.items() if k != 'verifier_sha256'} == actual, 'fresh raw recomputation drift')
verified.update(actual['verified_conditions'])
pids.extend(actual['owned_pids'])
bindings[name], results[name] = binding['sha256'], actual
require(len(pids) == len(set(pids)), 'fresh series PID reuse')
order = results['s5']['facts']['order']['cases']
gates = {
'D05-P04-DESTRUCTION': [('S5C_DESTRUCTION_COMMAND', 'command_destruction_before_completion'),
('S5D_DESTRUCTION_RAID', 'G1'), ('S5D_IN_FLIGHT', 'G2'),
('S5D_DESTRUCTION_RAID', 'idle_objective_breach'),
('S5D_IN_FLIGHT', 'in_flight_destruction'),
('S5D_PAID_BEFORE_INCIDENT', 'paid_before_incident')],
'D05-P04-MIDNIGHT-DAY': [('S5E_MIDNIGHT', 'midnight_close_upkeep_before_sale'),
('S5E_MIDNIGHT', 'midnight_new_day_sale')],
'D05-P04-EXIT': [('S5F_EXIT', 'command_exit_before_start'), ('S5F_EXIT', 'planned_exit_after_completion')],
}
for ref, pairs in gates.items():
require(all(order[case][key] is True for case, key in pairs), 'S5 order gate: ' + ref)
for case, key in [('S5G_SHIFT_1080', 'shift_completion'), ('S5H_PAUSED_MIDNIGHT', 'paused_midnight'),
('S5E_MIDNIGHT', 'same_minute_replay')]:
require(order[case][key] == REQUIRED[key][2], 'fresh S5 threshold: ' + key)
power = results['s5']['facts']['power']['cases']
require(power['S5A_PURE']['measurements']['power_stop'] == REQUIRED['power_stop'][2]
and power['S5B_DEPENDENCY']['measurements']['dependency_stop'] == REQUIRED['dependency_stop'][2],
'S5 D05-P04-PAUSE-REASON gate')
full_verifier = module('p04_full_verifier', ROOT / DOC_SCOPE / 'full_suite_verifier.py')
full_binding = root_bindings['full_suite']
full_run = directory / full_binding['run']
require(not Path(full_binding['run']).is_absolute() and '..' not in Path(full_binding['run']).parts,
'full run path')
for leaf, key in [('runner-input.json', 'runner_input'), ('runner-ended.json', 'runner_ended')]:
series.checked(safe(full_run, leaf).read_bytes(), full_binding[key], 'Root full receipt')
full_inputs = load(safe(full_run, 'runner-input.json'))
full = full_verifier.verify(Path(full_inputs['project_root']), full_run, REQUIRED)
require(full['verified'] is True and set(full['conditions']) == set(REQUIRED) | {'EV'}, 'full condition membership')
expected_source = {n: p['sha256'] for n, p in load(directory / root_bindings['series']['s5']['run'] / 'source_before.json').items()}
require(full['source_sha256'] == expected_source, 'full and boundary exact same Q')
history = safe(directory / 'audit-support/p04-raw-collect-r22', 'MANIFEST.json')
c_base = directory / 'audit-support/native-first-current'
require(native == verify_native(c_base), 'historical C provenance recomputation')
return {'verified_conditions': sorted(verified), 'series_manifest_sha256': sha(manifest_path),
'series_bindings': bindings, 'fresh_collection': collection, 'full_suite': full,
'historical_collection': {'manifest_sha256': sha(history), 'merged': False},
'C_source_manifest_sha256': sha(safe(c_base, 'SOURCE_MANIFEST.json')),
'C_provenance_sha256': sha(safe(c_base, 'OWNERSHIP_RAW_PROVENANCE.json')),
'missing_conditions': sorted((set(REQUIRED) | {'EV'}) - verified),
'nativeWindows': {name: 'pending' for name in sorted(set(REQUIRED) | {'EV'})},
'stage_A': 'candidate binding stage A pending', 'formal_acceptance': False}
def verify(directory):
# Contract hashes the supplied spec string, while the checked-in JSON has
# one final LF. Accept only that exact representation difference.