ARM-138: epic sub-tickets go to In Review, not Done - #78
Conversation
linear-epic was moving sub-tickets straight to Done the moment their commit landed on the shared epic branch — before the epic PR had even been reviewed, let alone merged. Humans then had to go merge the PR separately, and because the tickets were already in the Done pile they fell off the radar. Move sub-tickets to In Review instead. They sit alongside the parent epic (which is also already In Review) until the PR merges; Linear's parent-cascade automation moves them to Done when the epic's state transitions. Also updates the downstream references in the same skill file that depended on the old behavior so the skill stays internally consistent: - Filter rule now skips sub-tickets in In Review *or* Done when building the execution queue (so resumes don't re-process already-committed sub-tickets). - Epic wrap-up trigger now fires on "all sub-tickets in In Review" instead of "all sub-tickets Done" — otherwise the trigger would never fire under the new flow. - Completion summary table template shows In Review instead of Done, matching what agents were already posting in practice (ARM-79). - Edge-case row for "all sub-tickets already complete" accepts both states.
ARM-138 Don't mark tickets "Done" until PR is merged
ProblemVera currently marks Linear tickets as Done when it opens a PR, not when the PR is actually merged. This creates two issues:
SuggestionOnly transition tickets to Done when the linked PR is merged. While the PR is open and awaiting review/merge, the ticket should sit in an intermediate state (e.g. In Review or Ready for Merge). SourceUser feedback:
Notes for implementation
Audit FindingsThe ticket's framing ("Vera marks tickets as Done when it pushes a PR") is slightly off — the primary
Per-skill audit
Real-world evidence: ARM-79 epic — parent and all 5 sub-tickets (ARM-83…ARM-87) were marked Research NotesIntermediate state nameThe ARM team workflow has How PRs are linked to Linear tickets
"attachments": {
"nodes": [
{
"id": "...",
"title": "fix(linear-issue): honor parent param on update action (ARM-128)",
"url": "https://github.com/stepandel/anton/pull/76",
"sourceType": "github",
"createdAt": "2026-04-07T18:44:39.271Z"
},
{ "sourceType": "githubCommit", "url": ".../commit/...", ... }
]
}Filter predicate for "this is a PR attachment": Branch-name-based auto-linking ( Epic sub-tickets don't get their own PR attachment
GitHub API — check PR merge statusSingle REST call per PR: Cron + workflow mechanics
Webhook alternative — explicitly out of scope
Entry Points
Repo: the Definition of Done
Test Cases
Edge Cases / Gotchas
In-Flight Work Scan
Implementation PromptUpdate Scope Revision (supersedes earlier prep output)Human clarified: Linear's built-in automation already cascades parent → child state (when an epic moves to This reduces the ticket to a single two-line edit in What actually changesFile: Line 116 — replace:
with:
Line 118 — replace:
with:
What is NOT changing
Definition of Done (revised)
Test cases (revised)
Implementation prompt (revised)Edit |
Problem
linear-epicwas marking sub-tickets as Done the moment their commit landed on the shared epic branch — before the epic PR had even been reviewed, let alone merged. Humans then had to manually merge the PR separately, and because the tickets were already in the Done pile they fell off the radar.Real-world evidence: ARM-79 epic — parent and all 5 sub-tickets (ARM-83…ARM-87) were marked
Done, but the completion summary row for each sub-ticket literally said✅ In Reviewnext to the PR link. Humans then had to go merge the PRs.Fix
Move epic sub-tickets to In Review on commit (not Done). They sit alongside the parent epic (which is also In Review after the PR opens) until the PR merges. Linear's built-in parent-cascade automation moves them to Done automatically when a human moves the epic parent to Done on merge — so no polling, no webhook, no new cron is needed.
Changes
All in
.vera/skills/linear-epic/SKILL.md:DonetoIn Review. Rationale rewritten to explain the parent-cascade.In RevieworDone. Without this, a crash-resume would re-process already-committed sub-tickets since they no longer hitDone.In RevieworDone, so an epic re-run after a partial human merge still skips to wrap-up.✅ In Reviewinstead of✅ Done. This matches what agents were already posting in practice.Scope
The ticket's revised scope called for a two-line edit at lines 116/118. The additional follow-ons above are in the same file and are the minimal set required to keep the skill internally consistent — leaving only 116/118 changed would create a self-contradictory skill where the wrap-up trigger "all sub-tickets Done" would never match reality, and resumes would re-process completed sub-tickets.
Explicitly not in scope (per the ticket's scope revision):
linear-execute,linear-bug,pr-review-resolver,linear-review— unchangedTest cases
grepfor"straight to Done"in the file — zero hits.grepfor stalesub-ticket.*Donereferences — all remaining hits are correct (either the filter rule that skips already-Done tickets, or the example execution plan showing a pre-existing Done sub-ticket being filtered).Closes ARM-138.