@codyswann/lisa 2.256.0 → 2.257.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 (166) 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/.codex-plugin/skills/lisa-exploratory-qa/SKILL.md +12 -4
  5. package/plugins/lisa/.codex-plugin/skills/lisa-github-validate-issue/SKILL.md +1 -1
  6. package/plugins/lisa/.codex-plugin/skills/lisa-github-write-issue/SKILL.md +9 -3
  7. package/plugins/lisa/.codex-plugin/skills/lisa-implement/SKILL.md +6 -2
  8. package/plugins/lisa/.codex-plugin/skills/lisa-jira-validate-ticket/SKILL.md +1 -1
  9. package/plugins/lisa/.codex-plugin/skills/lisa-jira-write-ticket/SKILL.md +9 -6
  10. package/plugins/lisa/.codex-plugin/skills/lisa-learnings-audit/SKILL.md +9 -0
  11. package/plugins/lisa/.codex-plugin/skills/lisa-linear-validate-issue/SKILL.md +1 -1
  12. package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-issue/SKILL.md +9 -3
  13. package/plugins/lisa/.codex-plugin/skills/lisa-monitor/SKILL.md +6 -4
  14. package/plugins/lisa/.codex-plugin/skills/lisa-project-ideation/SKILL.md +21 -4
  15. package/plugins/lisa/.codex-plugin/skills/lisa-repair-intake/SKILL.md +17 -7
  16. package/plugins/lisa/agents/github-agent.md +2 -2
  17. package/plugins/lisa/agents/jira-agent.md +2 -2
  18. package/plugins/lisa/agents/linear-agent.md +2 -2
  19. package/plugins/lisa/rules/eager/config-resolution.md +27 -8
  20. package/plugins/lisa/rules/eager/pre-flight-autofill.md +21 -7
  21. package/plugins/lisa/rules/eager/rejection-detection.md +12 -1
  22. package/plugins/lisa/rules/reference/config-resolution.md +55 -16
  23. package/plugins/lisa/rules/reference/observability-audit.md +5 -1
  24. package/plugins/lisa/rules/reference/pre-flight-autofill.md +23 -8
  25. package/plugins/lisa/rules/reference/rejection-detection.md +61 -0
  26. package/plugins/lisa/skills/lisa-exploratory-qa/SKILL.md +12 -4
  27. package/plugins/lisa/skills/lisa-github-validate-issue/SKILL.md +1 -1
  28. package/plugins/lisa/skills/lisa-github-write-issue/SKILL.md +9 -3
  29. package/plugins/lisa/skills/lisa-implement/SKILL.md +6 -2
  30. package/plugins/lisa/skills/lisa-jira-validate-ticket/SKILL.md +1 -1
  31. package/plugins/lisa/skills/lisa-jira-write-ticket/SKILL.md +9 -6
  32. package/plugins/lisa/skills/lisa-learnings-audit/SKILL.md +9 -0
  33. package/plugins/lisa/skills/lisa-linear-validate-issue/SKILL.md +1 -1
  34. package/plugins/lisa/skills/lisa-linear-write-issue/SKILL.md +9 -3
  35. package/plugins/lisa/skills/lisa-monitor/SKILL.md +6 -4
  36. package/plugins/lisa/skills/lisa-project-ideation/SKILL.md +21 -4
  37. package/plugins/lisa/skills/lisa-repair-intake/SKILL.md +17 -7
  38. package/plugins/lisa-agy/agents/github-agent.md +2 -2
  39. package/plugins/lisa-agy/agents/jira-agent.md +2 -2
  40. package/plugins/lisa-agy/agents/linear-agent.md +2 -2
  41. package/plugins/lisa-agy/plugin.json +1 -1
  42. package/plugins/lisa-agy/skills/lisa-exploratory-qa/SKILL.md +12 -4
  43. package/plugins/lisa-agy/skills/lisa-github-validate-issue/SKILL.md +1 -1
  44. package/plugins/lisa-agy/skills/lisa-github-write-issue/SKILL.md +9 -3
  45. package/plugins/lisa-agy/skills/lisa-implement/SKILL.md +6 -2
  46. package/plugins/lisa-agy/skills/lisa-jira-validate-ticket/SKILL.md +1 -1
  47. package/plugins/lisa-agy/skills/lisa-jira-write-ticket/SKILL.md +9 -6
  48. package/plugins/lisa-agy/skills/lisa-learnings-audit/SKILL.md +9 -0
  49. package/plugins/lisa-agy/skills/lisa-linear-validate-issue/SKILL.md +1 -1
  50. package/plugins/lisa-agy/skills/lisa-linear-write-issue/SKILL.md +9 -3
  51. package/plugins/lisa-agy/skills/lisa-monitor/SKILL.md +6 -4
  52. package/plugins/lisa-agy/skills/lisa-project-ideation/SKILL.md +21 -4
  53. package/plugins/lisa-agy/skills/lisa-repair-intake/SKILL.md +17 -7
  54. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  56. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  57. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-copilot/agents/github-agent.agent.md +2 -2
  61. package/plugins/lisa-copilot/agents/jira-agent.agent.md +2 -2
  62. package/plugins/lisa-copilot/agents/linear-agent.agent.md +2 -2
  63. package/plugins/lisa-copilot/rules/eager/config-resolution.md +27 -8
  64. package/plugins/lisa-copilot/rules/eager/pre-flight-autofill.md +21 -7
  65. package/plugins/lisa-copilot/rules/eager/rejection-detection.md +12 -1
  66. package/plugins/lisa-copilot/rules/reference/config-resolution.md +55 -16
  67. package/plugins/lisa-copilot/rules/reference/observability-audit.md +5 -1
  68. package/plugins/lisa-copilot/rules/reference/pre-flight-autofill.md +23 -8
  69. package/plugins/lisa-copilot/rules/reference/rejection-detection.md +61 -0
  70. package/plugins/lisa-copilot/skills/lisa-exploratory-qa/SKILL.md +12 -4
  71. package/plugins/lisa-copilot/skills/lisa-github-validate-issue/SKILL.md +1 -1
  72. package/plugins/lisa-copilot/skills/lisa-github-write-issue/SKILL.md +9 -3
  73. package/plugins/lisa-copilot/skills/lisa-implement/SKILL.md +6 -2
  74. package/plugins/lisa-copilot/skills/lisa-jira-validate-ticket/SKILL.md +1 -1
  75. package/plugins/lisa-copilot/skills/lisa-jira-write-ticket/SKILL.md +9 -6
  76. package/plugins/lisa-copilot/skills/lisa-learnings-audit/SKILL.md +9 -0
  77. package/plugins/lisa-copilot/skills/lisa-linear-validate-issue/SKILL.md +1 -1
  78. package/plugins/lisa-copilot/skills/lisa-linear-write-issue/SKILL.md +9 -3
  79. package/plugins/lisa-copilot/skills/lisa-monitor/SKILL.md +6 -4
  80. package/plugins/lisa-copilot/skills/lisa-project-ideation/SKILL.md +21 -4
  81. package/plugins/lisa-copilot/skills/lisa-repair-intake/SKILL.md +17 -7
  82. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  83. package/plugins/lisa-cursor/agents/github-agent.md +2 -2
  84. package/plugins/lisa-cursor/agents/jira-agent.md +2 -2
  85. package/plugins/lisa-cursor/agents/linear-agent.md +2 -2
  86. package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +55 -16
  87. package/plugins/lisa-cursor/rules/config-resolution.mdc +27 -8
  88. package/plugins/lisa-cursor/rules/observability-audit-reference.mdc +5 -1
  89. package/plugins/lisa-cursor/rules/pre-flight-autofill-reference.mdc +23 -8
  90. package/plugins/lisa-cursor/rules/pre-flight-autofill.mdc +21 -7
  91. package/plugins/lisa-cursor/rules/rejection-detection-reference.mdc +61 -0
  92. package/plugins/lisa-cursor/rules/rejection-detection.mdc +12 -1
  93. package/plugins/lisa-cursor/skills/lisa-exploratory-qa/SKILL.md +12 -4
  94. package/plugins/lisa-cursor/skills/lisa-github-validate-issue/SKILL.md +1 -1
  95. package/plugins/lisa-cursor/skills/lisa-github-write-issue/SKILL.md +9 -3
  96. package/plugins/lisa-cursor/skills/lisa-implement/SKILL.md +6 -2
  97. package/plugins/lisa-cursor/skills/lisa-jira-validate-ticket/SKILL.md +1 -1
  98. package/plugins/lisa-cursor/skills/lisa-jira-write-ticket/SKILL.md +9 -6
  99. package/plugins/lisa-cursor/skills/lisa-learnings-audit/SKILL.md +9 -0
  100. package/plugins/lisa-cursor/skills/lisa-linear-validate-issue/SKILL.md +1 -1
  101. package/plugins/lisa-cursor/skills/lisa-linear-write-issue/SKILL.md +9 -3
  102. package/plugins/lisa-cursor/skills/lisa-monitor/SKILL.md +6 -4
  103. package/plugins/lisa-cursor/skills/lisa-project-ideation/SKILL.md +21 -4
  104. package/plugins/lisa-cursor/skills/lisa-repair-intake/SKILL.md +17 -7
  105. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  106. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  107. package/plugins/lisa-expo-agy/plugin.json +1 -1
  108. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  109. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  110. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  111. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  112. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  113. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  114. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  115. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  116. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  117. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  118. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  119. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  120. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  121. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  122. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  123. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  124. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  125. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  126. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  127. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  128. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  129. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  130. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  131. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  132. package/plugins/lisa-rails-agy/plugin.json +1 -1
  133. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  134. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  135. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  136. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  137. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  138. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  139. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  140. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  141. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  142. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  143. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  144. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  145. package/plugins/src/base/agents/github-agent.md +2 -2
  146. package/plugins/src/base/agents/jira-agent.md +2 -2
  147. package/plugins/src/base/agents/linear-agent.md +2 -2
  148. package/plugins/src/base/rules/eager/config-resolution.md +27 -8
  149. package/plugins/src/base/rules/eager/pre-flight-autofill.md +21 -7
  150. package/plugins/src/base/rules/eager/rejection-detection.md +12 -1
  151. package/plugins/src/base/rules/reference/config-resolution.md +55 -16
  152. package/plugins/src/base/rules/reference/observability-audit.md +5 -1
  153. package/plugins/src/base/rules/reference/pre-flight-autofill.md +23 -8
  154. package/plugins/src/base/rules/reference/rejection-detection.md +61 -0
  155. package/plugins/src/base/skills/lisa-exploratory-qa/SKILL.md +12 -4
  156. package/plugins/src/base/skills/lisa-github-validate-issue/SKILL.md +1 -1
  157. package/plugins/src/base/skills/lisa-github-write-issue/SKILL.md +9 -3
  158. package/plugins/src/base/skills/lisa-implement/SKILL.md +6 -2
  159. package/plugins/src/base/skills/lisa-jira-validate-ticket/SKILL.md +1 -1
  160. package/plugins/src/base/skills/lisa-jira-write-ticket/SKILL.md +9 -6
  161. package/plugins/src/base/skills/lisa-learnings-audit/SKILL.md +9 -0
  162. package/plugins/src/base/skills/lisa-linear-validate-issue/SKILL.md +1 -1
  163. package/plugins/src/base/skills/lisa-linear-write-issue/SKILL.md +9 -3
  164. package/plugins/src/base/skills/lisa-monitor/SKILL.md +6 -4
  165. package/plugins/src/base/skills/lisa-project-ideation/SKILL.md +21 -4
  166. package/plugins/src/base/skills/lisa-repair-intake/SKILL.md +17 -7
@@ -35,7 +35,7 @@ Required fields (stop and ask if missing — do not invent values):
35
35
  | Priority | CREATE | Default to project default if unstated |
36
36
  | Acceptance criteria | Story, Task, Bug, Sub-task, Improvement | Gherkin — see Phase 3 |
37
37
  | Validation Journey | Runtime-behavior changes | Delegate to `/jira-add-journey` |
38
- | Target backend environment | Runtime-behavior changes | `dev` / `staging` / `prod`; recorded in description (Phase 3). Skip only for doc/config/type-only tickets. |
38
+ | Target backend environment | Runtime-behavior changes | For every work type, use an exact `deploy.branches` key when an environment is known. Human: bare key or `Confirmed: <env>`. Automation: `Inferred: <env> — evidence: <title\|body\|reproduction\|hostname>`, `Assumption: <env> remote default branch <branch>` for a unique reverse-map, or `Assumption: remote default branch <branch>` otherwise. Human confirmation replaces an automated annotation with the bare key or `Confirmed: <env>`. |
39
39
  | Sign-in account / credentials | Tickets that touch authenticated surfaces | Name the account (or source — 1Password item, env var, seeded fixture) and role; recorded in description (Phase 3). Omit when sign-in is not required. |
40
40
  | Single-repo scope | Bug, Task, Sub-task, Improvement | These leaf work units MUST cover one repo only. If the work crosses repos, split it before creating. Epic / Spike / Story may span repos. |
41
41
  | Source Requirement | PRD-sourced tickets (`prd_source` provided) | `h2. Source Requirement` with PRD link + verbatim requirement quote(s) — see Phase 3; enforced at every level, sub-tasks included |
@@ -83,11 +83,14 @@ h2. Out of Scope
83
83
  [Explicit list of what this ticket does NOT cover. Forces scope discipline.]
84
84
 
85
85
  h2. Target Backend Environment
86
- [Required when the ticket changes runtime behavior. One of: dev / staging / prod.
87
- This is the environment QA/product reported against and the backend the
88
- implementer points their local stack at during verification before CI/CD.
89
- Backend-only tickets state the deployed env they target. Skip section
90
- entirely for doc-only, config-only, or type-only tickets.]
86
+ [Required when the ticket changes runtime behavior. Use an exact
87
+ `deploy.branches` key. A human-confirmed value is a bare key or
88
+ `Confirmed: <env>`. An automated evidence write is
89
+ `Inferred: <env> evidence: <title|body|reproduction|hostname>`; an automated
90
+ generic default is `Assumption: <env> remote default branch <branch>`.
91
+ Without a unique reverse-map use `Assumption: remote default branch <branch>`.
92
+ Human confirmation replaces the automated annotation with a bare key or
93
+ `Confirmed: <env>`. Skip only for doc/config/type-only tickets.]
91
94
 
92
95
  h2. Sign-in Required
93
96
  [Include this section ONLY if the work touches authenticated surfaces.
@@ -248,6 +248,15 @@ resolved by reading the ticket, never by filing a sibling blind. Then:
248
248
 
249
249
  Re-runs are quiet no-ops: same surfaces + same evidence ⇒ zero new tickets.
250
250
 
251
+ This open-and-closed marker search plus the "declined `<date>`; recurred `<date>` in `<ref>`"
252
+ re-file discipline is the shipped precedent for the **Proposal rejection memory** section of the
253
+ `rejection-detection` rule — the shared contract every proposing loop now consults so a
254
+ closed-as-not-planned proposal is never re-filed. The gardener already conforms; it is cited there,
255
+ not re-implemented. Like every proposing loop, each gardener-filed ticket MUST carry the
256
+ `rejection-detection` **operator footer** as a visible prose line so the human knows which
257
+ close-reason silences it: `To stop this from being raised again, close it as **Not planned**. Close
258
+ it as **Completed** if it was fixed — a later recurrence may be re-filed as a regression.`
259
+
251
260
  ## Autonomous-vs-approval boundary
252
261
 
253
262
  **Everything is human-gated at v1 — this skill only files tickets.** The
@@ -160,7 +160,7 @@ A **build-ready leaf work unit** that is not part of an Epic context stands alon
160
160
 
161
161
  #### S8 — Target Backend Environment
162
162
 
163
- When `runtime_behavior_change = true`, description must contain `## Target Backend Environment` with one of `dev`, `staging`, `prod`. Skipped for doc-only / config-only / type-only / Epic.
163
+ When `runtime_behavior_change = true`, the description must contain `## Target Backend Environment`. Read accepted environments from the exact configured keys of `.lisa.config.json` `deploy.branches`, never from a hardcoded list. Accept a human-confirmed bare exact configured key or `Confirmed: <env>`, automated `Inferred: <env> — evidence: <title|body|reproduction|hostname>`, automated `Assumption: <env> — remote default branch <branch>` for a unique reverse-map, or `Assumption: remote default branch <branch>` when no unique reverse-map exists. Human confirmation replaces an automated annotation with the bare key or `Confirmed: <env>`. For legacy bare values, use managed draft markers and current ticket content only; provider edit history is not required. A marker proves automation and requires re-annotation; otherwise unknown provenance plus conflicting evidence fails for confirmation. Validate the annotation shape/source and remote-default branch; validate `<env>` as an exact configured key whenever present. A valid branch-only assumption must not fail solely because its reverse-map is absent or ambiguous. Normalize built-in `prod` ↔ `production` only when exactly one of those keys is configured. No other aliases are valid. Skipped for doc-only / config-only / type-only / Epic.
164
164
 
165
165
  #### S9 — Sign-in Required
166
166
 
@@ -57,7 +57,7 @@ Required fields (stop and ask if missing — never invent values):
57
57
  | Priority | CREATE | Native Linear priority: 0=No priority, 1=Urgent, 2=High, 3=Medium, 4=Low |
58
58
  | Acceptance criteria | Story, Task, Bug, Sub-task, Improvement | Gherkin — see Phase 3 |
59
59
  | Validation Journey | Runtime-behavior changes | Delegate to `/linear-add-journey` |
60
- | Target backend environment | Runtime-behavior changes | `dev` / `staging` / `prod`; recorded in description (Phase 3). Skip only for doc/config/type-only items. |
60
+ | Target backend environment | Runtime-behavior changes | For every work type, use an exact `deploy.branches` key when an environment is known. Human: bare key or `Confirmed: <env>`. Automation: `Inferred: <env> — evidence: <title\|body\|reproduction\|hostname>`, `Assumption: <env> remote default branch <branch>` for a unique reverse-map, or `Assumption: remote default branch <branch>` otherwise. Human confirmation replaces an automated annotation with the bare key or `Confirmed: <env>`. |
61
61
  | Sign-in account / credentials | Items that touch authenticated surfaces | Name the account (or source — 1Password item, env var, seeded fixture) and role; recorded in description. Omit when sign-in is not required. |
62
62
  | Single-repo scope | Bug, Task, Sub-task | These types MUST cover one repo only. If the work crosses repos, split it before creating. Epic / Spike / Story may span repos. |
63
63
  | Source Requirement | PRD-sourced Issues (`prd_source` provided) | `## Source Requirement` with PRD link + verbatim requirement quote(s) — see Phase 3; enforced at every level, sub-issues included. |
@@ -103,8 +103,14 @@ Linear descriptions are markdown (NOT Jira wiki markup — no `h2.` headings, us
103
103
  [Explicit list of what this item does NOT cover. Forces scope discipline.]
104
104
 
105
105
  ## Target Backend Environment
106
- [Required when the item changes runtime behavior. One of: dev / staging / prod.
107
- Skip section entirely for doc-only, config-only, or type-only items.]
106
+ [Required when the item changes runtime behavior. Use an exact
107
+ `deploy.branches` key. A human-confirmed value is a bare key or
108
+ `Confirmed: <env>`. An automated evidence write is
109
+ `Inferred: <env> — evidence: <title|body|reproduction|hostname>`; an automated
110
+ generic default is `Assumption: <env> — remote default branch <branch>`.
111
+ Without a unique reverse-map use `Assumption: remote default branch <branch>`.
112
+ Human confirmation replaces the automated annotation with a bare key or
113
+ `Confirmed: <env>`. Skip only for doc/config/type-only items.]
108
114
 
109
115
  ## Sign-in Required
110
116
  [Include this section ONLY if the work touches authenticated surfaces.
@@ -130,7 +130,8 @@ After report, file what was found — **only when run standalone**, never under
130
130
 
131
131
  - **Anomalies** (live signals over the conservative bar) → `Bug` leaves. **Gaps** (in-scope MISSING rubric dimensions) → `Task`/`Improvement` leaves.
132
132
  - Every ticket is filed via the vendor-neutral `lisa-tracker-write` shim with `build_ready: true` (never a vendor write skill directly), as a **single-repo leaf** stamped `repo:<current>`, with a real three-audience description, Gherkin AC, Target Backend Environment, and a Validation Journey + typed `[EVIDENCE: <artifact-type>: <name>]` marker (e.g. `[EVIDENCE: log-snippet: alert-cleared]`) so it passes the `tracker-validate` gates.
133
- - **Idempotent:** embed the `<!-- lisa:monitor-finding: <fingerprint> -->` sentinel and search-before-create; never duplicate a live or just-resolved finding.
133
+ - **Operator footer (required):** every filed ticket ends with the `rejection-detection` **operator footer** as a visible prose line — `To stop this from being raised again, close it as **Not planned**. Close it as **Completed** if it was fixed — a later recurrence may be re-filed as a regression.` — so the operator knows which close-reason silences the finding.
134
+ - **Idempotent + decline-aware:** embed the `<!-- lisa:monitor-finding: <fingerprint> -->` sentinel and follow the `observability-audit` rule's current fingerprint/idempotency contract for open-and-closed search, prior-decline suppression, recurrence evidence, completed-item regression handling, and tracker-read failure outcomes. Never duplicate a live or just-resolved finding.
134
135
  - **Capped** at `max_candidates` (default 20), `core`/high-severity first; report how many were filed vs dropped.
135
136
  - **`--dry-run`** previews would-file tickets and creates nothing. **`--all-gaps`** widens gap filing to `recommended` tiers.
136
137
 
@@ -149,8 +150,8 @@ so a quiet monitoring run and a broken one never look identical.
149
150
  | This cycle's exit path | Run outcome |
150
151
  |---|---|
151
152
  | Anomalies or in-scope gaps filed — one or more `Bug` / `Task` / `Improvement` leaves created or referenced | `candidate-proposed` |
152
- | Clean sweep — health/audit ran end to end, nothing over the bar and no in-scope gaps | `nothing-needed` |
153
- | Provider/threshold resolution failure — threshold collection fails (a present-but-uninspectable config, an invalid configured threshold) or a signal provider is unreachable so the sweep could not run | `recovery-required` |
153
+ | Clean sweep — health/audit ran end to end, nothing over the bar and no in-scope gaps — **or** every finding was suppressed by a prior decline (`rejection-detection` **Proposal rejection memory**): the summary MUST name the suppression count | `nothing-needed` |
154
+ | Provider/threshold resolution failure — threshold collection fails (a present-but-uninspectable config, an invalid configured threshold) or a signal provider is unreachable so the sweep could not run — **or** the open-and-closed rejection-memory search could not read the tracker: a memory check that could not run is a broken loop, never a silent `nothing-needed` | `recovery-required` |
154
155
  | A degradation that still let the sweep run (an optional `ops-specialist` overlay absent, Kane unavailable) | the outcome it actually reached above, with the summary **leading with the degradation** — degradation never mints a seventh token |
155
156
 
156
157
  Only the **standalone** run records. The nested report-only modes do their own job and do not file or
@@ -161,7 +162,8 @@ invocations.
161
162
  Record **exactly one** outcome per standalone invocation through the run-record CLI, naming this
162
163
  loop's runbook (the `--summary` is the operator-readable one-liner in the contract's exemplar voice —
163
164
  plain, specific, actionable, e.g. `Health green; audit clean — nothing to propose.` for
164
- `nothing-needed`):
165
+ `nothing-needed`; and for a `recovery-required` from an unreadable decline check, `Tracker
166
+ unreachable during the decline check — restore credentials; nothing was filed this run.`):
165
167
 
166
168
  ```bash
167
169
  node "${CLAUDE_PLUGIN_ROOT}/scripts/automation-run-record.mjs" \
@@ -241,10 +241,26 @@ Each created PRD carries the marker `[lisa-project-ideation] idea=<stable-key>`.
241
241
  `<stable-key>` deterministically from: repo identity (configured repo or git remote + repo-root
242
242
  basename) + a normalized slug of the idea name + the normalized persona key(s) + the existing-fit
243
243
  anchor. **Do not** include rank, date, confidence, or the generated PRD title (they change across
244
- runs). `lisa-prd-source-write` searches the source for an open PRD carrying this marker before
244
+ runs). `lisa-prd-source-write` searches the source for a PRD carrying this marker before
245
245
  creating — matching by marker, never by title — so re-running ideation updates/references the
246
246
  existing PRD rather than duplicating it.
247
247
 
248
+ Per the `rejection-detection` rule's **Proposal rejection memory** section, that marker search MUST
249
+ cover **open AND closed** PRDs (with a body-enumeration fallback on search-index lag), and a PRD
250
+ **closed as _not planned_** (GitHub `stateReason == "not_planned"`; the config-resolved won't-do/
251
+ canceled equivalent on JIRA/Linear — never a hardcoded lane string) is a **durable human decline**
252
+ that **suppresses** re-proposing that idea. Re-propose only with evidence that **postdates the
253
+ decline**, and state it in the new PRD as BOTH the machine token (`declined <date>; recurred <date>
254
+ in <ref>`) and a human acknowledgment sentence (`You declined this on <date>. It has recurred
255
+ (<date>, <ref>), so we're raising it once more for your review.`). A PRD closed as _completed_ is
256
+ not a decline. This is tracker-side memory; the advisory ideation memory ledger stays advisory and
257
+ never overrides it.
258
+
259
+ Every created PRD MUST carry the `rejection-detection` **operator footer** as a visible prose line
260
+ so the operator knows which close-reason silences it:
261
+
262
+ > To stop this from being raised again, close it as **Not planned**. Close it as **Completed** if it was fixed — a later recurrence may be re-filed as a regression.
263
+
248
264
  ## Step 7 — Output (no report file)
249
265
 
250
266
  Emit two distinct in-session sections (do not write a report file):
@@ -284,9 +300,9 @@ so a quiet ideation run and a broken one are never confused.
284
300
  | This run's exit path | Run outcome |
285
301
  |---|---|
286
302
  | PRD(s) created or reused this run (Step 6/7 **PRDs Created**) | `candidate-proposed` |
287
- | Nothing to ideate — no Practical Idea cleared the bar; nothing created | `nothing-needed` |
303
+ | Nothing to ideate — no Practical Idea cleared the bar; nothing created — **or** every idea was suppressed by a prior decline (`rejection-detection` **Proposal rejection memory**): the summary MUST name the suppression count | `nothing-needed` |
288
304
  | The Step 5.5 **PRD-queue-pressure gate** blocked auto-ready creation — a human must drain the queue before another auto-ready PRD is added | `approval-requested` |
289
- | The loop itself could not run — the PRD source reader failed or the queue is misconfigured (a source-reader failure snapshot, not queue pressure) | `recovery-required` |
305
+ | The loop itself could not run — the PRD source reader failed or the queue is misconfigured (a source-reader failure snapshot, not queue pressure) — **or** the open-and-closed rejection-memory marker search could not read the source: a memory check that could not run is a broken loop, never a silent `nothing-needed` | `recovery-required` |
290
306
  | A degradation that still let ideation run (optional Codex automation memory unavailable, an inspiration source unreachable) | the outcome it actually reached above, with the summary **leading with the degradation** — degradation never mints a seventh token |
291
307
 
292
308
  The pressure gate is `approval-requested`, **not** `recovery-required`: the loop ran fine and
@@ -296,7 +312,8 @@ broken machine. `recovery-required` is reserved for the loop failing to run at a
296
312
  Record **exactly one** outcome per invocation through the run-record CLI, naming this loop's runbook
297
313
  (the `--summary` is the operator-readable one-liner in the contract's exemplar voice — plain,
298
314
  specific, actionable, e.g. `Reviewed evidence; no practical idea cleared the bar — nothing to
299
- propose.` for `nothing-needed`):
315
+ propose.` for `nothing-needed`; and for a `recovery-required` from an unreadable decline check,
316
+ `Tracker unreachable during the decline check — restore credentials; nothing was filed this run.`):
300
317
 
301
318
  ```bash
302
319
  node "${CLAUDE_PLUGIN_ROOT}/scripts/automation-run-record.mjs" \
@@ -456,7 +456,9 @@ re-issued against an unchanged conflicting head.
456
456
  follow-up, `build_ready: true` so it auto-builds. The ticket MUST name: the blocked item + its
457
457
  PR/deploy URL, the exact blocker (conflict / which checks failed with their logs link / which
458
458
  change requests / which deploy run), three-audience description, and Gherkin acceptance criteria
459
- for "PR is mergeable / deploy is green."
459
+ for "PR is mergeable / deploy is green." Every created blocker fix ticket MUST end with the
460
+ `rejection-detection` **operator footer** as a visible prose line:
461
+ `To stop this from being raised again, close it as **Not planned**. Close it as **Completed** if it was fixed — a later recurrence may be re-filed as a regression.`
460
462
  2. **Transition the stalled item `claimed → blocked`** and add an **`is blocked by`** link to the
461
463
  new fix ticket (vendor-native: JIRA issue link `is blocked by`; GitHub/Linear `Blocked by:` line
462
464
  + label). Post a `[lisa-repair-intake]` note naming what it is blocked by and why. This block is
@@ -470,11 +472,19 @@ The item now sits in `blocked`; once the fix ticket reaches a terminal state, th
470
472
  `blocked` → unblock if cleared** path (next section) detects the cleared `is blocked by`
471
473
  dependency and resumes the original in place — a self-healing loop.
472
474
 
473
- **Idempotency.** Before filing, check for an **open** fix ticket already carrying the marker
475
+ **Idempotency.** Before filing, check for a fix ticket already carrying the marker
474
476
  `[lisa-repair-intake] blocker:<item-ref>/<blocker-key>` (blocker-key is a stable slug of the
475
- blocker, e.g. `pr-1234/merge-conflict` or `pr-1234/checks-failing`). If one exists, reference it
476
- and ensure the `is blocked by` link is present rather than creating a duplicate. Honor the backoff
477
- window and state fingerprint (Loop prevention) so re-runs over the same unchanged blocker are no-ops.
477
+ blocker, e.g. `pr-1234/merge-conflict` or `pr-1234/checks-failing`). Per the `rejection-detection`
478
+ rule's **Proposal rejection memory** section, that marker search MUST cover **open AND closed**
479
+ tickets (body-enumeration fallback on search-index lag): an **open** match reference it and ensure
480
+ the `is blocked by` link is present rather than creating a duplicate; a match **closed as _not
481
+ planned_** (GitHub `stateReason == "not_planned"`; the config-resolved equivalent on JIRA/Linear) is
482
+ a **human decline** of that fix ticket — do **not** re-file it unless evidence **postdates the
483
+ decline**, and the re-filed ticket MUST carry BOTH the machine token (`declined <date>; recurred
484
+ <date> in <ref>`) and the human acknowledgment sentence (`You declined this on <date>. It has
485
+ recurred (<date>, <ref>), so we're raising it once more for your review.`); a match closed as
486
+ _completed_ is a regression path, not a decline. Honor the backoff window and state fingerprint
487
+ (Loop prevention) so re-runs over the same unchanged blocker are no-ops.
478
488
 
479
489
  ### Build `blocked` → re-evaluate, unblock if cleared
480
490
 
@@ -985,11 +995,11 @@ to each item* — the two never merge in the one-line summary.
985
995
 
986
996
  | This cycle's exit path | Run outcome |
987
997
  |---|---|
988
- | Nothing actionable — the idle case (walk step 5): examined N, all active or in backoff | `nothing-needed` |
998
+ | Nothing actionable — the idle case (walk step 5): examined N, all active or in backoff — including a fix ticket suppressed by a prior decline (`rejection-detection` **Proposal rejection memory**), which the summary names in its suppression count | `nothing-needed` |
989
999
  | Repairs applied **and confirmed** this cycle — `resumed` / `resynced` / `recovered` / `unblocked` / `closed_out` / `rolled_up` / `relinked` / `normalized_ready` | `change-proved` |
990
1000
  | Repair produced new work for a human to pick up — e.g. an unmergeable PR or failed deploy filed as a **build-ready fix ticket** and left `blocked` | `candidate-proposed` |
991
1001
  | A repair reached an autonomy boundary needing a human (a protected-deploy approval before it can proceed) | `approval-requested` |
992
- | The loop itself could not run — the queue is unreadable or tracker credentials are revoked | `recovery-required` |
1002
+ | The loop itself could not run — the queue is unreadable, tracker credentials are revoked, or an open-and-closed rejection-memory / blocker-marker search is unreadable and therefore must not fall through to `nothing-needed` | `recovery-required` |
993
1003
 
994
1004
  Record **exactly one** outcome per invocation through the run-record CLI, naming this loop's runbook
995
1005
  (the `--summary` is the operator-readable one-liner in the contract's exemplar voice — plain,
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.256.0",
3
+ "version": "2.257.0",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -53,7 +53,7 @@ Resolve build labels from `.lisa.config.json` `github.labels.build.*` (defaults:
53
53
 
54
54
  If `github-verify` returns `FAIL` on any of the above, do NOT continue to build. **Draft the missing spec content first, then block for confirmation** — never bounce a raw "go write all this" checklist back to the author:
55
55
 
56
- 1. **Best-effort autofill (before blocking).** Run the **draft-then-block procedure** in the `pre-flight-autofill` rule: draft every *authorable* missing sectionTechnical Approach, Out of Scope, Gherkin acceptance criteria, expected-vs-actual, Repository, Relationship Search (run the git + `gh`/tracker search, don't fabricate it), a Validation Journey **draft** via `github-add-journey`, and Target Backend Environment from the issue's own content (title, body, screenshots, design links, repro steps) plus the codebase. For bugs, parse the reported environment from bare env names and env-bearing URLs before recommending any default; the reported environment wins. Write it into the body via `github-write-issue` as clearly-labeled assumptions/recommendations (never overwrite the author's prose), then re-run `github-verify`. Whatever the agent could author is now structured spec; only genuinely human-only inputs remain.
56
+ 1. **Best-effort autofill (before blocking).** Run `pre-flight-autofill` for every work item. Preserve a human bare configured key or `Confirmed: <env>`; automation writes `Inferred: <env>evidence: <title|body|reproduction|hostname>`, `Assumption: <env> remote default branch <branch>` for a unique reverse-map, or `Assumption: remote default branch <branch>` otherwise. Human confirmation replaces the annotation with the bare key or `Confirmed: <env>`. For a legacy bare value, use managed draft markers and current ticket content only; provider edit history is not required. A marker proves automation and requires re-annotation; otherwise unknown provenance plus conflicting evidence stops for confirmation. Resolve one exact `deploy.branches` key from the human-authored title, body, and reproduction steps or URL hostname; exclude the complete `Target Backend Environment` section and other machine-authored metadata/draft blocks so annotations cannot become evidence. A reported bug environment is an example, not a restriction. Evidence supersedes only `Assumption:`. Normalize `prod` ↔ `production` only when exactly one is configured; no other aliases exist. Conflicts stop; never infer from arbitrary branch text, URL paths/query strings, or substrings. Write through `github-write-issue`, never overwrite human prose, then re-run `github-verify`.
57
57
  2. Relabel: remove the `claimed` label, add the `blocked` label **and** the `human_needed` marker label. Even after the agent drafted what it could, a pre-flight gate failure bounces the issue back to its author because it still needs a human to **confirm the drafted assumptions** or supply something no agent can invent — real missing credentials, access, or an irreducible product/scoping decision — so the marker tells a human scanning the board which blocked issues are waiting on them. The marker is additive to `blocked`, not a replacement. (See the `config-resolution` rule's "Build markers" for when the marker applies and when it must NOT.)
58
58
  ```bash
59
59
  _read_cfg() { local lv gv; lv=$(jq -r "$1 // empty" .lisa.config.local.json 2>/dev/null); gv=$(jq -r "$1 // empty" .lisa.config.json 2>/dev/null); echo "${lv:-${gv}}"; }
@@ -152,4 +152,4 @@ Note: `done` may be a string or an env-keyed map (`{ dev, staging, production }`
152
152
  - Never create or materially edit an issue by calling `gh issue create` / `gh issue edit` directly — always delegate to `github-write-issue` (or, from a vendor-neutral caller, `tracker-write`) so relationships, Gherkin criteria, and metadata gates are enforced.
153
153
  - If sign-in credentials are in the issue body, extract and pass them to the flow. If the issue touches an authenticated surface and credentials are missing, that is a Step 2 failure — block and reassign rather than guessing.
154
154
  - If the issue has a `## Validation Journey` section, pass it to the verifier agent. The Validation Journey's local-verification step must point at the target backend environment named in the body.
155
- - For bug issues, the reported environment named in the issue body or reproduction steps drives the implementation base branch via `deploy.branches`. If no environment can be found anywhere in the ticket, fall back to the configured default branch and record that assumption. If the reported environment is present but missing from `deploy.branches`, or its mapped branch is absent on the remote, stop and report the missing environment/branch mapping instead of defaulting. A non-integration environment fix must be merged and verified on that environment branch, then forward cherry-picked down to the integration branch through a linked follow-up.
155
+ - The environment handoff for every work item uses the same durable grammar: human bare configured key or `Confirmed: <env>`; automated `Inferred: <env> — evidence: <title|body|reproduction|hostname>`, `Assumption: <env> remote default branch <branch>` for a unique reverse-map, or `Assumption: remote default branch <branch>` otherwise. Human confirmation replaces an automated annotation with the bare key or `Confirmed: <env>`. For legacy bare values, managed draft markers and current ticket content decide provenance; provider edit history is not required. A marker proves automation; otherwise unknown provenance plus conflicting evidence stops for confirmation. Human-confirmed wins, then validated `Inferred:`; otherwise one exact `deploy.branches` key from the human-authored title, body, and reproduction steps or URL hostname drives the implementation base branch. Exclude the complete `Target Backend Environment` section and other machine-authored metadata/draft blocks so annotations cannot become evidence. Evidence supersedes only `Assumption:`. Normalize `prod` ↔ `production` only when exactly one is configured; no other aliases exist. Conflicts stop. Never infer from arbitrary branch text, URL paths/query strings, or substrings. With no signal, use the remote default and record the applicable assumption without blocking on a non-unique reverse-map. Require any selected mapping and remote branch. A reported bug environment is an example of the all-work-type rule. Non-integration fixes still require the linked forward cherry-pick.
@@ -48,7 +48,7 @@ Use the `jira-verify` skill to check the ticket against organizational standards
48
48
  **Gating behavior — this is the one place auto-transitioning is allowed:**
49
49
 
50
50
  If `jira-verify` returns `FAIL` on any of the above, do NOT continue to build. **Draft the missing spec content first, then block for confirmation** — never bounce a raw "go write all this" checklist back to the reporter:
51
- 1. **Best-effort autofill (before blocking).** Run the **draft-then-block procedure** in the `pre-flight-autofill` rule: draft every *authorable* missing sectionTechnical Approach, Out of Scope, Gherkin acceptance criteria, expected-vs-actual, Repository, Relationship Search (run the git + JQL search, don't fabricate it), a Validation Journey **draft** via `jira-add-journey`, and Target Backend Environment from the ticket's own content (title, description, screenshots, design links, repro steps) plus the codebase. For bugs, parse the reported environment from bare env names and env-bearing URLs before recommending any default; the reported environment wins. Write it into the description via `jira-write-ticket` as clearly-labeled assumptions/recommendations (never overwrite the reporter's prose), then re-run `jira-verify`. Whatever the agent could author is now structured spec; only genuinely human-only inputs remain.
51
+ 1. **Best-effort autofill (before blocking).** Run `pre-flight-autofill` for every work item. Preserve a human bare configured key or `Confirmed: <env>`; automation writes `Inferred: <env>evidence: <title|body|reproduction|hostname>`, `Assumption: <env> remote default branch <branch>` for a unique reverse-map, or `Assumption: remote default branch <branch>` otherwise. Human confirmation replaces the annotation with the bare key or `Confirmed: <env>`. For a legacy bare value, use managed draft markers and current ticket content only; provider edit history is not required. A marker proves automation and requires re-annotation; otherwise unknown provenance plus conflicting evidence stops for confirmation. Resolve one exact `deploy.branches` key from the human-authored title, body, and reproduction steps or URL hostname; exclude the complete `Target Backend Environment` section and other machine-authored metadata/draft blocks so annotations cannot become evidence. A reported bug environment is an example, not a restriction. Evidence supersedes only `Assumption:`. Normalize `prod` `production` only when exactly one is configured; no other aliases exist. Conflicts stop; never infer from arbitrary branch text, URL paths/query strings, or substrings. Write through `jira-write-ticket`, never overwrite human prose, then re-run `jira-verify`.
52
52
  2. Transition the ticket status to the configured `blocked` status (typically `Blocked` — read from `.lisa.config.json` `jira.workflow.blocked` if present, otherwise the project's standard blocked status). Use `mcp__atlassian__transitionJiraIssue` or equivalent.
53
53
  3. **Add the `human_needed` marker label.** Even after the agent drafted what it could, a pre-flight gate failure bounces the ticket back to its reporter because the ticket still needs a human to **confirm the drafted assumptions** or supply something no agent can invent — real missing credentials, access, or an irreducible product/scoping decision. Add the configured label (`jira.labels.human_needed`, default `Human Needed`) to the ticket's `labels` field via `mcp__atlassian__editJiraIssue` — a lightweight metadata update permitted under this same gate exception. This is additive to (not a replacement for) the `blocked` status, so a human scanning the board sees at a glance which blocked tickets are waiting on them. If the label does not exist in the project, record that and proceed — the marker is best-effort. (See the `config-resolution` rule's "Build markers" for when the marker applies and when it must NOT.)
54
54
  4. Reassign the ticket to the **Reporter** (the human who filed it — not the Creator field, which may be a bot/integration).
@@ -132,4 +132,4 @@ Note: `done` may be a string or an env-keyed map (`{ dev, staging, production }`
132
132
  - Never create or materially edit a ticket by calling MCP write tools directly — always delegate to `jira-write-ticket` so relationships, Gherkin criteria, and metadata gates are enforced
133
133
  - If sign-in credentials are in the ticket, extract and pass them to the flow. If the ticket touches an authenticated surface and credentials are missing, that is a Step 2 failure — block and reassign rather than guessing.
134
134
  - If the ticket has a Validation Journey section, pass it to the verifier agent. The Validation Journey's local-verification step must point at the target backend environment named in the description (for FE work, that's the deployed backend QA reported against).
135
- - For bug tickets, the reported environment named in the description or reproduction steps drives the implementation base branch via `deploy.branches`. If no environment can be found anywhere in the ticket, fall back to the configured default branch and record that assumption. If the reported environment is present but missing from `deploy.branches`, or its mapped branch is absent on the remote, stop and report the missing environment/branch mapping instead of defaulting. A non-integration environment fix must be merged and verified on that environment branch, then forward cherry-picked down to the integration branch through a linked follow-up.
135
+ - The environment handoff for every work item uses the same durable grammar: human bare configured key or `Confirmed: <env>`; automated `Inferred: <env> — evidence: <title|body|reproduction|hostname>`, `Assumption: <env> remote default branch <branch>` for a unique reverse-map, or `Assumption: remote default branch <branch>` otherwise. Human confirmation replaces an automated annotation with the bare key or `Confirmed: <env>`. For legacy bare values, managed draft markers and current ticket content decide provenance; provider edit history is not required. A marker proves automation; otherwise unknown provenance plus conflicting evidence stops for confirmation. Human-confirmed wins, then validated `Inferred:`; otherwise one exact `deploy.branches` key from the human-authored title, body, and reproduction steps or URL hostname drives the implementation base branch. Exclude the complete `Target Backend Environment` section and other machine-authored metadata/draft blocks so annotations cannot become evidence. Evidence supersedes only `Assumption:`. Normalize `prod` ↔ `production` only when exactly one is configured; no other aliases exist. Conflicts stop. Never infer from arbitrary branch text, URL paths/query strings, or substrings. With no signal, use the remote default and record the applicable assumption without blocking on a non-unique reverse-map. Require any selected mapping and remote branch. A reported bug environment is an example of the all-work-type rule. Non-integration fixes still require the linked forward cherry-pick.
@@ -50,7 +50,7 @@ Use the `linear-verify` skill to check the item against organizational standards
50
50
  Resolve build labels from `.lisa.config.json` `linear.labels.build.*` (defaults: `status:ready` / `status:in-progress` / `status:code-review`); resolve the `blocked` label from the same section (`linear.labels.build.blocked`, default `status:blocked`) and the `human_needed` marker label from the same section (`linear.labels.build.human_needed`, default `human-needed`).
51
51
 
52
52
  If `linear-verify` returns `FAIL` on any of the above, do NOT continue to build. **Draft the missing spec content first, then block for confirmation** — never bounce a raw "go write all this" checklist back to the creator:
53
- 1. **Best-effort autofill (before blocking).** Run the **draft-then-block procedure** in the `pre-flight-autofill` rule: draft every *authorable* missing sectionTechnical Approach, Out of Scope, Gherkin acceptance criteria, expected-vs-actual, Repository, Relationship Search (run the git + Linear search, don't fabricate it), a Validation Journey **draft** via `linear-add-journey`, and Target Backend Environment from the item's own content (title, description, screenshots, design links, repro steps) plus the codebase. For bugs, parse the reported environment from bare env names and env-bearing URLs before recommending any default; the reported environment wins. Write it into the description via `linear-write-issue` as clearly-labeled assumptions/recommendations (never overwrite the creator's prose), then re-run `linear-verify`. Whatever the agent could author is now structured spec; only genuinely human-only inputs remain.
53
+ 1. **Best-effort autofill (before blocking).** Run `pre-flight-autofill` for every work item. Preserve a human bare configured key or `Confirmed: <env>`; automation writes `Inferred: <env>evidence: <title|body|reproduction|hostname>`, `Assumption: <env> remote default branch <branch>` for a unique reverse-map, or `Assumption: remote default branch <branch>` otherwise. Human confirmation replaces the annotation with the bare key or `Confirmed: <env>`. For a legacy bare value, use managed draft markers and current ticket content only; provider edit history is not required. A marker proves automation and requires re-annotation; otherwise unknown provenance plus conflicting evidence stops for confirmation. Resolve one exact `deploy.branches` key from the human-authored title, body, and reproduction steps or URL hostname; exclude the complete `Target Backend Environment` section and other machine-authored metadata/draft blocks so annotations cannot become evidence. A reported bug environment is an example, not a restriction. Evidence supersedes only `Assumption:`. Normalize `prod` `production` only when exactly one is configured; no other aliases exist. Conflicts stop; never infer from arbitrary branch text, URL paths/query strings, or substrings. Write through `linear-write-issue`, never overwrite human prose, then re-run `linear-verify`.
54
54
  2. Update labels via `lisa-linear-access operation: save-issue`: remove the current build label, add the configured `blocked` label **and** the configured `human_needed` marker label. (Create either label via `create_issue_label` if needed.) Even after the agent drafted what it could, a pre-flight gate failure bounces the item back to its creator because it still needs a human to **confirm the drafted assumptions** or supply something no agent can invent — real missing credentials, access, or an irreducible product/scoping decision — so the marker tells a human scanning the board which blocked items are waiting on them. The marker is additive to `blocked`, not a replacement. (See the `config-resolution` rule's "Build markers" for when the marker applies and when it must NOT.)
55
55
  3. Reassign the item to the **Issue creator** (the human who filed it — Linear's `creator` field).
56
56
  4. Post the **confirmation comment** from the `pre-flight-autofill` rule via `lisa-linear-access operation: save-comment`, **not** a bare remediation checklist: disclose it is a Claude draft, give one line per drafted section naming the key assumption made, list any remaining human-only item as a specific question with a recommended default, and close with *"review the drafted sections, correct anything wrong, then flip back to Ready and it builds — or reply with corrections."* Prefix with `[{repo}]`.
@@ -135,4 +135,4 @@ The label transitions ARE the canonical signal. The native `state` field stays a
135
135
  - Never create or materially edit an item by calling MCP write tools directly — always delegate to `linear-write-issue` so relationships, Gherkin criteria, and metadata gates are enforced. Two explicit exceptions are permitted: (1) the Step 2 pre-flight failure path (when `linear-verify` returns `FAIL`) may call `lisa-linear-access operation: save-issue` and `lisa-linear-access operation: save-comment` directly to set `status:blocked`, add the configured `human_needed` marker label, and reassign to the creator — this narrow exception is already granted by the rule above; (2) the Step 3 triage path may call `lisa-linear-access operation: save-comment` to post triage findings and `lisa-linear-access operation: save-issue` to add the `claude-triaged-{repo}` label — these are lightweight metadata updates that do not create or materially edit ticket content and therefore do not need to route through `linear-write-issue`.
136
136
  - If sign-in credentials are in the item, extract and pass them to the flow. If the item touches an authenticated surface and credentials are missing, that is a Step 2 failure — block and reassign rather than guessing.
137
137
  - If the item has a Validation Journey section, pass it to the verifier agent. The Validation Journey's local-verification step must point at the target backend environment named in the description.
138
- - For bug items, the reported environment named in the description or reproduction steps drives the implementation base branch via `deploy.branches`. If no environment can be found anywhere in the item, fall back to the configured default branch and record that assumption. If the reported environment is present but missing from `deploy.branches`, or its mapped branch is absent on the remote, stop and report the missing environment/branch mapping instead of defaulting. A non-integration environment fix must be merged and verified on that environment branch, then forward cherry-picked down to the integration branch through a linked follow-up.
138
+ - The environment handoff for every work item uses the same durable grammar: human bare configured key or `Confirmed: <env>`; automated `Inferred: <env> — evidence: <title|body|reproduction|hostname>`, `Assumption: <env> remote default branch <branch>` for a unique reverse-map, or `Assumption: remote default branch <branch>` otherwise. Human confirmation replaces an automated annotation with the bare key or `Confirmed: <env>`. For legacy bare values, managed draft markers and current ticket content decide provenance; provider edit history is not required. A marker proves automation; otherwise unknown provenance plus conflicting evidence stops for confirmation. Human-confirmed wins, then validated `Inferred:`; otherwise one exact `deploy.branches` key from the human-authored title, body, and reproduction steps or URL hostname drives the implementation base branch. Exclude the complete `Target Backend Environment` section and other machine-authored metadata/draft blocks so annotations cannot become evidence. Evidence supersedes only `Assumption:`. Normalize `prod` ↔ `production` only when exactly one is configured; no other aliases exist. Conflicts stop. Never infer from arbitrary branch text, URL paths/query strings, or substrings. With no signal, use the remote default and record the applicable assumption without blocking on a non-unique reverse-map. Require any selected mapping and remote branch. A reported bug environment is an example of the all-work-type rule. Non-integration fixes still require the linked forward cherry-pick.
@@ -222,23 +222,47 @@ Declares **where this repo's LLM Wiki lives** so the query/ingest skills can res
222
222
 
223
223
  ### Env → base branch
224
224
 
225
- Implementation flows resolve their PR base from the work item's
226
- `## Target Backend Environment` in the forward direction of `deploy.branches`.
225
+ Implementation flows resolve their PR base from the work item's environment
226
+ evidence in the forward direction of `deploy.branches`.
227
227
  For example, `{ "staging": "staging", "production": "main" }` means a staging
228
228
  work item starts from `origin/staging` and opens its PR against `staging`. This
229
229
  is the reverse/inverse of the env-keyed `done` inference that derives an
230
230
  environment from a merged PR's base branch.
231
231
 
232
- For bug work, the reported environment is authoritative. `pre-flight-autofill`
233
- must parse environment mentions from the description/body and reproduction
234
- steps, including bare names (`dev`, `staging`, `prod`, `production`) and
235
- environment-bearing URLs (`staging.<domain>`, `gql.staging.*`,
236
- `dev.<domain>`). A parsed reported environment wins over any generic autofill
237
- default. If no environment is named anywhere, the flow may fall back to the
238
- remote default branch and record that assumption on the work item.
239
-
240
- If the reported environment is not present in `deploy.branches`, stop and report
241
- the missing mapping. Do not silently default to the integration branch.
232
+ The field grammar records provenance durably: human-confirmed values are a bare
233
+ configured key or `Confirmed: <env>`; automated evidence is
234
+ `Inferred: <env> evidence: <title|body|reproduction|hostname>`; an automated
235
+ fallback is `Assumption: <env> — remote default branch <branch>`. Human
236
+ fallback without a unique reverse-map is
237
+ `Assumption: remote default branch <branch>`. Human
238
+ confirmation replaces an automated annotation with a bare key or
239
+ `Confirmed: <env>`.
240
+
241
+ For legacy bare values created before this grammar, use managed draft markers
242
+ and current ticket content only; provider edit history is neither required nor
243
+ assumed. A managed marker proves automation and requires rewriting to
244
+ `Inferred:` or `Assumption:`. Without one, provenance remains unknown, so the
245
+ bare value is usable only if no conflicting evidence exists; a conflict stops
246
+ for confirmation.
247
+
248
+ Resolve it in this order: human-confirmed wins; validated `Inferred:` evidence
249
+ is next; otherwise accept one unambiguous exact `deploy.branches` key from the
250
+ human-authored title, body, and reproduction steps or a URL hostname. Exclude
251
+ the entire `Target Backend Environment` section and all other machine-authored
252
+ metadata/draft blocks from the evidence scan, so annotations never validate or
253
+ conflict with themselves. Evidence supersedes only
254
+ an `Assumption:`. Treat the reported bug environment as an example of this
255
+ all-work-type evidence rule, not a special case. Normalize only built-in
256
+ `prod` ↔ `production` when exactly one is configured; no other aliases exist.
257
+ Never infer from arbitrary branch text, URL paths/query strings, or substrings.
258
+ Multiple conflicting signals stop. With no signals, use the remote default
259
+ branch and record an assumption: include the environment only for a unique
260
+ reverse-map; otherwise use the branch-only form without inventing an environment
261
+ or blocking solely on the reverse-map.
262
+
263
+ Every selected environment must have a unique `deploy.branches` mapping and its
264
+ mapped branch must exist on the remote. If either validation fails, stop and
265
+ report it. Do not silently default to the integration branch.
242
266
 
243
267
  For non-integration environment bugs, definition of done is two-step:
244
268
 
@@ -509,10 +533,25 @@ If a project's terminal state is the same regardless of env, set `done` to a str
509
533
 
510
534
  `deploy.branches` is also read in the **forward** direction by the build flow (`lisa-implement`): the environment a work item targets determines the branch the work is built on and the branch the PR opens against.
511
535
 
512
- 1. **Resolve the work item's target environment** its `## Target Backend Environment` field.
513
- 2. **If no environment is named**, use the **remote default branch** (`gh repo view --json defaultBranchRef`, or `origin/HEAD`) and record that default-branch assumption.
514
- 3. **If a reported environment exists**, map env → base branch via `deploy.branches` (e.g. `staging → staging`, `production → main`). A reported env absent from `deploy.branches`, or a mapped branch missing from the remote, must stop and report the exact missing environment-to-branch mapping; never guess and never silently fall back.
515
- 4. **Before any code is written**, `lisa-implement` fetches and **rebases the working branch onto `origin/<base>`, resolving conflicts**, so implementation builds on the latest target-environment code. **The PR then opens against that same base branch** (`target_branch=<base>` to `lisa-git-submit-pr`).
536
+ The durable field forms are: bare configured key or `Confirmed: <env>` for a
537
+ human-confirmed value; `Inferred: <env> evidence: <title|body|reproduction|hostname>`
538
+ for automation-backed evidence; and
539
+ `Assumption: <env> remote default branch <branch>` for a generic fallback.
540
+ When the remote default has no unique environment reverse-map, the valid form is
541
+ `Assumption: remote default branch <branch>`.
542
+ Human confirmation replaces the automated annotation with a bare key or
543
+ `Confirmed: <env>`.
544
+
545
+ For a legacy bare value, use managed draft markers and current ticket content
546
+ only; do not require provider edit history. A marker proves automation and
547
+ requires re-annotation; otherwise unknown provenance plus conflicting evidence
548
+ stops for confirmation.
549
+
550
+ 1. **Resolve provenance first.** Human-confirmed wins, then validated `Inferred:` evidence. Otherwise search the human-authored title, body, and reproduction steps or URL hostname for one unambiguous exact `deploy.branches` key. Exclude the complete `Target Backend Environment` section and other machine-authored metadata/draft blocks from the scan so annotations cannot become evidence. Evidence supersedes only an `Assumption:`.
551
+ 2. **Normalize narrowly.** Normalize built-in `prod` ↔ `production` only when exactly one of those keys is configured. No other aliases exist. Never infer from arbitrary branch text, URL paths/query strings, or substrings.
552
+ 3. **Handle absence and conflict explicitly.** Multiple conflicting signals stop. With no signals, use the remote default branch (`gh repo view --json defaultBranchRef`, or `origin/HEAD`) and record the env-bearing assumption only for a unique reverse-map; otherwise use the branch-only assumption without inventing an environment or blocking.
553
+ 4. **Validate the destination.** The selected exact configured key must map uniquely and the mapped remote branch must exist; otherwise stop without guessing or falling back.
554
+ 5. **Before any code is written**, `lisa-implement` fetches and **rebases the working branch onto `origin/<base>`, resolving conflicts**, then opens the PR against that same base (`target_branch=<base>`).
516
555
 
517
556
  This is the exact inverse of the env-keyed `done` "Branch inference" above: `done` derives the env *from* the PR base branch (reverse); the build flow derives the base branch *from* the env (forward). Both use the one `deploy.branches` map, so the branch a PR targets and the `done` status it earns always agree.
518
557
 
@@ -53,13 +53,32 @@ empirical evidence only—native Playwright/Cypress/Maestro remains the regressi
53
53
 
54
54
  ## Env → base branch
55
55
 
56
- For implementation work, map the work item's `## Target Backend Environment` to
57
- the PR base branch through `.lisa.config.json` `deploy.branches`. For bugs, a
58
- reported environment extracted from the description/reproduction steps wins over
59
- an autofill default. If a reported environment is absent from `deploy.branches`,
60
- stop and report the missing mapping instead of silently falling back to the
61
- default or integration branch. A non-integration environment bug is fixed,
62
- merged, and verified on that environment branch first, then forward
63
- cherry-picked down to the integration branch via a linked follow-up.
56
+ The `## Target Backend Environment` grammar is durable: human-confirmed values
57
+ are a bare configured key or `Confirmed: <env>`; automation writes either
58
+ `Inferred: <env> evidence: <title|body|reproduction|hostname>` or
59
+ `Assumption: <env> remote default branch <branch>`. When no unique environment
60
+ maps to the default branch, use `Assumption: remote default branch <branch>`.
61
+ Human confirmation replaces an automated annotation with a bare key or
62
+ `Confirmed: <env>`. For legacy bare values, use managed draft markers and current
63
+ ticket content only; provider edit history is not required. A marker proves
64
+ automation and requires re-annotation; otherwise unknown provenance with
65
+ conflicting evidence stops for confirmation.
66
+
67
+ Resolution order is human-confirmed value; validated `Inferred:` evidence; then
68
+ one unambiguous signal from the human-authored title, body, and reproduction
69
+ steps or a URL hostname. Exclude the complete `Target Backend Environment`
70
+ section and other machine-authored metadata/draft blocks from the scan so an
71
+ annotation cannot validate or conflict with itself. Evidence supersedes only an
72
+ `Assumption:`. A signal must be an exact
73
+ `deploy.branches` key as a complete token/hostname label. The sole normalization
74
+ is `prod` ↔ `production` when exactly one is configured; no other aliases exist.
75
+ Conflicting signals stop. Never infer from arbitrary branch text, URL paths or
76
+ query strings, or substrings. With no signals, use the remote default branch and
77
+ record an assumption: include `<env>` only for a unique reverse-map, otherwise
78
+ use the branch-only form without inventing an environment or blocking. Require
79
+ any selected environment mapping and its remote branch to exist.
80
+ A non-integration environment bug is fixed, merged, and verified on that
81
+ environment branch first, then
82
+ forward cherry-picked down to the integration branch via a linked follow-up.
64
83
 
65
84
  Full reference: [reference/config-resolution.md](config-resolution-reference.mdc).
@@ -99,7 +99,11 @@ A manual re-run next week must not duplicate last week's tickets. Mirror the `re
99
99
  - Anomaly: `sha1("<source>:<stable-signature>:<CURRENT_REPO>")` (12 hex chars). `stable-signature` is the Sentry issue short-id (or culprit), the CloudWatch alarm name, or `errorType@location` — something that survives between runs, **never** the human title or occurrence count.
100
100
  - Gap: the literal `gap:<dimension>:<CURRENT_REPO>` (a dimension is missing-or-not; no hash needed).
101
101
  2. **Sentinel in the body.** Embed `<!-- lisa:monitor-finding: <fingerprint> -->` in every filed ticket.
102
- 3. **Search before create** (this IS gate S13). Before filing, search the tracker for the fingerprint string. The search **MUST include closed/resolved tickets** (`gh issue list --search <fp> --state all` for GitHub; JQL with no status filter for JIRA; all states for Linear) — otherwise a just-closed match is invisible and the backoff below can't fire. If an **open** ticket carries the fingerprint → skip (optionally link). If a ticket carrying it was closed **within the recently-resolved backoff window** (`monitor.backoffHours`, default **24h** matching the 24h Sentry event window; this is **not** the 2h `intake.repair.staleAfterHours`) → skip, to avoid re-filing a just-fixed regression before its signal has drained. Only file when no live or recently-resolved match exists.
102
+ 3. **Search before create** (this IS gate S13). Before filing, search the tracker for the fingerprint string. The search **MUST include closed/resolved tickets** (`gh issue list --search <fp> --state all` for GitHub; JQL with no status filter for JIRA; all states for Linear) — otherwise a just-closed match is invisible and the backoff and decline checks below can't fire. If an **open** ticket carries the fingerprint → skip (optionally link). Otherwise classify a closed match by **how** it closed:
103
+ - **Closed as _not planned_ — a permanent decline** (`rejection-detection` **Proposal rejection memory**). GitHub `stateReason == "not_planned"`; the config-resolved won't-do/canceled equivalent on JIRA/Linear (never a hardcoded lane string). This is a durable human "no", not a time-boxed guard: **suppress the finding regardless of age**, and re-file only with evidence that **postdates the decline**. The new ticket MUST carry BOTH the machine token (`declined <date>; recurred <date> in <ref>`) and the human acknowledgment sentence (`You declined this on <date>. It has recurred (<date>, <ref>), so we're raising it once more for your review.`). This layers *on top of* the backoff below — a not_planned close outlives any window.
104
+ - **Closed as _completed_ within the recently-resolved backoff window** (`monitor.backoffHours`, default **24h** — matching the 24h Sentry event window; this is **not** the 2h `intake.repair.staleAfterHours`) → skip, to avoid re-filing a just-fixed regression before its signal has drained. A completed close **older** than the window is not a decline — a genuine recurrence is a regression and may file.
105
+
106
+ Only file when no live match, no recently-resolved completed match, and no prior not_planned decline exists.
103
107
 
104
108
  ## The cap
105
109
 
@@ -54,14 +54,29 @@ spec.
54
54
  - **Validation Journey (draft)** — run the vendor `*-add-journey` skill to draft
55
55
  the click-path, markers, and viewports from the reproduction steps. This is a
56
56
  draft for human approval, not the final ratified contract.
57
- - **Target Backend Environment** — for bugs, first parse the reported
58
- environment from the title, description/body, screenshots captions, links, and
59
- reproduction steps. Bare words such as `dev`, `staging`, `prod`, and
60
- `production` count, as do environment-bearing URLs such as
61
- `staging.<domain>`, `gql.staging.*`, and `dev.<domain>`. That reported
62
- environment is authoritative for the draft. Only recommend the repo's
63
- remote default branch when no environment is discoverable anywhere in the
64
- work item, and record the default as an explicit assumption.
57
+ - **Target Backend Environment** — preserve a bare configured key or
58
+ `Confirmed: <env>` as human-confirmed. Automated evidence must write
59
+ `Inferred: <env> evidence: <title|body|reproduction|hostname>`; a generic
60
+ fallback must write `Assumption: <env> remote default branch <branch>`.
61
+ If the default branch has no unique environment reverse-map, instead write
62
+ `Assumption: remote default branch <branch>` without inventing an environment.
63
+ Human confirmation replaces an automated annotation with a bare key or
64
+ `Confirmed: <env>`. For legacy bare values, use managed draft markers and
65
+ current ticket content only; provider edit history is not required. A marker
66
+ proves automation and requires re-annotation; otherwise unknown provenance
67
+ plus conflicting evidence stops for confirmation. A human-confirmed value wins, followed by validated
68
+ `Inferred:` evidence. Otherwise inspect the title, body, and reproduction
69
+ steps or a URL hostname for one unambiguous exact `deploy.branches` key,
70
+ excluding the complete `Target Backend Environment` section and all other
71
+ machine-authored metadata/draft blocks so annotations cannot become evidence.
72
+ Clear evidence supersedes only an `Assumption:` value. The sole normalization
73
+ is `prod` ↔ `production` when exactly one key is configured; no other aliases
74
+ exist. Never infer from arbitrary branch text, URL paths or query strings, or
75
+ substrings. Multiple conflicting signals **stop** autofill. With no
76
+ environment signal, use the remote default and record the applicable
77
+ `Assumption:` form; a missing/ambiguous reverse-map alone never blocks.
78
+ Require any selected environment mapping and remote branch. Never overwrite
79
+ human prose.
65
80
 
66
81
  **Tier B — irreducibly human (cannot invent — but still propose a default):**
67
82
 
@@ -26,13 +26,27 @@ information was already on the ticket; only the structure was missing).
26
26
  Gherkin Acceptance Criteria (one scenario per fix), expected-vs-actual +
27
27
  environment, Repository, Relationship Search (actually run the git+tracker
28
28
  search — don't fabricate "none found"), Validation Journey **draft** (via the
29
- vendor `*-add-journey` skill), Target Backend Environment. For bugs, parse the
30
- reported environment from the item body/reproduction steps before recommending
31
- any default: bare environment names (`dev`, `staging`, `prod`, `production`)
32
- and environment-bearing URLs (for example `staging.<domain>`, `gql.staging.*`,
33
- `dev.<domain>`) are authoritative. Only recommend the repo's remote default branch when
34
- no environment is discoverable anywhere in the work item, and record that as
35
- an assumption.
29
+ vendor `*-add-journey` skill), Target Backend Environment. Preserve a bare
30
+ configured key or `Confirmed: <env>` as human-confirmed. Automation writes
31
+ `Inferred: <env> evidence: <title|body|reproduction|hostname>` or
32
+ `Assumption: <env> remote default branch <branch>`. Without a unique
33
+ reverse-map use `Assumption: remote default branch <branch>`; human confirmation
34
+ replaces the annotation with a bare key or `Confirmed: <env>`. For legacy bare
35
+ values, use managed draft markers and current ticket content only; provider
36
+ edit history is not required. A marker proves automation and requires
37
+ re-annotation; otherwise unknown provenance plus conflicting evidence stops.
38
+ Human-confirmed wins, then validated `Inferred:`
39
+ evidence. Otherwise use one unambiguous exact `deploy.branches` key from the
40
+ title, body, and reproduction steps or a URL hostname, excluding the complete
41
+ `Target Backend Environment` section and other machine-authored metadata/draft
42
+ blocks so annotations cannot become evidence. Evidence supersedes only
43
+ `Assumption:`. Normalize only built-in
44
+ `prod` ↔ `production` when exactly one is configured; no other aliases exist.
45
+ Never infer from arbitrary branch text, URL paths/query strings, or substrings.
46
+ Conflicting signals **stop** autofill. With no environment signal, use the
47
+ remote default and record the applicable `Assumption:` form; a non-unique
48
+ reverse-map alone never blocks. Require any selected mapping and remote branch.
49
+ Never overwrite human prose.
36
50
  - **Tier B — irreducibly human:** real credentials/access that exist nowhere on
37
51
  the item or in repo test-user docs; a genuine product/scoping decision with no
38
52
  defensible default. Still propose a recommended default where one exists; ask