Conversation
…s, Phase 1) Nathan wants a tree instead of the flat member list now that cross-machine agents are real (hetz-demo/hetz-codex on the fabric-synced bus). `convoy ls --tree`: - LOCAL: a spawn-parentage forest (cos -> supervisor -> worker) from the convoy.spawner / convoy.tier tags on each LOCAL pty session (the same tags #48's crash-ding stamps); cos-tier roots sort first. - REMOTE: bus members with no local session (running elsewhere OR offline) — convoy can't confirm liveness cross-machine yet, so it shows last-bus-activity age LABELED "(heuristic)" so it isn't over-trusted. Ends the old "offline lie" for the hetz agents (now ~active Nm ago). Phase-1 caveats (documented): parentage only as complete as the LOCAL convoy.spawner tags (post-#48 agents on this host — older/remote show flat); remote liveness is a lastActivity heuristic + the host isn't named. Phase 2 (separate, co-designed with smalltalk): host + spawner + live-status in the synced bus record -> named hosts + true cross-machine parentage. Pure agentForest / renderForest / formatActivityAge (tested); ls also gains unknownFlag validation. tsc clean, 170 green. Live-verified against the real network.
|
HOLD (per cos): the spawn-parentage FOREST is the keeper, but the remote/heuristic-liveness half is likely SUPERSEDED by Nathan's real-synced-status redesign (presence record + host field + push-on-change). Not building further on the heuristic path. cos walks when the design locks — decide keep-as-interim vs fold the liveness half into real synced status; the forest stands either way. |
…item 2), replacing the heuristic Completes convoy ls --tree per the JOINT SEAM (convoy item 2): liveness is now the synced status file's MTIME (fresh < --stale-after = alive; frozen = dead — the ding heartbeat stops when the harness dies), and the host comes from a per-agent host file. Reads both DIRECTLY (readAgentPresence stats <root>/<id>/status + reads <root>/<id>/host) — smalltalk doesn't touch st agents; convoy owns the read. LOCAL vs REMOTE is now host == this machine's os.hostname() (replaces #50's pty-session cross-ref); remote shows "alive on <host>" / "DEAD on <host> (status stale Nm ago)". Ships SAFE in any rollout order: both the mtime-liveness AND the host determination gate on the host FILE being present — which co-ships with smalltalk's new ding (30s heartbeat + host write). Absent (pre-rollout, or the current 5min-refresh ding) → falls back to #50's activity heuristic / bus status, so a naive tight T never false-deads a live agent. Auto-upgrades per agent as smalltalk rolls out items 1/3/4. --stale-after <ms> (default 120000 = ~2min death-detection). tsc clean, 173 green (readAgentPresence reads/nulls, shortHost). renderForest gains a label fn (default = status, existing test unchanged). Live-verified: fallback path renders correctly against the real network (no host files yet). Supersedes the #50 heuristic-only remote section.
|
HOLD LIFTED — item 2 is in (0009fb1). This PR is now the COMPLETE feature: the spawn-parentage forest + REAL cross-machine liveness (synced status-file mtime + host file, read directly per the joint seam), replacing the activity-heuristic. Ships SAFE in any rollout order: mtime-liveness + host determination gate on the host FILE's presence (co-ships with smalltalk's new ding), falling back to the activity heuristic until then — so it never false-deads a live agent and auto-upgrades per agent as smalltalk lands items 1/3/4. 173 green, live-verified (fallback). Walk + merge whenever (no rush per your fabric fire); smalltalk's 1/3/4 are separate PRs. |
convoy ls --tree— spawn-parentage tree + a remote section (Phase 1)Nathan wants a tree instead of the flat member list, now that cross-machine agents are real. Phase 1 (convoy-only, per your GO), with the heuristic labeled + caveats documented.
What it shows
convoy.spawner/convoy.tiertags on each local pty session (the same tags crash-ding: page cos + the crashed worker's spawner, not the whole permanent crew (Nathan-flagged) + double-ding fix #48's crash-ding targeting stamps). cos-tier roots sort first.(heuristic)(your requirement — Nathan shouldn't over-trust activity-as-liveness). This ends the old "offline lie": the hetz agents now read~active Nm agoinstead of offline.Phase-1 caveats (documented in code)
convoy.spawnertags — post-crash-ding: page cos + the crashed worker's spawner, not the whole permanent crew (Nathan-flagged) + double-ding fix #48 agents on this host. Older/remote agents show flat until re-materialized.lastActivityheuristic; the host isn't named (I softened the label to "running elsewhere OR offline" since the bucket also holds off/retired agents like vauban and theconvoy-upsender — the age self-corrects).Phase 2 (separate, co-designed with smalltalk — you're briefing them)
host + spawner + live-status carried in the synced bus record → named hosts (
alive-on-hetz) + true cross-machine parentage + accurate remote liveness.--tree --by-hostgrouping can follow if Nathan wants machine-first.Verified
agentForestparentage/roots/cos-first/remote-partition, orphan-spawner→root,renderForestbox-drawing,formatActivityAge).lsalso gainsunknownFlagvalidation (it had none). Live-verified against the real network (screenshot above is real output).