@codyswann/lisa 4.22.12 → 4.22.13

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 +62 -11
  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 +24 -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 +1 -1
  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 +1 -1
  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 +1 -1
  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 +1 -1
  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 +1 -1
  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 +1 -1
  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,9 @@ 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"];
22
25
 
23
26
  function parseArguments(argv) {
24
27
  const timeoutArg = argv.find(value => value.startsWith("--timeout-ms="));
@@ -49,6 +52,26 @@ function killTree(pid, signal) {
49
52
  }
50
53
  }
51
54
 
55
+ function treeExists(pid) {
56
+ if (process.platform === "win32") return false;
57
+ try {
58
+ process.kill(-pid, 0);
59
+ return true;
60
+ } catch {
61
+ return false;
62
+ }
63
+ }
64
+
65
+ async function reapTree(pid) {
66
+ killTree(pid, "SIGTERM");
67
+ if (!treeExists(pid)) return;
68
+ const deadline = Date.now() + KILL_GRACE_MS;
69
+ while (treeExists(pid) && Date.now() < deadline) {
70
+ await new Promise(resolve => setTimeout(resolve, REAP_POLL_MS));
71
+ }
72
+ if (treeExists(pid)) killTree(pid, "SIGKILL");
73
+ }
74
+
52
75
  export function supervise(command, timeoutMs) {
53
76
  return new Promise((resolve, reject) => {
54
77
  const shell =
@@ -72,34 +95,62 @@ export function supervise(command, timeoutMs) {
72
95
 
73
96
  let timedOut = false;
74
97
  let settled = false;
75
- const finish = (code, signal) => {
98
+ let terminating = false;
99
+ const signalHandlers = new Map();
100
+ const cleanup = () => {
101
+ clearTimeout(deadline);
102
+ for (const [signal, handler] of signalHandlers) {
103
+ process.off(signal, handler);
104
+ }
105
+ signalHandlers.clear();
106
+ };
107
+ const finish = async (code, signal) => {
76
108
  if (settled) return;
77
109
  settled = true;
78
- clearTimeout(deadline);
110
+ cleanup();
79
111
  // 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");
112
+ // exits. Reap that residue fully before returning a verdict too.
113
+ await reapTree(pid);
82
114
  resolve({ code, signal });
83
115
  };
84
116
 
117
+ const relaySignal = signal => {
118
+ if (terminating) return;
119
+ terminating = true;
120
+ cleanup();
121
+ reapTree(pid).finally(() => {
122
+ // Restore the signal-shaped exit after the detached tree is gone.
123
+ process.kill(process.pid, signal);
124
+ });
125
+ };
126
+ for (const signal of TERMINATING_SIGNALS) {
127
+ const handler = () => relaySignal(signal);
128
+ signalHandlers.set(signal, handler);
129
+ process.once(signal, handler);
130
+ }
131
+
85
132
  const deadline = setTimeout(() => {
86
133
  timedOut = true;
87
- killTree(pid, "SIGTERM");
88
- setTimeout(() => {
89
- killTree(pid, "SIGKILL");
134
+ cleanup();
135
+ reapTree(pid).finally(() => {
90
136
  // A signal-shaped result is the existing gate runner vocabulary for
91
137
  // "no verdict". It also prevents an ordinary exit code such as 124
92
138
  // from being confused with a user command that returned that code.
93
139
  if (process.platform === "win32") {
94
- process.exit(124);
140
+ // Windows has no signal-shaped process result. 255 is a dedicated
141
+ // supervisor timeout code with a documented (but unavoidable)
142
+ // collision risk, well outside ordinary command exit conventions.
143
+ process.exit(WINDOWS_TIMEOUT_EXIT_CODE);
95
144
  } else {
96
145
  process.kill(process.pid, "SIGKILL");
97
146
  }
98
- }, KILL_GRACE_MS);
147
+ });
99
148
  }, timeoutMs);
100
149
 
101
150
  child.once("error", error => {
102
- clearTimeout(deadline);
151
+ if (settled) return;
152
+ settled = true;
153
+ cleanup();
103
154
  killTree(pid, "SIGKILL");
104
155
  reject(error);
105
156
  });
@@ -107,7 +158,7 @@ export function supervise(command, timeoutMs) {
107
158
  // On timeout, wait for the forced group reap above before this supervisor
108
159
  // ends. Exiting on the direct shell's close is the race that used to leave
109
160
  // its descendants alive.
110
- if (!timedOut) finish(code, signal);
161
+ if (!timedOut) void finish(code, signal);
111
162
  });
112
163
  });
113
164
  }
@@ -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,CA0uBjC,CAAC;AAEH;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,+BAA+B,EAAE,QAAQ,CACpD,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CA6oBjC,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,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
289
292
  "82191900c818a88208669a39563cfed8de1512de699a9ccf7155743e5eff859e",
290
293
  ]),
291
294
  "scripts/lib/process-tree-runner.mjs": Object.freeze([
295
+ "757c74e96c16a9a51c8b099c5e5caa7a2086a9fbdc41cc41348619d993d36a5c",
292
296
  "fb68902c68b4cd156f26d2f743364f611a54b833bc445b5144b4c844f553f188",
293
297
  ]),
294
298
  "scripts/lisa-clean-git-env.sh": Object.freeze([
@@ -333,6 +337,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
333
337
  "63879152ebb67f289e900167daf035f2d03d7773c6e110ed5ab708c95417c55c",
334
338
  "9f42451a38eabd69e453fbaabd34de2490dfbc8ab79b1d7a2f27f574d3314090",
335
339
  "c765c7a44ea81d54c7820f2068c8811fb73ca3e5f063cb55a8c30391d1326323",
340
+ "f82f3af91663988d003d30542f96189ad65210e0aa4dcc1b42e6c7c8752d5618",
336
341
  "f8c8e276fa6d68ed661f07882f20ee095d18a5e8a90136f78f1ed2b032ce33d4",
337
342
  "f936bc8a038a7901ade1ba58cc52e5f5a8b8b2a52a9f0c1516567cc80eb02ccb",
338
343
  ]),
@@ -345,6 +350,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
345
350
  "41060648b4394d417528f4f560a52f296b4df5b6ec8a5633e08afe4588b6a088",
346
351
  "557065f223dfc0715a20c3de76bafee0aefe22f52385c52e17cfc7b9398cce2d",
347
352
  "8870dba7b299ddb528e01fee32ec01cd8994a72118708ea8d3255be3daedfa72",
353
+ "8da563431ebfeb01ff6681fe47317bad1524863289460cc6ccdc7c8e07014aa7",
348
354
  "9cba6e0103c27850703323da25ac149c0136225172f1a1640abe3b3ac4e50a8e",
349
355
  "a612f172282d13ba9318fe5e03689d7c6ff42a0122d0c9d5d39051e1967b93dc",
350
356
  "ed0ded7369071c8fbb93cfa4e216177279d75d769cc78f24cce6239997e95659",
@@ -512,6 +518,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
512
518
  "33e2bd341eb992036059b0c4606db35a218adcfeca7e44d174fedf8ebdff29d2",
513
519
  "3b93a0affab6413e3c14a6f43de5acb586286ed1819ece0a66b30429b4d00490",
514
520
  "3ff7255f395a9552366faaac34d383f4c95fecfb39882cd1d57854356422fe61",
521
+ "6fbfd93da39c9a1077f0e9e265fc2b2f82873ba82abdca0cd757cffd272fe9ac",
515
522
  "759dfd7552c1a4a8bf7172ffd88671a37571155877ea2459d26f6a79c6ab57ee",
516
523
  "7790a560850c9d38709dbaccdaa10733e632c1bd4d975cbec7e3cc5a8650b36a",
517
524
  "83a8b8108654086afb6a6f23a8f09f9f041eb2cd4094c5531fa7ab1f75e873dc",
@@ -548,6 +555,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
548
555
  "9404c374cbd90a0860410080f1044d087c51d84bb4c0a37343c2b632c3a9d03b",
549
556
  "a211f1a06aecddb841851463da302f694ab0eafff6bab75ee944b0a58aac431d",
550
557
  "a22fd1b7c483f1a538202353ee85c82be17a8910e03c0a930635ce8cb3595c64",
558
+ "b5505f55a5092f1d451ae5a01ada85a031e5b063d08fc0ce5527d94b67191a60",
551
559
  "b83c5043a0f29b2d8851258acfe6906aab7922cd80f486e25220e55f26a8c0a5",
552
560
  "baf3c78b7c333735142cc1a7bc19369f953a4699f7be517bb4e3c12167d5c60b",
553
561
  "c4a51de3f1512e7e18935612137e4ddaf548db68f878d8239fcc85436b0f27c7",
@@ -583,6 +591,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
583
591
  "587ab62a419ca6f104f5b82a3bd89c11f04600faec1824876ba536699ad59f7e",
584
592
  "600e0643ff88168c5bccea564cca9fcfea0005ca79bfc2206403ffcca8a4a193",
585
593
  "660d0b833ac5ffcb93cb3c478b6b840492a0ae049ff3b6f87275f78537ef7258",
594
+ "6c95bb777c84908023c02d8b98ed87e4a09567e9f62cf63275673d696b7bb874",
586
595
  "6e41817a015d5360336ca4e078fa1c787d9976b762e8d9a07d62c41a2fb52f25",
587
596
  "7d8d24dea151ef2178807046e97aea7ebfadd9c88eb50347feb7bb4bb190227d",
588
597
  "7ea75f5ff66b71ec551b7116ef855ac1d1c48a3ce3d7b51b3aea893a017dcd0c",
@@ -611,6 +620,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
611
620
  "3c062d0b79961a9a93a822507e893dcdaa71d65d735557727d20464c2489d812",
612
621
  "3e67eb4b0710ec195ad7efa4a8c2fd64063897d67725ea2627cf869c7e066201",
613
622
  "4b383ff960d7da53e0dd46e37632ef55c5a38b004fb4aabfe91a25a9fe02d88f",
623
+ "5408b14528557c2301b69a4d93a64d7930d3b66dc416702c9f33a72759a66c5c",
614
624
  "5c6b8a6ff3010b11f78b70eda0e73e78e1155b634a781b8abec79e40ac286eb7",
615
625
  "6261f7630e71bd95792083f5459a2802382cae95101c724a7311e3810af6c576",
616
626
  "9b613888c4c1cc6cc2b1fb6e162a4c766012eab0ec4f8b7f2ac1bc3da6622c97",
@@ -663,6 +673,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
663
673
  "8a1684f5c2b4d37fc782d2090273772814f7ad6c61e7ae5459163a1f28b7a5dc",
664
674
  "9dd145c0f9dac6ed252b13d32e130dbab964da6cd357981b58541780ecb2f981",
665
675
  "bd72dc7d240509eeb4a8f10e8ff64976d8223c1a270a482ac12a0daeae68a5c7",
676
+ "f70ecd3712dd2ca77a8851c7505ce79f948a57e5a2e28f56c5d0ccd047712688",
666
677
  ]),
667
678
  "scripts/lisa-test-node.mjs": Object.freeze([
668
679
  "31b338144af00e20e3de02202982846d7333433a9bbda76a8c77d50e6fdbc47b",
@@ -736,6 +747,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
736
747
  "39cb2fb53f1cc939675e7f8d5530a760abac420c2259fc97108d21f15c0275e9",
737
748
  "47d44b2bca383ae395b4e415e06c97a127327ab13762ee95b8c43d0198639bbb",
738
749
  "8fa58cc7276add0b2edf1de92bdcc32d81d840811ef0614ddc724010b59a888c",
750
+ "9281e995587ad2c73e15c4381ec4ecfa40fd789f171c0698cdcf8dea32539e62",
739
751
  "93190f926689725418c1ec9eae15c55910b128cff6e3cb10185e466c7b90cc4f",
740
752
  "db14245ed89b483912af287bdee917a7a921dc21bb29b49be37fc799c05c413f",
741
753
  "f50e35d11295a836bd5b6d818aed6daea68ff70bdffbbdf9f67b09984a2628da",
@@ -894,6 +906,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
894
906
  "scripts/check-nightly-e2e-health.mjs": Object.freeze([
895
907
  "03f57b46c1611806737203980ed0991f478177f883739cc8c3df2c8f219566af",
896
908
  "0cf6e997c623adacd198fe650b3900dce06558ebfd2637e6f6df562eee7e10f8",
909
+ "11608828a0ca51d4505e37742f8120102e68e081a92e054b631876b8d3a6d0bc",
897
910
  "191608d272178a8fd3126d5b3e4923fadb50e01b699d0376625248d541b14f50",
898
911
  "1c79ec49e5f4a3bba700bc1d97e9fc0f4f1799dec3acdf2bed5e3e5b866a0efd",
899
912
  "1e5d6787f99af1190b465903956a90270320eeca022c3a3ab6716e1a8b3ec57f",
@@ -950,6 +963,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
950
963
  "c04a78cb52beaa2e852846e03f42172a4e4a180222dcd54f4c305911249b68b1",
951
964
  "d386d621db2538ab7c5dfaa73f927c9ea87692d1a9e0ac02330a960c64af206e",
952
965
  "d649aaf3abf584272bb886b1a722afe16ea861186214284ac61f96b3386e63d7",
966
+ "da2e191a8fbfa4042b3bfff331bc2ee19077acb972b5cfc9cf35eba383115959",
953
967
  "dac550c4fd908149fb579625268b16d03657b626417633d8f743875d355ab173",
954
968
  "dc609502f848965baeee2576b4622cde502adc15f82ac282c0f30acf06342b77",
955
969
  "df59cbee6aaa71a3ccddfcba5d9d08b29610f98fa048519ec4fc35382d698183",
@@ -1002,6 +1016,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1002
1016
  "4503ddbe7bd54cd553db2b5952972d5319d6b6eb39a258b7c58577b61c7e7ce7",
1003
1017
  "503b51e9239411d07ce6b51dbe2b3079bb12e94bf7c0310e76247af19ff667e6",
1004
1018
  "6742cc12ea14fc99b7bef31ff03df68d5c4610b56fad43107790372e6d777eb1",
1019
+ "a36a7bd7845878e5f1f991e896739ba4cc468e50f562b71a251ebe193ca151b6",
1005
1020
  "b4a0b1a0df6e944313b4a197925a0003fb9aed517fbd5708deda2a2a67f53faf",
1006
1021
  "d234617dc907bb563455419957f2f419702fcd1c10b9d39e19d5bab8ca962008",
1007
1022
  "e07bab7dc4c4c296e2007cf26fab694b1238545dc37816e88d849606d8f9e760",
@@ -1017,6 +1032,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1017
1032
  "82191900c818a88208669a39563cfed8de1512de699a9ccf7155743e5eff859e",
1018
1033
  ]),
1019
1034
  "scripts/lib/process-tree-runner.mjs": Object.freeze([
1035
+ "757c74e96c16a9a51c8b099c5e5caa7a2086a9fbdc41cc41348619d993d36a5c",
1020
1036
  "fb68902c68b4cd156f26d2f743364f611a54b833bc445b5144b4c844f553f188",
1021
1037
  ]),
1022
1038
  "scripts/lisa-clean-git-env.sh": Object.freeze([
@@ -1060,6 +1076,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1060
1076
  "63879152ebb67f289e900167daf035f2d03d7773c6e110ed5ab708c95417c55c",
1061
1077
  "9f42451a38eabd69e453fbaabd34de2490dfbc8ab79b1d7a2f27f574d3314090",
1062
1078
  "c765c7a44ea81d54c7820f2068c8811fb73ca3e5f063cb55a8c30391d1326323",
1079
+ "f82f3af91663988d003d30542f96189ad65210e0aa4dcc1b42e6c7c8752d5618",
1063
1080
  "f8c8e276fa6d68ed661f07882f20ee095d18a5e8a90136f78f1ed2b032ce33d4",
1064
1081
  "f936bc8a038a7901ade1ba58cc52e5f5a8b8b2a52a9f0c1516567cc80eb02ccb",
1065
1082
  ]),
@@ -1071,6 +1088,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1071
1088
  "41060648b4394d417528f4f560a52f296b4df5b6ec8a5633e08afe4588b6a088",
1072
1089
  "557065f223dfc0715a20c3de76bafee0aefe22f52385c52e17cfc7b9398cce2d",
1073
1090
  "8870dba7b299ddb528e01fee32ec01cd8994a72118708ea8d3255be3daedfa72",
1091
+ "8da563431ebfeb01ff6681fe47317bad1524863289460cc6ccdc7c8e07014aa7",
1074
1092
  "9cba6e0103c27850703323da25ac149c0136225172f1a1640abe3b3ac4e50a8e",
1075
1093
  "a612f172282d13ba9318fe5e03689d7c6ff42a0122d0c9d5d39051e1967b93dc",
1076
1094
  "ed0ded7369071c8fbb93cfa4e216177279d75d769cc78f24cce6239997e95659",
@@ -1195,6 +1213,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1195
1213
  "33e2bd341eb992036059b0c4606db35a218adcfeca7e44d174fedf8ebdff29d2",
1196
1214
  "3b93a0affab6413e3c14a6f43de5acb586286ed1819ece0a66b30429b4d00490",
1197
1215
  "3ff7255f395a9552366faaac34d383f4c95fecfb39882cd1d57854356422fe61",
1216
+ "6fbfd93da39c9a1077f0e9e265fc2b2f82873ba82abdca0cd757cffd272fe9ac",
1198
1217
  "759dfd7552c1a4a8bf7172ffd88671a37571155877ea2459d26f6a79c6ab57ee",
1199
1218
  "7790a560850c9d38709dbaccdaa10733e632c1bd4d975cbec7e3cc5a8650b36a",
1200
1219
  "83a8b8108654086afb6a6f23a8f09f9f041eb2cd4094c5531fa7ab1f75e873dc",
@@ -1230,6 +1249,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1230
1249
  "9404c374cbd90a0860410080f1044d087c51d84bb4c0a37343c2b632c3a9d03b",
1231
1250
  "a211f1a06aecddb841851463da302f694ab0eafff6bab75ee944b0a58aac431d",
1232
1251
  "a22fd1b7c483f1a538202353ee85c82be17a8910e03c0a930635ce8cb3595c64",
1252
+ "b5505f55a5092f1d451ae5a01ada85a031e5b063d08fc0ce5527d94b67191a60",
1233
1253
  "b83c5043a0f29b2d8851258acfe6906aab7922cd80f486e25220e55f26a8c0a5",
1234
1254
  "c4a51de3f1512e7e18935612137e4ddaf548db68f878d8239fcc85436b0f27c7",
1235
1255
  "c57b70eed03b74e7c8335c40b0c2b1102e217e507337b71fcf3d2bec5a450bf8",
@@ -1258,6 +1278,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1258
1278
  "4ba3e8b081a4eb115d2da9e73b8a763a38ab8feb2646def7412dfd00ed18b4b0",
1259
1279
  "587ab62a419ca6f104f5b82a3bd89c11f04600faec1824876ba536699ad59f7e",
1260
1280
  "660d0b833ac5ffcb93cb3c478b6b840492a0ae049ff3b6f87275f78537ef7258",
1281
+ "6c95bb777c84908023c02d8b98ed87e4a09567e9f62cf63275673d696b7bb874",
1261
1282
  "6e41817a015d5360336ca4e078fa1c787d9976b762e8d9a07d62c41a2fb52f25",
1262
1283
  "7d8d24dea151ef2178807046e97aea7ebfadd9c88eb50347feb7bb4bb190227d",
1263
1284
  "86fd0c6f6b8106a10af937bfbce94927603ffa8adcb188e350a659c96e3fc502",
@@ -1280,6 +1301,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1280
1301
  "395897d1dc3f0ac92d7c892eaa9b9ddf12078181bb9f5b228965478190b09a91",
1281
1302
  "3c062d0b79961a9a93a822507e893dcdaa71d65d735557727d20464c2489d812",
1282
1303
  "3e67eb4b0710ec195ad7efa4a8c2fd64063897d67725ea2627cf869c7e066201",
1304
+ "5408b14528557c2301b69a4d93a64d7930d3b66dc416702c9f33a72759a66c5c",
1283
1305
  "5c6b8a6ff3010b11f78b70eda0e73e78e1155b634a781b8abec79e40ac286eb7",
1284
1306
  "6261f7630e71bd95792083f5459a2802382cae95101c724a7311e3810af6c576",
1285
1307
  "9b613888c4c1cc6cc2b1fb6e162a4c766012eab0ec4f8b7f2ac1bc3da6622c97",
@@ -1324,6 +1346,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1324
1346
  "8a1684f5c2b4d37fc782d2090273772814f7ad6c61e7ae5459163a1f28b7a5dc",
1325
1347
  "9dd145c0f9dac6ed252b13d32e130dbab964da6cd357981b58541780ecb2f981",
1326
1348
  "bd72dc7d240509eeb4a8f10e8ff64976d8223c1a270a482ac12a0daeae68a5c7",
1349
+ "f70ecd3712dd2ca77a8851c7505ce79f948a57e5a2e28f56c5d0ccd047712688",
1327
1350
  ]),
1328
1351
  "scripts/lisa-test-node.mjs": Object.freeze([
1329
1352
  "31b338144af00e20e3de02202982846d7333433a9bbda76a8c77d50e6fdbc47b",
@@ -1393,6 +1416,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
1393
1416
  "39cb2fb53f1cc939675e7f8d5530a760abac420c2259fc97108d21f15c0275e9",
1394
1417
  "47d44b2bca383ae395b4e415e06c97a127327ab13762ee95b8c43d0198639bbb",
1395
1418
  "8fa58cc7276add0b2edf1de92bdcc32d81d840811ef0614ddc724010b59a888c",
1419
+ "9281e995587ad2c73e15c4381ec4ecfa40fd789f171c0698cdcf8dea32539e62",
1396
1420
  "93190f926689725418c1ec9eae15c55910b128cff6e3cb10185e466c7b90cc4f",
1397
1421
  "db14245ed89b483912af287bdee917a7a921dc21bb29b49be37fc799c05c413f",
1398
1422
  "f50e35d11295a836bd5b6d818aed6daea68ff70bdffbbdf9f67b09984a2628da",