@tablation/crew 0.41.0 → 0.43.1

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.41.0",
3
+ "version": "0.43.1",
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",
@@ -47,9 +47,12 @@ pass.
47
47
  builder's closing comment — what it changed, how it says it verified,
48
48
  what it admits it could not test — is the thing you are checking.
49
49
  Anything it skipped is your first test. **Open the ticket's own
50
- attachments first** (Step 3.4 in the shared policy says how): the
51
- reporter's screenshot is the repro you are judging the fix against. If
52
- you cannot open one, say so and set `needs_info` rather than passing it.
50
+ attachments first**, exactly as Step 3.4 in the shared policy says: read
51
+ the Media Library record for its `storage_key`, then fetch
52
+ `files/<storage_key>` — never a guessed `files/<id>` path. The reporter's
53
+ screenshot is the repro you are judging the fix against. If you cannot
54
+ open one, say so with the exact request and response and set `needs_info`
55
+ rather than passing it.
53
56
  4. **Get the branch and read the diff.** The branch on the remote is what
54
57
  you test, and you never need the builder's worktree: cut your own with
55
58
  `crew worktree <number>` (it prints the path), unless the builder's
@@ -183,13 +183,17 @@ should is Step 1's call, not a filesystem check.
183
183
  and then it is a stop for a person (see "Stopping"), never a bare comment.
184
184
  - Otherwise pick from the digest's "Step 2" table, which is already
185
185
  `accepted`, in your lane and in order. Absent a digest, fetch those tickets
186
- and order them by **effective priority, then severity, then `issue_id`**:
186
+ and order them by **effective priority, then manual position, then severity, then `issue_id`**:
187
187
  - **Effective priority** is the stronger of the ticket's own `priority`
188
188
  and one derived from `severity` (`s1`→p0, `s2`→p1, `s3`→p2, `s4`→p3;
189
189
  neither set → p2). p0 beats p1 beats p2 beats p3, so an explicit
190
190
  priority can only move a ticket *forward*. Priority is an escalation
191
191
  lever; to rank something down, lower its severity.
192
- - Within one tier, more severe first (`s1` … `s4`, then unset).
192
+ - Within one tier, a ticket with a manual **`position`** (a lower number
193
+ is earlier) goes before one without; position only orders tickets of the
194
+ same effective priority and never lets a lower tier jump a higher one. A
195
+ workspace with no position column skips this clause.
196
+ - Then more severe first (`s1` … `s4`, then unset).
193
197
  - Within one severity, a ticket whose **epic is already in progress** goes
194
198
  first (finishing beats starting); a `planned` epic or none ranks the
195
199
  same. Only then oldest `issue_id` first.
@@ -280,12 +284,21 @@ before going further, and never change a ticket's `report_type` yourself.
280
284
  4. **Post a short comment** on what you are about to do (Comments table:
281
285
  `ticket_id`, `team_member_id` = your id, markdown `body`), and further
282
286
  comments at meaningful milestones — the operator wants visible progress,
283
- not just status flips. **Open the ticket's attachments before you start:**
284
- an `attachments` value is a list of Media Library record ids, usually the
285
- repro screenshot, and where it disagrees with the description the picture
286
- is the reproduction. If you cannot open one, that is a blocker (comment,
287
- `needs_info` plus `needs_planning`, stop). The `Ticket Attachments` skill
288
- has the resolution steps.
287
+ not just status flips. **Open the ticket's attachments before you start.**
288
+ An `attachments` value on the ticket or a comment is a list of Media
289
+ Library record ids — not file ids and not URLs, so no `files/<id>` path
290
+ will ever work. For each id: (1) read the Media Library record,
291
+ `GET /api/workspaces/<workspaceId>/data-models/<Media Library id>/records/<id>`
292
+ (the Environment section's "Opening a ticket's attachments" gives the
293
+ table id), and take its `storage_key`; (2) fetch the bytes with
294
+ `GET /api/workspaces/<workspaceId>/files/<storage_key>` (the MCP form is
295
+ `files_controller_download` with `uuid` and `filename` being the two
296
+ halves of the storage key) into a scratch directory and open it; (3)
297
+ compare it with the description — where they disagree, the picture is the
298
+ reproduction. If you cannot open one, that is a blocker (comment naming
299
+ it and the exact failure, `needs_info` plus `needs_planning`, stop); never
300
+ proceed on the prose alone. The `Ticket Attachments` skill has the edge
301
+ cases.
289
302
  5. **Implement the fix.** Read the relevant code first; do not guess at the
290
303
  architecture. **Never bump the version or edit the changelog on this
291
304
  branch** — the release phase assigns the version once per release, over
@@ -12,14 +12,20 @@ you picked up, and on any comment that has them, before you start.
12
12
 
13
13
  1. **Read the Media Library record for that id.** The `attachments` column is
14
14
  a reference into the workspace's Media Library table; its `storage_key`
15
- and `mime_type` are what you need. Take that table's id from the
16
- Environment section if it lists one, otherwise from a workspace-level
17
- model listing — never by reading the whole Issues model definition, which
18
- is over a megabyte.
19
- 2. **Fetch the bytes:** `GET /api/workspaces/<workspaceId>/files/<storage_key>`
20
- with the usual headers (the tracker MCP form is `files_controller_download`,
21
- which hands an image back as a viewable block). Save the file in a scratch
22
- directory outside the repository, then open it.
15
+ and `mime_type` are what you need:
16
+ `GET /api/workspaces/<workspaceId>/data-models/<Media Library id>/records/<id>`
17
+ (MCP: `records_controller_find_one`). The Environment section's "Opening
18
+ a ticket's attachments" names the table id; if it is absent, find the
19
+ table by name in a workspace-level model listing — never by reading the
20
+ whole Issues model definition, which is over a megabyte. The id is a
21
+ record id, not a file id: `files/<id>`, `files/<id>/download` and
22
+ `media-library/<id>/...` all 404 by design.
23
+ 2. **Fetch the bytes:** the `storage_key` has the form `<uuid>/<filename>`;
24
+ `GET /api/workspaces/<workspaceId>/files/<uuid>/<filename>` with the usual
25
+ headers streams it (the MCP form is `files_controller_download` with
26
+ `workspaceId`, `uuid` and `filename`, which hands an image back as a
27
+ viewable block). Save the file in a scratch directory outside the
28
+ repository, then open it.
23
29
  3. **Compare what the picture shows with what the description says.** Where
24
30
  they disagree, the picture is the reproduction.
25
31
 
@@ -46,9 +46,12 @@ pass.
46
46
  builder's closing comment — what it changed, how it says it verified,
47
47
  what it admits it could not test — is the thing you are checking.
48
48
  Anything it skipped is your first test. **Open the ticket's own
49
- attachments first** (Step 3.4 in the shared policy says how): the
50
- reporter's screenshot is the repro you are judging the fix against. If
51
- you cannot open one, say so and set `needs_info` rather than passing it.
49
+ attachments first**, exactly as Step 3.4 in the shared policy says: read
50
+ the Media Library record for its `storage_key`, then fetch
51
+ `files/<storage_key>` — never a guessed `files/<id>` path. The reporter's
52
+ screenshot is the repro you are judging the fix against. If you cannot
53
+ open one, say so with the exact request and response and set `needs_info`
54
+ rather than passing it.
52
55
  4. **Get the branch and read the diff.** The branch on the remote is what
53
56
  you test, and you never need the builder's worktree: cut your own with
54
57
  `crew worktree <number>` (it prints the path), unless the builder's
@@ -183,13 +183,17 @@ should is Step 1's call, not a filesystem check.
183
183
  and then it is a stop for a person (see "Stopping"), never a bare comment.
184
184
  - Otherwise pick from the digest's "Step 2" table, which is already
185
185
  `accepted`, in your lane and in order. Absent a digest, fetch those tickets
186
- and order them by **effective priority, then severity, then `issue_id`**:
186
+ and order them by **effective priority, then manual position, then severity, then `issue_id`**:
187
187
  - **Effective priority** is the stronger of the ticket's own `priority`
188
188
  and one derived from `severity` (`s1`→p0, `s2`→p1, `s3`→p2, `s4`→p3;
189
189
  neither set → p2). p0 beats p1 beats p2 beats p3, so an explicit
190
190
  priority can only move a ticket *forward*. Priority is an escalation
191
191
  lever; to rank something down, lower its severity.
192
- - Within one tier, more severe first (`s1` … `s4`, then unset).
192
+ - Within one tier, a ticket with a manual **`position`** (a lower number
193
+ is earlier) goes before one without; position only orders tickets of the
194
+ same effective priority and never lets a lower tier jump a higher one. A
195
+ workspace with no position column skips this clause.
196
+ - Then more severe first (`s1` … `s4`, then unset).
193
197
  - Within one severity, a ticket whose **epic is already in progress** goes
194
198
  first (finishing beats starting); a `planned` epic or none ranks the
195
199
  same. Only then oldest `issue_id` first.
@@ -280,12 +284,21 @@ before going further, and never change a ticket's `report_type` yourself.
280
284
  4. **Post a short comment** on what you are about to do (Comments table:
281
285
  `ticket_id`, `team_member_id` = your id, markdown `body`), and further
282
286
  comments at meaningful milestones — the operator wants visible progress,
283
- not just status flips. **Open the ticket's attachments before you start:**
284
- an `attachments` value is a list of Media Library record ids, usually the
285
- repro screenshot, and where it disagrees with the description the picture
286
- is the reproduction. If you cannot open one, that is a blocker (comment,
287
- `needs_info` plus `needs_planning`, stop). The `Ticket Attachments` skill
288
- has the resolution steps.
287
+ not just status flips. **Open the ticket's attachments before you start.**
288
+ An `attachments` value on the ticket or a comment is a list of Media
289
+ Library record ids — not file ids and not URLs, so no `files/<id>` path
290
+ will ever work. For each id: (1) read the Media Library record,
291
+ `GET /api/workspaces/<workspaceId>/data-models/<Media Library id>/records/<id>`
292
+ (the Environment section's "Opening a ticket's attachments" gives the
293
+ table id), and take its `storage_key`; (2) fetch the bytes with
294
+ `GET /api/workspaces/<workspaceId>/files/<storage_key>` (the MCP form is
295
+ `files_controller_download` with `uuid` and `filename` being the two
296
+ halves of the storage key) into a scratch directory and open it; (3)
297
+ compare it with the description — where they disagree, the picture is the
298
+ reproduction. If you cannot open one, that is a blocker (comment naming
299
+ it and the exact failure, `needs_info` plus `needs_planning`, stop); never
300
+ proceed on the prose alone. The `Ticket Attachments` skill has the edge
301
+ cases.
289
302
  5. **Implement the fix.** Read the relevant code first; do not guess at the
290
303
  architecture. **Never bump the version or edit the changelog on this
291
304
  branch** — the release phase assigns the version once per release, over
@@ -12,14 +12,20 @@ you picked up, and on any comment that has them, before you start.
12
12
 
13
13
  1. **Read the Media Library record for that id.** The `attachments` column is
14
14
  a reference into the workspace's Media Library table; its `storage_key`
15
- and `mime_type` are what you need. Take that table's id from the
16
- Environment section if it lists one, otherwise from a workspace-level
17
- model listing — never by reading the whole Issues model definition, which
18
- is over a megabyte.
19
- 2. **Fetch the bytes:** `GET /api/workspaces/<workspaceId>/files/<storage_key>`
20
- with the usual headers (the tracker MCP form is `files_controller_download`,
21
- which hands an image back as a viewable block). Save the file in a scratch
22
- directory outside the repository, then open it.
15
+ and `mime_type` are what you need:
16
+ `GET /api/workspaces/<workspaceId>/data-models/<Media Library id>/records/<id>`
17
+ (MCP: `records_controller_find_one`). The Environment section's "Opening
18
+ a ticket's attachments" names the table id; if it is absent, find the
19
+ table by name in a workspace-level model listing — never by reading the
20
+ whole Issues model definition, which is over a megabyte. The id is a
21
+ record id, not a file id: `files/<id>`, `files/<id>/download` and
22
+ `media-library/<id>/...` all 404 by design.
23
+ 2. **Fetch the bytes:** the `storage_key` has the form `<uuid>/<filename>`;
24
+ `GET /api/workspaces/<workspaceId>/files/<uuid>/<filename>` with the usual
25
+ headers streams it (the MCP form is `files_controller_download` with
26
+ `workspaceId`, `uuid` and `filename`, which hands an image back as a
27
+ viewable block). Save the file in a scratch directory outside the
28
+ repository, then open it.
23
29
  3. **Compare what the picture shows with what the description says.** Where
24
30
  they disagree, the picture is the reproduction.
25
31