Compare commits
9
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
785815002e | ||
|
|
a9ef681fb8 | ||
|
|
13aefdd3dd | ||
|
|
2cd734062a | ||
|
|
e7f2271164 | ||
|
|
1820eed0ff | ||
|
|
eb94e1d7db | ||
|
|
acab529c8d | ||
|
|
befa0ef1f6 |
@@ -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.
|
||||
|
||||
+23
@@ -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.
|
||||
+11
@@ -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.
|
||||
+118
@@ -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.
|
||||
+259
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
]
|
||||
+65
@@ -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"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
+463
@@ -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"
|
||||
}
|
||||
]
|
||||
}
|
||||
+1167
File diff suppressed because one or more lines are too long
+300
File diff suppressed because one or more lines are too long
+169
File diff suppressed because one or more lines are too long
+131
@@ -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
|
||||
}
|
||||
+18
@@ -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"
|
||||
}
|
||||
+44
@@ -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"
|
||||
}
|
||||
+14
@@ -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
|
||||
+53
@@ -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
|
||||
}
|
||||
+88
@@ -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.
|
||||
+41
@@ -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.
|
||||
+3238
File diff suppressed because it is too large
Load Diff
@@ -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
-3
@@ -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 = {}
|
||||
|
||||
+5
-2
@@ -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)
|
||||
|
||||
+160
@@ -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())
|
||||
+159
@@ -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))
|
||||
+44
@@ -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()
|
||||
+405
@@ -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)
|
||||
+8
-6
@@ -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.
|
||||
|
||||
+357
-24
@@ -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}
|
||||
+419
@@ -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)
|
||||
|
||||
|
||||
|
||||
+137
@@ -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()
|
||||
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user