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
swift build→Build complete!out=$(swift test); rc=$?→exit=0, 304 tests, 0 failures (188 + 65 + 51). Captured unpiped:swift test | tailwould report tail's exit code.- Mutation-tested in both directions. Forcing the fanout to refuse everything breaks the informational test; removing the refusal breaks the directive test. The directive confidence gate was caught by exactly one test, so a second independent assertion was added.
- Writing a test found a real defect:
"rerun the canary probe"was classified informational becausererunwas not a directive verb. - Chip hue parity asserted on six values against
~/dev/scripts/gen_site.py:31. - Resume agent:
DRY_RUN=1 … tyrellresolved the 2.0M transcript; the failure paths were tested too — missing pin and nonexistent session id each log their own distinct message and exit 0 without opening anything; no argument exits 2. launchctl list | grep claude-resume-tyrell→57626 0 com.eastcoastscience.claude-resume-tyrelllipo -archs /Applications/Tyrell.app/Contents/MacOS/Tyrell→x86_64 arm64
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
- A duplicate
claude --resumeTerminal window is open right now. Loading aRunAtLoadLaunchAgent runs it immediately, so installing the agent resumed this session in a second window (peer sessiontyrell-6b). Two processes on one transcript — close that window. On a real reboot this is the intended behaviour and there is no duplicate. - 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 runticket claimsbefore starting, whichSESSION_CONTINUITY.md§1 requires for exactly this reason. Technique kept from the peer: verify aRunAtLoadagent with a throwaway-DRYRUNtwin rather than bootstrapping the real one and opening a window. - 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. ~/dev/apps/CLAUDE.md§13 is out of date about Tyrell's universal-binary gate (#48). The gate is real, at install time, inscripts/lib/tyrell_app_lifecycle.zsh:249. That is a fleet-baseline file other agents are editing, so it was routed, not edited.- Project mode is still contradictory —
README.mdsays Prototype,AGENTS.mdsays 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.