@codyswann/lisa 2.60.1 → 2.61.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.
- package/package.json +1 -1
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/agents/github-agent.md +4 -5
- package/plugins/lisa/agents/github-build-intake.md +1 -1
- package/plugins/lisa/rules/config-resolution.md +3 -4
- package/plugins/lisa/rules/leaf-only-lifecycle.md +1 -1
- package/plugins/lisa/skills/confluence-prd-intake/SKILL.md +13 -13
- package/plugins/lisa/skills/confluence-prd-intake/agents/openai.yaml +2 -2
- package/plugins/lisa/skills/git-submit-pr/SKILL.md +27 -0
- package/plugins/lisa/skills/github-build-intake/SKILL.md +19 -21
- package/plugins/lisa/skills/github-evidence/SKILL.md +3 -26
- package/plugins/lisa/skills/github-evidence/agents/openai.yaml +2 -2
- package/plugins/lisa/skills/github-journey/SKILL.md +2 -2
- package/plugins/lisa/skills/github-prd-intake/SKILL.md +10 -10
- package/plugins/lisa/skills/github-prd-intake/agents/openai.yaml +2 -2
- package/plugins/lisa/skills/github-sync/SKILL.md +5 -5
- package/plugins/lisa/skills/github-write-issue/SKILL.md +2 -2
- package/plugins/lisa/skills/implement/SKILL.md +8 -1
- package/plugins/lisa/skills/intake/SKILL.md +12 -12
- package/plugins/lisa/skills/intake/agents/openai.yaml +2 -2
- package/plugins/lisa/skills/jira-build-intake/SKILL.md +11 -11
- package/plugins/lisa/skills/linear-build-intake/SKILL.md +9 -9
- package/plugins/lisa/skills/linear-prd-intake/SKILL.md +12 -12
- package/plugins/lisa/skills/linear-prd-intake/agents/openai.yaml +2 -2
- package/plugins/lisa/skills/notion-prd-intake/SKILL.md +11 -11
- package/plugins/lisa/skills/notion-prd-intake/agents/openai.yaml +2 -2
- package/plugins/lisa/skills/setup-github/SKILL.md +0 -1
- package/plugins/lisa/skills/tracker-build-intake/SKILL.md +2 -2
- package/plugins/lisa/skills/tracker-build-intake/agents/openai.yaml +2 -2
- package/plugins/lisa/skills/tracker-evidence/SKILL.md +2 -2
- package/plugins/lisa/skills/tracker-sync/SKILL.md +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/src/base/agents/github-agent.md +4 -5
- package/plugins/src/base/agents/github-build-intake.md +1 -1
- package/plugins/src/base/rules/config-resolution.md +3 -4
- package/plugins/src/base/rules/leaf-only-lifecycle.md +1 -1
- package/plugins/src/base/skills/confluence-prd-intake/SKILL.md +13 -13
- package/plugins/src/base/skills/git-submit-pr/SKILL.md +27 -0
- package/plugins/src/base/skills/github-build-intake/SKILL.md +19 -21
- package/plugins/src/base/skills/github-evidence/SKILL.md +3 -26
- package/plugins/src/base/skills/github-journey/SKILL.md +2 -2
- package/plugins/src/base/skills/github-prd-intake/SKILL.md +10 -10
- package/plugins/src/base/skills/github-sync/SKILL.md +5 -5
- package/plugins/src/base/skills/github-write-issue/SKILL.md +2 -2
- package/plugins/src/base/skills/implement/SKILL.md +8 -1
- package/plugins/src/base/skills/intake/SKILL.md +12 -12
- package/plugins/src/base/skills/jira-build-intake/SKILL.md +11 -11
- package/plugins/src/base/skills/linear-build-intake/SKILL.md +9 -9
- package/plugins/src/base/skills/linear-prd-intake/SKILL.md +12 -12
- package/plugins/src/base/skills/notion-prd-intake/SKILL.md +11 -11
- package/plugins/src/base/skills/setup-github/SKILL.md +0 -1
- package/plugins/src/base/skills/tracker-build-intake/SKILL.md +2 -2
- package/plugins/src/base/skills/tracker-evidence/SKILL.md +2 -2
- package/plugins/src/base/skills/tracker-sync/SKILL.md +1 -1
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
display_name: "Github PRD Intake"
|
|
2
|
-
short_description: "Scans a GitHub repository for issues carrying the configured `ready` PRD label and runs
|
|
2
|
+
short_description: "Scans a GitHub repository for issues carrying the configured `ready` PRD label and runs the first eligible one through the dry-run…"
|
|
3
3
|
default_prompt:
|
|
4
|
-
- "Use $github-prd-intake: Scans a GitHub repository for issues carrying the configured `ready` PRD label and runs
|
|
4
|
+
- "Use $github-prd-intake: Scans a GitHub repository for issues carrying the configured `ready` PRD label and runs the first eligible one through the dry-run…."
|
|
@@ -57,10 +57,10 @@ Based on the milestone, suggest (but do NOT automatically perform) a label trans
|
|
|
57
57
|
| Milestone | Suggested label |
|
|
58
58
|
|-----------|-----------------|
|
|
59
59
|
| Plan created | `status:in-progress` |
|
|
60
|
-
| PR ready | `status:
|
|
61
|
-
| PR merged |
|
|
60
|
+
| PR ready | configured `done` label (`status:done` in this repo) |
|
|
61
|
+
| PR merged | no additional build-label transition |
|
|
62
62
|
|
|
63
|
-
The actual `status:in-progress` flip is owned by `lisa:github-build-intake` (claim) and `lisa:github-agent`. The `
|
|
63
|
+
The actual `status:in-progress` flip is owned by `lisa:github-build-intake` (claim) and `lisa:github-agent`. The configured `done` flip is owned by the build-intake owner after a successful build and evidence post. This skill never relabels.
|
|
64
64
|
|
|
65
65
|
### Step 5: Parent Status Rollup (`--rollup`)
|
|
66
66
|
|
|
@@ -82,12 +82,12 @@ gh api graphql -f query='
|
|
|
82
82
|
|
|
83
83
|
If the `subIssues` field is unavailable (older GHES), fall back to body parentage exactly as `lisa:github-read-issue` does. If the issue has **no** children it is a leaf, not a parent — rollup is N/A; behave as a normal milestone sync.
|
|
84
84
|
|
|
85
|
-
**Evaluate the required children in priority order and take the first match** (canonical roles from `config-resolution`; the GitHub label map is `status:blocked`, `status:in-progress`, `status:
|
|
85
|
+
**Evaluate the required children in priority order and take the first match** (canonical roles from `config-resolution`; the GitHub label map is `status:blocked`, `status:in-progress`, `status:done`):
|
|
86
86
|
|
|
87
87
|
| If among the required child leaves… | Derived parent role | GitHub label |
|
|
88
88
|
|---|---|---|
|
|
89
89
|
| any child carries `status:blocked` (or is otherwise blocked) | `blocked` | `status:blocked` |
|
|
90
|
-
| else any child carries `status:in-progress`
|
|
90
|
+
| else any child carries `status:in-progress` | `claimed` | `status:in-progress` |
|
|
91
91
|
| else **all** required children are terminal (closed / `status:done`) | `done` | the configured terminal `done` label |
|
|
92
92
|
| else (children exist, none started) | — | unchanged — parent keeps its non-ready container label |
|
|
93
93
|
|
|
@@ -194,7 +194,7 @@ GitHub Issues uses **labels** for the structured metadata that JIRA stores in cu
|
|
|
194
194
|
| Concept | Label format | Example |
|
|
195
195
|
|---------|--------------|---------|
|
|
196
196
|
| Issue type | `type:<value>` | `type:Story`, `type:Bug`, `type:Epic`, `type:Sub-task`, `type:Spike`, `type:Improvement` |
|
|
197
|
-
| Status | `status:<value>` | `status:ready`, `status:in-progress`, `status:
|
|
197
|
+
| Status | `status:<value>` | `status:ready`, `status:in-progress`, `status:on-dev`, `status:done` |
|
|
198
198
|
| Priority | `priority:<value>` | `priority:low`, `priority:medium`, `priority:high`, `priority:critical` |
|
|
199
199
|
| Components | `component:<name>` | `component:auth`, `component:billing` |
|
|
200
200
|
| Story points | `points:<n>` | `points:3`, `points:5`, `points:8` |
|
|
@@ -293,7 +293,7 @@ The mapping below is the single source of truth for how JIRA concepts translate
|
|
|
293
293
|
| JIRA concept | GitHub Issues equivalent |
|
|
294
294
|
|---|---|
|
|
295
295
|
| Issue type | Label `type:<value>` |
|
|
296
|
-
| Status (Ready / In Progress /
|
|
296
|
+
| Status (Ready / In Progress / On Dev / Done) | Label `status:<value>` |
|
|
297
297
|
| Epic / Story / Sub-task hierarchy | Native sub-issues via `gh api graphql addSubIssue` |
|
|
298
298
|
| Acceptance Criteria | `## Acceptance Criteria` markdown section with a Gherkin code-fence |
|
|
299
299
|
| Validation Journey | `## Validation Journey` markdown section |
|
|
@@ -54,6 +54,13 @@ Using the general-purpose agent in Team Lead session, Determine what branch to u
|
|
|
54
54
|
2. Are we on a feature branch without an open pull request? Use the branch, but ask the human what branch to target for the PR
|
|
55
55
|
3. Are we on an environment branch (dev, staging, main, prod, production)? Check out a feature branch named for this plan and set the target branch of the PR to the environment branch
|
|
56
56
|
|
|
57
|
+
When the request came from a tracker work item, preserve its native identifier for development linkage:
|
|
58
|
+
|
|
59
|
+
- Capture `tracker_provider` and `work_item_ref` from the resolved input before creating or reusing a branch. Examples: `github` + `CodySwannGT/lisa#614`, `linear` + `ENG-123`, `jira` + `ENG-123`.
|
|
60
|
+
- If a new branch is needed and the provider can link branches by identifier, include the identifier in the branch name before the human-readable slug. Linear and JIRA integrations commonly link from branch names; GitHub issue linkage is PR-body driven, but including the issue number in the branch name is still useful. Keep branch names URL-safe, for example `codex/ENG-123-add-checkout-copy` or `codex/614-add-checkout-copy`.
|
|
61
|
+
- Pass the work-item ref and target branch to `lisa:git-submit-pr` when opening or updating the PR, for example `work_item_ref=CodySwannGT/lisa#614 target_branch=main`. The PR workflow owns provider-specific body text and must decide whether to use a closing keyword or a non-closing reference.
|
|
62
|
+
- If the provider has no native branch or PR development-linkage surface, continue without linkage and mention that the provider was skipped.
|
|
63
|
+
|
|
57
64
|
Using the general-purpose agent in Team Lead session, Determine which flow applies:
|
|
58
65
|
1. Research -- needs a PRD (no specification exists)
|
|
59
66
|
2. Plan -- needs decomposition (specification exists but no work items)
|
|
@@ -115,7 +122,7 @@ Before shutting down the team, execute the Verify flow:
|
|
|
115
122
|
3. Write e2e test encoding the verification
|
|
116
123
|
4. Commit ALL outstanding changes in logical batches on the branch (minus sensitive data/information) — not just changes made by the agent team. This includes pre-existing uncommitted changes that were on the branch before the plan started. Do NOT filter commits to only "task-related" files. If it shows up in git status, it gets committed (unless it contains secrets).
|
|
117
124
|
5. Push the changes - if any pre-push hook blocks you, create a task for the agent team to fix the error/problem whether it was pre-existing or not
|
|
118
|
-
6. Open a pull request with auto-merge on
|
|
125
|
+
6. Open a pull request with auto-merge on via `lisa:git-submit-pr`, including the work-item ref when one exists so the PR can be linked natively to the source issue.
|
|
119
126
|
7. PR Watch Loop: Monitor the PR using `git-submit-pr`'s drive-to-merge behavior. Create a task for the agent team to resolve any code review comments by either implementing the suggestions or commenting why they should not be implemented and close the comment. Fix any failing checks and repush. If the PR is `BEHIND`, blocked by stale review state, or cannot enable auto-merge, follow the harness-agnostic `git-submit-pr` re-sync, review-gate, and direct-merge fallback loop until the PR is actually merged or a blocking failure is surfaced.
|
|
120
127
|
8. Merge the PR
|
|
121
128
|
9. Monitor the deploy action that triggers automatically from the successful merge
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: intake
|
|
3
|
-
description: "Vendor-agnostic
|
|
3
|
+
description: "Vendor-agnostic scanner for Ready queues. Given a Notion PRD database URL → finds the first Ready PRD and runs lisa:plan. Given a Confluence space or parent page URL → finds the first prd-ready PRD and runs lisa:plan. Given a Linear workspace URL or team key → finds the first prd-ready Linear project and runs lisa:plan. Given a GitHub repo URL or `org/repo` token → finds the first prd-ready GitHub issue and runs lisa:plan. Given a JIRA project key or JQL filter → finds the first Ready ticket and runs lisa:implement. Given a GitHub repo URL or `org/repo` token when `tracker = github` → finds the first `status:ready` issue and runs lisa:implement. 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
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", "mcp__linear-server__list_projects", "mcp__linear-server__list_teams", "mcp__linear-server__list_project_labels"]
|
|
5
5
|
---
|
|
6
6
|
|
|
7
7
|
# Intake: $ARGUMENTS
|
|
8
8
|
|
|
9
|
-
Run one
|
|
9
|
+
Run one intake cycle against the queue identified by `$ARGUMENTS`. Scans for `Status = Ready`, claims the first eligible item, dispatches it to the appropriate single-item lifecycle skill, then exits. Remaining Ready items are left for later scheduler invocations.
|
|
10
10
|
|
|
11
11
|
## Confirmation policy
|
|
12
12
|
|
|
@@ -41,7 +41,7 @@ Until the team is established, the first Codex teammate has been spawned, or the
|
|
|
41
41
|
|
|
42
42
|
If you ARE already inside an agent team (e.g., a teammate invoked this skill via the Skill tool), do NOT create a second team — many harnesses reject double-creates. Continue within the existing team. The team lead created the team; teammates inherit it.
|
|
43
43
|
|
|
44
|
-
The cycle's outer team is created by Intake.
|
|
44
|
+
The cycle's outer team is created by Intake. The one item it processes (a PRD via `lisa:plan`, a ticket via `lisa:implement`) executes within that team — those skills' orchestration preambles detect the existing team and skip creating a second team. One team per cron cycle, one eligible Ready item per cycle.
|
|
45
45
|
|
|
46
46
|
## Source dispatch
|
|
47
47
|
|
|
@@ -49,16 +49,16 @@ Detect the queue type from `$ARGUMENTS` and route:
|
|
|
49
49
|
|
|
50
50
|
| If `$ARGUMENTS` is... | Queue type | Per-item dispatch |
|
|
51
51
|
|------------------------|------------|---------------------|
|
|
52
|
-
| A Notion **database** URL or database ID | PRD queue (Notion) | Invoke `lisa:notion-prd-intake` (which scans the DB for Status=Ready, claims
|
|
53
|
-
| A Confluence **space** URL or space key (e.g. `https://acme.atlassian.net/wiki/spaces/PRD` or `PRD`) | PRD queue (Confluence) | Invoke `lisa:confluence-prd-intake` (which CQL-queries the space for `label = "prd-ready"`, claims
|
|
52
|
+
| A Notion **database** URL or database ID | PRD queue (Notion) | Invoke `lisa:notion-prd-intake` (which scans the DB for Status=Ready, claims the first eligible PRD, runs `lisa:plan` via the dry-run validate → branch → write pipeline, then exits) |
|
|
53
|
+
| A Confluence **space** URL or space key (e.g. `https://acme.atlassian.net/wiki/spaces/PRD` or `PRD`) | PRD queue (Confluence) | Invoke `lisa:confluence-prd-intake` (which CQL-queries the space for `label = "prd-ready"`, claims the first eligible PRD by relabeling to `prd-in-review`, runs the dry-run validate → branch → write pipeline, then exits) |
|
|
54
54
|
| A Confluence **parent page** URL or page ID (the page whose descendants are PRDs) | PRD queue (Confluence, narrowed) | Invoke `lisa:confluence-prd-intake` with the parent ID (CQL: `ancestor = <id> AND label = "prd-ready"`) |
|
|
55
|
-
| A Linear **workspace** URL (e.g. `https://linear.app/acme`) | PRD queue (Linear) | Invoke `lisa:linear-prd-intake` (which queries `list_projects({label: "prd-ready"})` across the workspace, claims
|
|
55
|
+
| A Linear **workspace** URL (e.g. `https://linear.app/acme`) | PRD queue (Linear) | Invoke `lisa:linear-prd-intake` (which queries `list_projects({label: "prd-ready"})` across the workspace, claims the first eligible project by relabeling to `prd-in-review`, runs the dry-run validate → branch → write pipeline, then exits) |
|
|
56
56
|
| A Linear **team** URL (e.g. `https://linear.app/acme/team/ENG/projects`) or a token already routed as a Linear team key | PRD queue (Linear, narrowed) | Invoke `lisa:linear-prd-intake` with the team key (`list_projects({team, label: "prd-ready"})`) |
|
|
57
57
|
| The literal token `linear` | PRD queue (Linear, default workspace) | Invoke `lisa:linear-prd-intake linear` — only valid if `linear.workspace` is configured in `.lisa.config.json` |
|
|
58
|
-
| A JIRA project key (e.g. `SE`) | Work queue (JIRA) | Invoke `lisa:jira-build-intake` (which scans the project for Status=Ready, claims
|
|
58
|
+
| A JIRA project key (e.g. `SE`) | Work queue (JIRA) | Invoke `lisa:jira-build-intake` (which scans the project for Status=Ready, claims the first eligible ticket via In Progress, runs `lisa:implement`, transitions to On Dev on success, then exits) |
|
|
59
59
|
| A full JQL filter (e.g. `project = SE AND component = "frontend"`) | Work queue (JIRA, narrowed) | Invoke `lisa:jira-build-intake` with the JQL |
|
|
60
|
-
| A GitHub **repository** URL or `org/repo` token (e.g. `https://github.com/acme/product-prds` or `acme/product-prds`) when used for **PRDs** | PRD queue (GitHub) | Invoke `lisa:github-prd-intake` (which queries `gh issue list --label prd-ready`, claims
|
|
61
|
-
| A GitHub **repository** URL or `org/repo` token when `tracker = github` is configured (build-queue mode) | Work queue (GitHub) | Invoke `lisa:tracker-build-intake` which dispatches to `lisa:github-build-intake` (which queries `gh issue list --label status:ready`, claims via `status:in-progress`, runs `lisa:implement
|
|
60
|
+
| A GitHub **repository** URL or `org/repo` token (e.g. `https://github.com/acme/product-prds` or `acme/product-prds`) when used for **PRDs** | PRD queue (GitHub) | Invoke `lisa:github-prd-intake` (which queries `gh issue list --label prd-ready`, claims the first eligible PRD by relabeling to `prd-in-review`, runs the dry-run validate → branch → write pipeline, then exits). PRD discovery is independent of the destination tracker — the resulting tickets land wherever `.lisa.config.json` `tracker` says. |
|
|
61
|
+
| A GitHub **repository** URL or `org/repo` token when `tracker = github` is configured (build-queue mode) | Work queue (GitHub) | Invoke `lisa:tracker-build-intake` which dispatches to `lisa:github-build-intake` (which queries `gh issue list --label status:ready`, claims the first eligible issue via `status:in-progress`, runs `lisa:implement`, relabels to `status:on-dev` on success, then exits). |
|
|
62
62
|
| The literal token `github` | Defaults to `.lisa.config.json` `github.org` / `github.repo`. Routes by **the `intake_mode` flag** in `$ARGUMENTS` (`prd` or `build`); if the flag is absent, prefer the PRD queue when both label namespaces are present, otherwise pick whichever exists. | Invoke the matching skill (`lisa:github-prd-intake` or `lisa:tracker-build-intake`). |
|
|
63
63
|
|
|
64
64
|
Disambiguation rules:
|
|
@@ -81,15 +81,15 @@ The single-item skills (`lisa:plan`, `lisa:implement`) and the per-vendor batch
|
|
|
81
81
|
1. **Resolve the queue** — fetch the database/project metadata, confirm the Status property/workflow has the expected `Ready` value.
|
|
82
82
|
2. **Pre-flight check** — for JIRA, confirm `In Progress` and `On Dev` are reachable transitions before doing any per-ticket work. Stop with a clear error if the workflow is misconfigured.
|
|
83
83
|
3. **Find Ready items** — query the queue. Empty → exit cleanly with `"No items with Status=Ready. Nothing to do."` This is the common idle case for a scheduled run.
|
|
84
|
-
4. **Process
|
|
84
|
+
4. **Process the first eligible Ready item only** (claim-first ordering for idempotency):
|
|
85
85
|
- Notion PRDs → `lisa:notion-prd-intake` handles per-item: claim (Status=In Review), dry-run validate, branch to Blocked or Ticketed, coverage audit
|
|
86
86
|
- Confluence PRDs → `lisa:confluence-prd-intake` handles per-item: claim (relabel to `prd-in-review`), dry-run validate, branch to `prd-blocked` or `prd-ticketed`, coverage audit
|
|
87
87
|
- Linear PRDs → `lisa:linear-prd-intake` handles per-item: claim (relabel project to `prd-in-review`), dry-run validate, branch to `prd-blocked` or `prd-ticketed` (with a sentinel feedback issue under each project hosting clarifying-question comments), coverage audit
|
|
88
88
|
- GitHub PRDs → `lisa:github-prd-intake` handles per-item: claim (relabel issue to `prd-in-review`), dry-run validate, branch to `prd-blocked` or `prd-ticketed` (with clarifying-question comments posted directly on the PRD issue), coverage audit
|
|
89
89
|
- JIRA tickets → `lisa:jira-build-intake` handles per-item: claim, dispatch to `lisa:jira-agent`, transition to On Dev on success
|
|
90
90
|
- GitHub build issues (when `tracker = github`) → `lisa:tracker-build-intake` → `lisa:github-build-intake` handles per-item: claim (relabel to `status:in-progress`), dispatch to `lisa:github-agent`, relabel to `status:on-dev` on success
|
|
91
|
-
5. **
|
|
92
|
-
6. **Summary report** —
|
|
91
|
+
5. **Stop after one item** — a claimed item, a safe-blocked container, or a per-item error ends the cycle. Remaining Ready items stay untouched for later scheduler invocations.
|
|
92
|
+
6. **Summary report** — the single processed/skipped/error item, total processed, total errors.
|
|
93
93
|
|
|
94
94
|
## Schedule examples
|
|
95
95
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
display_name: "Intake"
|
|
2
|
-
short_description: "Vendor-agnostic
|
|
2
|
+
short_description: "Vendor-agnostic scanner for Ready queues"
|
|
3
3
|
default_prompt:
|
|
4
|
-
- "Use $intake: Vendor-agnostic
|
|
4
|
+
- "Use $intake: Vendor-agnostic scanner for Ready queues."
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: jira-build-intake
|
|
3
|
-
description: "Symmetric counterpart to notion-prd-intake on the JIRA side. Scans a JIRA project (or JQL filter) for tickets in the configured `ready` status, claims
|
|
3
|
+
description: "Symmetric counterpart to notion-prd-intake on the JIRA side. Scans a JIRA project (or JQL filter) for tickets in the configured `ready` status, claims the first eligible ticket by transitioning to the configured `claimed` status, runs the implementation/build flow via jira-agent, transitions to the configured `done` status on completion, then exits. Enforces the claim-time arm of the `leaf-only-lifecycle` rule: a parent/container with open child work (or a childless Epic/Story/Spike) that still carries a stale build-ready status is skipped or safe-blocked with a lifecycle-repair comment, never claimed. The `ready` status is the human-flipped signal that a TODO ticket is truly ready for development — mirroring how Notion PRDs work product Draft → Ready → (us) In Review → Blocked|Ticketed."
|
|
4
4
|
allowed-tools: ["Skill", "Bash"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -13,7 +13,7 @@ All Atlassian operations in this skill go through `lisa:atlassian-access`. Do no
|
|
|
13
13
|
1. A JIRA project key (e.g. `SE`) — scans that project for tickets in the configured `ready` status.
|
|
14
14
|
2. A full JQL filter (e.g. `project = SE AND component = "frontend" AND Status = Ready`) — used as-is. The skill will not append a `Status = <ready>` clause if the JQL already names a status, so callers can intentionally widen.
|
|
15
15
|
|
|
16
|
-
Run one build-intake cycle.
|
|
16
|
+
Run one build-intake cycle. The first eligible ready ticket is claimed, built via the `lisa:jira-agent` flow, transitioned to the configured `done` status (env-aware — see below), then the cycle exits. Remaining ready tickets stay queued for later scheduler invocations.
|
|
17
17
|
|
|
18
18
|
## Workflow resolution
|
|
19
19
|
|
|
@@ -68,11 +68,11 @@ else
|
|
|
68
68
|
fi
|
|
69
69
|
```
|
|
70
70
|
|
|
71
|
-
Run one build-intake cycle.
|
|
71
|
+
Run one build-intake cycle. The first eligible ticket in `$READY` is claimed by transitioning to `$CLAIMED`, built via the `lisa:jira-agent` flow, transitioned to `$DONE` on completion, then the cycle exits.
|
|
72
72
|
|
|
73
73
|
## Confirmation policy
|
|
74
74
|
|
|
75
|
-
Do NOT ask the caller whether to proceed. Once invoked with a project key or JQL, run the cycle to completion — claim
|
|
75
|
+
Do NOT ask the caller whether to proceed. Once invoked with a project key or JQL, run the cycle to completion — claim and dispatch the first eligible ticket through `lisa:jira-agent`, transition a successful build to `$DONE`, write the summary, and exit. The caller (a human or a cron) has already authorized the run by invoking the skill; re-prompting defeats the purpose of a background queue.
|
|
76
76
|
|
|
77
77
|
Specifically forbidden:
|
|
78
78
|
|
|
@@ -116,13 +116,13 @@ Invoke `lisa:atlassian-access` `operation: search-issues jql: "<JQL>"`. Capture
|
|
|
116
116
|
|
|
117
117
|
If empty, report `"No tickets with Status=$READY. Nothing to do."` and exit. This is the common idle case.
|
|
118
118
|
|
|
119
|
-
### Phase 3 — Process
|
|
119
|
+
### Phase 3 — Process the first eligible ready ticket
|
|
120
120
|
|
|
121
121
|
#### 3a. Leaf-only claim gate (skip / safe-block containers)
|
|
122
122
|
|
|
123
123
|
Build intake claims **only independently implementable leaf work units**. This enforces the claim-time arm of the vendor-neutral `leaf-only-lifecycle` rule: a parent/container that still carries a stale build-ready status (e.g. `Ready` applied before this rule existed, or hand-applied to an Epic/Story) is **never claimed** — intake skips it or safe-blocks it with a clear lifecycle-repair message. It is the claim-time complement to the write-time labeling in `lisa:jira-write-ticket` and the validate-time S15 gate in `lisa:jira-validate-ticket`; all three cite the same rule so the classification never drifts. **Never silently implement a container.**
|
|
124
124
|
|
|
125
|
-
Run this gate **before** the claim transition,
|
|
125
|
+
Run this gate **before** the claim transition, starting with the oldest/highest-priority ready candidate. Do NOT transition, comment "Claimed", or invoke `lisa:jira-agent` for a ticket that fails the gate.
|
|
126
126
|
|
|
127
127
|
**Resolve container vs. leaf — structural first, then nominal.** Per `leaf-only-lifecycle` the classification is structural: a ticket is a **container** if it has **open** child work, whatever its declared type; otherwise the **issue type** decides. Resolve child work using the same hierarchy `lisa:jira-read-ticket` uses — JIRA's native Epic → Story → Sub-task parentage (Epic link / parent field for Stories under an Epic, and the subtask relationship for Sub-tasks under a Story/Task). Issue links (`blocks` / `is blocked by`) express cross-item dependencies and are **not** parentage — do not count them as children.
|
|
128
128
|
|
|
@@ -151,7 +151,7 @@ Classify and act (first match wins). The issue type comes from the ticket's `iss
|
|
|
151
151
|
|
|
152
152
|
The childless-parent exception is narrow: childlessness enables a claim **only** for types that are leaf work units to begin with. A childless Epic/Story/Spike is an incomplete decomposition, not an implementable unit — it is never claimed.
|
|
153
153
|
|
|
154
|
-
**Safe-block (default action for a flagged container).** Leave the build-ready status in place (don't silently transition it away — that hides the lifecycle error), post a single lifecycle-repair comment,
|
|
154
|
+
**Safe-block (default action for a flagged container).** Leave the build-ready status in place (don't silently transition it away — that hides the lifecycle error), post a single lifecycle-repair comment, record the ticket under "Skipped (container)" in the summary, and end the cycle. Do NOT transition to `$CLAIMED`. Keep the comment idempotent — skip posting if an identical `[claude-build-intake]` lifecycle-repair comment already exists on the ticket, so a re-entrant cycle doesn't spam it.
|
|
155
155
|
|
|
156
156
|
Post via `lisa:atlassian-access` `operation: comment key: <TICKET> body: "<message>"` with:
|
|
157
157
|
|
|
@@ -199,9 +199,9 @@ If `lisa:jira-agent` returned Success:
|
|
|
199
199
|
|
|
200
200
|
For any non-Success outcome, do NOT transition. The ticket sits in `$CLAIMED` (or wherever `lisa:jira-agent` left it for the Blocked case) — the cycle's job is done; humans take it from there.
|
|
201
201
|
|
|
202
|
-
#### 3e.
|
|
202
|
+
#### 3e. Stop
|
|
203
203
|
|
|
204
|
-
|
|
204
|
+
Stop immediately after the first claimed, skipped, blocked, held, or errored ticket. Later scheduler invocations process the remaining ready tickets.
|
|
205
205
|
|
|
206
206
|
### Phase 4 — Summary report
|
|
207
207
|
|
|
@@ -233,8 +233,8 @@ Total PRs opened: <n>
|
|
|
233
233
|
- **Claim-first ordering**: `$CLAIMED` set BEFORE `lisa:jira-agent` invocation — no double-pickup.
|
|
234
234
|
- **No writes outside the lifecycle**: this skill only transitions `$READY → $CLAIMED` and `$CLAIMED → $DONE`, then verifies terminal native resolution when `$DONE` is the true terminal state per `leaf-only-lifecycle`. Every other status change is owned by `lisa:jira-agent` (which suggests transitions but only auto-transitions on the verify-FAIL path).
|
|
235
235
|
- **Terminal native closure**: for terminal `$DONE`, the resulting JIRA issue must be in a resolved / closed state (`statusCategory = Done` and resolution set when required). Intermediate env statuses stay unresolved / open.
|
|
236
|
-
- **
|
|
237
|
-
- **Single cycle per query**: do not run two `lisa:jira-build-intake` cycles
|
|
236
|
+
- **One item per cycle**: per-ticket exceptions are caught and recorded, then the cycle exits. The scheduler owns retrying or moving on to the next ready item.
|
|
237
|
+
- **Single cycle per query**: do not run two `lisa:jira-build-intake` cycles concurrently against overlapping queries — concurrent claims could race. The scheduling layer (when added) is responsible for serialization.
|
|
238
238
|
- **Never invent a transition**: if `$CLAIMED` or `$DONE` aren't valid transitions in the project's workflow, stop and report rather than guessing alternative names.
|
|
239
239
|
|
|
240
240
|
## Configuration
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: linear-build-intake
|
|
3
|
-
description: "Symmetric counterpart to lisa:jira-build-intake on the Linear side. Scans a Linear team for Issues carrying the configured `ready` build label, claims
|
|
3
|
+
description: "Symmetric counterpart to lisa:jira-build-intake on the Linear side. Scans a Linear team for Issues carrying the configured `ready` build label, claims the first eligible Issue by relabeling to the configured `claimed` label, runs the implementation/build flow via lisa:linear-agent, relabels to the configured `done` label on completion, then exits. Enforces the claim-time arm of the `leaf-only-lifecycle` rule: a parent/container with open child work (or a childless Epic/Story/Spike) that still carries a stale build-ready label is skipped or safe-blocked with a lifecycle-repair comment, never claimed. The `ready` label is the human-flipped signal that an Issue is truly ready for development — mirroring how Notion PRDs work Draft → Ready → (us) In Review → Blocked|Ticketed."
|
|
4
4
|
allowed-tools: ["Skill", "Bash", "mcp__linear-server__list_teams", "mcp__linear-server__list_issues", "mcp__linear-server__get_issue", "mcp__linear-server__save_issue", "mcp__linear-server__save_comment", "mcp__linear-server__list_issue_labels", "mcp__linear-server__create_issue_label"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -12,7 +12,7 @@ allowed-tools: ["Skill", "Bash", "mcp__linear-server__list_teams", "mcp__linear-
|
|
|
12
12
|
2. The literal token `linear` — falls back to `linear.teamKey` from `.lisa.config.json`.
|
|
13
13
|
3. A pre-built Linear MCP filter (advanced) — used as-is.
|
|
14
14
|
|
|
15
|
-
Run one build-intake cycle.
|
|
15
|
+
Run one build-intake cycle. The first eligible ready Issue is claimed, built via the `lisa:linear-agent` flow, relabeled to the configured `done` label on completion, then the cycle exits. Remaining ready Issues stay queued for later scheduler invocations.
|
|
16
16
|
|
|
17
17
|
This skill is the destination of the `lisa:tracker-build-intake` shim when `tracker = "linear"`.
|
|
18
18
|
|
|
@@ -79,7 +79,7 @@ Reads `linear.workspace`, `linear.teamKey`, and `linear.labels.build.*` from `.l
|
|
|
79
79
|
|
|
80
80
|
## Confirmation policy
|
|
81
81
|
|
|
82
|
-
Do NOT ask the caller whether to proceed. Once invoked with a team key, run the cycle to completion — claim
|
|
82
|
+
Do NOT ask the caller whether to proceed. Once invoked with a team key, run the cycle to completion — claim and dispatch the first eligible Issue through `lisa:linear-agent`, transition a successful build to `$DONE`, write the summary, and exit. The caller (a human or a cron) has already authorized the run by invoking the skill.
|
|
83
83
|
|
|
84
84
|
Specifically forbidden:
|
|
85
85
|
|
|
@@ -126,13 +126,13 @@ Capture each Issue's: identifier, title, type label, priority, assignee, project
|
|
|
126
126
|
|
|
127
127
|
If empty, report `"No Linear Issues labeled $READY. Nothing to do."` and exit. Common idle case.
|
|
128
128
|
|
|
129
|
-
### Phase 3 — Process
|
|
129
|
+
### Phase 3 — Process the first eligible ready Issue
|
|
130
130
|
|
|
131
131
|
#### 3a. Leaf-only claim gate (skip / safe-block containers)
|
|
132
132
|
|
|
133
133
|
Build intake claims **only independently implementable leaf work units**. This enforces the claim-time arm of the vendor-neutral `leaf-only-lifecycle` rule: a parent/container that still carries a stale build-ready label (e.g. `status:ready` applied before this rule existed, or hand-applied to a Project-grouped parent Issue) is **never claimed** — intake skips it or safe-blocks it with a clear lifecycle-repair message. It is the claim-time complement to the write-time labeling in `lisa:linear-write-issue` and the validate-time S15 gate in `lisa:linear-validate-issue`; all three cite the same rule so the classification never drifts. **Never silently implement a container.**
|
|
134
134
|
|
|
135
|
-
Run this gate **before** the claim relabel,
|
|
135
|
+
Run this gate **before** the claim relabel, starting with the oldest/highest-priority ready candidate. Do NOT relabel, comment "Claimed", or invoke `lisa:linear-agent` for an Issue that fails the gate.
|
|
136
136
|
|
|
137
137
|
**Resolve container vs. leaf — structural first, then nominal.** Per `leaf-only-lifecycle` the classification is structural: an Issue is a **container** if it has **open** child work, whatever its declared type; otherwise the **type label** decides. Resolve child work using the same hierarchy `lisa:linear-read-issue` uses — Linear's native parentage: an Issue groups **sub-issues** via `parentId`, and a **Project** (the Epic equivalent) groups Issues via `projectId`. Relations (`save_issue_relation` — `blocks` / `is blocked by`) express dependencies and are **not** parentage — do not count them as children.
|
|
138
138
|
|
|
@@ -159,7 +159,7 @@ Classify and act (first match wins). The type comes from the Issue's `type:` lab
|
|
|
159
159
|
|
|
160
160
|
The childless-parent exception is narrow: childlessness enables a claim **only** for types that are leaf work units to begin with. A childless Epic/Story/Spike is an incomplete decomposition, not an implementable unit — it is never claimed.
|
|
161
161
|
|
|
162
|
-
**Safe-block (default action for a flagged container).** Leave the build-ready label in place (don't silently strip it — that hides the lifecycle error), post a single lifecycle-repair comment,
|
|
162
|
+
**Safe-block (default action for a flagged container).** Leave the build-ready label in place (don't silently strip it — that hides the lifecycle error), post a single lifecycle-repair comment, record the Issue under "Skipped (container)" in the summary, and end the cycle. Do NOT relabel to `$CLAIMED`. Keep the comment idempotent — skip posting if an identical `[claude-build-intake]` lifecycle-repair comment already exists on the Issue, so a re-entrant cycle doesn't spam it.
|
|
163
163
|
|
|
164
164
|
Post via `mcp__linear-server__save_comment` with:
|
|
165
165
|
|
|
@@ -209,9 +209,9 @@ If `lisa:linear-agent` returned Success:
|
|
|
209
209
|
|
|
210
210
|
For any non-Success outcome, do NOT transition. The Issue sits where the agent left it — humans take it from there.
|
|
211
211
|
|
|
212
|
-
#### 3e.
|
|
212
|
+
#### 3e. Stop
|
|
213
213
|
|
|
214
|
-
|
|
214
|
+
Stop immediately after the first claimed, skipped, blocked, held, or errored Issue. Later scheduler invocations process the remaining ready Issues.
|
|
215
215
|
|
|
216
216
|
### Phase 4 — Summary report
|
|
217
217
|
|
|
@@ -243,7 +243,7 @@ Total PRs opened: <n>
|
|
|
243
243
|
- **Claim-first ordering**: `$CLAIMED` set BEFORE agent invocation — no double-pickup.
|
|
244
244
|
- **No writes outside the lifecycle**: this skill only adds/removes `$READY`, `$CLAIMED`, `$DONE`, plus terminal-only native state completion required by `leaf-only-lifecycle`. Every other label change (and non-terminal native state change) is owned by the agent or `lisa:linear-evidence`.
|
|
245
245
|
- **Terminal native closure**: after the `$DONE` label is applied, move the Linear Issue to a native completed state only when `$DONE` is the true terminal done value; intermediate env labels stay open / active.
|
|
246
|
-
- **
|
|
246
|
+
- **One item per cycle**: per-Issue exceptions are caught and recorded, then the cycle exits. The scheduler owns retrying or moving on to the next ready item.
|
|
247
247
|
- **Single cycle per team**: do not run two concurrent cycles against the same team — concurrent claims could race.
|
|
248
248
|
- **Single-label invariant**: after every transition, verify exactly one `status:*` label is present. Two simultaneously breaks the build queue.
|
|
249
249
|
- **Never pick an arbitrary env for `$DONE`**. If `done` is a map and env is ambiguous, fail loudly.
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: linear-prd-intake
|
|
3
|
-
description: "Scans a Linear workspace (or a specific team) for projects carrying the configured `ready` PRD label and runs
|
|
3
|
+
description: "Scans a Linear workspace (or a specific team) for projects carrying the configured `ready` PRD label and runs the first eligible one through the dry-run validation pipeline. A project that passes every gate gets tickets written and the label flipped to the configured `ticketed` label; a project that fails gets clarifying-question comments (on a sentinel feedback issue under the project) and the label flipped to the configured `blocked` label. Linear counterpart of `lisa:notion-prd-intake` and `lisa:confluence-prd-intake` — the workflow is identical; only the source-of-truth tools differ. Composes existing skills (linear-to-tracker, tracker-validate, tracker-source-artifacts, product-walkthrough)."
|
|
4
4
|
allowed-tools: ["Skill", "Bash", "mcp__linear-server__list_projects", "mcp__linear-server__get_project", "mcp__linear-server__save_project", "mcp__linear-server__list_project_labels", "mcp__linear-server__list_issues", "mcp__linear-server__get_issue", "mcp__linear-server__save_issue", "mcp__linear-server__list_comments", "mcp__linear-server__save_comment", "mcp__linear-server__list_issue_labels", "mcp__linear-server__create_issue_label", "mcp__linear-server__list_documents", "mcp__linear-server__get_document", "mcp__linear-server__list_teams"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -12,7 +12,7 @@ allowed-tools: ["Skill", "Bash", "mcp__linear-server__list_projects", "mcp__line
|
|
|
12
12
|
- A Linear **team** URL or team key — scans every project on the team whose labels include the configured `ready` label. Example: `https://linear.app/acme/team/ENG/projects` or bare `ENG`.
|
|
13
13
|
- The literal token `linear` — equivalent to "the default Linear workspace"; only valid if `linear.workspace` is configured in `.lisa.config.json`.
|
|
14
14
|
|
|
15
|
-
Run one intake cycle against that scope.
|
|
15
|
+
Run one intake cycle against that scope. The first eligible project with the `ready` label is claimed, validated, routed to either the `blocked` label (with clarifying comments on a sentinel feedback issue) or the `ticketed` label (with destination tickets created), then the cycle exits. Remaining ready projects stay queued for later scheduler invocations.
|
|
16
16
|
|
|
17
17
|
## Workflow resolution
|
|
18
18
|
|
|
@@ -55,7 +55,7 @@ The **PRD closure rollup phase (3f)** transitions a `$TICKETED` PRD project to `
|
|
|
55
55
|
|
|
56
56
|
## Confirmation policy
|
|
57
57
|
|
|
58
|
-
Do NOT ask the caller whether to proceed. Once invoked with a workspace/team scope, run the cycle to completion — claim, validate, branch to `$BLOCKED` or `$TICKETED`, write the summary. The caller (a human or a cron) has already authorized the run by invoking the skill; re-prompting defeats the purpose of a background
|
|
58
|
+
Do NOT ask the caller whether to proceed. Once invoked with a workspace/team scope, run the cycle to completion for the first eligible project — claim, validate, branch to `$BLOCKED` or `$TICKETED`, write the summary, and exit. The caller (a human or a cron) has already authorized the run by invoking the skill; re-prompting defeats the purpose of a background queue.
|
|
59
59
|
|
|
60
60
|
Specifically forbidden:
|
|
61
61
|
|
|
@@ -128,9 +128,9 @@ If the secondary query shows zero projects carrying any PRD lifecycle label →
|
|
|
128
128
|
|
|
129
129
|
If the secondary query shows projects with other PRD lifecycle labels but none with `$READY` → the queue is genuinely empty (all PRDs are already in `in_review`, `blocked`, `ticketed`, or `shipped`). Exit cleanly with `"No Linear projects labelled $READY. Nothing to do."`
|
|
130
130
|
|
|
131
|
-
### Phase 3 — Process
|
|
131
|
+
### Phase 3 — Process the first eligible ready PRD
|
|
132
132
|
|
|
133
|
-
|
|
133
|
+
Select the first ready project returned by Phase 2 and process only that project. Later scheduler invocations process the remaining ready projects.
|
|
134
134
|
|
|
135
135
|
#### 3a. Claim
|
|
136
136
|
|
|
@@ -219,9 +219,9 @@ Use these exact badge labels — they are the validator's category values transl
|
|
|
219
219
|
|
|
220
220
|
After all comments are posted (anchored groups + the optional sentinel-issue summary), transition labels: remove `$IN_REVIEW`, add `$BLOCKED` via `save_project`. Do NOT write any destination tickets.
|
|
221
221
|
|
|
222
|
-
#### 3d.
|
|
222
|
+
#### 3d. Stop
|
|
223
223
|
|
|
224
|
-
|
|
224
|
+
Stop immediately after the claimed PRD is ticketed, blocked, or recorded as an error.
|
|
225
225
|
|
|
226
226
|
#### 3e. Coverage audit (mandatory after $TICKETED)
|
|
227
227
|
|
|
@@ -232,7 +232,7 @@ Per-ticket gates prove each ticket is well-formed; they do NOT prove the *set* o
|
|
|
232
232
|
|
|
233
233
|
| Verdict | Action |
|
|
234
234
|
|---------|--------|
|
|
235
|
-
| `COMPLETE` | Done. Leave label as `$TICKETED`.
|
|
235
|
+
| `COMPLETE` | Done. Leave label as `$TICKETED`. End the cycle. |
|
|
236
236
|
| `COMPLETE_WITH_SCOPE_CREEP` | Post an advisory comment on the sentinel feedback issue naming the scope-creep tickets (so product can decide whether to close them as out-of-scope). Leave label as `$TICKETED`. |
|
|
237
237
|
| `GAPS_FOUND` | The created ticket set is incomplete. (a) For each gap, post a comment using the same product-facing template as Phase 3c.3 — anchored on the relevant sub-issue when `prd_anchor` is non-null, on the sentinel feedback issue otherwise; category badge from the gap's `category` field; `What's unclear` and `Recommendation` from the audit report's `what` and `recommendation` fields. Apply the same forbidden-language rules from Phase 3c.5. (b) Post one summary comment on the sentinel feedback issue listing the tickets that *were* successfully created (so product knows what to keep vs. what to extend). (c) Transition labels from `$TICKETED` back to `$BLOCKED` via `save_project`. |
|
|
238
238
|
| `NO_TICKETS_FOUND` | Should not happen if step 2 succeeded. If it does, log it as an Error in the cycle summary and leave label as `$TICKETED` with a comment flagging the audit failure for human review. |
|
|
@@ -298,7 +298,7 @@ This phase implements exactly one PRD-lifecycle hop — `$TICKETED → $SHIPPED`
|
|
|
298
298
|
|
|
299
299
|
### Phase 4 — Summary report
|
|
300
300
|
|
|
301
|
-
After processing
|
|
301
|
+
After processing the single selected PRD, emit a summary:
|
|
302
302
|
|
|
303
303
|
```text
|
|
304
304
|
## linear-prd-intake summary
|
|
@@ -341,10 +341,10 @@ Idempotency: the helper finds-or-creates. Re-runs of the cycle reuse the same se
|
|
|
341
341
|
|
|
342
342
|
## Idempotency & safety
|
|
343
343
|
|
|
344
|
-
- **
|
|
344
|
+
- **One item per cycle**: this skill processes the first eligible ready project from Phase 2, then exits. New or remaining `$READY` projects are picked up by later scheduler invocations.
|
|
345
345
|
- **No writes outside the lifecycle**: this skill only ever writes to the destination tracker via `lisa:linear-to-tracker` (which delegates to `lisa:tracker-write`), only ever changes Linear project labels among `$IN_REVIEW`, `$BLOCKED`, `$TICKETED`, and `$SHIPPED` (the last via the rollup phase 3f only), only ever creates/comments on the sentinel feedback issue (never any other Linear issue). It never edits project descriptions, never edits Linear documents, never touches the `draft` label, and never deletes projects. It sets the `$SHIPPED` label and may archive the PRD project **only** through the config-gated rollup phase (3f).
|
|
346
346
|
- **Claim-first ordering**: the label flip to `$IN_REVIEW` happens BEFORE validation runs, so a re-entrant call won't double-process.
|
|
347
|
-
- **Failure
|
|
347
|
+
- **Failure handling**: an exception processing the selected project is caught and recorded under "Errors" in the summary, then the cycle exits. The project that errored is left labelled `$IN_REVIEW` — the human investigates from there.
|
|
348
348
|
- **Single-label invariant**: after every transition, verify exactly one lifecycle label is present on the project. If two are present (rare race), surface as an Error and skip — do NOT auto-resolve, the human decides.
|
|
349
349
|
- **Rollup idempotency**: rollup (Phase 3f) is a no-op on a PRD project already carrying `$SHIPPED` (and already archived when `closeOnShipped` is `true`) — no duplicate transition, no duplicate archive, no duplicate comment. The all-terminal condition is a pure function of the children's current states (deduped by child-ref identity), so recomputing it is safe to re-run. Archival NEVER precedes the all-terminal condition.
|
|
350
350
|
|
|
@@ -388,4 +388,4 @@ Before this skill can run against a Linear workspace or team, the team must adop
|
|
|
388
388
|
3. (Optional but recommended) Add the `draft` and `shipped` labels (defaults: `prd-draft`, `prd-shipped`) for in-progress PRDs and delivered work respectively, so the full lifecycle is visible at a glance.
|
|
389
389
|
4. The labels must exist as **project labels** in Linear (`list_project_labels` should return them). Issue-level labels with the same names won't work; Linear keeps the two label kinds separate.
|
|
390
390
|
|
|
391
|
-
If the workspace hasn't adopted these labels, the first run exits with a label-convention error (not the idle empty-set message) — this distinguishes a setup issue from a genuinely empty queue so operators know to apply the convention rather than assuming
|
|
391
|
+
If the workspace hasn't adopted these labels, the first run exits with a label-convention error (not the idle empty-set message) — this distinguishes a setup issue from a genuinely empty queue so operators know to apply the convention rather than assuming there is no work. See Phase 2 for how the skill detects this case.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
display_name: "Linear PRD Intake"
|
|
2
|
-
short_description: "Scans a Linear workspace (or a specific team) for projects carrying the configured `ready` PRD label and runs
|
|
2
|
+
short_description: "Scans a Linear workspace (or a specific team) for projects carrying the configured `ready` PRD label and runs the first eligible one…"
|
|
3
3
|
default_prompt:
|
|
4
|
-
- "Use $linear-prd-intake: Scans a Linear workspace (or a specific team) for projects carrying the configured `ready` PRD label and runs
|
|
4
|
+
- "Use $linear-prd-intake: Scans a Linear workspace (or a specific team) for projects carrying the configured `ready` PRD label and runs the first eligible one…."
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: notion-prd-intake
|
|
3
|
-
description: "Scans a Notion PRD database for pages in the configured `ready` status and runs
|
|
3
|
+
description: "Scans a Notion PRD database for pages in the configured `ready` status and runs the first eligible one through the dry-run validation pipeline. A PRD that passes every gate gets tickets written and the status flipped to the configured `ticketed` value; a PRD that fails gets clarifying-question comments and the status flipped to the configured `blocked` value. The skill is the runtime for the ready → in_review → blocked|ticketed lifecycle. Composes existing skills (notion-to-tracker, tracker-validate, tracker-source-artifacts, product-walkthrough); does not reimplement their logic."
|
|
4
4
|
allowed-tools: ["Skill", "Bash", "Read", "Write", "Edit", "AskUserQuestion"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -14,7 +14,7 @@ allowed-tools: ["Skill", "Bash", "Read", "Write", "Edit", "AskUserQuestion"]
|
|
|
14
14
|
https://www.notion.so/geminisports/28fd00244d7d47c5866876f7de48c0fe?v=34eba63a2800815891a3000c643f0ea8
|
|
15
15
|
```
|
|
16
16
|
|
|
17
|
-
Run one intake cycle against that database.
|
|
17
|
+
Run one intake cycle against that database. The first eligible PRD in the configured `ready` status is claimed, validated, routed to either `blocked` (with clarifying comments) or `ticketed` (with destination tickets created), then the cycle exits. Remaining ready PRDs stay queued for later scheduler invocations.
|
|
18
18
|
|
|
19
19
|
## Workflow resolution
|
|
20
20
|
|
|
@@ -56,7 +56,7 @@ This skill shares its PRD closure rollup phase (3f) with `lisa:github-prd-intake
|
|
|
56
56
|
|
|
57
57
|
## Confirmation policy
|
|
58
58
|
|
|
59
|
-
Do NOT ask the caller whether to proceed. Once invoked with a database URL, run the cycle to completion — claim, validate, branch to `blocked` or `ticketed`, write the summary. The caller (a human or a cron) has already authorized the run by invoking the skill; re-prompting defeats the purpose of a background
|
|
59
|
+
Do NOT ask the caller whether to proceed. Once invoked with a database URL, run the cycle to completion for the first eligible PRD — claim, validate, branch to `blocked` or `ticketed`, write the summary, and exit. The caller (a human or a cron) has already authorized the run by invoking the skill; re-prompting defeats the purpose of a background queue.
|
|
60
60
|
|
|
61
61
|
Specifically forbidden:
|
|
62
62
|
|
|
@@ -110,9 +110,9 @@ For a `select`-type property substitute `"select"` for `"status"`. The response
|
|
|
110
110
|
|
|
111
111
|
If the result set is empty, stop and report `"No PRDs with $STATUS_PROP=$READY. Nothing to do."` Exit cleanly — this is the common idle case for a scheduled run.
|
|
112
112
|
|
|
113
|
-
### Phase 3 — Process
|
|
113
|
+
### Phase 3 — Process the first eligible ready PRD
|
|
114
114
|
|
|
115
|
-
|
|
115
|
+
Select the first ready PRD page returned by Phase 2 and process only that page. Later scheduler invocations process the remaining ready PRDs.
|
|
116
116
|
|
|
117
117
|
#### 3a. Claim
|
|
118
118
|
|
|
@@ -155,7 +155,7 @@ Per-ticket gates prove each ticket is well-formed; they do NOT prove the *set* o
|
|
|
155
155
|
|
|
156
156
|
| Verdict | Action |
|
|
157
157
|
|---------|--------|
|
|
158
|
-
| `COMPLETE` | Done. Leave `$STATUS_PROP = $TICKETED`.
|
|
158
|
+
| `COMPLETE` | Done. Leave `$STATUS_PROP = $TICKETED`. End the cycle. |
|
|
159
159
|
| `COMPLETE_WITH_SCOPE_CREEP` | Post an advisory Notion comment naming the scope-creep tickets (so product can decide whether to close them as out-of-scope). Leave `$STATUS_PROP = $TICKETED`. |
|
|
160
160
|
| `GAPS_FOUND` | The created ticket set is incomplete. (a) For each gap, post a Notion comment using the same product-facing template as Phase 3c.3 — block-anchored when `prd_anchor` is non-null, page-level otherwise; category badge from the gap's `category` field; `What's unclear` and `Recommendation` from the audit report's `what` and `recommendation` fields. Apply the same forbidden-language rules from Phase 3c.5. (b) Post one summary comment listing the tickets that *were* successfully created (so product knows what to keep vs. what to extend). (c) Transition `$STATUS_PROP` from `$TICKETED` back to `$BLOCKED` by invoking `lisa:notion-access` operation `write-page` with the blocked-status payload. |
|
|
161
161
|
| `NO_TICKETS_FOUND` | Should not happen if step 2 succeeded. If it does, log it as an Error in the cycle summary and leave `$STATUS_PROP = $TICKETED` with a comment flagging the audit failure for human review. |
|
|
@@ -239,9 +239,9 @@ rich_text: <Notion rich_text array — the comment body>
|
|
|
239
239
|
|
|
240
240
|
The access skill resolves a `prd_anchor` substring to the matching block ID by paging through the PRD's children and posts the comment with `discussion_id` or `parent: { block_id }` as appropriate. If `block_anchor` is `null`, the access skill posts a page-level comment via `parent: { page_id }`.
|
|
241
241
|
|
|
242
|
-
#### 3d.
|
|
242
|
+
#### 3d. Stop
|
|
243
243
|
|
|
244
|
-
|
|
244
|
+
Stop immediately after the claimed PRD is ticketed, blocked, or recorded as an error.
|
|
245
245
|
|
|
246
246
|
#### 3f. PRD closure rollup (config-gated)
|
|
247
247
|
|
|
@@ -300,7 +300,7 @@ This phase implements exactly one PRD-lifecycle hop — `$TICKETED → $SHIPPED`
|
|
|
300
300
|
|
|
301
301
|
### Phase 4 — Summary report
|
|
302
302
|
|
|
303
|
-
After processing
|
|
303
|
+
After processing the single selected PRD, emit a summary:
|
|
304
304
|
|
|
305
305
|
```text
|
|
306
306
|
## notion-prd-intake summary
|
|
@@ -325,10 +325,10 @@ Print to the agent's output. Do not write this summary to Notion or the destinat
|
|
|
325
325
|
|
|
326
326
|
## Idempotency & safety
|
|
327
327
|
|
|
328
|
-
- **
|
|
328
|
+
- **One item per cycle**: this skill processes the first eligible ready PRD from Phase 2, then exits. New or remaining ready PRDs are picked up by later scheduler invocations.
|
|
329
329
|
- **No writes outside the lifecycle**: this skill only ever writes to the destination tracker via `lisa:notion-to-tracker` (which delegates to `lisa:tracker-write`), and only ever changes the Notion status property to `$IN_REVIEW`, `$BLOCKED`, `$TICKETED`, or `$SHIPPED` (the last via the rollup phase 3f only). It never edits PRD content, never touches `$DRAFT`, never deletes pages. It sets `$SHIPPED` and may archive the PRD page **only** through the config-gated rollup phase (3f).
|
|
330
330
|
- **Claim-first ordering**: the status flip to `$IN_REVIEW` is set BEFORE validation runs, so a re-entrant call won't double-process.
|
|
331
|
-
- **Failure
|
|
331
|
+
- **Failure handling**: an exception processing the selected PRD is caught and recorded under "Errors" in the summary, then the cycle exits. The PRD that errored is left in `$IN_REVIEW` — the human investigates from there.
|
|
332
332
|
- **Rollup idempotency**: rollup (Phase 3f) is a no-op on a PRD already in `$STATUS_PROP = $SHIPPED` (and already archived when `closeOnShipped` is `true`) — no duplicate transition, no duplicate archive, no duplicate comment. The all-terminal condition is a pure function of the children's current states (deduped by child-ref identity), so recomputing it is safe to re-run. Archival NEVER precedes the all-terminal condition.
|
|
333
333
|
|
|
334
334
|
## Configuration
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
display_name: "Notion PRD Intake"
|
|
2
|
-
short_description: "Scans a Notion PRD database for pages in the configured `ready` status and runs
|
|
2
|
+
short_description: "Scans a Notion PRD database for pages in the configured `ready` status and runs the first eligible one through the dry-run validation…"
|
|
3
3
|
default_prompt:
|
|
4
|
-
- "Use $notion-prd-intake: Scans a Notion PRD database for pages in the configured `ready` status and runs
|
|
4
|
+
- "Use $notion-prd-intake: Scans a Notion PRD database for pages in the configured `ready` status and runs the first eligible one through the dry-run validation…."
|
|
@@ -110,7 +110,6 @@ Defaults from `config-resolution`. The `done` role is **env-keyed** — create a
|
|
|
110
110
|
```bash
|
|
111
111
|
ensure_label "$(read_role build ready status:ready)" FBCA04 "Ready for build (human signal)"
|
|
112
112
|
ensure_label "$(read_role build claimed status:in-progress)" 0E8A16 "Build in progress (agent owns)"
|
|
113
|
-
ensure_label "$(read_role build review status:code-review)" 5319E7 "PR open, awaiting review"
|
|
114
113
|
ensure_label "$(read_role build blocked status:blocked)" D93F0B "Blocked — human attention required"
|
|
115
114
|
ensure_label "$(read_role build done.dev status:on-dev)" 1D76DB "Deployed to dev"
|
|
116
115
|
ensure_label "$(read_role build done.staging status:on-stg)" 1D76DB "Deployed to staging"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tracker-build-intake
|
|
3
|
-
description: "Vendor-neutral wrapper for the build-queue
|
|
3
|
+
description: "Vendor-neutral wrapper for the build-queue scanner. Reads `tracker` from .lisa.config.json (default: jira) and dispatches to lisa:jira-build-intake (JQL/project-key queue), lisa:github-build-intake (GitHub repo queue keyed off the `status:ready` label), or lisa:linear-build-intake (Linear team queue keyed off the `status:ready` label). Every vendor scanner processes at most one eligible item per cycle and enforces the claim-time arm of the `leaf-only-lifecycle` rule — dispatch leaf work units only; move or safe-block a container with open child work (or a childless Epic/Story/Spike) that carries a stale build-ready role according to the vendor's lifecycle semantics. Counterpart to lisa:intake's PRD-side dispatchers."
|
|
4
4
|
allowed-tools: ["Skill", "Bash", "Read"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -53,7 +53,7 @@ Intermediate env states are not native closure. A vendor scanner that resolves `
|
|
|
53
53
|
|
|
54
54
|
## Rules
|
|
55
55
|
|
|
56
|
-
- Single cycle per invocation — the vendor skill processes
|
|
56
|
+
- Single cycle per invocation — the vendor skill processes at most one eligible `Ready` item and exits. Scheduler repetition works the rest of the queue.
|
|
57
57
|
- The vendor skills run their own pre-flight checks (JIRA workflow transitions for the JIRA path; label namespace adoption for the GitHub and Linear paths) before processing items. Never bypass.
|
|
58
58
|
- **Leaf-only dispatch, every vendor.** Per the `leaf-only-lifecycle` rule, each vendor scanner dispatches leaf work units only and moves or safe-blocks a container (open child work, or a childless Epic/Story/Spike) carrying a stale build-ready role according to its lifecycle semantics. This shim does not re-implement the gate — it relies on the vendor scanner's Phase 3a — but the contract is uniform across `jira`, `github`, and `linear` so behavior never drifts by tracker.
|
|
59
59
|
- **Terminal native closure, every capable vendor.** Per the same rule, each vendor scanner finalizes native open/closed state only at the true terminal `done` value. This shim never performs native closure itself, but callers can rely on the dispatched vendor scanner to apply the contract.
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
display_name: "Tracker Build Intake"
|
|
2
|
-
short_description: "Vendor-neutral wrapper for the build-queue
|
|
2
|
+
short_description: "Vendor-neutral wrapper for the build-queue scanner"
|
|
3
3
|
default_prompt:
|
|
4
|
-
- "Use $tracker-build-intake: Vendor-neutral wrapper for the build-queue
|
|
4
|
+
- "Use $tracker-build-intake: Vendor-neutral wrapper for the build-queue scanner."
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
---
|
|
2
2
|
name: tracker-evidence
|
|
3
|
-
description: "Vendor-neutral wrapper for posting verification evidence. Reads `tracker` from .lisa.config.json (default: jira) and dispatches to lisa:jira-evidence, lisa:github-evidence, or lisa:linear-evidence. Uploads evidence to the GitHub `pr-assets` release, updates the PR description, posts a comment on the originating ticket/issue, and
|
|
3
|
+
description: "Vendor-neutral wrapper for posting verification evidence. Reads `tracker` from .lisa.config.json (default: jira) and dispatches to lisa:jira-evidence, lisa:github-evidence, or lisa:linear-evidence. Uploads evidence to the GitHub `pr-assets` release, updates the PR description, posts a comment on the originating ticket/issue, and leaves workflow transitions to the tracker-specific lifecycle owner."
|
|
4
4
|
allowed-tools: ["Skill", "Bash", "Read"]
|
|
5
5
|
---
|
|
6
6
|
|
|
@@ -45,6 +45,6 @@ The checklist is tracker-agnostic — the same shape works on JIRA, GitHub Issue
|
|
|
45
45
|
- **Feature/UX completion:** state plainly which acceptance criteria each screenshot covers, and call out any deferred or out-of-scope surface explicitly so QA/PM doesn't have to infer.
|
|
46
46
|
6. **"What would help me confirm" (bug) / "How to QA" (feature) section.** Concrete actionable retest steps with the exact selection criteria (e.g., "pick a record whose Status column shows `—`, not `Processing` or `Pending Review`").
|
|
47
47
|
7. **Explicit invitation to be corrected.** End with a line like *"If any of the steps I listed are different from what you expected / actually did, please tell me explicitly which step I got wrong."* Non-optional — small differences (which record, which device, exact tap order, expected behavior) change everything, and naming the door open short-circuits ticket bounce-loops.
|
|
48
|
-
8. **Workflow transition** is the vendor skill's job, not yours — it'll move the ticket per the configured tracker (JIRA: Reassign to reporter for bug repro / move to Awaiting QA for feature; GitHub:
|
|
48
|
+
8. **Workflow transition** is the vendor skill's job, not yours — it'll move the ticket per the configured tracker (JIRA: Reassign to reporter for bug repro / move to Awaiting QA for feature; GitHub: direct `claimed` → configured `done` after a successful build; Linear: equivalent state). You don't transition manually.
|
|
49
49
|
|
|
50
50
|
**Why this format:** It (a) gives the reporter a frame-by-frame they can compare against, (b) avoids the JIRA image-collapse failure mode while still working everywhere else, (c) names the most plausible discrepancies up front so the loop short-circuits, (d) explicitly opens the door to being corrected so tickets don't bounce on assumed alignment. The same mechanics that resolve a stuck bug ticket also give QA an unambiguous handoff for a freshly-built feature.
|