9.2 KiB
P13-02-CODE1 implementation handoff
This is non-graphic state/reference/occupancy/save machinery only. It does not complete P13-02, grant partial credit, or change the original 30/88 denominator or formal 14/88 count. Native execution and acceptance are pending.
Declared scope and verification
Before editing, the worker declared the new service, bounded Runtime hooks,
special tests, narrow runner, marker additions and this documentation. SaveService
was conditional on an exact-key dependency; inspection found
SupplyAutoPurchaseQuotePlans.valid_runtime_format has that dependency.
Only allowed paths were edited. No asset, UI, content, model, policy, clock phase,
or P04 change is involved.
The full ignored build/owner-handoff/ACTUAL_OPUS_RUN_DECISION.json was read and
left untouched. Base HEAD is 1e8d4ea88876865a72547ff0edf43ed5b0e74c7e.
The immutable spec was not edited. Its SHA-256 without the terminal newline is
the registered 8ea65f2eefedc772c08170186f5cd03ac017432f4b069ade4f9210d4215c2d43;
the on-disk file including that newline is
988d6e18a49372549863cd433432c2852c962fa64b138e490361c023e80249dc.
Worker verification: Python AST parsing/compilation only, without executing the
runner or importing its dependencies; source/JSON/hash review. GDScript parsing,
all tests, --prepare-only, native collection and regression were not run.
No check totals or native success receipts are claimed. No git writes, commits,
branches, other agents, integration or Runner operations were performed.
Service and commands
PeepingRoomService is a separate RefCounted service with no content or UI.
All command executors use the existing Runtime queue; queue/history receipts
remain normal Runtime behavior even for rejected/read-only domain commands.
| Command | Preconditions and result |
|---|---|
peeping_room_validate |
origin: Vector3i, optional footprint: Vector2i (2x1), optional target_instance_id: String/StringName. Pure domain validation. |
peeping_room_place |
Always BUILD_DEFINITION_PENDING_D04; no occupancy, resource, room or ID mutation. |
peeping_room_relink |
Existing room_id, explicit nonempty target_instance_id; full geometry and ownership validation excluding only the room's exact own occupancy. Leaves LINKED, stopped, RELINKED_PENDING_RESUME. |
peeping_room_record_evidence |
Existing room_id, nonblank named source_event_key. Uses Runtime minute, never caller-supplied time. Checks stopped, target power, target closure/opening hours, completed construction authority, and lost target in that order. Otherwise rejects with RECORDER_ELIGIBILITY_PENDING_D04_D08_P16. Never writes the ledger. |
Malformed command field types return INVALID_PAYLOAD. Missing/blank source keys
return SOURCE_EVENT_KEY_REQUIRED before operational checks. Loss latches both
TARGET_LOST and stopped, so collection after normal demolition returns STOPPED
while the room's link/stop reason identifies TARGET_LOST. No resume command or
automatic resume is defined. Power/closure guards read actual target conditions;
they do not define special-room power demand, staffing or normal operation.
Placement is exactly 2x1 BACK, fully behind a single completed FRONT
public_bath or adult_private_room. It checks bounds/excavation, both real
FacilityService and ConstructionService ownership, FRONT cells, World occupancy,
and both World walkability and PathService membership. Exact rejection families:
WRONG_LAYER, WRONG_FOOTPRINT, OUT_OF_BOUNDS, NOT_EXCAVATED,
TARGET_INCOMPLETE, TARGET_MISSING, PARTIAL_TARGET, MULTIPLE_TARGETS,
TARGET_MISMATCH, TARGET_UNKNOWN, TARGET_NOT_ALLOWED, TARGET_WRONG_LAYER,
CORRIDOR_CONFLICT, BACK_OCCUPIED. The named vip_suite request returns
PENDING_P10_01; vip_private_salon is not an allowed substitute.
Any existing corridor cell conflicts. A proposed cut through a connected corridor
is rejected before mutation, preserving the route; no reroute or bypass is
invented. Accepted fixture cells were already nonwalkable and become occupied
under special_peeping_room. No special-room construction weight/cost is assumed.
Runtime demolition and FacilityService unregistration latch loss. Collection also detects missing FRONT occupancy/identity. Rebuilding the same cells produces a different construction ID and never silently reattaches rooms. Relink is explicit.
CONTROLLED_FIXTURE boundary
Only service methods named controlled_fixture_place,
controlled_fixture_set_stopped, and controlled_fixture_record_evidence create
test rooms, enable fixture collection, or write evidence. They are labeled
CONTROLLED_FIXTURE in code and tests. They have no command/palette registration,
and no Runtime executor calls them. Test helpers disclose direct underground
geometry setup and MIMI registration; those do not assert natural unlock/join or
production eligibility. Target construction uses existing definitions/costs/times.
Room IDs come from the existing StableIdGenerator's peeping_room counter.
Evidence IDs encode the UTF-8 lengths and hex bytes of the full
(room_id, target_instance_id, source_event_key) tuple. This is injective rather
than delimiter concatenation or a hash with possible collisions. Replays return
the existing ID with duplicated=true and retain the first minute. Evidence is
only IDs, source key and minute. Room target_history retains prior bindings so
relink does not orphan existing opaque evidence.
Save invariants
Runtime versions remain 14 and 15, with version 15 only for existing v2 purchase
history. Optional canonical StringName key special_peeping_rooms has section
version 1 and exact keys version, rooms, evidence. Empty service state emits
no key, preserving original snapshots. Absent sections restore empty only if no
world occupancy uses the special kind or peeping_room. prefix. Thus removing
the section from a current room-bearing save is rejected without a version bump.
Restore stages the entire section against staged world, path, facilities, construction and ID generator before committing any Runtime state. It checks canonical keys/types, version, duplicate room/evidence identities, deterministic evidence tuple encoding, bounds/geometry, room/occupancy correspondence in both directions, generator high-water mark, known historical facility IDs, present target definition/geometry, loss/stopped coherence, and evidence room/history/time references. Null/present-empty sections are invalid; absence is the only empty encoding. Existing pending command/reference and schema migration checks remain.
SaveService validates a present section through the same staged service validator, then supplies a shallow copy without this one key to the original purchase-format allowlist. No other keys are removed. The original format 1 (Runtime 1–14), format 2 (Runtime 15), manifest duplicate 15 and MIMI checks remain unchanged.
Verification handoff
Five strict suites cover geometry/corridor, removal/relink, evidence/guards,
typed atomic save corruption and physical format 1, and Runtime commands plus
physical MIMI format 2. Tests use var_to_bytes for whole Runtime atomicity and
roundtrip checks. New marker rows carry final test source hashes; prior rows and
policy are unchanged. A helper under tests/special/ is not a discovered suite.
tools/run_p13_reference_tests.py defaults to read-only verification of
$BUILD_OUTPUT_DIR/p13-reference-native, failing closed without an absolute
environment path. Explicit --output --collect is for Root only. The strict flag
parser rejects abbreviations, repeated flags, positional inputs and = aliases.
--prepare-only is non-native but was not executed by this worker.
The runner imports the existing P18 core by path. Since its three entry functions
hardcode their label and seven/nine counts, a bounded AST adapter changes only
protocol/runner identities, those explicit roster cardinalities, and diagnostic
labels. It checks the exact adaptation-site counts and fails closed on drift.
All confinement, inventory, JSON, sealing, source/engine/marker/policy binding,
process, diagnostic, profile and cleanup gates are reused. It neither copies the
whole runner nor modifies P18/helpers. The whole selected source map binds both
runner sources. Phase count derives from len(ROSTER) + 2.
Roster includes all five new suites and existing construction/world/path/runtime
construction, supply migration, transport save, Runtime weather, snapshot
serialization, save lifecycle and MIMI purchase suites. Receipts retain
formal_acceptance=false and original_unit_complete=false.
Root must perform serialized native collection with the allocation/private
profile, then registered p13-reference validation, a separate actual Opus
review, and the final exact-version required regression. Only those steps can
establish execution results.
Still pending, without invented values
D04 build/upkeep/build minutes and other product numbers; recorder staffing and natural triggers/rates D04/D08/P16; VIP suite P10-01; D05 transaction decisions (no tick-phase changes here); P19 evidence use and P24 camera UI; normal palette registration/construction/operation and natural production evidence; whole P13 acceptance, final review/integration, and applicable native Windows conditions.