Fleet changelogs · dev.ecs0.net
rdmsm4x-changelog-20260831-1627-tyrell-chat-routing-and-auto-resume

rdmsm4x — Tyrell chat routing, session continuity, and auto-resume on login

2026-08-31, 15:59–16:27 EDT · rdmsm4x · claude@rdmsm4x (session 2539efa1)

Tyrell gained an intelligent chat-routing core, a project CLAUDE.md, a RESUME.md, and an auto-resume-on-login agent. One machine-state change: a new LaunchAgent. No app was deployed, no host was touched, no signature or bundle changed.

Scope

Host: rdmsm4x only. Repo: /Users/richh/dev/apps/tyrell (canonical).

What changed

In the repo — four commits

Commit Contents
c3ea4f5 CLAUDE.md (new, the /init deliverable); session continuity added as README scope item 10, FEATURE_MATRIX row, ISSUES #45
898a3c1 Chat routing core: ChatRouting.swift, ChatTicketChips.swift, ChatTicketIndex.swift (all new), #exec/#unrouted provisioning, GET /api/chat/conversations/*/tickets, /to /all /tickets /escalate, 39 new tests
94a7be7 RESUME.md (new), SESSION-STATE.md checkpoint, ISSUES #46–#48, CHANGELOG
7db2d15 ISSUES #49 — the duplicate-script collision, recorded rather than quietly resolved

The routing rule worth stating: a message that would start work never lands in a room on a guess. Evidence below likely sends a directive to #exec for the admins to dispatch, and an explicit fanout refuses a directive outright — Rich's own reason was that a blanket send would "cause work to start/kick off that is not applicable."

Outside the repo — machine state

Path Change
~/dev/fleet/ops/resume/resume_pinned_on_login.zsh new, executable. Generic: takes the pin slug as $1
~/dev/fleet/ops/resume/PINNED-SESSION-tyrell new. Session id + cwd; re-pin by editing this file only
~/Library/LaunchAgents/com.eastcoastscience.claude-resume-tyrell.plist new, bootstrapped into gui/501

Nothing existing was modified or retired. The three pre-existing per-project resume scripts belong to other live sessions and were left alone.

Commands run (state-changing only)

git add <explicit paths> && git commit          # x4, never -A: shared tree
plutil -lint -s ~/Library/LaunchAgents/com.eastcoastscience.claude-resume-tyrell.plist
launchctl bootstrap gui/501 ~/Library/LaunchAgents/com.eastcoastscience.claude-resume-tyrell.plist
ticket open/claim/link/status/release/resolve   # TASK-20260831-08, FEAT-20260831-03

Verification

Not verified: no live HTTP round trip against a running tyrelld, and no fleet host was queried. Every live-fleet claim in SESSION-STATE.md below the 2026-08-29 heading is carried forward, not re-measured. ISSUES #47 records this.

How to undo

launchctl bootout gui/501/com.eastcoastscience.claude-resume-tyrell
rm ~/Library/LaunchAgents/com.eastcoastscience.claude-resume-tyrell.plist
rm ~/dev/fleet/ops/resume/PINNED-SESSION-tyrell          # stops auto-resume on its own
rm ~/dev/fleet/ops/resume/resume_pinned_on_login.zsh     # only if the peer's script wins
git -C ~/dev/apps/tyrell revert 7db2d15 94a7be7 898a3c1 c3ea4f5

Deleting the pin file alone disables auto-resume without removing anything else — the script logs "no pin file" and exits 0.

Outstanding, for Rich

  1. A duplicate claude --resume Terminal window is open right now. Loading a RunAtLoad LaunchAgent runs it immediately, so installing the agent resumed this session in a second window (peer session tyrell-6b). Two processes on one transcript — close that window. On a real reboot this is the intended behaviour and there is no duplicate.
  2. Two generic resume scripts were written a minute apart by this session and replicantdb-ca (TASK-20260831-12) — already settled between the two agents, no action needed. The peer adopted this session's script, pointed its own launchd agent at it (verified here by reading the plist), and moved its version to ~/dev/fleet/ops/resume/archive/superseded-20260831/ with a README naming the one lost behaviour. ISSUES #49, RESOLVED. Cause: this session did not run ticket claims before starting, which SESSION_CONTINUITY.md §1 requires for exactly this reason. Technique kept from the peer: verify a RunAtLoad agent with a throwaway -DRYRUN twin rather than bootstrapping the real one and opening a window.
  3. The chat routing feature has no UI yet (ISSUES #46) and has never been exercised against a live daemon (#47). Do not deploy on the strength of the test count.
  4. ~/dev/apps/CLAUDE.md §13 is out of date about Tyrell's universal-binary gate (#48). The gate is real, at install time, in scripts/lib/tyrell_app_lifecycle.zsh:249. That is a fleet-baseline file other agents are editing, so it was routed, not edited.
  5. Project mode is still contradictory — README.md says Prototype, AGENTS.md says Production. Unresolved by design; it needs your call.

No secrets are recorded here. The chat pre-shared token lives at ~/.tyrell/token (mode 600) and its value appears in no file, log, or message produced by this session.