@codyswann/lisa 2.61.1 → 2.62.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.
Files changed (125) hide show
  1. package/package.json +1 -1
  2. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  3. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  4. package/plugins/lisa/agents/confluence-prd-intake.md +1 -1
  5. package/plugins/lisa/agents/github-prd-intake.md +1 -1
  6. package/plugins/lisa/agents/linear-prd-intake.md +1 -1
  7. package/plugins/lisa/agents/notion-prd-intake.md +1 -1
  8. package/plugins/lisa/commands/intake.md +1 -1
  9. package/plugins/lisa/commands/project-ideation.md +3 -3
  10. package/plugins/lisa/commands/repair-intake.md +6 -0
  11. package/plugins/lisa/commands/research.md +3 -3
  12. package/plugins/lisa/commands/setup-automations.md +6 -0
  13. package/plugins/lisa/commands/tear-down-automations.md +6 -0
  14. package/plugins/lisa/commands/verify-prd.md +2 -2
  15. package/plugins/lisa/rules/config-resolution.md +60 -0
  16. package/plugins/lisa/rules/intent-routing.md +4 -3
  17. package/plugins/lisa/rules/prd-lifecycle-rollup.md +10 -2
  18. package/plugins/lisa/rules/repo-scope-split.md +18 -1
  19. package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +11 -1
  20. package/plugins/lisa/skills/confluence-write-prd/SKILL.md +103 -0
  21. package/plugins/lisa/skills/confluence-write-prd/agents/openai.yaml +4 -0
  22. package/plugins/lisa/skills/github-build-intake/SKILL.md +13 -0
  23. package/plugins/lisa/skills/github-prd-intake/SKILL.md +15 -1
  24. package/plugins/lisa/skills/github-write-issue/SKILL.md +13 -4
  25. package/plugins/lisa/skills/github-write-prd/SKILL.md +100 -0
  26. package/plugins/lisa/skills/github-write-prd/agents/openai.yaml +4 -0
  27. package/plugins/lisa/skills/implement/SKILL.md +13 -6
  28. package/plugins/lisa/skills/intake/SKILL.md +3 -2
  29. package/plugins/lisa/skills/jira-build-intake/SKILL.md +13 -0
  30. package/plugins/lisa/skills/jira-write-ticket/SKILL.md +8 -0
  31. package/plugins/lisa/skills/linear-build-intake/SKILL.md +13 -0
  32. package/plugins/lisa/skills/linear-prd-intake/SKILL.md +11 -1
  33. package/plugins/lisa/skills/linear-write-issue/SKILL.md +10 -2
  34. package/plugins/lisa/skills/linear-write-prd/SKILL.md +90 -0
  35. package/plugins/lisa/skills/linear-write-prd/agents/openai.yaml +4 -0
  36. package/plugins/lisa/skills/notion-access/SKILL.md +2 -0
  37. package/plugins/lisa/skills/notion-prd-intake/SKILL.md +11 -1
  38. package/plugins/lisa/skills/notion-write-prd/SKILL.md +107 -0
  39. package/plugins/lisa/skills/notion-write-prd/agents/openai.yaml +4 -0
  40. package/plugins/lisa/skills/prd-source-write/SKILL.md +80 -0
  41. package/plugins/lisa/skills/prd-source-write/agents/openai.yaml +4 -0
  42. package/plugins/lisa/skills/project-ideation/SKILL.md +183 -80
  43. package/plugins/lisa/skills/repair-intake/SKILL.md +403 -0
  44. package/plugins/lisa/skills/repair-intake/agents/openai.yaml +4 -0
  45. package/plugins/lisa/skills/research/SKILL.md +19 -3
  46. package/plugins/lisa/skills/research/agents/openai.yaml +2 -2
  47. package/plugins/lisa/skills/setup-automations/SKILL.md +78 -0
  48. package/plugins/lisa/skills/setup-automations/agents/openai.yaml +4 -0
  49. package/plugins/lisa/skills/tear-down-automations/SKILL.md +34 -0
  50. package/plugins/lisa/skills/tear-down-automations/agents/openai.yaml +4 -0
  51. package/plugins/lisa/skills/tracker-build-intake/SKILL.md +4 -0
  52. package/plugins/lisa/skills/verify-prd/SKILL.md +41 -38
  53. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  55. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  57. package/plugins/lisa-expo/commands/exploratory-qa.md +3 -3
  58. package/plugins/lisa-expo/skills/exploratory-qa/SKILL.md +48 -18
  59. package/plugins/lisa-expo/skills/exploratory-qa/agents/openai.yaml +2 -2
  60. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  62. package/plugins/lisa-harper-fabric/commands/exploratory-qa.md +3 -3
  63. package/plugins/lisa-harper-fabric/skills/exploratory-qa/SKILL.md +48 -18
  64. package/plugins/lisa-harper-fabric/skills/exploratory-qa/agents/openai.yaml +2 -2
  65. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  67. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  69. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  71. package/plugins/lisa-rails/commands/exploratory-qa.md +3 -3
  72. package/plugins/lisa-rails/skills/exploratory-qa/SKILL.md +48 -18
  73. package/plugins/lisa-rails/skills/exploratory-qa/agents/openai.yaml +2 -2
  74. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  76. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  77. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  78. package/plugins/lisa-wiki/skills/lisa-wiki-ingest/SKILL.md +30 -1
  79. package/plugins/src/base/agents/confluence-prd-intake.md +1 -1
  80. package/plugins/src/base/agents/github-prd-intake.md +1 -1
  81. package/plugins/src/base/agents/linear-prd-intake.md +1 -1
  82. package/plugins/src/base/agents/notion-prd-intake.md +1 -1
  83. package/plugins/src/base/commands/intake.md +1 -1
  84. package/plugins/src/base/commands/project-ideation.md +3 -3
  85. package/plugins/src/base/commands/repair-intake.md +6 -0
  86. package/plugins/src/base/commands/research.md +3 -3
  87. package/plugins/src/base/commands/setup-automations.md +6 -0
  88. package/plugins/src/base/commands/tear-down-automations.md +6 -0
  89. package/plugins/src/base/commands/verify-prd.md +2 -2
  90. package/plugins/src/base/rules/config-resolution.md +60 -0
  91. package/plugins/src/base/rules/intent-routing.md +4 -3
  92. package/plugins/src/base/rules/prd-lifecycle-rollup.md +10 -2
  93. package/plugins/src/base/rules/repo-scope-split.md +18 -1
  94. package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +11 -1
  95. package/plugins/src/base/skills/confluence-write-prd/SKILL.md +103 -0
  96. package/plugins/src/base/skills/github-build-intake/SKILL.md +13 -0
  97. package/plugins/src/base/skills/github-prd-intake/SKILL.md +15 -1
  98. package/plugins/src/base/skills/github-write-issue/SKILL.md +13 -4
  99. package/plugins/src/base/skills/github-write-prd/SKILL.md +100 -0
  100. package/plugins/src/base/skills/implement/SKILL.md +13 -6
  101. package/plugins/src/base/skills/intake/SKILL.md +3 -2
  102. package/plugins/src/base/skills/jira-build-intake/SKILL.md +13 -0
  103. package/plugins/src/base/skills/jira-write-ticket/SKILL.md +8 -0
  104. package/plugins/src/base/skills/linear-build-intake/SKILL.md +13 -0
  105. package/plugins/src/base/skills/linear-prd-intake/SKILL.md +11 -1
  106. package/plugins/src/base/skills/linear-write-issue/SKILL.md +10 -2
  107. package/plugins/src/base/skills/linear-write-prd/SKILL.md +90 -0
  108. package/plugins/src/base/skills/notion-access/SKILL.md +2 -0
  109. package/plugins/src/base/skills/notion-prd-intake/SKILL.md +11 -1
  110. package/plugins/src/base/skills/notion-write-prd/SKILL.md +107 -0
  111. package/plugins/src/base/skills/prd-source-write/SKILL.md +80 -0
  112. package/plugins/src/base/skills/project-ideation/SKILL.md +183 -80
  113. package/plugins/src/base/skills/repair-intake/SKILL.md +403 -0
  114. package/plugins/src/base/skills/research/SKILL.md +19 -3
  115. package/plugins/src/base/skills/setup-automations/SKILL.md +78 -0
  116. package/plugins/src/base/skills/tear-down-automations/SKILL.md +34 -0
  117. package/plugins/src/base/skills/tracker-build-intake/SKILL.md +4 -0
  118. package/plugins/src/base/skills/verify-prd/SKILL.md +41 -38
  119. package/plugins/src/expo/commands/exploratory-qa.md +3 -3
  120. package/plugins/src/expo/skills/exploratory-qa/SKILL.md +48 -18
  121. package/plugins/src/harper-fabric/commands/exploratory-qa.md +3 -3
  122. package/plugins/src/harper-fabric/skills/exploratory-qa/SKILL.md +48 -18
  123. package/plugins/src/rails/commands/exploratory-qa.md +3 -3
  124. package/plugins/src/rails/skills/exploratory-qa/SKILL.md +48 -18
  125. package/plugins/src/wiki/skills/lisa-wiki-ingest/SKILL.md +30 -1
@@ -0,0 +1,403 @@
1
+ ---
2
+ name: repair-intake
3
+ description: "Vendor-agnostic repair scanner — the recovery counterpart to lisa:intake. Where intake claims `ready` work, repair-intake finds work that got stuck: items left in `blocked`, or stalled in an in-progress role (build `claimed`, PRD `in_review`) after a processing cycle died and nobody picked it back up. Scans the same queues lisa:intake serves (Notion / Confluence / Linear / GitHub PRD databases; JIRA / GitHub / Linear build queues), enumerates stuck candidates, and repairs the first materially actionable one per cycle: resumes stalled in-progress work IN PLACE (build → the vendor agent + the scanner's post-agent transition; PRD → the source `*-to-tracker` dry-run validate→route pipeline), re-validates blocked PRDs when new clarifying answers exist, and re-dispatches blocked build items whose `is blocked by` dependencies have since closed. One actionable repair per invocation, idempotent, loop-protected via a [lisa-repair-intake] marker + state fingerprint + backoff. Never mutates product-owned states (`draft`, `shipped`, `verified`) and never closes PRDs. Designed as a /schedule cron target running alongside lisa:intake."
4
+ allowed-tools: ["Skill", "Bash", "Read", "Write", "Edit", "mcp__linear-server__list_teams", "mcp__linear-server__list_projects", "mcp__linear-server__get_project", "mcp__linear-server__save_project", "mcp__linear-server__list_project_labels", "mcp__linear-server__list_issues", "mcp__linear-server__get_issue", "mcp__linear-server__save_issue", "mcp__linear-server__list_comments", "mcp__linear-server__save_comment", "mcp__linear-server__list_issue_labels", "mcp__linear-server__create_issue_label"]
5
+ ---
6
+
7
+ # Repair Intake: $ARGUMENTS
8
+
9
+ Run one batch-**repair** cycle against the queue identified by `$ARGUMENTS`. Where `lisa:intake`
10
+ scans the `ready` role and moves work *forward*, repair-intake scans the **stuck** roles and
11
+ moves work *unstuck*:
12
+
13
+ - **Stalled in-progress** — an item left in an in-progress role (build `claimed`, PRD
14
+ `in_review`) whose processing cycle died. It is technically "being worked" but nothing is
15
+ happening, so it sits ignored forever. (The vendor PRD intakes explicitly leave an errored PRD
16
+ in `in_review` "for the human to investigate from there" — that orphan is exactly what this
17
+ skill recovers.)
18
+ - **Recoverable blocked** — an item in `blocked` whose blocker may now be gone: an
19
+ `is blocked by` dependency has since closed, clarifying questions have been answered, or
20
+ research/waiting resolves the ambiguity that stopped it.
21
+
22
+ This skill is the symmetric counterpart to `lisa:intake`. It reuses the same queue-detection,
23
+ the same agent-team orchestration, the same "don't ask, just run" confirmation policy, and the
24
+ same per-item surfaces the vendor intakes use (`lisa:<source>-to-tracker` dry-run for PRDs;
25
+ `lisa:<tracker>-agent` + the scanner's lifecycle transitions for build) — it differs only in
26
+ *which roles it scans* and *that it skips the claim step* (the item is already claimed/blocked).
27
+
28
+ ## Public contract
29
+
30
+ ```text
31
+ /lisa:repair-intake <queue> [intake_mode=prd|build|both] [stale_after=24h] [max_candidates=100] [force=true]
32
+ ```
33
+
34
+ | Token | Meaning | Default |
35
+ |-------|---------|---------|
36
+ | `<queue>` | Same queue identifier `lisa:intake` accepts (see Source dispatch). Required. | — |
37
+ | `intake_mode` | `prd` \| `build` \| `both`. Only meaningful for a GitHub `org/repo` (or bare `github`) that hosts both PRD and build label namespaces. `both` is unique to repair — a repair sweep usefully covers both lifecycles in one schedule. Absent → prefer PRD when both namespaces exist, else whichever exists (matches `lisa:intake`). | (infer) |
38
+ | `stale_after` | How long with no observable activity before an in-progress item counts as stalled. Accepts `24h`, `90m`, `2d`, or `0` (treat any in-progress item as stalled — manual recovery, also the only way to resume work on a provider that exposes no reliable timestamp). Overrides config. | `24h` |
39
+ | `max_candidates` | Cap on how many stuck items to enumerate while looking for the first actionable one. Bounds scan cost. Overrides config. | `100` |
40
+ | `force` | `true` bypasses the loop-prevention backoff window (so a manual re-run re-attempts items even if their fingerprint is unchanged). It does **not** change the staleness rule — use `stale_after=0` for that. | `false` |
41
+
42
+ ## Confirmation policy
43
+
44
+ Do NOT ask the caller whether to proceed. Once invoked with a queue, run the cycle to
45
+ completion. The caller (a human at the CLI or a scheduled cron) has already authorized the run
46
+ by invoking the skill; re-prompting defeats the purpose of a background repair sweep.
47
+
48
+ Specifically forbidden:
49
+
50
+ - Previewing projected scope (number of stuck items, projected re-dispatch count, write counts)
51
+ and asking whether to continue.
52
+ - Offering A/B/C-style choices like "repair / skip / report-only" — the documented behavior IS
53
+ the default.
54
+ - Pausing because many items are stuck, an item looks complex, or a repair is likely to land
55
+ the item back in `blocked`. Returning an item to `blocked` with a current, accurate note is a
56
+ valid outcome of the repair lifecycle, not a failure.
57
+ - Pausing because a re-dispatch looks expensive. The cost of one cycle is bounded (one
58
+ actionable repair); the cost of stalling a scheduled cron waiting on a human is unbounded.
59
+
60
+ The only legitimate reasons to stop early:
61
+
62
+ - Missing required input (no queue argument, missing project configuration). Surface the
63
+ missing value and exit.
64
+ - The queue itself is misconfigured (Status property missing expected values, JIRA workflow
65
+ can't reach required transitions). Surface and exit.
66
+ - No stuck items, or none actionable this cycle. Exit cleanly with the idle-case summary.
67
+
68
+ ## Orchestration: agent team
69
+
70
+ If you are NOT already operating inside an agent team (no prior successful team-creation or
71
+ subagent-delegation tool call in this session, not spawned into a team context), the very first
72
+ thing you do is establish team orchestration.
73
+
74
+ Use the team tool for the current runtime:
75
+
76
+ - Claude: use `TeamCreate`. If `TeamCreate` has not been loaded yet, first use `ToolSearch` with
77
+ `query: "select:TeamCreate"` to load its schema.
78
+ - Codex: do not call `TeamCreate`; Codex does not expose that Claude tool. Use `tool_search`
79
+ with a query like `multi-agent tools` to load `multi_agent_v1`, then use
80
+ `multi_agent_v1.spawn_agent` for teammate delegation. Treat the first successful `spawn_agent`
81
+ call as establishing team orchestration.
82
+ - Other runtimes: use the current runtime's tool-discovery mechanism to discover and call the
83
+ appropriate multi-agent/team tool.
84
+
85
+ If no team creation or subagent delegation tool is available, explicitly state that team
86
+ orchestration is unavailable in this runtime, continue as the lead agent, and preserve the
87
+ workflow's review, verification, and task-tracking obligations locally.
88
+
89
+ Until the team is established, the first Codex teammate has been spawned, or the no-team
90
+ fallback has been declared, do NOT call any of: `Agent`, `TaskCreate`, `Skill`, MCP tools
91
+ (Atlassian / Linear / GitHub / Notion), `Read`, `Write`, `Edit`, `Bash`, `Grep`, `Glob`.
92
+ Scanning the queue, evaluating staleness, and dispatching per-item repairs — all of those are
93
+ tasks for the team you are about to create, not for the lead session before orchestration
94
+ exists.
95
+
96
+ If you ARE already inside an agent team (e.g., a teammate invoked this skill via the Skill
97
+ tool), do NOT create a second team — many harnesses reject double-creates. Continue within the
98
+ existing team. The cycle's outer team is created by repair-intake. Each per-item repair it runs
99
+ (`lisa:<source>-to-tracker` for a PRD, `lisa:<tracker>-agent` for a build item) executes within
100
+ the same team — those skills' orchestration preambles detect the existing team and skip creating
101
+ a second one. One team per cron cycle.
102
+
103
+ ## Source dispatch
104
+
105
+ Detect the queue type from `$ARGUMENTS` using the **exact same detection and disambiguation
106
+ rules as `lisa:intake`** — read that skill's "Source dispatch" section for the authoritative
107
+ table; the detection is identical and only the per-item action changes (repair instead of
108
+ claim-and-advance). The essentials, inlined here so this skill is self-complete:
109
+
110
+ | If `$ARGUMENTS` is... | Queue / lifecycle | Source/tracker key | Stuck roles repaired |
111
+ |------------------------|-------------------|--------------------|----------------------|
112
+ | Notion **database** URL/ID | PRD (Notion) | source=notion | `in_review`, `blocked` |
113
+ | Confluence **space** URL/key | PRD (Confluence) | source=confluence | `in_review`, `blocked` (parent-page roles) |
114
+ | Confluence **parent page** URL/ID | PRD (Confluence, narrowed) | source=confluence | `in_review`, `blocked` |
115
+ | Linear **workspace** URL, **team** URL/key, or literal `linear` | PRD (Linear) | source=linear | `in_review`, `blocked` (project labels) |
116
+ | GitHub **repo** URL / `org/repo` (PRD namespace) | PRD (GitHub) | source=github | `in_review`, `blocked` (PRD labels) |
117
+ | GitHub **repo** URL / `org/repo` with `tracker = github` (build namespace) | Build (GitHub) | tracker=github | `claimed`, `blocked` (build labels) |
118
+ | Literal `github` | GitHub; route by `intake_mode` (`prd` / `build` / `both`) | per lifecycle | per lifecycle above |
119
+ | JIRA project key or full JQL | Build (JIRA) | tracker=jira | `claimed`, `blocked` (statuses) |
120
+
121
+ Disambiguation (same as `lisa:intake`): a `notion.so`/`notion.site` URL → Notion; an Atlassian
122
+ `/wiki/spaces/<KEY>` URL → Confluence (with `/pages/<id>` → parent-page narrowing); a
123
+ `linear.app` workspace/team URL or literal `linear` → Linear; a `github.com` URL / `<org>/<repo>`
124
+ token / literal `github` → GitHub; a bare token matching the JIRA project-key regex → JIRA
125
+ (else try Confluence space, then Linear team); a string with JQL operators → JQL. **A single-item
126
+ URL is out of scope** — this skill is batch-only; repair one item by hand via `lisa:implement`
127
+ (build) or by re-running `lisa:<source>-to-tracker` (PRD).
128
+
129
+ Role names for every vendor are resolved from `.lisa.config.json` per the `config-resolution`
130
+ rule — never hardcode status/label strings. The relevant stuck roles:
131
+
132
+ | Lifecycle | Vendor | In-progress role key | Blocked role key |
133
+ |-----------|--------|----------------------|------------------|
134
+ | Build | JIRA | `jira.workflow.claimed` (`In Progress`) | `jira.workflow.blocked` (`Blocked`) |
135
+ | Build | GitHub | `github.labels.build.claimed` (`status:in-progress`) | `github.labels.build.blocked` (`status:blocked`) |
136
+ | Build | Linear | `linear.labels.build.claimed` (`status:in-progress`) | `linear.labels.build.blocked` (`status:blocked`) |
137
+ | PRD | Notion | `notion.values.in_review` (`In Review`) | `notion.values.blocked` (`Blocked`) |
138
+ | PRD | GitHub | `github.labels.prd.in_review` (`prd-in-review`) | `github.labels.prd.blocked` (`prd-blocked`) |
139
+ | PRD | Linear | `linear.labels.prd.in_review` (`prd-in-review`) | `linear.labels.prd.blocked` (`prd-blocked`) |
140
+ | PRD | Confluence | `confluence.parents.in_review` (page id) | `confluence.parents.blocked` (page id) |
141
+
142
+ Resolve with the standard role-read pattern (local overrides global, default fallback):
143
+
144
+ ```bash
145
+ read_role() {
146
+ local path="$1" default="$2"
147
+ local local_v global_v
148
+ local_v=$(jq -r "${path} // empty" .lisa.config.local.json 2>/dev/null)
149
+ global_v=$(jq -r "${path} // empty" .lisa.config.json 2>/dev/null)
150
+ echo "${local_v:-${global_v:-$default}}"
151
+ }
152
+ # e.g. build/github:
153
+ CLAIMED=$(read_role '.github.labels.build.claimed' 'status:in-progress')
154
+ BLOCKED=$(read_role '.github.labels.build.blocked' 'status:blocked')
155
+ ```
156
+
157
+ ## Access layer (which surface does each write)
158
+
159
+ repair-intake stays vendor-neutral; concrete reads/writes go through the same layers the vendor
160
+ intakes use. Never call Atlassian MCP or `acli` directly — go through `lisa:atlassian-access`.
161
+
162
+ | Vendor | Reads (scan / comments / links) | Writes (transition / comment) | Re-dispatch / re-validate |
163
+ |--------|---------------------------------|-------------------------------|---------------------------|
164
+ | JIRA (build) | `lisa:atlassian-access` `search-issues` / `lisa:jira-read-ticket` | `lisa:atlassian-access` `transition` / `comment` | `lisa:jira-agent` |
165
+ | GitHub (build) | `gh issue list` / `gh issue view --json` / `gh pr list` | `gh issue edit` (labels) / `gh issue comment` | `lisa:github-agent` |
166
+ | Linear (build) | Linear MCP `list_issues` / `get_issue` / `list_comments` | Linear MCP `save_issue` (labels) / `save_comment` | `lisa:linear-agent` |
167
+ | Notion (PRD) | `lisa:notion-access` (`query`, page comments) | `lisa:notion-access` `write-page` (status) / page comment | `lisa:notion-to-tracker` (dry-run) |
168
+ | GitHub (PRD) | `gh issue list/view` (PRD labels) | `gh issue edit` / `gh issue comment` | `lisa:github-to-tracker` (dry-run) |
169
+ | Linear (PRD) | Linear MCP `list_projects` / `get_project` (+ sentinel feedback issue) | Linear MCP `save_project` (labels) / `save_comment` | `lisa:linear-to-tracker` (dry-run) |
170
+ | Confluence (PRD) | `lisa:atlassian-access` CQL | `lisa:atlassian-access` page `parentId` update / comment | `lisa:confluence-to-tracker` (dry-run) |
171
+
172
+ ## Staleness model
173
+
174
+ An in-progress item (build `claimed`, PRD `in_review`) is **stalled** only if it shows no
175
+ observable activity newer than the `stale_after` threshold. `blocked` items are NOT gated on
176
+ staleness — their repairability is judged on current blocker/answer state, not elapsed time.
177
+
178
+ ### Threshold resolution
179
+
180
+ 1. `$ARGUMENTS` `stale_after=<dur>` (one-off override) — always wins. Parse `Nh` / `Nm` / `Nd` /
181
+ `0` into hours.
182
+ 2. `.lisa.config.json` `intake.repair.staleAfterHours` (durable project default).
183
+ 3. Built-in default: **24 hours**.
184
+
185
+ `stale_after=0` means "treat any in-progress item as stalled" — a manual full-recovery lever,
186
+ and the only way to resume work on a provider that exposes no reliable activity timestamp.
187
+
188
+ ### Activity signal (most-recent-wins, portable across vendors)
189
+
190
+ Compute the item's newest activity timestamp from the highest-priority signal the vendor
191
+ exposes, and compare it to `now - stale_after`:
192
+
193
+ 1. Provider-native item `updatedAt` / `last_edited_time` / `updated`.
194
+ 2. Latest lifecycle/progress **comment** on the item (and, for Linear PRDs, the sentinel
195
+ feedback issue).
196
+ 3. For build items, latest **PR activity** on the linked PR: newest commit, review, check-run,
197
+ or PR comment.
198
+ 4. Status/label **transition** time, when the provider exposes it cleanly.
199
+
200
+ If ANY of these is newer than the threshold, the item is **active** → record it as `active` and
201
+ skip it (read-only). For build `claimed`, an open PR with recent commits/checks is active. For
202
+ PRD `in_review`, a recent comment or page edit is active.
203
+
204
+ If a provider cannot expose any reliable timestamp, do **not** auto-resume its in-progress
205
+ items unless the caller passed `stale_after=0`. (Dependency-cleared `blocked` repair still
206
+ proceeds — it is judged on blocker state, not time.)
207
+
208
+ ## Repair decision tree
209
+
210
+ Apply per candidate. Stop the cycle after the **first** candidate that triggers a write
211
+ (lifecycle transition, re-dispatch, or refreshed note). Everything examined before it is
212
+ recorded read-only.
213
+
214
+ ### Build `claimed` (stalled in-progress) → resume in place
215
+
216
+ After the staleness gate passes, run the **same per-item sequence the vendor build-intake runs**,
217
+ skipping the claim transition (the item is already `claimed`):
218
+
219
+ 1. Dispatch the item to the vendor agent — `lisa:jira-agent` / `lisa:github-agent` /
220
+ `lisa:linear-agent` (matching the queue's tracker) — with the item ref. This resumes the work
221
+ in place, preserving its existing branch/PR and prior comments.
222
+ 2. **On agent success**, apply the scanner's post-agent transition yourself: `claimed → done`,
223
+ where `done` is **env-resolved** exactly as `lisa:<tracker>-build-intake` resolves it (per
224
+ `config-resolution` env-keyed `done`: explicit `target_env` arg wins; else reverse-lookup the
225
+ env from the resulting PR's base branch via `deploy.branches`; if `done` is a map and env is
226
+ unresolvable, fail loudly — never guess). repair-intake owns this transition because it is
227
+ standing in for the scanner that never got to finish it.
228
+ 3. **On a surfaced blocker** (agent reports it cannot proceed), leave/move the item to `blocked`
229
+ with a `[lisa-repair-intake]` note (see Loop prevention).
230
+
231
+ > Do **not** reset stalled in-progress items to `ready`. Reset throws away state, makes a
232
+ > partially-built item look freshly human-approved to the next `lisa:intake` claim, and forces a
233
+ > two-cycle recovery. Resume in place.
234
+
235
+ ### Build `blocked` → re-evaluate, unblock if cleared
236
+
237
+ 1. Read the block reason and dependencies (see Dependency clearing).
238
+ 2. If every parsed blocker is **cleared** → move `blocked → claimed`, then run the same
239
+ agent-dispatch + post-agent `claimed → done` sequence as the stalled-`claimed` path above
240
+ (one-cycle recovery). If the agent re-blocks, move back to `blocked` — a valid outcome.
241
+ 3. If the block was an **ambiguity** research can settle and no dependency remains → run the
242
+ research needed (`lisa:codebase-research` / `lisa:product-walkthrough`); if resolved, proceed
243
+ as in (2).
244
+ 4. Else → still blocked. Refresh the note with the current reason (Loop prevention) and leave it
245
+ `blocked`.
246
+
247
+ ### PRD `in_review` (stalled in-progress) → re-run validate→route
248
+
249
+ After the staleness gate passes, run the **same dry-run validate→route pipeline the vendor PRD
250
+ intake runs per item**, targeted at this single PRD and **skipping the claim** (it is already
251
+ `in_review`):
252
+
253
+ 1. Invoke `lisa:<source>-to-tracker` with `dry_run: true` and the PRD's URL (source = the queue's
254
+ PRD vendor: `notion-to-tracker` / `confluence-to-tracker` / `linear-to-tracker` /
255
+ `github-to-tracker`). This indirectly runs `lisa:tracker-source-artifacts`,
256
+ `lisa:product-walkthrough`, and the `lisa:tracker-validate` gate, returning a structured
257
+ PASS/FAIL report with `prd_anchor` snippets — the same report the PRD intake consumes.
258
+ 2. **On PASS** → re-invoke `lisa:<source>-to-tracker` with `dry_run: false` to write the tickets
259
+ (its full run already writes the PRD back-link via `lisa:prd-backlink`), run the
260
+ `lisa:prd-ticket-coverage` audit as the PRD intake does, then transition the PRD to its
261
+ `ticketed` role via the access layer.
262
+ 3. **On FAIL** → post the clarifying-question comments grouped by `prd_anchor` (page-level for
263
+ `prd_anchor: null`), tagged `[lisa-repair-intake]` (Loop prevention), and transition to
264
+ `blocked`.
265
+
266
+ ### PRD `blocked` → re-validate if new answers exist
267
+
268
+ 1. Determine whether **new clarifying answers** exist: any comment/update on the PRD newer than
269
+ the last `[lisa-repair-intake]` note or the original `blocked` note. For Linear include the
270
+ sentinel feedback issue and anchored sub-issue comments; for Confluence include inline/footer
271
+ comments where the access layer exposes them; for Notion include page comments and
272
+ `last_edited_time`.
273
+ 2. If new answers exist → run the `lisa:<source>-to-tracker` dry-run validate→route pipeline as
274
+ in PRD `in_review` above (skipping claim). PASS → `ticketed`; FAIL → refresh note, stay
275
+ `blocked`.
276
+ 3. If no new answers and no dependency change → leave `blocked` untouched (subject to the
277
+ backoff window — do not re-post an identical note).
278
+
279
+ ## Dependency clearing (conservative, vendor-specific extraction)
280
+
281
+ `lisa:tracker-read` is a thin dispatcher that returns each vendor's bundle **verbatim** — there
282
+ is no normalized `is blocked by` field. Read the bundle, then extract blockers per vendor:
283
+
284
+ - **GitHub**: parse the durable forms `lisa:github-build-intake` documents — `Blocked by: #123`,
285
+ qualified cross-repo refs (`owner/repo#123`), issue URLs in the body/comments — plus timeline
286
+ cross-reference events.
287
+ - **JIRA**: inspect the native issue-link records `lisa:jira-read-ticket` returns and select the
288
+ `is blocked by` link type.
289
+ - **Linear**: inspect the native issue **relations** from Linear MCP `get_issue` and select
290
+ blocker relations.
291
+
292
+ Then classify each blocker:
293
+
294
+ - **Closed / Done** (its true terminal role) → **cleared**.
295
+ - **Open** in any non-terminal role (`ready` / `claimed` / `review` / unknown) → **still
296
+ blocking**.
297
+ - **Inaccessible** (deleted, cross-org, permission denied) → **still blocking**, unless the item
298
+ body or a newer human comment explicitly states the dependency is resolved.
299
+
300
+ Only re-dispatch when **every** parsed blocker is cleared. When in doubt, stay blocked — a
301
+ false-negative (left blocked) is cheap; a false-positive (re-dispatched into a real blocker)
302
+ wastes a build cycle.
303
+
304
+ ## Loop prevention
305
+
306
+ A `blocked` item with a permanently unresolved problem must not be "repaired" and re-noted every
307
+ cron tick.
308
+
309
+ - Every note this skill writes is prefixed `[lisa-repair-intake]` and carries a compact **state
310
+ fingerprint**: the lifecycle role, the set of blocker refs + their observed states, the
311
+ validation verdict (PASS/FAIL), and a timestamp.
312
+ - Before writing a note or re-attempting a `blocked` item, compute the current fingerprint. If
313
+ an identical fingerprint was already posted within the **backoff window**, skip the item
314
+ silently (record as `still_blocked` / `active`, no write).
315
+ - Backoff window default = `stale_after` (24h). `force=true` bypasses backoff for a manual run.
316
+ - A *changed* fingerprint (new blocker state, new answers, new verdict) always warrants a fresh
317
+ note + re-attempt — backoff suppresses only no-op repeats.
318
+
319
+ ## Lifecycle ownership guard
320
+
321
+ repair-intake owns ONLY the four stuck roles: build `claimed` / `blocked` and PRD `in_review` /
322
+ `blocked`, plus the transitions a stuck item legitimately moves through during recovery. It MAY:
323
+
324
+ - Apply the build scanner's post-agent `claimed → done` on a successful resume (it is finishing
325
+ the scanner's interrupted job), and move a dependency-cleared build item `blocked → claimed`.
326
+ - Move a re-validated PRD `in_review`/`blocked → ticketed` (PASS) or `→ blocked` (FAIL), exactly
327
+ as the PRD intake does.
328
+
329
+ It MUST NOT:
330
+
331
+ - Move a PRD out of `draft`, `shipped`, or `verified`, or close/archive any PRD (those are
332
+ product- and rollup-owned — see `prd-lifecycle-rollup`).
333
+ - Apply a build `done` value other than via the env-resolution rules, or close a native item at
334
+ any value other than the true terminal `done` (see `leaf-only-lifecycle`).
335
+ - Touch `ready` items (that is `lisa:intake`'s lane).
336
+
337
+ ## Cycle behavior
338
+
339
+ 1. **Resolve the queue** — detect vendor/lifecycle (Source dispatch); resolve stuck role names
340
+ from config. For JIRA, confirm the needed transitions are reachable; stop on misconfig.
341
+ 2. **Enumerate stuck candidates** — query the in-progress role(s) and the `blocked` role for the
342
+ detected lifecycle(s), up to `max_candidates`, via the Access layer reads.
343
+ 3. **Order deterministically**, highest repair-confidence first:
344
+ 1. `blocked` items whose dependencies are now **cleared** (safe, high-value, one-cycle wins),
345
+ 2. `blocked` items with **new clarifying answers**,
346
+ 3. **stalled** in-progress items, oldest activity first.
347
+ 4. **Walk the ordered list**, evaluating each read-only (staleness, dependency, answer checks),
348
+ and **repair the first candidate that is actionable** per the decision tree. Stop after that
349
+ one write-producing repair.
350
+ 5. **Empty / nothing actionable** → exit cleanly:
351
+ `"No stuck items actionable this cycle (examined N, all active or in backoff)."`
352
+ 6. **Failure isolation** — if evaluating one candidate errors, record it under Errors and
353
+ continue to the next; one bad item never aborts the cycle.
354
+
355
+ Process **at most one materially actionable repair per invocation** — scan many, repair one,
356
+ exit. This matches `lisa:intake`'s one-item-per-cycle contract: bounded cost, low race risk, no
357
+ surprise burst of PRs. Throughput is the scheduler's job, not one invocation's.
358
+
359
+ ## Summary report
360
+
361
+ Report outcomes in these buckets:
362
+
363
+ - `resumed` — stalled in-progress work re-dispatched in place.
364
+ - `unblocked` — blocker cleared (or answers resolved); re-dispatched or transitioned to
365
+ `ticketed`.
366
+ - `still_blocked` — examined and intentionally left `blocked`, with the active reason.
367
+ - `active` — skipped because current work is not stale (or within backoff).
368
+ - `errors` — items that failed evaluation, with the error.
369
+
370
+ State the single item repaired this cycle (if any) and what action was taken.
371
+
372
+ ## Schedule examples
373
+
374
+ ```text
375
+ /schedule "every 2 hours" /lisa:repair-intake https://www.notion.so/<workspace>/<database-id>
376
+ /schedule "every 2 hours" /lisa:repair-intake https://linear.app/acme
377
+ /schedule "every 2 hours" /lisa:repair-intake acme/product-prds
378
+ /schedule "every 2 hours" /lisa:repair-intake acme/frontend-v2 intake_mode=build
379
+ /schedule "every 2 hours" /lisa:repair-intake github intake_mode=both
380
+ /schedule "every 4 hours" /lisa:repair-intake SE stale_after=12h
381
+ /lisa:repair-intake SE stale_after=0 force=true # manual: treat all in-progress as stalled, ignore backoff
382
+ ```
383
+
384
+ Run repair-intake **less frequently than** `lisa:intake` (the ready queue moves faster than
385
+ stuck work accumulates), or interleaved on a longer cadence.
386
+
387
+ ## Rules
388
+
389
+ - Never run a cycle without an explicit queue. Side effects too high to default.
390
+ - Never reset stalled in-progress items to `ready` — resume in place (decision tree).
391
+ - Never mutate product-owned states (`draft`, `shipped`, `verified`) or close PRDs (Lifecycle
392
+ ownership guard).
393
+ - Apply build `done` ONLY via the env-resolution rules, and trigger native closure only at the
394
+ true terminal `done` value (`leaf-only-lifecycle`).
395
+ - Never re-dispatch a `blocked` build item unless every parsed blocker is cleared (conservative
396
+ dependency clearing).
397
+ - One materially actionable repair per cycle. Stop after the first write-producing repair.
398
+ - Honor the backoff window — never re-post an identical `[lisa-repair-intake]` note within it
399
+ (unless `force=true`).
400
+ - Never run two repair cycles concurrently against overlapping queues, and never run
401
+ repair-intake against a queue `lisa:intake` is concurrently draining — the scheduling layer is
402
+ responsible for serialization.
403
+ - Stop and surface failures rather than retry-loop.
@@ -1,12 +1,21 @@
1
1
  ---
2
2
  name: research
3
- description: "Research a problem space and produce a PRD. Investigates the codebase, defines user flows, assesses technical feasibility, and outputs a specification ready to hand to the Plan flow. Vendor-agnostic the resulting PRD lands wherever the configured destination is (Notion, Confluence, file, etc.)."
3
+ description: "Research a problem space and create a PRD in the configured PRD source. Investigates the codebase, defines user flows, assesses technical feasibility, synthesizes the spec, then creates it in the source (Notion / Confluence / GitHub / Linear per .lisa.config.json `source`) via lisa:prd-source-write — there is no loose document artifact. Vendor-agnostic. Accepts an optional `prd_ready` flag (default false → the PRD is created in the `draft` role; true → created `ready` so lisa:intake auto-claims it) and an optional dedupe `marker`/`dedupe_key` (used when invoked by lisa:project-ideation) so re-runs reference the existing PRD instead of duplicating it."
4
4
  allowed-tools: ["Skill", "Bash", "Read", "Glob", "Grep"]
5
5
  ---
6
6
 
7
7
  # Research
8
8
 
9
- Produce a PRD for the problem in `$ARGUMENTS`.
9
+ Produce a PRD for the problem in `$ARGUMENTS`, then create it in the configured PRD source.
10
+
11
+ ## Inputs
12
+
13
+ - The problem statement / feature idea (required) — free text, a feasibility card, or a URL.
14
+ - `prd_ready` (optional, default `false`) — `false` creates the PRD in the source's `draft` role for
15
+ human review; `true` creates it in the `ready` role so `lisa:intake` (PRD side) auto-claims it.
16
+ - `dedupe_key` / `marker` (optional) — a stable dedupe marker (e.g. supplied by
17
+ `lisa:project-ideation`) embedded in the created PRD so re-runs reference the existing PRD rather
18
+ than creating a duplicate.
10
19
 
11
20
  ## Orchestration: agent team
12
21
 
@@ -30,4 +39,11 @@ Execute the **Research** flow as defined in the `intent-routing` rule (loaded vi
30
39
 
31
40
  ## Output
32
41
 
33
- A PRD that includes (per the intent-routing rule's Research flow definition): context, problem statement, user flows, acceptance criteria, technical feasibility notes, and any open questions. The PRD lands in the configured destination (Notion database, Confluence space, local markdown file) per project config. The Plan flow consumes it next.
42
+ A PRD **created in the configured PRD source** (per the intent-routing rule's Research flow
43
+ definition) containing: context, problem statement, user flows, acceptance criteria, technical
44
+ feasibility notes, open questions, and the "Recommended Tooling for Plan Phase" section. The final
45
+ flow step invokes `lisa:prd-source-write`, which creates the PRD in the configured `source` (Notion
46
+ page in the PRD database, Confluence page under the lifecycle parent, GitHub issue, or Linear
47
+ project) in the `draft` role by default or `ready` when `prd_ready=true`. **The PRD lives in the
48
+ source — there is no loose document artifact.** A `source` must be configured; if it is not, stop and
49
+ report it rather than emitting a document. The Plan flow consumes the created PRD next.
@@ -0,0 +1,78 @@
1
+ ---
2
+ name: setup-automations
3
+ description: "Set up the recurring Lisa automations on the local workstation using the CURRENT runtime's native scheduler — Codex automations (the native automations / automation_update mechanism) or, on Claude, /schedule. This skill is a declarative specification: it states WHICH automations to create, how often, and with which parameters; it does not template schedule files or run scheduling code itself — the runtime's native automation mechanism does the creating. Creates five automations: intake-repair (every 60 min), intake PRD (every 60 min), intake tickets (every 10 min), exploratory-bugs (once a day), exploratory-prds (once a day). Two flags — auto-start-prds and auto-start-tickets — control whether the ideated PRDs / filed bug tickets are created auto-pickup-ready (prd_ready / ready) or left for human review (default false). Tear down with /tear-down-automations."
4
+ allowed-tools: ["Skill", "Bash", "Read"]
5
+ ---
6
+
7
+ # Set up Lisa automations: $ARGUMENTS
8
+
9
+ This skill is a **specification, not a script.** It tells the current runtime which recurring Lisa
10
+ automations to create, on what cadence, and with which parameters — and the runtime creates them
11
+ with its **native** scheduling mechanism. Do **not** hand-template schedule files or write shell to
12
+ create them; invoke the runtime's automation tool with the spec below.
13
+
14
+ ## Runtime scheduler (branch on the current runtime)
15
+
16
+ - **Codex** → create Codex **automations** via the native automations mechanism (prefer the
17
+ `automation_update` tool over hand-writing `~/.codex/automations/<id>/automation.toml`; the TOML is
18
+ only its backing store). Set the execution environment to **local** so they run on this
19
+ workstation, scoped to this project's working directory.
20
+ - **Claude** → use **`/schedule`** to create local recurring routines, one per automation below.
21
+ - **Other runtimes** → use the runtime's native recurring-task mechanism. If the runtime has none,
22
+ state that scheduling is unavailable and stop.
23
+
24
+ ## Parameters
25
+
26
+ - `auto-start-prds` (default **false**) — passed as `prd_ready` to the **exploratory-prds**
27
+ automation. `true` → ideated PRDs are created `prd-ready` (auto-picked-up by PRD intake); `false` →
28
+ created as drafts for human review.
29
+ - `auto-start-tickets` (default **false**) — passed as `ready` to the **exploratory-bugs**
30
+ automation. `true` → filed bug/usability tickets are created build-ready (auto-picked-up by ticket
31
+ intake); `false` → created in the backlog for human triage.
32
+
33
+ Defaults match the underlying skills — nothing auto-starts unless explicitly opted in. The two flags
34
+ affect **only** the two exploratory automations.
35
+
36
+ ## The automations to create
37
+
38
+ Each automation runs **one cycle** of a Lisa command and respects that command's confirmation policy
39
+ (never ask before running; exit cleanly when the queue is idle; report the cycle summary).
40
+
41
+ | Automation | Command it runs | Cadence |
42
+ |---|---|---|
43
+ | **intake-repair** | `/lisa:repair-intake <queue>` | every **60 minutes** |
44
+ | **intake-prd** | `/lisa:intake <PRD queue>` (e.g. `github intake_mode=prd`) | every **60 minutes** |
45
+ | **intake-tickets** | `/lisa:intake <build queue>` (e.g. `github intake_mode=build`) | every **10 minutes** |
46
+ | **exploratory-bugs** | `/lisa-<stack>:exploratory-qa ready=<auto-start-tickets>` | **once a day** |
47
+ | **exploratory-prds** | `/lisa:project-ideation prd_ready=<auto-start-prds>` | **once a day** |
48
+
49
+ For a Codex `rrule`: every 60 min → `FREQ=HOURLY;INTERVAL=1`; every 10 min →
50
+ `FREQ=MINUTELY;INTERVAL=10`; once a day → `FREQ=DAILY;INTERVAL=1`.
51
+
52
+ **Queue resolution.** Resolve the intake/repair queue from `.lisa.config.json` — `source` for the
53
+ PRD queue, `tracker` for the build queue (for the common GitHub case these are `github
54
+ intake_mode=prd` and `github intake_mode=build`, matching how the existing Lisa intake automations
55
+ are written).
56
+
57
+ **Naming + scope (so teardown is precise).** Name each automation with the stable prefix
58
+ `lisa-auto-<project>-` (e.g. `lisa-auto-<project>-intake-tickets`), where `<project>` identifies this
59
+ repo, and scope each to this project's working directory. This lets `/tear-down-automations` find and
60
+ remove exactly this set and never touch other projects' automations or non-Lisa ones. Use a project
61
+ identifier stable across runs and distinct from other repos (don't rely on a bare repo basename when
62
+ it could collide; qualify it, e.g. with the owner).
63
+
64
+ **Idempotent.** Re-running this skill updates the existing `lisa-auto-<project>-*` automations in
65
+ place (same names) rather than creating duplicates.
66
+
67
+ ## Conditions / guards
68
+
69
+ - **exploratory-bugs** is created only when the project ships an `exploratory-qa` command (the
70
+ `expo` / `rails` / `harper-fabric` stacks). If the project has no `exploratory-qa`, skip that
71
+ automation and note it — do not invent a command that doesn't exist.
72
+ - If the runtime has no native scheduler, or the intake queues can't be resolved from config, stop
73
+ and report what's missing rather than guessing.
74
+
75
+ ## Report
76
+
77
+ List each automation created or updated (name, the command it runs, cadence, and the resolved
78
+ `auto-start-prds` / `auto-start-tickets` values), plus any automation skipped and why.
@@ -0,0 +1,34 @@
1
+ ---
2
+ name: tear-down-automations
3
+ description: "Remove every recurring Lisa automation that /setup-automations created for this project (the lisa-auto-<project>-* set: intake-repair, intake-prd, intake-tickets, exploratory-bugs, exploratory-prds) using the CURRENT runtime's native scheduler — Codex automations or, on Claude, /schedule. This skill is a declarative specification: it identifies WHICH automations to remove; it does not run teardown scripts. Removes only this project's Lisa automations — never other projects' automations or non-Lisa ones. The inverse of /setup-automations."
4
+ allowed-tools: ["Skill", "Bash", "Read"]
5
+ ---
6
+
7
+ # Tear down Lisa automations: $ARGUMENTS
8
+
9
+ This skill is a **specification, not a script.** It tells the current runtime which recurring Lisa
10
+ automations to remove — the ones `/setup-automations` created for THIS project — and the runtime
11
+ removes them with its **native** scheduling mechanism.
12
+
13
+ ## Runtime scheduler (branch on the current runtime)
14
+
15
+ - **Codex** → list Codex automations and delete the `lisa-auto-<project>-*` set via the native
16
+ automations mechanism (prefer the native delete over hand-removing
17
+ `~/.codex/automations/<id>/`, which is only the backing store).
18
+ - **Claude** → use **`/schedule`** to list and remove the matching recurring routines.
19
+ - **Other runtimes** → use the runtime's native recurring-task mechanism. If it has none, state that
20
+ and stop.
21
+
22
+ ## Scope (remove only what setup created)
23
+
24
+ - Remove the five automations `/setup-automations` creates for the current project, matched by the
25
+ stable `lisa-auto-<project>-` name prefix: `intake-repair`, `intake-prd`, `intake-tickets`,
26
+ `exploratory-bugs`, `exploratory-prds`.
27
+ - **Never** remove automations for a different project, or any non-Lisa automation (e.g. unrelated
28
+ crawlers/ingestors). Match strictly on the `lisa-auto-<project>-` prefix for THIS project; when in
29
+ doubt about an automation's ownership, leave it and report it rather than deleting it.
30
+ - **Idempotent** — an automation that is already absent is a no-op, not an error.
31
+
32
+ ## Report
33
+
34
+ List each automation removed, and any in the expected set that were already absent.
@@ -39,6 +39,10 @@ This is the claim-time arm of the rule. Its siblings are the write-time labeling
39
39
 
40
40
  The shim never needs to inspect the item itself — it forwards `$ARGUMENTS` verbatim and the resolved vendor scanner runs its Phase 3a gate before any claim.
41
41
 
42
+ ## Repo-scope claim contract (forwarded to every vendor)
43
+
44
+ Equally part of the build-intake API, and forwarded identically: when the tracker oversees multiple repos, each vendor scanner claims only tickets for the repo it is running in. Per the `repo-scope-split` rule's "Claim-time repo scoping" section, before the leaf-only gate each scanner (Phase 3a.0) resolves the current repo (`config-resolution` "Repo scoping": `repo` → `github.repo` → git remote basename), then for each ready candidate: skips a ticket labeled `repo:<other>`, determines + stamps `repo:<name>` on an unlabeled one, splits a multi-repo leaf into single-repo build-ready siblings, and claims only a single-repo leaf for the current repo. This shim does not re-implement the gate — it relies on the vendor scanner's Phase 3a.0 — but the contract is uniform across `jira`, `github`, and `linear` so behavior never drifts by tracker. It is the claim-time complement to the write-time S10 scope gate (`lisa:tracker-validate`) and `task-decomposition` step 1.5; all cite `repo-scope-split`.
45
+
42
46
  ## Terminal native-closure contract (forwarded to every vendor)
43
47
 
44
48
  This shim also forwards the `leaf-only-lifecycle` terminal native-closure contract. It does not decide whether a `done` value is terminal; the vendor scanner resolves that from its own config and deployment topology after the per-item agent succeeds.