@codyswann/lisa 4.54.5 → 4.54.7
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/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +8 -0
- package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
- package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +13 -11
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/package.json +4 -4
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-github-validate-issue/SKILL.md +19 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-verify/SKILL.md +17 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-github-write-issue/SKILL.md +35 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-validate-ticket/SKILL.md +19 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-verify/SKILL.md +17 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-jira-write-ticket/SKILL.md +35 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-validate-issue/SKILL.md +19 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-verify/SKILL.md +17 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-issue/SKILL.md +35 -0
- package/plugins/lisa/skills/lisa-github-validate-issue/SKILL.md +19 -0
- package/plugins/lisa/skills/lisa-github-verify/SKILL.md +17 -0
- package/plugins/lisa/skills/lisa-github-write-issue/SKILL.md +35 -0
- package/plugins/lisa/skills/lisa-jira-validate-ticket/SKILL.md +19 -0
- package/plugins/lisa/skills/lisa-jira-verify/SKILL.md +17 -0
- package/plugins/lisa/skills/lisa-jira-write-ticket/SKILL.md +35 -0
- package/plugins/lisa/skills/lisa-linear-validate-issue/SKILL.md +19 -0
- package/plugins/lisa/skills/lisa-linear-verify/SKILL.md +17 -0
- package/plugins/lisa/skills/lisa-linear-write-issue/SKILL.md +35 -0
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-github-validate-issue/SKILL.md +19 -0
- package/plugins/lisa-agy/skills/lisa-github-verify/SKILL.md +17 -0
- package/plugins/lisa-agy/skills/lisa-github-write-issue/SKILL.md +35 -0
- package/plugins/lisa-agy/skills/lisa-jira-validate-ticket/SKILL.md +19 -0
- package/plugins/lisa-agy/skills/lisa-jira-verify/SKILL.md +17 -0
- package/plugins/lisa-agy/skills/lisa-jira-write-ticket/SKILL.md +35 -0
- package/plugins/lisa-agy/skills/lisa-linear-validate-issue/SKILL.md +19 -0
- package/plugins/lisa-agy/skills/lisa-linear-verify/SKILL.md +17 -0
- package/plugins/lisa-agy/skills/lisa-linear-write-issue/SKILL.md +35 -0
- 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/skills/lisa-github-validate-issue/SKILL.md +19 -0
- package/plugins/lisa-copilot/skills/lisa-github-verify/SKILL.md +17 -0
- package/plugins/lisa-copilot/skills/lisa-github-write-issue/SKILL.md +35 -0
- package/plugins/lisa-copilot/skills/lisa-jira-validate-ticket/SKILL.md +19 -0
- package/plugins/lisa-copilot/skills/lisa-jira-verify/SKILL.md +17 -0
- package/plugins/lisa-copilot/skills/lisa-jira-write-ticket/SKILL.md +35 -0
- package/plugins/lisa-copilot/skills/lisa-linear-validate-issue/SKILL.md +19 -0
- package/plugins/lisa-copilot/skills/lisa-linear-verify/SKILL.md +17 -0
- package/plugins/lisa-copilot/skills/lisa-linear-write-issue/SKILL.md +35 -0
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/skills/lisa-github-validate-issue/SKILL.md +19 -0
- package/plugins/lisa-cursor/skills/lisa-github-verify/SKILL.md +17 -0
- package/plugins/lisa-cursor/skills/lisa-github-write-issue/SKILL.md +35 -0
- package/plugins/lisa-cursor/skills/lisa-jira-validate-ticket/SKILL.md +19 -0
- package/plugins/lisa-cursor/skills/lisa-jira-verify/SKILL.md +17 -0
- package/plugins/lisa-cursor/skills/lisa-jira-write-ticket/SKILL.md +35 -0
- package/plugins/lisa-cursor/skills/lisa-linear-validate-issue/SKILL.md +19 -0
- package/plugins/lisa-cursor/skills/lisa-linear-verify/SKILL.md +17 -0
- package/plugins/lisa-cursor/skills/lisa-linear-write-issue/SKILL.md +35 -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/skills/lisa-github-validate-issue/SKILL.md +19 -0
- package/plugins/src/base/skills/lisa-github-verify/SKILL.md +17 -0
- package/plugins/src/base/skills/lisa-github-write-issue/SKILL.md +35 -0
- package/plugins/src/base/skills/lisa-jira-validate-ticket/SKILL.md +19 -0
- package/plugins/src/base/skills/lisa-jira-verify/SKILL.md +17 -0
- package/plugins/src/base/skills/lisa-jira-write-ticket/SKILL.md +35 -0
- package/plugins/src/base/skills/lisa-linear-validate-issue/SKILL.md +19 -0
- package/plugins/src/base/skills/lisa-linear-verify/SKILL.md +17 -0
- package/plugins/src/base/skills/lisa-linear-write-issue/SKILL.md +35 -0
- package/typescript/copy-overwrite/scripts/check-skipped-required-checks.mjs +326 -16
- package/typescript/create-only/.github/workflows/review-evidence.yml +29 -0
package/package.json
CHANGED
|
@@ -181,7 +181,7 @@
|
|
|
181
181
|
"zod-validation-error": "^4.0.0"
|
|
182
182
|
},
|
|
183
183
|
"name": "@codyswann/lisa",
|
|
184
|
-
"version": "4.54.
|
|
184
|
+
"version": "4.54.7",
|
|
185
185
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
186
186
|
"main": "dist/index.js",
|
|
187
187
|
"exports": {
|
|
@@ -329,7 +329,7 @@
|
|
|
329
329
|
"test": "tests"
|
|
330
330
|
},
|
|
331
331
|
"types": "./dist/index.d.ts",
|
|
332
|
-
"lisaReleaseCommit": "
|
|
333
|
-
"gitHead": "
|
|
334
|
-
"lisaReleaseTag": "v4.54.
|
|
332
|
+
"lisaReleaseCommit": "8ea018ea71fe010db7dc11945994c3f95380cd70",
|
|
333
|
+
"gitHead": "8ea018ea71fe010db7dc11945994c3f95380cd70",
|
|
334
|
+
"lisaReleaseTag": "v4.54.7"
|
|
335
335
|
}
|
|
@@ -71,6 +71,25 @@ prd_source: "https://notion.so/..." # set when the issue was generated from a
|
|
|
71
71
|
|
|
72
72
|
If the caller passes only an issue ref, fetch via `gh issue view <number> --repo <org>/<repo> --json number,title,body,labels,state,milestone,assignees`, parse the body sections, derive the spec fields — including `runtime_behavior_change`, derived from the `## Target Backend Environment` declaration per `derived-branch-plan` and authoritative over any caller assertion — then run gates. The parser lives in `lisa-github-read-issue` (composition).
|
|
73
73
|
|
|
74
|
+
## Standalone use, against an item that already exists
|
|
75
|
+
|
|
76
|
+
This is a supported entry point, not only an internal step of a caller flow.
|
|
77
|
+
Point it at a live issue and it fetches and validates the stored state:
|
|
78
|
+
|
|
79
|
+
```text
|
|
80
|
+
Skill(lisa-github-validate-issue) with owner/repo#1234
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Use it whenever the issue reached the tracker by some path other than
|
|
84
|
+
`lisa-github-write-issue` — a team's own script, a workflow step, a cron, anything holding the
|
|
85
|
+
credentials but no skill runtime. Those paths get neither the pre-write nor the
|
|
86
|
+
post-write gate, and their own read-back substitutes for neither: a read-back
|
|
87
|
+
proves the tracker stored what was sent, never that what was sent was any good.
|
|
88
|
+
|
|
89
|
+
The gate definitions live here on purpose, so every caller picks up a change
|
|
90
|
+
automatically. Running this skill by hand is the same gate the write path runs,
|
|
91
|
+
not an approximation of it.
|
|
92
|
+
|
|
74
93
|
## Gates
|
|
75
94
|
|
|
76
95
|
Gates are grouped into **Specification** (spec-only checks, no GitHub lookups) and **Feasibility** (requires GitHub lookups). The dry-run path may opt to run Specification gates only via `--spec-only`; the write path runs both.
|
|
@@ -27,3 +27,20 @@ Pass through `lisa-github-validate-issue`'s structured output unchanged. Do not
|
|
|
27
27
|
- This skill is read-only. It never edits the issue, posts comments, or changes labels.
|
|
28
28
|
- If a gate fails, the recommendation is part of the validator's report; surface it as-is.
|
|
29
29
|
- The Validation Journey check (S11) parses the `## Validation Journey` markdown section — same parser logic as `lisa-github-add-journey` and `lisa-github-journey`.
|
|
30
|
+
|
|
31
|
+
## Comparison is semantic, never byte-exact
|
|
32
|
+
|
|
33
|
+
Re-run the validator against the live issue. Do NOT compare the stored body
|
|
34
|
+
against what was sent byte for byte.
|
|
35
|
+
|
|
36
|
+
The reason is measured rather than theoretical. Trackers normalize markdown on
|
|
37
|
+
write: `-` bullets become `*`, a bare URL is wrapped as `[url](<url>)`, bold
|
|
38
|
+
emphasis is re-segmented around inline code spans. All lossless, all
|
|
39
|
+
rendering-identical, and all of it makes a byte comparator report failure on a
|
|
40
|
+
write that was completely fine. A comparator that cannot tell vendor
|
|
41
|
+
normalization from corruption fails on healthy writes and trains its reader to
|
|
42
|
+
ignore it, which costs more than the check was ever worth.
|
|
43
|
+
|
|
44
|
+
Compare meaning: run `lisa-github-validate-issue` against the stored item and let the gates
|
|
45
|
+
decide. Where a single field must be compared directly, normalize both sides
|
|
46
|
+
first.
|
|
@@ -12,6 +12,41 @@ This skill is the GitHub counterpart of `lisa-jira-write-ticket`. The two skills
|
|
|
12
12
|
|
|
13
13
|
Repository name for scoped comments: `basename $(git rev-parse --show-toplevel)`.
|
|
14
14
|
|
|
15
|
+
## Writing by another path? The gates still apply
|
|
16
|
+
|
|
17
|
+
A team that talks to its tracker through its own script is doing a normal
|
|
18
|
+
thing — the script usually owns the credential plumbing, and Lisa neither
|
|
19
|
+
controls nor wants to control it. What that script does NOT get is either half
|
|
20
|
+
of this skill's quality gate, and nothing about the write says so.
|
|
21
|
+
|
|
22
|
+
**A read-back is not the missing check.** A bespoke path almost always re-reads
|
|
23
|
+
the issue after writing and confirms the tracker stored what was sent. That is
|
|
24
|
+
worth doing and it is not this. It proves TRANSPORT: the API accepted the
|
|
25
|
+
payload and the field values round-tripped. It cannot fail for the reason these
|
|
26
|
+
gates exist, because it never looks at whether what was sent was any good — a
|
|
27
|
+
issue with no acceptance criteria, no parent, and a human decision left sitting
|
|
28
|
+
in the middle of it round-trips perfectly. That is the dangerous half of the
|
|
29
|
+
shape: a failing control gets investigated, a misread one gets trusted.
|
|
30
|
+
|
|
31
|
+
So a write by any other path still owes both phases, and both run standalone
|
|
32
|
+
against an item that already exists:
|
|
33
|
+
|
|
34
|
+
| Phase | Skill | What it costs you |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| Pre-write validate | `lisa-github-validate-issue` | Run it on the draft before you send it |
|
|
37
|
+
| Post-write verify | `lisa-github-verify` | Run it on the live issue after you send it |
|
|
38
|
+
|
|
39
|
+
```text
|
|
40
|
+
Skill(lisa-github-validate-issue) with the draft issue, or with a reference to a live one
|
|
41
|
+
Skill(lisa-github-verify) with owner/repo#1234
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**These are plugin-resident skills invoked through the Skill tool.** They are
|
|
45
|
+
not shell scripts and will not appear in any repository's `scripts/` directory,
|
|
46
|
+
including yours. An agent that searches the repo it is standing in, finds
|
|
47
|
+
nothing, and concludes the capability is absent has made the one mistake that
|
|
48
|
+
turns a local script from the convenient option into the only one.
|
|
49
|
+
|
|
15
50
|
## Prerequisites
|
|
16
51
|
|
|
17
52
|
- `gh` CLI installed and authenticated (`gh auth status` must succeed). The skill never falls back to a different transport — if `gh` is unauthenticated, stop and surface the auth error.
|
|
@@ -68,6 +68,25 @@ prd_source: "https://notion.so/..." # set when the ticket was generated from
|
|
|
68
68
|
|
|
69
69
|
If the caller passes only a ticket key, fetch the ticket via `lisa-atlassian-access` `operation: read-ticket key: <KEY>`, derive the same fields from the fetched data — including `runtime_behavior_change` (derived from the `Target Backend Environment` declaration per `derived-branch-plan`, and authoritative over any caller assertion), `build_ready` (label set contains the resolved `READY_ROLE` — merged `jira.workflow.ready`, default `status:ready` — never a hard-coded label) and `child_refs` (sub-tasks plus `is blocked by` parentage, resolved as in `lisa-jira-read-ticket`) so S15 can classify the ticket — then run gates.
|
|
70
70
|
|
|
71
|
+
## Standalone use, against an item that already exists
|
|
72
|
+
|
|
73
|
+
This is a supported entry point, not only an internal step of a caller flow.
|
|
74
|
+
Point it at a live ticket and it fetches and validates the stored state:
|
|
75
|
+
|
|
76
|
+
```text
|
|
77
|
+
Skill(lisa-jira-validate-ticket) with PROJ-1234
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Use it whenever the ticket reached the tracker by some path other than
|
|
81
|
+
`lisa-jira-write-ticket` — a team's own script, a workflow step, a cron, anything holding the
|
|
82
|
+
credentials but no skill runtime. Those paths get neither the pre-write nor the
|
|
83
|
+
post-write gate, and their own read-back substitutes for neither: a read-back
|
|
84
|
+
proves the tracker stored what was sent, never that what was sent was any good.
|
|
85
|
+
|
|
86
|
+
The gate definitions live here on purpose, so every caller picks up a change
|
|
87
|
+
automatically. Running this skill by hand is the same gate the write path runs,
|
|
88
|
+
not an approximation of it.
|
|
89
|
+
|
|
71
90
|
## Gates
|
|
72
91
|
|
|
73
92
|
Gates are grouped into **Specification** (spec-only checks, no JIRA lookups) and **Feasibility** (requires JIRA lookups). The dry-run path may opt to run Specification gates only; the write path runs both.
|
|
@@ -28,3 +28,20 @@ Pass through `lisa-jira-validate-ticket`'s structured output unchanged. Do not s
|
|
|
28
28
|
- This skill is read-only. It never edits the ticket, posts comments, or changes status.
|
|
29
29
|
- If a gate fails, the recommendation is part of the validator's report; surface it as-is.
|
|
30
30
|
- Validation Journey checks (S11) historically required a parser script (`parse-plan.py`); the parser logic now lives inside `lisa-jira-validate-ticket` so this skill no longer shells out to it.
|
|
31
|
+
|
|
32
|
+
## Comparison is semantic, never byte-exact
|
|
33
|
+
|
|
34
|
+
Re-run the validator against the live ticket. Do NOT compare the stored body
|
|
35
|
+
against what was sent byte for byte.
|
|
36
|
+
|
|
37
|
+
The reason is measured rather than theoretical. Trackers normalize markdown on
|
|
38
|
+
write: `-` bullets become `*`, a bare URL is wrapped as `[url](<url>)`, bold
|
|
39
|
+
emphasis is re-segmented around inline code spans. All lossless, all
|
|
40
|
+
rendering-identical, and all of it makes a byte comparator report failure on a
|
|
41
|
+
write that was completely fine. A comparator that cannot tell vendor
|
|
42
|
+
normalization from corruption fails on healthy writes and trains its reader to
|
|
43
|
+
ignore it, which costs more than the check was ever worth.
|
|
44
|
+
|
|
45
|
+
Compare meaning: run `lisa-jira-validate-ticket` against the stored item and let the gates
|
|
46
|
+
decide. Where a single field must be compared directly, normalize both sides
|
|
47
|
+
first.
|
|
@@ -12,6 +12,41 @@ Create or update a JIRA ticket with all required relationships, metadata, and qu
|
|
|
12
12
|
|
|
13
13
|
Repository name for scoped comments: `basename $(git rev-parse --show-toplevel)`.
|
|
14
14
|
|
|
15
|
+
## Writing by another path? The gates still apply
|
|
16
|
+
|
|
17
|
+
A team that talks to its tracker through its own script is doing a normal
|
|
18
|
+
thing — the script usually owns the credential plumbing, and Lisa neither
|
|
19
|
+
controls nor wants to control it. What that script does NOT get is either half
|
|
20
|
+
of this skill's quality gate, and nothing about the write says so.
|
|
21
|
+
|
|
22
|
+
**A read-back is not the missing check.** A bespoke path almost always re-reads
|
|
23
|
+
the ticket after writing and confirms the tracker stored what was sent. That is
|
|
24
|
+
worth doing and it is not this. It proves TRANSPORT: the API accepted the
|
|
25
|
+
payload and the field values round-tripped. It cannot fail for the reason these
|
|
26
|
+
gates exist, because it never looks at whether what was sent was any good — a
|
|
27
|
+
ticket with no acceptance criteria, no parent, and a human decision left sitting
|
|
28
|
+
in the middle of it round-trips perfectly. That is the dangerous half of the
|
|
29
|
+
shape: a failing control gets investigated, a misread one gets trusted.
|
|
30
|
+
|
|
31
|
+
So a write by any other path still owes both phases, and both run standalone
|
|
32
|
+
against an item that already exists:
|
|
33
|
+
|
|
34
|
+
| Phase | Skill | What it costs you |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| Pre-write validate | `lisa-jira-validate-ticket` | Run it on the draft before you send it |
|
|
37
|
+
| Post-write verify | `lisa-jira-verify` | Run it on the live ticket after you send it |
|
|
38
|
+
|
|
39
|
+
```text
|
|
40
|
+
Skill(lisa-jira-validate-ticket) with the draft ticket, or with a reference to a live one
|
|
41
|
+
Skill(lisa-jira-verify) with PROJ-1234
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**These are plugin-resident skills invoked through the Skill tool.** They are
|
|
45
|
+
not shell scripts and will not appear in any repository's `scripts/` directory,
|
|
46
|
+
including yours. An agent that searches the repo it is standing in, finds
|
|
47
|
+
nothing, and concludes the capability is absent has made the one mistake that
|
|
48
|
+
turns a local script from the convenient option into the only one.
|
|
49
|
+
|
|
15
50
|
## Phase 1 — Resolve Intent
|
|
16
51
|
|
|
17
52
|
Determine from $ARGUMENTS and context whether this is a CREATE or UPDATE:
|
|
@@ -69,6 +69,25 @@ prd_source: "https://notion.so/..." # set when the Issue was generated from a
|
|
|
69
69
|
|
|
70
70
|
If the caller passes only an identifier, fetch the item via `lisa-linear-access operation: get-issue` (Issue) or `lisa-linear-access operation: get-project` (Project), derive the same fields from the fetched data — including `runtime_behavior_change` (derived from the `## Target Backend Environment` declaration per `derived-branch-plan`, and authoritative over any caller assertion), `build_ready` (the Issue's state is the configured `ready` state) and `child_refs` (sub-issues, project-member issues, plus `blocked_by` parentage, resolved as in `lisa-linear-read-issue`) so S15 can classify the item — then run gates.
|
|
71
71
|
|
|
72
|
+
## Standalone use, against an item that already exists
|
|
73
|
+
|
|
74
|
+
This is a supported entry point, not only an internal step of a caller flow.
|
|
75
|
+
Point it at a live issue and it fetches and validates the stored state:
|
|
76
|
+
|
|
77
|
+
```text
|
|
78
|
+
Skill(lisa-linear-validate-issue) with ENG-1234
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Use it whenever the issue reached the tracker by some path other than
|
|
82
|
+
`lisa-linear-write-issue` — a team's own script, a workflow step, a cron, anything holding the
|
|
83
|
+
credentials but no skill runtime. Those paths get neither the pre-write nor the
|
|
84
|
+
post-write gate, and their own read-back substitutes for neither: a read-back
|
|
85
|
+
proves the tracker stored what was sent, never that what was sent was any good.
|
|
86
|
+
|
|
87
|
+
The gate definitions live here on purpose, so every caller picks up a change
|
|
88
|
+
automatically. Running this skill by hand is the same gate the write path runs,
|
|
89
|
+
not an approximation of it.
|
|
90
|
+
|
|
72
91
|
## Gates
|
|
73
92
|
|
|
74
93
|
Gates are grouped into **Specification** (spec-only checks, no Linear lookups) and **Feasibility** (requires Linear lookups). The dry-run path may opt to run Specification gates only; the write path runs both.
|
|
@@ -49,3 +49,20 @@ If the verdict is `FAIL`, the caller should fix the item and re-run verify. Neve
|
|
|
49
49
|
- Never write to Linear. Read-only.
|
|
50
50
|
- Never short-circuit the validator. Always run the full gate set.
|
|
51
51
|
- If `get_issue` / `get_project` returns an access error, surface it and exit — don't pretend the item is fine.
|
|
52
|
+
|
|
53
|
+
## Comparison is semantic, never byte-exact
|
|
54
|
+
|
|
55
|
+
Re-run the validator against the live issue. Do NOT compare the stored body
|
|
56
|
+
against what was sent byte for byte.
|
|
57
|
+
|
|
58
|
+
The reason is measured rather than theoretical. Trackers normalize markdown on
|
|
59
|
+
write: `-` bullets become `*`, a bare URL is wrapped as `[url](<url>)`, bold
|
|
60
|
+
emphasis is re-segmented around inline code spans. All lossless, all
|
|
61
|
+
rendering-identical, and all of it makes a byte comparator report failure on a
|
|
62
|
+
write that was completely fine. A comparator that cannot tell vendor
|
|
63
|
+
normalization from corruption fails on healthy writes and trains its reader to
|
|
64
|
+
ignore it, which costs more than the check was ever worth.
|
|
65
|
+
|
|
66
|
+
Compare meaning: run `lisa-linear-validate-issue` against the stored item and let the gates
|
|
67
|
+
decide. Where a single field must be compared directly, normalize both sides
|
|
68
|
+
first.
|
|
@@ -33,6 +33,41 @@ Linear's data model maps Epic / Story / Sub-task to **different entity types**.
|
|
|
33
33
|
|
|
34
34
|
The build lifecycle uses native **workflow states** (`Ready`, `In Progress`, `Blocked`, `On Dev`, `On Stg`, `Done`, plus an optional review state a project may bind), resolved per role from `linear.workflow` — see "Why Linear uses states, not labels" in `config-resolution`. A new **leaf** work unit is created in the configured `ready` state only on explicit `build_ready: true`; omitted or `false` leaves it in the team's default backlog state, and a container is never put in `ready` at all (see the Build-ready control input below).
|
|
35
35
|
|
|
36
|
+
## Writing by another path? The gates still apply
|
|
37
|
+
|
|
38
|
+
A team that talks to its tracker through its own script is doing a normal
|
|
39
|
+
thing — the script usually owns the credential plumbing, and Lisa neither
|
|
40
|
+
controls nor wants to control it. What that script does NOT get is either half
|
|
41
|
+
of this skill's quality gate, and nothing about the write says so.
|
|
42
|
+
|
|
43
|
+
**A read-back is not the missing check.** A bespoke path almost always re-reads
|
|
44
|
+
the issue after writing and confirms the tracker stored what was sent. That is
|
|
45
|
+
worth doing and it is not this. It proves TRANSPORT: the API accepted the
|
|
46
|
+
payload and the field values round-tripped. It cannot fail for the reason these
|
|
47
|
+
gates exist, because it never looks at whether what was sent was any good — a
|
|
48
|
+
issue with no acceptance criteria, no parent, and a human decision left sitting
|
|
49
|
+
in the middle of it round-trips perfectly. That is the dangerous half of the
|
|
50
|
+
shape: a failing control gets investigated, a misread one gets trusted.
|
|
51
|
+
|
|
52
|
+
So a write by any other path still owes both phases, and both run standalone
|
|
53
|
+
against an item that already exists:
|
|
54
|
+
|
|
55
|
+
| Phase | Skill | What it costs you |
|
|
56
|
+
|---|---|---|
|
|
57
|
+
| Pre-write validate | `lisa-linear-validate-issue` | Run it on the draft before you send it |
|
|
58
|
+
| Post-write verify | `lisa-linear-verify` | Run it on the live issue after you send it |
|
|
59
|
+
|
|
60
|
+
```text
|
|
61
|
+
Skill(lisa-linear-validate-issue) with the draft issue, or with a reference to a live one
|
|
62
|
+
Skill(lisa-linear-verify) with ENG-1234
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**These are plugin-resident skills invoked through the Skill tool.** They are
|
|
66
|
+
not shell scripts and will not appear in any repository's `scripts/` directory,
|
|
67
|
+
including yours. An agent that searches the repo it is standing in, finds
|
|
68
|
+
nothing, and concludes the capability is absent has made the one mistake that
|
|
69
|
+
turns a local script from the convenient option into the only one.
|
|
70
|
+
|
|
36
71
|
## Phase 1 — Resolve Intent
|
|
37
72
|
|
|
38
73
|
Determine from `$ARGUMENTS` and context whether this is a CREATE or UPDATE:
|
|
@@ -71,6 +71,25 @@ prd_source: "https://notion.so/..." # set when the issue was generated from a
|
|
|
71
71
|
|
|
72
72
|
If the caller passes only an issue ref, fetch via `gh issue view <number> --repo <org>/<repo> --json number,title,body,labels,state,milestone,assignees`, parse the body sections, derive the spec fields — including `runtime_behavior_change`, derived from the `## Target Backend Environment` declaration per `derived-branch-plan` and authoritative over any caller assertion — then run gates. The parser lives in `lisa-github-read-issue` (composition).
|
|
73
73
|
|
|
74
|
+
## Standalone use, against an item that already exists
|
|
75
|
+
|
|
76
|
+
This is a supported entry point, not only an internal step of a caller flow.
|
|
77
|
+
Point it at a live issue and it fetches and validates the stored state:
|
|
78
|
+
|
|
79
|
+
```text
|
|
80
|
+
Skill(lisa-github-validate-issue) with owner/repo#1234
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Use it whenever the issue reached the tracker by some path other than
|
|
84
|
+
`lisa-github-write-issue` — a team's own script, a workflow step, a cron, anything holding the
|
|
85
|
+
credentials but no skill runtime. Those paths get neither the pre-write nor the
|
|
86
|
+
post-write gate, and their own read-back substitutes for neither: a read-back
|
|
87
|
+
proves the tracker stored what was sent, never that what was sent was any good.
|
|
88
|
+
|
|
89
|
+
The gate definitions live here on purpose, so every caller picks up a change
|
|
90
|
+
automatically. Running this skill by hand is the same gate the write path runs,
|
|
91
|
+
not an approximation of it.
|
|
92
|
+
|
|
74
93
|
## Gates
|
|
75
94
|
|
|
76
95
|
Gates are grouped into **Specification** (spec-only checks, no GitHub lookups) and **Feasibility** (requires GitHub lookups). The dry-run path may opt to run Specification gates only via `--spec-only`; the write path runs both.
|
|
@@ -27,3 +27,20 @@ Pass through `lisa-github-validate-issue`'s structured output unchanged. Do not
|
|
|
27
27
|
- This skill is read-only. It never edits the issue, posts comments, or changes labels.
|
|
28
28
|
- If a gate fails, the recommendation is part of the validator's report; surface it as-is.
|
|
29
29
|
- The Validation Journey check (S11) parses the `## Validation Journey` markdown section — same parser logic as `lisa-github-add-journey` and `lisa-github-journey`.
|
|
30
|
+
|
|
31
|
+
## Comparison is semantic, never byte-exact
|
|
32
|
+
|
|
33
|
+
Re-run the validator against the live issue. Do NOT compare the stored body
|
|
34
|
+
against what was sent byte for byte.
|
|
35
|
+
|
|
36
|
+
The reason is measured rather than theoretical. Trackers normalize markdown on
|
|
37
|
+
write: `-` bullets become `*`, a bare URL is wrapped as `[url](<url>)`, bold
|
|
38
|
+
emphasis is re-segmented around inline code spans. All lossless, all
|
|
39
|
+
rendering-identical, and all of it makes a byte comparator report failure on a
|
|
40
|
+
write that was completely fine. A comparator that cannot tell vendor
|
|
41
|
+
normalization from corruption fails on healthy writes and trains its reader to
|
|
42
|
+
ignore it, which costs more than the check was ever worth.
|
|
43
|
+
|
|
44
|
+
Compare meaning: run `lisa-github-validate-issue` against the stored item and let the gates
|
|
45
|
+
decide. Where a single field must be compared directly, normalize both sides
|
|
46
|
+
first.
|
|
@@ -12,6 +12,41 @@ This skill is the GitHub counterpart of `lisa-jira-write-ticket`. The two skills
|
|
|
12
12
|
|
|
13
13
|
Repository name for scoped comments: `basename $(git rev-parse --show-toplevel)`.
|
|
14
14
|
|
|
15
|
+
## Writing by another path? The gates still apply
|
|
16
|
+
|
|
17
|
+
A team that talks to its tracker through its own script is doing a normal
|
|
18
|
+
thing — the script usually owns the credential plumbing, and Lisa neither
|
|
19
|
+
controls nor wants to control it. What that script does NOT get is either half
|
|
20
|
+
of this skill's quality gate, and nothing about the write says so.
|
|
21
|
+
|
|
22
|
+
**A read-back is not the missing check.** A bespoke path almost always re-reads
|
|
23
|
+
the issue after writing and confirms the tracker stored what was sent. That is
|
|
24
|
+
worth doing and it is not this. It proves TRANSPORT: the API accepted the
|
|
25
|
+
payload and the field values round-tripped. It cannot fail for the reason these
|
|
26
|
+
gates exist, because it never looks at whether what was sent was any good — a
|
|
27
|
+
issue with no acceptance criteria, no parent, and a human decision left sitting
|
|
28
|
+
in the middle of it round-trips perfectly. That is the dangerous half of the
|
|
29
|
+
shape: a failing control gets investigated, a misread one gets trusted.
|
|
30
|
+
|
|
31
|
+
So a write by any other path still owes both phases, and both run standalone
|
|
32
|
+
against an item that already exists:
|
|
33
|
+
|
|
34
|
+
| Phase | Skill | What it costs you |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| Pre-write validate | `lisa-github-validate-issue` | Run it on the draft before you send it |
|
|
37
|
+
| Post-write verify | `lisa-github-verify` | Run it on the live issue after you send it |
|
|
38
|
+
|
|
39
|
+
```text
|
|
40
|
+
Skill(lisa-github-validate-issue) with the draft issue, or with a reference to a live one
|
|
41
|
+
Skill(lisa-github-verify) with owner/repo#1234
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**These are plugin-resident skills invoked through the Skill tool.** They are
|
|
45
|
+
not shell scripts and will not appear in any repository's `scripts/` directory,
|
|
46
|
+
including yours. An agent that searches the repo it is standing in, finds
|
|
47
|
+
nothing, and concludes the capability is absent has made the one mistake that
|
|
48
|
+
turns a local script from the convenient option into the only one.
|
|
49
|
+
|
|
15
50
|
## Prerequisites
|
|
16
51
|
|
|
17
52
|
- `gh` CLI installed and authenticated (`gh auth status` must succeed). The skill never falls back to a different transport — if `gh` is unauthenticated, stop and surface the auth error.
|
|
@@ -68,6 +68,25 @@ prd_source: "https://notion.so/..." # set when the ticket was generated from
|
|
|
68
68
|
|
|
69
69
|
If the caller passes only a ticket key, fetch the ticket via `lisa-atlassian-access` `operation: read-ticket key: <KEY>`, derive the same fields from the fetched data — including `runtime_behavior_change` (derived from the `Target Backend Environment` declaration per `derived-branch-plan`, and authoritative over any caller assertion), `build_ready` (label set contains the resolved `READY_ROLE` — merged `jira.workflow.ready`, default `status:ready` — never a hard-coded label) and `child_refs` (sub-tasks plus `is blocked by` parentage, resolved as in `lisa-jira-read-ticket`) so S15 can classify the ticket — then run gates.
|
|
70
70
|
|
|
71
|
+
## Standalone use, against an item that already exists
|
|
72
|
+
|
|
73
|
+
This is a supported entry point, not only an internal step of a caller flow.
|
|
74
|
+
Point it at a live ticket and it fetches and validates the stored state:
|
|
75
|
+
|
|
76
|
+
```text
|
|
77
|
+
Skill(lisa-jira-validate-ticket) with PROJ-1234
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
Use it whenever the ticket reached the tracker by some path other than
|
|
81
|
+
`lisa-jira-write-ticket` — a team's own script, a workflow step, a cron, anything holding the
|
|
82
|
+
credentials but no skill runtime. Those paths get neither the pre-write nor the
|
|
83
|
+
post-write gate, and their own read-back substitutes for neither: a read-back
|
|
84
|
+
proves the tracker stored what was sent, never that what was sent was any good.
|
|
85
|
+
|
|
86
|
+
The gate definitions live here on purpose, so every caller picks up a change
|
|
87
|
+
automatically. Running this skill by hand is the same gate the write path runs,
|
|
88
|
+
not an approximation of it.
|
|
89
|
+
|
|
71
90
|
## Gates
|
|
72
91
|
|
|
73
92
|
Gates are grouped into **Specification** (spec-only checks, no JIRA lookups) and **Feasibility** (requires JIRA lookups). The dry-run path may opt to run Specification gates only; the write path runs both.
|
|
@@ -28,3 +28,20 @@ Pass through `lisa-jira-validate-ticket`'s structured output unchanged. Do not s
|
|
|
28
28
|
- This skill is read-only. It never edits the ticket, posts comments, or changes status.
|
|
29
29
|
- If a gate fails, the recommendation is part of the validator's report; surface it as-is.
|
|
30
30
|
- Validation Journey checks (S11) historically required a parser script (`parse-plan.py`); the parser logic now lives inside `lisa-jira-validate-ticket` so this skill no longer shells out to it.
|
|
31
|
+
|
|
32
|
+
## Comparison is semantic, never byte-exact
|
|
33
|
+
|
|
34
|
+
Re-run the validator against the live ticket. Do NOT compare the stored body
|
|
35
|
+
against what was sent byte for byte.
|
|
36
|
+
|
|
37
|
+
The reason is measured rather than theoretical. Trackers normalize markdown on
|
|
38
|
+
write: `-` bullets become `*`, a bare URL is wrapped as `[url](<url>)`, bold
|
|
39
|
+
emphasis is re-segmented around inline code spans. All lossless, all
|
|
40
|
+
rendering-identical, and all of it makes a byte comparator report failure on a
|
|
41
|
+
write that was completely fine. A comparator that cannot tell vendor
|
|
42
|
+
normalization from corruption fails on healthy writes and trains its reader to
|
|
43
|
+
ignore it, which costs more than the check was ever worth.
|
|
44
|
+
|
|
45
|
+
Compare meaning: run `lisa-jira-validate-ticket` against the stored item and let the gates
|
|
46
|
+
decide. Where a single field must be compared directly, normalize both sides
|
|
47
|
+
first.
|
|
@@ -12,6 +12,41 @@ Create or update a JIRA ticket with all required relationships, metadata, and qu
|
|
|
12
12
|
|
|
13
13
|
Repository name for scoped comments: `basename $(git rev-parse --show-toplevel)`.
|
|
14
14
|
|
|
15
|
+
## Writing by another path? The gates still apply
|
|
16
|
+
|
|
17
|
+
A team that talks to its tracker through its own script is doing a normal
|
|
18
|
+
thing — the script usually owns the credential plumbing, and Lisa neither
|
|
19
|
+
controls nor wants to control it. What that script does NOT get is either half
|
|
20
|
+
of this skill's quality gate, and nothing about the write says so.
|
|
21
|
+
|
|
22
|
+
**A read-back is not the missing check.** A bespoke path almost always re-reads
|
|
23
|
+
the ticket after writing and confirms the tracker stored what was sent. That is
|
|
24
|
+
worth doing and it is not this. It proves TRANSPORT: the API accepted the
|
|
25
|
+
payload and the field values round-tripped. It cannot fail for the reason these
|
|
26
|
+
gates exist, because it never looks at whether what was sent was any good — a
|
|
27
|
+
ticket with no acceptance criteria, no parent, and a human decision left sitting
|
|
28
|
+
in the middle of it round-trips perfectly. That is the dangerous half of the
|
|
29
|
+
shape: a failing control gets investigated, a misread one gets trusted.
|
|
30
|
+
|
|
31
|
+
So a write by any other path still owes both phases, and both run standalone
|
|
32
|
+
against an item that already exists:
|
|
33
|
+
|
|
34
|
+
| Phase | Skill | What it costs you |
|
|
35
|
+
|---|---|---|
|
|
36
|
+
| Pre-write validate | `lisa-jira-validate-ticket` | Run it on the draft before you send it |
|
|
37
|
+
| Post-write verify | `lisa-jira-verify` | Run it on the live ticket after you send it |
|
|
38
|
+
|
|
39
|
+
```text
|
|
40
|
+
Skill(lisa-jira-validate-ticket) with the draft ticket, or with a reference to a live one
|
|
41
|
+
Skill(lisa-jira-verify) with PROJ-1234
|
|
42
|
+
```
|
|
43
|
+
|
|
44
|
+
**These are plugin-resident skills invoked through the Skill tool.** They are
|
|
45
|
+
not shell scripts and will not appear in any repository's `scripts/` directory,
|
|
46
|
+
including yours. An agent that searches the repo it is standing in, finds
|
|
47
|
+
nothing, and concludes the capability is absent has made the one mistake that
|
|
48
|
+
turns a local script from the convenient option into the only one.
|
|
49
|
+
|
|
15
50
|
## Phase 1 — Resolve Intent
|
|
16
51
|
|
|
17
52
|
Determine from $ARGUMENTS and context whether this is a CREATE or UPDATE:
|
|
@@ -69,6 +69,25 @@ prd_source: "https://notion.so/..." # set when the Issue was generated from a
|
|
|
69
69
|
|
|
70
70
|
If the caller passes only an identifier, fetch the item via `lisa-linear-access operation: get-issue` (Issue) or `lisa-linear-access operation: get-project` (Project), derive the same fields from the fetched data — including `runtime_behavior_change` (derived from the `## Target Backend Environment` declaration per `derived-branch-plan`, and authoritative over any caller assertion), `build_ready` (the Issue's state is the configured `ready` state) and `child_refs` (sub-issues, project-member issues, plus `blocked_by` parentage, resolved as in `lisa-linear-read-issue`) so S15 can classify the item — then run gates.
|
|
71
71
|
|
|
72
|
+
## Standalone use, against an item that already exists
|
|
73
|
+
|
|
74
|
+
This is a supported entry point, not only an internal step of a caller flow.
|
|
75
|
+
Point it at a live issue and it fetches and validates the stored state:
|
|
76
|
+
|
|
77
|
+
```text
|
|
78
|
+
Skill(lisa-linear-validate-issue) with ENG-1234
|
|
79
|
+
```
|
|
80
|
+
|
|
81
|
+
Use it whenever the issue reached the tracker by some path other than
|
|
82
|
+
`lisa-linear-write-issue` — a team's own script, a workflow step, a cron, anything holding the
|
|
83
|
+
credentials but no skill runtime. Those paths get neither the pre-write nor the
|
|
84
|
+
post-write gate, and their own read-back substitutes for neither: a read-back
|
|
85
|
+
proves the tracker stored what was sent, never that what was sent was any good.
|
|
86
|
+
|
|
87
|
+
The gate definitions live here on purpose, so every caller picks up a change
|
|
88
|
+
automatically. Running this skill by hand is the same gate the write path runs,
|
|
89
|
+
not an approximation of it.
|
|
90
|
+
|
|
72
91
|
## Gates
|
|
73
92
|
|
|
74
93
|
Gates are grouped into **Specification** (spec-only checks, no Linear lookups) and **Feasibility** (requires Linear lookups). The dry-run path may opt to run Specification gates only; the write path runs both.
|
|
@@ -49,3 +49,20 @@ If the verdict is `FAIL`, the caller should fix the item and re-run verify. Neve
|
|
|
49
49
|
- Never write to Linear. Read-only.
|
|
50
50
|
- Never short-circuit the validator. Always run the full gate set.
|
|
51
51
|
- If `get_issue` / `get_project` returns an access error, surface it and exit — don't pretend the item is fine.
|
|
52
|
+
|
|
53
|
+
## Comparison is semantic, never byte-exact
|
|
54
|
+
|
|
55
|
+
Re-run the validator against the live issue. Do NOT compare the stored body
|
|
56
|
+
against what was sent byte for byte.
|
|
57
|
+
|
|
58
|
+
The reason is measured rather than theoretical. Trackers normalize markdown on
|
|
59
|
+
write: `-` bullets become `*`, a bare URL is wrapped as `[url](<url>)`, bold
|
|
60
|
+
emphasis is re-segmented around inline code spans. All lossless, all
|
|
61
|
+
rendering-identical, and all of it makes a byte comparator report failure on a
|
|
62
|
+
write that was completely fine. A comparator that cannot tell vendor
|
|
63
|
+
normalization from corruption fails on healthy writes and trains its reader to
|
|
64
|
+
ignore it, which costs more than the check was ever worth.
|
|
65
|
+
|
|
66
|
+
Compare meaning: run `lisa-linear-validate-issue` against the stored item and let the gates
|
|
67
|
+
decide. Where a single field must be compared directly, normalize both sides
|
|
68
|
+
first.
|
|
@@ -33,6 +33,41 @@ Linear's data model maps Epic / Story / Sub-task to **different entity types**.
|
|
|
33
33
|
|
|
34
34
|
The build lifecycle uses native **workflow states** (`Ready`, `In Progress`, `Blocked`, `On Dev`, `On Stg`, `Done`, plus an optional review state a project may bind), resolved per role from `linear.workflow` — see "Why Linear uses states, not labels" in `config-resolution`. A new **leaf** work unit is created in the configured `ready` state only on explicit `build_ready: true`; omitted or `false` leaves it in the team's default backlog state, and a container is never put in `ready` at all (see the Build-ready control input below).
|
|
35
35
|
|
|
36
|
+
## Writing by another path? The gates still apply
|
|
37
|
+
|
|
38
|
+
A team that talks to its tracker through its own script is doing a normal
|
|
39
|
+
thing — the script usually owns the credential plumbing, and Lisa neither
|
|
40
|
+
controls nor wants to control it. What that script does NOT get is either half
|
|
41
|
+
of this skill's quality gate, and nothing about the write says so.
|
|
42
|
+
|
|
43
|
+
**A read-back is not the missing check.** A bespoke path almost always re-reads
|
|
44
|
+
the issue after writing and confirms the tracker stored what was sent. That is
|
|
45
|
+
worth doing and it is not this. It proves TRANSPORT: the API accepted the
|
|
46
|
+
payload and the field values round-tripped. It cannot fail for the reason these
|
|
47
|
+
gates exist, because it never looks at whether what was sent was any good — a
|
|
48
|
+
issue with no acceptance criteria, no parent, and a human decision left sitting
|
|
49
|
+
in the middle of it round-trips perfectly. That is the dangerous half of the
|
|
50
|
+
shape: a failing control gets investigated, a misread one gets trusted.
|
|
51
|
+
|
|
52
|
+
So a write by any other path still owes both phases, and both run standalone
|
|
53
|
+
against an item that already exists:
|
|
54
|
+
|
|
55
|
+
| Phase | Skill | What it costs you |
|
|
56
|
+
|---|---|---|
|
|
57
|
+
| Pre-write validate | `lisa-linear-validate-issue` | Run it on the draft before you send it |
|
|
58
|
+
| Post-write verify | `lisa-linear-verify` | Run it on the live issue after you send it |
|
|
59
|
+
|
|
60
|
+
```text
|
|
61
|
+
Skill(lisa-linear-validate-issue) with the draft issue, or with a reference to a live one
|
|
62
|
+
Skill(lisa-linear-verify) with ENG-1234
|
|
63
|
+
```
|
|
64
|
+
|
|
65
|
+
**These are plugin-resident skills invoked through the Skill tool.** They are
|
|
66
|
+
not shell scripts and will not appear in any repository's `scripts/` directory,
|
|
67
|
+
including yours. An agent that searches the repo it is standing in, finds
|
|
68
|
+
nothing, and concludes the capability is absent has made the one mistake that
|
|
69
|
+
turns a local script from the convenient option into the only one.
|
|
70
|
+
|
|
36
71
|
## Phase 1 — Resolve Intent
|
|
37
72
|
|
|
38
73
|
Determine from `$ARGUMENTS` and context whether this is a CREATE or UPDATE:
|
|
@@ -71,6 +71,25 @@ prd_source: "https://notion.so/..." # set when the issue was generated from a
|
|
|
71
71
|
|
|
72
72
|
If the caller passes only an issue ref, fetch via `gh issue view <number> --repo <org>/<repo> --json number,title,body,labels,state,milestone,assignees`, parse the body sections, derive the spec fields — including `runtime_behavior_change`, derived from the `## Target Backend Environment` declaration per `derived-branch-plan` and authoritative over any caller assertion — then run gates. The parser lives in `lisa-github-read-issue` (composition).
|
|
73
73
|
|
|
74
|
+
## Standalone use, against an item that already exists
|
|
75
|
+
|
|
76
|
+
This is a supported entry point, not only an internal step of a caller flow.
|
|
77
|
+
Point it at a live issue and it fetches and validates the stored state:
|
|
78
|
+
|
|
79
|
+
```text
|
|
80
|
+
Skill(lisa-github-validate-issue) with owner/repo#1234
|
|
81
|
+
```
|
|
82
|
+
|
|
83
|
+
Use it whenever the issue reached the tracker by some path other than
|
|
84
|
+
`lisa-github-write-issue` — a team's own script, a workflow step, a cron, anything holding the
|
|
85
|
+
credentials but no skill runtime. Those paths get neither the pre-write nor the
|
|
86
|
+
post-write gate, and their own read-back substitutes for neither: a read-back
|
|
87
|
+
proves the tracker stored what was sent, never that what was sent was any good.
|
|
88
|
+
|
|
89
|
+
The gate definitions live here on purpose, so every caller picks up a change
|
|
90
|
+
automatically. Running this skill by hand is the same gate the write path runs,
|
|
91
|
+
not an approximation of it.
|
|
92
|
+
|
|
74
93
|
## Gates
|
|
75
94
|
|
|
76
95
|
Gates are grouped into **Specification** (spec-only checks, no GitHub lookups) and **Feasibility** (requires GitHub lookups). The dry-run path may opt to run Specification gates only via `--spec-only`; the write path runs both.
|