- bin/muse_choice_watcher.py + systemd/muse-choices-reconcile.*: automatic choice answering and timer reconciliation - bin/digest.py: fleet log and health summarization - docs/BOX-*-HTTPS.md: comprehensive HTTPS execution contracts and API documentation - docs/MUSE-CHOICES-POLICY.md & docs/SUPERVISION-SPEC.md: autonomous execution specs - tests/test_*.py: unit test suites for HTTPS API, choice watcher, fleet heal, and swarm pruning
5.0 KiB
Box Md Drive Files over HTTPS (No SSH)
Box is the main surface. All operator work goes through Box (box.muse-dev.online). The web UI,
boxCLI, and agents share the same API endpoints. No UI-only powers.
Date: 2026-10-06
Status: implemented on bl (exec-constrained.py + box-relay.sh;
box-ctl.py verbs pre-existed, plus traversal hardening, output caps,
--stdin content plumbing, and hyphenated amend/append/pull aliases)
Scope: md reads (audit/list/read/diff) + governed writes
(amend/append/pull/inject-drive/sync-all). Raw container writes
(md-write) stay SSH-only by design.
1. Why
Agents shaping fleet behavior could see drive scores but needed SSH to
read an agent's SOUL.md, diff it against the canonical template, or
push updated operator files. All of this now rides the agent HTTPS path
(https://exec.muse-dev.online/exec, signature or Bearer [REDACTED], named-op
allowlist, audit log).
2. New ops
Reads (all side_effecting: false, all in DEFAULT_PERMS):
| Op | Args | Backend |
|---|---|---|
md.audit |
{accounts?} (default all) |
box-ctl.py md-audit [accounts...] |
md.list |
{account!, path?} |
box-ctl.py md-list (capped, see §4) |
md.read |
{account!, filename!} |
box-ctl.py md-read (capped, see §4) |
md.diff |
{account!, filename!} (shared template only) |
box-ctl.py md-diff (capped, see §4) |
Governed writes (all known-identities-only, none in the read-only subset):
| Op | Args | Backend |
|---|---|---|
md.pull |
{account!, filename!} (shared template only) |
box-ctl.py md-pull |
md.inject_drive |
{account!} |
box-ctl.py md-inject-drive |
md.sync_all |
{} |
box-ctl.py md-sync-all |
md.amend |
{filename!, content!, author?, reason?} |
box-ctl.py md-amend --stdin (content on stdin) |
md.append |
{filename!, text!, author?, section?} |
box-ctl.py md-append --stdin (text on stdin) |
New box-relay.sh client commands:
box md audit [accounts...]
box md list <account> [path]
box md read <account> <filename>
box md diff <account> <filename>
box md pull <account> <filename>
box md inject-drive <account>
box md sync-all
box md amend <filename> (--content <text>|--file <path>) [--author <name>] [--reason <why>]
box md append <filename> (--content <text>|--file <path>) [--author <name>] [--section <header>]
Raw op calls (signature auth, no token):
exec-sign.sh md.audit '{"accounts": ["646", "opm"]}'
exec-sign.sh md.read '{"account": "646", "filename": "SOUL.md"}'
exec-sign.sh md.diff '{"account": "pip", "filename": "HEARTBEAT.md"}'
exec-sign.sh md.append '{"filename": "AGENTS.md", "text": "lesson ...", "author": "646"}'
3. What the governed writes do
md.amendrewrites ashared/operators/template after the drive-safety checks (HEARTBEAT checklist not gutted, PROACTIVE_PREFERENCES not blanked, SOUL not reverted to stock), then git-commits it. Full-file content rides stdin (up to 256KB).md.appendappends a timestamped, attributed note (optional section) via the same validated + committed path (up to 64KB).md.pull/md.inject_drive/md.sync_allpush canonical templates out to containers; no agent-supplied content crosses. Injection always overwrites (AGENTS.md preserves remote## Lessons).
4. Safety notes (same posture as existing ops)
- Traversal hardening (single-copy in
agent_md.py). Account, filename, and list-path validation now lives inagent_md.py(MDValidationError, raised before any gateway call or write);box-ctl.pymaps it toBAD_NAME, and exec ops + quality-validate mirror the same shapes. Previouslymd-read 646 ../xreached the gateway andmd amend ../../xcould escapeshared/operators/. Template flows (diff/amend/append/pull) additionally require one of the 8 known template names. - Fixed argv, validated values. Unknown arg keys rejected; author / reason / section are control-char-free with length caps; amend content must be non-empty.
- Caps with
truncatedflags. Reads cap at 64KB, diffs at 64KB, listings at 200 entries — same convention as git/tests verbs. - No raw
md-writeop. Arbitrary content-to-container stays SSH-only; remote writes go through the validated template flows. - Timeouts. Audit 300s, sync-all 600s, single-file ops 120s.
- Audited. Every execution records identity + op;
box-ctl.pyadditionally audits each verb with its target. - Retry-safe reads.
md-audit/md-list/md-read/md-diffjoinedIDEMPOTENT_ACTIONS; all ten md verbs havequality-validatedry-run branches.
5. Rollout notes
- Restart
exec-constrained.pyafter deploy for the 9 new ops to appear inGET /ops(repo total becomes 79). box-relay.shis served from bl (GET /box); agents re-fetch to get themdgroup.- Non-goals: deletes,
main-loopenable/disable, policy writes, swarm kill/prune — future expansions, same pattern. (Approvals shipped separately; see BOX-APPROVALS-HTTPS.md.)