@codyswann/lisa 2.176.8 → 2.176.10

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 (102) hide show
  1. package/package.json +1 -1
  2. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  3. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  4. package/plugins/lisa/agents/github-agent.md +11 -9
  5. package/plugins/lisa/agents/jira-agent.md +8 -7
  6. package/plugins/lisa/agents/linear-agent.md +7 -6
  7. package/plugins/lisa/rules/eager/pre-flight-autofill.md +65 -0
  8. package/plugins/lisa/rules/reference/base-rules.md +1 -1
  9. package/plugins/lisa/rules/reference/config-resolution.md +2 -2
  10. package/plugins/lisa/rules/reference/pre-flight-autofill.md +142 -0
  11. package/plugins/lisa/skills/github-build-intake/SKILL.md +25 -3
  12. package/plugins/lisa/skills/jira-build-intake/SKILL.md +25 -3
  13. package/plugins/lisa/skills/linear-build-intake/SKILL.md +25 -3
  14. package/plugins/lisa/skills/repair-intake/SKILL.md +5 -2
  15. package/plugins/lisa-agy/agents/github-agent.md +11 -9
  16. package/plugins/lisa-agy/agents/jira-agent.md +8 -7
  17. package/plugins/lisa-agy/agents/linear-agent.md +7 -6
  18. package/plugins/lisa-agy/plugin.json +1 -1
  19. package/plugins/lisa-agy/skills/github-build-intake/SKILL.md +25 -3
  20. package/plugins/lisa-agy/skills/jira-build-intake/SKILL.md +25 -3
  21. package/plugins/lisa-agy/skills/linear-build-intake/SKILL.md +25 -3
  22. package/plugins/lisa-agy/skills/repair-intake/SKILL.md +5 -2
  23. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  24. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  25. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  26. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  28. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-copilot/agents/github-agent.agent.md +11 -9
  30. package/plugins/lisa-copilot/agents/jira-agent.agent.md +8 -7
  31. package/plugins/lisa-copilot/agents/linear-agent.agent.md +7 -6
  32. package/plugins/lisa-copilot/rules/eager/pre-flight-autofill.md +65 -0
  33. package/plugins/lisa-copilot/rules/reference/base-rules.md +1 -1
  34. package/plugins/lisa-copilot/rules/reference/config-resolution.md +2 -2
  35. package/plugins/lisa-copilot/rules/reference/pre-flight-autofill.md +142 -0
  36. package/plugins/lisa-copilot/skills/github-build-intake/SKILL.md +25 -3
  37. package/plugins/lisa-copilot/skills/jira-build-intake/SKILL.md +25 -3
  38. package/plugins/lisa-copilot/skills/linear-build-intake/SKILL.md +25 -3
  39. package/plugins/lisa-copilot/skills/repair-intake/SKILL.md +5 -2
  40. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-cursor/agents/github-agent.md +11 -9
  42. package/plugins/lisa-cursor/agents/jira-agent.md +8 -7
  43. package/plugins/lisa-cursor/agents/linear-agent.md +7 -6
  44. package/plugins/lisa-cursor/rules/base-rules-reference.mdc +1 -1
  45. package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +2 -2
  46. package/plugins/lisa-cursor/rules/pre-flight-autofill-reference.mdc +147 -0
  47. package/plugins/lisa-cursor/rules/pre-flight-autofill.mdc +70 -0
  48. package/plugins/lisa-cursor/skills/github-build-intake/SKILL.md +25 -3
  49. package/plugins/lisa-cursor/skills/jira-build-intake/SKILL.md +25 -3
  50. package/plugins/lisa-cursor/skills/linear-build-intake/SKILL.md +25 -3
  51. package/plugins/lisa-cursor/skills/repair-intake/SKILL.md +5 -2
  52. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  54. package/plugins/lisa-expo-agy/plugin.json +1 -1
  55. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  59. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  60. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  64. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  65. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  69. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  70. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  72. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  74. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  75. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  76. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  77. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  79. package/plugins/lisa-rails-agy/plugin.json +1 -1
  80. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  81. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  82. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  83. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  84. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  85. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  86. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  87. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  88. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  89. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  90. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  91. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  92. package/plugins/src/base/agents/github-agent.md +11 -9
  93. package/plugins/src/base/agents/jira-agent.md +8 -7
  94. package/plugins/src/base/agents/linear-agent.md +7 -6
  95. package/plugins/src/base/rules/eager/pre-flight-autofill.md +65 -0
  96. package/plugins/src/base/rules/reference/base-rules.md +1 -1
  97. package/plugins/src/base/rules/reference/config-resolution.md +2 -2
  98. package/plugins/src/base/rules/reference/pre-flight-autofill.md +142 -0
  99. package/plugins/src/base/skills/github-build-intake/SKILL.md +25 -3
  100. package/plugins/src/base/skills/jira-build-intake/SKILL.md +25 -3
  101. package/plugins/src/base/skills/linear-build-intake/SKILL.md +25 -3
  102. package/plugins/src/base/skills/repair-intake/SKILL.md +5 -2
@@ -51,22 +51,24 @@ Use the `github-verify` skill to check the issue against organizational standard
51
51
 
52
52
  Resolve build labels from `.lisa.config.json` `github.labels.build.*` (defaults: `status:ready` / `status:in-progress` / env-keyed `status:on-*`); resolve the `blocked` label from the same section (`github.labels.build.blocked`, default `status:blocked`) and the `human_needed` marker label from the same section (`github.labels.build.human_needed`, default `human-needed`).
53
53
 
54
- If `github-verify` returns `FAIL` on any of the above, do NOT continue:
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. Relabel: remove the `claimed` label, add the `blocked` label **and** the `human_needed` marker label. A pre-flight gate failure bounces the issue back to its author precisely because it needs something **no agent and no automated retry can supply** credentials, access, a product/scoping decision, or required issue quality only the human can addso 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.)
56
+ 1. **Best-effort autofill (before blocking).** Run the **draft-then-block procedure** in the `pre-flight-autofill` rule: draft every *authorable* missing section Technical 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 a recommended Target Backend Environmentfrom the issue's own content (title, body, screenshots, design links, repro steps) plus the codebase. 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.
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.)
57
58
  ```bash
58
- CLAIMED=$(jq -r '.github.labels.build.claimed // "status:in-progress"' .lisa.config.json)
59
- BLOCKED=$(jq -r '.github.labels.build.blocked // "status:blocked"' .lisa.config.json)
60
- HUMAN_NEEDED=$(jq -r '.github.labels.build.human_needed // "human-needed"' .lisa.config.json)
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}}"; }
60
+ CLAIMED=$(_read_cfg '.github.labels.build.claimed'); CLAIMED="${CLAIMED:-status:in-progress}"
61
+ BLOCKED=$(_read_cfg '.github.labels.build.blocked'); BLOCKED="${BLOCKED:-status:blocked}"
62
+ HUMAN_NEEDED=$(_read_cfg '.github.labels.build.human_needed'); HUMAN_NEEDED="${HUMAN_NEEDED:-human-needed}"
61
63
  gh label create "$HUMAN_NEEDED" --color D93F0B --description "Blocked on human-only input (credentials / access / decision)" --repo <org>/<repo> 2>/dev/null || true
62
64
  gh issue edit <num> --repo <org>/<repo> --remove-label "$CLAIMED" --add-label "$BLOCKED" --add-label "$HUMAN_NEEDED"
63
65
  ```
64
- 2. Reassign the issue back to its **author** (the original reporter — `author.login` from `gh issue view --json author`). Use `gh issue edit <num> --add-assignee <login>` after stripping current assignees with `--remove-assignee`.
65
- 3. Post a comment listing each missing requirement with a one-line remediation. Prefix with `[<repo>]`:
66
+ 3. Reassign the issue back to its **author** (the original reporter — `author.login` from `gh issue view --json author`). Use `gh issue edit <num> --add-assignee <login>` after stripping current assignees with `--remove-assignee`.
67
+ 4. Post the **confirmation comment** from the `pre-flight-autofill` rule, **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>]`:
66
68
  ```bash
67
69
  gh issue comment <num> --repo <org>/<repo> --body-file /tmp/blocked-comment.md
68
70
  ```
69
- 4. Stop. Do not run triage, do not delegate to a flow, do not start work.
71
+ 5. Stop. Do not run triage, do not delegate to a flow, do not start work.
70
72
 
71
73
  **Exception — single-repo scope is split, not blocked.** A single-repo-scope FAIL is the one gate failure the agent fixes rather than bounces to the author: a cross-repo work unit is a decomposition error the agent owns (S10 is `product_relevant: false`), not a product question. Instead of blocking, run the **work-time split procedure** in the `repo-scope-split` rule — narrow this issue to one repo, create a sibling issue per additional repo cloning its metadata, encode the producer→consumer dependency (`Blocked by #<n>` / `Blocks #<n>`), comment on the original, then re-run `github-verify` on the original and every new sibling. Block (per the path above) only if the split is ambiguous (see "When to block instead of split"). If single-repo scope was the only FAIL and the split succeeded, proceed to Step 3 once every resulting issue passes.
72
74
 
@@ -143,7 +145,7 @@ Note: `done` may be a string or an env-keyed map (`{ dev, staging, production }`
143
145
 
144
146
  ## Rules
145
147
 
146
- - Never auto-relabel build labels, with one explicit exception: when `github-verify` returns FAIL for the pre-flight gate (Step 2), relabel to the configured `blocked` label, add the configured `human_needed` marker label (`github.labels.build.human_needed`, default `human-needed`), and reassign to the original author. The build-intake owner transitions a successful issue from `claimed` directly to the configured `done` label after PR evidence is posted.
148
+ - Never auto-relabel build labels, with one explicit exception: when `github-verify` returns FAIL for the pre-flight gate (Step 2), first run the `pre-flight-autofill` draft-then-block procedure (draft the authorable missing sections into the issue body as labeled assumptions), then relabel to the configured `blocked` label, add the configured `human_needed` marker label (`github.labels.build.human_needed`, default `human-needed`), and reassign to the original author with a confirmation comment. The build-intake owner transitions a successful issue from `claimed` directly to the configured `done` label after PR evidence is posted.
147
149
  - Always read the full issue graph via `github-read-issue` before determining intent — don't rely on the `type:` label alone.
148
150
  - 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.
149
151
  - 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.
@@ -47,12 +47,13 @@ Use the `jira-verify` skill to check the ticket against organizational standards
47
47
 
48
48
  **Gating behavior — this is the one place auto-transitioning is allowed:**
49
49
 
50
- If `jira-verify` returns `FAIL` on any of the above, do NOT continue:
51
- 1. 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.
52
- 2. **Add the `human_needed` marker label.** A pre-flight gate failure bounces the ticket back to its reporter precisely because it needs something **no agent and no automated retry can supply** — credentials, access, a product/scoping decision, or required ticket quality only the human can add. 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.)
53
- 3. Reassign the ticket to the **Reporter** (the human who filed it — not the Creator field, which may be a bot/integration).
54
- 4. Post a comment using `mcp__atlassian__addCommentToJiraIssue` listing each missing requirement with a one-line remediation. Prefix with `[{repo}]`.
55
- 5. Stop. Do not run triage, do not delegate to a flow, do not start work.
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 section Technical 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 a recommended Target Backend Environment — from the ticket's own content (title, description, screenshots, design links, repro steps) plus the codebase. 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.
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
+ 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
+ 4. Reassign the ticket to the **Reporter** (the human who filed it not the Creator field, which may be a bot/integration).
55
+ 5. Post a comment using `mcp__atlassian__addCommentToJiraIssue` — the **confirmation comment** from the `pre-flight-autofill` rule, **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}]`.
56
+ 6. Stop. Do not run triage, do not delegate to a flow, do not start work.
56
57
 
57
58
  **Exception — single-repo scope is split, not blocked.** A single-repo-scope FAIL is the one gate failure the agent fixes rather than bounces to the reporter: a cross-repo work unit is a decomposition error the agent owns (S10 is `product_relevant: false`), not a product question. Instead of blocking, run the **work-time split procedure** in the `repo-scope-split` rule — narrow this ticket to one repo, create a sibling per additional repo cloning its metadata, link the producer→consumer dependency (`Blocks` / `is blocked by`), comment on the original, then re-run `jira-verify` on the original and every new sibling. Block (per the path above) only if the split is ambiguous (see "When to block instead of split"). If single-repo scope was the only FAIL and the split succeeded, proceed to Step 3 once every resulting ticket passes.
58
59
 
@@ -123,7 +124,7 @@ Note: `done` may be a string or an env-keyed map (`{ dev, staging, production }`
123
124
 
124
125
  ## Rules
125
126
 
126
- - Never auto-transition ticket status, with one explicit exception: when `jira-verify` returns `FAIL` for the pre-flight gate (Step 2), transition to the configured `blocked` status, add the configured `human_needed` marker label (`jira.labels.human_needed`, default `Human Needed`), and reassign to the Reporter. Every other status change remains a suggestion the human confirms.
127
+ - Never auto-transition ticket status, with one explicit exception: when `jira-verify` returns `FAIL` for the pre-flight gate (Step 2), first run the `pre-flight-autofill` draft-then-block procedure (draft the authorable missing sections into the ticket as labeled assumptions), then transition to the configured `blocked` status, add the configured `human_needed` marker label (`jira.labels.human_needed`, default `Human Needed`), and reassign to the Reporter with a confirmation comment. Every other status change remains a suggestion the human confirms.
127
128
  - Any transition is config-bound: never invent transitions; a transition may target only a status named in `config.jira.workflow`. Don't guess from the live workflow. The evidence-time review hop (Step 7) follows this rule too — it is config-bound, optional, and skipped when `jira.workflow.review` is absent (the ticket stays in `claimed`).
128
129
  - Always read the full ticket graph via `jira-read-ticket` before determining intent — don't rely on ticket type alone
129
130
  - 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
@@ -49,11 +49,12 @@ Use the `linear-verify` skill to check the item against organizational standards
49
49
 
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
- If `linear-verify` returns `FAIL` on any of the above, do NOT continue:
53
- 1. Update labels via `mcp__linear-server__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.) A pre-flight gate failure bounces the item back to its creator precisely because it needs something **no agent and no automated retry can supply**credentials, access, a product/scoping decision, or required item quality only the human can add — 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.)
54
- 2. Reassign the item to the **Issue creator** (the human who filed it — Linear's `creator` field).
55
- 3. Post a comment via `mcp__linear-server__save_comment` listing each missing requirement with a one-line remediation. Prefix with `[{repo}]`.
56
- 4. Stop. Do not run triage, do not delegate to a flow, do not start work.
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 section Technical 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 a recommended Target Backend Environmentfrom the item's own content (title, description, screenshots, design links, repro steps) plus the codebase. 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.
54
+ 2. Update labels via `mcp__linear-server__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
+ 3. Reassign the item to the **Issue creator** (the human who filed it Linear's `creator` field).
56
+ 4. Post the **confirmation comment** from the `pre-flight-autofill` rule via `mcp__linear-server__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}]`.
57
+ 5. Stop. Do not run triage, do not delegate to a flow, do not start work.
57
58
 
58
59
  **Exception — single-repo scope is split, not blocked.** A single-repo-scope FAIL is the one gate failure the agent fixes rather than bounces to the creator: a cross-repo work unit is a decomposition error the agent owns (S10 is `product_relevant: false`), not a product question. Instead of blocking, run the **work-time split procedure** in the `repo-scope-split` rule — narrow this item to one repo, create a sibling Issue per additional repo cloning its metadata (same `projectId`), add the producer→consumer blocking relation, comment on the original, then re-run `linear-verify` on the original and every new sibling. Block (per the path above) only if the split is ambiguous (see "When to block instead of split"). If single-repo scope was the only FAIL and the split succeeded, proceed to Step 3 once every resulting item passes.
59
60
 
@@ -127,7 +128,7 @@ The label transitions ARE the canonical signal. The native `state` field stays a
127
128
 
128
129
  ## Rules
129
130
 
130
- - Never auto-transition the native Linear `state`, with one explicit exception: when `linear-verify` returns `FAIL` for the pre-flight gate (Step 2), update labels to the configured `blocked` label, add the configured `human_needed` marker label (`linear.labels.build.human_needed`, default `human-needed`), and reassign to the creator. Every other status change remains a label-driven suggestion.
131
+ - Never auto-transition the native Linear `state`, with one explicit exception: when `linear-verify` returns `FAIL` for the pre-flight gate (Step 2), first run the `pre-flight-autofill` draft-then-block procedure (draft the authorable missing sections into the description as labeled assumptions), then update labels to the configured `blocked` label, add the configured `human_needed` marker label (`linear.labels.build.human_needed`, default `human-needed`), and reassign to the creator with a confirmation comment. Every other status change remains a label-driven suggestion.
131
132
  - Always read the full item graph via `linear-read-issue` before determining intent — don't rely on type labels alone.
132
133
  - 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 `mcp__linear-server__save_issue` and `mcp__linear-server__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 `mcp__linear-server__save_comment` to post triage findings and `mcp__linear-server__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`.
133
134
  - 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.
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.176.8",
3
+ "version": "2.176.10",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -256,9 +256,31 @@ This is the idempotency lock — a re-entrant cycle's `--label $READY` filter wi
256
256
 
257
257
  If the relabel fails (permission, race), log under "Errors" in the cycle summary and skip this issue. **Do not invoke the build flow on an issue you didn't successfully claim.**
258
258
 
259
- #### 3c. Run the build flow
259
+ #### 3c. Return or run the build delegation
260
+
261
+ After the claim succeeds, the per-issue build must run under `lisa:github-agent` (the per-issue lifecycle agent), but a teammate running this skill must not spawn that named peer itself. Claude teams are flat: only the lead can add a named teammate. Therefore:
262
+
263
+ - If you are the team lead/root agent, spawn or invoke `lisa:github-agent` with the issue ref and wait for its structured result.
264
+ - If you are a teammate, stop this skill's direct work and return a structured `delegation-request` to the lead instead of calling `Agent` with `name` or otherwise spawning `github-agent` as a named peer.
265
+ - A private anonymous helper is allowed only when the helper is not a roster peer and the `Agent` call omits `name`; it must not replace this `github-agent` delegation.
266
+
267
+ Return this payload shape to the lead:
268
+
269
+ ```json
270
+ {
271
+ "type": "delegation-request",
272
+ "agent": "github-agent",
273
+ "workItem": "<org>/<repo>#<number>",
274
+ "context": {
275
+ "claimedLabel": "$CLAIMED",
276
+ "doneResolution": "Resolve $DONE from the PR base branch per this skill's Workflow resolution section"
277
+ },
278
+ "onSuccess": "Confirm the returned PR is merged, then apply Phase 3d and Phase 3d.1",
279
+ "onBlockedOrError": "Leave the issue where github-agent left it and record the surfaced outcome"
280
+ }
281
+ ```
260
282
 
261
- Invoke `lisa:github-agent` (the per-issue lifecycle agent) with the issue ref. `lisa:github-agent` owns:
283
+ `lisa:github-agent` owns:
262
284
  - Reading the full issue graph (`lisa:github-read-issue`)
263
285
  - Running its own pre-flight quality gate (`lisa:github-verify`)
264
286
  - Running issue triage (`lisa:ticket-triage`)
@@ -266,7 +288,7 @@ Invoke `lisa:github-agent` (the per-issue lifecycle agent) with the issue ref. `
266
288
  - Posting progress comments via `lisa:github-sync`
267
289
  - Posting evidence via `lisa:github-evidence`
268
290
 
269
- Wait for `lisa:github-agent` to return. Capture its outcome:
291
+ The lead waits for `lisa:github-agent` to return, then resumes this scanner with the returned outcome:
270
292
 
271
293
  - **Success** — the build flow completed and a PR exists; evidence posted. The PR may already be **merged** or still **open** (auto-merge enabled, awaiting checks/merge). "Success" means the build work is sound — it does **not** assert the change reached an environment. The env transition in 3d gates on the PR actually being merged; an open PR does not advance the issue to a `done` env status.
272
294
  - **Blocked by github-verify pre-flight gate** — `lisa:github-agent` itself relabels the issue to `status:blocked` (or removes `$CLAIMED` and reassigns to the original author). This is correct and expected — let it stand. Record and move on.
@@ -203,9 +203,31 @@ Transition the ticket from `$READY` to `$CLAIMED` by invoking `lisa:atlassian-ac
203
203
 
204
204
  If the transition fails (permission, missing transition, race), log under "Errors" in the cycle summary and skip this ticket. **Do not invoke the build flow on a ticket you didn't successfully claim.**
205
205
 
206
- #### 3c. Run the build flow
206
+ #### 3c. Return or run the build delegation
207
+
208
+ After the claim succeeds, the per-ticket build must run under `lisa:jira-agent` (the per-ticket lifecycle agent), but a teammate running this skill must not spawn that named peer itself. Claude teams are flat: only the lead can add a named teammate. Therefore:
209
+
210
+ - If you are the team lead/root agent, spawn or invoke `lisa:jira-agent` with the ticket key and wait for its structured result.
211
+ - If you are a teammate, stop this skill's direct work and return a structured `delegation-request` to the lead instead of calling `Agent` with `name` or otherwise spawning `jira-agent` as a named peer.
212
+ - A private anonymous helper is allowed only when the helper is not a roster peer and the `Agent` call omits `name`; it must not replace this `jira-agent` delegation.
213
+
214
+ Return this payload shape to the lead:
215
+
216
+ ```json
217
+ {
218
+ "type": "delegation-request",
219
+ "agent": "jira-agent",
220
+ "workItem": "<TICKET>",
221
+ "context": {
222
+ "claimedStatus": "$CLAIMED",
223
+ "doneResolution": "Resolve $DONE from the PR base branch per this skill's Workflow resolution section"
224
+ },
225
+ "onSuccess": "Confirm the returned PR is merged, then apply Phase 3d and Phase 3d.1",
226
+ "onBlockedOrError": "Leave the ticket where jira-agent left it and record the surfaced outcome"
227
+ }
228
+ ```
207
229
 
208
- Invoke the `lisa:jira-agent` (existing per-ticket lifecycle agent) with the ticket key. `lisa:jira-agent` owns:
230
+ `lisa:jira-agent` owns:
209
231
  - Reading the full ticket graph (`lisa:jira-read-ticket`)
210
232
  - Running its own pre-flight quality gate (`lisa:jira-verify`)
211
233
  - Running ticket triage (`lisa:ticket-triage`)
@@ -213,7 +235,7 @@ Invoke the `lisa:jira-agent` (existing per-ticket lifecycle agent) with the tick
213
235
  - Posting progress comments via `lisa:jira-sync`
214
236
  - Posting evidence via `lisa:jira-evidence`
215
237
 
216
- Wait for `lisa:jira-agent` to return. Capture its outcome:
238
+ The lead waits for `lisa:jira-agent` to return, then resumes this scanner with the returned outcome:
217
239
  - **Success** — the build flow completed and a PR exists; evidence posted. The PR may already be **merged** or still **open** (auto-merge enabled, awaiting checks/merge). "Success" means the build work is sound — it does **not** assert the change reached an environment. The env transition in 3d gates on the PR actually being merged; an open PR does not advance the ticket to a `done` env status.
218
240
  - **Blocked by jira-verify pre-flight gate** — `lisa:jira-agent` itself transitions the ticket to `Blocked` and reassigns to Reporter. This is correct and expected — let it stand. Record the outcome and move on.
219
241
  - **Duplicate already fixed** — `lisa:jira-agent` / `lisa:ticket-triage` returned `DUPLICATE_ALREADY_FIXED` with a canonical ticket reference and empirical base-branch evidence. Post the triage finding, ensure the native `duplicates <canonical>` link exists, transition to the terminal `$DONE` status with resolution `Duplicate`, and do not open a PR. If the canonical fix is merged but not yet on the production branch, the close comment must say the production error can recur until the canonical ticket promotes and that recurrence is tracked by the canonical ticket; do not reopen this duplicate for that recurrence.
@@ -196,9 +196,31 @@ This is the idempotency lock — a re-entrant cycle's `label: $READY` filter wil
196
196
 
197
197
  If the relabel fails (permission, race), record under "Errors" and skip. **Do not invoke the build flow on an Issue you didn't successfully claim.**
198
198
 
199
- #### 3c. Run the build flow
199
+ #### 3c. Return or run the build delegation
200
+
201
+ After the claim succeeds, the per-Issue build must run under `lisa:linear-agent` (the per-Issue lifecycle agent), but a teammate running this skill must not spawn that named peer itself. Claude teams are flat: only the lead can add a named teammate. Therefore:
202
+
203
+ - If you are the team lead/root agent, spawn or invoke `lisa:linear-agent` with the Issue identifier and wait for its structured result.
204
+ - If you are a teammate, stop this skill's direct work and return a structured `delegation-request` to the lead instead of calling `Agent` with `name` or otherwise spawning `linear-agent` as a named peer.
205
+ - A private anonymous helper is allowed only when the helper is not a roster peer and the `Agent` call omits `name`; it must not replace this `linear-agent` delegation.
206
+
207
+ Return this payload shape to the lead:
208
+
209
+ ```json
210
+ {
211
+ "type": "delegation-request",
212
+ "agent": "linear-agent",
213
+ "workItem": "<ISSUE-ID>",
214
+ "context": {
215
+ "claimedLabel": "$CLAIMED",
216
+ "doneResolution": "Resolve $DONE from the PR base branch per this skill's Workflow resolution section"
217
+ },
218
+ "onSuccess": "Confirm the returned PR is merged, then apply Phase 3d and Phase 3d.1",
219
+ "onBlockedOrError": "Leave the Issue where linear-agent left it and record the surfaced outcome"
220
+ }
221
+ ```
200
222
 
201
- Invoke `lisa:linear-agent` (per-Issue lifecycle agent) with the Issue identifier. `lisa:linear-agent` owns:
223
+ `lisa:linear-agent` owns:
202
224
  - Reading the full Issue graph (`lisa:linear-read-issue`)
203
225
  - Running its own pre-flight quality gate (`lisa:linear-verify`)
204
226
  - Running ticket triage (`lisa:ticket-triage`)
@@ -206,7 +228,7 @@ Invoke `lisa:linear-agent` (per-Issue lifecycle agent) with the Issue identifier
206
228
  - Posting progress comments via `lisa:linear-sync`
207
229
  - Posting evidence via `lisa:linear-evidence`
208
230
 
209
- Wait for the agent to return. Capture its outcome:
231
+ The lead waits for `lisa:linear-agent` to return, then resumes this scanner with the returned outcome:
210
232
  - **Success** — the build flow completed and a PR exists; evidence posted. The PR may already be **merged** or still **open** (auto-merge enabled, awaiting checks/merge). "Success" means the build work is sound — it does **not** assert the change reached an environment. The env transition in 3d gates on the PR actually being merged; an open PR does not advance the Issue to a `done` env status.
211
233
  - **Blocked by linear-verify pre-flight gate** — `lisa:linear-agent` itself relabels to `status:blocked` and assigns to creator. Let it stand. Record and move on.
212
234
  - **Duplicate already fixed** — `lisa:linear-agent` / `lisa:ticket-triage` returned `DUPLICATE_ALREADY_FIXED` with a canonical Issue reference and empirical base-branch evidence. Post the triage finding, ensure the native `duplicates <canonical>` relationship exists when Linear exposes it (otherwise leave an explicit relation/comment reference), apply the terminal `$DONE` label, move the native Issue to the configured canceled-as-duplicate or completed terminal state, and do not open a PR. If the canonical fix is merged but not yet on the production branch, the close comment must say the production error can recur until the canonical Issue promotes and that recurrence is tracked by the canonical Issue; do not reopen this duplicate for that recurrence.
@@ -334,8 +334,11 @@ If the PR is healthy in-flight and no blocker is found, the work simply died mid
334
334
  the vendor build-intake runs**, skipping the claim transition (the item is already `claimed`):
335
335
 
336
336
  1. Dispatch the item to the vendor agent — `lisa:jira-agent` / `lisa:github-agent` /
337
- `lisa:linear-agent` (matching the queue's tracker) — with the item ref. This resumes the work
338
- in place, preserving its existing branch/PR and prior comments.
337
+ `lisa:linear-agent` (matching the queue's tracker) — with the item ref. If repair-intake is
338
+ running as a teammate rather than the lead/root agent, return a structured `delegation-request`
339
+ to the lead instead of spawning that named peer yourself; only the lead can add named teammates
340
+ in Claude's flat roster. This resumes the work in place, preserving its existing branch/PR and
341
+ prior comments.
339
342
  2. **On agent success**, apply the scanner's post-agent transition yourself: `claimed → done`,
340
343
  where `done` is **env-resolved** exactly as `lisa:<tracker>-build-intake` resolves it (per
341
344
  `config-resolution` env-keyed `done`: explicit `target_env` arg wins; else reverse-lookup the
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.176.8",
3
+ "version": "2.176.10",
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.176.8",
3
+ "version": "2.176.10",
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.176.8",
3
+ "version": "2.176.10",
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.176.8",
3
+ "version": "2.176.10",
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.176.8",
3
+ "version": "2.176.10",
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.176.8",
3
+ "version": "2.176.10",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -51,22 +51,24 @@ Use the `github-verify` skill to check the issue against organizational standard
51
51
 
52
52
  Resolve build labels from `.lisa.config.json` `github.labels.build.*` (defaults: `status:ready` / `status:in-progress` / env-keyed `status:on-*`); resolve the `blocked` label from the same section (`github.labels.build.blocked`, default `status:blocked`) and the `human_needed` marker label from the same section (`github.labels.build.human_needed`, default `human-needed`).
53
53
 
54
- If `github-verify` returns `FAIL` on any of the above, do NOT continue:
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. Relabel: remove the `claimed` label, add the `blocked` label **and** the `human_needed` marker label. A pre-flight gate failure bounces the issue back to its author precisely because it needs something **no agent and no automated retry can supply** credentials, access, a product/scoping decision, or required issue quality only the human can addso 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.)
56
+ 1. **Best-effort autofill (before blocking).** Run the **draft-then-block procedure** in the `pre-flight-autofill` rule: draft every *authorable* missing section Technical 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 a recommended Target Backend Environmentfrom the issue's own content (title, body, screenshots, design links, repro steps) plus the codebase. 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.
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.)
57
58
  ```bash
58
- CLAIMED=$(jq -r '.github.labels.build.claimed // "status:in-progress"' .lisa.config.json)
59
- BLOCKED=$(jq -r '.github.labels.build.blocked // "status:blocked"' .lisa.config.json)
60
- HUMAN_NEEDED=$(jq -r '.github.labels.build.human_needed // "human-needed"' .lisa.config.json)
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}}"; }
60
+ CLAIMED=$(_read_cfg '.github.labels.build.claimed'); CLAIMED="${CLAIMED:-status:in-progress}"
61
+ BLOCKED=$(_read_cfg '.github.labels.build.blocked'); BLOCKED="${BLOCKED:-status:blocked}"
62
+ HUMAN_NEEDED=$(_read_cfg '.github.labels.build.human_needed'); HUMAN_NEEDED="${HUMAN_NEEDED:-human-needed}"
61
63
  gh label create "$HUMAN_NEEDED" --color D93F0B --description "Blocked on human-only input (credentials / access / decision)" --repo <org>/<repo> 2>/dev/null || true
62
64
  gh issue edit <num> --repo <org>/<repo> --remove-label "$CLAIMED" --add-label "$BLOCKED" --add-label "$HUMAN_NEEDED"
63
65
  ```
64
- 2. Reassign the issue back to its **author** (the original reporter — `author.login` from `gh issue view --json author`). Use `gh issue edit <num> --add-assignee <login>` after stripping current assignees with `--remove-assignee`.
65
- 3. Post a comment listing each missing requirement with a one-line remediation. Prefix with `[<repo>]`:
66
+ 3. Reassign the issue back to its **author** (the original reporter — `author.login` from `gh issue view --json author`). Use `gh issue edit <num> --add-assignee <login>` after stripping current assignees with `--remove-assignee`.
67
+ 4. Post the **confirmation comment** from the `pre-flight-autofill` rule, **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>]`:
66
68
  ```bash
67
69
  gh issue comment <num> --repo <org>/<repo> --body-file /tmp/blocked-comment.md
68
70
  ```
69
- 4. Stop. Do not run triage, do not delegate to a flow, do not start work.
71
+ 5. Stop. Do not run triage, do not delegate to a flow, do not start work.
70
72
 
71
73
  **Exception — single-repo scope is split, not blocked.** A single-repo-scope FAIL is the one gate failure the agent fixes rather than bounces to the author: a cross-repo work unit is a decomposition error the agent owns (S10 is `product_relevant: false`), not a product question. Instead of blocking, run the **work-time split procedure** in the `repo-scope-split` rule — narrow this issue to one repo, create a sibling issue per additional repo cloning its metadata, encode the producer→consumer dependency (`Blocked by #<n>` / `Blocks #<n>`), comment on the original, then re-run `github-verify` on the original and every new sibling. Block (per the path above) only if the split is ambiguous (see "When to block instead of split"). If single-repo scope was the only FAIL and the split succeeded, proceed to Step 3 once every resulting issue passes.
72
74
 
@@ -143,7 +145,7 @@ Note: `done` may be a string or an env-keyed map (`{ dev, staging, production }`
143
145
 
144
146
  ## Rules
145
147
 
146
- - Never auto-relabel build labels, with one explicit exception: when `github-verify` returns FAIL for the pre-flight gate (Step 2), relabel to the configured `blocked` label, add the configured `human_needed` marker label (`github.labels.build.human_needed`, default `human-needed`), and reassign to the original author. The build-intake owner transitions a successful issue from `claimed` directly to the configured `done` label after PR evidence is posted.
148
+ - Never auto-relabel build labels, with one explicit exception: when `github-verify` returns FAIL for the pre-flight gate (Step 2), first run the `pre-flight-autofill` draft-then-block procedure (draft the authorable missing sections into the issue body as labeled assumptions), then relabel to the configured `blocked` label, add the configured `human_needed` marker label (`github.labels.build.human_needed`, default `human-needed`), and reassign to the original author with a confirmation comment. The build-intake owner transitions a successful issue from `claimed` directly to the configured `done` label after PR evidence is posted.
147
149
  - Always read the full issue graph via `github-read-issue` before determining intent — don't rely on the `type:` label alone.
148
150
  - 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.
149
151
  - 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.
@@ -47,12 +47,13 @@ Use the `jira-verify` skill to check the ticket against organizational standards
47
47
 
48
48
  **Gating behavior — this is the one place auto-transitioning is allowed:**
49
49
 
50
- If `jira-verify` returns `FAIL` on any of the above, do NOT continue:
51
- 1. 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.
52
- 2. **Add the `human_needed` marker label.** A pre-flight gate failure bounces the ticket back to its reporter precisely because it needs something **no agent and no automated retry can supply** — credentials, access, a product/scoping decision, or required ticket quality only the human can add. 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.)
53
- 3. Reassign the ticket to the **Reporter** (the human who filed it — not the Creator field, which may be a bot/integration).
54
- 4. Post a comment using `mcp__atlassian__addCommentToJiraIssue` listing each missing requirement with a one-line remediation. Prefix with `[{repo}]`.
55
- 5. Stop. Do not run triage, do not delegate to a flow, do not start work.
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 section Technical 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 a recommended Target Backend Environment — from the ticket's own content (title, description, screenshots, design links, repro steps) plus the codebase. 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.
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
+ 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
+ 4. Reassign the ticket to the **Reporter** (the human who filed it not the Creator field, which may be a bot/integration).
55
+ 5. Post a comment using `mcp__atlassian__addCommentToJiraIssue` — the **confirmation comment** from the `pre-flight-autofill` rule, **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}]`.
56
+ 6. Stop. Do not run triage, do not delegate to a flow, do not start work.
56
57
 
57
58
  **Exception — single-repo scope is split, not blocked.** A single-repo-scope FAIL is the one gate failure the agent fixes rather than bounces to the reporter: a cross-repo work unit is a decomposition error the agent owns (S10 is `product_relevant: false`), not a product question. Instead of blocking, run the **work-time split procedure** in the `repo-scope-split` rule — narrow this ticket to one repo, create a sibling per additional repo cloning its metadata, link the producer→consumer dependency (`Blocks` / `is blocked by`), comment on the original, then re-run `jira-verify` on the original and every new sibling. Block (per the path above) only if the split is ambiguous (see "When to block instead of split"). If single-repo scope was the only FAIL and the split succeeded, proceed to Step 3 once every resulting ticket passes.
58
59
 
@@ -123,7 +124,7 @@ Note: `done` may be a string or an env-keyed map (`{ dev, staging, production }`
123
124
 
124
125
  ## Rules
125
126
 
126
- - Never auto-transition ticket status, with one explicit exception: when `jira-verify` returns `FAIL` for the pre-flight gate (Step 2), transition to the configured `blocked` status, add the configured `human_needed` marker label (`jira.labels.human_needed`, default `Human Needed`), and reassign to the Reporter. Every other status change remains a suggestion the human confirms.
127
+ - Never auto-transition ticket status, with one explicit exception: when `jira-verify` returns `FAIL` for the pre-flight gate (Step 2), first run the `pre-flight-autofill` draft-then-block procedure (draft the authorable missing sections into the ticket as labeled assumptions), then transition to the configured `blocked` status, add the configured `human_needed` marker label (`jira.labels.human_needed`, default `Human Needed`), and reassign to the Reporter with a confirmation comment. Every other status change remains a suggestion the human confirms.
127
128
  - Any transition is config-bound: never invent transitions; a transition may target only a status named in `config.jira.workflow`. Don't guess from the live workflow. The evidence-time review hop (Step 7) follows this rule too — it is config-bound, optional, and skipped when `jira.workflow.review` is absent (the ticket stays in `claimed`).
128
129
  - Always read the full ticket graph via `jira-read-ticket` before determining intent — don't rely on ticket type alone
129
130
  - 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
@@ -49,11 +49,12 @@ Use the `linear-verify` skill to check the item against organizational standards
49
49
 
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
- If `linear-verify` returns `FAIL` on any of the above, do NOT continue:
53
- 1. Update labels via `mcp__linear-server__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.) A pre-flight gate failure bounces the item back to its creator precisely because it needs something **no agent and no automated retry can supply**credentials, access, a product/scoping decision, or required item quality only the human can add — 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.)
54
- 2. Reassign the item to the **Issue creator** (the human who filed it — Linear's `creator` field).
55
- 3. Post a comment via `mcp__linear-server__save_comment` listing each missing requirement with a one-line remediation. Prefix with `[{repo}]`.
56
- 4. Stop. Do not run triage, do not delegate to a flow, do not start work.
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 section Technical 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 a recommended Target Backend Environmentfrom the item's own content (title, description, screenshots, design links, repro steps) plus the codebase. 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.
54
+ 2. Update labels via `mcp__linear-server__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
+ 3. Reassign the item to the **Issue creator** (the human who filed it Linear's `creator` field).
56
+ 4. Post the **confirmation comment** from the `pre-flight-autofill` rule via `mcp__linear-server__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}]`.
57
+ 5. Stop. Do not run triage, do not delegate to a flow, do not start work.
57
58
 
58
59
  **Exception — single-repo scope is split, not blocked.** A single-repo-scope FAIL is the one gate failure the agent fixes rather than bounces to the creator: a cross-repo work unit is a decomposition error the agent owns (S10 is `product_relevant: false`), not a product question. Instead of blocking, run the **work-time split procedure** in the `repo-scope-split` rule — narrow this item to one repo, create a sibling Issue per additional repo cloning its metadata (same `projectId`), add the producer→consumer blocking relation, comment on the original, then re-run `linear-verify` on the original and every new sibling. Block (per the path above) only if the split is ambiguous (see "When to block instead of split"). If single-repo scope was the only FAIL and the split succeeded, proceed to Step 3 once every resulting item passes.
59
60
 
@@ -127,7 +128,7 @@ The label transitions ARE the canonical signal. The native `state` field stays a
127
128
 
128
129
  ## Rules
129
130
 
130
- - Never auto-transition the native Linear `state`, with one explicit exception: when `linear-verify` returns `FAIL` for the pre-flight gate (Step 2), update labels to the configured `blocked` label, add the configured `human_needed` marker label (`linear.labels.build.human_needed`, default `human-needed`), and reassign to the creator. Every other status change remains a label-driven suggestion.
131
+ - Never auto-transition the native Linear `state`, with one explicit exception: when `linear-verify` returns `FAIL` for the pre-flight gate (Step 2), first run the `pre-flight-autofill` draft-then-block procedure (draft the authorable missing sections into the description as labeled assumptions), then update labels to the configured `blocked` label, add the configured `human_needed` marker label (`linear.labels.build.human_needed`, default `human-needed`), and reassign to the creator with a confirmation comment. Every other status change remains a label-driven suggestion.
131
132
  - Always read the full item graph via `linear-read-issue` before determining intent — don't rely on type labels alone.
132
133
  - 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 `mcp__linear-server__save_issue` and `mcp__linear-server__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 `mcp__linear-server__save_comment` to post triage findings and `mcp__linear-server__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`.
133
134
  - 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.
@@ -0,0 +1,65 @@
1
+ # Pre-Flight Spec Autofill — Draft-Then-Block (load-bearing)
2
+
3
+ When the pre-flight gate (`*-agent` Step 2) returns `FAIL` on **ticket-quality**
4
+ gaps, do **not** bounce a raw checklist back to the reporter. Most "missing
5
+ required spec content" gaps are **authorable** from material already on the work
6
+ item (title, description, screenshots, design links, repro steps) plus the
7
+ codebase. **Draft** a best-effort version of every authorable gap, write it into
8
+ the item as clearly-labeled **assumptions/recommendations**, and only **then**
9
+ block — turning the human ask from *"author all this"* into *"confirm or correct
10
+ my draft, then flip back to Ready."* Same shape as `repo-scope-split`: the agent
11
+ does the work it can; the human decides only what only a human can.
12
+
13
+ This does **not** widen the gate — every required section must still exist
14
+ before build. It replaces an empty demand with a defensible first draft, and it
15
+ breaks the `Ready ↔ Blocked` ping-pong loop that a raw checklist causes (the
16
+ information was already on the ticket; only the structure was missing).
17
+
18
+ ## Two tiers
19
+
20
+ - **Tier A — authorable (always draft):** Technical Approach, Out of Scope,
21
+ Gherkin Acceptance Criteria (one scenario per fix), expected-vs-actual +
22
+ environment, Repository, Relationship Search (actually run the git+tracker
23
+ search — don't fabricate "none found"), Validation Journey **draft** (via the
24
+ vendor `*-add-journey` skill), Target Backend Environment (recommend a default
25
+ from `deploy.branches`/config).
26
+ - **Tier B — irreducibly human:** real credentials/access that exist nowhere on
27
+ the item or in repo test-user docs; a genuine product/scoping decision with no
28
+ defensible default. Still propose a recommended default where one exists; ask
29
+ a specific question only where none does.
30
+
31
+ ## Procedure
32
+
33
+ 1. Enumerate FAIL categories from `*-verify`. If S10 failed, run
34
+ `repo-scope-split` first (split, not autofill).
35
+ 2. Draft each Tier-A gap grounded in item material + codebase; tag every
36
+ inference as an assumption. **Never overwrite human prose** — add/augment
37
+ sections only.
38
+ 3. Write the draft via the vendor write skill (`jira-write-ticket` /
39
+ `github-write-issue` / `linear-write-issue`); draft the Validation Journey
40
+ via `*-add-journey`.
41
+ 4. Re-run `*-verify`. Structural gates should now PASS; anything still failing
42
+ is Tier B — name it in the comment.
43
+ 5. Block as usual (`blocked` status + `human_needed` marker + reassign to
44
+ Reporter) but post the **confirmation comment**, not a checklist: disclose
45
+ it's a Claude draft, one line per drafted section + its key assumption,
46
+ Tier-B items as specific questions with defaults, and close with *"correct
47
+ anything wrong, then flip back to Ready and it builds — or reply with
48
+ corrections."*
49
+ 6. **Loop-safety:** if the item already carries the agent's draft, refine only
50
+ the still-failing gaps; don't redraft. Re-readying after review is the
51
+ human's approval — the next claim's `*-verify` PASSes and build proceeds.
52
+
53
+ ## When you genuinely cannot autofill
54
+
55
+ If drafting would be fabrication (no fix/expected behavior described, no usable
56
+ design ref, uninformative title, no codebase anchor), block as before — but
57
+ phrase each gap as a specific question with a default where defensible. Never a
58
+ bare checklist when a defensible draft is possible.
59
+
60
+ The agent writes **spec/criteria, never code**, at this gate — authoring AC and
61
+ a validation journey is explicitly permitted here (this supersedes the older
62
+ "the build agent does not author the missing spec content" stance).
63
+
64
+ Full procedure, tier detail, confirmation-comment template, and vendor mechanics:
65
+ [reference/pre-flight-autofill.md](../reference/pre-flight-autofill.md).
@@ -78,7 +78,7 @@ JIRA Discipline:
78
78
  - **Gherkin acceptance criteria** (Given/When/Then) so the implementer can verify behavior without guessing.
79
79
  - **Relationship discovery evidence** — either an issue link to a related ticket, or a documented search showing none was found (see Relationship Discovery in jira-verify).
80
80
  - Ticket metadata MUST include an **epic parent** for non-bug, non-epic tickets so every Story/Task/Sub-task is traceable to a strategic goal.
81
- - Pre-flight gate before starting work on any ticket: if the description is missing target backend environment (when applicable), sign-in credentials (when applicable), Gherkin acceptance criteria, epic parent (non-bug/non-epic), or relationship discovery evidence, transition the ticket to Blocked, reassign to the **Reporter**, and post a comment listing exactly what is missing. Do not start work. This is the one place where auto-transitioning status is allowed.
81
+ - Pre-flight gate before starting work on any ticket: if the description is missing target backend environment (when applicable), sign-in credentials (when applicable), Gherkin acceptance criteria, epic parent (non-bug/non-epic), or relationship discovery evidence, first **draft** the authorable missing sections into the ticket as clearly-labeled assumptions (the `pre-flight-autofill` draft-then-block procedure — the agent writes spec, never code, here), then transition the ticket to Blocked, reassign to the **Reporter**, and post a **confirmation** comment asking them to confirm the drafted assumptions (not a bare "go write all this" checklist). Do not start work. This is the one place where auto-transitioning status is allowed.
82
82
  - When checking for associated pull requests on a JIRA issue, check the **Development panel** — not just comments or description text. The Development panel shows PRs, commits, branches, and builds linked via the GitHub-Jira integration. Query it via the dev-status API:
83
83
  ```bash
84
84
  ISSUE_ID=$(curl -s -u "${JIRA_LOGIN}:${JIRA_API_TOKEN}" \