@codyswann/lisa 4.73.3 → 4.73.5

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 (67) hide show
  1. package/README.md +13 -0
  2. package/all/copy-overwrite/scripts/lib/npm-update-gh-grants.mjs +5 -2
  3. package/all/copy-overwrite/scripts/lisa-enforcement-fallback.sh +102 -3
  4. package/all/copy-overwrite/scripts/lisa-enforcement-freshness.mjs +3 -0
  5. package/all/copy-overwrite/scripts/lisa-work-item.mjs +48 -11
  6. package/all/copy-overwrite/scripts/npm-updater-helper-graph.json +2 -2
  7. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  8. package/dist/core/lisa-owned-hash-ledger.js +16 -0
  9. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  10. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  11. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  12. package/dist/core/upstream-evidence-manifest.js +23 -8
  13. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  14. package/package.json +4 -4
  15. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  16. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  17. package/plugins/lisa-agy/plugin.json +1 -1
  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-cursor/.claude-plugin/plugin.json +1 -1
  25. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  26. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  27. package/plugins/lisa-expo-agy/plugin.json +1 -1
  28. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  30. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  31. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  32. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  33. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  37. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  38. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  42. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  43. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  47. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  48. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  52. package/plugins/lisa-rails-agy/plugin.json +1 -1
  53. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  57. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  58. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  62. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  63. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  65. package/scripts/lisa-enforcement-fallback.sh +102 -3
  66. package/scripts/lisa-enforcement-freshness.mjs +3 -0
  67. package/scripts/two-channel-couplings.json +1 -1
package/README.md CHANGED
@@ -343,6 +343,19 @@ Diagnostics are offline and lazy: at most eight guard/template pairs (1 MiB per
343
343
  file), four 64 KiB manifests/receipts and one 4 MiB plugin registry, with one
344
344
  additional byte per read to detect overflow. After the session notice, permitted
345
345
  calls invoke no freshness helper. Later refusals re-evaluate their own evidence.
346
+ The live anchor verifies its own process group before launching Node, so native
347
+ qualification cannot race a separate parent/start countdown. Qualification is
348
+ setup outside the producer timer; arbitrary native `ps` or scheduler stalls are
349
+ not bounded by that timer.
350
+ The optional subprocess has a one-second Bash timer independent of Node,
351
+ leaving headroom beneath its two-second diagnostic ceiling. Slower diagnostics
352
+ become unknown; complete results within the budget retain their attribution.
353
+ It uses a private, trusted temporary buffer and an owned process-group anchor.
354
+ Timeout, unavailable runner, failure or incomplete output leaves all evidence
355
+ unknown while every original guard still runs. Complete successful output is
356
+ accepted only after the helper's ordinary descendants are drained. The timer
357
+ does not bound enforcement guards, operating-system scheduling or arbitrary
358
+ native-tool startup, and cannot guarantee reaping kernel-uninterruptible I/O.
346
359
 
347
360
  | Agent | Fallback diagnostic surface |
348
361
  | --- | --- |
@@ -86,7 +86,10 @@ export function observeGhResponse(scope, state, request, result) {
86
86
  Buffer.byteLength(result.stdout) <= 3_145_728,
87
87
  "unbounded GH response grant"
88
88
  );
89
- const value = JSON.parse(result.stdout);
89
+ const value =
90
+ request.kind === "comments"
91
+ ? githubBacklinkComments(result.stdout)
92
+ : JSON.parse(result.stdout);
90
93
  let successor;
91
94
  if (request.kind === "hierarchy") {
92
95
  const page = value.data?.repository?.issue?.subIssues;
@@ -119,7 +122,7 @@ export function observeGhResponse(scope, state, request, result) {
119
122
  };
120
123
  }
121
124
  } else if (request.kind === "comments")
122
- successor = backlinkRequest(scope.subject, githubBacklinkComments(value));
125
+ successor = backlinkRequest(scope.subject, value);
123
126
  if (successor) state.grants.set(key(successor.args), successor);
124
127
  }
125
128
 
@@ -211,6 +211,103 @@ note_version() {
211
211
 
212
212
  plugin_tree_version=""
213
213
 
214
+ # Node cannot supervise its own stalled startup. Bash owns a live group anchor
215
+ # and an independent builtin-read timer instead. The real child Bash has its own
216
+ # $$, waits for group qualification before starting Node, and drains its OWN
217
+ # group. No remembered PID receives a later external signal. Its live anchor
218
+ # pins the group even after Node returns, until all descendants are terminated.
219
+ # Only this optional subprocess is bounded; enforcement below is unchanged.
220
+ run_optional_freshness() (
221
+ command -v mkfifo >/dev/null 2>&1 && command -v ps >/dev/null 2>&1 || exit 1
222
+ ps -o pid= -p "$$" >/dev/null 2>&1 || exit 1
223
+ # Bash 3.2 unwinds function locals before EXIT on an explicit exit inside
224
+ # command substitution. This function already isolates all state in a subshell.
225
+ scratch="" anchor="" scratch_identity="" current_identity="" helper_status=1
226
+ [ -n "$notice_temp_base" ] && notice_parent_chain_trusted "$notice_temp_base" || exit 1
227
+ scratch="$(umask 077 && mktemp -d "$notice_temp_base/lisa-freshness.XXXXXX")" || exit 1
228
+ case "$scratch" in "$notice_temp_base"/lisa-freshness.*) ;; *) exit 1 ;; esac
229
+ [ -d "$scratch" ] && [ ! -L "$scratch" ] && [ -O "$scratch" ] || exit 1
230
+ scratch_identity="$(stat -f '%d:%i:%Lp' "$scratch" 2>/dev/null)" ||
231
+ scratch_identity="$(stat -c '%d:%i:%a' "$scratch" 2>/dev/null)" || exit 1
232
+ [ "${scratch_identity##*:}" = 700 ] || exit 1
233
+ cleanup_diagnostic() {
234
+ if [ -n "$anchor" ]; then
235
+ printf 'stop\n' >&8
236
+ wait "$anchor" 2>/dev/null || true
237
+ fi
238
+ exec 8>&- 9>&-
239
+ current_identity="$(stat -f '%d:%i:%Lp' "$scratch" 2>/dev/null)" ||
240
+ current_identity="$(stat -c '%d:%i:%a' "$scratch" 2>/dev/null)" || current_identity=""
241
+ if [ "$current_identity" = "$scratch_identity" ] &&
242
+ [ -d "$scratch" ] && [ ! -L "$scratch" ] && [ -O "$scratch" ] &&
243
+ notice_parent_chain_trusted "$notice_temp_base"; then
244
+ rm -rf "$scratch"
245
+ fi
246
+ }
247
+ trap cleanup_diagnostic EXIT
248
+ trap 'exit 1' HUP INT TERM
249
+ mkfifo "$scratch/start" "$scratch/done" || exit 1
250
+ exec 8<>"$scratch/start" 9<>"$scratch/done" || exit 1
251
+ set -m
252
+ /bin/bash -c '
253
+ set +m
254
+ scratch="$1"
255
+ shift
256
+ # This live anchor qualifies its own group before launching any Node work.
257
+ # Native qualification must not race a separate parent/start countdown.
258
+ [ "$(ps -o pgid= -p "$$" 2>/dev/null | tr -d " ")" = "$$" ] || exit 1
259
+ (
260
+ node "$@" </dev/null >"$scratch/output" 2>/dev/null
261
+ printf "%s\n" "$?" >"$scratch/status"
262
+ printf "done\n" >&9
263
+ ) &
264
+ # Bash 3.2 accepts integer timeouts. One second leaves headroom beneath
265
+ # the two-second diagnostic ceiling without delaying real enforcement.
266
+ if read -r -t 1 -u 9 done && [ "$done" = done ]; then
267
+ printf "complete\n" >"$scratch/complete"
268
+ # Parent acceptance or its bounded absence both terminate the group.
269
+ read -r -t 1 -u 8 stop || true
270
+ fi
271
+ kill -KILL -- -"$$"
272
+ ' lisa-freshness "$scratch" "$@" &
273
+ anchor=$!
274
+ while [ ! -f "$scratch/status" ] && [ "$(jobs -pr)" = "$anchor" ]; do sleep 0.01; done
275
+ printf 'stop\n' >&8
276
+ wait "$anchor" 2>/dev/null || true
277
+ anchor=""
278
+ [ -f "$scratch/complete" ] && [ -f "$scratch/status" ] || exit 1
279
+ read -r helper_status <"$scratch/status"
280
+ [ "$helper_status" = 0 ] || exit 1
281
+ cat "$scratch/output"
282
+ )
283
+
284
+ # Do not promote even one partial fact. Successful exit plus a terminal protocol
285
+ # row and every requested guard result are required before globals are changed.
286
+ valid_freshness_result() {
287
+ local line key value seen="|" complete=0 count=0
288
+ while IFS= read -r line; do
289
+ [ "$complete" -eq 0 ] || return 1
290
+ case "$line" in *$'\t'*) ;; *) return 1 ;; esac
291
+ key="${line%%$'\t'*}"
292
+ value="${line#*$'\t'}"
293
+ case "$value" in ''|*$'\t'*|*$'\r'*) return 1 ;; esac
294
+ case "$seen" in *"|$key|"*) return 1 ;; esac
295
+ seen="$seen$key|"
296
+ case "$key" in
297
+ installed|applied|plugin|marketplace|channel)
298
+ [[ "$value" =~ ^[0-9]{1,6}\.[0-9]{1,6}\.[0-9]{1,6}([-+][A-Za-z0-9.-]{1,48})?$ ]] || return 1 ;;
299
+ channel_path) ;;
300
+ guard[0-7])
301
+ [ "${key#guard}" -lt "$guard_count" ] || return 1
302
+ case "$value" in matching|different|unknown) ;; *) return 1 ;; esac
303
+ count=$((count + 1)) ;;
304
+ complete) [ "$value" = 1 ] || return 1; complete=1 ;;
305
+ *) return 1 ;;
306
+ esac
307
+ done <<< "$1"
308
+ [ "$complete" -eq 1 ] && [ "$count" -eq "$guard_count" ]
309
+ }
310
+
214
311
  # Resolve once PER PROCESS at the existing lazy diagnostic boundary. A later
215
312
  # refusal in the same session gets fresh content evidence in its new process;
216
313
  # an already-noticed permitted call invokes neither Node nor a comparison.
@@ -220,13 +317,15 @@ resolve_vintages() {
220
317
  local config_dir="${CLAUDE_CONFIG_DIR-}"
221
318
  [ -n "$config_dir" ] || config_dir="${HOME-}/.claude"
222
319
  local helper="${BASH_SOURCE[0]%/*}/lisa-enforcement-freshness.mjs"
223
- local key value state_index
320
+ local key value state_index result
224
321
  local state_count=0
225
322
  while [ "$state_count" -lt "$guard_count" ]; do
226
323
  host_guard_states+=("unknown")
227
324
  state_count=$((state_count + 1))
228
325
  done
229
- if [ -f "$helper" ] && [ -r "$helper" ] && command -v node >/dev/null 2>&1; then
326
+ if [ -f "$helper" ] && [ -r "$helper" ] && command -v node >/dev/null 2>&1 &&
327
+ result="$(run_optional_freshness "$helper" "$repo_root" "$config_dir" "${guard_evidence_names[@]}" 2>/dev/null)" &&
328
+ valid_freshness_result "$result"; then
230
329
  while IFS=$'\t' read -r key value; do
231
330
  case "$key" in
232
331
  installed) installed_version="$value" ;;
@@ -240,7 +339,7 @@ resolve_vintages() {
240
339
  case "$value" in matching|different|unknown) host_guard_states[$state_index]="$value" ;; esac
241
340
  ;;
242
341
  esac
243
- done < <(node "$helper" "$repo_root" "$config_dir" "${guard_evidence_names[@]}" 2>/dev/null)
342
+ done <<< "$result"
244
343
  fi
245
344
  note_version "$installed_version" "$repo_root/node_modules/@codyswann/lisa/package.json"
246
345
  note_version "$plugin_tree_version" "$plugin_tree"
@@ -177,4 +177,7 @@ if (
177
177
  emit("channel_path", entry.installPath);
178
178
  }
179
179
  }
180
+ // Bash stages all facts until this terminal row and successful process exit;
181
+ // a killed or failed helper must not lend authority to its earlier output.
182
+ emit("complete", "1");
180
183
  }
@@ -1992,7 +1992,7 @@ export function resetGhVersionCheck() {
1992
1992
  ghVersionChecked = false;
1993
1993
  }
1994
1994
 
1995
- /** The body is required by recovery; all ordinary canonical validation fields remain present. */
1995
+ /** Checkpoint history cannot exhaust capture; complete backlink candidates and all other canonical fields survive. */
1996
1996
  export function githubIssueViewArgs(repository, number) {
1997
1997
  return [
1998
1998
  "issue",
@@ -2002,6 +2002,8 @@ export function githubIssueViewArgs(repository, number) {
2002
2002
  repository,
2003
2003
  "--json",
2004
2004
  "number,url,state,body,labels,comments,closedByPullRequestsReferences",
2005
+ "--jq",
2006
+ '.comments |= map(select(.body | contains("[lisa-pr-link]")))',
2005
2007
  ];
2006
2008
  }
2007
2009
 
@@ -2593,21 +2595,58 @@ export function githubBacklinkListArgs(repository, number) {
2593
2595
  return [
2594
2596
  "api",
2595
2597
  "--paginate",
2596
- "--slurp",
2597
2598
  `repos/${repository}/issues/${number}/comments?per_page=100`,
2599
+ "--jq",
2600
+ '{sourceCount:length,comments:map(select(.body | contains("[lisa-pr-link]")))}',
2598
2601
  ];
2599
2602
  }
2600
2603
 
2601
- /** Complete slurped pages remain bounded and are shared by the canonical writer and controller grant. */
2602
- export function githubBacklinkComments(pages) {
2604
+ /**
2605
+ * Native successful pagination emits one compact projected envelope per page.
2606
+ * Counts precede filtering so checkpoint removal cannot evade the original
2607
+ * 100-page/10,000-comment bounds. Decode the entire completed response before
2608
+ * selecting any writer target; full original candidate objects stay ordered.
2609
+ * @param {string} output Complete stdout from a successful bounded native listing.
2610
+ * @returns {object[]} Complete marker candidates, including prose the ownership parser may refuse.
2611
+ */
2612
+ export function githubBacklinkComments(output) {
2613
+ if (typeof output !== "string" || !output.trim())
2614
+ throw new Error("invalid or incomplete GitHub backlink pages");
2615
+ const pages = output
2616
+ .trim()
2617
+ .split(/\r?\n/)
2618
+ .map(line => JSON.parse(line));
2603
2619
  if (
2604
- !Array.isArray(pages) ||
2605
- pages.length < 1 ||
2606
2620
  pages.length > 100 ||
2607
- pages.some(page => !Array.isArray(page) || page.length > 100)
2621
+ pages.some(
2622
+ page =>
2623
+ !page ||
2624
+ typeof page !== "object" ||
2625
+ Array.isArray(page) ||
2626
+ Object.keys(page).length !== 2 ||
2627
+ !Object.hasOwn(page, "sourceCount") ||
2628
+ !Object.hasOwn(page, "comments") ||
2629
+ !Number.isSafeInteger(page.sourceCount) ||
2630
+ page.sourceCount < 0 ||
2631
+ page.sourceCount > 100 ||
2632
+ !Array.isArray(page.comments) ||
2633
+ page.comments.length > page.sourceCount ||
2634
+ page.comments.some(
2635
+ comment =>
2636
+ !comment ||
2637
+ typeof comment.body !== "string" ||
2638
+ !comment.body.includes(MARKER) ||
2639
+ !(
2640
+ (typeof comment.id === "string" ||
2641
+ Number.isSafeInteger(comment.id)) &&
2642
+ /^[1-9]\d*$/.test(String(comment.id))
2643
+ )
2644
+ )
2645
+ ) ||
2646
+ pages.reduce((count, page) => count + page.sourceCount, 0) > 10000
2608
2647
  )
2609
2648
  throw new Error("invalid or over-bound GitHub backlink pages");
2610
- return pages.flat();
2649
+ return pages.flatMap(page => page.comments);
2611
2650
  }
2612
2651
 
2613
2652
  /**
@@ -2623,9 +2662,7 @@ function githubBacklink(ref, prUrl) {
2623
2662
  allowFailure: true,
2624
2663
  });
2625
2664
  if (listing.status !== 0) throw githubFailure(listing, ref);
2626
- const comments = githubBacklinkComments(
2627
- safeJson(listing.stdout, `GitHub comments on ${ref}`)
2628
- );
2665
+ const comments = githubBacklinkComments(listing.stdout);
2629
2666
  // This listing is the read-before-write, and it is fetched here rather than
2630
2667
  // passed in for exactly that reason: the version you last wrote is not the
2631
2668
  // version that is live on a surface other agents also comment on.
@@ -474,7 +474,7 @@
474
474
  "children": []
475
475
  },
476
476
  "lib/npm-update-gh-grants.mjs": {
477
- "sha256": "4be8bcfa098b7f7f9cdfe6d7a1f110e5e4fb1e6181bd12d0b7f620f569293f09",
477
+ "sha256": "62f81b0d6c669594356c8ad63f544d679407100f3fc46723985f286e4d033e50",
478
478
  "staticImports": [
479
479
  "lib/npm-update-contract.mjs",
480
480
  "lisa-automation-provenance.mjs",
@@ -1258,7 +1258,7 @@
1258
1258
  "children": []
1259
1259
  },
1260
1260
  "lisa-work-item.mjs": {
1261
- "sha256": "203f110fd4752ff89d906276a5115500a2f42289d00cb5435345c90c433edf46",
1261
+ "sha256": "cd1b16e056fefac17018d5c96ad063dc4002f304e4400765e473403186b7175a",
1262
1262
  "staticImports": [
1263
1263
  "lib/invoked-as-script.mjs",
1264
1264
  "node:child_process",
@@ -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,CA88DjC,CAAC;AAEH;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,+BAA+B,EAAE,QAAQ,CACpD,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAi3DjC,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,CAs9DjC,CAAC;AAEH;;;;;;;;;;;;;;;GAeG;AACH,eAAO,MAAM,+BAA+B,EAAE,QAAQ,CACpD,MAAM,CAAC,MAAM,EAAE,SAAS,MAAM,EAAE,CAAC,CAy3DjC,CAAC"}
@@ -634,6 +634,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
634
634
  "scripts/lib/npm-update-gh-grants.mjs": Object.freeze([
635
635
  "39cdf37db1ceae3b104038c1e25735a7f805d04f2ab2a7001a853f633485718d",
636
636
  "4be8bcfa098b7f7f9cdfe6d7a1f110e5e4fb1e6181bd12d0b7f620f569293f09",
637
+ "62f81b0d6c669594356c8ad63f544d679407100f3fc46723985f286e4d033e50",
637
638
  ]),
638
639
  "scripts/lib/npm-update-gh-requests.mjs": Object.freeze([
639
640
  "0bfd950560242d6b9ecb93f8d7162e68cb420b631e39d24663ccf803712a4c22",
@@ -988,6 +989,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
988
989
  "f0f3c43bbb6d1e389135b0205a051e64891e539d4272df2a87841ee82a8b7a55",
989
990
  ]),
990
991
  "scripts/lisa-enforcement-fallback.sh": Object.freeze([
992
+ "07159250b1172ed0b15896ad251af0ffc84a22f5f24806c06b4e1478f20c9bd8",
991
993
  "1bec5f3c284b3febdc471487ee6a23ffb72bd4e7b293f9e26b0188f32318c722",
992
994
  "27f4e4b54986f49ddb9a3bf6e02b926d41d85ecd46ab2263cb17a5746820f8bd",
993
995
  "3049c2f1051c7c02dd60b62355964651e1565ebe6bdcb5e37634cd686cf1deb1",
@@ -1003,12 +1005,15 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
1003
1005
  "916b2b48a2b55c2090468c48c972b6c7c5fad39fb53956ceffebdd1ff0c69230",
1004
1006
  "9cab71562d01421d57c6719318a4d03a6249a45c1aea434db3ff26e3065eeb66",
1005
1007
  "9cfad1d691235fa70ccf97603eea2ef177bbded4a34d85aeedc41018c894b591",
1008
+ "a61653e9a4788804249ae6e66924e6c7a69cd06b013b91881361d992b935fbcf",
1009
+ "a7078fee6b5719d8c1f96e145091dc9f1b7a15b002b76f2fabb57909a81ba96f",
1006
1010
  "aafd027c4b6092da15d0389f9e8dcedbd9105e9083057e2da39f78fd5f72e0df",
1007
1011
  "acf05ef7bd86f58042e57b6d4dd3d519efb46131bb38c6bf3b7c05f6d15b20ad",
1008
1012
  "b456ad79aae18ea3af4ae462327653a88ab865ec31c84aa233c3ded512acff32",
1009
1013
  "b4cc14d5dc02c790ea3e51b0134b9c3d5e4a0e8ef08a652817f7485a0badde17",
1010
1014
  "c64765cb502797daa163dbb6cad723b633a7c527dffeb6bd99cca4989a63fcf4",
1011
1015
  "c9604929b1f5d3fee39ef7c3619f89002accf27712dbd38f25b6a7a0ceb0025a",
1016
+ "ca133b6f4b5c1c95de89fc28c4e04c1a8974570737e9173d6e69e960ddb9200b",
1012
1017
  "d7d88e44763694bed5eae998cd3663922c957e49f9f9621d9201f0417a4128ad",
1013
1018
  "d922508529c0ffd6b8411d7fc618b3d14ceb70901746adfbcf49e46eb685d6b9",
1014
1019
  "e0f4f2b11bea5497af12bae0d52902eb3d02b4ec3a7ae8e07236fb09b59cf560",
@@ -1020,6 +1025,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
1020
1025
  "scripts/lisa-enforcement-freshness.mjs": Object.freeze([
1021
1026
  "781bb4da7d2e2ce383c9fb2f1f80d48536697f8c581458c326ffb96b8fefe8db",
1022
1027
  "edc243b4f79a1cbbf16890356ddec15592896d0736e74d13663ba7f548bb0c1f",
1028
+ "f02571c6766dd2ed0914b4cf7e62b045dee8fcd33a0b2298f0be1f5ac0989639",
1023
1029
  ]),
1024
1030
  "scripts/lisa-environment-prepare.mjs": Object.freeze([
1025
1031
  "0c2c2aeed3a8d843b3019e5263aab26790856c0c33f028925d2f0f795a26872d",
@@ -1790,6 +1796,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
1790
1796
  "c78df9d5f0f3fc388ff60a7db5898478a2a4d6d7325833f10384b5a8c62bb34a",
1791
1797
  "c8cea225a598e8856ed3afac2531f6f7e1235b5cee280f85ef311e70887b6a62",
1792
1798
  "cb708e688daa4ae556ed95baf39bbbe89db1a908512f179cd5022797f4b1018e",
1799
+ "cd1b16e056fefac17018d5c96ad063dc4002f304e4400765e473403186b7175a",
1793
1800
  "cdea136456d2b9880c3abd2bbd402fb08051822b9e92484c66cd184ec7ed7d0f",
1794
1801
  "ce1520dba31d32856d470cf744700e0636518dd3a767627d42ac0a77007d6813",
1795
1802
  "ce5ff040b1f75925bc286027dcb893649edfb408021916920b07105baa2d9949",
@@ -1916,6 +1923,7 @@ export const LISA_OWNED_HASH_LEDGER = Object.freeze({
1916
1923
  "702b455a3157565b910904a3acfcdbf4722befc660d60242c649ff020fe96b3b",
1917
1924
  "728bcf6bdfb82c5b312da268db0ec7b50d94ac62c64ec58c70592eb106383f09",
1918
1925
  "7b1d6bba391f105b9d53b91773fd207c9a5e9b5bfcd638e1e6b579d507279d7d",
1926
+ "7c8b9d5b8f7d77dbf520c1009497d041eeb9930103c7f52bfd8b04a4492eb023",
1919
1927
  "8a3c46d3501797ebb53a081c8b35e78e0ceb2b060503332b48e44ccc30d6d0df",
1920
1928
  "8b3ef61c17d94bdf8eee99e02d396c975a12a8b8a3c2e34231eff6aaea3bf392",
1921
1929
  "901c52e08a53f0c7420ddc3308aa49e656429827770c1fd6a3f4ba8c9029d8ad",
@@ -2626,6 +2634,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
2626
2634
  "scripts/lib/npm-update-gh-grants.mjs": Object.freeze([
2627
2635
  "39cdf37db1ceae3b104038c1e25735a7f805d04f2ab2a7001a853f633485718d",
2628
2636
  "4be8bcfa098b7f7f9cdfe6d7a1f110e5e4fb1e6181bd12d0b7f620f569293f09",
2637
+ "62f81b0d6c669594356c8ad63f544d679407100f3fc46723985f286e4d033e50",
2629
2638
  ]),
2630
2639
  "scripts/lib/npm-update-gh-requests.mjs": Object.freeze([
2631
2640
  "0bfd950560242d6b9ecb93f8d7162e68cb420b631e39d24663ccf803712a4c22",
@@ -2979,6 +2988,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
2979
2988
  "f0f3c43bbb6d1e389135b0205a051e64891e539d4272df2a87841ee82a8b7a55",
2980
2989
  ]),
2981
2990
  "scripts/lisa-enforcement-fallback.sh": Object.freeze([
2991
+ "07159250b1172ed0b15896ad251af0ffc84a22f5f24806c06b4e1478f20c9bd8",
2982
2992
  "1bec5f3c284b3febdc471487ee6a23ffb72bd4e7b293f9e26b0188f32318c722",
2983
2993
  "27f4e4b54986f49ddb9a3bf6e02b926d41d85ecd46ab2263cb17a5746820f8bd",
2984
2994
  "3049c2f1051c7c02dd60b62355964651e1565ebe6bdcb5e37634cd686cf1deb1",
@@ -2994,12 +3004,15 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
2994
3004
  "916b2b48a2b55c2090468c48c972b6c7c5fad39fb53956ceffebdd1ff0c69230",
2995
3005
  "9cab71562d01421d57c6719318a4d03a6249a45c1aea434db3ff26e3065eeb66",
2996
3006
  "9cfad1d691235fa70ccf97603eea2ef177bbded4a34d85aeedc41018c894b591",
3007
+ "a61653e9a4788804249ae6e66924e6c7a69cd06b013b91881361d992b935fbcf",
3008
+ "a7078fee6b5719d8c1f96e145091dc9f1b7a15b002b76f2fabb57909a81ba96f",
2997
3009
  "aafd027c4b6092da15d0389f9e8dcedbd9105e9083057e2da39f78fd5f72e0df",
2998
3010
  "acf05ef7bd86f58042e57b6d4dd3d519efb46131bb38c6bf3b7c05f6d15b20ad",
2999
3011
  "b456ad79aae18ea3af4ae462327653a88ab865ec31c84aa233c3ded512acff32",
3000
3012
  "b4cc14d5dc02c790ea3e51b0134b9c3d5e4a0e8ef08a652817f7485a0badde17",
3001
3013
  "c64765cb502797daa163dbb6cad723b633a7c527dffeb6bd99cca4989a63fcf4",
3002
3014
  "c9604929b1f5d3fee39ef7c3619f89002accf27712dbd38f25b6a7a0ceb0025a",
3015
+ "ca133b6f4b5c1c95de89fc28c4e04c1a8974570737e9173d6e69e960ddb9200b",
3003
3016
  "d7d88e44763694bed5eae998cd3663922c957e49f9f9621d9201f0417a4128ad",
3004
3017
  "d922508529c0ffd6b8411d7fc618b3d14ceb70901746adfbcf49e46eb685d6b9",
3005
3018
  "e0f4f2b11bea5497af12bae0d52902eb3d02b4ec3a7ae8e07236fb09b59cf560",
@@ -3011,6 +3024,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
3011
3024
  "scripts/lisa-enforcement-freshness.mjs": Object.freeze([
3012
3025
  "781bb4da7d2e2ce383c9fb2f1f80d48536697f8c581458c326ffb96b8fefe8db",
3013
3026
  "edc243b4f79a1cbbf16890356ddec15592896d0736e74d13663ba7f548bb0c1f",
3027
+ "f02571c6766dd2ed0914b4cf7e62b045dee8fcd33a0b2298f0be1f5ac0989639",
3014
3028
  ]),
3015
3029
  "scripts/lisa-environment-prepare.mjs": Object.freeze([
3016
3030
  "0c2c2aeed3a8d843b3019e5263aab26790856c0c33f028925d2f0f795a26872d",
@@ -3713,6 +3727,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
3713
3727
  "c78df9d5f0f3fc388ff60a7db5898478a2a4d6d7325833f10384b5a8c62bb34a",
3714
3728
  "c8cea225a598e8856ed3afac2531f6f7e1235b5cee280f85ef311e70887b6a62",
3715
3729
  "cb708e688daa4ae556ed95baf39bbbe89db1a908512f179cd5022797f4b1018e",
3730
+ "cd1b16e056fefac17018d5c96ad063dc4002f304e4400765e473403186b7175a",
3716
3731
  "cdea136456d2b9880c3abd2bbd402fb08051822b9e92484c66cd184ec7ed7d0f",
3717
3732
  "ce1520dba31d32856d470cf744700e0636518dd3a767627d42ac0a77007d6813",
3718
3733
  "ce5ff040b1f75925bc286027dcb893649edfb408021916920b07105baa2d9949",
@@ -3838,6 +3853,7 @@ export const LISA_OWNED_HASH_HISTORY_DERIVED = Object.freeze({
3838
3853
  "702b455a3157565b910904a3acfcdbf4722befc660d60242c649ff020fe96b3b",
3839
3854
  "728bcf6bdfb82c5b312da268db0ec7b50d94ac62c64ec58c70592eb106383f09",
3840
3855
  "7b1d6bba391f105b9d53b91773fd207c9a5e9b5bfcd638e1e6b579d507279d7d",
3856
+ "7c8b9d5b8f7d77dbf520c1009497d041eeb9930103c7f52bfd8b04a4492eb023",
3841
3857
  "8a3c46d3501797ebb53a081c8b35e78e0ceb2b060503332b48e44ccc30d6d0df",
3842
3858
  "8b3ef61c17d94bdf8eee99e02d396c975a12a8b8a3c2e34231eff6aaea3bf392",
3843
3859
  "901c52e08a53f0c7420ddc3308aa49e656429827770c1fd6a3f4ba8c9029d8ad",