New atlas_standalone scene/script: attach-or-spawn boot (one REAL
connect_to_sim attempt at SR_PORT-or-9876 — a separate throwaway TCP
probe was proven by live run to kill a pre-accept-loop server via
broken handshake pipe; never abandon a connected socket), else spawn
--port 0 via new ServerProcess.start_with_pipe + LISTENING:{port}
stdout parse, retry against the resolved port. Reader role wired end
to end: protocol.encode_startup_message optional role param (empty
omits the wire key — byte-identical for all existing callers),
sim_bridge.connection_role suppresses the post-handshake
RequestAllSettings auto-send, hud_groups skips AutoPause/AutoResume
sends for readers (all three would otherwise burn Reader violation
strikes per the T-1130 matrix — endorsed by Oscar).
Generic implant host per D-254 SS3: the shell instantiates ALL
registered implant apps; implant_app_manifest gains
available_in_companion (opt-out, default true) and
implant_registry.instantiate_all a standalone filter param (default
preserves hud.gd behavior byte-identically). Boot order is
instantiate_all THEN open_app (reverse renders a permanently black
window — app_changed fires with no listener; matches hud.gd's order).
Owned-server lifecycle: _exit_tree stops a spawned child, attached
servers survive companion close. Known engine limitation documented:
raw SIGTERM bypasses all Godot notifications and orphans a spawned
server; WM close paths verified clean.
Live-verified: spawn-mode (301 systems rendered from systems.db over
the wire), attach-mode, two simultaneous readers, clean shutdown with
zero orphan processes. 14 new gdUnit tests (port/LISTENING parsing).
Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
21 lines
846 B
Plaintext
21 lines
846 B
Plaintext
[gd_scene load_steps=2 format=3 uid="uid://atlas_standalone_sr"]
|
|
|
|
[ext_resource type="Script" path="res://scripts/atlas_standalone.gd" id="1_standalone"]
|
|
|
|
; D-254: standalone Atlas companion app entry scene (`make atlas`). Bare Control
|
|
; root, full-rect anchored exactly like hud.gd's AppsContainer (ui/hud.tscn) —
|
|
; ImplantRegistry.instantiate_all(self) parents every hosted app directly under
|
|
; this node, so it needs the same full-viewport layout a normal implant app
|
|
; expects from its parent. No gameplay layer, no HUD status panel, no camera —
|
|
; the boot sequence (atlas_standalone.gd) is the entire content of this scene.
|
|
|
|
[node name="AtlasStandalone" type="Control"]
|
|
layout_mode = 3
|
|
anchors_preset = 15
|
|
anchor_right = 1.0
|
|
anchor_bottom = 1.0
|
|
grow_horizontal = 2
|
|
grow_vertical = 2
|
|
mouse_filter = 0
|
|
script = ExtResource("1_standalone")
|