@codyswann/lisa 4.71.11 → 4.71.12

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 (70) hide show
  1. package/all/copy-overwrite/scripts/npm-updater-helper-graph.json +1 -1
  2. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  3. package/dist/core/lisa-owned-hash-ledger.js +4 -0
  4. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  5. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  6. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  7. package/dist/core/upstream-evidence-manifest.js +4 -3
  8. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  9. package/package.json +4 -4
  10. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  11. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  12. package/plugins/lisa/.codex-plugin/skills/lisa-linear-build-intake/SKILL.md +8 -0
  13. package/plugins/lisa/scripts/intake-blocker-reprobe.mjs +20 -2
  14. package/plugins/lisa/skills/lisa-linear-build-intake/SKILL.md +8 -0
  15. package/plugins/lisa-agy/plugin.json +1 -1
  16. package/plugins/lisa-agy/scripts/intake-blocker-reprobe.mjs +20 -2
  17. package/plugins/lisa-agy/skills/lisa-linear-build-intake/SKILL.md +8 -0
  18. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  19. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  20. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  21. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  22. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  23. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  24. package/plugins/lisa-copilot/scripts/intake-blocker-reprobe.mjs +20 -2
  25. package/plugins/lisa-copilot/skills/lisa-linear-build-intake/SKILL.md +8 -0
  26. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  27. package/plugins/lisa-cursor/scripts/intake-blocker-reprobe.mjs +20 -2
  28. package/plugins/lisa-cursor/skills/lisa-linear-build-intake/SKILL.md +8 -0
  29. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  31. package/plugins/lisa-expo-agy/plugin.json +1 -1
  32. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  36. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  37. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  38. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  41. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  42. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  43. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  46. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  47. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  51. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  52. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  53. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  56. package/plugins/lisa-rails-agy/plugin.json +1 -1
  57. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  58. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  61. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  62. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  63. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  66. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  67. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  68. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  69. package/plugins/src/base/scripts/intake-blocker-reprobe.mjs +20 -2
  70. package/plugins/src/base/skills/lisa-linear-build-intake/SKILL.md +8 -0
package/package.json CHANGED
@@ -189,7 +189,7 @@
189
189
  "qs": "^6.16.0"
190
190
  },
191
191
  "name": "@codyswann/lisa",
192
- "version": "4.71.11",
192
+ "version": "4.71.12",
193
193
  "description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
194
194
  "main": "dist/index.js",
195
195
  "exports": {
@@ -345,7 +345,7 @@
345
345
  "test": "tests"
346
346
  },
347
347
  "types": "./dist/index.d.ts",
348
- "lisaReleaseCommit": "6f1e1c933b2bd8891e2153751bf95231656dce49",
349
- "gitHead": "6f1e1c933b2bd8891e2153751bf95231656dce49",
350
- "lisaReleaseTag": "v4.71.11"
348
+ "lisaReleaseCommit": "ac1f6e1ffbf60d5bb78489216c8f2f034e0650f0",
349
+ "gitHead": "ac1f6e1ffbf60d5bb78489216c8f2f034e0650f0",
350
+ "lisaReleaseTag": "v4.71.12"
351
351
  }
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
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.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -199,6 +199,14 @@ If every pre-work lane is empty, or nothing survives Phase 2.5, exit on the **de
199
199
 
200
200
  ### Phase 2.5 — Re-probe the blockers instead of inheriting them
201
201
 
202
+ Pass original provider bodies and comments to the shared human-gate parsers;
203
+ they decode one Markdown escape layer after excluding code examples. For
204
+ bookkeeping searches that set `alreadyNotified`, use
205
+ `normalizeProviderMarkdown(comment.body)` from the same helper before checking
206
+ the reconciled, released, normalization or evidence marker. Never pre-normalize
207
+ text passed to the parsers: decoding twice can change literal backslashes into a
208
+ declaration.
209
+
202
210
  A blocker is a **claim with a timestamp, not a fact**. It is written once and goes stale the moment its condition comes true — a dependency lands on trunk, an advisory gets patched, a package publishes. Nothing re-read one before this phase, so a discharged blocker held its Issue out of the queue indefinitely. Measured: one Issue's stated condition went true ~15 hours before anything noticed.
203
211
 
204
212
  For each pre-work candidate that is **not** in `$READY`:
@@ -53,6 +53,22 @@ function normalizeLabels(labels) {
53
53
  const LEADING_DECORATION =
54
54
  /^[ \t>*_+#-]*(?:\d+[.)][ \t]*)?(?:<!--[ \t]*)?[ \t]*/u;
55
55
 
56
+ /**
57
+ * Decode one stored Markdown escape layer without changing the provider record.
58
+ * Linear escapes marker brackets and punctuation in reason keys. A single pass
59
+ * keeps literal backslash pairs intact instead of recursively inventing markers.
60
+ * Callers doing bookkeeping-marker searches use this same projection; hold and
61
+ * release parsers receive original bodies and apply it after excluding code.
62
+ * @param {unknown} body - Original provider text
63
+ * @returns {string} One-pass Markdown punctuation projection
64
+ */
65
+ export function normalizeProviderMarkdown(body) {
66
+ return String(body ?? "").replace(
67
+ /\\([\u0021-\u002f\u003a-\u0040\u005b-\u0060\u007b-\u007e])/gu,
68
+ "$1"
69
+ );
70
+ }
71
+
56
72
  /**
57
73
  * The body with fenced blocks and inline code spans removed.
58
74
  *
@@ -65,9 +81,10 @@ const LEADING_DECORATION =
65
81
  * @returns {string} The body with quoted and code regions blanked out
66
82
  */
67
83
  function declarativeText(body) {
68
- return String(body ?? "")
84
+ const withoutCode = String(body ?? "")
69
85
  .replace(/```[\s\S]*?```/gu, "")
70
86
  .replace(/`[^`\n]*`/gu, "");
87
+ return normalizeProviderMarkdown(withoutCode);
71
88
  }
72
89
 
73
90
  /**
@@ -160,7 +177,8 @@ function declaresOnLine(line, marker = HUMAN_GATE_MARKER) {
160
177
  */
161
178
  export function humanGateMentions(body) {
162
179
  const raw = String(body ?? "");
163
- const total = raw.split(HUMAN_GATE_MARKER).length - 1;
180
+ const total =
181
+ normalizeProviderMarkdown(raw).split(HUMAN_GATE_MARKER).length - 1;
164
182
  const declared = declarativeText(raw)
165
183
  .split("\n")
166
184
  .filter(line => declaresOnLine(line)).length;
@@ -199,6 +199,14 @@ If every pre-work lane is empty, or nothing survives Phase 2.5, exit on the **de
199
199
 
200
200
  ### Phase 2.5 — Re-probe the blockers instead of inheriting them
201
201
 
202
+ Pass original provider bodies and comments to the shared human-gate parsers;
203
+ they decode one Markdown escape layer after excluding code examples. For
204
+ bookkeeping searches that set `alreadyNotified`, use
205
+ `normalizeProviderMarkdown(comment.body)` from the same helper before checking
206
+ the reconciled, released, normalization or evidence marker. Never pre-normalize
207
+ text passed to the parsers: decoding twice can change literal backslashes into a
208
+ declaration.
209
+
202
210
  A blocker is a **claim with a timestamp, not a fact**. It is written once and goes stale the moment its condition comes true — a dependency lands on trunk, an advisory gets patched, a package publishes. Nothing re-read one before this phase, so a discharged blocker held its Issue out of the queue indefinitely. Measured: one Issue's stated condition went true ~15 hours before anything noticed.
203
211
 
204
212
  For each pre-work candidate that is **not** in `$READY`:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -53,6 +53,22 @@ function normalizeLabels(labels) {
53
53
  const LEADING_DECORATION =
54
54
  /^[ \t>*_+#-]*(?:\d+[.)][ \t]*)?(?:<!--[ \t]*)?[ \t]*/u;
55
55
 
56
+ /**
57
+ * Decode one stored Markdown escape layer without changing the provider record.
58
+ * Linear escapes marker brackets and punctuation in reason keys. A single pass
59
+ * keeps literal backslash pairs intact instead of recursively inventing markers.
60
+ * Callers doing bookkeeping-marker searches use this same projection; hold and
61
+ * release parsers receive original bodies and apply it after excluding code.
62
+ * @param {unknown} body - Original provider text
63
+ * @returns {string} One-pass Markdown punctuation projection
64
+ */
65
+ export function normalizeProviderMarkdown(body) {
66
+ return String(body ?? "").replace(
67
+ /\\([\u0021-\u002f\u003a-\u0040\u005b-\u0060\u007b-\u007e])/gu,
68
+ "$1"
69
+ );
70
+ }
71
+
56
72
  /**
57
73
  * The body with fenced blocks and inline code spans removed.
58
74
  *
@@ -65,9 +81,10 @@ const LEADING_DECORATION =
65
81
  * @returns {string} The body with quoted and code regions blanked out
66
82
  */
67
83
  function declarativeText(body) {
68
- return String(body ?? "")
84
+ const withoutCode = String(body ?? "")
69
85
  .replace(/```[\s\S]*?```/gu, "")
70
86
  .replace(/`[^`\n]*`/gu, "");
87
+ return normalizeProviderMarkdown(withoutCode);
71
88
  }
72
89
 
73
90
  /**
@@ -160,7 +177,8 @@ function declaresOnLine(line, marker = HUMAN_GATE_MARKER) {
160
177
  */
161
178
  export function humanGateMentions(body) {
162
179
  const raw = String(body ?? "");
163
- const total = raw.split(HUMAN_GATE_MARKER).length - 1;
180
+ const total =
181
+ normalizeProviderMarkdown(raw).split(HUMAN_GATE_MARKER).length - 1;
164
182
  const declared = declarativeText(raw)
165
183
  .split("\n")
166
184
  .filter(line => declaresOnLine(line)).length;
@@ -199,6 +199,14 @@ If every pre-work lane is empty, or nothing survives Phase 2.5, exit on the **de
199
199
 
200
200
  ### Phase 2.5 — Re-probe the blockers instead of inheriting them
201
201
 
202
+ Pass original provider bodies and comments to the shared human-gate parsers;
203
+ they decode one Markdown escape layer after excluding code examples. For
204
+ bookkeeping searches that set `alreadyNotified`, use
205
+ `normalizeProviderMarkdown(comment.body)` from the same helper before checking
206
+ the reconciled, released, normalization or evidence marker. Never pre-normalize
207
+ text passed to the parsers: decoding twice can change literal backslashes into a
208
+ declaration.
209
+
202
210
  A blocker is a **claim with a timestamp, not a fact**. It is written once and goes stale the moment its condition comes true — a dependency lands on trunk, an advisory gets patched, a package publishes. Nothing re-read one before this phase, so a discharged blocker held its Issue out of the queue indefinitely. Measured: one Issue's stated condition went true ~15 hours before anything noticed.
203
211
 
204
212
  For each pre-work candidate that is **not** in `$READY`:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "AWS CDK-specific Lisa plugin.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -53,6 +53,22 @@ function normalizeLabels(labels) {
53
53
  const LEADING_DECORATION =
54
54
  /^[ \t>*_+#-]*(?:\d+[.)][ \t]*)?(?:<!--[ \t]*)?[ \t]*/u;
55
55
 
56
+ /**
57
+ * Decode one stored Markdown escape layer without changing the provider record.
58
+ * Linear escapes marker brackets and punctuation in reason keys. A single pass
59
+ * keeps literal backslash pairs intact instead of recursively inventing markers.
60
+ * Callers doing bookkeeping-marker searches use this same projection; hold and
61
+ * release parsers receive original bodies and apply it after excluding code.
62
+ * @param {unknown} body - Original provider text
63
+ * @returns {string} One-pass Markdown punctuation projection
64
+ */
65
+ export function normalizeProviderMarkdown(body) {
66
+ return String(body ?? "").replace(
67
+ /\\([\u0021-\u002f\u003a-\u0040\u005b-\u0060\u007b-\u007e])/gu,
68
+ "$1"
69
+ );
70
+ }
71
+
56
72
  /**
57
73
  * The body with fenced blocks and inline code spans removed.
58
74
  *
@@ -65,9 +81,10 @@ const LEADING_DECORATION =
65
81
  * @returns {string} The body with quoted and code regions blanked out
66
82
  */
67
83
  function declarativeText(body) {
68
- return String(body ?? "")
84
+ const withoutCode = String(body ?? "")
69
85
  .replace(/```[\s\S]*?```/gu, "")
70
86
  .replace(/`[^`\n]*`/gu, "");
87
+ return normalizeProviderMarkdown(withoutCode);
71
88
  }
72
89
 
73
90
  /**
@@ -160,7 +177,8 @@ function declaresOnLine(line, marker = HUMAN_GATE_MARKER) {
160
177
  */
161
178
  export function humanGateMentions(body) {
162
179
  const raw = String(body ?? "");
163
- const total = raw.split(HUMAN_GATE_MARKER).length - 1;
180
+ const total =
181
+ normalizeProviderMarkdown(raw).split(HUMAN_GATE_MARKER).length - 1;
164
182
  const declared = declarativeText(raw)
165
183
  .split("\n")
166
184
  .filter(line => declaresOnLine(line)).length;
@@ -199,6 +199,14 @@ If every pre-work lane is empty, or nothing survives Phase 2.5, exit on the **de
199
199
 
200
200
  ### Phase 2.5 — Re-probe the blockers instead of inheriting them
201
201
 
202
+ Pass original provider bodies and comments to the shared human-gate parsers;
203
+ they decode one Markdown escape layer after excluding code examples. For
204
+ bookkeeping searches that set `alreadyNotified`, use
205
+ `normalizeProviderMarkdown(comment.body)` from the same helper before checking
206
+ the reconciled, released, normalization or evidence marker. Never pre-normalize
207
+ text passed to the parsers: decoding twice can change literal backslashes into a
208
+ declaration.
209
+
202
210
  A blocker is a **claim with a timestamp, not a fact**. It is written once and goes stale the moment its condition comes true — a dependency lands on trunk, an advisory gets patched, a package publishes. Nothing re-read one before this phase, so a discharged blocker held its Issue out of the queue indefinitely. Measured: one Issue's stated condition went true ~15 hours before anything noticed.
203
211
 
204
212
  For each pre-work candidate that is **not** in `$READY`:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -53,6 +53,22 @@ function normalizeLabels(labels) {
53
53
  const LEADING_DECORATION =
54
54
  /^[ \t>*_+#-]*(?:\d+[.)][ \t]*)?(?:<!--[ \t]*)?[ \t]*/u;
55
55
 
56
+ /**
57
+ * Decode one stored Markdown escape layer without changing the provider record.
58
+ * Linear escapes marker brackets and punctuation in reason keys. A single pass
59
+ * keeps literal backslash pairs intact instead of recursively inventing markers.
60
+ * Callers doing bookkeeping-marker searches use this same projection; hold and
61
+ * release parsers receive original bodies and apply it after excluding code.
62
+ * @param {unknown} body - Original provider text
63
+ * @returns {string} One-pass Markdown punctuation projection
64
+ */
65
+ export function normalizeProviderMarkdown(body) {
66
+ return String(body ?? "").replace(
67
+ /\\([\u0021-\u002f\u003a-\u0040\u005b-\u0060\u007b-\u007e])/gu,
68
+ "$1"
69
+ );
70
+ }
71
+
56
72
  /**
57
73
  * The body with fenced blocks and inline code spans removed.
58
74
  *
@@ -65,9 +81,10 @@ const LEADING_DECORATION =
65
81
  * @returns {string} The body with quoted and code regions blanked out
66
82
  */
67
83
  function declarativeText(body) {
68
- return String(body ?? "")
84
+ const withoutCode = String(body ?? "")
69
85
  .replace(/```[\s\S]*?```/gu, "")
70
86
  .replace(/`[^`\n]*`/gu, "");
87
+ return normalizeProviderMarkdown(withoutCode);
71
88
  }
72
89
 
73
90
  /**
@@ -160,7 +177,8 @@ function declaresOnLine(line, marker = HUMAN_GATE_MARKER) {
160
177
  */
161
178
  export function humanGateMentions(body) {
162
179
  const raw = String(body ?? "");
163
- const total = raw.split(HUMAN_GATE_MARKER).length - 1;
180
+ const total =
181
+ normalizeProviderMarkdown(raw).split(HUMAN_GATE_MARKER).length - 1;
164
182
  const declared = declarativeText(raw)
165
183
  .split("\n")
166
184
  .filter(line => declaresOnLine(line)).length;
@@ -199,6 +199,14 @@ If every pre-work lane is empty, or nothing survives Phase 2.5, exit on the **de
199
199
 
200
200
  ### Phase 2.5 — Re-probe the blockers instead of inheriting them
201
201
 
202
+ Pass original provider bodies and comments to the shared human-gate parsers;
203
+ they decode one Markdown escape layer after excluding code examples. For
204
+ bookkeeping searches that set `alreadyNotified`, use
205
+ `normalizeProviderMarkdown(comment.body)` from the same helper before checking
206
+ the reconciled, released, normalization or evidence marker. Never pre-normalize
207
+ text passed to the parsers: decoding twice can change literal backslashes into a
208
+ declaration.
209
+
202
210
  A blocker is a **claim with a timestamp, not a fact**. It is written once and goes stale the moment its condition comes true — a dependency lands on trunk, an advisory gets patched, a package publishes. Nothing re-read one before this phase, so a discharged blocker held its Issue out of the queue indefinitely. Measured: one Issue's stated condition went true ~15 hours before anything noticed.
203
211
 
204
212
  For each pre-work candidate that is **not** in `$READY`:
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Expo and React Native-specific skills, agents, rules, and MCP servers.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-expo",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Expo/React Native-specific skills, agents, rules, and MCP servers",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Harper/Fabric-specific Lisa rules for TypeScript component apps.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-harper-fabric",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Harper/Fabric-specific rules for TypeScript component apps",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "NestJS-specific skills and migration write-protection hooks.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-nestjs",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "NestJS-specific skills (GraphQL, TypeORM) and hooks (migration write-protection)",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-openclaw",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-phaser",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Phaser 4 game-development rules for TypeScript projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Ruby on Rails-specific skills and hooks for RuboCop and ast-grep scanning on edit.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-rails",
3
- "version": "4.71.11",
3
+ "version": "4.71.12",
4
4
  "description": "Ruby on Rails-specific hooks — RuboCop linting/formatting and ast-grep scanning on edit",
5
5
  "author": {
6
6
  "name": "Cody Swann"