opencode-thrum-pro 0.1.9 → 0.1.11
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/assets/commands/thrum-sleep-extended.md +1 -1
- package/assets/commands/thrum-sleep.md +1 -1
- package/assets/skills/choosing-subagent-models/SKILL.md +1 -1
- package/assets/skills/configure-roles/SKILL.md +1 -1
- package/assets/skills/coordinator-assessing-agent-completion/SKILL.md +1 -1
- package/assets/skills/coordinator-context-monitoring/SKILL.md +8 -6
- package/assets/skills/coordinator-dispatching-work/SKILL.md +2 -1
- package/assets/skills/coordinator-managing-state-and-lifecycle/SKILL.md +1 -1
- package/assets/skills/coordinator-merging-code/SKILL.md +1 -1
- package/assets/skills/coordinator-rolling-out-to-nodes/SKILL.md +4 -0
- package/assets/skills/coordinator-running-brainstorm-cycles/SKILL.md +1 -1
- package/assets/skills/project-setup/SKILL.md +3 -3
- package/assets/skills/project-setup/resources/implementation-agent.md +3 -4
- package/assets/skills/thrum/SKILL.md +6 -5
- package/assets/skills/thrum/resources/ANTI_PATTERNS.md +6 -10
- package/assets/skills/thrum/resources/CLI_REFERENCE.md +24 -26
- package/assets/skills/thrum/resources/LISTENER_PATTERN.md +4 -0
- package/assets/skills/thrum/resources/TMUX_SESSIONS.md +2 -1
- package/package.json +1 -1
|
@@ -155,7 +155,7 @@ relocation, or teardown error) is signaled by the RPC returning an explicit
|
|
|
155
155
|
error message BEFORE the pane dies — that is the only failure signal
|
|
156
156
|
observable from inside this pane. If independent confirmation is needed, it
|
|
157
157
|
must come from a DIFFERENT caller (this pane will be gone) checking
|
|
158
|
-
`thrum
|
|
158
|
+
`thrum team` afterward.
|
|
159
159
|
|
|
160
160
|
**Do not fall back to a raw `tmux kill-session`.** A raw kill bypasses
|
|
161
161
|
`agent.sleep`'s relocate-before-kill ordering and daemon bookkeeping
|
|
@@ -156,7 +156,7 @@ relocation, or teardown error) is signaled by the RPC returning an explicit
|
|
|
156
156
|
error message BEFORE the pane dies — that is the only failure signal
|
|
157
157
|
observable from inside this pane. If independent confirmation is needed, it
|
|
158
158
|
must come from a DIFFERENT caller (this pane will be gone) checking
|
|
159
|
-
`thrum
|
|
159
|
+
`thrum team` afterward.
|
|
160
160
|
|
|
161
161
|
**Do not fall back to a raw `tmux kill-session`.** A raw kill bypasses
|
|
162
162
|
`agent.sleep`'s relocate-before-kill ordering and daemon bookkeeping
|
|
@@ -127,7 +127,7 @@ An agent definition can also carry a default (Claude example — resolve to
|
|
|
127
127
|
your own runtime's `mechanical`-tier value if you are not Claude):
|
|
128
128
|
|
|
129
129
|
```yaml
|
|
130
|
-
# claude-plugin/agents/message-listener.md
|
|
130
|
+
# claude-plugin/agents/message-listener.md (non-tmux fallback only)
|
|
131
131
|
name: message-listener
|
|
132
132
|
model: sonnet
|
|
133
133
|
effort: low
|
|
@@ -45,7 +45,7 @@ Run these commands and collect the output (suppress errors):
|
|
|
45
45
|
thrum runtime list 2>/dev/null # Installed runtimes
|
|
46
46
|
git worktree list 2>/dev/null # Worktrees and branches
|
|
47
47
|
bd stats 2>/dev/null # Beads task tracker state
|
|
48
|
-
thrum
|
|
48
|
+
thrum team --all --include-inactive --compact 2>/dev/null # Fleet roster, including offline, stale and retired agents
|
|
49
49
|
ls .claude/skills/ 2>/dev/null # Installed Claude skills
|
|
50
50
|
thrum config show 2>/dev/null # Thrum configuration
|
|
51
51
|
```
|
|
@@ -52,7 +52,7 @@ orphaned (reap).
|
|
|
52
52
|
| How long has it been quiet? | transcript mtime — **weak, see below** |
|
|
53
53
|
| What is it waiting for? | its own last message, read as prose |
|
|
54
54
|
|
|
55
|
-
**Do NOT use `thrum team`, `
|
|
55
|
+
**Do NOT use `thrum team`, `phase`, or `last_seen_at` for any
|
|
56
56
|
of this.** They are stale, and they fail toward
|
|
57
57
|
reporting a live agent as absent.
|
|
58
58
|
|
|
@@ -377,12 +377,13 @@ apply the coordinator-equivalent 75% floor above while working). The >85%
|
|
|
377
377
|
bracket still fires regardless. These are EXPLICIT DECLARED states, not a
|
|
378
378
|
heuristic guess at coordination intent — a consultant/on-call/done-planning
|
|
379
379
|
researcher must set one of these prefixes ITSELF via
|
|
380
|
-
`thrum
|
|
380
|
+
`thrum session set-intent "warm-hold: <reason>"` (or `on-call:`/`parked:`).
|
|
381
381
|
|
|
382
|
-
**A coordinator CANNOT set another agent's intent.** `thrum
|
|
382
|
+
**A coordinator CANNOT set another agent's intent.** `thrum session set-intent`
|
|
383
383
|
takes TEXT only — it sets the intent for the CURRENT SESSION and accepts no
|
|
384
384
|
agent argument and no `--to`. To get an intent onto another agent, message that
|
|
385
|
-
agent and have it set its own; then verify
|
|
385
|
+
agent and have it set its own; then verify in the focused fleet view with
|
|
386
|
+
`thrum team @AGENT --offline --include-inactive --json`
|
|
386
387
|
rather than by counting acks.
|
|
387
388
|
|
|
388
389
|
**Background-child-aware busy detection:** an agent with an OPEN in-progress bead, a recent JSONL tool_use
|
|
@@ -608,8 +609,9 @@ coordinator manually invoking the skill, run these guards BEFORE firing a
|
|
|
608
609
|
restart:
|
|
609
610
|
|
|
610
611
|
1. **Verify the daemon is reachable**:
|
|
611
|
-
`thrum
|
|
612
|
-
|
|
612
|
+
Run `thrum daemon status`; on error, skip the sweep and surface to operator.
|
|
613
|
+
Inspect the local online roster with `thrum team --json` (`.team.members`);
|
|
614
|
+
use `--offline --include-inactive` for offline, stale and retired rows.
|
|
613
615
|
2. **Confirm the monitor is alive**: `thrum monitor list` should show
|
|
614
616
|
`context-monitoring` in `running` status with a non-empty `SCHEDULE` column.
|
|
615
617
|
If absent or dead, the scheduled ALERTs aren't firing and the skill must be
|
|
@@ -654,7 +656,7 @@ When a restart fires (Step 4 or 5 — tmux-send nudge or snapshot-gated restart)
|
|
|
654
656
|
1. Surface a brief status note to the coordinator: "Restarted @\<agent_name\>
|
|
655
657
|
at \<ctx\>% — snapshot at
|
|
656
658
|
`.thrum/agents/<agent>/sessions/<timestamp>-restart.md`".
|
|
657
|
-
2. Wait for the agent to come back online (`thrum team` shows them
|
|
659
|
+
2. Wait for the agent to come back online (`thrum team @AGENT --offline --include-inactive` shows them online again,
|
|
658
660
|
or their pane shows the runtime prompt).
|
|
659
661
|
3. Re-send their current dispatch with the full scope + plan refs + AC targets —
|
|
660
662
|
treat them as a fresh implementer who needs the full briefing again.
|
|
@@ -41,7 +41,8 @@ identity drift, broken nudges, and silent message loss.
|
|
|
41
41
|
worktree shows a registered agent, communicate with it via
|
|
42
42
|
`thrum send --to @<agent_name> --body-file msg.md` instead. Sub-agents are for
|
|
43
43
|
research/explore, code review, and message listeners running in the main repo —
|
|
44
|
-
|
|
44
|
+
use message listeners only when tmux pane delivery is unavailable, and never
|
|
45
|
+
for implementation work in another agent's worktree.
|
|
45
46
|
|
|
46
47
|
## Dispatch via `thrum send` after launch — not via tmux send-keys
|
|
47
48
|
|
|
@@ -135,7 +135,7 @@ thrum agent delete <agent> # SEPARATE reap, after the worktree is gone
|
|
|
135
135
|
```
|
|
136
136
|
|
|
137
137
|
`worktree teardown` does NOT delete the agent: it is preparation for deleting
|
|
138
|
-
one. The row stays `retired` (hidden from default
|
|
138
|
+
one. The row stays `retired` (hidden from the default team roster /
|
|
139
139
|
overview / UI; visible with `--include-inactive` / `--phase retired`) until
|
|
140
140
|
`thrum agent delete` or the sweeper reaps it. `agent delete` refuses an agent
|
|
141
141
|
whose linked worktree still exists or whose process (pid/tmux) is live, and
|
|
@@ -323,7 +323,7 @@ covered in the runner's preamble; the agent/session half needs the same check.
|
|
|
323
323
|
thrum tmux status | grep -E '^\s*g[0-9]+' # gate sessions, agentless ones included
|
|
324
324
|
```
|
|
325
325
|
|
|
326
|
-
🔴 **`thrum team`
|
|
326
|
+
🔴 **`thrum team` CANNOT SEE an agentless session.** Five of
|
|
327
327
|
those nine had no registered agent, so a registry-based enumeration returns a
|
|
328
328
|
confident answer that omits most of the population. **Enumerate sessions, not
|
|
329
329
|
agents.**
|
|
@@ -61,6 +61,10 @@ Build once per artifact on its `artifact.build_host` via `artifact.build_command
|
|
|
61
61
|
|
|
62
62
|
## 5. The staged order — canary, waves, prepare-and-hold, promotion gate
|
|
63
63
|
|
|
64
|
+
> 🔴 **If any node fails during the rollout — canary or any wave — STOP THE ROLLOUT.** Do not roll, restart, or recommend
|
|
65
|
+
> restarting any further node (including the build host / primary) until the failure is root-caused and fixed or the
|
|
66
|
+
> owner explicitly decides to continue. A node that went down and was recovered by hand is a FAILURE, not a green.
|
|
67
|
+
|
|
64
68
|
- **Canary first, alone.** One node (adapter `topology.canary`) rolls first. Its health must be observed green before any wave proceeds.
|
|
65
69
|
- **Waves with coordinated dependency/order/rollback.** Subsequent waves follow `topology.waves`. When related daemons share ordering (e.g., connected-repo daemons that must restart together), respect the adapter-defined dependency and restart order; a failure in one dependent daemon triggers coordinated rollback per adapter `rollback` / `backup.restore_command`.
|
|
66
70
|
- **Prepare-and-hold + release BY NAME.** If the mechanism supports it, prepare all nodes in a wave (acquire + verify artifact, take BEFORE snapshot, but do not restart) then release by explicit node name, not by broadcast.
|
|
@@ -198,7 +198,7 @@ For each `*-brainstorm` worktree that looks relevant, inspect:
|
|
|
198
198
|
| Idle + domain-relevant researcher found | **REUSE** — send the Phase 2 briefing to the existing agent in its current worktree. Skip the rest of Phase 1. |
|
|
199
199
|
| No idle relevant researcher | Fall through → proceed with "Pick the base branch" below. |
|
|
200
200
|
|
|
201
|
-
When reusing, have the agent itself run `thrum
|
|
201
|
+
When reusing, have the agent itself run `thrum session set-intent "<new one-line
|
|
202
202
|
topic>"` so `thrum team` output stays accurate (there is no command to set
|
|
203
203
|
ANOTHER agent's intent — `set-intent` acts on the caller), then send the Phase 2
|
|
204
204
|
briefing as normal. The existing
|
|
@@ -716,8 +716,8 @@ thrum daemon status
|
|
|
716
716
|
cat .thrum/redirect
|
|
717
717
|
cat .beads/redirect
|
|
718
718
|
|
|
719
|
-
#
|
|
720
|
-
thrum
|
|
719
|
+
# Verify this agent across the fleet, including offline, stale and retired rows
|
|
720
|
+
thrum team @AGENT --offline --include-inactive
|
|
721
721
|
```
|
|
722
722
|
|
|
723
723
|
### Step 5: Update CLAUDE.md
|
|
@@ -823,7 +823,7 @@ worktree-related values come from the Phase 3 assignments:
|
|
|
823
823
|
| `{{AGENT_NAME}}` | **From Phase 3 agent registration** |
|
|
824
824
|
| `{{PLAN_FILE}}` | **Absolute path** to the plan file (primary input) |
|
|
825
825
|
| `{{ANTI_PATTERNS}}` | Generated in Step 1.5; refer to the `project-philosophy` skill for the anti-pattern format spec. |
|
|
826
|
-
| `{{SUPERVISOR_NAME}}` | From `thrum team` — first agent with role=orchestrator; if none, first with role=coordinator; if none, ask user |
|
|
826
|
+
| `{{SUPERVISOR_NAME}}` | From the local online roster (`thrum team`) — first agent with role=orchestrator; if none, first with role=coordinator; if none, ask user |
|
|
827
827
|
| `{{CROSS_EPIC_DEPS}}` | From Phase 2 cross-epic dependency map. If no cross-epic deps, replace with "No cross-epic dependencies." |
|
|
828
828
|
|
|
829
829
|
**IMPORTANT — Absolute paths for gitignored files:** `{{DESIGN_DOC}}`,
|
|
@@ -151,9 +151,8 @@ names. Always send to agent names (e.g., `--to @coord_main`), not role names
|
|
|
151
151
|
(e.g., `--to @coordinator`). Sending to a role fans out to ALL agents with that
|
|
152
152
|
role.
|
|
153
153
|
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
NO_MESSAGES_TIMEOUT).
|
|
154
|
+
Messages arrive in your pane. Check `thrum inbox --unread` at natural
|
|
155
|
+
breakpoints. Never spawn a background listener.
|
|
157
156
|
|
|
158
157
|
When your work is complete (Phase 4), send a completion message prefixed with
|
|
159
158
|
the appropriate **status token** (see Status Vocabulary at the start of Phase
|
|
@@ -568,7 +567,7 @@ Heads up: I'm modifying internal/daemon/rpc.go which may overlap with your work
|
|
|
568
567
|
EOF
|
|
569
568
|
|
|
570
569
|
# Update your intent when switching tasks
|
|
571
|
-
thrum
|
|
570
|
+
thrum session set-intent "Working on {{TASK_ID}}: <description>"
|
|
572
571
|
```
|
|
573
572
|
|
|
574
573
|
---
|
|
@@ -124,7 +124,7 @@ thrum <cmd> --help Detailed command usage
|
|
|
124
124
|
| ---------------------------------------- | -------------------------- | ----------------------------- |
|
|
125
125
|
| Cross-worktree messaging | Same-session task tracking | Single-agent, no coordination |
|
|
126
126
|
| Persistent messages (survive compaction) | Ephemeral task lists | Temporary scratch notes |
|
|
127
|
-
|
|
|
127
|
+
| Non-tmux listener fallback | Inline progress tracking | Simple linear execution |
|
|
128
128
|
| Multi-machine sync via git | Local to conversation | No persistence needed |
|
|
129
129
|
|
|
130
130
|
**Decision test:** "Do messages need to survive session restart or reach agents
|
|
@@ -139,13 +139,14 @@ for cross-session/cross-worktree coordination messages.
|
|
|
139
139
|
|
|
140
140
|
When running in a tmux-managed session, messages are delivered directly to your
|
|
141
141
|
pane via daemon nudge — zero token cost, no background sub-agent needed. See
|
|
142
|
-
[TMUX_SESSIONS.md](resources/TMUX_SESSIONS.md).
|
|
142
|
+
[TMUX_SESSIONS.md](resources/TMUX_SESSIONS.md). Check `thrum inbox --unread` at
|
|
143
|
+
natural breakpoints; never spawn a background listener.
|
|
143
144
|
|
|
144
145
|
### Listener Pattern (Fallback)
|
|
145
146
|
|
|
146
|
-
|
|
147
|
-
`thrum wait` (blocking) and returns when messages arrive.
|
|
148
|
-
|
|
147
|
+
Use the background message listener only when tmux pane delivery is unavailable.
|
|
148
|
+
It calls `thrum wait` (blocking) and returns when messages arrive. See
|
|
149
|
+
[LISTENER_PATTERN.md](resources/LISTENER_PATTERN.md).
|
|
149
150
|
|
|
150
151
|
### Context Management
|
|
151
152
|
|
|
@@ -11,18 +11,14 @@ between agents.
|
|
|
11
11
|
## 2. Polling Instead of Waiting
|
|
12
12
|
|
|
13
13
|
**Wrong:** Looping `thrum inbox` every 10 seconds. **Right:** Use `thrum wait`
|
|
14
|
-
which blocks efficiently until a message arrives.
|
|
15
|
-
|
|
14
|
+
which blocks efficiently until a message arrives. Use the listener fallback
|
|
15
|
+
only when tmux pane delivery is unavailable.
|
|
16
16
|
|
|
17
|
-
## 3.
|
|
17
|
+
## 3. Spawning Listeners in Tmux Sessions
|
|
18
18
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
```text
|
|
24
|
-
Task(subagent_type="message-listener", run_in_background=true, prompt="...")
|
|
25
|
-
```
|
|
19
|
+
In tmux-managed sessions, messages arrive in the pane. Check
|
|
20
|
+
`thrum inbox --unread` at natural breakpoints and never spawn a background
|
|
21
|
+
listener.
|
|
26
22
|
|
|
27
23
|
## 4. Sending Without an Explicit Recipient Flag
|
|
28
24
|
|
|
@@ -22,7 +22,7 @@ These flags apply to every command:
|
|
|
22
22
|
Many commands append contextual hints after their normal output. Two kinds:
|
|
23
23
|
|
|
24
24
|
- **detection** — condition-triggered guards (e.g. identity mismatch, empty
|
|
25
|
-
|
|
25
|
+
team roster, peer version drift). Fire whenever the condition is present.
|
|
26
26
|
- **reinforcement** — periodic memory-aids, band-throttled by context
|
|
27
27
|
percentage. Fire occasionally, not on every command.
|
|
28
28
|
|
|
@@ -280,44 +280,42 @@ Flags:
|
|
|
280
280
|
--re-register Re-register same agent
|
|
281
281
|
```
|
|
282
282
|
|
|
283
|
-
###
|
|
283
|
+
### team roster
|
|
284
284
|
|
|
285
285
|
```bash
|
|
286
|
-
thrum
|
|
287
|
-
thrum
|
|
288
|
-
thrum
|
|
289
|
-
thrum
|
|
290
|
-
thrum
|
|
286
|
+
thrum team # Local active roster
|
|
287
|
+
thrum team --role reviewer # Filter by role
|
|
288
|
+
thrum team --module auth # Filter by module
|
|
289
|
+
thrum team --compact # One line per agent with intent and branch/commits
|
|
290
|
+
thrum team --phase stale # Exact stale triage queue
|
|
291
|
+
thrum team --include-inactive # Add stale and retired rows
|
|
292
|
+
thrum team --offline # Add ordinary offline rows
|
|
293
|
+
thrum team --all # Preserve the whole-fleet roster
|
|
294
|
+
thrum team --json
|
|
291
295
|
```
|
|
292
296
|
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
```text
|
|
296
|
-
--context Show work context (branch, commits, intent)
|
|
297
|
-
--role string Filter by role
|
|
298
|
-
--module string Filter by module
|
|
299
|
-
```
|
|
297
|
+
`--include-inactive` includes stale and retired rows, including offline stale/retired rows, while omitting ordinary offline active rows. `--offline` adds ordinary offline active rows. Use both for their union. `--phase` remains exact. Stale rows show last-seen and measured worktree, identity-file, and tmux-session presence; unavailable measurements render as `unknown`. `Reap candidate` is display-only and appears only when worktree and tmux-session presence are both explicitly absent.
|
|
300
298
|
|
|
301
|
-
###
|
|
299
|
+
### session set-intent
|
|
302
300
|
|
|
303
301
|
```bash
|
|
304
|
-
thrum
|
|
302
|
+
thrum session set-intent "Fixing memory leak in connection pool"
|
|
305
303
|
thrum session set-intent "Refactoring login flow"
|
|
306
|
-
thrum
|
|
304
|
+
thrum session set-intent "" # Clear intent
|
|
307
305
|
```
|
|
308
306
|
|
|
309
|
-
###
|
|
307
|
+
### session set-task
|
|
310
308
|
|
|
311
309
|
```bash
|
|
312
|
-
thrum
|
|
310
|
+
thrum session set-task beads:thrum-xyz
|
|
313
311
|
thrum session set-task "JIRA-1234"
|
|
314
|
-
thrum
|
|
312
|
+
thrum session set-task "" # Clear task
|
|
315
313
|
```
|
|
316
314
|
|
|
317
|
-
###
|
|
315
|
+
### session heartbeat
|
|
318
316
|
|
|
319
317
|
```bash
|
|
320
|
-
thrum
|
|
318
|
+
thrum session heartbeat
|
|
321
319
|
thrum session heartbeat
|
|
322
320
|
thrum session heartbeat --add-scope module:auth
|
|
323
321
|
thrum session heartbeat --remove-ref pr:42
|
|
@@ -333,17 +331,17 @@ Flags:
|
|
|
333
331
|
--remove-ref strings Remove ref (repeatable, format: type:value)
|
|
334
332
|
```
|
|
335
333
|
|
|
336
|
-
###
|
|
334
|
+
### session start
|
|
337
335
|
|
|
338
336
|
```bash
|
|
339
|
-
thrum
|
|
337
|
+
thrum session start
|
|
340
338
|
thrum session start
|
|
341
339
|
```
|
|
342
340
|
|
|
343
|
-
###
|
|
341
|
+
### session end
|
|
344
342
|
|
|
345
343
|
```bash
|
|
346
|
-
thrum
|
|
344
|
+
thrum session end
|
|
347
345
|
thrum session end
|
|
348
346
|
thrum session end --reason crash
|
|
349
347
|
thrum session end --session-id <id>
|
|
@@ -5,6 +5,10 @@
|
|
|
5
5
|
> [TMUX_SESSIONS.md](TMUX_SESSIONS.md). Use the listener pattern below when tmux
|
|
6
6
|
> is not available or not practical for your setup.
|
|
7
7
|
>
|
|
8
|
+
> In tmux-managed sessions, messages arrive in the pane. Check
|
|
9
|
+
> `thrum inbox --unread` at natural breakpoints and never spawn a background
|
|
10
|
+
> listener.
|
|
11
|
+
>
|
|
8
12
|
> **Deprecated for newly initialized agents:** the hook injection and
|
|
9
13
|
> scheduled backstop that `thrum init` installs deliver message nudges without a
|
|
10
14
|
> listener. The pattern below still works and is supported, but it holds tokens in
|
|
@@ -2,7 +2,8 @@
|
|
|
2
2
|
|
|
3
3
|
Tmux-managed sessions are the recommended way to run Thrum agents. The daemon
|
|
4
4
|
detects the tmux pane and delivers message notifications directly — zero token
|
|
5
|
-
cost, no background listener needed.
|
|
5
|
+
cost, no background listener needed. Check `thrum inbox --unread` at natural
|
|
6
|
+
breakpoints; never spawn a background listener.
|
|
6
7
|
|
|
7
8
|
## Why Tmux Sessions
|
|
8
9
|
|