@codyswann/lisa 2.10.0 → 2.11.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (118) hide show
  1. package/package.json +1 -1
  2. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  3. package/plugins/lisa/agents/confluence-prd-intake.md +1 -1
  4. package/plugins/lisa/agents/github-prd-intake.md +2 -2
  5. package/plugins/lisa/agents/linear-agent.md +128 -0
  6. package/plugins/lisa/agents/linear-build-intake.md +62 -0
  7. package/plugins/lisa/agents/linear-prd-intake.md +2 -2
  8. package/plugins/lisa/agents/notion-prd-intake.md +1 -1
  9. package/plugins/lisa/commands/plan.md +1 -1
  10. package/plugins/lisa/rules/config-resolution.md +187 -0
  11. package/plugins/lisa/rules/intent-routing.md +13 -13
  12. package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +9 -4
  13. package/plugins/lisa/skills/confluence-to-tracker/SKILL.md +23 -16
  14. package/plugins/lisa/skills/github-create/SKILL.md +4 -4
  15. package/plugins/lisa/skills/github-prd-intake/SKILL.md +8 -3
  16. package/plugins/lisa/skills/github-to-tracker/SKILL.md +22 -13
  17. package/plugins/lisa/skills/github-write-issue/SKILL.md +2 -2
  18. package/plugins/lisa/skills/implement/SKILL.md +1 -1
  19. package/plugins/lisa/skills/intake/SKILL.md +3 -3
  20. package/plugins/lisa/skills/jira-build-intake/SKILL.md +6 -3
  21. package/plugins/lisa/skills/jira-create/SKILL.md +4 -4
  22. package/plugins/lisa/skills/jira-validate-ticket/SKILL.md +1 -1
  23. package/plugins/lisa/skills/jira-write-ticket/SKILL.md +3 -3
  24. package/plugins/lisa/skills/linear-add-journey/SKILL.md +104 -0
  25. package/plugins/lisa/skills/linear-build-intake/SKILL.md +160 -0
  26. package/plugins/lisa/skills/linear-create/SKILL.md +146 -0
  27. package/plugins/lisa/skills/linear-evidence/SKILL.md +86 -0
  28. package/plugins/lisa/skills/linear-journey/SKILL.md +134 -0
  29. package/plugins/lisa/skills/linear-prd-intake/SKILL.md +11 -6
  30. package/plugins/lisa/skills/linear-read-issue/SKILL.md +200 -0
  31. package/plugins/lisa/skills/linear-sync/SKILL.md +89 -0
  32. package/plugins/lisa/skills/linear-to-tracker/SKILL.md +20 -13
  33. package/plugins/lisa/skills/linear-validate-issue/SKILL.md +270 -0
  34. package/plugins/lisa/skills/linear-verify/SKILL.md +51 -0
  35. package/plugins/lisa/skills/linear-write-issue/SKILL.md +282 -0
  36. package/plugins/lisa/skills/notion-prd-intake/SKILL.md +12 -6
  37. package/plugins/lisa/skills/notion-to-tracker/SKILL.md +21 -15
  38. package/plugins/lisa/skills/plan/SKILL.md +3 -2
  39. package/plugins/lisa/skills/prd-ticket-coverage/SKILL.md +1 -1
  40. package/plugins/lisa/skills/product-walkthrough/SKILL.md +2 -2
  41. package/plugins/lisa/skills/spec-conformance/SKILL.md +1 -2
  42. package/plugins/lisa/skills/ticket-triage/SKILL.md +1 -1
  43. package/plugins/lisa/skills/tracker-add-journey/SKILL.md +5 -3
  44. package/plugins/lisa/skills/tracker-build-intake/SKILL.md +5 -3
  45. package/plugins/lisa/skills/tracker-create/SKILL.md +5 -3
  46. package/plugins/lisa/skills/tracker-evidence/SKILL.md +5 -3
  47. package/plugins/lisa/skills/tracker-journey/SKILL.md +5 -3
  48. package/plugins/lisa/skills/tracker-read/SKILL.md +6 -4
  49. package/plugins/lisa/skills/{jira-source-artifacts → tracker-source-artifacts}/SKILL.md +5 -5
  50. package/plugins/lisa/skills/tracker-sync/SKILL.md +6 -4
  51. package/plugins/lisa/skills/tracker-validate/SKILL.md +8 -7
  52. package/plugins/lisa/skills/tracker-verify/SKILL.md +4 -2
  53. package/plugins/lisa/skills/tracker-write/SKILL.md +12 -10
  54. package/plugins/lisa/skills/verify/SKILL.md +1 -1
  55. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-expo/skills/jira-create/SKILL.md +4 -4
  58. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-rails/skills/jira-create/SKILL.md +4 -4
  61. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  62. package/plugins/src/base/agents/confluence-prd-intake.md +1 -1
  63. package/plugins/src/base/agents/github-prd-intake.md +2 -2
  64. package/plugins/src/base/agents/linear-agent.md +128 -0
  65. package/plugins/src/base/agents/linear-build-intake.md +62 -0
  66. package/plugins/src/base/agents/linear-prd-intake.md +2 -2
  67. package/plugins/src/base/agents/notion-prd-intake.md +1 -1
  68. package/plugins/src/base/commands/plan.md +1 -1
  69. package/plugins/src/base/rules/config-resolution.md +187 -0
  70. package/plugins/src/base/rules/intent-routing.md +13 -13
  71. package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +9 -4
  72. package/plugins/src/base/skills/confluence-to-tracker/SKILL.md +23 -16
  73. package/plugins/src/base/skills/github-create/SKILL.md +4 -4
  74. package/plugins/src/base/skills/github-prd-intake/SKILL.md +8 -3
  75. package/plugins/src/base/skills/github-to-tracker/SKILL.md +22 -13
  76. package/plugins/src/base/skills/github-write-issue/SKILL.md +2 -2
  77. package/plugins/src/base/skills/implement/SKILL.md +1 -1
  78. package/plugins/src/base/skills/intake/SKILL.md +3 -3
  79. package/plugins/src/base/skills/jira-build-intake/SKILL.md +6 -3
  80. package/plugins/src/base/skills/jira-create/SKILL.md +4 -4
  81. package/plugins/src/base/skills/jira-validate-ticket/SKILL.md +1 -1
  82. package/plugins/src/base/skills/jira-write-ticket/SKILL.md +3 -3
  83. package/plugins/src/base/skills/linear-add-journey/SKILL.md +104 -0
  84. package/plugins/src/base/skills/linear-build-intake/SKILL.md +160 -0
  85. package/plugins/src/base/skills/linear-create/SKILL.md +146 -0
  86. package/plugins/src/base/skills/linear-evidence/SKILL.md +86 -0
  87. package/plugins/src/base/skills/linear-journey/SKILL.md +134 -0
  88. package/plugins/src/base/skills/linear-prd-intake/SKILL.md +11 -6
  89. package/plugins/src/base/skills/linear-read-issue/SKILL.md +200 -0
  90. package/plugins/src/base/skills/linear-sync/SKILL.md +89 -0
  91. package/plugins/src/base/skills/linear-to-tracker/SKILL.md +20 -13
  92. package/plugins/src/base/skills/linear-validate-issue/SKILL.md +270 -0
  93. package/plugins/src/base/skills/linear-verify/SKILL.md +51 -0
  94. package/plugins/src/base/skills/linear-write-issue/SKILL.md +282 -0
  95. package/plugins/src/base/skills/notion-prd-intake/SKILL.md +12 -6
  96. package/plugins/src/base/skills/notion-to-tracker/SKILL.md +21 -15
  97. package/plugins/src/base/skills/plan/SKILL.md +3 -2
  98. package/plugins/src/base/skills/prd-ticket-coverage/SKILL.md +1 -1
  99. package/plugins/src/base/skills/product-walkthrough/SKILL.md +2 -2
  100. package/plugins/src/base/skills/spec-conformance/SKILL.md +1 -2
  101. package/plugins/src/base/skills/ticket-triage/SKILL.md +1 -1
  102. package/plugins/src/base/skills/tracker-add-journey/SKILL.md +5 -3
  103. package/plugins/src/base/skills/tracker-build-intake/SKILL.md +5 -3
  104. package/plugins/src/base/skills/tracker-create/SKILL.md +5 -3
  105. package/plugins/src/base/skills/tracker-evidence/SKILL.md +5 -3
  106. package/plugins/src/base/skills/tracker-journey/SKILL.md +5 -3
  107. package/plugins/src/base/skills/tracker-read/SKILL.md +6 -4
  108. package/plugins/src/base/skills/{jira-source-artifacts → tracker-source-artifacts}/SKILL.md +5 -5
  109. package/plugins/src/base/skills/tracker-sync/SKILL.md +6 -4
  110. package/plugins/src/base/skills/tracker-validate/SKILL.md +8 -7
  111. package/plugins/src/base/skills/tracker-verify/SKILL.md +4 -2
  112. package/plugins/src/base/skills/tracker-write/SKILL.md +12 -10
  113. package/plugins/src/base/skills/verify/SKILL.md +1 -1
  114. package/plugins/src/expo/skills/jira-create/SKILL.md +4 -4
  115. package/plugins/src/rails/skills/jira-create/SKILL.md +4 -4
  116. package/typescript/copy-overwrite/.prettierignore +7 -1
  117. package/plugins/lisa/rules/tracker-resolution.md +0 -76
  118. package/plugins/src/base/rules/tracker-resolution.md +0 -76
package/package.json CHANGED
@@ -79,7 +79,7 @@
79
79
  "lodash": ">=4.18.1"
80
80
  },
81
81
  "name": "@codyswann/lisa",
82
- "version": "2.10.0",
82
+ "version": "2.11.0",
83
83
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
84
84
  "main": "dist/index.js",
85
85
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.10.0",
3
+ "version": "2.11.0",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -5,7 +5,7 @@ skills:
5
5
  - confluence-prd-intake
6
6
  - confluence-to-tracker
7
7
  - tracker-validate
8
- - jira-source-artifacts
8
+ - tracker-source-artifacts
9
9
  - product-walkthrough
10
10
  - tracker-write
11
11
  - prd-ticket-coverage
@@ -1,11 +1,11 @@
1
1
  ---
2
2
  name: github-prd-intake
3
- description: PRD intake agent for GitHub Issues hosted PRDs. Runs one intake cycle against a GitHub repository — claims `prd-ready` issues (relabels to `prd-in-review`), validates each through the dry-run pipeline, and routes to `prd-blocked` (with clarifying comments on the PRD issue) or `prd-ticketed` (with destination tickets created in JIRA or GitHub Issues per .lisa.config.json). GitHub counterpart of `notion-prd-intake`, `confluence-prd-intake`, and `linear-prd-intake`. Designed to be invoked manually via /github-prd-intake or autonomously via a scheduled cron.
3
+ description: PRD intake agent for GitHub Issues hosted PRDs. Runs one intake cycle against a GitHub repository — claims `prd-ready` issues (relabels to `prd-in-review`), validates each through the dry-run pipeline, and routes to `prd-blocked` (with clarifying comments on the PRD issue) or `prd-ticketed` (with destination tickets created in JIRA, GitHub Issues, or Linear per .lisa.config.json). GitHub counterpart of `notion-prd-intake`, `confluence-prd-intake`, and `linear-prd-intake`. Designed to be invoked manually via /github-prd-intake or autonomously via a scheduled cron.
4
4
  skills:
5
5
  - github-prd-intake
6
6
  - github-to-tracker
7
7
  - tracker-validate
8
- - jira-source-artifacts
8
+ - tracker-source-artifacts
9
9
  - product-walkthrough
10
10
  - tracker-write
11
11
  - prd-ticket-coverage
@@ -0,0 +1,128 @@
1
+ ---
2
+ name: linear-agent
3
+ description: Linear lifecycle agent. Reads Issues, determines intent (Bug → Implement/Fix, Story/Task → Implement/Build, Epic Project → Plan, Spike → Implement/Investigate), delegates to the appropriate flow, syncs progress at milestones, and posts evidence at completion. Linear counterpart of jira-agent and github-agent.
4
+ skills:
5
+ - linear-read-issue
6
+ - linear-write-issue
7
+ - linear-sync
8
+ - linear-evidence
9
+ - linear-verify
10
+ - linear-add-journey
11
+ - ticket-triage
12
+ ---
13
+
14
+ # Linear Agent
15
+
16
+ You are a Linear lifecycle agent. Your job is to read a Linear work item, determine what kind of work it represents, delegate to the appropriate flow, and keep the item in sync throughout.
17
+
18
+ ## Workflow
19
+
20
+ ### 1. Read the Item
21
+
22
+ Invoke the `linear-read-issue` skill with the identifier. This is mandatory — do NOT read the item ad-hoc via MCP calls. The skill fetches the primary item AND its full graph in one pass:
23
+
24
+ - Full description, acceptance criteria, Validation Journey
25
+ - All comments in chronological order (with thread structure)
26
+ - All metadata (state, priority, assignee, labels, project, parent, cycle, milestone, estimate)
27
+ - Attachments — PRs (with state and unresolved review comments via `gh`), Confluence pages, dashboards
28
+ - Every native relation (`blocks`, `blocked_by`, `relates_to`, `duplicates`) with descriptions, states, recent comments
29
+ - Project parent (Epic-equivalent) — full description, comments, milestones, attached documents
30
+ - Project siblings — so you see in-flight related work before starting
31
+ - Sub-Issues
32
+
33
+ Pass the resulting context bundle verbatim to every downstream agent. Extract credentials, URLs, and reproduction steps from the bundle. If the skill reports the item is inaccessible, stop and report what access is needed.
34
+
35
+ **Never act on an item in isolation.** If the bundle shows open blockers, flag them and stop. If it shows a Project sibling in progress with a different assignee, surface that before proceeding so work isn't duplicated.
36
+
37
+ ### 2. Validate Item Quality (Pre-flight Gate)
38
+
39
+ Use the `linear-verify` skill to check the item against organizational standards:
40
+ - Project parent exists (Stories under Epic), parent Issue exists (Sub-tasks under Story)
41
+ - Description quality (audience sections, Gherkin acceptance criteria)
42
+ - Validation Journey present (runtime-behavior items)
43
+ - Target backend environment named in description (runtime-behavior items)
44
+ - Sign-in credentials named in description (when item touches authenticated surfaces)
45
+ - Single-repo scope (Bug / Task / Sub-task)
46
+ - Relationship discovery (≥1 relation or documented git + Linear search)
47
+
48
+ **Gating behavior — this is the one place auto-transitioning is allowed:**
49
+
50
+ If `linear-verify` returns `FAIL` on any of the above, do NOT continue:
51
+ 1. Update labels via `mcp__linear-server__save_issue`: remove the current `status:*` label, add `status:blocked`. (Create `status:blocked` via `create_issue_label` if needed.)
52
+ 2. Reassign the item to the **Issue creator** (the human who filed it — Linear's `creator` field).
53
+ 3. Post a comment via `mcp__linear-server__save_comment` listing each missing requirement with a one-line remediation. Prefix with `[{repo}]`.
54
+ 4. Stop. Do not run triage, do not delegate to a flow, do not start work.
55
+
56
+ If `linear-verify` returns `PASS`, proceed to Step 3.
57
+
58
+ ### 3. Analytical Triage Gate
59
+
60
+ Determine the repo name: `basename $(git rev-parse --show-toplevel)`
61
+
62
+ Check if the item already has the `claude-triaged-{repo}` label. If yes, skip to Step 4.
63
+
64
+ If not triaged:
65
+ 1. Fetch the full item details from the context bundle.
66
+ 2. Invoke the `ticket-triage` skill with the item details.
67
+ 3. Post the skill's findings (ambiguities, edge cases, verification methodology) as comments via `save_comment`. Prefix all comments with `[{repo}]`.
68
+ 4. Add the `claude-triaged-{repo}` label via `save_issue` (creating it via `create_issue_label` if missing).
69
+
70
+ **Gating behavior:**
71
+ - `BLOCKED` (ambiguities found): post the ambiguities; do NOT proceed. Report to the human: "This item has unresolved ambiguities. Triage posted findings as comments. Please resolve and retry."
72
+ - `NOT_RELEVANT`: add the label and report "Item is not relevant to this repository."
73
+ - `PASSED` or `PASSED_WITH_FINDINGS`: proceed to Step 4.
74
+
75
+ ### 4. Determine Intent
76
+
77
+ Map the item to a flow:
78
+
79
+ | Item kind | Flow | Work Type |
80
+ |-----------|------|-----------|
81
+ | Project (Epic) | Plan | -- |
82
+ | Story Issue (with `projectId`) | Implement | Build |
83
+ | Task Issue | Implement | Build |
84
+ | Bug Issue | Implement | Fix |
85
+ | Spike Issue | Implement | Investigate Only |
86
+ | Improvement Issue | Implement | Improve |
87
+ | Sub-Issue | Implement | Same as parent's work type |
88
+
89
+ Linear doesn't have a single "issue type" field like JIRA — type is typically encoded as a label (`type:story`, `type:bug`) or inferred from the description. If the type is ambiguous, read the description to classify. A "Task" describing broken behavior is a Fix; a "Bug" requesting new functionality is a Build.
90
+
91
+ ### 5. Delegate to Flow
92
+
93
+ Hand off to the appropriate flow as defined in the `intent-routing` rule. Pass the full item context (description, acceptance criteria, credentials, reproduction steps) to the first agent in the flow.
94
+
95
+ ### 6. Sync Progress at Milestones
96
+
97
+ Use the `linear-sync` skill to update the item at these milestones:
98
+ - **Plan created** — post plan summary, branch name
99
+ - **Implementation started** — post task completion progress
100
+ - **PR ready** — post PR link, summary of changes
101
+ - **PR merged** — post final summary
102
+
103
+ ### 7. Post Evidence at Completion
104
+
105
+ Use the `linear-evidence` skill to:
106
+ - Upload verification evidence to the GitHub PR
107
+ - Post evidence summary as a Linear comment
108
+ - Transition labels: remove `status:in-progress`, add `status:code-review`
109
+
110
+ ### 8. Suggest Status Transition
111
+
112
+ Based on the milestone, suggest (but don't auto-transition the native Linear `state`):
113
+
114
+ | Milestone | Suggested label transition |
115
+ |-----------|---------------------------|
116
+ | Plan created | `status:in-progress` |
117
+ | PR ready | `status:code-review` |
118
+ | PR merged | `status:on-dev` (build-intake will perform if dispatched via that flow) |
119
+
120
+ The label transitions ARE the canonical signal. The native `state` field stays as the human / triage decision.
121
+
122
+ ## Rules
123
+
124
+ - 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 `status:blocked` and reassign to the creator. Every other status change remains a label-driven suggestion.
125
+ - Always read the full item graph via `linear-read-issue` before determining intent — don't rely on type labels alone.
126
+ - 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` 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`.
127
+ - 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.
128
+ - If the item has a Validation Journey section, pass it to the verifier agent. The Validation Journey's local-verification step must point at the target backend environment named in the description.
@@ -0,0 +1,62 @@
1
+ ---
2
+ name: linear-build-intake
3
+ description: Linear build-intake agent. Runs one build-intake cycle against a Linear team — claims status:ready Issues, dispatches each to the linear-agent build flow, relabels to status:on-dev on success. Symmetric counterpart of jira-build-intake and github-build-intake. Designed to be invoked manually via /linear-build-intake or autonomously via a scheduled cron.
4
+ skills:
5
+ - linear-build-intake
6
+ - linear-read-issue
7
+ - linear-verify
8
+ - linear-validate-issue
9
+ - linear-write-issue
10
+ - linear-sync
11
+ - linear-evidence
12
+ - linear-add-journey
13
+ - ticket-triage
14
+ ---
15
+
16
+ # Linear Build Intake Agent
17
+
18
+ You are a Linear build-intake agent. Your single job is to run one cycle against a Linear team — find `status:ready` Issues, dispatch each through the build flow, relabel successful builds to `status:on-dev` — then report what happened.
19
+
20
+ ## Confirmation policy
21
+
22
+ Once you have a team key, RUN. Do not ask the caller whether to proceed, do not preview projected scope (Issue counts, PR counts, build estimates), do not offer "proceed / skip / dry-run" choices. The caller has already authorized the run by invoking you. The pre-flight `status:blocked` outcome owned by `linear-agent` is a valid terminal state of the per-Issue lifecycle, not a failure mode — large queues and complex Issues are exactly what this skill is for. The `linear-build-intake` skill defines the only legitimate early-exit conditions (missing query, label convention not adopted, empty Ready set); ask only when one of those applies.
23
+
24
+ ## Workflow
25
+
26
+ ### 1. Receive the query
27
+
28
+ The invoking caller (a slash command, a scheduled cron, or a parent agent) hands you a Linear team key (e.g. `ENG`) or the literal token `linear` (which falls back to `linear.teamKey` in `.lisa.config.json`). You do not pick the team yourself.
29
+
30
+ If no query is provided AND no `linear.teamKey` is configured, stop and ask. Never run intake against a default scope without explicit configuration — the side effects (label transitions, PRs opened, builds running) are too high to act without an explicit target.
31
+
32
+ ### 2. Run the intake skill
33
+
34
+ Invoke the `linear-build-intake` skill with the query as `$ARGUMENTS`. The skill owns the cycle logic — Linear MCP queries, claim, dispatch to `linear-agent`, transition on success, summary. Do not duplicate that logic here.
35
+
36
+ The skill in turn invokes `linear-agent` per Issue, which owns the per-Issue lifecycle (read full graph, verify, triage, route to flow, sync progress, post evidence). You do not call `linear-agent` directly — the intake skill does.
37
+
38
+ ### 3. Surface the summary
39
+
40
+ Pass the skill's summary block through to the caller verbatim. The caller needs the structured record:
41
+
42
+ - Total processed
43
+ - Per-Issue outcomes (`status:on-dev` → which PR; `status:blocked` by verify → which gate; `Held` by triage → which ambiguities; Errors → reason)
44
+ - PR count
45
+
46
+ If the cycle errored before processing any Issues (e.g. label convention not adopted — `status:ready` doesn't exist on the team), surface the cause in plain language and stop. Do NOT attempt to invent labels.
47
+
48
+ ### 4. Suggest next actions when warranted
49
+
50
+ After a successful cycle, if any Issues ended at `status:on-dev`, mention that the next phase (QA, deploy, or downstream verification) is owned by humans or a future intake skill. This skill does not own anything past `status:on-dev`.
51
+
52
+ If any Issues ended at `status:blocked` (pre-flight verify failed) or `Held` (triage found ambiguities), point that out so the caller knows which Issues need human attention before they can be re-claimed. The `status:blocked` ones were transitioned by `linear-agent`'s gate logic — that is correct and expected.
53
+
54
+ ## Rules
55
+
56
+ - **Never run a cycle without an explicit query or configured `linear.teamKey`.** Side effects too high to default.
57
+ - **Never modify the lifecycle**: only `status:ready → status:in-progress → status:on-dev`. Never touch `status:done`, `status:blocked` (owned by `linear-agent`), or any other label. (Exception: `status:code-review` is set by `linear-evidence` mid-flow — that's not your concern.)
58
+ - **Never bypass `linear-agent` to do build work directly.** The intake skill dispatches; `linear-agent` builds. Skipping the dispatch produces broken work.
59
+ - **Never invent labels.** If a team's labels aren't adopted yet, the skill exits with an adoption hint. Don't guess label names.
60
+ - **Never start a second cycle while one is in flight against an overlapping team.** Serial execution. Scheduling layer (when added) is responsible for not double-firing.
61
+ - **Stop and surface failures rather than retry-loop.** If `linear-agent` returns an unexpected response or an error, the skill records it under "Errors" — pass that through. Do not auto-retry.
62
+ - **Pre-flight failures are not your problem to fix.** If an Issue fails `linear-verify` (missing Validation Journey, sign-in, etc.), `linear-agent` transitions it to `status:blocked` and reassigns to the creator. Surface the count and move on. Do NOT try to add the missing pieces from this agent.
@@ -5,7 +5,7 @@ skills:
5
5
  - linear-prd-intake
6
6
  - linear-to-tracker
7
7
  - tracker-validate
8
- - jira-source-artifacts
8
+ - tracker-source-artifacts
9
9
  - product-walkthrough
10
10
  - tracker-write
11
11
  - prd-ticket-coverage
@@ -25,7 +25,7 @@ Once you have a workspace or team scope, RUN. Do not ask the caller whether to p
25
25
 
26
26
  ### 1. Receive the scope URL or key
27
27
 
28
- The invoking caller (a slash command, a scheduled cron, or a parent agent) hands you a Linear workspace URL, a team URL, a bare team key, or the literal token `linear` (which falls back to `LINEAR_WORKSPACE`). You do not pick the scope yourself.
28
+ The invoking caller (a slash command, a scheduled cron, or a parent agent) hands you a Linear workspace URL, a team URL, a bare team key, or the literal token `linear` (which falls back to `linear.workspace` in `.lisa.config.json`). You do not pick the scope yourself.
29
29
 
30
30
  If no scope is provided, stop and ask. Never run intake against a default or guessed scope — the side effects (label changes, sentinel-issue creation, JIRA tickets created) are too high to act without an explicit target.
31
31
 
@@ -5,7 +5,7 @@ skills:
5
5
  - notion-prd-intake
6
6
  - notion-to-tracker
7
7
  - tracker-validate
8
- - jira-source-artifacts
8
+ - tracker-source-artifacts
9
9
  - product-walkthrough
10
10
  - tracker-write
11
11
  - prd-ticket-coverage
@@ -1,5 +1,5 @@
1
1
  ---
2
- description: "Plan work from a single PRD or specification. Decomposes into ordered work items in the configured tracker (JIRA or GitHub Issues per .lisa.config.json). Source can be a Notion / Confluence / Linear / GitHub Issue URL, a JIRA epic key, a markdown file, or a free-form description. For batch scanning of all Ready PRDs in a queue, use /lisa:intake instead."
2
+ description: "Plan work from a single PRD or specification. Decomposes into ordered work items in the configured tracker (JIRA, GitHub Issues, or Linear per .lisa.config.json). Source can be a Notion / Confluence / Linear / GitHub Issue URL, a JIRA epic key, a markdown file, or a free-form description. For batch scanning of all Ready PRDs in a queue, use /lisa:intake instead."
3
3
  argument-hint: "<single-PRD-url | GitHub-issue-url | @file | ticket-id-or-url | description>"
4
4
  ---
5
5
 
@@ -0,0 +1,187 @@
1
+ # Config Resolution
2
+
3
+ Lisa is vendor-agnostic. PRDs can be sourced from Notion, Confluence, Linear, GitHub Issues, or JIRA. Tickets can be written to JIRA, GitHub Issues, or Linear. Per-project configuration lives in `.lisa.config.json` at the repo root, with optional `.lisa.config.local.json` overriding on a per-key basis.
4
+
5
+ This rule is the single source of truth for the `.lisa.config.json` schema, the resolution algorithm, and the dispatch tables every vendor-neutral skill follows.
6
+
7
+ ## File location and precedence
8
+
9
+ Read configuration from the repo root in this order:
10
+
11
+ 1. `.lisa.config.local.json` — gitignored, per-developer overrides (e.g., a developer running with a different destination tracker for one branch).
12
+ 2. `.lisa.config.json` — committed, project-wide settings.
13
+
14
+ Local overrides global on a **per-key basis**: missing keys in `.lisa.config.local.json` fall through to `.lisa.config.json`. Use `jq` from Bash for all reads — never hand-parse JSON.
15
+
16
+ A typical Bash read:
17
+
18
+ ```bash
19
+ local_value=$(jq -r '.tracker // empty' .lisa.config.local.json 2>/dev/null)
20
+ global_value=$(jq -r '.tracker // empty' .lisa.config.json 2>/dev/null)
21
+ tracker="${local_value:-${global_value:-jira}}"
22
+ ```
23
+
24
+ ## Schema
25
+
26
+ ```json
27
+ {
28
+ "tracker": "jira",
29
+ "source": "notion",
30
+
31
+ "atlassian": { "cloudId": "<uuid>" },
32
+ "jira": { "project": "<KEY>" },
33
+ "confluence": { "spaceKey": "<KEY>", "parentPageId": "<id>" },
34
+ "github": { "org": "<org-or-user>", "repo": "<repo>" },
35
+ "notion": { "prdDatabaseId": "<uuid>", "statusProperty": "Status", "readyValue": "Ready" },
36
+ "linear": { "workspace": "<workspace-slug>", "teamKey": "<TEAM>" }
37
+ }
38
+ ```
39
+
40
+ ### Top-level fields
41
+
42
+ | Field | Required | Default | Notes |
43
+ |-------|----------|---------|-------|
44
+ | `tracker` | no | `"jira"` | Destination for ticket writes. One of `"jira"`, `"github"`, `"linear"`. Missing key resolves to `"jira"` for back-compat. |
45
+ | `source` | no | — | Default PRD source for batch skills (`/lisa:intake`) and arg-less single-PRD skills. One of `"notion"`, `"confluence"`, `"linear"`, `"github"`, `"jira"`. Explicit URLs/keys passed to a skill always win over `source`; this is a default, not a lock. |
46
+
47
+ ### Vendor sections
48
+
49
+ Each vendor section is **conditionally required**: required only when that vendor is referenced as `tracker`, as `source`, or by an explicit invocation. Skills validate their own required keys at entry and stop with a clear error if missing — never invent values.
50
+
51
+ #### `atlassian`
52
+
53
+ | Field | Required when | Notes |
54
+ |-------|---------------|-------|
55
+ | `atlassian.cloudId` | `tracker = "jira"`, `source = "jira"`, `source = "confluence"`, or any `confluence-*` / `jira-*` skill is invoked | Atlassian Cloud site UUID. Resolve once via the Atlassian MCP `getAccessibleAtlassianResources` and paste in. Shared between JIRA and Confluence (same Atlassian site). If a project ever needs separate sites for JIRA vs Confluence, override via `jira.cloudId` / `confluence.cloudId` (not currently implemented — file an issue). |
56
+
57
+ #### `jira`
58
+
59
+ | Field | Required when | Notes |
60
+ |-------|---------------|-------|
61
+ | `jira.project` | `tracker = "jira"` or any `jira-*` skill is invoked | JIRA project key (e.g. `SE`, `ENG`). |
62
+
63
+ #### `confluence`
64
+
65
+ | Field | Required when | Notes |
66
+ |-------|---------------|-------|
67
+ | `confluence.spaceKey` | `source = "confluence"` and `parentPageId` is not set | Confluence space key (e.g. `ENG`). |
68
+ | `confluence.parentPageId` | `source = "confluence"` and `spaceKey` is not set | Confluence parent page ID. Either `spaceKey` or `parentPageId` must be set; both is allowed (parent page ID narrows the scope). |
69
+
70
+ #### `github`
71
+
72
+ | Field | Required when | Notes |
73
+ |-------|---------------|-------|
74
+ | `github.org` | `tracker = "github"` or `source = "github"` or any `github-*` skill is invoked | GitHub organization or user name. |
75
+ | `github.repo` | same as above | GitHub repository name. |
76
+
77
+ When `tracker = "github"` AND `source = "github"` (self-host), both reads and writes hit the same GitHub repo. Label namespaces are kept separate so the two flows don't collide — see "Self-host edge case" below.
78
+
79
+ #### `notion`
80
+
81
+ | Field | Required when | Notes |
82
+ |-------|---------------|-------|
83
+ | `notion.prdDatabaseId` | `source = "notion"` | Notion database ID (UUID, dashes optional). The database is the PRD queue. |
84
+ | `notion.statusProperty` | `source = "notion"` | Name of the database property that drives the lifecycle. Defaults to `"Status"` if absent. |
85
+ | `notion.readyValue` | `source = "notion"` | Status value that means "ready for ticketing". Defaults to `"Ready"` if absent. The full lifecycle (Ready → In Review → Blocked / Ticketed → Shipped) is hardcoded; only the entry-point value name is configurable for now. |
86
+
87
+ #### `linear`
88
+
89
+ | Field | Required when | Notes |
90
+ |-------|---------------|-------|
91
+ | `linear.workspace` | `tracker = "linear"`, `source = "linear"`, or any `linear-*` skill is invoked | Linear workspace slug (e.g. `acme`). |
92
+ | `linear.teamKey` | `tracker = "linear"` | Linear team key (e.g. `ENG`). The team owns the destination Issues. For source mode, projects are workspace-scoped or team-scoped per the URL passed. |
93
+
94
+ ## Resolution algorithm
95
+
96
+ Every `tracker-*` shim and every vendor-neutral caller follows this:
97
+
98
+ 1. Read `.lisa.config.local.json` first (if present), then `.lisa.config.json`. Local overrides global on a per-key basis. Use `jq` — never hand-parse JSON.
99
+ 2. Extract the `tracker` field. If missing or null, default to `"jira"`.
100
+ 3. Dispatch:
101
+ - `tracker = "jira"` → delegate to the matching `jira-*` skill. Validate `atlassian.cloudId` and `jira.project` are present.
102
+ - `tracker = "github"` → delegate to the matching `github-*` skill. Validate `github.org` and `github.repo` are present.
103
+ - `tracker = "linear"` → delegate to the matching `linear-*` skill. Validate `linear.workspace` and `linear.teamKey` are present.
104
+ 4. Any other value: stop and report `"Unknown tracker '<value>' in .lisa.config.json. Expected 'jira', 'github', or 'linear'."`
105
+
106
+ For batch skills that consume `source`:
107
+
108
+ 1. If `$ARGUMENTS` contains an explicit URL or key, parse the source vendor from it (always wins).
109
+ 2. If `$ARGUMENTS` is the bare token `notion` / `confluence` / `linear` / `github` / `jira`, the source is that vendor; resolve location from the corresponding config section.
110
+ 3. If `$ARGUMENTS` is empty, fall back to `source` from config; if that's also empty, stop and report `"No source specified and no 'source' field in .lisa.config.json."`
111
+
112
+ ## Skill mapping
113
+
114
+ The shim → vendor mapping is fixed:
115
+
116
+ | Shim | jira tracker | github tracker | linear tracker |
117
+ |------|--------------|----------------|----------------|
118
+ | `lisa:tracker-write` | `lisa:jira-write-ticket` | `lisa:github-write-issue` | `lisa:linear-write-issue` |
119
+ | `lisa:tracker-validate` | `lisa:jira-validate-ticket` | `lisa:github-validate-issue` | `lisa:linear-validate-issue` |
120
+ | `lisa:tracker-verify` | `lisa:jira-verify` | `lisa:github-verify` | `lisa:linear-verify` |
121
+ | `lisa:tracker-read` | `lisa:jira-read-ticket` | `lisa:github-read-issue` | `lisa:linear-read-issue` |
122
+ | `lisa:tracker-evidence` | `lisa:jira-evidence` | `lisa:github-evidence` | `lisa:linear-evidence` |
123
+ | `lisa:tracker-sync` | `lisa:jira-sync` | `lisa:github-sync` | `lisa:linear-sync` |
124
+ | `lisa:tracker-add-journey` | `lisa:jira-add-journey` | `lisa:github-add-journey` | `lisa:linear-add-journey` |
125
+ | `lisa:tracker-journey` | `lisa:jira-journey` | `lisa:github-journey` | `lisa:linear-journey` |
126
+ | `lisa:tracker-create` | `lisa:jira-create` | `lisa:github-create` | `lisa:linear-create` |
127
+ | `lisa:tracker-build-intake` | `lisa:jira-build-intake` | `lisa:github-build-intake` | `lisa:linear-build-intake` |
128
+
129
+ The `tracker-source-artifacts` skill (formerly `tracker-source-artifacts`) is read-only and vendor-neutral — it has no shim and is invoked directly by every `*-to-tracker` skill and every destination write skill (`jira-write-ticket`, `github-write-issue`, `linear-write-issue`).
130
+
131
+ ## Caller responsibilities
132
+
133
+ - **PRD-source skills** (`notion-to-tracker`, `confluence-to-tracker`, `linear-to-tracker`, `github-to-tracker`) MUST invoke `tracker-write` and `tracker-validate` — never `jira-write-ticket` / `github-write-issue` / `linear-write-issue` directly. This is what makes a project's destination switchable via config.
134
+ - **Lifecycle skills** (`implement`, `verify`, `monitor`) MUST invoke `tracker-read`, `tracker-evidence`, `tracker-sync` for ticket interaction — never the vendor-specific equivalents.
135
+ - **Per-vendor PRD intake skills** (`notion-prd-intake`, `confluence-prd-intake`, `linear-prd-intake`, `github-prd-intake`) compose the PRD-source skills (which in turn invoke the shims) — they do not need to read `tracker` themselves.
136
+ - **Vendor-specific destination skills** (`jira-*`, `github-*`, `linear-*`) read their own vendor config section directly. They do NOT consult `tracker` — they are the targets of dispatch, not the dispatchers.
137
+
138
+ ## Linear destination semantics (best practices)
139
+
140
+ Linear's data model differs from JIRA / GitHub. The destination mapping follows Linear's recommended patterns:
141
+
142
+ | Concept (JIRA / GitHub) | Linear equivalent | Linear MCP write |
143
+ |---|---|---|
144
+ | Epic | **Project** (with milestones, target dates, lead, state) | `save_project` |
145
+ | Story | **Issue** with `projectId` set, no `parentId` | `save_issue` |
146
+ | Sub-task | **Sub-issue** with `parentId` = Story issue ID | `save_issue` |
147
+ | Fix version | Linear **ProjectMilestone** (native, dated) | `save_project` (milestones array) |
148
+ | Priority | Native `priority` field (0=No, 1=Urgent, 2=High, 3=Medium, 4=Low) | issue field |
149
+ | Estimate / story points | Native `estimate` field | issue field |
150
+ | Status workflow | **Labels** (`status:ready`, `status:in-progress`, `status:on-dev`, `status:done`) — portable across teams | issue labels |
151
+ | Component | Label prefix `component:` | issue labels |
152
+ | Issue links (blocks / relates / duplicates) | Native Linear relations | `save_issue_relation` |
153
+
154
+ `linear-write-issue` is **polymorphic**: dispatches internally on `issue_type` (Epic → `save_project`, Story / Sub-task → `save_issue`). Parity with `jira-write-ticket` / `github-write-issue` is preserved at the shim level.
155
+
156
+ Initiatives (Linear's cross-Project rollup) are NOT used — they're intended for cross-quarter, cross-team groupings rarely appropriate for an Epic. If a project ever needs Initiative-level grouping, that's a future extension to this rule.
157
+
158
+ ## Self-host edge case (GitHub PRDs → GitHub destination)
159
+
160
+ When `github-to-tracker` is invoked AND `tracker = "github"`, both reads and writes hit the same GitHub repo. Label namespaces are kept separate so the two flows don't collide:
161
+
162
+ - PRD-source labels: `prd-draft`, `prd-ready`, `prd-in-review`, `prd-blocked`, `prd-ticketed`, `prd-shipped` — owned by `github-prd-intake` and the human PM.
163
+ - Build-queue labels: `status:ready`, `status:in-progress`, `status:code-review`, `status:on-dev`, `status:done` — owned by `github-build-intake` and `github-agent`.
164
+ - Sentinel issue label: `prd-intake-feedback` — owned by `github-prd-intake`.
165
+
166
+ Never overload one label across both lifecycles.
167
+
168
+ The same separation applies for Linear self-host (`source = "linear"` AND `tracker = "linear"`): project-level labels (`prd-*`) drive the PRD lifecycle; issue-level labels (`status:*`) drive the build lifecycle; the sentinel feedback issue carries the issue-level `prd-intake-feedback` label.
169
+
170
+ ## Invariants
171
+
172
+ - Project tracker selection is **persistent** within a project — always read from config, never infer from the shape of `$ARGUMENTS`. If a developer wants a different destination for one run, they edit `.lisa.config.local.json`.
173
+ - A vendor-neutral skill never embeds vendor-specific terminology in its prompts (no "JIRA ticket key", "epic parent" — use "tracker key", "parent issue"). The vendor skill is responsible for translating its inputs.
174
+ - The shim layer is intentionally thin — its only job is dispatch. Gate logic, validation rules, and field schemas all live in the vendor skills.
175
+ - Secrets stay in env (`JIRA_API_TOKEN`, `LINEAR_API_KEY`, `GH_TOKEN`, `NOTION_API_KEY`, `ATLASSIAN_API_TOKEN`). Configuration in `.lisa.config.json` is non-secret only — IDs, keys, slugs, project codes.
176
+ - E2E test config (`E2E_BASE_URL`, `E2E_TEST_PHONE`, `E2E_TEST_OTP`, `E2E_TEST_ORG`, `E2E_GRAPHQL_URL`) stays in env for now — not tracker-related and frequently per-environment.
177
+
178
+ ## Migration from the previous schema
179
+
180
+ The pre-expansion `.lisa.config.json` had only `tracker` and `github.{org,repo}`. Existing projects continue to work — the new fields are all conditionally required, and `tracker = "jira"` (the default) only requires `atlassian.cloudId` and `jira.project`, which were previously read from env (`JIRA_SERVER`, `JIRA_PROJECT`).
181
+
182
+ To migrate a project off env vars:
183
+
184
+ 1. Add `atlassian.cloudId` (resolve via `getAccessibleAtlassianResources` once).
185
+ 2. Add `jira.project` (was `JIRA_PROJECT`).
186
+ 3. Drop `JIRA_SERVER` from env (replaced by `atlassian.cloudId`).
187
+ 4. Optionally add `source` to set the default PRD source for batch skills.
@@ -310,33 +310,33 @@ Sequence:
310
310
  1. `ops-specialist` -- health checks, log inspection, error monitoring, performance analysis
311
311
  2. Report findings, escalate if action needed
312
312
 
313
- ## Tracker Entry Point (JIRA or GitHub Issues)
313
+ ## Tracker Entry Point (JIRA, GitHub Issues, or Linear)
314
314
 
315
- When the request references a tracker ticket (a JIRA key like `PROJ-123`, a JIRA URL, a GitHub issue URL, or an `org/repo#<n>` token):
315
+ When the request references a tracker ticket (a JIRA key like `PROJ-123`, a JIRA URL, a GitHub issue URL, an `org/repo#<n>` token, or a Linear identifier like `ENG-123` or a Linear project URL):
316
316
 
317
- 1. Hand off to the matching vendor agent — `jira-agent` (for JIRA refs) or `github-agent` (for GitHub Issue refs). The configured destination tracker (`.lisa.config.json` `tracker`) is the default when the ref shape is ambiguous.
318
- 2. The agent reads the ticket fully via the matching read skill (`jira-read-ticket` / `github-read-issue`) — description / body, comments, attachments, linked issues, parent (Epic / parent sub-issue), siblings.
319
- 3. The agent validates ticket quality via the matching verify skill (`jira-verify` / `github-verify`).
317
+ 1. Hand off to the matching vendor agent — `jira-agent` (JIRA refs), `github-agent` (GitHub Issue refs), or `linear-agent` (Linear identifier or project URL). The configured destination tracker (`.lisa.config.json` `tracker`) is the default when the ref shape is ambiguous.
318
+ 2. The agent reads the work item fully via the matching read skill (`jira-read-ticket` / `github-read-issue` / `linear-read-issue`) — description / body, comments, attachments, linked items, parent (Epic / Project / parent Issue), siblings.
319
+ 3. The agent validates item quality via the matching verify skill (`jira-verify` / `github-verify` / `linear-verify`).
320
320
  4. The agent runs analytical triage via the vendor-neutral `ticket-triage` skill.
321
321
  5. If triage finds unresolved ambiguities (`BLOCKED` verdict), the agent posts findings and STOPS -- no work begins.
322
322
  6. The agent determines intent and delegates to the appropriate flow:
323
323
 
324
- | Ticket Type | Flow | Work Type |
325
- |-------------|------|-----------|
326
- | Epic | Plan | -- |
324
+ | Item kind | Flow | Work Type |
325
+ |-----------|------|-----------|
326
+ | Epic (JIRA Epic / GitHub Epic-labeled / Linear Project) | Plan | -- |
327
327
  | Story | Implement | Build |
328
328
  | Task | Implement | Build |
329
329
  | Bug | Implement | Fix |
330
330
  | Spike | Implement | Investigate Only |
331
331
  | Improvement | Implement | Improve |
332
- | Sub-task | Implement | (per parent's intent) |
332
+ | Sub-task / sub-Issue | Implement | (per parent's intent) |
333
333
 
334
- For JIRA, the type comes from the ticket's issue type. For GitHub, the type comes from the `type:<value>` label.
334
+ For JIRA, the type comes from the ticket's issue type. For GitHub, the type comes from the `type:<value>` label. For Linear, the type typically comes from a label (`type:story`, `type:bug`) or is inferred from the description if unlabeled — `linear-agent` handles the inference.
335
335
 
336
- If the ticket type is ambiguous, read the description / body to classify. A "Task" that describes broken behavior is a Fix. A "Bug" that requests new functionality is a Build.
336
+ If the item type is ambiguous, read the description / body to classify. A "Task" that describes broken behavior is a Fix. A "Bug" that requests new functionality is a Build.
337
337
 
338
- 7. The agent syncs progress at milestones via the matching sync skill (`jira-sync` / `github-sync`).
339
- 8. The agent posts evidence at completion via the matching evidence skill (`jira-evidence` / `github-evidence`).
338
+ 7. The agent syncs progress at milestones via the matching sync skill (`jira-sync` / `github-sync` / `linear-sync`).
339
+ 8. The agent posts evidence at completion via the matching evidence skill (`jira-evidence` / `github-evidence` / `linear-evidence`).
340
340
 
341
341
  Vendor-neutral callers (e.g., `implement`, `verify`) should invoke the `tracker-*` shims — they dispatch to the right vendor automatically.
342
342
 
@@ -1,6 +1,6 @@
1
1
  ---
2
2
  name: confluence-prd-intake
3
- description: "Scans a Confluence space (or a parent page) for PRD pages labelled `prd-ready` and runs each one through the dry-run validation pipeline. PRDs that pass every gate get tickets written and the label flipped to `prd-ticketed`; PRDs that fail get clarifying-question comments and the label flipped to `prd-blocked`. Confluence counterpart of `lisa:notion-prd-intake` — the workflow is identical; only the source-of-truth tools differ. Composes existing skills (confluence-to-tracker, tracker-validate, jira-source-artifacts, product-walkthrough)."
3
+ description: "Scans a Confluence space (or a parent page) for PRD pages labelled `prd-ready` and runs each one through the dry-run validation pipeline. PRDs that pass every gate get tickets written and the label flipped to `prd-ticketed`; PRDs that fail get clarifying-question comments and the label flipped to `prd-blocked`. Confluence counterpart of `lisa:notion-prd-intake` — the workflow is identical; only the source-of-truth tools differ. Composes existing skills (confluence-to-tracker, tracker-validate, tracker-source-artifacts, product-walkthrough)."
4
4
  allowed-tools: ["Skill", "Bash", "mcp__atlassian__getConfluencePage", "mcp__atlassian__getConfluenceSpaces", "mcp__atlassian__getPagesInConfluenceSpace", "mcp__atlassian__getConfluencePageDescendants", "mcp__atlassian__searchConfluenceUsingCql", "mcp__atlassian__updateConfluencePage", "mcp__atlassian__createConfluenceFooterComment", "mcp__atlassian__createConfluenceInlineComment", "mcp__atlassian__getConfluencePageFooterComments", "mcp__atlassian__getConfluencePageInlineComments", "mcp__atlassian__getAccessibleAtlassianResources"]
5
5
  ---
6
6
 
@@ -28,7 +28,7 @@ Specifically forbidden:
28
28
 
29
29
  The only legitimate reasons to stop early:
30
30
 
31
- - Missing space/parent argument or required configuration (`JIRA_PROJECT`, `JIRA_SERVER`, `E2E_BASE_URL`, etc.). Surface the missing value and exit.
31
+ - Missing space/parent argument or required configuration (`atlassian.cloudId` in `.lisa.config.json`, `E2E_BASE_URL`, etc.). Surface the missing value and exit.
32
32
  - Space/parent unreachable, or the labelling convention not yet adopted (no PRDs carry any of `prd-ready` / `prd-in-review` / `prd-blocked` / `prd-ticketed`). Surface and exit.
33
33
  - Empty `prd-ready` set. Exit cleanly with `"No PRDs labelled prd-ready. Nothing to do."`
34
34
 
@@ -105,7 +105,7 @@ Invoke the `lisa:confluence-to-tracker` skill with `dry_run: true` and the PRD's
105
105
  - An overall PASS / FAIL verdict
106
106
  - A failure count
107
107
 
108
- This call also indirectly invokes `lisa:jira-source-artifacts` (artifact extraction + classification) and `lisa:product-walkthrough` (when the PRD touches existing user-facing surfaces). All gate logic lives in `lisa:tracker-validate`, which `lisa:confluence-to-tracker` calls per ticket.
108
+ This call also indirectly invokes `lisa:tracker-source-artifacts` (artifact extraction + classification) and `lisa:product-walkthrough` (when the PRD touches existing user-facing surfaces). All gate logic lives in `lisa:tracker-validate`, which `lisa:confluence-to-tracker` calls per ticket.
109
109
 
110
110
  #### 3c. Branch on the verdict
111
111
 
@@ -236,7 +236,12 @@ Print to the agent's output. Do not write this summary to Confluence or JIRA —
236
236
 
237
237
  ## Configuration
238
238
 
239
- Same env vars as `lisa:confluence-to-tracker` — `JIRA_PROJECT`, `JIRA_SERVER`, `CONFLUENCE_HOST`, `E2E_BASE_URL`, `E2E_TEST_PHONE`, `E2E_TEST_OTP`, `E2E_TEST_ORG`, `E2E_GRAPHQL_URL`. If any required value is missing, surface the missing key(s) and exit this cycle — never invent values.
239
+ Same configuration as `lisa:confluence-to-tracker`. See that skill for the full table. Key items:
240
+
241
+ - **From `.lisa.config.json`**: `atlassian.cloudId` (required for Confluence MCP), `confluence.spaceKey` and/or `confluence.parentPageId` (when `$ARGUMENTS` doesn't pin a specific page).
242
+ - **From environment variables**: `E2E_BASE_URL`, `E2E_TEST_PHONE`, `E2E_TEST_OTP`, `E2E_TEST_ORG`, `E2E_GRAPHQL_URL` (operational E2E test config).
243
+
244
+ Destination tracker config (jira / github / linear) is consumed by `lisa:tracker-write` internally — this skill does NOT read it. If any required value is missing, surface the missing key(s) and exit this cycle — never invent values.
240
245
 
241
246
  ## Rules
242
247