@codyswann/lisa 4.54.5 → 4.54.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (114) hide show
  1. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  2. package/dist/core/lisa-owned-hash-ledger.js +8 -0
  3. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  4. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  5. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  6. package/dist/core/upstream-evidence-manifest.js +13 -11
  7. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  8. package/package.json +4 -4
  9. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  10. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  11. package/plugins/lisa/.codex-plugin/skills/lisa-github-validate-issue/SKILL.md +19 -0
  12. package/plugins/lisa/.codex-plugin/skills/lisa-github-verify/SKILL.md +17 -0
  13. package/plugins/lisa/.codex-plugin/skills/lisa-github-write-issue/SKILL.md +35 -0
  14. package/plugins/lisa/.codex-plugin/skills/lisa-jira-validate-ticket/SKILL.md +19 -0
  15. package/plugins/lisa/.codex-plugin/skills/lisa-jira-verify/SKILL.md +17 -0
  16. package/plugins/lisa/.codex-plugin/skills/lisa-jira-write-ticket/SKILL.md +35 -0
  17. package/plugins/lisa/.codex-plugin/skills/lisa-linear-validate-issue/SKILL.md +19 -0
  18. package/plugins/lisa/.codex-plugin/skills/lisa-linear-verify/SKILL.md +17 -0
  19. package/plugins/lisa/.codex-plugin/skills/lisa-linear-write-issue/SKILL.md +35 -0
  20. package/plugins/lisa/skills/lisa-github-validate-issue/SKILL.md +19 -0
  21. package/plugins/lisa/skills/lisa-github-verify/SKILL.md +17 -0
  22. package/plugins/lisa/skills/lisa-github-write-issue/SKILL.md +35 -0
  23. package/plugins/lisa/skills/lisa-jira-validate-ticket/SKILL.md +19 -0
  24. package/plugins/lisa/skills/lisa-jira-verify/SKILL.md +17 -0
  25. package/plugins/lisa/skills/lisa-jira-write-ticket/SKILL.md +35 -0
  26. package/plugins/lisa/skills/lisa-linear-validate-issue/SKILL.md +19 -0
  27. package/plugins/lisa/skills/lisa-linear-verify/SKILL.md +17 -0
  28. package/plugins/lisa/skills/lisa-linear-write-issue/SKILL.md +35 -0
  29. package/plugins/lisa-agy/plugin.json +1 -1
  30. package/plugins/lisa-agy/skills/lisa-github-validate-issue/SKILL.md +19 -0
  31. package/plugins/lisa-agy/skills/lisa-github-verify/SKILL.md +17 -0
  32. package/plugins/lisa-agy/skills/lisa-github-write-issue/SKILL.md +35 -0
  33. package/plugins/lisa-agy/skills/lisa-jira-validate-ticket/SKILL.md +19 -0
  34. package/plugins/lisa-agy/skills/lisa-jira-verify/SKILL.md +17 -0
  35. package/plugins/lisa-agy/skills/lisa-jira-write-ticket/SKILL.md +35 -0
  36. package/plugins/lisa-agy/skills/lisa-linear-validate-issue/SKILL.md +19 -0
  37. package/plugins/lisa-agy/skills/lisa-linear-verify/SKILL.md +17 -0
  38. package/plugins/lisa-agy/skills/lisa-linear-write-issue/SKILL.md +35 -0
  39. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  41. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  42. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-copilot/skills/lisa-github-validate-issue/SKILL.md +19 -0
  46. package/plugins/lisa-copilot/skills/lisa-github-verify/SKILL.md +17 -0
  47. package/plugins/lisa-copilot/skills/lisa-github-write-issue/SKILL.md +35 -0
  48. package/plugins/lisa-copilot/skills/lisa-jira-validate-ticket/SKILL.md +19 -0
  49. package/plugins/lisa-copilot/skills/lisa-jira-verify/SKILL.md +17 -0
  50. package/plugins/lisa-copilot/skills/lisa-jira-write-ticket/SKILL.md +35 -0
  51. package/plugins/lisa-copilot/skills/lisa-linear-validate-issue/SKILL.md +19 -0
  52. package/plugins/lisa-copilot/skills/lisa-linear-verify/SKILL.md +17 -0
  53. package/plugins/lisa-copilot/skills/lisa-linear-write-issue/SKILL.md +35 -0
  54. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-cursor/skills/lisa-github-validate-issue/SKILL.md +19 -0
  56. package/plugins/lisa-cursor/skills/lisa-github-verify/SKILL.md +17 -0
  57. package/plugins/lisa-cursor/skills/lisa-github-write-issue/SKILL.md +35 -0
  58. package/plugins/lisa-cursor/skills/lisa-jira-validate-ticket/SKILL.md +19 -0
  59. package/plugins/lisa-cursor/skills/lisa-jira-verify/SKILL.md +17 -0
  60. package/plugins/lisa-cursor/skills/lisa-jira-write-ticket/SKILL.md +35 -0
  61. package/plugins/lisa-cursor/skills/lisa-linear-validate-issue/SKILL.md +19 -0
  62. package/plugins/lisa-cursor/skills/lisa-linear-verify/SKILL.md +17 -0
  63. package/plugins/lisa-cursor/skills/lisa-linear-write-issue/SKILL.md +35 -0
  64. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  66. package/plugins/lisa-expo-agy/plugin.json +1 -1
  67. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  71. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  72. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  74. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  76. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  77. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  79. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  80. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  81. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  82. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  83. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  84. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  85. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  86. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  87. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  88. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  89. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  90. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  91. package/plugins/lisa-rails-agy/plugin.json +1 -1
  92. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  93. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  94. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  95. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  96. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  97. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  98. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  99. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  100. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  101. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  102. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  103. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  104. package/plugins/src/base/skills/lisa-github-validate-issue/SKILL.md +19 -0
  105. package/plugins/src/base/skills/lisa-github-verify/SKILL.md +17 -0
  106. package/plugins/src/base/skills/lisa-github-write-issue/SKILL.md +35 -0
  107. package/plugins/src/base/skills/lisa-jira-validate-ticket/SKILL.md +19 -0
  108. package/plugins/src/base/skills/lisa-jira-verify/SKILL.md +17 -0
  109. package/plugins/src/base/skills/lisa-jira-write-ticket/SKILL.md +35 -0
  110. package/plugins/src/base/skills/lisa-linear-validate-issue/SKILL.md +19 -0
  111. package/plugins/src/base/skills/lisa-linear-verify/SKILL.md +17 -0
  112. package/plugins/src/base/skills/lisa-linear-write-issue/SKILL.md +35 -0
  113. package/typescript/copy-overwrite/scripts/check-skipped-required-checks.mjs +326 -16
  114. 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.5",
184
+ "version": "4.54.6",
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": "4a1f31779616e3485d28843387ee06e3bccd8888",
333
- "gitHead": "4a1f31779616e3485d28843387ee06e3bccd8888",
334
- "lisaReleaseTag": "v4.54.5"
332
+ "lisaReleaseCommit": "1d372a92f2f3ff23f6ecce9d09f14548b89ba609",
333
+ "gitHead": "1d372a92f2f3ff23f6ecce9d09f14548b89ba609",
334
+ "lisaReleaseTag": "v4.54.6"
335
335
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.54.5",
3
+ "version": "4.54.6",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.54.5",
3
+ "version": "4.54.6",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -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:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.54.5",
3
+ "version": "4.54.6",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -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.