@codyswann/lisa 2.176.9 → 2.176.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- 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 +11 -9
- package/plugins/lisa/agents/jira-agent.md +8 -7
- package/plugins/lisa/agents/linear-agent.md +7 -6
- package/plugins/lisa/rules/eager/pre-flight-autofill.md +65 -0
- package/plugins/lisa/rules/reference/base-rules.md +1 -1
- package/plugins/lisa/rules/reference/config-resolution.md +2 -2
- package/plugins/lisa/rules/reference/pre-flight-autofill.md +142 -0
- package/plugins/lisa-agy/agents/github-agent.md +11 -9
- package/plugins/lisa-agy/agents/jira-agent.md +8 -7
- package/plugins/lisa-agy/agents/linear-agent.md +7 -6
- package/plugins/lisa-agy/plugin.json +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-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/agents/github-agent.agent.md +11 -9
- package/plugins/lisa-copilot/agents/jira-agent.agent.md +8 -7
- package/plugins/lisa-copilot/agents/linear-agent.agent.md +7 -6
- package/plugins/lisa-copilot/rules/eager/pre-flight-autofill.md +65 -0
- package/plugins/lisa-copilot/rules/reference/base-rules.md +1 -1
- package/plugins/lisa-copilot/rules/reference/config-resolution.md +2 -2
- package/plugins/lisa-copilot/rules/reference/pre-flight-autofill.md +142 -0
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/agents/github-agent.md +11 -9
- package/plugins/lisa-cursor/agents/jira-agent.md +8 -7
- package/plugins/lisa-cursor/agents/linear-agent.md +7 -6
- package/plugins/lisa-cursor/rules/base-rules-reference.mdc +1 -1
- package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +2 -2
- package/plugins/lisa-cursor/rules/pre-flight-autofill-reference.mdc +147 -0
- package/plugins/lisa-cursor/rules/pre-flight-autofill.mdc +70 -0
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-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-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-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-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-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-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-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-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-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-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-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/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/agents/github-agent.md +11 -9
- package/plugins/src/base/agents/jira-agent.md +8 -7
- package/plugins/src/base/agents/linear-agent.md +7 -6
- package/plugins/src/base/rules/eager/pre-flight-autofill.md +65 -0
- package/plugins/src/base/rules/reference/base-rules.md +1 -1
- package/plugins/src/base/rules/reference/config-resolution.md +2 -2
- package/plugins/src/base/rules/reference/pre-flight-autofill.md +142 -0
|
@@ -51,22 +51,24 @@ Use the `github-verify` skill to check the issue against organizational standard
|
|
|
51
51
|
|
|
52
52
|
Resolve build labels from `.lisa.config.json` `github.labels.build.*` (defaults: `status:ready` / `status:in-progress` / env-keyed `status:on-*`); resolve the `blocked` label from the same section (`github.labels.build.blocked`, default `status:blocked`) and the `human_needed` marker label from the same section (`github.labels.build.human_needed`, default `human-needed`).
|
|
53
53
|
|
|
54
|
-
If `github-verify` returns `FAIL` on any of the above, do NOT continue:
|
|
54
|
+
If `github-verify` returns `FAIL` on any of the above, do NOT continue to build. **Draft the missing spec content first, then block for confirmation** — never bounce a raw "go write all this" checklist back to the author:
|
|
55
55
|
|
|
56
|
-
1.
|
|
56
|
+
1. **Best-effort autofill (before blocking).** Run the **draft-then-block procedure** in the `pre-flight-autofill` rule: draft every *authorable* missing section — Technical Approach, Out of Scope, Gherkin acceptance criteria, expected-vs-actual, Repository, Relationship Search (run the git + `gh`/tracker search, don't fabricate it), a Validation Journey **draft** via `github-add-journey`, and a recommended Target Backend Environment — from the issue's own content (title, body, screenshots, design links, repro steps) plus the codebase. Write it into the body via `github-write-issue` as clearly-labeled assumptions/recommendations (never overwrite the author's prose), then re-run `github-verify`. Whatever the agent could author is now structured spec; only genuinely human-only inputs remain.
|
|
57
|
+
2. Relabel: remove the `claimed` label, add the `blocked` label **and** the `human_needed` marker label. Even after the agent drafted what it could, a pre-flight gate failure bounces the issue back to its author because it still needs a human to **confirm the drafted assumptions** or supply something no agent can invent — real missing credentials, access, or an irreducible product/scoping decision — so the marker tells a human scanning the board which blocked issues are waiting on them. The marker is additive to `blocked`, not a replacement. (See the `config-resolution` rule's "Build markers" for when the marker applies and when it must NOT.)
|
|
57
58
|
```bash
|
|
58
|
-
|
|
59
|
-
|
|
60
|
-
|
|
59
|
+
_read_cfg() { local lv gv; lv=$(jq -r "$1 // empty" .lisa.config.local.json 2>/dev/null); gv=$(jq -r "$1 // empty" .lisa.config.json 2>/dev/null); echo "${lv:-${gv}}"; }
|
|
60
|
+
CLAIMED=$(_read_cfg '.github.labels.build.claimed'); CLAIMED="${CLAIMED:-status:in-progress}"
|
|
61
|
+
BLOCKED=$(_read_cfg '.github.labels.build.blocked'); BLOCKED="${BLOCKED:-status:blocked}"
|
|
62
|
+
HUMAN_NEEDED=$(_read_cfg '.github.labels.build.human_needed'); HUMAN_NEEDED="${HUMAN_NEEDED:-human-needed}"
|
|
61
63
|
gh label create "$HUMAN_NEEDED" --color D93F0B --description "Blocked on human-only input (credentials / access / decision)" --repo <org>/<repo> 2>/dev/null || true
|
|
62
64
|
gh issue edit <num> --repo <org>/<repo> --remove-label "$CLAIMED" --add-label "$BLOCKED" --add-label "$HUMAN_NEEDED"
|
|
63
65
|
```
|
|
64
|
-
|
|
65
|
-
|
|
66
|
+
3. Reassign the issue back to its **author** (the original reporter — `author.login` from `gh issue view --json author`). Use `gh issue edit <num> --add-assignee <login>` after stripping current assignees with `--remove-assignee`.
|
|
67
|
+
4. Post the **confirmation comment** from the `pre-flight-autofill` rule, **not** a bare remediation checklist: disclose it is a Claude draft, give one line per drafted section naming the key assumption made, list any remaining human-only item as a specific question with a recommended default, and close with *"review the drafted sections, correct anything wrong, then flip back to Ready and it builds — or reply with corrections."* Prefix with `[<repo>]`:
|
|
66
68
|
```bash
|
|
67
69
|
gh issue comment <num> --repo <org>/<repo> --body-file /tmp/blocked-comment.md
|
|
68
70
|
```
|
|
69
|
-
|
|
71
|
+
5. Stop. Do not run triage, do not delegate to a flow, do not start work.
|
|
70
72
|
|
|
71
73
|
**Exception — single-repo scope is split, not blocked.** A single-repo-scope FAIL is the one gate failure the agent fixes rather than bounces to the author: a cross-repo work unit is a decomposition error the agent owns (S10 is `product_relevant: false`), not a product question. Instead of blocking, run the **work-time split procedure** in the `repo-scope-split` rule — narrow this issue to one repo, create a sibling issue per additional repo cloning its metadata, encode the producer→consumer dependency (`Blocked by #<n>` / `Blocks #<n>`), comment on the original, then re-run `github-verify` on the original and every new sibling. Block (per the path above) only if the split is ambiguous (see "When to block instead of split"). If single-repo scope was the only FAIL and the split succeeded, proceed to Step 3 once every resulting issue passes.
|
|
72
74
|
|
|
@@ -143,7 +145,7 @@ Note: `done` may be a string or an env-keyed map (`{ dev, staging, production }`
|
|
|
143
145
|
|
|
144
146
|
## Rules
|
|
145
147
|
|
|
146
|
-
- Never auto-relabel build labels, with one explicit exception: when `github-verify` returns FAIL for the pre-flight gate (Step 2), relabel to the configured `blocked` label, add the configured `human_needed` marker label (`github.labels.build.human_needed`, default `human-needed`), and reassign to the original author. The build-intake owner transitions a successful issue from `claimed` directly to the configured `done` label after PR evidence is posted.
|
|
148
|
+
- Never auto-relabel build labels, with one explicit exception: when `github-verify` returns FAIL for the pre-flight gate (Step 2), first run the `pre-flight-autofill` draft-then-block procedure (draft the authorable missing sections into the issue body as labeled assumptions), then relabel to the configured `blocked` label, add the configured `human_needed` marker label (`github.labels.build.human_needed`, default `human-needed`), and reassign to the original author with a confirmation comment. The build-intake owner transitions a successful issue from `claimed` directly to the configured `done` label after PR evidence is posted.
|
|
147
149
|
- Always read the full issue graph via `github-read-issue` before determining intent — don't rely on the `type:` label alone.
|
|
148
150
|
- Never create or materially edit an issue by calling `gh issue create` / `gh issue edit` directly — always delegate to `github-write-issue` (or, from a vendor-neutral caller, `tracker-write`) so relationships, Gherkin criteria, and metadata gates are enforced.
|
|
149
151
|
- If sign-in credentials are in the issue body, extract and pass them to the flow. If the issue touches an authenticated surface and credentials are missing, that is a Step 2 failure — block and reassign rather than guessing.
|
|
@@ -47,12 +47,13 @@ Use the `jira-verify` skill to check the ticket against organizational standards
|
|
|
47
47
|
|
|
48
48
|
**Gating behavior — this is the one place auto-transitioning is allowed:**
|
|
49
49
|
|
|
50
|
-
If `jira-verify` returns `FAIL` on any of the above, do NOT continue:
|
|
51
|
-
1.
|
|
52
|
-
2.
|
|
53
|
-
3.
|
|
54
|
-
4.
|
|
55
|
-
5.
|
|
50
|
+
If `jira-verify` returns `FAIL` on any of the above, do NOT continue to build. **Draft the missing spec content first, then block for confirmation** — never bounce a raw "go write all this" checklist back to the reporter:
|
|
51
|
+
1. **Best-effort autofill (before blocking).** Run the **draft-then-block procedure** in the `pre-flight-autofill` rule: draft every *authorable* missing section — Technical Approach, Out of Scope, Gherkin acceptance criteria, expected-vs-actual, Repository, Relationship Search (run the git + JQL search, don't fabricate it), a Validation Journey **draft** via `jira-add-journey`, and a recommended Target Backend Environment — from the ticket's own content (title, description, screenshots, design links, repro steps) plus the codebase. Write it into the description via `jira-write-ticket` as clearly-labeled assumptions/recommendations (never overwrite the reporter's prose), then re-run `jira-verify`. Whatever the agent could author is now structured spec; only genuinely human-only inputs remain.
|
|
52
|
+
2. Transition the ticket status to the configured `blocked` status (typically `Blocked` — read from `.lisa.config.json` `jira.workflow.blocked` if present, otherwise the project's standard blocked status). Use `mcp__atlassian__transitionJiraIssue` or equivalent.
|
|
53
|
+
3. **Add the `human_needed` marker label.** Even after the agent drafted what it could, a pre-flight gate failure bounces the ticket back to its reporter because the ticket still needs a human to **confirm the drafted assumptions** or supply something no agent can invent — real missing credentials, access, or an irreducible product/scoping decision. Add the configured label (`jira.labels.human_needed`, default `Human Needed`) to the ticket's `labels` field via `mcp__atlassian__editJiraIssue` — a lightweight metadata update permitted under this same gate exception. This is additive to (not a replacement for) the `blocked` status, so a human scanning the board sees at a glance which blocked tickets are waiting on them. If the label does not exist in the project, record that and proceed — the marker is best-effort. (See the `config-resolution` rule's "Build markers" for when the marker applies and when it must NOT.)
|
|
54
|
+
4. Reassign the ticket to the **Reporter** (the human who filed it — not the Creator field, which may be a bot/integration).
|
|
55
|
+
5. Post a comment using `mcp__atlassian__addCommentToJiraIssue` — the **confirmation comment** from the `pre-flight-autofill` rule, **not** a bare remediation checklist: disclose it is a Claude draft, give one line per drafted section naming the key assumption made, list any remaining human-only item as a specific question with a recommended default, and close with *"review the drafted sections, correct anything wrong, then flip back to Ready and it builds — or reply with corrections."* Prefix with `[{repo}]`.
|
|
56
|
+
6. Stop. Do not run triage, do not delegate to a flow, do not start work.
|
|
56
57
|
|
|
57
58
|
**Exception — single-repo scope is split, not blocked.** A single-repo-scope FAIL is the one gate failure the agent fixes rather than bounces to the reporter: a cross-repo work unit is a decomposition error the agent owns (S10 is `product_relevant: false`), not a product question. Instead of blocking, run the **work-time split procedure** in the `repo-scope-split` rule — narrow this ticket to one repo, create a sibling per additional repo cloning its metadata, link the producer→consumer dependency (`Blocks` / `is blocked by`), comment on the original, then re-run `jira-verify` on the original and every new sibling. Block (per the path above) only if the split is ambiguous (see "When to block instead of split"). If single-repo scope was the only FAIL and the split succeeded, proceed to Step 3 once every resulting ticket passes.
|
|
58
59
|
|
|
@@ -123,7 +124,7 @@ Note: `done` may be a string or an env-keyed map (`{ dev, staging, production }`
|
|
|
123
124
|
|
|
124
125
|
## Rules
|
|
125
126
|
|
|
126
|
-
- Never auto-transition ticket status, with one explicit exception: when `jira-verify` returns `FAIL` for the pre-flight gate (Step 2), transition to the configured `blocked` status, add the configured `human_needed` marker label (`jira.labels.human_needed`, default `Human Needed`), and reassign to the Reporter. Every other status change remains a suggestion the human confirms.
|
|
127
|
+
- Never auto-transition ticket status, with one explicit exception: when `jira-verify` returns `FAIL` for the pre-flight gate (Step 2), first run the `pre-flight-autofill` draft-then-block procedure (draft the authorable missing sections into the ticket as labeled assumptions), then transition to the configured `blocked` status, add the configured `human_needed` marker label (`jira.labels.human_needed`, default `Human Needed`), and reassign to the Reporter with a confirmation comment. Every other status change remains a suggestion the human confirms.
|
|
127
128
|
- Any transition is config-bound: never invent transitions; a transition may target only a status named in `config.jira.workflow`. Don't guess from the live workflow. The evidence-time review hop (Step 7) follows this rule too — it is config-bound, optional, and skipped when `jira.workflow.review` is absent (the ticket stays in `claimed`).
|
|
128
129
|
- Always read the full ticket graph via `jira-read-ticket` before determining intent — don't rely on ticket type alone
|
|
129
130
|
- Never create or materially edit a ticket by calling MCP write tools directly — always delegate to `jira-write-ticket` so relationships, Gherkin criteria, and metadata gates are enforced
|
|
@@ -49,11 +49,12 @@ Use the `linear-verify` skill to check the item against organizational standards
|
|
|
49
49
|
|
|
50
50
|
Resolve build labels from `.lisa.config.json` `linear.labels.build.*` (defaults: `status:ready` / `status:in-progress` / `status:code-review`); resolve the `blocked` label from the same section (`linear.labels.build.blocked`, default `status:blocked`) and the `human_needed` marker label from the same section (`linear.labels.build.human_needed`, default `human-needed`).
|
|
51
51
|
|
|
52
|
-
If `linear-verify` returns `FAIL` on any of the above, do NOT continue:
|
|
53
|
-
1.
|
|
54
|
-
2.
|
|
55
|
-
3.
|
|
56
|
-
4.
|
|
52
|
+
If `linear-verify` returns `FAIL` on any of the above, do NOT continue to build. **Draft the missing spec content first, then block for confirmation** — never bounce a raw "go write all this" checklist back to the creator:
|
|
53
|
+
1. **Best-effort autofill (before blocking).** Run the **draft-then-block procedure** in the `pre-flight-autofill` rule: draft every *authorable* missing section — Technical Approach, Out of Scope, Gherkin acceptance criteria, expected-vs-actual, Repository, Relationship Search (run the git + Linear search, don't fabricate it), a Validation Journey **draft** via `linear-add-journey`, and a recommended Target Backend Environment — from the item's own content (title, description, screenshots, design links, repro steps) plus the codebase. Write it into the description via `linear-write-issue` as clearly-labeled assumptions/recommendations (never overwrite the creator's prose), then re-run `linear-verify`. Whatever the agent could author is now structured spec; only genuinely human-only inputs remain.
|
|
54
|
+
2. Update labels via `mcp__linear-server__save_issue`: remove the current build label, add the configured `blocked` label **and** the configured `human_needed` marker label. (Create either label via `create_issue_label` if needed.) Even after the agent drafted what it could, a pre-flight gate failure bounces the item back to its creator because it still needs a human to **confirm the drafted assumptions** or supply something no agent can invent — real missing credentials, access, or an irreducible product/scoping decision — so the marker tells a human scanning the board which blocked items are waiting on them. The marker is additive to `blocked`, not a replacement. (See the `config-resolution` rule's "Build markers" for when the marker applies and when it must NOT.)
|
|
55
|
+
3. Reassign the item to the **Issue creator** (the human who filed it — Linear's `creator` field).
|
|
56
|
+
4. Post the **confirmation comment** from the `pre-flight-autofill` rule via `mcp__linear-server__save_comment`, **not** a bare remediation checklist: disclose it is a Claude draft, give one line per drafted section naming the key assumption made, list any remaining human-only item as a specific question with a recommended default, and close with *"review the drafted sections, correct anything wrong, then flip back to Ready and it builds — or reply with corrections."* Prefix with `[{repo}]`.
|
|
57
|
+
5. Stop. Do not run triage, do not delegate to a flow, do not start work.
|
|
57
58
|
|
|
58
59
|
**Exception — single-repo scope is split, not blocked.** A single-repo-scope FAIL is the one gate failure the agent fixes rather than bounces to the creator: a cross-repo work unit is a decomposition error the agent owns (S10 is `product_relevant: false`), not a product question. Instead of blocking, run the **work-time split procedure** in the `repo-scope-split` rule — narrow this item to one repo, create a sibling Issue per additional repo cloning its metadata (same `projectId`), add the producer→consumer blocking relation, comment on the original, then re-run `linear-verify` on the original and every new sibling. Block (per the path above) only if the split is ambiguous (see "When to block instead of split"). If single-repo scope was the only FAIL and the split succeeded, proceed to Step 3 once every resulting item passes.
|
|
59
60
|
|
|
@@ -127,7 +128,7 @@ The label transitions ARE the canonical signal. The native `state` field stays a
|
|
|
127
128
|
|
|
128
129
|
## Rules
|
|
129
130
|
|
|
130
|
-
- Never auto-transition the native Linear `state`, with one explicit exception: when `linear-verify` returns `FAIL` for the pre-flight gate (Step 2), update labels to the configured `blocked` label, add the configured `human_needed` marker label (`linear.labels.build.human_needed`, default `human-needed`), and reassign to the creator. Every other status change remains a label-driven suggestion.
|
|
131
|
+
- Never auto-transition the native Linear `state`, with one explicit exception: when `linear-verify` returns `FAIL` for the pre-flight gate (Step 2), first run the `pre-flight-autofill` draft-then-block procedure (draft the authorable missing sections into the description as labeled assumptions), then update labels to the configured `blocked` label, add the configured `human_needed` marker label (`linear.labels.build.human_needed`, default `human-needed`), and reassign to the creator with a confirmation comment. Every other status change remains a label-driven suggestion.
|
|
131
132
|
- Always read the full item graph via `linear-read-issue` before determining intent — don't rely on type labels alone.
|
|
132
133
|
- Never create or materially edit an item by calling MCP write tools directly — always delegate to `linear-write-issue` so relationships, Gherkin criteria, and metadata gates are enforced. Two explicit exceptions are permitted: (1) the Step 2 pre-flight failure path (when `linear-verify` returns `FAIL`) may call `mcp__linear-server__save_issue` and `mcp__linear-server__save_comment` directly to set `status:blocked`, add the configured `human_needed` marker label, and reassign to the creator — this narrow exception is already granted by the rule above; (2) the Step 3 triage path may call `mcp__linear-server__save_comment` to post triage findings and `mcp__linear-server__save_issue` to add the `claude-triaged-{repo}` label — these are lightweight metadata updates that do not create or materially edit ticket content and therefore do not need to route through `linear-write-issue`.
|
|
133
134
|
- If sign-in credentials are in the item, extract and pass them to the flow. If the item touches an authenticated surface and credentials are missing, that is a Step 2 failure — block and reassign rather than guessing.
|
|
@@ -0,0 +1,65 @@
|
|
|
1
|
+
# Pre-Flight Spec Autofill — Draft-Then-Block (load-bearing)
|
|
2
|
+
|
|
3
|
+
When the pre-flight gate (`*-agent` Step 2) returns `FAIL` on **ticket-quality**
|
|
4
|
+
gaps, do **not** bounce a raw checklist back to the reporter. Most "missing
|
|
5
|
+
required spec content" gaps are **authorable** from material already on the work
|
|
6
|
+
item (title, description, screenshots, design links, repro steps) plus the
|
|
7
|
+
codebase. **Draft** a best-effort version of every authorable gap, write it into
|
|
8
|
+
the item as clearly-labeled **assumptions/recommendations**, and only **then**
|
|
9
|
+
block — turning the human ask from *"author all this"* into *"confirm or correct
|
|
10
|
+
my draft, then flip back to Ready."* Same shape as `repo-scope-split`: the agent
|
|
11
|
+
does the work it can; the human decides only what only a human can.
|
|
12
|
+
|
|
13
|
+
This does **not** widen the gate — every required section must still exist
|
|
14
|
+
before build. It replaces an empty demand with a defensible first draft, and it
|
|
15
|
+
breaks the `Ready ↔ Blocked` ping-pong loop that a raw checklist causes (the
|
|
16
|
+
information was already on the ticket; only the structure was missing).
|
|
17
|
+
|
|
18
|
+
## Two tiers
|
|
19
|
+
|
|
20
|
+
- **Tier A — authorable (always draft):** Technical Approach, Out of Scope,
|
|
21
|
+
Gherkin Acceptance Criteria (one scenario per fix), expected-vs-actual +
|
|
22
|
+
environment, Repository, Relationship Search (actually run the git+tracker
|
|
23
|
+
search — don't fabricate "none found"), Validation Journey **draft** (via the
|
|
24
|
+
vendor `*-add-journey` skill), Target Backend Environment (recommend a default
|
|
25
|
+
from `deploy.branches`/config).
|
|
26
|
+
- **Tier B — irreducibly human:** real credentials/access that exist nowhere on
|
|
27
|
+
the item or in repo test-user docs; a genuine product/scoping decision with no
|
|
28
|
+
defensible default. Still propose a recommended default where one exists; ask
|
|
29
|
+
a specific question only where none does.
|
|
30
|
+
|
|
31
|
+
## Procedure
|
|
32
|
+
|
|
33
|
+
1. Enumerate FAIL categories from `*-verify`. If S10 failed, run
|
|
34
|
+
`repo-scope-split` first (split, not autofill).
|
|
35
|
+
2. Draft each Tier-A gap grounded in item material + codebase; tag every
|
|
36
|
+
inference as an assumption. **Never overwrite human prose** — add/augment
|
|
37
|
+
sections only.
|
|
38
|
+
3. Write the draft via the vendor write skill (`jira-write-ticket` /
|
|
39
|
+
`github-write-issue` / `linear-write-issue`); draft the Validation Journey
|
|
40
|
+
via `*-add-journey`.
|
|
41
|
+
4. Re-run `*-verify`. Structural gates should now PASS; anything still failing
|
|
42
|
+
is Tier B — name it in the comment.
|
|
43
|
+
5. Block as usual (`blocked` status + `human_needed` marker + reassign to
|
|
44
|
+
Reporter) but post the **confirmation comment**, not a checklist: disclose
|
|
45
|
+
it's a Claude draft, one line per drafted section + its key assumption,
|
|
46
|
+
Tier-B items as specific questions with defaults, and close with *"correct
|
|
47
|
+
anything wrong, then flip back to Ready and it builds — or reply with
|
|
48
|
+
corrections."*
|
|
49
|
+
6. **Loop-safety:** if the item already carries the agent's draft, refine only
|
|
50
|
+
the still-failing gaps; don't redraft. Re-readying after review is the
|
|
51
|
+
human's approval — the next claim's `*-verify` PASSes and build proceeds.
|
|
52
|
+
|
|
53
|
+
## When you genuinely cannot autofill
|
|
54
|
+
|
|
55
|
+
If drafting would be fabrication (no fix/expected behavior described, no usable
|
|
56
|
+
design ref, uninformative title, no codebase anchor), block as before — but
|
|
57
|
+
phrase each gap as a specific question with a default where defensible. Never a
|
|
58
|
+
bare checklist when a defensible draft is possible.
|
|
59
|
+
|
|
60
|
+
The agent writes **spec/criteria, never code**, at this gate — authoring AC and
|
|
61
|
+
a validation journey is explicitly permitted here (this supersedes the older
|
|
62
|
+
"the build agent does not author the missing spec content" stance).
|
|
63
|
+
|
|
64
|
+
Full procedure, tier detail, confirmation-comment template, and vendor mechanics:
|
|
65
|
+
[reference/pre-flight-autofill.md](../reference/pre-flight-autofill.md).
|
|
@@ -78,7 +78,7 @@ JIRA Discipline:
|
|
|
78
78
|
- **Gherkin acceptance criteria** (Given/When/Then) so the implementer can verify behavior without guessing.
|
|
79
79
|
- **Relationship discovery evidence** — either an issue link to a related ticket, or a documented search showing none was found (see Relationship Discovery in jira-verify).
|
|
80
80
|
- Ticket metadata MUST include an **epic parent** for non-bug, non-epic tickets so every Story/Task/Sub-task is traceable to a strategic goal.
|
|
81
|
-
- Pre-flight gate before starting work on any ticket: if the description is missing target backend environment (when applicable), sign-in credentials (when applicable), Gherkin acceptance criteria, epic parent (non-bug/non-epic), or relationship discovery evidence, transition the ticket to Blocked, reassign to the **Reporter**, and post a comment
|
|
81
|
+
- Pre-flight gate before starting work on any ticket: if the description is missing target backend environment (when applicable), sign-in credentials (when applicable), Gherkin acceptance criteria, epic parent (non-bug/non-epic), or relationship discovery evidence, first **draft** the authorable missing sections into the ticket as clearly-labeled assumptions (the `pre-flight-autofill` draft-then-block procedure — the agent writes spec, never code, here), then transition the ticket to Blocked, reassign to the **Reporter**, and post a **confirmation** comment asking them to confirm the drafted assumptions (not a bare "go write all this" checklist). Do not start work. This is the one place where auto-transitioning status is allowed.
|
|
82
82
|
- When checking for associated pull requests on a JIRA issue, check the **Development panel** — not just comments or description text. The Development panel shows PRs, commits, branches, and builds linked via the GitHub-Jira integration. Query it via the dev-status API:
|
|
83
83
|
```bash
|
|
84
84
|
ISSUE_ID=$(curl -s -u "${JIRA_LOGIN}:${JIRA_API_TOKEN}" \
|
|
@@ -330,7 +330,7 @@ A **marker** is an additive label applied *alongside* a lifecycle role, not a st
|
|
|
330
330
|
|
|
331
331
|
| Marker | What it means | JIRA default | GitHub/Linear default |
|
|
332
332
|
|---|---|---|---|
|
|
333
|
-
| `human_needed` | Applied with `blocked` when the
|
|
333
|
+
| `human_needed` | Applied with `blocked` when — **after the agent has drafted every authorable missing section via the `pre-flight-autofill` procedure** — the block still requires a human to confirm the drafted assumptions or supply something no agent can invent: real missing credentials, access/permissions, or an irreducible product/scoping decision. | `Human Needed` (label) | `human-needed` (label) |
|
|
334
334
|
|
|
335
335
|
Resolution keys:
|
|
336
336
|
|
|
@@ -338,7 +338,7 @@ Resolution keys:
|
|
|
338
338
|
- GitHub: `github.labels.build.human_needed` (default `human-needed`). Added next to the `blocked` label.
|
|
339
339
|
- Linear: `linear.labels.build.human_needed` (default `human-needed`). Added next to the `blocked` label.
|
|
340
340
|
|
|
341
|
-
**When to apply it.** Apply `human_needed` only when a human must act before the item can move — the pre-flight gate failures that bounce a ticket back to its reporter
|
|
341
|
+
**When to apply it.** Apply `human_needed` only when a human must act before the item can move — the pre-flight gate failures that bounce a ticket back to its reporter are exactly this case, but **only after** the agent has run the `pre-flight-autofill` draft-then-block procedure (drafting the authorable gaps — acceptance criteria, validation journey, repository, relationship search, etc. — into the ticket as labeled assumptions). What then remains for the human is to **confirm those assumptions** or supply a genuinely human-only input (real missing credentials, an irreducible product/scoping decision). The marker means "a human must confirm or decide," not "a human must author from scratch."
|
|
342
342
|
|
|
343
343
|
**When NOT to apply it.** Do **not** apply `human_needed` to a block that an automated cycle can clear on its own: a block whose `is blocked by` dependency is another tracked ticket that will build and close (for example a `repair-intake`-filed build-ready fix ticket for an unmergeable PR or a failed deploy), or any block waiting only on a retry. Those self-heal; flagging them for a human is noise. If such an item already carries a stale `human_needed` marker, clear it when the block becomes auto-recoverable.
|
|
344
344
|
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
# Pre-Flight Spec Autofill (Draft-Then-Block)
|
|
2
|
+
|
|
3
|
+
When the pre-flight gate (`*-agent` Step 2) returns `FAIL` on **ticket-quality**
|
|
4
|
+
gaps, the agent does **not** bounce a raw "here is everything you must write"
|
|
5
|
+
checklist back to the reporter. Most "missing required spec content" gaps are
|
|
6
|
+
**authorable** from material already on the work item (title, description,
|
|
7
|
+
screenshots, design links, reproduction steps) plus the codebase. The agent
|
|
8
|
+
drafts a best-effort version of every authorable gap, writes it into the work
|
|
9
|
+
item as clearly-labeled **assumptions and recommendations**, and only **then**
|
|
10
|
+
blocks — turning the human ask from *"author all of this from scratch"* into
|
|
11
|
+
*"confirm or correct my draft, then flip it back to Ready."*
|
|
12
|
+
|
|
13
|
+
This is the same shape as the `repo-scope-split` exception: the agent does the
|
|
14
|
+
work it can and reserves the human for what only a human can decide. It does
|
|
15
|
+
**not** widen the gate — every required section must still exist before build;
|
|
16
|
+
autofill just supplies a defensible first draft instead of an empty demand.
|
|
17
|
+
|
|
18
|
+
## Why this exists
|
|
19
|
+
|
|
20
|
+
The build + screenshot-diff verification pipeline needs **structured,
|
|
21
|
+
machine-readable** sections — Gherkin acceptance criteria, a Validation Journey
|
|
22
|
+
with `[SCREENSHOT:]`/`[EVIDENCE:]` markers, Sign-in Required, Target Backend
|
|
23
|
+
Environment, Repository. A bug report routinely contains all of that
|
|
24
|
+
*information* in prose, screenshots, or a Figma link, but not the *structure*.
|
|
25
|
+
Dumping the checklist straight back produces a ping-pong loop: the item bounces
|
|
26
|
+
`Ready → Blocked → Ready` on every intake cycle because nobody re-types the
|
|
27
|
+
existing information into headings, and the reporter reasonably objects that the
|
|
28
|
+
information is already there. Drafting the structure breaks the loop and
|
|
29
|
+
respects the reporter's time — the human reviews a draft instead of authoring a
|
|
30
|
+
spec.
|
|
31
|
+
|
|
32
|
+
## Two tiers of gap
|
|
33
|
+
|
|
34
|
+
**Tier A — authorable (always attempt a draft):**
|
|
35
|
+
|
|
36
|
+
- **Technical Approach** — locate the affected component/files in the repo (the
|
|
37
|
+
title and description usually name the surface, e.g. "Player modal"); state
|
|
38
|
+
which files likely change and the expected layout. Flag inferences as
|
|
39
|
+
assumptions.
|
|
40
|
+
- **Out of Scope** — a one-line boundary derived from the fix list.
|
|
41
|
+
- **Acceptance Criteria (Gherkin)** — convert each described fix / expected
|
|
42
|
+
behavior into `Given/When/Then`. One scenario per discrete fix.
|
|
43
|
+
- **Expected-vs-actual + environment** — restate the bug as explicit expected
|
|
44
|
+
vs actual, naming the environment the screenshots/description came from.
|
|
45
|
+
- **Repository** — resolve per `config-resolution` repo scoping and state it.
|
|
46
|
+
- **Relationship Search** — actually **run** the git + tracker search; record
|
|
47
|
+
the queries and results and link anything found. Do not fabricate a
|
|
48
|
+
"none found" note.
|
|
49
|
+
- **Validation Journey (draft)** — run the vendor `*-add-journey` skill to draft
|
|
50
|
+
the click-path, markers, and viewports from the reproduction steps. This is a
|
|
51
|
+
draft for human approval, not the final ratified contract.
|
|
52
|
+
- **Target Backend Environment** — recommend a default from `deploy.branches` /
|
|
53
|
+
config (the backend the FE points at for verification) and state it as a
|
|
54
|
+
recommendation.
|
|
55
|
+
|
|
56
|
+
**Tier B — irreducibly human (cannot invent — but still propose a default):**
|
|
57
|
+
|
|
58
|
+
- **Real credentials / access** that exist nowhere on the item or in the repo's
|
|
59
|
+
known test-user docs. (If credentials are present in prose, that is Tier A —
|
|
60
|
+
lift them into a Sign-in Required section.)
|
|
61
|
+
- **A genuine product / scoping decision** with no defensible default — the
|
|
62
|
+
exact expected behavior when the ticket is internally contradictory or the
|
|
63
|
+
design reference is missing.
|
|
64
|
+
|
|
65
|
+
For Tier B, still propose a **recommended default** wherever one is defensible,
|
|
66
|
+
and ask a **specific question** only where none is. Never reduce a Tier B item
|
|
67
|
+
to a bare demand.
|
|
68
|
+
|
|
69
|
+
## Procedure
|
|
70
|
+
|
|
71
|
+
1. **Enumerate the FAIL categories** from `*-verify`.
|
|
72
|
+
2. **Run `repo-scope-split` first** if S10 (single-repo scope) failed — that is
|
|
73
|
+
a split, not an autofill. Autofill handles the remaining quality gaps.
|
|
74
|
+
3. **Draft each Tier-A gap** grounded in the work-item material + codebase.
|
|
75
|
+
Every inferred value is explicitly tagged as an assumption/recommendation
|
|
76
|
+
(lead the drafted block with a note: *"Drafted by Claude — assumptions
|
|
77
|
+
flagged inline; please confirm or correct."*). **Never overwrite
|
|
78
|
+
human-authored prose** — add the missing structured sections; if a section
|
|
79
|
+
exists but is thin, augment it without discarding the human's words.
|
|
80
|
+
4. **Write the draft into the work item** via the vendor write skill
|
|
81
|
+
(`jira-write-ticket` / `github-write-issue` / `linear-write-issue`) so
|
|
82
|
+
relationship and metadata gates stay enforced. Draft the Validation Journey
|
|
83
|
+
via the vendor `*-add-journey` skill.
|
|
84
|
+
5. **Re-run `*-verify`.** The structural gates should now PASS (the content
|
|
85
|
+
exists, even if assumed). Any gate that still FAILs is Tier B — leave it and
|
|
86
|
+
name it precisely in the comment.
|
|
87
|
+
6. **Block as usual** — transition/relabel to the configured `blocked` status,
|
|
88
|
+
add the `human_needed` marker, reassign to the **Reporter** — but post the
|
|
89
|
+
**confirmation comment** (below), not a remediation checklist.
|
|
90
|
+
7. **Idempotency / loop-safety.** If the item already carries the agent's draft
|
|
91
|
+
from a prior cycle, do **not** redraft from scratch — refine only the gaps
|
|
92
|
+
still failing and refresh the confirmation comment. When the reporter flips
|
|
93
|
+
the item back to Ready, the next claim re-runs `*-verify`; if it now PASSes,
|
|
94
|
+
build proceeds on the draft the reporter approved by re-readying it. That is
|
|
95
|
+
what breaks the `Ready ↔ Blocked` loop.
|
|
96
|
+
|
|
97
|
+
## The confirmation comment (replaces the remediation checklist)
|
|
98
|
+
|
|
99
|
+
- **Disclose**: posted by Claude (AI build agent); identify the content as a
|
|
100
|
+
draft.
|
|
101
|
+
- **Frame it**: the item had the right information but lacked the structured
|
|
102
|
+
sections the pipeline needs, so the agent drafted them — the report's validity
|
|
103
|
+
was never in question.
|
|
104
|
+
- **One line per drafted section**, naming the section and the key assumption
|
|
105
|
+
(e.g. *"Acceptance Criteria — drafted 4 Gherkin scenarios from the fix list;
|
|
106
|
+
assumed 'Search result' restores the prior query terms."*).
|
|
107
|
+
- **Tier-B items still required**, each as a specific question with a
|
|
108
|
+
recommended default where one exists.
|
|
109
|
+
- **Close with the action**: *"Review the drafted sections in the description.
|
|
110
|
+
Correct anything wrong, then flip back to Ready and it builds immediately — or
|
|
111
|
+
reply with corrections and I'll revise."* Keep the `human_needed` marker until
|
|
112
|
+
then.
|
|
113
|
+
|
|
114
|
+
## When you genuinely cannot autofill (fall back to the plain block)
|
|
115
|
+
|
|
116
|
+
If the item is so underspecified that drafting would be fabrication — no fix or
|
|
117
|
+
expected behavior described, no usable design reference, an uninformative title,
|
|
118
|
+
and the codebase gives no anchor — block as before. Even then, phrase **each gap
|
|
119
|
+
as a specific question** and propose a default wherever one is defensible (the
|
|
120
|
+
"Human-Needed is a last resort" principle). Never bounce a bare checklist when a
|
|
121
|
+
defensible draft is possible.
|
|
122
|
+
|
|
123
|
+
## Disclosure & safety
|
|
124
|
+
|
|
125
|
+
- Agent-drafted content is **always attributed to Claude and marked as
|
|
126
|
+
assumptions**, so a human never mistakes a guess for their own ratified spec.
|
|
127
|
+
- The agent writes **spec/criteria, never code**, at this gate. Drafting
|
|
128
|
+
acceptance criteria and a validation journey is authoring, not implementation
|
|
129
|
+
— explicitly permitted here. This **supersedes** the older "the build agent
|
|
130
|
+
does not author the missing spec content" stance, which produced the
|
|
131
|
+
bounce-loop.
|
|
132
|
+
|
|
133
|
+
## Vendor mechanics
|
|
134
|
+
|
|
135
|
+
- **JIRA** — draft sections via `jira-write-ticket`; Validation Journey via
|
|
136
|
+
`jira-add-journey`; block + label + reassign + comment via the `jira-agent`
|
|
137
|
+
Step 2 exception (`transitionJiraIssue`, `editJiraIssue` for the label and
|
|
138
|
+
assignee, `addCommentToJiraIssue`).
|
|
139
|
+
- **GitHub** — `github-write-issue`; `github-add-journey`; relabel + reassign +
|
|
140
|
+
comment via `gh`.
|
|
141
|
+
- **Linear** — `linear-write-issue`; `linear-add-journey`; `save_issue` +
|
|
142
|
+
`save_comment`.
|