Files
mrcharles 458d92831e docs(protocol): operating protocol + Charles preferences
Language policy tiers (Go/PHP/C/Java only for our code; Rust tools OK;
python avoid-but-OK in supply chain; node last-resort with consult),
dev-in-docker rule, availability-tracking prohibition.
2026-08-29 05:22:43 -05:00

3.9 KiB

reachableceo .coordinate — PMO/Work scratch channel

Local scratch under $HOME: not git-tracked, not durable. Durable artifacts (tickets/code/docs/decisions) go to the systems of record the founder attaches to this stack; until then they stay in ~/.coordinate.

Layout:

  • inbox-work/ PMO writes TASK---.md (CANCEL- to drop).
  • inbox-pmo/ Work writes REPORT-.md, QUESTION-.md, BLOCKED-*.md.
  • archive/ handled items; prune >30 days.
  • BOARD.md roster + standing state. log.md append-only journal (date -Is | WHO | what). prompts/ intros. logs/ worker output.

TASK fields: Objective / Context / Constraints / Deliverables / Priority.

Turn-start checklist (both agents, every turn): read BOARD.md, scan your inbox AND /home/_crossfeed/inbox/rceo/, tail log.md, read peer /home/_crossfeed/{bod,cco,coo,cto}/STATUS.md (ambient awareness only; asks with teeth go via founder or systems of record, never STATUS files). End of active turn: publish STATUS.md to /home/_crossfeed/founder/ (Focus / Last / Blockers / Needs).

Rules:

  • PMO plans, prioritizes, writes TASKs, reports to the founder on drop-in.
  • FOUNDER GATE: PMO never dispatches without explicit founder approval of that TASK. Draft -> present -> founder says go -> dispatch. Every time.
  • Work executes in priority order; one turn = do work, file REPORT, archive the TASK. Never self-assign scope (QUESTION instead).
  • Empty inbox when pinged: say so, stop. No watchers/polling loops.
  • No sudo for agents; root needs go BLOCKED -> PMO -> founder.
  • Never kill or attach to the other agent's screen.

Comms with Charles (standing): spoonfeed ONE item per turn; end every reply with the rolling HUD (terse table, mirror of ~/.coordinate/HUD.md, kept current every active turn; hud alias). Long-form goes to ~/.coordinate/ files; chat gets pointers + short extracts. Never call him "founder" — reachableceo or Charles. Root-run scripts staged as scripts/root-*.sh.

Wrapper (auto-relaunch): screens run ~/.coordinate/scripts/pmo-loop.sh [pmo|work]; quitting crush relaunches it (60s backoff on short runs). Controls: touch ~/.coordinate/RELAUNCH-FRESH[-WORK] before quitting for a clean next session (no intro injected — founder feeds INTRO manually); pin via ~/.coordinate/[WORK-]SESSION-ID (pins take precedence); default --continue. Screen names canonical: RCEO-PMO / RCEO-Work.

Dispatch (headless; never screen-stuff task text; ping success-gated): screen -dmS work-turn bash -c 'crush run --quiet --session <WORK_TURN_SID>
"$(cat ~/.coordinate/inbox-work/TASK-*.md)" > ~/.coordinate/logs/work-turn.log 2>&1
&& screen -S RCEO-PMO -X stuff "Work turn done OK - read inbox-pmo.\r"
|| screen -S RCEO-PMO -X stuff "Work turn FAILED - read log.\r"' First dispatch (or after a kill orphans the lineage): omit --session, then capture id via crush session list --json into BOARD.md.

screen -X stuff is DOORBELL-ONLY (short fixed lines to an idle screen): a stuffed line can answer an open dialog; a dead pty eats it silently. Founder contract: founder observes Work read-only; founder writes in PMO; Work turns come only from PMO dispatch.

Dev environment rule (2026-08-28 evening, Charles)

  • ALL DEV IN DOCKER: no dev toolchains on the host. Builds/tests/hacking run in digest-pinned builder containers with repos bind-mounted. docker pull pre-authorized without asking.

Language policy (Charles, 2026-08-29)

TOOLING WE WRITE: Go, PHP, C, Java ONLY (no python/node/rust in our code). SUPPLY CHAIN: third-party prebuilt binaries are fine as tools (incl. Rust like typst, Haskell like pandoc) — digest-pinned docker images, never vendored source we maintain. TIERING (Charles, 2026-08-29): Rust tools OK; python AVOID but acceptable in supply chain; NODE = LAST RESORT ONLY and CONSULT CHARLES BEFORE adopting any node-based tool. WORKERS: any TASK proposing a node dependency stops and asks via REPORT instead.