From 3258962aa0e2bc3143830e47e76e2f1bdc45d441 Mon Sep 17 00:00:00 2001 From: Jacob Stephens Date: Thu, 1 Oct 2026 17:34:05 +0000 Subject: [PATCH 1/2] Day shift skills: ready-for-agent on a Spec means its Tickets are published /to-spec asks whether Tickets will follow and labels the Spec needs-triage or ready-for-agent; /to-tickets swaps the Spec's needs-triage for ready-for-agent as its last step. The triage label doc says what ready-for-agent means on a Spec and that in-progress is thirdshift's label for a Claim. Co-Authored-By: Claude Opus 5.5 --- .agents/skills/to-spec/SKILL.md | 5 ++++- .agents/skills/to-tickets/SKILL.md | 2 +- docs/agents/triage-labels.md | 13 +++++++++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/.agents/skills/to-spec/SKILL.md b/.agents/skills/to-spec/SKILL.md index 3f52599ae..9a0704b92 100644 --- a/.agents/skills/to-spec/SKILL.md +++ b/.agents/skills/to-spec/SKILL.md @@ -16,7 +16,10 @@ The issue tracker and triage label vocabulary should have been provided to you. Check with the user that these seams match their expectations. -3. Write the spec using the template below, then publish it to the project issue tracker. Apply the `ready-for-agent` triage label - no need for additional triage. +3. Write the spec using the template below, then publish it to the project issue tracker. As you publish it, ask the user whether tickets will follow, and label the spec by the answer: + +- **Tickets will follow** → apply the `needs-triage` triage label, and tell the user that `/to-tickets` will mark the spec ready once its tickets are published. A spec labelled `ready-for-agent` with no tickets yet looks exactly like a standalone ticket, and would be picked up as one. +- **No tickets** → the spec stands alone as one session of work. Apply the `ready-for-agent` triage label - no need for additional triage. diff --git a/.agents/skills/to-tickets/SKILL.md b/.agents/skills/to-tickets/SKILL.md index e868c831f..3501ebf2d 100644 --- a/.agents/skills/to-tickets/SKILL.md +++ b/.agents/skills/to-tickets/SKILL.md @@ -64,7 +64,7 @@ Publish the approved tickets. **How** depends on the tracker `/setup-matt-pocock Work the **frontier**: any ticket whose blockers are all done. For a purely linear chain that means top to bottom. -Do NOT close or modify any parent issue. +Do NOT close or modify any parent issue, with one exception: its triage label. When the tickets come from a spec's issue, swap the spec's `needs-triage` label for `ready-for-agent` as your last step, after every ticket and every blocking link is published. `ready-for-agent` on a spec says its tickets are published, so it must not be there any earlier. Change nothing else on the spec. diff --git a/docs/agents/triage-labels.md b/docs/agents/triage-labels.md index b716855d4..afa18e3b9 100644 --- a/docs/agents/triage-labels.md +++ b/docs/agents/triage-labels.md @@ -13,3 +13,16 @@ The skills speak in terms of five canonical triage roles. This file maps those r When a skill mentions a role (e.g. "apply the AFK-ready triage label"), use the corresponding label string from this table. Edit the right-hand column to match whatever vocabulary you actually use. + +## `ready-for-agent` on a Spec + +On a **Spec**, `ready-for-agent` says its **Tickets** are published: every Ticket is a sub-issue of the Spec and every blocking link is in place. A Spec with no Tickets yet looks exactly like a standalone Ticket, so a **Pickup run** would start a plain Run on it. + +- `/to-spec` labels a Spec that Tickets will follow `needs-triage`, and one that stands alone as one session of work `ready-for-agent`. +- `/to-tickets`, given a Spec, swaps the Spec's `needs-triage` for `ready-for-agent` as its last step. + +Don't label a Spec `ready-for-agent` by hand before its Tickets exist. + +## `in-progress` is not a triage role + +`in-progress` is thirdshift's own label for a **Claim**: the mark that the factory has taken an issue. thirdshift adds it, in place of `ready-for-agent`, when a Run or a Spec run starts on the issue, and takes it off once the issue is closed. It is not a sixth triage role: no skill applies it, and it has no row in the table above. From c4cacc569100f0a41a6ade717613f6fd9641bd55 Mon Sep 17 00:00:00 2001 From: Jacob Stephens Date: Thu, 1 Oct 2026 17:35:51 +0000 Subject: [PATCH 2/2] Address review: the standalone issue is not a Spec, ask before publishing, Claim defined in CONTEXT.md only Co-Authored-By: Claude Opus 5.5 --- .agents/skills/to-spec/SKILL.md | 6 +++--- .agents/skills/to-tickets/SKILL.md | 2 +- docs/agents/triage-labels.md | 9 ++------- 3 files changed, 6 insertions(+), 11 deletions(-) diff --git a/.agents/skills/to-spec/SKILL.md b/.agents/skills/to-spec/SKILL.md index 9a0704b92..2c24969dd 100644 --- a/.agents/skills/to-spec/SKILL.md +++ b/.agents/skills/to-spec/SKILL.md @@ -16,10 +16,10 @@ The issue tracker and triage label vocabulary should have been provided to you. Check with the user that these seams match their expectations. -3. Write the spec using the template below, then publish it to the project issue tracker. As you publish it, ask the user whether tickets will follow, and label the spec by the answer: +3. Write the spec using the template below. Before you publish it, ask the user whether tickets will follow. Then publish it to the project issue tracker, labelled by the answer: -- **Tickets will follow** → apply the `needs-triage` triage label, and tell the user that `/to-tickets` will mark the spec ready once its tickets are published. A spec labelled `ready-for-agent` with no tickets yet looks exactly like a standalone ticket, and would be picked up as one. -- **No tickets** → the spec stands alone as one session of work. Apply the `ready-for-agent` triage label - no need for additional triage. +- **Tickets will follow** → apply the `needs-triage` triage label, and tell the user that `/to-tickets` will mark the spec ready once its tickets are published. +- **No tickets** → the issue stands alone as one session of work. Apply the `ready-for-agent` triage label - no need for additional triage. diff --git a/.agents/skills/to-tickets/SKILL.md b/.agents/skills/to-tickets/SKILL.md index 3501ebf2d..6a365c066 100644 --- a/.agents/skills/to-tickets/SKILL.md +++ b/.agents/skills/to-tickets/SKILL.md @@ -64,7 +64,7 @@ Publish the approved tickets. **How** depends on the tracker `/setup-matt-pocock Work the **frontier**: any ticket whose blockers are all done. For a purely linear chain that means top to bottom. -Do NOT close or modify any parent issue, with one exception: its triage label. When the tickets come from a spec's issue, swap the spec's `needs-triage` label for `ready-for-agent` as your last step, after every ticket and every blocking link is published. `ready-for-agent` on a spec says its tickets are published, so it must not be there any earlier. Change nothing else on the spec. +Do NOT close or modify any parent issue, with one exception: its triage label. When the tickets come from a spec's issue, swap the spec's `needs-triage` label for `ready-for-agent` as your last step, after every ticket and every blocking link is published. `ready-for-agent` on a spec says its tickets are published. Change nothing else on the spec. diff --git a/docs/agents/triage-labels.md b/docs/agents/triage-labels.md index afa18e3b9..80495d777 100644 --- a/docs/agents/triage-labels.md +++ b/docs/agents/triage-labels.md @@ -16,13 +16,8 @@ Edit the right-hand column to match whatever vocabulary you actually use. ## `ready-for-agent` on a Spec -On a **Spec**, `ready-for-agent` says its **Tickets** are published: every Ticket is a sub-issue of the Spec and every blocking link is in place. A Spec with no Tickets yet looks exactly like a standalone Ticket, so a **Pickup run** would start a plain Run on it. - -- `/to-spec` labels a Spec that Tickets will follow `needs-triage`, and one that stands alone as one session of work `ready-for-agent`. -- `/to-tickets`, given a Spec, swaps the Spec's `needs-triage` for `ready-for-agent` as its last step. - -Don't label a Spec `ready-for-agent` by hand before its Tickets exist. +On a **Spec**, `ready-for-agent` says its **Tickets** are published: every Ticket is a sub-issue of the Spec and every blocking link is in place. Until then the Spec is labelled `needs-triage`, because a `ready-for-agent` Spec with no Tickets yet looks exactly like a standalone Ticket, and a **Pickup run** would start a plain Run on it. ## `in-progress` is not a triage role -`in-progress` is thirdshift's own label for a **Claim**: the mark that the factory has taken an issue. thirdshift adds it, in place of `ready-for-agent`, when a Run or a Spec run starts on the issue, and takes it off once the issue is closed. It is not a sixth triage role: no skill applies it, and it has no row in the table above. +`in-progress` is thirdshift's own label for a **Claim**, defined in `CONTEXT.md`. thirdshift applies and removes it. It is not a sixth triage role: no skill applies it, and it has no row in the table above.