Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 10 additions & 1 deletion .github/workflows/production-recipe-observations.yml
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@ on:
- 'tests/schema/finite_bootstrap*'
- 'data/production/catalog.v2.json'
- 'data/production/catalog.v3.json'
- 'data/production/catalog.v4.json'
- 'src/app/first_playable_bootstrap.gd'
- 'src/core/access/access_control_system.gd'
- 'src/presentation/habitat/procedural_habitat_preview.gd'
- 'tests/godot/paid_chamber*'
- 'tests/schema/paid_chamber*'
- 'data/production/manual-room-reinforcement*'
- 'tests/godot/paid_room_reinforcement*'
- 'tests/schema/room_reinforcement*'
Expand Down Expand Up @@ -86,7 +92,7 @@ jobs:
include-templates: false
- name: Run bounded recipe, resource and maintenance checks
shell: pwsh
run: ./tools/ci/run-godot-checks.ps1 -TestNames 'recipe_requirements_test.gd','workstation_resource_view_test.gd','repair_usability_test.gd','first_playable_task_guide_test.gd','machinery_runtime_test.gd','checkpoint_recovery_test.gd','timed_canister_controls_test.gd','paid_horizontal_panels_test.gd','paid_door_lifecycle_test.gd','paid_door_pressure_room_test.gd','finite_bootstrap_acquisition_test.gd','commissioned_room_equalization_test.gd','paid_room_reinforcement_test.gd','horizontal_panel_controls_test.gd','horizontal_floor_support_query_test.gd','paid_floor_support_adapter_test.gd','paid_panel_collision_descriptors_test.gd','paid_panel_contact_scene_test.gd'
run: ./tools/ci/run-godot-checks.ps1 -TestNames 'recipe_requirements_test.gd','workstation_resource_view_test.gd','repair_usability_test.gd','first_playable_task_guide_test.gd','machinery_runtime_test.gd','checkpoint_recovery_test.gd','timed_canister_controls_test.gd','paid_horizontal_panels_test.gd','paid_door_lifecycle_test.gd','paid_door_pressure_room_test.gd','finite_bootstrap_acquisition_test.gd','commissioned_room_equalization_test.gd','paid_room_reinforcement_test.gd','paid_chamber_test.gd','horizontal_panel_controls_test.gd','horizontal_floor_support_query_test.gd','paid_floor_support_adapter_test.gd','paid_panel_collision_descriptors_test.gd','paid_panel_contact_scene_test.gd'
- name: Validate real emitted JSON against local versioned schemas
shell: pwsh
run: |
Expand All @@ -104,6 +110,8 @@ jobs:
if ($LASTEXITCODE -ne 0) { throw 'Finite bootstrap schema checks failed.' }
& $schemaPython tests/schema/paid_door_schema_test.py
if ($LASTEXITCODE -ne 0) { throw 'Paid door schema checks failed.' }
& $schemaPython tests/schema/paid_chamber_schema_test.py
if ($LASTEXITCODE -ne 0) { throw 'Paid chamber schemas failed.' }
& $schemaPython tests/schema/room_reinforcement_schema_test.py
if ($LASTEXITCODE -ne 0) { throw 'Room reinforcement schemas failed.' }
& $schemaPython tests/schema/room_equalization_schema_test.py
Expand Down Expand Up @@ -137,6 +145,7 @@ jobs:
var/paid-door-pressure-fixture.json
var/room-equalization-fixture.json
var/room-reinforcement-fixture.json
var/paid-chamber-fixture.json
var/horizontal-panel-controls-fixture.json
var/horizontal-floor-support-fixture.json
var/paid-floor-locomotion-fixture.json
Expand Down
133 changes: 133 additions & 0 deletions data/production/catalog.v4.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,133 @@
{
"schema_version": 1,
"materials": [
"ore.iron",
"ice",
"regolith",
"iron",
"tailings",
"water",
"hydrogen",
"oxygen",
"salts",
"silicate",
"nutrient-solution",
"plate"
],
"dispensable": [
"water",
"hydrogen",
"oxygen",
"nutrient-solution"
],
"deposits": {
"deposit.iron": {
"material": "ore.iron",
"mass_milligrams": 10000000
},
"deposit.ice": {
"material": "ice",
"mass_milligrams": 5000000
},
"deposit.regolith": {
"material": "regolith",
"mass_milligrams": 10000000
},
"deposit.iron.outcrop": {
"material": "ore.iron",
"mass_milligrams": 7000000
},
"deposit.iron.reinforcement": {
"material": "ore.iron",
"mass_milligrams": 7000000
},
"deposit.iron.chamber": {
"material": "ore.iron",
"mass_milligrams": 15000000
}
},
"recipes": {
"refine.iron": {
"station": "refinery",
"inputs": {
"ore.iron": 1000000
},
"outputs": {
"iron": 600000,
"tailings": 400000
},
"duration_ticks": 120,
"energy_joules": 1000
},
"refine.ice": {
"station": "refinery",
"inputs": {
"ice": 1000000
},
"outputs": {
"water": 1000000
},
"duration_ticks": 60,
"energy_joules": 500
},
"refine.regolith": {
"station": "refinery",
"inputs": {
"regolith": 1000000
},
"outputs": {
"salts": 200000,
"silicate": 400000,
"tailings": 400000
},
"duration_ticks": 120,
"energy_joules": 1000
},
"chemical.electrolysis": {
"station": "chemical",
"inputs": {
"water": 1000000
},
"outputs": {
"hydrogen": 111000,
"oxygen": 889000
},
"duration_ticks": 180,
"energy_joules": 2000
},
"chemical.nutrients": {
"station": "chemical",
"inputs": {
"water": 900000,
"salts": 100000
},
"outputs": {
"nutrient-solution": 1000000
},
"duration_ticks": 120,
"energy_joules": 500
},
"craft.plate": {
"station": "printer",
"inputs": {
"iron": 1000000
},
"outputs": {
"plate": 1000000
},
"duration_ticks": 120,
"energy_joules": 1000
},
"salvage.plate": {
"station": "recycler",
"inputs": {
"plate": 1000000
},
"outputs": {
"iron": 1000000
},
"duration_ticks": 60,
"energy_joules": 500
}
}
}
47 changes: 47 additions & 0 deletions docs/architecture/production-gameplay-loop.md
Original file line number Diff line number Diff line change
Expand Up @@ -284,3 +284,50 @@ Local UI request IDs include a random runtime-session prefix and a monotonic
sequence. Saved production receipts retain their original IDs for idempotent
retry; creating a runtime to reload a snapshot cannot restart those identities.
The prefix is transport identity only and grants no simulation authority.

The default first-playable factory now selects catalog4 explicitly. Its distinct
15 kg chamber iron seam extends the previous 24 kg ore origin to 39 kg; unchanged
ice/regolith make 54 kg total origin. Catalog1/2/3 saves and explicit old factory
modes receive no seam grant. The complete two-door route prints 21 kg plate,
installs 20.4 kg, fabricates the 2 kg iron crowbar and spends 71,750 J. It leaves
0.6 kg plate, 0.4 kg iron, 15.6 kg tailings and 28,250 J.

`PaidChamber` owns synchronous pair validation and detached transaction planning;
Production owns its 6 kg paid kit and geometry. Access owns both original sealed
manual actuators. PreparedDoorChange validates both device comparisons before
the first write. Pressure owns a 3.6 m3 finite allocation split from habitat_main,
its sensor and two manual valve states. Each simulation tick exchanges inner
then outer with finite habitat_main/exterior_reservoir at conductance1, using
one path when leakage and an open valve coincide. This is logical prototype
pressure service, with no spatial atmosphere or EVA capability claim.

Opening either boundary requires its own valve closed and the opposite boundary
closed, intact and valve closed. Closing retains only its own force/occupancy
guards so an unsafe opposite cannot prevent isolation. Both pressure signs use
the unchanged 1000 N crowbar limit over 1.71 m2. Closed intact kit boundaries
retain up to 110 kPa; seal/actuator damage or overrating leaks even with valves
closed. No extra health field or automatic repair is introduced. Decommissioning
requires both boundaries force-safe and both valves closed; ordinary vacuum
cycling does not supply this precondition. Recovery/refit preserves original
seals, actuator damage and finite gas without refill.

Production15/observation17/paid-door6 and Pressure5/chamber1 persist the explicit
pair, bills, endpoints, geometry and sensor/volume links. Whole-world restore
validates detached Production/Pressure/Access/Inventory candidates before any
owner assignment; half pairs, orphan links and incompatible open states reject.
The collapsed paid-door controls show the pair, three pressures, opposite state,
valves and force load, and enqueue authenticated commands with current revision
and epoch. Rejections retain owner state and expose the host reason. Existing
bounded simulation counters remain available; no per-frame diagnostic tracing
or external service is added. See the
[chamber milestone](../development/paid-chamber-sequential-interlocks-milestone.md)
for pinned geometry, accepted physical corrections and verification scope.

Source selectors derive choices from the current validated observation, rather
than a hard-coded latest catalog. Scheduled mining, single and timed tool work,
completion and machinery metadata use the candidate's pinned catalog. The
server-only `machine_recipe(id, source_state={})` may receive a detached restore
candidate; omitting it uses live state. This prevents restore validation from
consulting the fresh factory's different catalog and does not grant absent ore.
Timed construction, panel controls and panel previews accept observation17 and
continue rejecting unsupported18+. Their old schema paths remain supported.
Loading
Loading