@codyswann/lisa 2.315.0 → 2.316.1

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 (127) hide show
  1. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  2. package/dist/core/upstream-evidence-manifest.js +23 -12
  3. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  4. package/package.json +1 -1
  5. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  6. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  7. package/plugins/lisa/.codex-plugin/skills/lisa-atlassian-access/SKILL.md +10 -1
  8. package/plugins/lisa/.codex-plugin/skills/lisa-github-to-tracker/SKILL.md +1 -1
  9. package/plugins/lisa/.codex-plugin/skills/lisa-intake/SKILL.md +1 -1
  10. package/plugins/lisa/.codex-plugin/skills/lisa-linear-to-tracker/SKILL.md +3 -3
  11. package/plugins/lisa/.codex-plugin/skills/lisa-notion-to-tracker/SKILL.md +3 -3
  12. package/plugins/lisa/.codex-plugin/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
  13. package/plugins/lisa/.codex-plugin/skills/lisa-spec-conformance/SKILL.md +1 -1
  14. package/plugins/lisa/.codex-plugin/skills/lisa-verify-prd/SKILL.md +6 -4
  15. package/plugins/lisa/agents/jira-agent.md +3 -3
  16. package/plugins/lisa/hooks/enforce-verification-gate.sh +52 -2
  17. package/plugins/lisa/rules/eager/automation-runbook-contract.md +25 -0
  18. package/plugins/lisa/rules/eager/settled-decisions.md +55 -0
  19. package/plugins/lisa/rules/reference/repo-scope-split.md +1 -1
  20. package/plugins/lisa/rules/reference/settled-decisions.md +29 -0
  21. package/plugins/lisa/skills/lisa-atlassian-access/SKILL.md +10 -1
  22. package/plugins/lisa/skills/lisa-github-to-tracker/SKILL.md +1 -1
  23. package/plugins/lisa/skills/lisa-intake/SKILL.md +1 -1
  24. package/plugins/lisa/skills/lisa-linear-to-tracker/SKILL.md +3 -3
  25. package/plugins/lisa/skills/lisa-notion-to-tracker/SKILL.md +3 -3
  26. package/plugins/lisa/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
  27. package/plugins/lisa/skills/lisa-spec-conformance/SKILL.md +1 -1
  28. package/plugins/lisa/skills/lisa-verify-prd/SKILL.md +6 -4
  29. package/plugins/lisa-agy/agents/jira-agent.md +3 -3
  30. package/plugins/lisa-agy/plugin.json +1 -1
  31. package/plugins/lisa-agy/skills/lisa-atlassian-access/SKILL.md +10 -1
  32. package/plugins/lisa-agy/skills/lisa-github-to-tracker/SKILL.md +1 -1
  33. package/plugins/lisa-agy/skills/lisa-intake/SKILL.md +1 -1
  34. package/plugins/lisa-agy/skills/lisa-linear-to-tracker/SKILL.md +3 -3
  35. package/plugins/lisa-agy/skills/lisa-notion-to-tracker/SKILL.md +3 -3
  36. package/plugins/lisa-agy/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
  37. package/plugins/lisa-agy/skills/lisa-spec-conformance/SKILL.md +1 -1
  38. package/plugins/lisa-agy/skills/lisa-verify-prd/SKILL.md +6 -4
  39. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  41. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  42. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-copilot/agents/jira-agent.agent.md +3 -3
  46. package/plugins/lisa-copilot/hooks/enforce-verification-gate.sh +52 -2
  47. package/plugins/lisa-copilot/rules/eager/automation-runbook-contract.md +25 -0
  48. package/plugins/lisa-copilot/rules/eager/settled-decisions.md +55 -0
  49. package/plugins/lisa-copilot/rules/reference/repo-scope-split.md +1 -1
  50. package/plugins/lisa-copilot/rules/reference/settled-decisions.md +29 -0
  51. package/plugins/lisa-copilot/skills/lisa-atlassian-access/SKILL.md +10 -1
  52. package/plugins/lisa-copilot/skills/lisa-github-to-tracker/SKILL.md +1 -1
  53. package/plugins/lisa-copilot/skills/lisa-intake/SKILL.md +1 -1
  54. package/plugins/lisa-copilot/skills/lisa-linear-to-tracker/SKILL.md +3 -3
  55. package/plugins/lisa-copilot/skills/lisa-notion-to-tracker/SKILL.md +3 -3
  56. package/plugins/lisa-copilot/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
  57. package/plugins/lisa-copilot/skills/lisa-spec-conformance/SKILL.md +1 -1
  58. package/plugins/lisa-copilot/skills/lisa-verify-prd/SKILL.md +6 -4
  59. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-cursor/agents/jira-agent.md +3 -3
  61. package/plugins/lisa-cursor/hooks/enforce-verification-gate.sh +52 -2
  62. package/plugins/lisa-cursor/rules/automation-runbook-contract.mdc +25 -0
  63. package/plugins/lisa-cursor/rules/repo-scope-split-reference.mdc +1 -1
  64. package/plugins/lisa-cursor/rules/settled-decisions-reference.mdc +34 -0
  65. package/plugins/lisa-cursor/rules/settled-decisions.mdc +60 -0
  66. package/plugins/lisa-cursor/skills/lisa-atlassian-access/SKILL.md +10 -1
  67. package/plugins/lisa-cursor/skills/lisa-github-to-tracker/SKILL.md +1 -1
  68. package/plugins/lisa-cursor/skills/lisa-intake/SKILL.md +1 -1
  69. package/plugins/lisa-cursor/skills/lisa-linear-to-tracker/SKILL.md +3 -3
  70. package/plugins/lisa-cursor/skills/lisa-notion-to-tracker/SKILL.md +3 -3
  71. package/plugins/lisa-cursor/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
  72. package/plugins/lisa-cursor/skills/lisa-spec-conformance/SKILL.md +1 -1
  73. package/plugins/lisa-cursor/skills/lisa-verify-prd/SKILL.md +6 -4
  74. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  76. package/plugins/lisa-expo-agy/plugin.json +1 -1
  77. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  79. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  80. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  81. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  82. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  83. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  84. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  85. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  86. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  87. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  88. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  89. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  90. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  91. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  92. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  93. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  94. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  95. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  96. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  97. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  98. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  99. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  100. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  101. package/plugins/lisa-rails-agy/plugin.json +1 -1
  102. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  103. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  104. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  105. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  106. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  107. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  108. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  109. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  110. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  111. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  112. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  113. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  114. package/plugins/src/base/agents/jira-agent.md +3 -3
  115. package/plugins/src/base/hooks/enforce-verification-gate.sh +52 -2
  116. package/plugins/src/base/rules/eager/automation-runbook-contract.md +25 -0
  117. package/plugins/src/base/rules/eager/settled-decisions.md +55 -0
  118. package/plugins/src/base/rules/reference/repo-scope-split.md +1 -1
  119. package/plugins/src/base/rules/reference/settled-decisions.md +29 -0
  120. package/plugins/src/base/skills/lisa-atlassian-access/SKILL.md +10 -1
  121. package/plugins/src/base/skills/lisa-github-to-tracker/SKILL.md +1 -1
  122. package/plugins/src/base/skills/lisa-intake/SKILL.md +1 -1
  123. package/plugins/src/base/skills/lisa-linear-to-tracker/SKILL.md +3 -3
  124. package/plugins/src/base/skills/lisa-notion-to-tracker/SKILL.md +3 -3
  125. package/plugins/src/base/skills/lisa-prd-ticket-coverage/SKILL.md +2 -2
  126. package/plugins/src/base/skills/lisa-spec-conformance/SKILL.md +1 -1
  127. package/plugins/src/base/skills/lisa-verify-prd/SKILL.md +6 -4
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.315.0",
3
+ "version": "2.316.1",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -369,4 +369,13 @@ Do not paraphrase substrate output beyond JSON normalization.
369
369
 
370
370
  ## Headless behavior
371
371
 
372
- In a headless / non-interactive context (no TTY, `CI=true`, or `-p` mode), the MCP tier is unavailable (its OAuth flow needs a browser). The substrate ladder collapses to: acli (if pre-authenticated, e.g., a CI image baked with a service-account token) → curl + `ATLASSIAN_API_TOKEN`. Never block on interactive prompts. If both fail readiness checks, exit non-zero with a deterministic error.
372
+ In a headless / non-interactive context, the MCP tier is unavailable (its OAuth flow needs a browser). The substrate ladder collapses to: acli (if pre-authenticated, e.g., a CI image baked with a service-account token) → curl + `ATLASSIAN_API_TOKEN`. Never block on interactive prompts. If both fail readiness checks, exit non-zero with a deterministic error.
373
+
374
+ Treat all four of these as headless:
375
+
376
+ - no TTY
377
+ - `CI=true`
378
+ - `-p` mode
379
+ - **a subagent / teammate session** — measured (#2148): a subagent sees only the OAuth bootstrap stubs (`…__authenticate`, `…__complete_authentication`), never the data tools, and a direct call returns `No such tool available` rather than an auth error. The request never leaves the harness. This is not a general MCP block — other MCP servers work fine from a subagent — it is specific to servers whose OAuth completed in the lead. Crucially **acli works normally in a subagent**, so the ladder already has a working tier; it just has to skip MCP to reach it.
380
+
381
+ Detecting the subagent case: Lisa's Claude hooks already mark it — `SubagentStart` writes `"${STATE_DIR}/${SESSION_ID}.subagent"`, consumed by `enforce-verification-gate.sh` and `enforce-team-first.sh`. Where that flag is unavailable, probing the MCP tier and finding only `authenticate`-shaped tools is the same signal: treat it as unavailable and fall through rather than attempting a call that cannot succeed.
@@ -81,7 +81,7 @@ The dry-run mode never writes to the destination tracker. It also never modifies
81
81
 
82
82
  ## Hard Rule: All Writes Go Through `lisa-tracker-write`
83
83
 
84
- **Every ticket created by this skill — every Epic, Story, and Sub-task — MUST be created by invoking the `lisa-tracker-write` shim. Never call `lisa-jira-write-ticket`, `lisa-github-write-issue`, `mcp__atlassian__createJiraIssue`, or `gh issue create` directly from this skill or from any sub-agent it spawns.**
84
+ **Every ticket created by this skill — every Epic, Story, and Sub-task — MUST be created by invoking the `lisa-tracker-write` shim. Never call `lisa-jira-write-ticket`, `lisa-github-write-issue`, any vendor MCP tool, or `gh issue create` directly from this skill or from any sub-agent it spawns.**
85
85
 
86
86
  `lisa-tracker-write` enforces:
87
87
  - Vendor-agnostic dispatch (so a project's destination is one config edit away).
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: lisa-intake
3
3
  description: "Vendor-agnostic scanner for Ready queues. Notion PRD database URL → first Ready PRD → lisa-plan. Confluence space or parent page URL → first prd-ready PRD → lisa-plan. Linear workspace URL or team key → first prd-ready project → lisa-plan. GitHub repo URL or `org/repo` token → first prd-ready issue → lisa-plan, or first `status:ready` issue → lisa-implement when `tracker = github`. JIRA project key or JQL filter → first Ready ticket → lisa-implement. On the PRD side it also closes the loop: each cycle rolls a ticketed PRD up to shipped and dispatches lisa-verify-prd for one shipped PRD (shipped → verified on pass; on fail, re-opened shipped → ticketed with build-ready fix tickets that auto-build and re-verify — never blocked). Designed as the cron target for /schedule — one eligible item per invocation, exits cleanly on empty. Symmetric counterpart to the single-item lisa-plan and lisa-implement skills."
4
- allowed-tools: ["Skill", "Bash", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-search", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluenceSpaces", "mcp__atlassian__searchConfluenceUsingCql", "mcp__atlassian__getAccessibleAtlassianResources", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getJiraIssue"]
4
+ allowed-tools: ["Skill", "Bash"]
5
5
  ---
6
6
 
7
7
  # Intake: $ARGUMENTS
@@ -73,11 +73,11 @@ Dry-run output format is identical to `lisa-notion-to-tracker`'s and `lisa-confl
73
73
  ### Total failures: <n>
74
74
  ```
75
75
 
76
- The dry-run mode never writes to JIRA and never calls `mcp__atlassian__createJiraIssue`. It also never modifies the source Linear project, never adds/removes labels, never edits sub-issues, and never posts comments — that is the orchestrating skill's responsibility (`lisa-linear-prd-intake`).
76
+ The dry-run mode never writes to JIRA and never writes through any vendor tool directly. It also never modifies the source Linear project, never adds/removes labels, never edits sub-issues, and never posts comments — that is the orchestrating skill's responsibility (`lisa-linear-prd-intake`).
77
77
 
78
78
  ## Hard Rule: All Writes Go Through `lisa-tracker-write`
79
79
 
80
- **Every JIRA ticket created by this skill — every epic, story, and sub-task — MUST be created by invoking the `lisa-tracker-write` skill. Never call `mcp__atlassian__createJiraIssue`, `mcp__atlassian__editJiraIssue`, `mcp__atlassian__createIssueLink`, or any other Atlassian write tool directly from this skill or from any sub-agent it spawns.**
80
+ **Every JIRA ticket created by this skill — every epic, story, and sub-task — MUST be created by invoking the `lisa-tracker-write` skill. Never call a vendor MCP tool or REST endpoint directly from this skill or from any sub-agent it spawns.**
81
81
 
82
82
  `lisa-tracker-write` enforces gates this skill does not:
83
83
  - 3-audience description (Context / Technical Approach / Acceptance Criteria)
@@ -401,7 +401,7 @@ When delegating to agents, provide this context. **The "MUST invoke jira-write-t
401
401
  Create JIRA sub-tasks in the [PROJECT] project at [CLOUD_ID].
402
402
 
403
403
  CRITICAL: For each sub-task, invoke the `lisa-tracker-write` skill via the Skill tool.
404
- Do NOT call `mcp__atlassian__createJiraIssue` directly. The `lisa-tracker-write` skill
404
+ Do NOT call a vendor MCP tool directly. The `lisa-tracker-write` skill
405
405
  enforces required quality gates (Gherkin acceptance criteria, 3-audience description,
406
406
  single-repo scope, sign-in/environment fields, post-create verification). Bypassing it
407
407
  produces broken tickets that downstream skills (triage, journey, evidence) cannot use.
@@ -68,11 +68,11 @@ Dry-run output format:
68
68
 
69
69
  The `failures` array passes the validator's `Failure details` block through verbatim. Do not re-format `what` or `recommendation` here — those fields are already product-readable per the validator's contract, and re-summarizing risks losing concrete recommendations.
70
70
 
71
- The dry-run mode never writes to JIRA and never calls `mcp__atlassian__createJiraIssue`. It also never sets a Notion status — that is the orchestrating skill's responsibility.
71
+ The dry-run mode never writes to JIRA and never writes through any vendor tool directly. It also never sets a Notion status — that is the orchestrating skill's responsibility.
72
72
 
73
73
  ## Hard Rule: All Writes Go Through `lisa-tracker-write`
74
74
 
75
- **Every JIRA ticket created by this skill — every epic, story, and sub-task — MUST be created by invoking the `lisa-tracker-write` skill. Never call `mcp__atlassian__createJiraIssue`, `mcp__atlassian__editJiraIssue`, `mcp__atlassian__createIssueLink`, or any other Atlassian write tool directly from this skill or from any sub-agent it spawns.**
75
+ **Every JIRA ticket created by this skill — every epic, story, and sub-task — MUST be created by invoking the `lisa-tracker-write` skill. Never call a vendor MCP tool or REST endpoint directly from this skill or from any sub-agent it spawns.**
76
76
 
77
77
  `lisa-tracker-write` enforces gates this skill does not:
78
78
  - 3-audience description (Context / Technical Approach / Acceptance Criteria)
@@ -419,7 +419,7 @@ When delegating to agents, provide this context. **The "MUST invoke jira-write-t
419
419
  Create JIRA sub-tasks in the [PROJECT] project at [CLOUD_ID].
420
420
 
421
421
  CRITICAL: For each sub-task, invoke the `lisa-tracker-write` skill via the Skill tool.
422
- Do NOT call `mcp__atlassian__createJiraIssue` directly. The `lisa-tracker-write` skill
422
+ Do NOT call a vendor MCP tool directly. The `lisa-tracker-write` skill
423
423
  enforces required quality gates (Gherkin acceptance criteria, 3-audience description,
424
424
  single-repo scope, sign-in/environment fields, post-create verification). Bypassing it
425
425
  produces broken tickets that downstream skills (triage, journey, evidence) cannot use.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: lisa-prd-ticket-coverage
3
3
  description: "Verifies that every requirement in a PRD (Notion, Confluence, Linear, or GitHub Issues) is covered by at least one created destination ticket (JIRA, GitHub Issues, or Linear) — no silent drops. Parses the PRD into atomic items (goals, user stories, functional/non-functional requirements, acceptance criteria, important notes), maps each to the created tickets, and produces a coverage matrix and verdict (COMPLETE / COMPLETE_WITH_SCOPE_CREEP / GAPS_FOUND / NO_TICKETS_FOUND). Used by notion-prd-intake / confluence-prd-intake / linear-prd-intake / github-prd-intake post-write to gate the Ticketed transition; can also be invoked standalone for after-the-fact audits."
4
- allowed-tools: ["Skill", "Bash", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-get-comments", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluencePageDescendants", "mcp__atlassian__getConfluencePageFooterComments", "mcp__atlassian__getConfluencePageInlineComments", "mcp__atlassian__getConfluenceCommentChildren", "mcp__atlassian__getJiraIssue", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getAccessibleAtlassianResources"]
4
+ allowed-tools: ["Skill", "Bash"]
5
5
  ---
6
6
 
7
7
  # PRD Ticket Coverage Audit: $ARGUMENTS
@@ -14,7 +14,7 @@ allowed-tools: ["Skill", "Bash", "mcp__claude_ai_Notion__notion-fetch", "mcp__cl
14
14
  The PRD URL can be a **Notion page URL**, a **Confluence page URL**, a **Linear project URL**, or a **GitHub issue URL**. Detect the vendor from the host:
15
15
 
16
16
  - `notion.so` / `notion.site` → Notion. Fetch with `mcp__claude_ai_Notion__notion-fetch` (`include_discussions: true`) and `mcp__claude_ai_Notion__notion-get-comments`.
17
- - Atlassian Confluence host (e.g. `*.atlassian.net/wiki/...`) → Confluence. Fetch with `mcp__atlassian__getConfluencePage`, `mcp__atlassian__getConfluencePageDescendants` (for child epic pages), `mcp__atlassian__getConfluencePageFooterComments`, `mcp__atlassian__getConfluencePageInlineComments`, and `mcp__atlassian__getConfluenceCommentChildren` for nested replies.
17
+ - Atlassian Confluence host (e.g. `*.atlassian.net/wiki/...`) → Confluence. Through `lisa-atlassian-access`, fetch the page, its descendants (for child epic pages), and its footer + inline comments including nested replies. State the operation, not a vendor tool name — the access skill owns substrate selection (`integration-access-layer`).
18
18
  - `linear.app` host → Linear. Fetch with `lisa-linear-access operation: get-project` (capture description, labels, state, attached resources), `lisa-linear-access operation: list-documents({projectId})` + `lisa-linear-access operation: get-document` per attached document, `lisa-linear-access operation: list-issues({project})` for sub-issues that act as child epics / user stories, and `lisa-linear-access operation: list-comments({issueId})` per sub-issue for decisions and engineering notes. Comments do not exist on the project itself in the MCP surface — sub-issue comments are the substitute.
19
19
  - `github.com` host → GitHub Issues. Fetch with the `gh` CLI (no GitHub MCP — Lisa uses the CLI exclusively for GitHub):
20
20
  - `gh issue view <number> --repo <org>/<repo> --json number,title,body,labels,milestone,assignees,author,createdAt,comments,url` for the PRD body and comments.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: lisa-spec-conformance
3
3
  description: "Verifies that shipped work matches its spec section-by-section — acceptance criteria, Out of Scope, Technical Approach, Validation Journey assertions, and any explicit deliverables. Builds a coverage matrix mapping each requirement to evidence, flags scope creep separately from misses, and produces a verdict (CONFORMS / PARTIAL / DIVERGES). Runs during the verification phase alongside empirical system verification."
4
- allowed-tools: ["Read", "Glob", "Grep", "Bash", "Skill", "mcp__atlassian__getJiraIssue", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getAccessibleAtlassianResources"]
4
+ allowed-tools: ["Read", "Glob", "Grep", "Bash", "Skill"]
5
5
  ---
6
6
 
7
7
  # Spec Conformance: $ARGUMENTS
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: lisa-verify-prd
3
3
  description: "Initiative-level PRD acceptance gate. Given a PRD ref/URL (GitHub, Linear, Notion, Confluence, or JIRA), resolves the source vendor, reads the PRD and its generated top-level child work via the prd-lifecycle-rollup contract, and confirms every required child is terminal before any verification runs — if any is non-terminal it reports the incomplete set and STOPS. When the guard passes it runs spec-conformance against the original PRD requirements plus empirical verification via verification-lifecycle. On CONFORMS with all checks passing: transitions the PRD shipped → verified and posts evidence. On PARTIAL/DIVERGES or any failing check: re-opens the PRD shipped → ticketed (NEVER blocked), creates build-ready fix tickets for each divergence, and posts a product-readable failure report — the fix tickets auto-build, rollup re-ships the PRD, and a later intake cycle re-verifies, so the loop closes itself. Idempotent re-runs: comments regenerate in place via sentinel markers; fix tickets dedupe by stable ref."
4
- allowed-tools: ["Skill", "Bash", "Read", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-get-comments", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluencePageDescendants", "mcp__atlassian__getJiraIssue", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getAccessibleAtlassianResources"]
4
+ allowed-tools: ["Skill", "Bash", "Read"]
5
5
  ---
6
6
 
7
7
  # PRD-level Verification: $ARGUMENTS
@@ -39,9 +39,11 @@ Detect the vendor from `$ARGUMENTS` the same way `prd-ticket-coverage` / `prd-ba
39
39
  |---|---|---|
40
40
  | `github.com/<org>/<repo>/issues/<n>` or `<org>/<repo>#<n>` | **GitHub Issues** | `gh` CLI (Lisa uses the CLI exclusively for GitHub — no GitHub MCP) |
41
41
  | `linear.app/...` | **Linear** | `lisa-linear-access operation: get-project` / `lisa-linear-access operation: get-issue` |
42
- | `notion.so` / `notion.site` | **Notion** | `mcp__claude_ai_Notion__notion-fetch` (`include_discussions: true`) |
43
- | `*.atlassian.net/wiki/...` | **Confluence** | `mcp__atlassian__getConfluencePage` (+ descendants) |
44
- | JIRA issue key (e.g. `PROJ-123`) or `*.atlassian.net/browse/...` | **JIRA** | `mcp__atlassian__getJiraIssue` |
42
+ | `notion.so` / `notion.site` | **Notion** | `lisa-notion-access` fetch the page **with its discussions** |
43
+ | `*.atlassian.net/wiki/...` | **Confluence** | `lisa-atlassian-access` read the page and its descendants |
44
+ | JIRA issue key (e.g. `PROJ-123`) or `*.atlassian.net/browse/...` | **JIRA** | `lisa-atlassian-access` — read the issue (and JQL-search when resolving a set) |
45
+
46
+ State the operation you need, never a vendor tool name: the access skills own substrate selection, and a hardcoded MCP tool name is not portable. The same server registers under different prefixes depending on install path (`mcp__atlassian__*`, `mcp__claude_ai_Atlassian__*`, `mcp__plugin_atlassian_atlassian__*`), and its data tools register only once OAuth completes — so a named tool fails outright in a context that has the CLI or token substrate available and would otherwise have worked. See the `integration-access-layer` rule.
45
47
 
46
48
  Read the PRD body via the vendor-appropriate surface. The vendor that owns the PRD source is what Phase 2 reads the child set from; it is independent of which tracker hosts the generated tickets (a Notion PRD can own JIRA tickets — the cross-vendor case is handled by the documented generated-work section in Phase 2).
47
49
 
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "2.315.0",
3
+ "version": "2.316.1",
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.315.0",
3
+ "version": "2.316.1",
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.315.0",
3
+ "version": "2.316.1",
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.315.0",
3
+ "version": "2.316.1",
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.315.0",
3
+ "version": "2.316.1",
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.315.0",
3
+ "version": "2.316.1",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -49,10 +49,10 @@ Use the `jira-verify` skill to check the ticket against organizational standards
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
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
- 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.)
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). Transition through `tracker-write` (which routes via the matching `*-access` skill); never name a vendor MCP tool here.
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 through `tracker-write` — 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).
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}]`.
55
+ 5. Post a comment through `tracker-write` — 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
56
  6. Stop. Do not run triage, do not delegate to a flow, do not start work.
57
57
 
58
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.
@@ -132,6 +132,7 @@ STATE_DIR="${TMPDIR:-/tmp}/lisa-verification-gate"
132
132
  mkdir -p "$STATE_DIR" 2>/dev/null || exit 0
133
133
 
134
134
  ARM_FLAG="${STATE_DIR}/${SESSION_ID}.armed"
135
+ ARM_PLAN_FILE="${STATE_DIR}/${SESSION_ID}.plan"
135
136
  SUBAGENT_FLAG="${STATE_DIR}/${SESSION_ID}.subagent"
136
137
  COUNT_FILE="${STATE_DIR}/${SESSION_ID}.blocks"
137
138
 
@@ -149,6 +150,19 @@ arm_once() {
149
150
  [ -f "$ARM_FLAG" ] || touch "$ARM_FLAG" 2>/dev/null || true
150
151
  }
151
152
 
153
+ record_current_plan() {
154
+ local plan="$1"
155
+ [ -n "$plan" ] || return 0
156
+ [ -f "$ARM_PLAN_FILE" ] && return 0
157
+ printf '%s\n' "$plan" > "$ARM_PLAN_FILE" 2>/dev/null || true
158
+ }
159
+
160
+ plan_from_prompt() {
161
+ printf '%s' "$1" |
162
+ sed -nE '1{s/^[[:space:]]*\/(lisa:implement|implement)[[:space:]]+([^[:space:]]+).*$/\2/p;}' |
163
+ tr '[:upper:]' '[:lower:]'
164
+ }
165
+
152
166
  case "$HOOK_EVENT" in
153
167
  SubagentStart)
154
168
  touch "$SUBAGENT_FLAG" 2>/dev/null || true
@@ -162,6 +176,7 @@ case "$HOOK_EVENT" in
162
176
  case "$LEADING" in
163
177
  /lisa:implement*|/implement*)
164
178
  arm_once
179
+ record_current_plan "$(plan_from_prompt "$LEADING")"
165
180
  ;;
166
181
  esac
167
182
  fi
@@ -175,6 +190,8 @@ case "$HOOK_EVENT" in
175
190
  case "$SKILL_NAME" in
176
191
  lisa-implement|implement)
177
192
  arm_once
193
+ SKILL_ARGUMENTS=$(printf '%s' "$INPUT" | jq -r '.tool_input.arguments // .tool_input.input // empty' 2>/dev/null || true)
194
+ record_current_plan "$(printf '%s' "$SKILL_ARGUMENTS" | awk '{print tolower($1)}')"
178
195
  ;;
179
196
  esac
180
197
  fi
@@ -205,6 +222,39 @@ fi
205
222
  PROJECT_DIR="${CLAUDE_PROJECT_DIR:-.}"
206
223
  VERDICT_FILE="${PROJECT_DIR}/.lisa/verification-status.json"
207
224
 
225
+ # A completed flow's verdict is a shipped record. The next flow in the same
226
+ # worktree writes the SAME path and destroys it — losing the evidence that
227
+ # proved the earlier work, and gating the new run against a verdict whose
228
+ # `plan` names something else entirely. Preserve any verdict belonging to a
229
+ # different plan before this run can overwrite it.
230
+ #
231
+ # Keyed on `.plan`, so re-running the same plan still overwrites in place and
232
+ # no archive accumulates.
233
+ preserve_foreign_verdict() {
234
+ [ -f "$VERDICT_FILE" ] || return 0
235
+ command -v jq >/dev/null 2>&1 || return 0
236
+
237
+ local prior_plan current_plan archive
238
+ prior_plan=$(jq -r '.plan // empty' "$VERDICT_FILE" 2>/dev/null || true)
239
+ [ -n "$prior_plan" ] || return 0
240
+ case "$prior_plan" in
241
+ *[!A-Za-z0-9._-]*)
242
+ return 0
243
+ ;;
244
+ esac
245
+ current_plan=$(cat "$ARM_PLAN_FILE" 2>/dev/null || true)
246
+ [ -z "$current_plan" ] || [ "$prior_plan" != "$current_plan" ] || return 0
247
+
248
+ # Only archive a verdict written BEFORE this flow armed — anything newer
249
+ # belongs to the current run.
250
+ [ "$VERDICT_FILE" -ot "$ARM_FLAG" ] || return 0
251
+
252
+ archive="${PROJECT_DIR}/.lisa/verification-status.${prior_plan}.json"
253
+ [ -f "$archive" ] || cp -p "$VERDICT_FILE" "$archive" 2>/dev/null || true
254
+ }
255
+
256
+ preserve_foreign_verdict
257
+
208
258
  # Set by the v2 path when a claim/evidence violation is what closed the gate,
209
259
  # so the block message can state the real reason instead of the v1 fallback.
210
260
  V2_BLOCK_REASON=""
@@ -387,7 +437,7 @@ verdict_is_terminal() {
387
437
  if verdict_is_terminal; then
388
438
  # Gate satisfied — disarm so a follow-up stop in the same session is not
389
439
  # re-gated against the now-consumed verdict, and allow the stop.
390
- rm -f "$ARM_FLAG" "$COUNT_FILE" 2>/dev/null || true
440
+ rm -f "$ARM_FLAG" "$ARM_PLAN_FILE" "$COUNT_FILE" 2>/dev/null || true
391
441
  exit 0
392
442
  fi
393
443
 
@@ -400,7 +450,7 @@ COUNT=$((COUNT + 1))
400
450
  echo "$COUNT" > "$COUNT_FILE" 2>/dev/null || true
401
451
 
402
452
  if [ "$COUNT" -gt "$MAX_BLOCKS" ]; then
403
- rm -f "$ARM_FLAG" "$COUNT_FILE" 2>/dev/null || true
453
+ rm -f "$ARM_FLAG" "$ARM_PLAN_FILE" "$COUNT_FILE" 2>/dev/null || true
404
454
  cat >&2 <<EOF
405
455
  Verification gate: still no passing verdict after ${MAX_BLOCKS} attempts.
406
456
  Releasing the stop gate to avoid an infinite loop. The /lisa:implement Verify
@@ -15,6 +15,31 @@ Membership is **registration, not skill-existence**: a loop is under this contra
15
15
  registered as a scheduled automation, and registering a new one pulls it in automatically. There is
16
16
  no hardcoded roster of loops anywhere.
17
17
 
18
+ ### Interactive flows are members too
19
+
20
+ The outcome vocabulary is **not cron-specific** — it answers "did this need me?", which an operator
21
+ asks of an interactive run exactly as often as of a scheduled one. Every Lisa flow that terminates
22
+ is a member: `lisa-implement`, `lisa-verify`, `lisa-plan`, `lisa-git-submit-pr`,
23
+ `lisa-drive-pr-to-merge`, `lisa-research`, and any skill invoked as a slash command.
24
+
25
+ For an interactive flow the required run record is the **final user-facing message**, not a JSONL
26
+ row written by `automation-run-record.mjs`. Interactive flows may also record local JSONL telemetry
27
+ when a specific skill owns that surface, but this contract's mandatory record is the final answer.
28
+ It opens with the outcome and the operator action, before any narrative:
29
+
30
+ ```
31
+ change-proved — nothing for you. PR #6393 open, auto-merge on, CI running.
32
+ approval-requested — need a decision: ship the 135 Regular→Bold flips, or hold for design sign-off?
33
+ recovery-required — need you: staging E2E gate red for congestion; rerun or admin-merge.
34
+ ```
35
+
36
+ The operator must learn whether they are needed **from the first line**, without reading the report.
37
+ Findings, evidence and caveats follow; they never replace the action line and never precede it.
38
+
39
+ An interactive flow that ends in prose with the action buried — or absent — is the same contract
40
+ violation as a silent cron exit. "I flagged X, I noticed Y, worth knowing Z" is narrative, not an
41
+ outcome. If nothing is needed, say **"nothing for you"** in those words and stop.
42
+
18
43
  ## The six run outcomes
19
44
 
20
45
  Exactly one per run:
@@ -0,0 +1,55 @@
1
+ # Settled Decisions (load-bearing)
2
+
3
+ **Never ask the operator a question that a standing preference or your own gathered evidence has
4
+ already answered.** Re-asking a settled decision is not caution — it hands back a choice the
5
+ operator already made and makes them make it twice.
6
+
7
+ ## The test
8
+
9
+ Before asking anything, check the three sources that may already hold the answer:
10
+
11
+ 1. **A standing preference** — something the operator has told you once and expects to hold:
12
+ recorded in project memory, `.lisa.config.json`, a project rule, `CLAUDE.md`/`AGENTS.md`, or
13
+ stated earlier in this conversation. "Every PR gets auto-merge and gets watched to merge" is a
14
+ standing preference; asking "want me to watch this PR?" violates it.
15
+ 2. **Evidence you already gathered** — if the research, measurement or code read you just performed
16
+ resolves the question, the question is answered. Report the decision and the evidence for it.
17
+ 3. **A convention with an obvious default** — where one option is clearly conventional and the other
18
+ needs a reason, take the conventional one and say so in one line.
19
+
20
+ If any source answers it: **act, and state the decision in a clause.** Do not convert it into a
21
+ question.
22
+
23
+ ## When asking IS right
24
+
25
+ Ask when the answer would change the work *and* you genuinely cannot derive it:
26
+
27
+ - The options lead to materially different deliverables and nothing in scope decides between them.
28
+ - Proceeding on a wrong assumption would be unsafe, destructive, or waste substantial work.
29
+ - The answer is a human judgement the artifacts do not contain — a product decision, a design
30
+ vocabulary that does not exist yet, a risk the operator owns.
31
+
32
+ That kind of question is load-bearing and should be asked plainly, once, with a recommendation.
33
+
34
+ ## The failure mode this rule exists to stop
35
+
36
+ Asking feels collaborative, so it gets over-applied — especially at the end of a report, where a
37
+ trailing question reads as deference. It is not deference when the answer was already given; it is
38
+ work handed back. Two specific tells:
39
+
40
+ - **Half-applying an instruction.** Doing the first half of a standing preference automatically and
41
+ asking permission for the second half of the same preference.
42
+ - **Asking after the research answered it.** Completing an investigation that points one direction
43
+ unambiguously, then presenting the conclusion as an open question.
44
+
45
+ ## Partial application is worse than either extreme
46
+
47
+ If a standing preference covers a multi-step behavior, apply **all** of it. Applying part and asking
48
+ about the rest produces the worst outcome: the operator is interrupted *and* the instruction was not
49
+ honored.
50
+
51
+ ## Recording, not asking
52
+
53
+ When you take a settled decision, make it auditable in one clause — "auto-merge on, per your standing
54
+ preference", "scoped app-wide, because the Android finding decides it". That gives the operator the
55
+ chance to correct it without requiring them to answer first.
@@ -67,6 +67,6 @@ A container (an Epic, or any item with open child work) is handled by the leaf-o
67
67
 
68
68
  The procedure is vendor-neutral; the create + link + edit mechanics differ:
69
69
 
70
- - **JIRA** — create via `mcp__atlassian__createJiraIssue` (clone fields, set the same epic parent); link via `mcp__atlassian__createIssueLink` with `Blocks` / `is blocked by` (resolve names via `mcp__atlassian__getIssueLinkTypes`); narrow the original via `mcp__atlassian__editJiraIssue`; comment via `mcp__atlassian__addCommentToJiraIssue`. See `jira-write-ticket` Phase 6.
70
+ - **JIRA** — every operation routes through `lisa-atlassian-access`; never name a vendor MCP tool at a call site (see the `integration-access-layer` rule, and #2148 for why the name is not a stable fact). Create the sibling (clone fields, set the same epic parent); link it with `Blocks` / `is blocked by`, resolving the link-type name first; narrow the original; comment on it. See `jira-write-ticket` Phase 6.
71
71
  - **GitHub** — create the sibling issue with the same labels and parent sub-issue; encode the dependency in the body (`Blocked by #<n>` / `Blocks #<n>`) and via the sub-issue/parent graph where used; edit the original's body to narrow scope. See `github-write-issue` Phase 6.
72
72
  - **Linear** — create via `lisa-linear-access operation: save-issue` (clone fields, set the same `projectId`); add a blocking relation via the `relations` field or a paired relation call; edit the original to narrow scope. See `linear-write-issue` Phase 6.
@@ -0,0 +1,29 @@
1
+ # Settled Decisions
2
+
3
+ Do not ask the operator to decide something that is already settled by standing preference, evidence you just gathered, or a conventional default. A question is appropriate only when the answer materially changes the work and the answer cannot be derived from available artifacts.
4
+
5
+ ## Decision Sources
6
+
7
+ Check these sources before asking:
8
+
9
+ 1. Standing preferences recorded in memory, project config, project rules, instruction files, or earlier in the same conversation.
10
+ 2. Evidence already gathered during the current run. If research or code inspection resolves the choice, report the decision and cite the evidence.
11
+ 3. Conventional defaults where one option is clearly standard and the alternative needs a reason.
12
+
13
+ If one of those sources answers the question, act on it and state the basis briefly.
14
+
15
+ ## When To Ask
16
+
17
+ Ask only when the answer changes the deliverable and cannot be inferred. That includes product decisions, design vocabulary that does not exist yet, destructive or unsafe assumptions, or choices that would waste substantial work if guessed wrong.
18
+
19
+ When asking, ask once, plainly, with a recommended option.
20
+
21
+ ## Common Violations
22
+
23
+ Half-applying a standing instruction is a violation. If a preference covers a multi-step behavior, apply the whole behavior instead of doing one part and asking about the rest.
24
+
25
+ Asking after the research answered the question is also a violation. When gathered evidence points one way unambiguously, treat it as a decision and make the reasoning auditable in the report.
26
+
27
+ ## Reporting
28
+
29
+ Record settled decisions in a short clause, such as "auto-merge on, per standing preference" or "scoped app-wide, because the Android finding decides it." This gives the operator a chance to correct the decision without requiring an avoidable question first.
@@ -369,4 +369,13 @@ Do not paraphrase substrate output beyond JSON normalization.
369
369
 
370
370
  ## Headless behavior
371
371
 
372
- In a headless / non-interactive context (no TTY, `CI=true`, or `-p` mode), the MCP tier is unavailable (its OAuth flow needs a browser). The substrate ladder collapses to: acli (if pre-authenticated, e.g., a CI image baked with a service-account token) → curl + `ATLASSIAN_API_TOKEN`. Never block on interactive prompts. If both fail readiness checks, exit non-zero with a deterministic error.
372
+ In a headless / non-interactive context, the MCP tier is unavailable (its OAuth flow needs a browser). The substrate ladder collapses to: acli (if pre-authenticated, e.g., a CI image baked with a service-account token) → curl + `ATLASSIAN_API_TOKEN`. Never block on interactive prompts. If both fail readiness checks, exit non-zero with a deterministic error.
373
+
374
+ Treat all four of these as headless:
375
+
376
+ - no TTY
377
+ - `CI=true`
378
+ - `-p` mode
379
+ - **a subagent / teammate session** — measured (#2148): a subagent sees only the OAuth bootstrap stubs (`…__authenticate`, `…__complete_authentication`), never the data tools, and a direct call returns `No such tool available` rather than an auth error. The request never leaves the harness. This is not a general MCP block — other MCP servers work fine from a subagent — it is specific to servers whose OAuth completed in the lead. Crucially **acli works normally in a subagent**, so the ladder already has a working tier; it just has to skip MCP to reach it.
380
+
381
+ Detecting the subagent case: Lisa's Claude hooks already mark it — `SubagentStart` writes `"${STATE_DIR}/${SESSION_ID}.subagent"`, consumed by `enforce-verification-gate.sh` and `enforce-team-first.sh`. Where that flag is unavailable, probing the MCP tier and finding only `authenticate`-shaped tools is the same signal: treat it as unavailable and fall through rather than attempting a call that cannot succeed.
@@ -81,7 +81,7 @@ The dry-run mode never writes to the destination tracker. It also never modifies
81
81
 
82
82
  ## Hard Rule: All Writes Go Through `lisa-tracker-write`
83
83
 
84
- **Every ticket created by this skill — every Epic, Story, and Sub-task — MUST be created by invoking the `lisa-tracker-write` shim. Never call `lisa-jira-write-ticket`, `lisa-github-write-issue`, `mcp__atlassian__createJiraIssue`, or `gh issue create` directly from this skill or from any sub-agent it spawns.**
84
+ **Every ticket created by this skill — every Epic, Story, and Sub-task — MUST be created by invoking the `lisa-tracker-write` shim. Never call `lisa-jira-write-ticket`, `lisa-github-write-issue`, any vendor MCP tool, or `gh issue create` directly from this skill or from any sub-agent it spawns.**
85
85
 
86
86
  `lisa-tracker-write` enforces:
87
87
  - Vendor-agnostic dispatch (so a project's destination is one config edit away).
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: lisa-intake
3
3
  description: "Vendor-agnostic scanner for Ready queues. Notion PRD database URL → first Ready PRD → lisa-plan. Confluence space or parent page URL → first prd-ready PRD → lisa-plan. Linear workspace URL or team key → first prd-ready project → lisa-plan. GitHub repo URL or `org/repo` token → first prd-ready issue → lisa-plan, or first `status:ready` issue → lisa-implement when `tracker = github`. JIRA project key or JQL filter → first Ready ticket → lisa-implement. On the PRD side it also closes the loop: each cycle rolls a ticketed PRD up to shipped and dispatches lisa-verify-prd for one shipped PRD (shipped → verified on pass; on fail, re-opened shipped → ticketed with build-ready fix tickets that auto-build and re-verify — never blocked). Designed as the cron target for /schedule — one eligible item per invocation, exits cleanly on empty. Symmetric counterpart to the single-item lisa-plan and lisa-implement skills."
4
- allowed-tools: ["Skill", "Bash", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-search", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluenceSpaces", "mcp__atlassian__searchConfluenceUsingCql", "mcp__atlassian__getAccessibleAtlassianResources", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getJiraIssue"]
4
+ allowed-tools: ["Skill", "Bash"]
5
5
  ---
6
6
 
7
7
  # Intake: $ARGUMENTS
@@ -73,11 +73,11 @@ Dry-run output format is identical to `lisa-notion-to-tracker`'s and `lisa-confl
73
73
  ### Total failures: <n>
74
74
  ```
75
75
 
76
- The dry-run mode never writes to JIRA and never calls `mcp__atlassian__createJiraIssue`. It also never modifies the source Linear project, never adds/removes labels, never edits sub-issues, and never posts comments — that is the orchestrating skill's responsibility (`lisa-linear-prd-intake`).
76
+ The dry-run mode never writes to JIRA and never writes through any vendor tool directly. It also never modifies the source Linear project, never adds/removes labels, never edits sub-issues, and never posts comments — that is the orchestrating skill's responsibility (`lisa-linear-prd-intake`).
77
77
 
78
78
  ## Hard Rule: All Writes Go Through `lisa-tracker-write`
79
79
 
80
- **Every JIRA ticket created by this skill — every epic, story, and sub-task — MUST be created by invoking the `lisa-tracker-write` skill. Never call `mcp__atlassian__createJiraIssue`, `mcp__atlassian__editJiraIssue`, `mcp__atlassian__createIssueLink`, or any other Atlassian write tool directly from this skill or from any sub-agent it spawns.**
80
+ **Every JIRA ticket created by this skill — every epic, story, and sub-task — MUST be created by invoking the `lisa-tracker-write` skill. Never call a vendor MCP tool or REST endpoint directly from this skill or from any sub-agent it spawns.**
81
81
 
82
82
  `lisa-tracker-write` enforces gates this skill does not:
83
83
  - 3-audience description (Context / Technical Approach / Acceptance Criteria)
@@ -401,7 +401,7 @@ When delegating to agents, provide this context. **The "MUST invoke jira-write-t
401
401
  Create JIRA sub-tasks in the [PROJECT] project at [CLOUD_ID].
402
402
 
403
403
  CRITICAL: For each sub-task, invoke the `lisa-tracker-write` skill via the Skill tool.
404
- Do NOT call `mcp__atlassian__createJiraIssue` directly. The `lisa-tracker-write` skill
404
+ Do NOT call a vendor MCP tool directly. The `lisa-tracker-write` skill
405
405
  enforces required quality gates (Gherkin acceptance criteria, 3-audience description,
406
406
  single-repo scope, sign-in/environment fields, post-create verification). Bypassing it
407
407
  produces broken tickets that downstream skills (triage, journey, evidence) cannot use.
@@ -68,11 +68,11 @@ Dry-run output format:
68
68
 
69
69
  The `failures` array passes the validator's `Failure details` block through verbatim. Do not re-format `what` or `recommendation` here — those fields are already product-readable per the validator's contract, and re-summarizing risks losing concrete recommendations.
70
70
 
71
- The dry-run mode never writes to JIRA and never calls `mcp__atlassian__createJiraIssue`. It also never sets a Notion status — that is the orchestrating skill's responsibility.
71
+ The dry-run mode never writes to JIRA and never writes through any vendor tool directly. It also never sets a Notion status — that is the orchestrating skill's responsibility.
72
72
 
73
73
  ## Hard Rule: All Writes Go Through `lisa-tracker-write`
74
74
 
75
- **Every JIRA ticket created by this skill — every epic, story, and sub-task — MUST be created by invoking the `lisa-tracker-write` skill. Never call `mcp__atlassian__createJiraIssue`, `mcp__atlassian__editJiraIssue`, `mcp__atlassian__createIssueLink`, or any other Atlassian write tool directly from this skill or from any sub-agent it spawns.**
75
+ **Every JIRA ticket created by this skill — every epic, story, and sub-task — MUST be created by invoking the `lisa-tracker-write` skill. Never call a vendor MCP tool or REST endpoint directly from this skill or from any sub-agent it spawns.**
76
76
 
77
77
  `lisa-tracker-write` enforces gates this skill does not:
78
78
  - 3-audience description (Context / Technical Approach / Acceptance Criteria)
@@ -419,7 +419,7 @@ When delegating to agents, provide this context. **The "MUST invoke jira-write-t
419
419
  Create JIRA sub-tasks in the [PROJECT] project at [CLOUD_ID].
420
420
 
421
421
  CRITICAL: For each sub-task, invoke the `lisa-tracker-write` skill via the Skill tool.
422
- Do NOT call `mcp__atlassian__createJiraIssue` directly. The `lisa-tracker-write` skill
422
+ Do NOT call a vendor MCP tool directly. The `lisa-tracker-write` skill
423
423
  enforces required quality gates (Gherkin acceptance criteria, 3-audience description,
424
424
  single-repo scope, sign-in/environment fields, post-create verification). Bypassing it
425
425
  produces broken tickets that downstream skills (triage, journey, evidence) cannot use.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: lisa-prd-ticket-coverage
3
3
  description: "Verifies that every requirement in a PRD (Notion, Confluence, Linear, or GitHub Issues) is covered by at least one created destination ticket (JIRA, GitHub Issues, or Linear) — no silent drops. Parses the PRD into atomic items (goals, user stories, functional/non-functional requirements, acceptance criteria, important notes), maps each to the created tickets, and produces a coverage matrix and verdict (COMPLETE / COMPLETE_WITH_SCOPE_CREEP / GAPS_FOUND / NO_TICKETS_FOUND). Used by notion-prd-intake / confluence-prd-intake / linear-prd-intake / github-prd-intake post-write to gate the Ticketed transition; can also be invoked standalone for after-the-fact audits."
4
- allowed-tools: ["Skill", "Bash", "mcp__claude_ai_Notion__notion-fetch", "mcp__claude_ai_Notion__notion-get-comments", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluencePageDescendants", "mcp__atlassian__getConfluencePageFooterComments", "mcp__atlassian__getConfluencePageInlineComments", "mcp__atlassian__getConfluenceCommentChildren", "mcp__atlassian__getJiraIssue", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getAccessibleAtlassianResources"]
4
+ allowed-tools: ["Skill", "Bash"]
5
5
  ---
6
6
 
7
7
  # PRD Ticket Coverage Audit: $ARGUMENTS
@@ -14,7 +14,7 @@ allowed-tools: ["Skill", "Bash", "mcp__claude_ai_Notion__notion-fetch", "mcp__cl
14
14
  The PRD URL can be a **Notion page URL**, a **Confluence page URL**, a **Linear project URL**, or a **GitHub issue URL**. Detect the vendor from the host:
15
15
 
16
16
  - `notion.so` / `notion.site` → Notion. Fetch with `mcp__claude_ai_Notion__notion-fetch` (`include_discussions: true`) and `mcp__claude_ai_Notion__notion-get-comments`.
17
- - Atlassian Confluence host (e.g. `*.atlassian.net/wiki/...`) → Confluence. Fetch with `mcp__atlassian__getConfluencePage`, `mcp__atlassian__getConfluencePageDescendants` (for child epic pages), `mcp__atlassian__getConfluencePageFooterComments`, `mcp__atlassian__getConfluencePageInlineComments`, and `mcp__atlassian__getConfluenceCommentChildren` for nested replies.
17
+ - Atlassian Confluence host (e.g. `*.atlassian.net/wiki/...`) → Confluence. Through `lisa-atlassian-access`, fetch the page, its descendants (for child epic pages), and its footer + inline comments including nested replies. State the operation, not a vendor tool name — the access skill owns substrate selection (`integration-access-layer`).
18
18
  - `linear.app` host → Linear. Fetch with `lisa-linear-access operation: get-project` (capture description, labels, state, attached resources), `lisa-linear-access operation: list-documents({projectId})` + `lisa-linear-access operation: get-document` per attached document, `lisa-linear-access operation: list-issues({project})` for sub-issues that act as child epics / user stories, and `lisa-linear-access operation: list-comments({issueId})` per sub-issue for decisions and engineering notes. Comments do not exist on the project itself in the MCP surface — sub-issue comments are the substitute.
19
19
  - `github.com` host → GitHub Issues. Fetch with the `gh` CLI (no GitHub MCP — Lisa uses the CLI exclusively for GitHub):
20
20
  - `gh issue view <number> --repo <org>/<repo> --json number,title,body,labels,milestone,assignees,author,createdAt,comments,url` for the PRD body and comments.
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  name: lisa-spec-conformance
3
3
  description: "Verifies that shipped work matches its spec section-by-section — acceptance criteria, Out of Scope, Technical Approach, Validation Journey assertions, and any explicit deliverables. Builds a coverage matrix mapping each requirement to evidence, flags scope creep separately from misses, and produces a verdict (CONFORMS / PARTIAL / DIVERGES). Runs during the verification phase alongside empirical system verification."
4
- allowed-tools: ["Read", "Glob", "Grep", "Bash", "Skill", "mcp__atlassian__getJiraIssue", "mcp__atlassian__searchJiraIssuesUsingJql", "mcp__atlassian__getAccessibleAtlassianResources"]
4
+ allowed-tools: ["Read", "Glob", "Grep", "Bash", "Skill"]
5
5
  ---
6
6
 
7
7
  # Spec Conformance: $ARGUMENTS