@codyswann/lisa 2.187.1 → 2.187.2

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 (65) 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/rules/reference/config-resolution.md +1 -1
  5. package/plugins/lisa/scripts/automation-status-expected-fleet.mjs +4 -3
  6. package/plugins/lisa/skills/repair-intake/SKILL.md +28 -11
  7. package/plugins/lisa-agy/plugin.json +1 -1
  8. package/plugins/lisa-agy/scripts/automation-status-expected-fleet.mjs +4 -3
  9. package/plugins/lisa-agy/skills/repair-intake/SKILL.md +28 -11
  10. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  11. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  12. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  13. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  14. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  15. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  16. package/plugins/lisa-copilot/rules/reference/config-resolution.md +1 -1
  17. package/plugins/lisa-copilot/scripts/automation-status-expected-fleet.mjs +4 -3
  18. package/plugins/lisa-copilot/skills/repair-intake/SKILL.md +28 -11
  19. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  20. package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +1 -1
  21. package/plugins/lisa-cursor/scripts/automation-status-expected-fleet.mjs +4 -3
  22. package/plugins/lisa-cursor/skills/repair-intake/SKILL.md +28 -11
  23. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  24. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  25. package/plugins/lisa-expo-agy/plugin.json +1 -1
  26. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  30. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  31. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  35. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  36. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  37. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  40. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  41. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  45. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  46. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  50. package/plugins/lisa-rails-agy/plugin.json +1 -1
  51. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  55. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  56. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  60. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  61. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  63. package/plugins/src/base/rules/reference/config-resolution.md +1 -1
  64. package/plugins/src/base/scripts/automation-status-expected-fleet.mjs +4 -3
  65. package/plugins/src/base/skills/repair-intake/SKILL.md +28 -11
package/package.json CHANGED
@@ -93,7 +93,7 @@
93
93
  "ws": ">=8.20.1"
94
94
  },
95
95
  "name": "@codyswann/lisa",
96
- "version": "2.187.1",
96
+ "version": "2.187.2",
97
97
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
98
98
  "main": "dist/index.js",
99
99
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -369,7 +369,7 @@ documented defaults, so existing projects need no config change.
369
369
 
370
370
  | Key | Required | Default | Notes |
371
371
  |-----|----------|---------|-------|
372
- | `intake.repair.staleAfterHours` | no | `2` | How long an in-progress item (build `claimed`, PRD `in_review`) may show no observable activity before repair-intake treats it as stalled and resumes it. `blocked` items are judged on blocker/answer state, not this threshold. Overridable per-run via `stale_after=<dur>` in `$ARGUMENTS` (which always wins). The same value is the default backoff window for loop-prevention notes. |
372
+ | `intake.repair.staleAfterHours` | no | `2` | How long an in-progress item (build `claimed`, PRD `in_review`) may sit after its last state-changing transition into the in-progress role, or after the last human / PR-side forward-progress activity, before repair-intake treats it as stalled and resumes it. Automation self-comments and Lisa audit notes do not reset this clock. `blocked` items are judged on blocker/answer state, not this threshold. Overridable per-run via `stale_after=<dur>` in `$ARGUMENTS` (which always wins). The same value is the default backoff window for loop-prevention notes. |
373
373
  | `intake.repair.maxCandidates` | no | `100` | Upper bound on how many stuck items repair-intake enumerates while searching for the first actionable one. Bounds scan cost. Overridable per-run via `max_candidates=<n>`. |
374
374
 
375
375
  ### Monitor audit config (`monitor`)
@@ -263,9 +263,10 @@ function resolveRepairQueueArgument(config, source, tracker) {
263
263
  return "github intake_mode=both";
264
264
  }
265
265
 
266
- throw new Error(
267
- `Unable to resolve a single repair-intake queue for tracker=${String(tracker)} and source=${String(source)} without guessing.`
268
- );
266
+ const buildQueue = resolveBuildQueueArgument(config, tracker);
267
+ return buildQueue.includes("intake_mode=")
268
+ ? buildQueue
269
+ : `${buildQueue} intake_mode=build`;
269
270
  }
270
271
 
271
272
  /**
@@ -80,7 +80,7 @@ lifecycle state with provider-native closure and rollup state.
80
80
  |-------|---------|---------|
81
81
  | `<queue>` | Same queue identifier `lisa:intake` accepts (see Source dispatch). Required. | — |
82
82
  | `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 → `both` when both namespaces exist, else whichever lifecycle exists. | `both` for dual GitHub queues; otherwise infer |
83
- | `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. | `2h` |
83
+ | `stale_after` | How long since the last state-changing transition into the in-progress role, or since the last human / PR-side forward-progress activity, before an in-progress item counts as stalled. Automation self-comments do not reset this clock. 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. | `2h` |
84
84
  | `max_candidates` | Cap on how many stuck/close-out candidates to enumerate and evaluate. Repair every materially actionable candidate within this bounded set, then stop. Overrides config. | `100` |
85
85
  | `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` |
86
86
 
@@ -228,9 +228,19 @@ intakes use. Never call Atlassian MCP or `acli` directly — go through `lisa:at
228
228
 
229
229
  ## Staleness model
230
230
 
231
- An in-progress item (build `claimed`, PRD `in_review`) is **stalled** only if it shows no
232
- observable activity newer than the `stale_after` threshold. `blocked` items are NOT gated on
233
- staleness their repairability is judged on current blocker/answer state, not elapsed time.
231
+ An in-progress item (build `claimed`, PRD `in_review`) is **stalled** when the last
232
+ state-changing transition into the in-progress role, or the last human / PR-side forward-progress
233
+ activity after that transition, is older than the `stale_after` threshold. `blocked` items are NOT
234
+ gated on staleness — their repairability is judged on current blocker/answer state, not elapsed
235
+ time.
236
+
237
+ Automation self-comments are not forward progress and must not reset the staleness clock. Status
238
+ comments like `[claude-build-intake] PR remains open...`, `[codex-build-intake] Follow-up pushed...`,
239
+ or `[lisa-repair-intake] ...` may be useful audit notes, but they cannot make a claimed item fresh
240
+ forever. If a provider exposes a changelog/history surface, prefer the timestamp of the last
241
+ transition into the claimed/In-Progress role over the item's generic `updated` timestamp. When the
242
+ history surface is unavailable, ignore comments whose author/marker clearly belongs to Lisa or its
243
+ automation agents, and use the newest human comment/edit or PR-side progress event instead.
234
244
 
235
245
  A build `claimed` leaf whose linked PR has **already merged** (`state == MERGED`) is likewise NOT
236
246
  gated on staleness. A merged PR is a settled terminal state, not in-flight work: the only thing
@@ -254,17 +264,24 @@ decision tree step 0, and the dedicated high-confidence ordering bucket).
254
264
  `stale_after=0` means "treat any in-progress item as stalled" — a manual full-recovery lever,
255
265
  and the only way to resume work on a provider that exposes no reliable activity timestamp.
256
266
 
257
- ### Activity signal (most-recent-wins, portable across vendors)
267
+ ### Activity signal (state-change first, portable across vendors)
258
268
 
259
- Compute the item's newest activity timestamp from the highest-priority signal the vendor
269
+ Compute the item's newest eligible activity timestamp from the highest-priority signal the vendor
260
270
  exposes, and compare it to `now - stale_after`:
261
271
 
262
- 1. Provider-native item `updatedAt` / `last_edited_time` / `updated`.
263
- 2. Latest lifecycle/progress **comment** on the item (and, for Linear PRDs, the sentinel
264
- feedback issue).
265
- 3. For build items, latest **PR activity** on the linked PR: newest commit, review, check-run,
272
+ 1. Provider-native status/label **transition** time into the in-progress role, when the provider
273
+ exposes it cleanly (JIRA changelog transition to `claimed` / In Progress, GitHub label event,
274
+ Linear state/label history, Notion/Confluence page move/status history).
275
+ 2. Latest human lifecycle/progress **comment** or edit on the item (and, for Linear PRDs, the
276
+ sentinel feedback issue). Exclude automation self-comments and Lisa audit markers such as
277
+ `[claude-build-intake]`, `[codex-build-intake]`, `[lisa-build-intake]`, and
278
+ `[lisa-repair-intake]`.
279
+ 3. For build items, latest **PR-side forward-progress activity** on the linked PR: newest commit,
280
+ review, check-run,
266
281
  or PR comment.
267
- 4. Status/label **transition** time, when the provider exposes it cleanly.
282
+ 4. Provider-native item `updatedAt` / `last_edited_time` / `updated` only when the provider cannot
283
+ expose transition/comment authorship and the timestamp is not known to be driven by automation
284
+ self-comments.
268
285
 
269
286
  If ANY of these is newer than the threshold, the item is **active** → record it as `active` and
270
287
  skip it (read-only). For build `claimed`, an open PR with recent commits/checks is active. For
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -263,9 +263,10 @@ function resolveRepairQueueArgument(config, source, tracker) {
263
263
  return "github intake_mode=both";
264
264
  }
265
265
 
266
- throw new Error(
267
- `Unable to resolve a single repair-intake queue for tracker=${String(tracker)} and source=${String(source)} without guessing.`
268
- );
266
+ const buildQueue = resolveBuildQueueArgument(config, tracker);
267
+ return buildQueue.includes("intake_mode=")
268
+ ? buildQueue
269
+ : `${buildQueue} intake_mode=build`;
269
270
  }
270
271
 
271
272
  /**
@@ -80,7 +80,7 @@ lifecycle state with provider-native closure and rollup state.
80
80
  |-------|---------|---------|
81
81
  | `<queue>` | Same queue identifier `lisa:intake` accepts (see Source dispatch). Required. | — |
82
82
  | `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 → `both` when both namespaces exist, else whichever lifecycle exists. | `both` for dual GitHub queues; otherwise infer |
83
- | `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. | `2h` |
83
+ | `stale_after` | How long since the last state-changing transition into the in-progress role, or since the last human / PR-side forward-progress activity, before an in-progress item counts as stalled. Automation self-comments do not reset this clock. 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. | `2h` |
84
84
  | `max_candidates` | Cap on how many stuck/close-out candidates to enumerate and evaluate. Repair every materially actionable candidate within this bounded set, then stop. Overrides config. | `100` |
85
85
  | `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` |
86
86
 
@@ -228,9 +228,19 @@ intakes use. Never call Atlassian MCP or `acli` directly — go through `lisa:at
228
228
 
229
229
  ## Staleness model
230
230
 
231
- An in-progress item (build `claimed`, PRD `in_review`) is **stalled** only if it shows no
232
- observable activity newer than the `stale_after` threshold. `blocked` items are NOT gated on
233
- staleness their repairability is judged on current blocker/answer state, not elapsed time.
231
+ An in-progress item (build `claimed`, PRD `in_review`) is **stalled** when the last
232
+ state-changing transition into the in-progress role, or the last human / PR-side forward-progress
233
+ activity after that transition, is older than the `stale_after` threshold. `blocked` items are NOT
234
+ gated on staleness — their repairability is judged on current blocker/answer state, not elapsed
235
+ time.
236
+
237
+ Automation self-comments are not forward progress and must not reset the staleness clock. Status
238
+ comments like `[claude-build-intake] PR remains open...`, `[codex-build-intake] Follow-up pushed...`,
239
+ or `[lisa-repair-intake] ...` may be useful audit notes, but they cannot make a claimed item fresh
240
+ forever. If a provider exposes a changelog/history surface, prefer the timestamp of the last
241
+ transition into the claimed/In-Progress role over the item's generic `updated` timestamp. When the
242
+ history surface is unavailable, ignore comments whose author/marker clearly belongs to Lisa or its
243
+ automation agents, and use the newest human comment/edit or PR-side progress event instead.
234
244
 
235
245
  A build `claimed` leaf whose linked PR has **already merged** (`state == MERGED`) is likewise NOT
236
246
  gated on staleness. A merged PR is a settled terminal state, not in-flight work: the only thing
@@ -254,17 +264,24 @@ decision tree step 0, and the dedicated high-confidence ordering bucket).
254
264
  `stale_after=0` means "treat any in-progress item as stalled" — a manual full-recovery lever,
255
265
  and the only way to resume work on a provider that exposes no reliable activity timestamp.
256
266
 
257
- ### Activity signal (most-recent-wins, portable across vendors)
267
+ ### Activity signal (state-change first, portable across vendors)
258
268
 
259
- Compute the item's newest activity timestamp from the highest-priority signal the vendor
269
+ Compute the item's newest eligible activity timestamp from the highest-priority signal the vendor
260
270
  exposes, and compare it to `now - stale_after`:
261
271
 
262
- 1. Provider-native item `updatedAt` / `last_edited_time` / `updated`.
263
- 2. Latest lifecycle/progress **comment** on the item (and, for Linear PRDs, the sentinel
264
- feedback issue).
265
- 3. For build items, latest **PR activity** on the linked PR: newest commit, review, check-run,
272
+ 1. Provider-native status/label **transition** time into the in-progress role, when the provider
273
+ exposes it cleanly (JIRA changelog transition to `claimed` / In Progress, GitHub label event,
274
+ Linear state/label history, Notion/Confluence page move/status history).
275
+ 2. Latest human lifecycle/progress **comment** or edit on the item (and, for Linear PRDs, the
276
+ sentinel feedback issue). Exclude automation self-comments and Lisa audit markers such as
277
+ `[claude-build-intake]`, `[codex-build-intake]`, `[lisa-build-intake]`, and
278
+ `[lisa-repair-intake]`.
279
+ 3. For build items, latest **PR-side forward-progress activity** on the linked PR: newest commit,
280
+ review, check-run,
266
281
  or PR comment.
267
- 4. Status/label **transition** time, when the provider exposes it cleanly.
282
+ 4. Provider-native item `updatedAt` / `last_edited_time` / `updated` only when the provider cannot
283
+ expose transition/comment authorship and the timestamp is not known to be driven by automation
284
+ self-comments.
268
285
 
269
286
  If ANY of these is newer than the threshold, the item is **active** → record it as `active` and
270
287
  skip it (read-only). For build `claimed`, an open PR with recent commits/checks is active. For
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "AWS CDK-specific Lisa plugin.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -369,7 +369,7 @@ documented defaults, so existing projects need no config change.
369
369
 
370
370
  | Key | Required | Default | Notes |
371
371
  |-----|----------|---------|-------|
372
- | `intake.repair.staleAfterHours` | no | `2` | How long an in-progress item (build `claimed`, PRD `in_review`) may show no observable activity before repair-intake treats it as stalled and resumes it. `blocked` items are judged on blocker/answer state, not this threshold. Overridable per-run via `stale_after=<dur>` in `$ARGUMENTS` (which always wins). The same value is the default backoff window for loop-prevention notes. |
372
+ | `intake.repair.staleAfterHours` | no | `2` | How long an in-progress item (build `claimed`, PRD `in_review`) may sit after its last state-changing transition into the in-progress role, or after the last human / PR-side forward-progress activity, before repair-intake treats it as stalled and resumes it. Automation self-comments and Lisa audit notes do not reset this clock. `blocked` items are judged on blocker/answer state, not this threshold. Overridable per-run via `stale_after=<dur>` in `$ARGUMENTS` (which always wins). The same value is the default backoff window for loop-prevention notes. |
373
373
  | `intake.repair.maxCandidates` | no | `100` | Upper bound on how many stuck items repair-intake enumerates while searching for the first actionable one. Bounds scan cost. Overridable per-run via `max_candidates=<n>`. |
374
374
 
375
375
  ### Monitor audit config (`monitor`)
@@ -263,9 +263,10 @@ function resolveRepairQueueArgument(config, source, tracker) {
263
263
  return "github intake_mode=both";
264
264
  }
265
265
 
266
- throw new Error(
267
- `Unable to resolve a single repair-intake queue for tracker=${String(tracker)} and source=${String(source)} without guessing.`
268
- );
266
+ const buildQueue = resolveBuildQueueArgument(config, tracker);
267
+ return buildQueue.includes("intake_mode=")
268
+ ? buildQueue
269
+ : `${buildQueue} intake_mode=build`;
269
270
  }
270
271
 
271
272
  /**
@@ -80,7 +80,7 @@ lifecycle state with provider-native closure and rollup state.
80
80
  |-------|---------|---------|
81
81
  | `<queue>` | Same queue identifier `lisa:intake` accepts (see Source dispatch). Required. | — |
82
82
  | `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 → `both` when both namespaces exist, else whichever lifecycle exists. | `both` for dual GitHub queues; otherwise infer |
83
- | `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. | `2h` |
83
+ | `stale_after` | How long since the last state-changing transition into the in-progress role, or since the last human / PR-side forward-progress activity, before an in-progress item counts as stalled. Automation self-comments do not reset this clock. 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. | `2h` |
84
84
  | `max_candidates` | Cap on how many stuck/close-out candidates to enumerate and evaluate. Repair every materially actionable candidate within this bounded set, then stop. Overrides config. | `100` |
85
85
  | `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` |
86
86
 
@@ -228,9 +228,19 @@ intakes use. Never call Atlassian MCP or `acli` directly — go through `lisa:at
228
228
 
229
229
  ## Staleness model
230
230
 
231
- An in-progress item (build `claimed`, PRD `in_review`) is **stalled** only if it shows no
232
- observable activity newer than the `stale_after` threshold. `blocked` items are NOT gated on
233
- staleness their repairability is judged on current blocker/answer state, not elapsed time.
231
+ An in-progress item (build `claimed`, PRD `in_review`) is **stalled** when the last
232
+ state-changing transition into the in-progress role, or the last human / PR-side forward-progress
233
+ activity after that transition, is older than the `stale_after` threshold. `blocked` items are NOT
234
+ gated on staleness — their repairability is judged on current blocker/answer state, not elapsed
235
+ time.
236
+
237
+ Automation self-comments are not forward progress and must not reset the staleness clock. Status
238
+ comments like `[claude-build-intake] PR remains open...`, `[codex-build-intake] Follow-up pushed...`,
239
+ or `[lisa-repair-intake] ...` may be useful audit notes, but they cannot make a claimed item fresh
240
+ forever. If a provider exposes a changelog/history surface, prefer the timestamp of the last
241
+ transition into the claimed/In-Progress role over the item's generic `updated` timestamp. When the
242
+ history surface is unavailable, ignore comments whose author/marker clearly belongs to Lisa or its
243
+ automation agents, and use the newest human comment/edit or PR-side progress event instead.
234
244
 
235
245
  A build `claimed` leaf whose linked PR has **already merged** (`state == MERGED`) is likewise NOT
236
246
  gated on staleness. A merged PR is a settled terminal state, not in-flight work: the only thing
@@ -254,17 +264,24 @@ decision tree step 0, and the dedicated high-confidence ordering bucket).
254
264
  `stale_after=0` means "treat any in-progress item as stalled" — a manual full-recovery lever,
255
265
  and the only way to resume work on a provider that exposes no reliable activity timestamp.
256
266
 
257
- ### Activity signal (most-recent-wins, portable across vendors)
267
+ ### Activity signal (state-change first, portable across vendors)
258
268
 
259
- Compute the item's newest activity timestamp from the highest-priority signal the vendor
269
+ Compute the item's newest eligible activity timestamp from the highest-priority signal the vendor
260
270
  exposes, and compare it to `now - stale_after`:
261
271
 
262
- 1. Provider-native item `updatedAt` / `last_edited_time` / `updated`.
263
- 2. Latest lifecycle/progress **comment** on the item (and, for Linear PRDs, the sentinel
264
- feedback issue).
265
- 3. For build items, latest **PR activity** on the linked PR: newest commit, review, check-run,
272
+ 1. Provider-native status/label **transition** time into the in-progress role, when the provider
273
+ exposes it cleanly (JIRA changelog transition to `claimed` / In Progress, GitHub label event,
274
+ Linear state/label history, Notion/Confluence page move/status history).
275
+ 2. Latest human lifecycle/progress **comment** or edit on the item (and, for Linear PRDs, the
276
+ sentinel feedback issue). Exclude automation self-comments and Lisa audit markers such as
277
+ `[claude-build-intake]`, `[codex-build-intake]`, `[lisa-build-intake]`, and
278
+ `[lisa-repair-intake]`.
279
+ 3. For build items, latest **PR-side forward-progress activity** on the linked PR: newest commit,
280
+ review, check-run,
266
281
  or PR comment.
267
- 4. Status/label **transition** time, when the provider exposes it cleanly.
282
+ 4. Provider-native item `updatedAt` / `last_edited_time` / `updated` only when the provider cannot
283
+ expose transition/comment authorship and the timestamp is not known to be driven by automation
284
+ self-comments.
268
285
 
269
286
  If ANY of these is newer than the threshold, the item is **active** → record it as `active` and
270
287
  skip it (read-only). For build `claimed`, an open PR with recent commits/checks is active. For
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -374,7 +374,7 @@ documented defaults, so existing projects need no config change.
374
374
 
375
375
  | Key | Required | Default | Notes |
376
376
  |-----|----------|---------|-------|
377
- | `intake.repair.staleAfterHours` | no | `2` | How long an in-progress item (build `claimed`, PRD `in_review`) may show no observable activity before repair-intake treats it as stalled and resumes it. `blocked` items are judged on blocker/answer state, not this threshold. Overridable per-run via `stale_after=<dur>` in `$ARGUMENTS` (which always wins). The same value is the default backoff window for loop-prevention notes. |
377
+ | `intake.repair.staleAfterHours` | no | `2` | How long an in-progress item (build `claimed`, PRD `in_review`) may sit after its last state-changing transition into the in-progress role, or after the last human / PR-side forward-progress activity, before repair-intake treats it as stalled and resumes it. Automation self-comments and Lisa audit notes do not reset this clock. `blocked` items are judged on blocker/answer state, not this threshold. Overridable per-run via `stale_after=<dur>` in `$ARGUMENTS` (which always wins). The same value is the default backoff window for loop-prevention notes. |
378
378
  | `intake.repair.maxCandidates` | no | `100` | Upper bound on how many stuck items repair-intake enumerates while searching for the first actionable one. Bounds scan cost. Overridable per-run via `max_candidates=<n>`. |
379
379
 
380
380
  ### Monitor audit config (`monitor`)
@@ -263,9 +263,10 @@ function resolveRepairQueueArgument(config, source, tracker) {
263
263
  return "github intake_mode=both";
264
264
  }
265
265
 
266
- throw new Error(
267
- `Unable to resolve a single repair-intake queue for tracker=${String(tracker)} and source=${String(source)} without guessing.`
268
- );
266
+ const buildQueue = resolveBuildQueueArgument(config, tracker);
267
+ return buildQueue.includes("intake_mode=")
268
+ ? buildQueue
269
+ : `${buildQueue} intake_mode=build`;
269
270
  }
270
271
 
271
272
  /**
@@ -80,7 +80,7 @@ lifecycle state with provider-native closure and rollup state.
80
80
  |-------|---------|---------|
81
81
  | `<queue>` | Same queue identifier `lisa:intake` accepts (see Source dispatch). Required. | — |
82
82
  | `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 → `both` when both namespaces exist, else whichever lifecycle exists. | `both` for dual GitHub queues; otherwise infer |
83
- | `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. | `2h` |
83
+ | `stale_after` | How long since the last state-changing transition into the in-progress role, or since the last human / PR-side forward-progress activity, before an in-progress item counts as stalled. Automation self-comments do not reset this clock. 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. | `2h` |
84
84
  | `max_candidates` | Cap on how many stuck/close-out candidates to enumerate and evaluate. Repair every materially actionable candidate within this bounded set, then stop. Overrides config. | `100` |
85
85
  | `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` |
86
86
 
@@ -228,9 +228,19 @@ intakes use. Never call Atlassian MCP or `acli` directly — go through `lisa:at
228
228
 
229
229
  ## Staleness model
230
230
 
231
- An in-progress item (build `claimed`, PRD `in_review`) is **stalled** only if it shows no
232
- observable activity newer than the `stale_after` threshold. `blocked` items are NOT gated on
233
- staleness their repairability is judged on current blocker/answer state, not elapsed time.
231
+ An in-progress item (build `claimed`, PRD `in_review`) is **stalled** when the last
232
+ state-changing transition into the in-progress role, or the last human / PR-side forward-progress
233
+ activity after that transition, is older than the `stale_after` threshold. `blocked` items are NOT
234
+ gated on staleness — their repairability is judged on current blocker/answer state, not elapsed
235
+ time.
236
+
237
+ Automation self-comments are not forward progress and must not reset the staleness clock. Status
238
+ comments like `[claude-build-intake] PR remains open...`, `[codex-build-intake] Follow-up pushed...`,
239
+ or `[lisa-repair-intake] ...` may be useful audit notes, but they cannot make a claimed item fresh
240
+ forever. If a provider exposes a changelog/history surface, prefer the timestamp of the last
241
+ transition into the claimed/In-Progress role over the item's generic `updated` timestamp. When the
242
+ history surface is unavailable, ignore comments whose author/marker clearly belongs to Lisa or its
243
+ automation agents, and use the newest human comment/edit or PR-side progress event instead.
234
244
 
235
245
  A build `claimed` leaf whose linked PR has **already merged** (`state == MERGED`) is likewise NOT
236
246
  gated on staleness. A merged PR is a settled terminal state, not in-flight work: the only thing
@@ -254,17 +264,24 @@ decision tree step 0, and the dedicated high-confidence ordering bucket).
254
264
  `stale_after=0` means "treat any in-progress item as stalled" — a manual full-recovery lever,
255
265
  and the only way to resume work on a provider that exposes no reliable activity timestamp.
256
266
 
257
- ### Activity signal (most-recent-wins, portable across vendors)
267
+ ### Activity signal (state-change first, portable across vendors)
258
268
 
259
- Compute the item's newest activity timestamp from the highest-priority signal the vendor
269
+ Compute the item's newest eligible activity timestamp from the highest-priority signal the vendor
260
270
  exposes, and compare it to `now - stale_after`:
261
271
 
262
- 1. Provider-native item `updatedAt` / `last_edited_time` / `updated`.
263
- 2. Latest lifecycle/progress **comment** on the item (and, for Linear PRDs, the sentinel
264
- feedback issue).
265
- 3. For build items, latest **PR activity** on the linked PR: newest commit, review, check-run,
272
+ 1. Provider-native status/label **transition** time into the in-progress role, when the provider
273
+ exposes it cleanly (JIRA changelog transition to `claimed` / In Progress, GitHub label event,
274
+ Linear state/label history, Notion/Confluence page move/status history).
275
+ 2. Latest human lifecycle/progress **comment** or edit on the item (and, for Linear PRDs, the
276
+ sentinel feedback issue). Exclude automation self-comments and Lisa audit markers such as
277
+ `[claude-build-intake]`, `[codex-build-intake]`, `[lisa-build-intake]`, and
278
+ `[lisa-repair-intake]`.
279
+ 3. For build items, latest **PR-side forward-progress activity** on the linked PR: newest commit,
280
+ review, check-run,
266
281
  or PR comment.
267
- 4. Status/label **transition** time, when the provider exposes it cleanly.
282
+ 4. Provider-native item `updatedAt` / `last_edited_time` / `updated` only when the provider cannot
283
+ expose transition/comment authorship and the timestamp is not known to be driven by automation
284
+ self-comments.
268
285
 
269
286
  If ANY of these is newer than the threshold, the item is **active** → record it as `active` and
270
287
  skip it (read-only). For build `claimed`, an open PR with recent commits/checks is active. For
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Expo and React Native-specific skills, agents, rules, and MCP servers.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Harper/Fabric-specific Lisa rules for TypeScript component apps.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "NestJS-specific skills and migration write-protection hooks.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Ruby on Rails-specific skills and hooks for RuboCop and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "TypeScript-specific hooks for formatting, linting, and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-typescript",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "TypeScript-specific hooks — Prettier formatting, ESLint linting, ast-grep scanning, and error-suppression blocking on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "Distributable LLM Wiki kernel — ingest, query, lint, and maintain a git-native markdown knowledge base across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-wiki",
3
- "version": "2.187.1",
3
+ "version": "2.187.2",
4
4
  "description": "LLM Wiki — a distributable, git-native markdown knowledge base for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -369,7 +369,7 @@ documented defaults, so existing projects need no config change.
369
369
 
370
370
  | Key | Required | Default | Notes |
371
371
  |-----|----------|---------|-------|
372
- | `intake.repair.staleAfterHours` | no | `2` | How long an in-progress item (build `claimed`, PRD `in_review`) may show no observable activity before repair-intake treats it as stalled and resumes it. `blocked` items are judged on blocker/answer state, not this threshold. Overridable per-run via `stale_after=<dur>` in `$ARGUMENTS` (which always wins). The same value is the default backoff window for loop-prevention notes. |
372
+ | `intake.repair.staleAfterHours` | no | `2` | How long an in-progress item (build `claimed`, PRD `in_review`) may sit after its last state-changing transition into the in-progress role, or after the last human / PR-side forward-progress activity, before repair-intake treats it as stalled and resumes it. Automation self-comments and Lisa audit notes do not reset this clock. `blocked` items are judged on blocker/answer state, not this threshold. Overridable per-run via `stale_after=<dur>` in `$ARGUMENTS` (which always wins). The same value is the default backoff window for loop-prevention notes. |
373
373
  | `intake.repair.maxCandidates` | no | `100` | Upper bound on how many stuck items repair-intake enumerates while searching for the first actionable one. Bounds scan cost. Overridable per-run via `max_candidates=<n>`. |
374
374
 
375
375
  ### Monitor audit config (`monitor`)
@@ -263,9 +263,10 @@ function resolveRepairQueueArgument(config, source, tracker) {
263
263
  return "github intake_mode=both";
264
264
  }
265
265
 
266
- throw new Error(
267
- `Unable to resolve a single repair-intake queue for tracker=${String(tracker)} and source=${String(source)} without guessing.`
268
- );
266
+ const buildQueue = resolveBuildQueueArgument(config, tracker);
267
+ return buildQueue.includes("intake_mode=")
268
+ ? buildQueue
269
+ : `${buildQueue} intake_mode=build`;
269
270
  }
270
271
 
271
272
  /**
@@ -80,7 +80,7 @@ lifecycle state with provider-native closure and rollup state.
80
80
  |-------|---------|---------|
81
81
  | `<queue>` | Same queue identifier `lisa:intake` accepts (see Source dispatch). Required. | — |
82
82
  | `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 → `both` when both namespaces exist, else whichever lifecycle exists. | `both` for dual GitHub queues; otherwise infer |
83
- | `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. | `2h` |
83
+ | `stale_after` | How long since the last state-changing transition into the in-progress role, or since the last human / PR-side forward-progress activity, before an in-progress item counts as stalled. Automation self-comments do not reset this clock. 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. | `2h` |
84
84
  | `max_candidates` | Cap on how many stuck/close-out candidates to enumerate and evaluate. Repair every materially actionable candidate within this bounded set, then stop. Overrides config. | `100` |
85
85
  | `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` |
86
86
 
@@ -228,9 +228,19 @@ intakes use. Never call Atlassian MCP or `acli` directly — go through `lisa:at
228
228
 
229
229
  ## Staleness model
230
230
 
231
- An in-progress item (build `claimed`, PRD `in_review`) is **stalled** only if it shows no
232
- observable activity newer than the `stale_after` threshold. `blocked` items are NOT gated on
233
- staleness their repairability is judged on current blocker/answer state, not elapsed time.
231
+ An in-progress item (build `claimed`, PRD `in_review`) is **stalled** when the last
232
+ state-changing transition into the in-progress role, or the last human / PR-side forward-progress
233
+ activity after that transition, is older than the `stale_after` threshold. `blocked` items are NOT
234
+ gated on staleness — their repairability is judged on current blocker/answer state, not elapsed
235
+ time.
236
+
237
+ Automation self-comments are not forward progress and must not reset the staleness clock. Status
238
+ comments like `[claude-build-intake] PR remains open...`, `[codex-build-intake] Follow-up pushed...`,
239
+ or `[lisa-repair-intake] ...` may be useful audit notes, but they cannot make a claimed item fresh
240
+ forever. If a provider exposes a changelog/history surface, prefer the timestamp of the last
241
+ transition into the claimed/In-Progress role over the item's generic `updated` timestamp. When the
242
+ history surface is unavailable, ignore comments whose author/marker clearly belongs to Lisa or its
243
+ automation agents, and use the newest human comment/edit or PR-side progress event instead.
234
244
 
235
245
  A build `claimed` leaf whose linked PR has **already merged** (`state == MERGED`) is likewise NOT
236
246
  gated on staleness. A merged PR is a settled terminal state, not in-flight work: the only thing
@@ -254,17 +264,24 @@ decision tree step 0, and the dedicated high-confidence ordering bucket).
254
264
  `stale_after=0` means "treat any in-progress item as stalled" — a manual full-recovery lever,
255
265
  and the only way to resume work on a provider that exposes no reliable activity timestamp.
256
266
 
257
- ### Activity signal (most-recent-wins, portable across vendors)
267
+ ### Activity signal (state-change first, portable across vendors)
258
268
 
259
- Compute the item's newest activity timestamp from the highest-priority signal the vendor
269
+ Compute the item's newest eligible activity timestamp from the highest-priority signal the vendor
260
270
  exposes, and compare it to `now - stale_after`:
261
271
 
262
- 1. Provider-native item `updatedAt` / `last_edited_time` / `updated`.
263
- 2. Latest lifecycle/progress **comment** on the item (and, for Linear PRDs, the sentinel
264
- feedback issue).
265
- 3. For build items, latest **PR activity** on the linked PR: newest commit, review, check-run,
272
+ 1. Provider-native status/label **transition** time into the in-progress role, when the provider
273
+ exposes it cleanly (JIRA changelog transition to `claimed` / In Progress, GitHub label event,
274
+ Linear state/label history, Notion/Confluence page move/status history).
275
+ 2. Latest human lifecycle/progress **comment** or edit on the item (and, for Linear PRDs, the
276
+ sentinel feedback issue). Exclude automation self-comments and Lisa audit markers such as
277
+ `[claude-build-intake]`, `[codex-build-intake]`, `[lisa-build-intake]`, and
278
+ `[lisa-repair-intake]`.
279
+ 3. For build items, latest **PR-side forward-progress activity** on the linked PR: newest commit,
280
+ review, check-run,
266
281
  or PR comment.
267
- 4. Status/label **transition** time, when the provider exposes it cleanly.
282
+ 4. Provider-native item `updatedAt` / `last_edited_time` / `updated` only when the provider cannot
283
+ expose transition/comment authorship and the timestamp is not known to be driven by automation
284
+ self-comments.
268
285
 
269
286
  If ANY of these is newer than the threshold, the item is **active** → record it as `active` and
270
287
  skip it (read-only). For build `claimed`, an open PR with recent commits/checks is active. For