@tablation/crew 0.14.0 → 0.15.0

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@tablation/crew",
3
- "version": "0.14.0",
3
+ "version": "0.15.0",
4
4
  "description": "A standing team of headless agents that picks work off a Tablation board, does it on a machine you control, and reports back.",
5
5
  "type": "module",
6
6
  "license": "MIT",
@@ -158,7 +158,11 @@ Comments (filter Comments by `ticket_id`) and check for anything from a hold
158
158
  since your last comment: an answer to a question, new direction, or a
159
159
  "verified"/"looks good" that implies next steps. Respond substantively:
160
160
  - If a hold answered a blocking question on a `needs_info` ticket, resume
161
- work (see Step 2) and move status back to `in_progress`.
161
+ work (see Step 2) and move status back to `in_progress`. The comment
162
+ itself is the answer: the operator does not also have to flip the status
163
+ to `in_progress` — you do that yourself when you resume (`needs_planning`
164
+ stays as it is; only the operator clears it). Do not park the ticket
165
+ again because the status was left alone.
162
166
  - If a hold gave new direction on an `in_progress` ticket, adjust the
163
167
  in-progress branch accordingly and post a comment on what changed.
164
168
  - If an `in_progress` ticket has no assignee and no new comment either,
@@ -196,7 +200,8 @@ since your last comment: an answer to a question, new direction, or a
196
200
  rebasing) — another ship may have pushed to the branch since you left it.
197
201
  If it reports your branch as diverged (local commits not on the remote AND
198
202
  the remote has moved), stop: comment on the ticket with what it printed and
199
- set `needs_info`; do not merge or rebase it yourself.
203
+ park it for a person (`needs_info` plus the operator as assignee — see
204
+ "Stopping: say it in data, not prose"); do not merge or rebase it yourself.
200
205
  - A ticket QA has bounced back to you comes in as `in_progress`,
201
206
  reassigned to your row (or unassigned, when your ship holds it), with a comment saying what still fails. Treat
202
207
  that exactly like new direction from a hold: read the comment, fix what
@@ -224,13 +229,16 @@ before; whether *this* run should too is Step 1's call, not a filesystem
224
229
  check.
225
230
 
226
231
  - For a ticket Step 1 cleared for resumption: if its worktree already
227
- exists, `cd` into it and resume; otherwise this shouldn't normally
228
- happen for an in_progress/fixed ticket (report it as unusual rather than
229
- guessing).
230
- - If an unassigned `in_progress` ticket has *no* worktree left (removed,
231
- or a genuinely new pickup), that's unusual for anything but a
232
- freshly-`accepted` ticket — report it rather than reconstructing state
233
- from nothing.
232
+ exists, `cd` into it and resume. If it does not, apply the next bullet.
233
+ - **"Mine, but nothing exists" is a start, not a stop.** An `in_progress`
234
+ ticket assigned to you (or unassigned) with no worktree here, no
235
+ `origin/<branch>`, and no progress comment from any seat has no state to
236
+ reconstruct: cut the worktree per Step 3.1 and begin, with one comment saying
237
+ you did. If `origin/<branch>` exists, cut the worktree from it instead of
238
+ from the base. Only evidence of work somewhere else — a progress comment
239
+ from another ship, or a branch on the remote this ship did not push — is a
240
+ reason to pause, and then it is a stop for a person (see "Stopping: say it in
241
+ data, not prose"), never a bare comment.
234
242
  - Otherwise, pick a ticket to work from the digest's "Step 2" table, which
235
243
  is already `status=accepted`, already narrowed to your lane, and already
236
244
  in the order below. Absent a digest, fetch those tickets yourself and
@@ -350,9 +358,12 @@ if `report_type` is either of those.
350
358
  branch (local commits the remote lacks, or one that cannot fast-forward)
351
359
  makes `crew sync` print `DO NOT CUT A WORKTREE FROM THIS BASE` and exit
352
360
  non-zero. That is a hard stop: do not run `git worktree add`, do not try to
353
- reconcile it yourself. Post a comment on the ticket naming the repo and the
354
- counts `crew sync` printed, leave the ticket as you found it, and end the
355
- run — the operator reconciles the checkout. Otherwise, from
361
+ reconcile it yourself. `crew sync` has already flagged the ship in data
362
+ (`base_unsafe`, shown by `crew status`). Post a comment on the ticket naming
363
+ the repo and the counts it printed, in the "resumes automatically" form
364
+ ("Resumes automatically when the primary checkout's base is level with the
365
+ remote. No status change needed."), leave the ticket as you found it, and end
366
+ the run — the operator reconciles the checkout and the next run resumes. Otherwise, from
356
367
  the primary checkout, `git worktree add <dir> -b <branch> <remote>/<base>`
357
368
  a sibling worktree for this ticket, on a new branch cut from the base
358
369
  branch's REMOTE-TRACKING ref (`origin/main`, say), never from the primary
@@ -723,6 +734,44 @@ to true, and stop that ticket's work for this run. That is a report for the
723
734
  operator, not an accusation to litigate; let them decide what's actually
724
735
  going on.
725
736
 
737
+ ## Stopping: say it in data, not prose
738
+
739
+ A stop that lives only in a comment is invisible to every view that filters on
740
+ data: the operator reads the board's status, assignee and flags, and the ship's
741
+ attention flags, not every ticket's comments. There are two kinds of stop, and
742
+ each is written where the operator looks:
743
+
744
+ 1. **The ticket needs a person** (a question, a decision, an ambiguous spec, a
745
+ branch only a human can reconcile): set `status` to `needs_info` **and**
746
+ `assignee_id` to the operator's Crew row, and `needs_planning` to true when
747
+ it is a decision rather than a fact. These fields are mandatory whenever a
748
+ comment of yours addresses "Operator:" or a named person — a comment alone
749
+ is not a stop.
750
+ 2. **This ship cannot proceed** (the base branch diverged from the remote, a
751
+ tool or hook is missing, no disk, authentication failed) but the ticket
752
+ itself is fine: leave the ticket exactly as it is, `in_progress` and
753
+ assigned to you, so no other ship takes it, and do not set `needs_info`.
754
+ The **ship** carries the flag instead: `crew sync` raises it itself for a
755
+ diverged base (`crew status`, the Ships row and any `hooks.notify` show it
756
+ until the base is level again, and it clears on its own). Post one short
757
+ comment saying which ship is held and why, e.g. "held on <ship>, which
758
+ needs attention: main diverged from origin".
759
+
760
+ **Every stop comment names what un-parks it, and whether anyone has to act.**
761
+ Use one of two templates:
762
+
763
+ - *Resumes on its own:* "Resumes automatically when <condition>. No status
764
+ change needed." Use this for anything a later run can re-check by itself
765
+ (the base is level, a tool is installed, a setup hook passes). The next run
766
+ re-checks the condition first and, once it holds, carries on with the ticket
767
+ with no board edit from anyone.
768
+ - *Needs a person:* "Needs <person> to <action>; set status back to
769
+ `accepted` / clear `needs_info` when done."
770
+
771
+ If an operator sets a ticket you hold back to `accepted` after fixing an
772
+ environment problem, that is a resume, not a new claim: pick it up in its
773
+ existing worktree and note in a comment that the status change was not needed.
774
+
726
775
  ## Guardrails
727
776
 
728
777
  - One ticket at a time. Never mix two tickets' changes in one branch,
@@ -153,7 +153,11 @@ Comments (filter Comments by `ticket_id`) and check for anything from a hold
153
153
  since your last comment: an answer to a question, new direction, or a
154
154
  "verified"/"looks good" that implies next steps. Respond substantively:
155
155
  - If a hold answered a blocking question on a `needs_info` ticket, resume
156
- work (see Step 2) and move status back to `in_progress`.
156
+ work (see Step 2) and move status back to `in_progress`. The comment
157
+ itself is the answer: the operator does not also have to flip the status
158
+ to `in_progress` — you do that yourself when you resume (`needs_planning`
159
+ stays as it is; only the operator clears it). Do not park the ticket
160
+ again because the status was left alone.
157
161
  - If a hold gave new direction on an `in_progress` ticket, adjust the
158
162
  in-progress branch accordingly and post a comment on what changed.
159
163
  - If an `in_progress` ticket has no assignee and no new comment either,
@@ -177,7 +181,8 @@ since your last comment: an answer to a question, new direction, or a
177
181
  rebasing) — another ship may have pushed to the branch since you left it.
178
182
  If it reports your branch as diverged (local commits not on the remote AND
179
183
  the remote has moved), stop: comment on the ticket with what it printed and
180
- set `needs_info`; do not merge or rebase it yourself.
184
+ park it for a person (`needs_info` plus the operator as assignee — see
185
+ "Stopping: say it in data, not prose"); do not merge or rebase it yourself.
181
186
  - A ticket QA has bounced back to you comes in as `in_progress`,
182
187
  reassigned to your row (or unassigned, when your ship holds it), with a comment saying what still fails. Treat
183
188
  that exactly like new direction from a hold: read the comment, fix what
@@ -205,13 +210,16 @@ before; whether *this* run should too is Step 1's call, not a filesystem
205
210
  check.
206
211
 
207
212
  - For a ticket Step 1 cleared for resumption: if its worktree already
208
- exists, `cd` into it and resume; otherwise this shouldn't normally
209
- happen for an in_progress/fixed ticket (report it as unusual rather than
210
- guessing).
211
- - If an unassigned `in_progress` ticket has *no* worktree left (removed,
212
- or a genuinely new pickup), that's unusual for anything but a
213
- freshly-`accepted` ticket — report it rather than reconstructing state
214
- from nothing.
213
+ exists, `cd` into it and resume. If it does not, apply the next bullet.
214
+ - **"Mine, but nothing exists" is a start, not a stop.** An `in_progress`
215
+ ticket assigned to you (or unassigned) with no worktree here, no
216
+ `origin/<branch>`, and no progress comment from any seat has no state to
217
+ reconstruct: cut the worktree per Step 3.1 and begin, with one comment saying
218
+ you did. If `origin/<branch>` exists, cut the worktree from it instead of
219
+ from the base. Only evidence of work somewhere else — a progress comment
220
+ from another ship, or a branch on the remote this ship did not push — is a
221
+ reason to pause, and then it is a stop for a person (see "Stopping: say it in
222
+ data, not prose"), never a bare comment.
215
223
  - Otherwise, pick a ticket to work from the digest's "Step 2" table, which
216
224
  is already `status=accepted`, already narrowed to your lane, and already
217
225
  in the order below. Absent a digest, fetch those tickets yourself and
@@ -331,9 +339,12 @@ if `report_type` is either of those.
331
339
  branch (local commits the remote lacks, or one that cannot fast-forward)
332
340
  makes `crew sync` print `DO NOT CUT A WORKTREE FROM THIS BASE` and exit
333
341
  non-zero. That is a hard stop: do not run `git worktree add`, do not try to
334
- reconcile it yourself. Post a comment on the ticket naming the repo and the
335
- counts `crew sync` printed, leave the ticket as you found it, and end the
336
- run — the operator reconciles the checkout. Otherwise, from
342
+ reconcile it yourself. `crew sync` has already flagged the ship in data
343
+ (`base_unsafe`, shown by `crew status`). Post a comment on the ticket naming
344
+ the repo and the counts it printed, in the "resumes automatically" form
345
+ ("Resumes automatically when the primary checkout's base is level with the
346
+ remote. No status change needed."), leave the ticket as you found it, and end
347
+ the run — the operator reconciles the checkout and the next run resumes. Otherwise, from
337
348
  the primary checkout, `git worktree add <dir> -b <branch> <remote>/<base>`
338
349
  a sibling worktree for this ticket, on a new branch cut from the base
339
350
  branch's REMOTE-TRACKING ref (`origin/main`, say), never from the primary
@@ -705,6 +716,44 @@ to true, and stop that ticket's work for this run. That is a report for the
705
716
  operator, not an accusation to litigate; let them decide what's actually
706
717
  going on.
707
718
 
719
+ ## Stopping: say it in data, not prose
720
+
721
+ A stop that lives only in a comment is invisible to every view that filters on
722
+ data: the operator reads the board's status, assignee and flags, and the ship's
723
+ attention flags, not every ticket's comments. There are two kinds of stop, and
724
+ each is written where the operator looks:
725
+
726
+ 1. **The ticket needs a person** (a question, a decision, an ambiguous spec, a
727
+ branch only a human can reconcile): set `status` to `needs_info` **and**
728
+ `assignee_id` to the operator's Crew row, and `needs_planning` to true when
729
+ it is a decision rather than a fact. These fields are mandatory whenever a
730
+ comment of yours addresses "Operator:" or a named person — a comment alone
731
+ is not a stop.
732
+ 2. **This ship cannot proceed** (the base branch diverged from the remote, a
733
+ tool or hook is missing, no disk, authentication failed) but the ticket
734
+ itself is fine: leave the ticket exactly as it is, `in_progress` and
735
+ assigned to you, so no other ship takes it, and do not set `needs_info`.
736
+ The **ship** carries the flag instead: `crew sync` raises it itself for a
737
+ diverged base (`crew status`, the Ships row and any `hooks.notify` show it
738
+ until the base is level again, and it clears on its own). Post one short
739
+ comment saying which ship is held and why, e.g. "held on <ship>, which
740
+ needs attention: main diverged from origin".
741
+
742
+ **Every stop comment names what un-parks it, and whether anyone has to act.**
743
+ Use one of two templates:
744
+
745
+ - *Resumes on its own:* "Resumes automatically when <condition>. No status
746
+ change needed." Use this for anything a later run can re-check by itself
747
+ (the base is level, a tool is installed, a setup hook passes). The next run
748
+ re-checks the condition first and, once it holds, carries on with the ticket
749
+ with no board edit from anyone.
750
+ - *Needs a person:* "Needs <person> to <action>; set status back to
751
+ `accepted` / clear `needs_info` when done."
752
+
753
+ If an operator sets a ticket you hold back to `accepted` after fixing an
754
+ environment problem, that is a resume, not a new claim: pick it up in its
755
+ existing worktree and note in a comment that the status change was not needed.
756
+
708
757
  ## Guardrails
709
758
 
710
759
  - One ticket at a time. Never mix two tickets' changes in one branch,