Operator caught me re-investigating a feature we already shipped today. Root
cause was a self-contradicting knowledge base, not just my compaction: the
§Modes entry still said "Remote relay -- KNOWN BROKEN: the LAUNCH button can
never enable in this mode", while §Mode-specific traps 60 lines later documented
the same thing as FIXED. Reading the summary line first is exactly what a
future session does. Swept: that was the only stale copy.
Now recorded once, authoritatively (context/operator-console.md §Parked relay +
remote console, and a sysop recipe in docs/OPERATOR_GUIDE.md):
* THE PRODUCTION TOPOLOGY the operator actually wants: the relay parked
permanently on the home machine so no player ever edits join.bat, with the
console dialling in from anywhere (cell internet is fine -- outbound only).
* The exact standalone park command, and why the control port is what makes a
GUI-less relay usable at all (backgrounded, it has no stdin).
* The COMPLETE remote command set as a table, read out of _ctl_command /
_ctl_get_mission / _ctl_set_mission: launch, stop, rearm|newround, get,
set (the six CONTROL_SET_KEYS, written to the relay's OWN egg, effective
next round), ping, plus the log stream and the roster re-issued at AUTH.
Written down so the next session reads instead of re-deriving.
* The hard limits: remote mode ATTACHES -- it cannot start or restart the
relay, cannot resize the roster, cannot edit callsign/mech/colour.
* Multiple operators ARE accepted concurrently (ctl_conns is a list, each
AUTHing independently), so hand-off is seamless -- but nothing arbitrates
two people pressing LAUNCH.
Two live hazards found while verifying, both new:
1. THE SECRET'S CWD TRAP. control_secret() opens a bare relative
"operator_secret.txt" and SILENTLY GENERATES A NEW ONE if absent, so the
live secret depends on the relay's working directory. This repo really has
TWO secret files with DIFFERENT values (repo root and content\) -- a remote
operator holding the wrong one fails AUTH as a CONTROL_AUTH_TIMEOUT drop,
with no "wrong password" anywhere. Documented in both files.
2. operator_secret.txt was untracked but NOT ignored -- one `git add -A` from
publishing a live credential. Now in .gitignore.
Also corrected a nearby overreach: "the console must STAY CONNECTED" is about
the console channel to the PODS; an operator GUI dropping off a parked relay's
control port is harmless and the pods never notice.
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
39 lines
672 B
Plaintext
39 lines
672 B
Plaintext
# build output
|
|
/build/
|
|
/build-pod/
|
|
/build-steam/
|
|
*.obj
|
|
*.pdb
|
|
*.ilk
|
|
*.exp
|
|
*.idb
|
|
|
|
# logs / debugger dumps
|
|
*.log
|
|
cdb_*.txt
|
|
|
|
# editor / OS
|
|
.vs/
|
|
*.user
|
|
Thumbs.db
|
|
__pycache__/
|
|
dist/
|
|
|
|
# glass-cockpit dev layer: per-developer / per-machine runtime files
|
|
content/bindings.txt
|
|
content/environ.ini
|
|
content/frontend.egg
|
|
content/steam_appid.txt
|
|
content/fe_last.ini
|
|
# local root copies of the player bats (players/ is the source of truth)
|
|
/play_solo.bat
|
|
/joyconfig.bat
|
|
/join.bat
|
|
/join_lan.bat
|
|
/play_steam.bat
|
|
# MP match forensic logs (matchlog.cpp) -- runtime artifacts
|
|
matchlog_*.txt
|
|
|
|
# Operator control-channel secret -- NEVER commit (plaintext shared credential)
|
|
operator_secret.txt
|