@codyswann/lisa 4.22.12 → 4.22.14

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 (177) hide show
  1. package/all/copy-overwrite/scripts/lib/gate-failure-diagnosis.mjs +4 -2
  2. package/all/copy-overwrite/scripts/lib/process-tree-runner.mjs +95 -14
  3. package/all/copy-overwrite/scripts/lisa-environment-prepare.mjs +10 -1
  4. package/all/copy-overwrite/scripts/lisa-floor-collisions.mjs +1 -0
  5. package/all/copy-overwrite/scripts/lisa-hooks/block-no-verify.sh +43 -2
  6. package/all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh +19 -5
  7. package/all/copy-overwrite/scripts/lisa-reconcile-policy.mjs +13 -1
  8. package/all/copy-overwrite/scripts/lisa-schema-validate.mjs +2 -2
  9. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  10. package/dist/core/lisa-owned-hash-ledger.js +30 -0
  11. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  12. package/dist/core/nightly-e2e-guard-behavior-certificate.d.ts +5 -0
  13. package/dist/core/nightly-e2e-guard-behavior-certificate.d.ts.map +1 -1
  14. package/dist/core/nightly-e2e-guard-behavior-certificate.js +8 -2
  15. package/dist/core/nightly-e2e-guard-behavior-certificate.js.map +1 -1
  16. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  17. package/dist/core/upstream-evidence-manifest.js +33 -32
  18. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  19. package/dist/opencode/plugin-templates/block-no-verify.sh +43 -2
  20. package/dist/opencode/plugin-templates/lisa-block-direct-issue-create.ts +4 -3
  21. package/dist/opencode/plugin-templates/lisa-block-no-verify.ts +11 -2
  22. package/dist/opencode/plugin-templates/parity-safety-net.sh +19 -5
  23. package/expo/create-only/.github/workflows/nightly-e2e-report.yml +1 -0
  24. package/package.json +3 -3
  25. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  26. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  27. package/plugins/lisa/.codex-plugin/skills/lisa-github-build-intake/SKILL.md +7 -8
  28. package/plugins/lisa/.codex-plugin/skills/lisa-github-prd-intake/SKILL.md +10 -11
  29. package/plugins/lisa/.codex-plugin/skills/lisa-github-sync/SKILL.md +1 -1
  30. package/plugins/lisa/.codex-plugin/skills/lisa-github-write-prd/SKILL.md +14 -12
  31. package/plugins/lisa/.codex-plugin/skills/lisa-jira-build-intake/SKILL.md +7 -8
  32. package/plugins/lisa/.codex-plugin/skills/lisa-jira-journey/scripts/parse-plan.py +54 -12
  33. package/plugins/lisa/.codex-plugin/skills/lisa-linear-build-intake/SKILL.md +9 -10
  34. package/plugins/lisa/.codex-plugin/skills/lisa-linear-evidence/SKILL.md +14 -4
  35. package/plugins/lisa/.codex-plugin/skills/lisa-linear-sync/SKILL.md +1 -1
  36. package/plugins/lisa/.codex-plugin/skills/lisa-repair-intake/SKILL.md +2 -1
  37. package/plugins/lisa/.codex-plugin/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +4 -3
  38. package/plugins/lisa/.codex-plugin/skills/lisa-tracker-sync/SKILL.md +2 -2
  39. package/plugins/lisa/hooks/block-no-verify.sh +43 -2
  40. package/plugins/lisa/hooks/parity-safety-net.sh +19 -5
  41. package/plugins/lisa/hooks/threshold-ratchet-families.mjs +10 -1
  42. package/plugins/lisa/rules/reference/config-resolution.md +0 -4
  43. package/plugins/lisa/rules/reference/leaf-only-lifecycle.md +1 -1
  44. package/plugins/lisa/scripts/resolve-lifecycle-role.mjs +15 -3
  45. package/plugins/lisa/skills/lisa-github-build-intake/SKILL.md +7 -8
  46. package/plugins/lisa/skills/lisa-github-prd-intake/SKILL.md +10 -11
  47. package/plugins/lisa/skills/lisa-github-sync/SKILL.md +1 -1
  48. package/plugins/lisa/skills/lisa-github-write-prd/SKILL.md +14 -12
  49. package/plugins/lisa/skills/lisa-jira-build-intake/SKILL.md +7 -8
  50. package/plugins/lisa/skills/lisa-jira-journey/scripts/parse-plan.py +54 -12
  51. package/plugins/lisa/skills/lisa-linear-build-intake/SKILL.md +9 -10
  52. package/plugins/lisa/skills/lisa-linear-evidence/SKILL.md +14 -4
  53. package/plugins/lisa/skills/lisa-linear-sync/SKILL.md +1 -1
  54. package/plugins/lisa/skills/lisa-repair-intake/SKILL.md +2 -1
  55. package/plugins/lisa/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +4 -3
  56. package/plugins/lisa/skills/lisa-tracker-sync/SKILL.md +2 -2
  57. package/plugins/lisa-agy/hooks/parity-safety-net.sh +19 -5
  58. package/plugins/lisa-agy/plugin.json +1 -1
  59. package/plugins/lisa-agy/scripts/resolve-lifecycle-role.mjs +15 -3
  60. package/plugins/lisa-agy/skills/lisa-github-build-intake/SKILL.md +7 -8
  61. package/plugins/lisa-agy/skills/lisa-github-prd-intake/SKILL.md +10 -11
  62. package/plugins/lisa-agy/skills/lisa-github-sync/SKILL.md +1 -1
  63. package/plugins/lisa-agy/skills/lisa-github-write-prd/SKILL.md +14 -12
  64. package/plugins/lisa-agy/skills/lisa-jira-build-intake/SKILL.md +7 -8
  65. package/plugins/lisa-agy/skills/lisa-jira-journey/scripts/parse-plan.py +54 -12
  66. package/plugins/lisa-agy/skills/lisa-linear-build-intake/SKILL.md +9 -10
  67. package/plugins/lisa-agy/skills/lisa-linear-evidence/SKILL.md +14 -4
  68. package/plugins/lisa-agy/skills/lisa-linear-sync/SKILL.md +1 -1
  69. package/plugins/lisa-agy/skills/lisa-repair-intake/SKILL.md +2 -1
  70. package/plugins/lisa-agy/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +4 -3
  71. package/plugins/lisa-agy/skills/lisa-tracker-sync/SKILL.md +2 -2
  72. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  73. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  74. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  75. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  76. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  77. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  78. package/plugins/lisa-copilot/hooks/block-no-verify.sh +43 -2
  79. package/plugins/lisa-copilot/hooks/parity-safety-net.sh +19 -5
  80. package/plugins/lisa-copilot/hooks/threshold-ratchet-families.mjs +10 -1
  81. package/plugins/lisa-copilot/rules/reference/config-resolution.md +0 -4
  82. package/plugins/lisa-copilot/rules/reference/leaf-only-lifecycle.md +1 -1
  83. package/plugins/lisa-copilot/scripts/resolve-lifecycle-role.mjs +15 -3
  84. package/plugins/lisa-copilot/skills/lisa-github-build-intake/SKILL.md +7 -8
  85. package/plugins/lisa-copilot/skills/lisa-github-prd-intake/SKILL.md +10 -11
  86. package/plugins/lisa-copilot/skills/lisa-github-sync/SKILL.md +1 -1
  87. package/plugins/lisa-copilot/skills/lisa-github-write-prd/SKILL.md +14 -12
  88. package/plugins/lisa-copilot/skills/lisa-jira-build-intake/SKILL.md +7 -8
  89. package/plugins/lisa-copilot/skills/lisa-jira-journey/scripts/parse-plan.py +54 -12
  90. package/plugins/lisa-copilot/skills/lisa-linear-build-intake/SKILL.md +9 -10
  91. package/plugins/lisa-copilot/skills/lisa-linear-evidence/SKILL.md +14 -4
  92. package/plugins/lisa-copilot/skills/lisa-linear-sync/SKILL.md +1 -1
  93. package/plugins/lisa-copilot/skills/lisa-repair-intake/SKILL.md +2 -1
  94. package/plugins/lisa-copilot/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +4 -3
  95. package/plugins/lisa-copilot/skills/lisa-tracker-sync/SKILL.md +2 -2
  96. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  97. package/plugins/lisa-cursor/hooks/block-no-verify.sh +43 -2
  98. package/plugins/lisa-cursor/hooks/parity-safety-net.sh +19 -5
  99. package/plugins/lisa-cursor/hooks/threshold-ratchet-families.mjs +10 -1
  100. package/plugins/lisa-cursor/rules/config-resolution-reference.mdc +0 -4
  101. package/plugins/lisa-cursor/rules/leaf-only-lifecycle-reference.mdc +1 -1
  102. package/plugins/lisa-cursor/scripts/resolve-lifecycle-role.mjs +15 -3
  103. package/plugins/lisa-cursor/skills/lisa-github-build-intake/SKILL.md +7 -8
  104. package/plugins/lisa-cursor/skills/lisa-github-prd-intake/SKILL.md +10 -11
  105. package/plugins/lisa-cursor/skills/lisa-github-sync/SKILL.md +1 -1
  106. package/plugins/lisa-cursor/skills/lisa-github-write-prd/SKILL.md +14 -12
  107. package/plugins/lisa-cursor/skills/lisa-jira-build-intake/SKILL.md +7 -8
  108. package/plugins/lisa-cursor/skills/lisa-jira-journey/scripts/parse-plan.py +54 -12
  109. package/plugins/lisa-cursor/skills/lisa-linear-build-intake/SKILL.md +9 -10
  110. package/plugins/lisa-cursor/skills/lisa-linear-evidence/SKILL.md +14 -4
  111. package/plugins/lisa-cursor/skills/lisa-linear-sync/SKILL.md +1 -1
  112. package/plugins/lisa-cursor/skills/lisa-repair-intake/SKILL.md +2 -1
  113. package/plugins/lisa-cursor/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +4 -3
  114. package/plugins/lisa-cursor/skills/lisa-tracker-sync/SKILL.md +2 -2
  115. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  116. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  117. package/plugins/lisa-expo-agy/plugin.json +1 -1
  118. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  119. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  120. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  121. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  122. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  123. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  124. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  125. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  126. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  127. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  128. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  129. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  130. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  131. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  132. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  133. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  134. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  135. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  136. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  137. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  138. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  139. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  140. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  141. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  142. package/plugins/lisa-rails-agy/plugin.json +1 -1
  143. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  144. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  145. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  146. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  147. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  148. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  149. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  150. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  151. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  152. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  153. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  154. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  155. package/plugins/src/base/hooks/block-no-verify.sh +43 -2
  156. package/plugins/src/base/hooks/parity-safety-net.sh +19 -5
  157. package/plugins/src/base/hooks/threshold-ratchet-families.mjs +10 -1
  158. package/plugins/src/base/rules/reference/config-resolution.md +0 -4
  159. package/plugins/src/base/rules/reference/leaf-only-lifecycle.md +1 -1
  160. package/plugins/src/base/scripts/resolve-lifecycle-role.mjs +15 -3
  161. package/plugins/src/base/skills/lisa-github-build-intake/SKILL.md +7 -8
  162. package/plugins/src/base/skills/lisa-github-prd-intake/SKILL.md +10 -11
  163. package/plugins/src/base/skills/lisa-github-sync/SKILL.md +1 -1
  164. package/plugins/src/base/skills/lisa-github-write-prd/SKILL.md +14 -12
  165. package/plugins/src/base/skills/lisa-jira-build-intake/SKILL.md +7 -8
  166. package/plugins/src/base/skills/lisa-jira-journey/scripts/parse-plan.py +54 -12
  167. package/plugins/src/base/skills/lisa-linear-build-intake/SKILL.md +9 -10
  168. package/plugins/src/base/skills/lisa-linear-evidence/SKILL.md +14 -4
  169. package/plugins/src/base/skills/lisa-linear-sync/SKILL.md +1 -1
  170. package/plugins/src/base/skills/lisa-repair-intake/SKILL.md +2 -1
  171. package/plugins/src/base/skills/lisa-setup-remote-env/scripts/setup-remote-env.mjs +4 -3
  172. package/plugins/src/base/skills/lisa-tracker-sync/SKILL.md +2 -2
  173. package/rails/copy-overwrite/scripts/threshold-ratchet-families.mjs +10 -1
  174. package/typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs +10 -13
  175. package/typescript/copy-overwrite/scripts/check-skipped-required-checks.mjs +34 -3
  176. package/typescript/copy-overwrite/scripts/lisa-mutation.mjs +17 -1
  177. package/typescript/copy-overwrite/scripts/threshold-ratchet-families.mjs +10 -1
@@ -488,8 +488,10 @@ function classify(output, code) {
488
488
  return {
489
489
  kind: DIAGNOSIS.UNCAPTURED,
490
490
  summary:
491
- "no output was captured, so this failure has no diagnosis " +
492
- "(set LISA_GATES_CAPTURE=1 and re-run to get one)",
491
+ "no output was captured, so this failure has no diagnosis. Capture " +
492
+ "is on by default; it is off when LISA_GATES_CAPTURE=0 is set, when " +
493
+ "the shell has no `tee`, or when a temporary directory could not be " +
494
+ "created. Restore capture capability before re-running",
493
495
  evidence: [],
494
496
  };
495
497
  }
@@ -19,6 +19,16 @@ import { spawn, spawnSync } from "node:child_process";
19
19
  import { invokedAsScript } from "./invoked-as-script.mjs";
20
20
 
21
21
  const KILL_GRACE_MS = 750;
22
+ const REAP_POLL_MS = 25;
23
+ const WINDOWS_TIMEOUT_EXIT_CODE = 255;
24
+ const TERMINATING_SIGNALS = ["SIGINT", "SIGTERM", "SIGHUP"];
25
+ const DEFAULT_REAP_CONTROLS = Object.freeze({
26
+ kill: killTree,
27
+ exists: treeExists,
28
+ now: Date.now,
29
+ wait: milliseconds =>
30
+ new Promise(resolve => setTimeout(resolve, milliseconds)),
31
+ });
22
32
 
23
33
  function parseArguments(argv) {
24
34
  const timeoutArg = argv.find(value => value.startsWith("--timeout-ms="));
@@ -49,6 +59,36 @@ function killTree(pid, signal) {
49
59
  }
50
60
  }
51
61
 
62
+ function treeExists(pid) {
63
+ if (process.platform === "win32") return false;
64
+ try {
65
+ process.kill(-pid, 0);
66
+ return true;
67
+ } catch {
68
+ return false;
69
+ }
70
+ }
71
+
72
+ async function waitForTreeExit(pid, deadline, controls) {
73
+ while (controls.exists(pid)) {
74
+ if (controls.now() >= deadline) return false;
75
+ await controls.wait(REAP_POLL_MS);
76
+ }
77
+ return true;
78
+ }
79
+
80
+ export async function reapTree(pid, controls = DEFAULT_REAP_CONTROLS) {
81
+ controls.kill(pid, "SIGTERM");
82
+ if (await waitForTreeExit(pid, controls.now() + KILL_GRACE_MS, controls)) {
83
+ return;
84
+ }
85
+
86
+ controls.kill(pid, "SIGKILL");
87
+ if (!(await waitForTreeExit(pid, controls.now() + KILL_GRACE_MS, controls))) {
88
+ throw new Error(`gate process tree ${pid} survived SIGKILL`);
89
+ }
90
+ }
91
+
52
92
  export function supervise(command, timeoutMs) {
53
93
  return new Promise((resolve, reject) => {
54
94
  const shell =
@@ -72,42 +112,83 @@ export function supervise(command, timeoutMs) {
72
112
 
73
113
  let timedOut = false;
74
114
  let settled = false;
75
- const finish = (code, signal) => {
115
+ let terminating = false;
116
+ const signalHandlers = new Map();
117
+ const cleanup = () => {
118
+ clearTimeout(deadline);
119
+ for (const [signal, handler] of signalHandlers) {
120
+ process.off(signal, handler);
121
+ }
122
+ signalHandlers.clear();
123
+ };
124
+ const finish = async (code, signal) => {
76
125
  if (settled) return;
77
126
  settled = true;
78
- clearTimeout(deadline);
127
+ cleanup();
79
128
  // A command may leave a background descendant after its direct shell
80
- // exits. Reap that residue before returning a verdict too.
81
- killTree(pid, "SIGTERM");
82
- resolve({ code, signal });
129
+ // exits. Reap that residue fully before returning a verdict too.
130
+ try {
131
+ await reapTree(pid);
132
+ resolve({ code, signal });
133
+ } catch (error) {
134
+ reject(error);
135
+ }
136
+ };
137
+
138
+ const reportReapFailure = error => {
139
+ console.error(
140
+ `gate process-tree supervisor failed: ${error instanceof Error ? error.message : String(error)}`
141
+ );
142
+ process.exitCode = 1;
83
143
  };
84
144
 
145
+ const relaySignal = signal => {
146
+ if (terminating) return;
147
+ terminating = true;
148
+ cleanup();
149
+ reapTree(pid).then(() => {
150
+ // Restore the signal-shaped exit after the detached tree is gone.
151
+ process.kill(process.pid, signal);
152
+ }, reportReapFailure);
153
+ };
154
+ for (const signal of TERMINATING_SIGNALS) {
155
+ const handler = () => relaySignal(signal);
156
+ signalHandlers.set(signal, handler);
157
+ process.once(signal, handler);
158
+ }
159
+
85
160
  const deadline = setTimeout(() => {
86
161
  timedOut = true;
87
- killTree(pid, "SIGTERM");
88
- setTimeout(() => {
89
- killTree(pid, "SIGKILL");
162
+ cleanup();
163
+ reapTree(pid).then(() => {
90
164
  // A signal-shaped result is the existing gate runner vocabulary for
91
165
  // "no verdict". It also prevents an ordinary exit code such as 124
92
166
  // from being confused with a user command that returned that code.
93
167
  if (process.platform === "win32") {
94
- process.exit(124);
168
+ // Windows has no signal-shaped process result. 255 is a dedicated
169
+ // supervisor timeout code with a documented (but unavoidable)
170
+ // collision risk, well outside ordinary command exit conventions.
171
+ process.exit(WINDOWS_TIMEOUT_EXIT_CODE);
95
172
  } else {
96
173
  process.kill(process.pid, "SIGKILL");
97
174
  }
98
- }, KILL_GRACE_MS);
175
+ }, reportReapFailure);
99
176
  }, timeoutMs);
100
177
 
101
178
  child.once("error", error => {
102
- clearTimeout(deadline);
103
- killTree(pid, "SIGKILL");
104
- reject(error);
179
+ if (settled) return;
180
+ settled = true;
181
+ cleanup();
182
+ reapTree(pid).then(
183
+ () => reject(error),
184
+ reapError => reject(reapError)
185
+ );
105
186
  });
106
187
  child.once("close", (code, signal) => {
107
188
  // On timeout, wait for the forced group reap above before this supervisor
108
189
  // ends. Exiting on the direct shell's close is the race that used to leave
109
190
  // its descendants alive.
110
- if (!timedOut) finish(code, signal);
191
+ if (!timedOut) void finish(code, signal);
111
192
  });
112
193
  });
113
194
  }
@@ -395,8 +395,17 @@ function readPackageScripts(cwd) {
395
395
  export function runCli(argv = process.argv.slice(2), cwd = process.cwd()) {
396
396
  const env = readFlag(argv, "env");
397
397
  const verbsFlag = readFlag(argv, "verbs");
398
+ if (verbsFlag === null && argv.includes("--verbs")) {
399
+ console.error(
400
+ "❌ environment preparation refused: environment_verb_unknown"
401
+ );
402
+ console.error(
403
+ " --verbs takes its value with an equals sign, as --verbs=reset,reseed."
404
+ );
405
+ return 1;
406
+ }
398
407
  const verbs =
399
- verbsFlag === null && !argv.includes("--verbs")
408
+ verbsFlag === null
400
409
  ? FACADE_VERBS
401
410
  : (verbsFlag ?? "")
402
411
  .split(",")
@@ -100,6 +100,7 @@ function parseBranchVersion(branch) {
100
100
  );
101
101
  if (operator) cursor = cursor.slice(operator.length);
102
102
  cursor = cursor.trimStart();
103
+ while (cursor.startsWith("v")) cursor = cursor.slice(1);
103
104
 
104
105
  let end = 0;
105
106
  while (end < cursor.length) {
@@ -26,7 +26,7 @@
26
26
  # Add a name here in the same commit that closes a vector. A hardening that
27
27
  # forgets to is invisible to refresh, and shows up as an unexplained diff at
28
28
  # review time instead of a named capability.
29
- # lisa-guard-capabilities: no-verify-abbrev, husky-env, hookspath-allowlist, config-env, git-config-key, git-config-parameters, git-config-parameters-append, git-config-parameters-expansion, heredoc-shell-word, herestring-aware, no-verify-short
29
+ # lisa-guard-capabilities: no-verify-abbrev, husky-env, hookspath-allowlist, config-env, git-config-key, git-config-parameters, git-config-parameters-append, git-config-parameters-expansion, heredoc-shell-word, herestring-aware, no-verify-short, nested-shell-no-verify
30
30
  #
31
31
  # Shell-token matching avoids false positives from issue bodies, heredocs, and
32
32
  # commit-message prose while still catching quoted real argv values such as
@@ -219,6 +219,9 @@ COMMAND_SEPARATORS = {
219
219
  ";", "|", "||", "&", "&&", "(", ")", "<", ">", ">>", "<<", "&|",
220
220
  }
221
221
 
222
+ SHELL_PROGRAMS = {"bash", "dash", "ksh", "sh", "zsh"}
223
+ MAX_SHELL_NESTING = 8
224
+
222
225
  # git's own options that take a SEPARATE value token, which therefore must be
223
226
  # skipped when looking for the subcommand: `git -c core.hooksPath=x commit` and
224
227
  # `git -C /repo commit` both reach `commit`.
@@ -336,6 +339,8 @@ def commit_bypasses_verification(argv):
336
339
  if token.startswith("--"):
337
340
  if token in COMMIT_LONG_SEPARATE_VALUE:
338
341
  index += 1
342
+ elif disables_verification(token):
343
+ return True
339
344
  continue
340
345
  # A bare `-` is git's stdin placeholder, not an option cluster.
341
346
  if not token.startswith("-") or token == "-":
@@ -369,11 +374,25 @@ def subcommand_after_git(tokens, start):
369
374
  return None
370
375
 
371
376
 
372
- def git_commit_skips_verification(text):
377
+ def shell_starts_command(tokens, index):
378
+ """Whether a recognized shell token occupies command position."""
379
+ start = index - 1
380
+ while start >= 0 and tokens[start] not in COMMAND_SEPARATORS:
381
+ start -= 1
382
+ prefix = tokens[start + 1:index]
383
+ if not prefix:
384
+ return True
385
+ if prefix[0] == "env":
386
+ prefix = prefix[1:]
387
+ return all("=" in token and not token.startswith("=") for token in prefix)
388
+
389
+
390
+ def git_commit_skips_verification(text, depth=0):
373
391
  """Whether the command runs `git commit` with the short `-n` bypass.
374
392
 
375
393
  Args:
376
394
  text: The command line, heredoc payloads already stripped.
395
+ depth: Number of recognized shell payloads already traversed.
377
396
 
378
397
  Returns:
379
398
  True if any `git commit` invocation on the line skips verification.
@@ -390,6 +409,28 @@ def git_commit_skips_verification(text):
390
409
  found = subcommand_after_git(scoped_tokens, index + 1)
391
410
  if found and found[0] == "commit" and commit_bypasses_verification(found[1]):
392
411
  return True
412
+ if depth >= MAX_SHELL_NESTING:
413
+ return False
414
+ for index, token in enumerate(scoped_tokens):
415
+ program = token.rsplit("/", 1)[-1]
416
+ if program not in SHELL_PROGRAMS or not shell_starts_command(
417
+ scoped_tokens, index
418
+ ):
419
+ continue
420
+ cursor = index + 1
421
+ while cursor < len(scoped_tokens):
422
+ option = scoped_tokens[cursor]
423
+ if option in COMMAND_SEPARATORS or not option.startswith("-"):
424
+ break
425
+ cursor += 1
426
+ if "c" not in option[1:]:
427
+ continue
428
+ if cursor >= len(scoped_tokens):
429
+ break
430
+ payload = scoped_tokens[cursor]
431
+ if git_commit_skips_verification(payload, depth + 1):
432
+ return True
433
+ break
393
434
  return False
394
435
 
395
436
 
@@ -727,6 +727,10 @@ classify_rm_target() {
727
727
  set +f
728
728
  block "recursive forced delete of the current directory (rm -rf .)"
729
729
  ;;
730
+ .git | .git/* | */.git | */.git/*)
731
+ set +f
732
+ block "recursive forced delete of the git control plane (.git holds every commit, branch and stash not already pushed; nothing in the working tree can rebuild it)"
733
+ ;;
730
734
  .. | ../* | */.. | */../*)
731
735
  set +f
732
736
  block "recursive forced delete of a path outside the project (.. traversal)"
@@ -1034,11 +1038,16 @@ fi
1034
1038
  # purpose, and blocking those would be the collision that gets a guard switched
1035
1039
  # off. The trailing `([/[:space:]'"$qc"']|$)` is what draws that line.
1036
1040
  readonly GIT_CONTROL_PLANE='(^|[[:space:]='"$qc"'./])\.git([/[:space:]'"$qc"']|$)'
1037
- if matches_cs "$RM_RF_CLUSTER" || matches_cs "$RM_RF_SPLIT"; then
1038
- if matches_cs "$GIT_CONTROL_PLANE"; then
1041
+ while IFS= read -r git_stmt; do
1042
+ [ -n "$git_stmt" ] || continue
1043
+ if ! scan -E "$git_stmt" "$RM_RF_CLUSTER" \
1044
+ && ! scan -E "$git_stmt" "$RM_RF_SPLIT"; then
1045
+ continue
1046
+ fi
1047
+ if scan -E "$git_stmt" "$GIT_CONTROL_PLANE"; then
1039
1048
  block "recursive forced delete of the git control plane (.git holds every commit, branch and stash not already pushed; nothing in the working tree can rebuild it). Delete a specific ignored artifact instead, or re-clone if the checkout is genuinely to be discarded."
1040
1049
  fi
1041
- fi
1050
+ done <<< "$(printf '%s' "$normalized_command_str" | tr '&|;' '\n')"
1042
1051
 
1043
1052
  # 15. Credential stores. Reading one into an agent transcript is disclosure even
1044
1053
  # when nothing is copied anywhere: the value lands in a log, a context window,
@@ -1080,14 +1089,19 @@ has_private_dotenv_path() {
1080
1089
  | grep -Eio -- '(^|[[:space:]='"$qc"'./])\.env(\.[[:alnum:]_-]+)?')" \
1081
1090
  || dotenv_scan_status=$?
1082
1091
  if [ "$dotenv_scan_status" -gt 1 ]; then
1083
- block "dotenv path classification failed; denying the credential-store read fail-closed."
1092
+ scan_failed "$dotenv_scan_status"
1084
1093
  fi
1085
1094
 
1086
1095
  while IFS= read -r candidate; do
1087
1096
  [ -n "$candidate" ] || continue
1097
+ dotenv_normalize_status=0
1088
1098
  candidate="$(printf '%s' "$candidate" \
1089
1099
  | tr '[:upper:]' '[:lower:]' \
1090
- | grep -Eo -- '\.env(\.[[:alnum:]_-]+)?')"
1100
+ | grep -Eo -- '\.env(\.[[:alnum:]_-]+)?')" \
1101
+ || dotenv_normalize_status=$?
1102
+ if [ "$dotenv_normalize_status" -gt 1 ] || [ -z "$candidate" ]; then
1103
+ scan_failed "$dotenv_normalize_status"
1104
+ fi
1091
1105
  case "$candidate" in
1092
1106
  .env.example | .env.sample | .env.template | .env.dist | .env.schema | .env.defaults) ;;
1093
1107
  *) return 0 ;;
@@ -681,10 +681,12 @@ export function reconcileContexts({
681
681
  homes = {},
682
682
  pins = {},
683
683
  records,
684
+ awaited = [],
684
685
  }) {
685
686
  const liveContexts = live ?? [];
686
687
  const declaredNames = new Set(declared ?? []);
687
688
  const byName = (a, b) => a.localeCompare(b);
689
+ const awaitedContexts = new Set(awaited);
688
690
 
689
691
  // The unit of declaration is a (ruleset, context) PAIR, not a name. A name
690
692
  // set cannot hold `build` required by both `base` and `release`, so a live
@@ -723,6 +725,14 @@ export function reconcileContexts({
723
725
  // and repair converge. A gate-derived record names no ruleset and remains
724
726
  // name-only: it never declared which app may satisfy it.
725
727
  if (record.ruleset !== undefined) {
728
+ if (
729
+ record.integration_id === undefined &&
730
+ awaitedContexts.has(record.context)
731
+ ) {
732
+ return (
733
+ entry.integration_id === null || entry.integration_id === undefined
734
+ );
735
+ }
726
736
  const expected = record.integration_id ?? ACTIONS_INTEGRATION_ID;
727
737
  return entry.integration_id === expected;
728
738
  }
@@ -1412,6 +1422,7 @@ export function reconcile({
1412
1422
  ghMissing = false,
1413
1423
  }) {
1414
1424
  const configured = declaredChecks(requiredChecks);
1425
+ const awaited = awaitedContexts(gates, moment);
1415
1426
  const declared = [
1416
1427
  ...new Set([
1417
1428
  ...contextsFor(gates, { moment, workflowName, previousLabels }),
@@ -1466,6 +1477,7 @@ export function reconcile({
1466
1477
  homes: configured.homes,
1467
1478
  pins: configured.pins,
1468
1479
  records: configured.records,
1480
+ awaited,
1469
1481
  });
1470
1482
  const resolvedAwaitedHome = awaitedHome(live, rulesetName);
1471
1483
  const settings = reconcileSettings({ policy, live });
@@ -1487,7 +1499,7 @@ export function reconcile({
1487
1499
  live,
1488
1500
  prune,
1489
1501
  rulesetName,
1490
- awaited: awaitedContexts(gates, moment),
1502
+ awaited,
1491
1503
  pins: { ...configured.pins, ...awaitedPins(gates, moment) },
1492
1504
  // An awaited context has no ruleset in its declaration — it is declared
1493
1505
  // on a GATE. Its home defaults to the ruleset Lisa generates from
@@ -212,7 +212,7 @@ function assertSupportedKeywords(schema, instancePath) {
212
212
  * @throws {Error} When a validating keyword sits beside a `$ref`
213
213
  */
214
214
  function assertNoRefSiblings(schema, where) {
215
- if (!("$ref" in schema)) {
215
+ if (!Object.hasOwn(schema, "$ref")) {
216
216
  return;
217
217
  }
218
218
  const siblings = Object.keys(schema).filter(
@@ -370,7 +370,7 @@ function checkObjectKeywords(value, schema, root, instancePath, errors) {
370
370
  function validateNode(value, schema, root, instancePath, errors) {
371
371
  assertSupportedKeywords(schema, instancePath);
372
372
 
373
- if (typeof schema.$ref === "string") {
373
+ if (Object.hasOwn(schema, "$ref") && typeof schema.$ref === "string") {
374
374
  validateNode(
375
375
  value,
376
376
  resolveRef(schema.$ref, root),
@@ -1 +1 @@
1
- {"version":3,"file":"lisa-owned-hash-ledger.d.ts","sourceRoot":"","sources":["../../src/core/lisa-owned-hash-ledger.ts"],"names":[],"mappings":"AACA,6EAA6E;AAE7E;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAC3C,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CA8tBjC,CAAC;AAEH;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,+BAA+B,EAAE,QAAQ,CACpD,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAioBjC,CAAC"}
1
+ {"version":3,"file":"lisa-owned-hash-ledger.d.ts","sourceRoot":"","sources":["../../src/core/lisa-owned-hash-ledger.ts"],"names":[],"mappings":"AACA,6EAA6E;AAE7E;;;;;;;GAOG;AACH,eAAO,MAAM,sBAAsB,EAAE,QAAQ,CAC3C,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CA6uBjC,CAAC;AAEH;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,+BAA+B,EAAE,QAAQ,CACpD,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAgpBjC,CAAC"}
@@ -150,6 +150,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
150
150
  "scripts/check-nightly-e2e-health.mjs": Object.freeze([
151
151
  "03f57b46c1611806737203980ed0991f478177f883739cc8c3df2c8f219566af",
152
152
  "0cf6e997c623adacd198fe650b3900dce06558ebfd2637e6f6df562eee7e10f8",
153
+ "11608828a0ca51d4505e37742f8120102e68e081a92e054b631876b8d3a6d0bc",
153
154
  "191608d272178a8fd3126d5b3e4923fadb50e01b699d0376625248d541b14f50",
154
155
  "1c79ec49e5f4a3bba700bc1d97e9fc0f4f1799dec3acdf2bed5e3e5b866a0efd",
155
156
  "1e5d6787f99af1190b465903956a90270320eeca022c3a3ab6716e1a8b3ec57f",
@@ -219,6 +220,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
219
220
  "c04a78cb52beaa2e852846e03f42172a4e4a180222dcd54f4c305911249b68b1",
220
221
  "d386d621db2538ab7c5dfaa73f927c9ea87692d1a9e0ac02330a960c64af206e",
221
222
  "d649aaf3abf584272bb886b1a722afe16ea861186214284ac61f96b3386e63d7",
223
+ "da2e191a8fbfa4042b3bfff331bc2ee19077acb972b5cfc9cf35eba383115959",
222
224
  "dac550c4fd908149fb579625268b16d03657b626417633d8f743875d355ab173",
223
225
  "dc609502f848965baeee2576b4622cde502adc15f82ac282c0f30acf06342b77",
224
226
  "df59cbee6aaa71a3ccddfcba5d9d08b29610f98fa048519ec4fc35382d698183",
@@ -274,6 +276,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
274
276
  "503b51e9239411d07ce6b51dbe2b3079bb12e94bf7c0310e76247af19ff667e6",
275
277
  "6742cc12ea14fc99b7bef31ff03df68d5c4610b56fad43107790372e6d777eb1",
276
278
  "6b72a6a71078c838fdb0531e74898a5e36d942cad424b20480e2cd370b5264eb",
279
+ "a36a7bd7845878e5f1f991e896739ba4cc468e50f562b71a251ebe193ca151b6",
277
280
  "b4a0b1a0df6e944313b4a197925a0003fb9aed517fbd5708deda2a2a67f53faf",
278
281
  "d234617dc907bb563455419957f2f419702fcd1c10b9d39e19d5bab8ca962008",
279
282
  "e07bab7dc4c4c296e2007cf26fab694b1238545dc37816e88d849606d8f9e760",
@@ -289,6 +292,10 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
289
292
  "82191900c818a88208669a39563cfed8de1512de699a9ccf7155743e5eff859e",
290
293
  ]),
291
294
  "scripts/lib/process-tree-runner.mjs": Object.freeze([
295
+ "07c78da8a8e40e28cc59a40c3d19e798ae291fae0a0d4cd13a2e5c047d8e5ac7",
296
+ "2444f81b8a05af19f2bdc61d75cc6baa40a19c79f60dc815cafc6746dffda714",
297
+ "757c74e96c16a9a51c8b099c5e5caa7a2086a9fbdc41cc41348619d993d36a5c",
298
+ "eb73088635fddf236fca92d1c94324a889c503843155d436835b96d3ed6fa1f1",
292
299
  "fb68902c68b4cd156f26d2f743364f611a54b833bc445b5144b4c844f553f188",
293
300
  ]),
294
301
  "scripts/lisa-clean-git-env.sh": Object.freeze([
@@ -333,6 +340,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
333
340
  "63879152ebb67f289e900167daf035f2d03d7773c6e110ed5ab708c95417c55c",
334
341
  "9f42451a38eabd69e453fbaabd34de2490dfbc8ab79b1d7a2f27f574d3314090",
335
342
  "c765c7a44ea81d54c7820f2068c8811fb73ca3e5f063cb55a8c30391d1326323",
343
+ "f82f3af91663988d003d30542f96189ad65210e0aa4dcc1b42e6c7c8752d5618",
336
344
  "f8c8e276fa6d68ed661f07882f20ee095d18a5e8a90136f78f1ed2b032ce33d4",
337
345
  "f936bc8a038a7901ade1ba58cc52e5f5a8b8b2a52a9f0c1516567cc80eb02ccb",
338
346
  ]),
@@ -345,6 +353,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
345
353
  "41060648b4394d417528f4f560a52f296b4df5b6ec8a5633e08afe4588b6a088",
346
354
  "557065f223dfc0715a20c3de76bafee0aefe22f52385c52e17cfc7b9398cce2d",
347
355
  "8870dba7b299ddb528e01fee32ec01cd8994a72118708ea8d3255be3daedfa72",
356
+ "8da563431ebfeb01ff6681fe47317bad1524863289460cc6ccdc7c8e07014aa7",
348
357
  "9cba6e0103c27850703323da25ac149c0136225172f1a1640abe3b3ac4e50a8e",
349
358
  "a612f172282d13ba9318fe5e03689d7c6ff42a0122d0c9d5d39051e1967b93dc",
350
359
  "ed0ded7369071c8fbb93cfa4e216177279d75d769cc78f24cce6239997e95659",
@@ -512,6 +521,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
512
521
  "33e2bd341eb992036059b0c4606db35a218adcfeca7e44d174fedf8ebdff29d2",
513
522
  "3b93a0affab6413e3c14a6f43de5acb586286ed1819ece0a66b30429b4d00490",
514
523
  "3ff7255f395a9552366faaac34d383f4c95fecfb39882cd1d57854356422fe61",
524
+ "6fbfd93da39c9a1077f0e9e265fc2b2f82873ba82abdca0cd757cffd272fe9ac",
515
525
  "759dfd7552c1a4a8bf7172ffd88671a37571155877ea2459d26f6a79c6ab57ee",
516
526
  "7790a560850c9d38709dbaccdaa10733e632c1bd4d975cbec7e3cc5a8650b36a",
517
527
  "83a8b8108654086afb6a6f23a8f09f9f041eb2cd4094c5531fa7ab1f75e873dc",
@@ -548,6 +558,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
548
558
  "9404c374cbd90a0860410080f1044d087c51d84bb4c0a37343c2b632c3a9d03b",
549
559
  "a211f1a06aecddb841851463da302f694ab0eafff6bab75ee944b0a58aac431d",
550
560
  "a22fd1b7c483f1a538202353ee85c82be17a8910e03c0a930635ce8cb3595c64",
561
+ "b5505f55a5092f1d451ae5a01ada85a031e5b063d08fc0ce5527d94b67191a60",
551
562
  "b83c5043a0f29b2d8851258acfe6906aab7922cd80f486e25220e55f26a8c0a5",
552
563
  "baf3c78b7c333735142cc1a7bc19369f953a4699f7be517bb4e3c12167d5c60b",
553
564
  "c4a51de3f1512e7e18935612137e4ddaf548db68f878d8239fcc85436b0f27c7",
@@ -583,6 +594,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
583
594
  "587ab62a419ca6f104f5b82a3bd89c11f04600faec1824876ba536699ad59f7e",
584
595
  "600e0643ff88168c5bccea564cca9fcfea0005ca79bfc2206403ffcca8a4a193",
585
596
  "660d0b833ac5ffcb93cb3c478b6b840492a0ae049ff3b6f87275f78537ef7258",
597
+ "6c95bb777c84908023c02d8b98ed87e4a09567e9f62cf63275673d696b7bb874",
586
598
  "6e41817a015d5360336ca4e078fa1c787d9976b762e8d9a07d62c41a2fb52f25",
587
599
  "7d8d24dea151ef2178807046e97aea7ebfadd9c88eb50347feb7bb4bb190227d",
588
600
  "7ea75f5ff66b71ec551b7116ef855ac1d1c48a3ce3d7b51b3aea893a017dcd0c",
@@ -611,6 +623,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
611
623
  "3c062d0b79961a9a93a822507e893dcdaa71d65d735557727d20464c2489d812",
612
624
  "3e67eb4b0710ec195ad7efa4a8c2fd64063897d67725ea2627cf869c7e066201",
613
625
  "4b383ff960d7da53e0dd46e37632ef55c5a38b004fb4aabfe91a25a9fe02d88f",
626
+ "5408b14528557c2301b69a4d93a64d7930d3b66dc416702c9f33a72759a66c5c",
614
627
  "5c6b8a6ff3010b11f78b70eda0e73e78e1155b634a781b8abec79e40ac286eb7",
615
628
  "6261f7630e71bd95792083f5459a2802382cae95101c724a7311e3810af6c576",
616
629
  "9b613888c4c1cc6cc2b1fb6e162a4c766012eab0ec4f8b7f2ac1bc3da6622c97",
@@ -663,6 +676,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
663
676
  "8a1684f5c2b4d37fc782d2090273772814f7ad6c61e7ae5459163a1f28b7a5dc",
664
677
  "9dd145c0f9dac6ed252b13d32e130dbab964da6cd357981b58541780ecb2f981",
665
678
  "bd72dc7d240509eeb4a8f10e8ff64976d8223c1a270a482ac12a0daeae68a5c7",
679
+ "f70ecd3712dd2ca77a8851c7505ce79f948a57e5a2e28f56c5d0ccd047712688",
666
680
  ]),
667
681
  "scripts/lisa-test-node.mjs": Object.freeze([
668
682
  "31b338144af00e20e3de02202982846d7333433a9bbda76a8c77d50e6fdbc47b",
@@ -736,6 +750,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
736
750
  "39cb2fb53f1cc939675e7f8d5530a760abac420c2259fc97108d21f15c0275e9",
737
751
  "47d44b2bca383ae395b4e415e06c97a127327ab13762ee95b8c43d0198639bbb",
738
752
  "8fa58cc7276add0b2edf1de92bdcc32d81d840811ef0614ddc724010b59a888c",
753
+ "9281e995587ad2c73e15c4381ec4ecfa40fd789f171c0698cdcf8dea32539e62",
739
754
  "93190f926689725418c1ec9eae15c55910b128cff6e3cb10185e466c7b90cc4f",
740
755
  "db14245ed89b483912af287bdee917a7a921dc21bb29b49be37fc799c05c413f",
741
756
  "f50e35d11295a836bd5b6d818aed6daea68ff70bdffbbdf9f67b09984a2628da",
@@ -894,6 +909,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
894
909
  "scripts/check-nightly-e2e-health.mjs": Object.freeze([
895
910
  "03f57b46c1611806737203980ed0991f478177f883739cc8c3df2c8f219566af",
896
911
  "0cf6e997c623adacd198fe650b3900dce06558ebfd2637e6f6df562eee7e10f8",
912
+ "11608828a0ca51d4505e37742f8120102e68e081a92e054b631876b8d3a6d0bc",
897
913
  "191608d272178a8fd3126d5b3e4923fadb50e01b699d0376625248d541b14f50",
898
914
  "1c79ec49e5f4a3bba700bc1d97e9fc0f4f1799dec3acdf2bed5e3e5b866a0efd",
899
915
  "1e5d6787f99af1190b465903956a90270320eeca022c3a3ab6716e1a8b3ec57f",
@@ -950,6 +966,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
950
966
  "c04a78cb52beaa2e852846e03f42172a4e4a180222dcd54f4c305911249b68b1",
951
967
  "d386d621db2538ab7c5dfaa73f927c9ea87692d1a9e0ac02330a960c64af206e",
952
968
  "d649aaf3abf584272bb886b1a722afe16ea861186214284ac61f96b3386e63d7",
969
+ "da2e191a8fbfa4042b3bfff331bc2ee19077acb972b5cfc9cf35eba383115959",
953
970
  "dac550c4fd908149fb579625268b16d03657b626417633d8f743875d355ab173",
954
971
  "dc609502f848965baeee2576b4622cde502adc15f82ac282c0f30acf06342b77",
955
972
  "df59cbee6aaa71a3ccddfcba5d9d08b29610f98fa048519ec4fc35382d698183",
@@ -1002,6 +1019,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1002
1019
  "4503ddbe7bd54cd553db2b5952972d5319d6b6eb39a258b7c58577b61c7e7ce7",
1003
1020
  "503b51e9239411d07ce6b51dbe2b3079bb12e94bf7c0310e76247af19ff667e6",
1004
1021
  "6742cc12ea14fc99b7bef31ff03df68d5c4610b56fad43107790372e6d777eb1",
1022
+ "a36a7bd7845878e5f1f991e896739ba4cc468e50f562b71a251ebe193ca151b6",
1005
1023
  "b4a0b1a0df6e944313b4a197925a0003fb9aed517fbd5708deda2a2a67f53faf",
1006
1024
  "d234617dc907bb563455419957f2f419702fcd1c10b9d39e19d5bab8ca962008",
1007
1025
  "e07bab7dc4c4c296e2007cf26fab694b1238545dc37816e88d849606d8f9e760",
@@ -1017,6 +1035,10 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1017
1035
  "82191900c818a88208669a39563cfed8de1512de699a9ccf7155743e5eff859e",
1018
1036
  ]),
1019
1037
  "scripts/lib/process-tree-runner.mjs": Object.freeze([
1038
+ "07c78da8a8e40e28cc59a40c3d19e798ae291fae0a0d4cd13a2e5c047d8e5ac7",
1039
+ "2444f81b8a05af19f2bdc61d75cc6baa40a19c79f60dc815cafc6746dffda714",
1040
+ "757c74e96c16a9a51c8b099c5e5caa7a2086a9fbdc41cc41348619d993d36a5c",
1041
+ "eb73088635fddf236fca92d1c94324a889c503843155d436835b96d3ed6fa1f1",
1020
1042
  "fb68902c68b4cd156f26d2f743364f611a54b833bc445b5144b4c844f553f188",
1021
1043
  ]),
1022
1044
  "scripts/lisa-clean-git-env.sh": Object.freeze([
@@ -1060,6 +1082,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1060
1082
  "63879152ebb67f289e900167daf035f2d03d7773c6e110ed5ab708c95417c55c",
1061
1083
  "9f42451a38eabd69e453fbaabd34de2490dfbc8ab79b1d7a2f27f574d3314090",
1062
1084
  "c765c7a44ea81d54c7820f2068c8811fb73ca3e5f063cb55a8c30391d1326323",
1085
+ "f82f3af91663988d003d30542f96189ad65210e0aa4dcc1b42e6c7c8752d5618",
1063
1086
  "f8c8e276fa6d68ed661f07882f20ee095d18a5e8a90136f78f1ed2b032ce33d4",
1064
1087
  "f936bc8a038a7901ade1ba58cc52e5f5a8b8b2a52a9f0c1516567cc80eb02ccb",
1065
1088
  ]),
@@ -1071,6 +1094,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1071
1094
  "41060648b4394d417528f4f560a52f296b4df5b6ec8a5633e08afe4588b6a088",
1072
1095
  "557065f223dfc0715a20c3de76bafee0aefe22f52385c52e17cfc7b9398cce2d",
1073
1096
  "8870dba7b299ddb528e01fee32ec01cd8994a72118708ea8d3255be3daedfa72",
1097
+ "8da563431ebfeb01ff6681fe47317bad1524863289460cc6ccdc7c8e07014aa7",
1074
1098
  "9cba6e0103c27850703323da25ac149c0136225172f1a1640abe3b3ac4e50a8e",
1075
1099
  "a612f172282d13ba9318fe5e03689d7c6ff42a0122d0c9d5d39051e1967b93dc",
1076
1100
  "ed0ded7369071c8fbb93cfa4e216177279d75d769cc78f24cce6239997e95659",
@@ -1195,6 +1219,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1195
1219
  "33e2bd341eb992036059b0c4606db35a218adcfeca7e44d174fedf8ebdff29d2",
1196
1220
  "3b93a0affab6413e3c14a6f43de5acb586286ed1819ece0a66b30429b4d00490",
1197
1221
  "3ff7255f395a9552366faaac34d383f4c95fecfb39882cd1d57854356422fe61",
1222
+ "6fbfd93da39c9a1077f0e9e265fc2b2f82873ba82abdca0cd757cffd272fe9ac",
1198
1223
  "759dfd7552c1a4a8bf7172ffd88671a37571155877ea2459d26f6a79c6ab57ee",
1199
1224
  "7790a560850c9d38709dbaccdaa10733e632c1bd4d975cbec7e3cc5a8650b36a",
1200
1225
  "83a8b8108654086afb6a6f23a8f09f9f041eb2cd4094c5531fa7ab1f75e873dc",
@@ -1230,6 +1255,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1230
1255
  "9404c374cbd90a0860410080f1044d087c51d84bb4c0a37343c2b632c3a9d03b",
1231
1256
  "a211f1a06aecddb841851463da302f694ab0eafff6bab75ee944b0a58aac431d",
1232
1257
  "a22fd1b7c483f1a538202353ee85c82be17a8910e03c0a930635ce8cb3595c64",
1258
+ "b5505f55a5092f1d451ae5a01ada85a031e5b063d08fc0ce5527d94b67191a60",
1233
1259
  "b83c5043a0f29b2d8851258acfe6906aab7922cd80f486e25220e55f26a8c0a5",
1234
1260
  "c4a51de3f1512e7e18935612137e4ddaf548db68f878d8239fcc85436b0f27c7",
1235
1261
  "c57b70eed03b74e7c8335c40b0c2b1102e217e507337b71fcf3d2bec5a450bf8",
@@ -1258,6 +1284,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1258
1284
  "4ba3e8b081a4eb115d2da9e73b8a763a38ab8feb2646def7412dfd00ed18b4b0",
1259
1285
  "587ab62a419ca6f104f5b82a3bd89c11f04600faec1824876ba536699ad59f7e",
1260
1286
  "660d0b833ac5ffcb93cb3c478b6b840492a0ae049ff3b6f87275f78537ef7258",
1287
+ "6c95bb777c84908023c02d8b98ed87e4a09567e9f62cf63275673d696b7bb874",
1261
1288
  "6e41817a015d5360336ca4e078fa1c787d9976b762e8d9a07d62c41a2fb52f25",
1262
1289
  "7d8d24dea151ef2178807046e97aea7ebfadd9c88eb50347feb7bb4bb190227d",
1263
1290
  "86fd0c6f6b8106a10af937bfbce94927603ffa8adcb188e350a659c96e3fc502",
@@ -1280,6 +1307,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1280
1307
  "395897d1dc3f0ac92d7c892eaa9b9ddf12078181bb9f5b228965478190b09a91",
1281
1308
  "3c062d0b79961a9a93a822507e893dcdaa71d65d735557727d20464c2489d812",
1282
1309
  "3e67eb4b0710ec195ad7efa4a8c2fd64063897d67725ea2627cf869c7e066201",
1310
+ "5408b14528557c2301b69a4d93a64d7930d3b66dc416702c9f33a72759a66c5c",
1283
1311
  "5c6b8a6ff3010b11f78b70eda0e73e78e1155b634a781b8abec79e40ac286eb7",
1284
1312
  "6261f7630e71bd95792083f5459a2802382cae95101c724a7311e3810af6c576",
1285
1313
  "9b613888c4c1cc6cc2b1fb6e162a4c766012eab0ec4f8b7f2ac1bc3da6622c97",
@@ -1324,6 +1352,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1324
1352
  "8a1684f5c2b4d37fc782d2090273772814f7ad6c61e7ae5459163a1f28b7a5dc",
1325
1353
  "9dd145c0f9dac6ed252b13d32e130dbab964da6cd357981b58541780ecb2f981",
1326
1354
  "bd72dc7d240509eeb4a8f10e8ff64976d8223c1a270a482ac12a0daeae68a5c7",
1355
+ "f70ecd3712dd2ca77a8851c7505ce79f948a57e5a2e28f56c5d0ccd047712688",
1327
1356
  ]),
1328
1357
  "scripts/lisa-test-node.mjs": Object.freeze([
1329
1358
  "31b338144af00e20e3de02202982846d7333433a9bbda76a8c77d50e6fdbc47b",
@@ -1393,6 +1422,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1393
1422
  "39cb2fb53f1cc939675e7f8d5530a760abac420c2259fc97108d21f15c0275e9",
1394
1423
  "47d44b2bca383ae395b4e415e06c97a127327ab13762ee95b8c43d0198639bbb",
1395
1424
  "8fa58cc7276add0b2edf1de92bdcc32d81d840811ef0614ddc724010b59a888c",
1425
+ "9281e995587ad2c73e15c4381ec4ecfa40fd789f171c0698cdcf8dea32539e62",
1396
1426
  "93190f926689725418c1ec9eae15c55910b128cff6e3cb10185e466c7b90cc4f",
1397
1427
  "db14245ed89b483912af287bdee917a7a921dc21bb29b49be37fc799c05c413f",
1398
1428
  "f50e35d11295a836bd5b6d818aed6daea68ff70bdffbbdf9f67b09984a2628da",