Replies: 4 comments 7 replies
|
Field answers to the six open questions, from one deployment: a team of 5–6 seats over two machines (a headless Linux box running four resident Codex workers under systemd + a Claude Code leader in herdr panes; a Windows box with Codex Desktop as a second leader). agmsg v1.3.0, running with a local patch set we just filed as #1294–#1299. 1. Auto-selected delivery mode. Pane detection alone would guess wrong for us. On the same host we have three kinds of seats at once: herdr panes (pane-addressable), pane-less Codex Desktop, and resident Codex workers that are idle most of the time and only wake on a message — no hook fires for them until something is delivered. Please include idle residents as notification targets, and expose which route was chosen and why (one line) so a wrong guess is diagnosable rather than silent. 2. Noticed is not read. Yes, and we already operate that way: a seat treats read/ACK as "the transport worked", never as "the work was accepted"; acceptance is checked against the artifact. One caveat: we have not audited every monitor/script we own for an implicit "displayed ⇒ read" assumption, so "zero migration impact" is not something we can confirm — a short migration note listing what changes for 3. One identity per (team, name). Yes. We found no case where same-name-on-different-tools is intentionally kept separate. The condition that matters is on reconnect: ownership must not fall back to the older session record (#1299). 4. Search. by sender, recipient, team, date, words — plus exact 5. Remote peek/poke. Before enabling on one of our machines: per-team opt-in, permission split by operation and by sender (peek = view right, poke = input right, granted separately), an allow/deny audit log, and re-resolution + expiry of the target session at execution time (a stale placement must fail closed, not poke whoever now sits in that pane). 6. Daemonless fallback. For normal resident operation we need the daemon. What we would still want daemonless is recovery: when the daemon is down or misbehaving, the same One addition not covered above: please state in the API/CLI docs what a receipt guarantees — persisted, notified, fetched — and that it says nothing about business-level acknowledgement/completion/acceptance. We do not want agmsg to implement task state; we want the boundary written down so agents stop inferring "done" from "read". Happy to test a pre-release of the daemon on the Windows seat first — it is the one where the current bridge is weakest for us. |
|
Thanks for publishing this before implementing it — the shape questions are the Context for what follows: I run agmsg daily on a single Linux host that is the I am answering 1, 2, 3, 5 and 6. I am not answering 4 (search), because I 1. Auto-selected delivery mode — yes, there is a setup where the guess goes wrongThere is a third layout layer, and it is neither tmux nor herdr nor "no pane The RFC's premise is that "a pane knows which agent occupies it, the same way So this is what
The reason this matters for the daemon specifically is that the failure is not Concretely, the request:
I am not asking for an orca driver in this RFC — that is a separate piece of 2. "Noticed" is not "read" — no habit to break here, and the split fixes a real conflationNo: nothing I run treats "the watcher displayed it" as "read". We fetch More usefully, here is what my team store looks like as of 2026-09-18: over I am giving round numbers on purpose, and especially for the unread count, What is stable is the distribution, and it is almost perfectly binary:
The schema explains why. The That is precisely what your One caveat on the other side, in case it affects how much you trust 3. One identity per (team, name) — No, but
|
|
Field data from a larger-than-usual single-host deployment, in case the process-count argument in "Why now" is useful to have a number attached to. Setup. One macOS host (Apple silicon), agmsg 1.3.1, 20 teams registered locally. Every team is one Claude Code seat + one Codex seat, each in its own tmux pane, all on monitor delivery. No remote sync (zero sync engines running). Codex seats are started by our own launcher script rather than the shipped wrapper. Everything below was measured today, not remembered. The process herd, countedThe RFC says "roughly 15 agmsg background processes on a busy machine". Counting only processes whose command line is under the agmsg install dir or our own agmsg launchers:
So the herd scales with teams, and the interesting part is not the size — it is the age. Shipping a fix does not retire the processes it fixed
This is the same shape as the two sync engines you found while writing the note (#1103), on the bridge axis instead. It is an argument for two properties of the daemon beyond "fewer processes":
Q2 — "displayed ⇒ read" habits: we have one, and it is written down as a ruleWe do not have scripts assuming it, but we have a procedure that exists only because of it: our rooms are explicitly told never to run Under receipts that rule stops being necessary — which is a real simplification, not just a semantic change. If the migration note lists "what stops being true" as well as "what changes", that line is the kind of thing that can be deleted with confidence. Q1 — auto-selection should be right for us, with one caveatAll 20 teams are tmux panes, so pane-addressable detection should pick correctly for both seat types. The caveat is ownership rather than detection: our Codex seats are not started by the shipped wrapper, so anything that infers the route from "how the process was launched" rather than from "where it is now" would guess wrong for us. Resolving placement per delivery (as the RFC says) is what makes this safe — worth keeping explicit. Seconding the request that the chosen route and the reason be reported in one line. Today a wrong guess is silent, and silence and "no traffic" look identical. Q6 — we would take the daemon; the fallback is not load-bearing for usGiven 74 processes and 42 of them outliving the installed version, supervision is the feature. We would not run the daemon-less shape by choice. Keeping bash+sqlite send/receive for hosts that cannot run Node still seems right, but we would not ask you to hold back the daemon-required design on our account. Not answering 4 (search) — we have no measurement of what we actually look for, so any operator list would be invented. |
|
Field notes from a Windows deployment, in case a third OS is useful for the shape questions. Facts below were measured on our host; where I am inferring, I say so. Issue numbers refer to the ones already on the tracker. Setup. One Windows 11 host. Pane manager is herdr 0.9.0. agmsg is Overall direction: yes. "Registration carries a pid, the daemon checks liveness, delivery is a typed line into the pane, despawn is executed mechanically" matches what our launcher ended up building around agmsg from the outside. Four things from our measurements that I would want the daemon to get right from day one, then the six questions. A. Process identity on Windows: a bare pid is not a liveness token; record which namespace minted it, or use (native pid, start time)The one delivery outage we hit on 1.3.0 was #458 / #415 in a new shape: the Codex bridge launcher writes Why this matters for agmsgd: "each registration carries a process id, the daemon checks the process is alive before delivering, and dead entries are collected" is exactly the mechanism that failed. This is an inference, not a measurement of agmsgd: if the registration is written by a bash hook under MSYS and the liveness check runs in the Node daemon, the same mismatch reappears. Two concrete asks: (1) a registration should carry a liveness token that is unambiguous across namespaces — on Windows that is the native pid plus B. A registration needs a binding generation, not just a pane idherdr reuses pane ids, and C. Typing into the pane: define "accepted", and expect composer statesWe drive seats by typing into panes today, so this is the part I can speak to most concretely. Measured on Claude Code's composer under herdr: the prompt glyph differs between states ( D. Claude Code's own channel is bounded; say who re-arms itMeasured on Claude Code 2.1.27x: a Monitor watch expires at 5 minutes by default and at most 30 minutes with an explicit timeout; The six questions
Happy to re-run any of the above on the Windows host against a branch. |
Uh oh!
There was an error while loading. Please reload this page.
Uh oh!
There was an error while loading. Please reload this page.
agmsg's automatic delivery currently costs one background process per receiving session, plus one per team that syncs with other machines, plus a small stack per Codex session. We want to replace all of them with a single resident daemon — and because that changes monitor mode substantially, we are publishing the design before implementing it rather than after.
The design: docs/design/agmsgd-rfc.md (日本語版)
It is an RFC, not a decision — settled decisions land as ADRs as usual. Nothing here is built yet, which is the point: the shape can still change cheaply. It assumes the terminal driver released in 1.3.0 — specifically the identity it put at the terminal layer, where a pane knows which agent occupies it, the same way under tmux and under herdr. That is what a delivery daemon needs, because delivery means resolving an addressee to a place. (
peek,pokeandarrangeare conveniences on the same naming; the daemon is not one of their callers.)What it proposes
despawnexecuted by the daemon, mechanically, with an explicit authorization model required before anything beyond it ships.Where your experience would change the design
The RFC ends with six questions. The ones most likely to depend on how you run agmsg:
from:,after:,subject:) cover it?A one-line answer is genuinely useful — "yes, I do X" tells us more about whether a default is safe than silence does. Disagreement about the whole direction is welcome too; that is far easier to act on now than after it ships.
All reactions