@codyswann/lisa 2.222.2 → 2.223.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (121) hide show
  1. package/dist/opencode/hooks-installer.d.ts.map +1 -1
  2. package/dist/opencode/hooks-installer.js +23 -2
  3. package/dist/opencode/hooks-installer.js.map +1 -1
  4. package/dist/opencode/plugin-templates/lisa-parity-safety-net.ts +43 -0
  5. package/dist/opencode/plugin-templates/parity-safety-net-heredoc.py +417 -0
  6. package/dist/opencode/plugin-templates/parity-safety-net.sh +155 -0
  7. package/dist/opencode/support-file-resolver.d.ts +8 -0
  8. package/dist/opencode/support-file-resolver.d.ts.map +1 -0
  9. package/dist/opencode/support-file-resolver.js +16 -0
  10. package/dist/opencode/support-file-resolver.js.map +1 -0
  11. package/package.json +1 -1
  12. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  13. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  14. package/plugins/lisa/.codex-plugin/skills/lisa-github-add-journey/SKILL.md +4 -3
  15. package/plugins/lisa/.codex-plugin/skills/lisa-github-validate-issue/SKILL.md +3 -1
  16. package/plugins/lisa/.codex-plugin/skills/lisa-jira-add-journey/SKILL.md +4 -3
  17. package/plugins/lisa/.codex-plugin/skills/lisa-jira-validate-ticket/SKILL.md +3 -1
  18. package/plugins/lisa/.codex-plugin/skills/lisa-linear-add-journey/SKILL.md +4 -3
  19. package/plugins/lisa/.codex-plugin/skills/lisa-linear-validate-issue/SKILL.md +3 -1
  20. package/plugins/lisa/hooks/parity-safety-net-heredoc.py +417 -0
  21. package/plugins/lisa/hooks/parity-safety-net.agy.sh +50 -0
  22. package/plugins/lisa/hooks/parity-safety-net.sh +33 -51
  23. package/plugins/lisa/rules/eager/verification.md +1 -1
  24. package/plugins/lisa/rules/reference/verification.md +8 -0
  25. package/plugins/lisa/skills/lisa-github-add-journey/SKILL.md +4 -3
  26. package/plugins/lisa/skills/lisa-github-validate-issue/SKILL.md +3 -1
  27. package/plugins/lisa/skills/lisa-jira-add-journey/SKILL.md +4 -3
  28. package/plugins/lisa/skills/lisa-jira-validate-ticket/SKILL.md +3 -1
  29. package/plugins/lisa/skills/lisa-linear-add-journey/SKILL.md +4 -3
  30. package/plugins/lisa/skills/lisa-linear-validate-issue/SKILL.md +3 -1
  31. package/plugins/lisa-agy/hooks/parity-safety-net-heredoc.py +417 -0
  32. package/plugins/lisa-agy/hooks/parity-safety-net.agy.sh +50 -0
  33. package/plugins/lisa-agy/hooks/parity-safety-net.sh +155 -0
  34. package/plugins/lisa-agy/hooks.json +13 -0
  35. package/plugins/lisa-agy/plugin.json +1 -1
  36. package/plugins/lisa-agy/skills/lisa-github-add-journey/SKILL.md +4 -3
  37. package/plugins/lisa-agy/skills/lisa-github-validate-issue/SKILL.md +3 -1
  38. package/plugins/lisa-agy/skills/lisa-jira-add-journey/SKILL.md +4 -3
  39. package/plugins/lisa-agy/skills/lisa-jira-validate-ticket/SKILL.md +3 -1
  40. package/plugins/lisa-agy/skills/lisa-linear-add-journey/SKILL.md +4 -3
  41. package/plugins/lisa-agy/skills/lisa-linear-validate-issue/SKILL.md +3 -1
  42. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  44. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  45. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  47. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-copilot/hooks/parity-safety-net-heredoc.py +417 -0
  49. package/plugins/lisa-copilot/hooks/parity-safety-net.sh +33 -51
  50. package/plugins/lisa-copilot/rules/eager/verification.md +1 -1
  51. package/plugins/lisa-copilot/rules/reference/verification.md +8 -0
  52. package/plugins/lisa-copilot/skills/lisa-github-add-journey/SKILL.md +4 -3
  53. package/plugins/lisa-copilot/skills/lisa-github-validate-issue/SKILL.md +3 -1
  54. package/plugins/lisa-copilot/skills/lisa-jira-add-journey/SKILL.md +4 -3
  55. package/plugins/lisa-copilot/skills/lisa-jira-validate-ticket/SKILL.md +3 -1
  56. package/plugins/lisa-copilot/skills/lisa-linear-add-journey/SKILL.md +4 -3
  57. package/plugins/lisa-copilot/skills/lisa-linear-validate-issue/SKILL.md +3 -1
  58. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-cursor/hooks/parity-safety-net-heredoc.py +417 -0
  60. package/plugins/lisa-cursor/hooks/parity-safety-net.sh +33 -51
  61. package/plugins/lisa-cursor/rules/verification-reference.mdc +8 -0
  62. package/plugins/lisa-cursor/rules/verification.mdc +1 -1
  63. package/plugins/lisa-cursor/skills/lisa-github-add-journey/SKILL.md +4 -3
  64. package/plugins/lisa-cursor/skills/lisa-github-validate-issue/SKILL.md +3 -1
  65. package/plugins/lisa-cursor/skills/lisa-jira-add-journey/SKILL.md +4 -3
  66. package/plugins/lisa-cursor/skills/lisa-jira-validate-ticket/SKILL.md +3 -1
  67. package/plugins/lisa-cursor/skills/lisa-linear-add-journey/SKILL.md +4 -3
  68. package/plugins/lisa-cursor/skills/lisa-linear-validate-issue/SKILL.md +3 -1
  69. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  71. package/plugins/lisa-expo-agy/plugin.json +1 -1
  72. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  74. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  76. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  77. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  79. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  80. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  81. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  82. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  83. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  84. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  85. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  86. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  87. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  88. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  89. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  90. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  91. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  92. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  93. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  94. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  95. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  96. package/plugins/lisa-rails-agy/plugin.json +1 -1
  97. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  98. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  99. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  100. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  101. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  102. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  103. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  104. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  105. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  106. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  107. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  108. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  109. package/plugins/src/base/hooks/parity-safety-net-heredoc.py +417 -0
  110. package/plugins/src/base/hooks/parity-safety-net.agy.sh +50 -0
  111. package/plugins/src/base/hooks/parity-safety-net.sh +33 -51
  112. package/plugins/src/base/rules/eager/verification.md +1 -1
  113. package/plugins/src/base/rules/reference/verification.md +8 -0
  114. package/plugins/src/base/skills/lisa-github-add-journey/SKILL.md +4 -3
  115. package/plugins/src/base/skills/lisa-github-validate-issue/SKILL.md +3 -1
  116. package/plugins/src/base/skills/lisa-jira-add-journey/SKILL.md +4 -3
  117. package/plugins/src/base/skills/lisa-jira-validate-ticket/SKILL.md +3 -1
  118. package/plugins/src/base/skills/lisa-linear-add-journey/SKILL.md +4 -3
  119. package/plugins/src/base/skills/lisa-linear-validate-issue/SKILL.md +3 -1
  120. package/scripts/copy-opencode-plugin-templates.mjs +12 -0
  121. package/scripts/generate-agy-plugin-artifacts.mjs +24 -10
@@ -0,0 +1,155 @@
1
+ #!/usr/bin/env bash
2
+ # PreToolUse hook for Bash: a safety net that blocks destructive shell commands
3
+ # before they run. Lisa-native reimplementation of the upstream
4
+ # `safety-net@cc-marketplace` plugin's PreToolUse Bash-guard (parity work, issue
5
+ # #1059). It does NOT port upstream code — it re-expresses the behavior in Lisa's
6
+ # hook conventions, modeled on block-no-verify.sh.
7
+ #
8
+ # It reads the hook stdin JSON, inspects the proposed Bash command, and EXITS
9
+ # NON-ZERO (2) to BLOCK when a known-destructive pattern matches:
10
+ # - `rm -rf /` (recursive forced delete of a root / home / wildcard path)
11
+ # - force-pushing a protected branch (main/master/production/release)
12
+ # - `git reset --hard` while the working tree is dirty (would discard work)
13
+ # - dropping or truncating a database/schema/table
14
+ # Otherwise it exits 0 and the command proceeds.
15
+ #
16
+ # Operators extend the built-in rules with a project-local rule file — one
17
+ # extended-regex (ERE) per line, blank lines and `#` comments ignored — managed
18
+ # by the parity-safety-net-rules skill. Default location (overridable via
19
+ # SAFETY_NET_RULES_FILE):
20
+ # ${CLAUDE_PROJECT_DIR:-$PWD}/.claude/safety-net-rules.txt
21
+ set -euo pipefail
22
+
23
+ input="$(cat)"
24
+
25
+ tool_name="$(printf '%s' "$input" | jq -r '.tool_name // empty')"
26
+ if [ "$tool_name" != "Bash" ]; then
27
+ exit 0
28
+ fi
29
+
30
+ command_str="$(printf '%s' "$input" | jq -r '.tool_input.command // empty')"
31
+ if [ -z "$command_str" ]; then
32
+ exit 0
33
+ fi
34
+
35
+ # block() prints the reason to stderr (surfaced to the model) and exits 2 so the
36
+ # Bash tool call is denied. $1 = human-readable reason for the block.
37
+ block() {
38
+ cat >&2 <<EOF
39
+ Blocked by safety-net: $1
40
+
41
+ This command matched a destructive-operation guard. If it is genuinely safe and
42
+ intentional, ask the user to confirm, then run it manually outside the agent, or
43
+ narrow the command so it no longer matches the guard.
44
+ EOF
45
+ exit 2
46
+ }
47
+
48
+ # Heredoc payloads are data only for a deliberately narrow set of GitHub CLI
49
+ # write commands. A companion parser proves that shape before removing payload
50
+ # text from the destructive-command scans below. Unknown executable heredocs
51
+ # remain visible to every built-in and custom rule. Ambiguous or malformed
52
+ # heredocs fail closed instead of guessing which text the shell would execute.
53
+ command_for_guards="$command_str"
54
+ case "$command_str" in
55
+ *'<<'*)
56
+ hook_dir="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
57
+ heredoc_parser="$hook_dir/parity-safety-net-heredoc.py"
58
+ if ! command -v python3 >/dev/null 2>&1 || [ ! -r "$heredoc_parser" ]; then
59
+ block "cannot safely classify heredoc command because its parser runtime is unavailable"
60
+ fi
61
+ if ! printf '%s\n' "$command_str" | /bin/bash -n >/dev/null 2>&1; then
62
+ block "malformed heredoc command failed shell syntax validation"
63
+ fi
64
+
65
+ parser_status=0
66
+ if parser_output="$(printf '%s' "$command_str" | python3 "$heredoc_parser" 2>/dev/null)"; then
67
+ parser_status=0
68
+ else
69
+ parser_status=$?
70
+ fi
71
+
72
+ case "$parser_status" in
73
+ 0) command_for_guards="$parser_output" ;;
74
+ 10) command_for_guards="$command_str" ;;
75
+ 20) block "malformed or ambiguous heredoc command cannot be safely classified" ;;
76
+ *) block "heredoc parser failed; command was denied fail-closed" ;;
77
+ esac
78
+ ;;
79
+ esac
80
+
81
+ # 1. Recursive forced delete (`rm -rf`) of a filesystem root, home, or top-level
82
+ # wildcard. Two gates ANDed: the command must invoke `rm` with BOTH a
83
+ # recursive and a force flag, AND name a catastrophic target. Splitting the
84
+ # flag check from the target check keeps each regex legible and testable.
85
+ if printf '%s' "$command_for_guards" \
86
+ | grep -Eiq '(^|[^[:alnum:]_./-])rm([[:space:]]+-[[:alnum:]-]+)*[[:space:]]+(-[[:alnum:]]*r[[:alnum:]]*f|-[[:alnum:]]*f[[:alnum:]]*r)([[:space:]]|$)' \
87
+ || printf '%s' "$command_for_guards" \
88
+ | grep -Eiq '(^|[^[:alnum:]_./-])rm[[:space:]].*(-r\b.*[[:space:]]-f\b|-f\b.*[[:space:]]-r\b|--recursive\b.*--force\b|--force\b.*--recursive\b)'; then
89
+ if printf '%s' "$command_for_guards" \
90
+ | grep -Eq '([[:space:]]|=)(/|/\*|/\.\*?|~|~/\*?|\$HOME\b|\$\{HOME\}|\*)([[:space:]]|/?\*?$)'; then
91
+ block "recursive forced delete of a root, home, or wildcard path (rm -rf)"
92
+ fi
93
+ fi
94
+
95
+ # 2. Force-pushing a protected branch. `--force-with-lease` is the safe,
96
+ # non-clobbering alternative and is intentionally NOT blocked.
97
+ #
98
+ # The force flag AND the protected-branch name must appear in the SAME
99
+ # `git push` statement. Checking them independently over the whole command is
100
+ # a false-positive magnet: an unrelated `-f` (a `[ -f file ]` test, `rm -f`,
101
+ # `grep -f`, `tail -f`) plus an unrelated protected name (`--base main`,
102
+ # `origin/main`, `git fetch origin main`) alongside any feature-branch
103
+ # `git push` would wrongly block. So split the command into statements
104
+ # (`;`, `&&`, `||`, `|`, newlines), keep only the `git push` segments, and
105
+ # inspect each in isolation — a real `git push --force origin main` still
106
+ # matches, while a feature-branch push next to `[ -f ]`/`--base main` passes.
107
+ # Normalize bash line-continuations (a trailing backslash + newline → space)
108
+ # before segmenting the command. Without this, "git push --force origin
109
+ # \<newline>main" splits into a segment matching --force but not `main`, letting a
110
+ # protected force-push slip past. Uses awk (POSIX) instead of a GNU-only
111
+ # `sed ':a;N;$!ba;…'`, which errors on BSD sed (macOS) and there silently no-ops.
112
+ normalized_command_str="$(printf '%s' "$command_for_guards" \
113
+ | awk '{ if (sub(/\\$/, "")) printf "%s ", $0; else print }')"
114
+
115
+ while IFS= read -r push_stmt; do
116
+ if printf '%s' "$push_stmt" \
117
+ | grep -Eiq '(--force([[:space:]]|=|$)|[[:space:]]-f([[:space:]]|$))' \
118
+ && ! printf '%s' "$push_stmt" | grep -Eiq -- '--force-with-lease' \
119
+ && printf '%s' "$push_stmt" \
120
+ | grep -Eiq '(^|[^[:alnum:]_/-])(main|master|production|prod|release)([^[:alnum:]_/-]|$)'; then
121
+ block "force-pushing a protected branch (use --force-with-lease, or push a feature branch)"
122
+ fi
123
+ done < <(printf '%s' "$normalized_command_str" | tr '&|;' '\n' \
124
+ | grep -Ei '(^|[^[:alnum:]_-])git[[:space:]]+push\b')
125
+
126
+ # 3. `git reset --hard` while the working tree has uncommitted changes — this
127
+ # silently discards them. Only blocks when the tree is actually dirty, so a
128
+ # clean-tree reset (a legitimate workflow) still passes.
129
+ if printf '%s' "$command_for_guards" | grep -Eiq '(^|[^[:alnum:]_-])git[[:space:]]+reset\b.*--hard\b'; then
130
+ if git rev-parse --is-inside-work-tree >/dev/null 2>&1 \
131
+ && [ -n "$(git status --porcelain 2>/dev/null)" ]; then
132
+ block "git reset --hard on a dirty working tree would discard uncommitted changes (stash or commit first)"
133
+ fi
134
+ fi
135
+
136
+ # 4. Dropping or truncating a database / schema / table.
137
+ if printf '%s' "$command_for_guards" \
138
+ | grep -Eiq '\b(drop[[:space:]]+(database|schema|table)|truncate[[:space:]]+(table[[:space:]]+)?[[:alnum:]_."`]+)\b'; then
139
+ block "destructive SQL (DROP/TRUNCATE) detected"
140
+ fi
141
+
142
+ # 5. Project-local custom rules. Each non-comment line is an ERE; a match blocks.
143
+ rules_file="${SAFETY_NET_RULES_FILE:-${CLAUDE_PROJECT_DIR:-$PWD}/.claude/safety-net-rules.txt}"
144
+ if [ -f "$rules_file" ]; then
145
+ while IFS= read -r rule || [ -n "$rule" ]; do
146
+ case "$rule" in
147
+ '' | '#'*) continue ;;
148
+ esac
149
+ if printf '%s' "$command_for_guards" | grep -Eiq -- "$rule"; then
150
+ block "matched a project custom safety rule (${rules_file##*/}): $rule"
151
+ fi
152
+ done <"$rules_file"
153
+ fi
154
+
155
+ exit 0
@@ -0,0 +1,8 @@
1
+ /**
2
+ * Resolve an OpenCode support file in source checkouts and built packages.
3
+ * @param moduleUrl URL of the calling installer module.
4
+ * @param filename Canonical support-file basename.
5
+ * @returns Absolute path to the source or bundled copy.
6
+ */
7
+ export declare function resolveSupportFile(moduleUrl: string, filename: string): string;
8
+ //# sourceMappingURL=support-file-resolver.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"support-file-resolver.d.ts","sourceRoot":"","sources":["../../src/opencode/support-file-resolver.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAChC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,GACf,MAAM,CAcR"}
@@ -0,0 +1,16 @@
1
+ import * as path from "node:path";
2
+ import { fileURLToPath } from "node:url";
3
+ /**
4
+ * Resolve an OpenCode support file in source checkouts and built packages.
5
+ * @param moduleUrl URL of the calling installer module.
6
+ * @param filename Canonical support-file basename.
7
+ * @returns Absolute path to the source or bundled copy.
8
+ */
9
+ export function resolveSupportFile(moduleUrl, filename) {
10
+ const moduleDir = path.dirname(fileURLToPath(moduleUrl));
11
+ const bundled = path.join(moduleDir, "plugin-templates", filename);
12
+ if (path.basename(path.dirname(moduleDir)) === "dist")
13
+ return bundled;
14
+ return path.resolve(moduleDir, "..", "..", "plugins", "src", "base", "hooks", filename);
15
+ }
16
+ //# sourceMappingURL=support-file-resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"support-file-resolver.js","sourceRoot":"","sources":["../../src/opencode/support-file-resolver.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAEzC;;;;;GAKG;AACH,MAAM,UAAU,kBAAkB,CAChC,SAAiB,EACjB,QAAgB;IAEhB,MAAM,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC,CAAC;IACzD,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,kBAAkB,EAAE,QAAQ,CAAC,CAAC;IACnE,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC,KAAK,MAAM;QAAE,OAAO,OAAO,CAAC;IACtE,OAAO,IAAI,CAAC,OAAO,CACjB,SAAS,EACT,IAAI,EACJ,IAAI,EACJ,SAAS,EACT,KAAK,EACL,MAAM,EACN,OAAO,EACP,QAAQ,CACT,CAAC;AACJ,CAAC"}
package/package.json CHANGED
@@ -102,7 +102,7 @@
102
102
  "form-data": ">=4.0.6"
103
103
  },
104
104
  "name": "@codyswann/lisa",
105
- "version": "2.222.2",
105
+ "version": "2.223.0",
106
106
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
107
107
  "main": "dist/index.js",
108
108
  "exports": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "2.222.2",
3
+ "version": "2.223.0",
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": "2.222.2",
3
+ "version": "2.223.0",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -83,9 +83,10 @@ Compose the journey with typed `[EVIDENCE: <artifact-type>: <name>]` markers at
83
83
  2. **Concrete, runnable steps** — `Run \`curl -s localhost:3000/health | jq .status\`` not "Check the endpoint".
84
84
  3. **Include environment setup** — Database connection, running services, env vars.
85
85
  4. **Markers are typed artifacts, not assertion labels** — `[EVIDENCE: <artifact-type>: <kebab-name>]`. `[EVIDENCE: load-failure-handled-gracefully]` names a claim with nothing to capture; write `[EVIDENCE: screenshot: load-failure-error-state]` or `[EVIDENCE: perf-trace: pipeline-load-tti]`. Names are kebab-case and unique within the ticket.
86
- 5. **Assertions are measurable** — `Returns 200 with {status: ok}` not "API works correctly".
87
- 6. **Cover happy path AND error path** — At minimum, one success and one failure marker.
88
- 7. **On a leaf work unit, the markers are binding** — For a Bug / Task / Sub-task / Improvement, every typed `[EVIDENCE: <artifact-type>: <name>]` here is the issue's evidence manifest: validation gate S14 requires at least one, and the issue cannot be closed until each named artifact is captured **in its declared type** and attached (see the "Per-Work-Unit Evidence Contract" in the `verification` rule). Name only evidence you intend to capture — and name all of it.
86
+ 5. **Cross-ticket references are non-binding** — If the journey needs to mention another issue's artifact, use `[EVIDENCE-REF: <tracker-ref>: <artifact-type>: <kebab-name>]` (for example, `[EVIDENCE-REF: #123: cli-output: upstream-contract-pass]`). Do not paste a sibling issue's `[EVIDENCE: ...]` marker into this issue; S14 treats `[EVIDENCE: ...]` as this issue's own manifest and ignores `EVIDENCE-REF`.
87
+ 6. **Assertions are measurable** — `Returns 200 with {status: ok}` not "API works correctly".
88
+ 7. **Cover happy path AND error path** — At minimum, one success and one failure marker.
89
+ 8. **On a leaf work unit, the markers are binding** — For a Bug / Task / Sub-task / Improvement, every typed `[EVIDENCE: <artifact-type>: <name>]` here is the issue's evidence manifest: validation gate S14 requires at least one, and the issue cannot be closed until each named artifact is captured **in its declared type** and attached (see the "Per-Work-Unit Evidence Contract" in the `verification` rule). Name only evidence you intend to capture — and name all of it; `EVIDENCE-REF` never satisfies or extends the manifest.
89
90
 
90
91
  ### Step 6: Present to User for Approval
91
92
 
@@ -205,9 +205,11 @@ Each marker must satisfy ALL of:
205
205
  - `<artifact-type>` is one of the fixed taxonomy: `screenshot`, `recording`, `http-transcript`, `cli-output`, `log-snippet`, `db-query-output`, `perf-trace`, `test-run-log`, `deploy-log`, `state-dump`. (The legacy `[SCREENSHOT: name]` form is accepted as `screenshot`.)
206
206
  - `<name>` is kebab-case and unique within the issue.
207
207
 
208
+ Non-binding cross-references use `[EVIDENCE-REF: <tracker-ref>: <artifact-type>: <name>]`, where `<tracker-ref>` is the owning issue (`#123`, `owner/repo#123`, or a GitHub issue URL). S14 MUST ignore `EVIDENCE-REF` markers when deriving this issue's manifest, and a valid `EVIDENCE-REF` does not satisfy the "at least one marker" requirement. Agents must use `EVIDENCE-REF` instead of quoting a sibling issue's `[EVIDENCE: ...]` marker in prose.
209
+
208
210
  **A marker names an artifact, not an assertion.** An untyped marker (`[EVIDENCE: load-failure-handled-gracefully]`) is an assertion label with nothing to capture and must FAIL, with a remediation that shows the typed transformation (e.g. → `[EVIDENCE: screenshot: load-failure-error-state]`, `[EVIDENCE: perf-trace: pipeline-load-tti]`).
209
211
 
210
- FAIL when the Validation Journey is present but declares zero markers, when any marker is untyped or uses a type outside the taxonomy, or when any name is empty, duplicated, or not kebab-case. A behavior-changing work unit SHOULD declare both a success marker and an error/edge marker; a journey with only one marker passes but the remediation should recommend adding the error/edge case.
212
+ FAIL when the Validation Journey is present but declares zero binding `[EVIDENCE: ...]` markers, when any binding marker is untyped or uses a type outside the taxonomy, or when any binding name is empty, duplicated, or not kebab-case. A behavior-changing work unit SHOULD declare both a success marker and an error/edge marker; a journey with only one binding marker passes but the remediation should recommend adding the error/edge case.
211
213
 
212
214
  This gate depends on S11. It is `N/A` for containers — an **Epic**, or any item with open child work (coordination containers, not work units) — and for leaf units with `runtime_behavior_change = false` (doc-only / config-only / type-only). If S11 fails because the Validation Journey is absent, S14 also FAILs (there is no manifest to bind) with remediation pointing back to `lisa-github-add-journey`.
213
215
 
@@ -93,9 +93,10 @@ h3. Assertions
93
93
  2. **Concrete, runnable steps** — "Run `curl -s localhost:3000/health | jq .status`" not "Check the endpoint"
94
94
  3. **Include environment setup** — Database connection, running services, env vars
95
95
  4. **Markers are typed artifacts, not assertion labels** — `[EVIDENCE: <artifact-type>: <kebab-name>]`. `[EVIDENCE: load-failure-handled-gracefully]` names a claim with nothing to capture; write `[EVIDENCE: screenshot: load-failure-error-state]` or `[EVIDENCE: perf-trace: pipeline-load-tti]`. Names are kebab-case and unique within the ticket.
96
- 5. **Assertions are measurable** — "Returns 200 with `{status: ok}`" not "API works correctly"
97
- 6. **Cover happy path and error path** — At minimum, one success and one failure evidence marker
98
- 7. **On a leaf work unit, the markers are binding** — For a Bug / Task / Sub-task / Improvement, every typed `[EVIDENCE: <artifact-type>: <name>]` here is the ticket's evidence manifest: validation gate S14 requires at least one, and the ticket cannot be closed until each named artifact is captured **in its declared type** and attached (see the "Per-Work-Unit Evidence Contract" in the `verification` rule). Name only evidence you intend to capture — and name all of it.
96
+ 5. **Cross-ticket references are non-binding** — If the journey needs to mention another ticket's artifact, use `[EVIDENCE-REF: <tracker-ref>: <artifact-type>: <kebab-name>]` (for example, `[EVIDENCE-REF: PROJ-123: cli-output: upstream-contract-pass]`). Do not paste a sibling ticket's `[EVIDENCE: ...]` marker into this ticket; S14 treats `[EVIDENCE: ...]` as this ticket's own manifest and ignores `EVIDENCE-REF`.
97
+ 6. **Assertions are measurable** — "Returns 200 with `{status: ok}`" not "API works correctly"
98
+ 7. **Cover happy path and error path** — At minimum, one success and one failure evidence marker
99
+ 8. **On a leaf work unit, the markers are binding** — For a Bug / Task / Sub-task / Improvement, every typed `[EVIDENCE: <artifact-type>: <name>]` here is the ticket's evidence manifest: validation gate S14 requires at least one, and the ticket cannot be closed until each named artifact is captured **in its declared type** and attached (see the "Per-Work-Unit Evidence Contract" in the `verification` rule). Name only evidence you intend to capture — and name all of it; `EVIDENCE-REF` never satisfies or extends the manifest.
99
100
 
100
101
  ### Step 6: Present to User for Approval
101
102
 
@@ -206,9 +206,11 @@ Each marker must satisfy ALL of:
206
206
  - `<artifact-type>` is one of the fixed taxonomy: `screenshot`, `recording`, `http-transcript`, `cli-output`, `log-snippet`, `db-query-output`, `perf-trace`, `test-run-log`, `deploy-log`, `state-dump`. (The legacy `[SCREENSHOT: name]` form is accepted as `screenshot`.)
207
207
  - `<name>` is kebab-case and unique within the ticket.
208
208
 
209
+ Non-binding cross-references use `[EVIDENCE-REF: <tracker-ref>: <artifact-type>: <name>]`, where `<tracker-ref>` is the owning ticket or issue (`PROJ-123`, `#123`, `owner/repo#123`, or a tracker URL). S14 MUST ignore `EVIDENCE-REF` markers when deriving this ticket's manifest, and a valid `EVIDENCE-REF` does not satisfy the "at least one marker" requirement. Agents must use `EVIDENCE-REF` instead of quoting a sibling ticket's `[EVIDENCE: ...]` marker in prose.
210
+
209
211
  **A marker names an artifact, not an assertion.** An untyped marker (`[EVIDENCE: load-failure-handled-gracefully]`) is an assertion label with nothing to capture and must FAIL, with a remediation that shows the typed transformation (e.g. → `[EVIDENCE: screenshot: load-failure-error-state]`, `[EVIDENCE: perf-trace: pipeline-load-tti]`).
210
212
 
211
- FAIL when the Validation Journey is present but declares zero markers, when any marker is untyped or uses a type outside the taxonomy, or when any name is empty, duplicated, or not kebab-case. A behavior-changing work unit SHOULD declare both a success marker and an error/edge marker; a journey with only one marker passes but the remediation should recommend adding the error/edge case.
213
+ FAIL when the Validation Journey is present but declares zero binding `[EVIDENCE: ...]` markers, when any binding marker is untyped or uses a type outside the taxonomy, or when any binding name is empty, duplicated, or not kebab-case. A behavior-changing work unit SHOULD declare both a success marker and an error/edge marker; a journey with only one binding marker passes but the remediation should recommend adding the error/edge case.
212
214
 
213
215
  This gate depends on S11. It is `N/A` for containers — an **Epic**, or any item with open child work (coordination containers, not work units) — and for leaf units with `runtime_behavior_change = false` (doc-only / config-only / type-only). If S11 fails because the Validation Journey is absent, S14 also FAILs (there is no manifest to bind) with remediation pointing back to `lisa-jira-add-journey`.
214
216
 
@@ -83,9 +83,10 @@ Compose the journey with typed `[EVIDENCE: <artifact-type>: <name>]` markers at
83
83
  2. **Concrete, runnable steps** — `Run \`curl -s localhost:3000/health | jq .status\`` not "Check the endpoint".
84
84
  3. **Include environment setup** — Database connection, running services, env vars.
85
85
  4. **Markers are typed artifacts, not assertion labels** — `[EVIDENCE: <artifact-type>: <kebab-name>]`. `[EVIDENCE: load-failure-handled-gracefully]` names a claim with nothing to capture; write `[EVIDENCE: screenshot: load-failure-error-state]` or `[EVIDENCE: perf-trace: pipeline-load-tti]`. Names are kebab-case and unique within the ticket.
86
- 5. **Assertions are measurable** — "Returns 200 with `{status: ok}`" not "API works correctly".
87
- 6. **Cover happy path and error path** — At minimum, one success and one failure evidence marker.
88
- 7. **On a leaf work unit, the markers are binding** — For a Bug / Task / Sub-task / Improvement, every typed `[EVIDENCE: <artifact-type>: <name>]` here is the item's evidence manifest: validation gate S14 requires at least one, and the item cannot be closed until each named artifact is captured **in its declared type** and attached (see the "Per-Work-Unit Evidence Contract" in the `verification` rule). Name only evidence you intend to capture — and name all of it.
86
+ 5. **Cross-item references are non-binding** — If the journey needs to mention another item's artifact, use `[EVIDENCE-REF: <tracker-ref>: <artifact-type>: <kebab-name>]` (for example, `[EVIDENCE-REF: ENG-123: cli-output: upstream-contract-pass]`). Do not paste a sibling item's `[EVIDENCE: ...]` marker into this item; S14 treats `[EVIDENCE: ...]` as this item's own manifest and ignores `EVIDENCE-REF`.
87
+ 6. **Assertions are measurable** — "Returns 200 with `{status: ok}`" not "API works correctly".
88
+ 7. **Cover happy path and error path** — At minimum, one success and one failure evidence marker.
89
+ 8. **On a leaf work unit, the markers are binding** — For a Bug / Task / Sub-task / Improvement, every typed `[EVIDENCE: <artifact-type>: <name>]` here is the item's evidence manifest: validation gate S14 requires at least one, and the item cannot be closed until each named artifact is captured **in its declared type** and attached (see the "Per-Work-Unit Evidence Contract" in the `verification` rule). Name only evidence you intend to capture — and name all of it; `EVIDENCE-REF` never satisfies or extends the manifest.
89
90
 
90
91
  ### Step 6: Present to User for Approval
91
92
 
@@ -209,9 +209,11 @@ Each marker must satisfy ALL of:
209
209
  - `<artifact-type>` is one of the fixed taxonomy: `screenshot`, `recording`, `http-transcript`, `cli-output`, `log-snippet`, `db-query-output`, `perf-trace`, `test-run-log`, `deploy-log`, `state-dump`. (The legacy `[SCREENSHOT: name]` form is accepted as `screenshot`.)
210
210
  - `<name>` is kebab-case and unique within the item.
211
211
 
212
+ Non-binding cross-references use `[EVIDENCE-REF: <tracker-ref>: <artifact-type>: <name>]`, where `<tracker-ref>` is the owning item or issue (`ENG-123`, `PROJ-123`, `#123`, `owner/repo#123`, or a tracker URL). S14 MUST ignore `EVIDENCE-REF` markers when deriving this item's manifest, and a valid `EVIDENCE-REF` does not satisfy the "at least one marker" requirement. Agents must use `EVIDENCE-REF` instead of quoting a sibling item's `[EVIDENCE: ...]` marker in prose.
213
+
212
214
  **A marker names an artifact, not an assertion.** An untyped marker (`[EVIDENCE: load-failure-handled-gracefully]`) is an assertion label with nothing to capture and must FAIL, with a remediation that shows the typed transformation (e.g. → `[EVIDENCE: screenshot: load-failure-error-state]`, `[EVIDENCE: perf-trace: pipeline-load-tti]`).
213
215
 
214
- FAIL when the Validation Journey is present but declares zero markers, when any marker is untyped or uses a type outside the taxonomy, or when any name is empty, duplicated, or not kebab-case. A behavior-changing work unit SHOULD declare both a success marker and an error/edge marker; a journey with only one marker passes but the remediation should recommend adding the error/edge case.
216
+ FAIL when the Validation Journey is present but declares zero binding `[EVIDENCE: ...]` markers, when any binding marker is untyped or uses a type outside the taxonomy, or when any binding name is empty, duplicated, or not kebab-case. A behavior-changing work unit SHOULD declare both a success marker and an error/edge marker; a journey with only one binding marker passes but the remediation should recommend adding the error/edge case.
215
217
 
216
218
  This gate depends on S11. It is `N/A` for containers — a **Project** (the Epic equivalent), or any item with open child work (coordination containers, not work units) — and for leaf units with `runtime_behavior_change = false` (doc-only / config-only / type-only). If S11 fails because the Validation Journey is absent, S14 also FAILs (there is no manifest to bind) with remediation pointing back to `lisa-linear-add-journey`.
217
219