@codyswann/lisa 4.47.0 → 4.49.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (75) hide show
  1. package/dist/configs/vitest/base.d.ts +71 -1
  2. package/dist/configs/vitest/base.d.ts.map +1 -1
  3. package/dist/configs/vitest/base.js +141 -23
  4. package/dist/configs/vitest/base.js.map +1 -1
  5. package/dist/configs/vitest/fleet-admission-global-setup.d.ts +34 -0
  6. package/dist/configs/vitest/fleet-admission-global-setup.d.ts.map +1 -0
  7. package/dist/configs/vitest/fleet-admission-global-setup.js +123 -0
  8. package/dist/configs/vitest/fleet-admission-global-setup.js.map +1 -0
  9. package/dist/configs/vitest/fleet-admission.d.ts +129 -0
  10. package/dist/configs/vitest/fleet-admission.d.ts.map +1 -0
  11. package/dist/configs/vitest/fleet-admission.js +239 -0
  12. package/dist/configs/vitest/fleet-admission.js.map +1 -0
  13. package/dist/configs/vitest/synthesis-scratch-reclaim.d.ts +86 -0
  14. package/dist/configs/vitest/synthesis-scratch-reclaim.d.ts.map +1 -0
  15. package/dist/configs/vitest/synthesis-scratch-reclaim.js +226 -0
  16. package/dist/configs/vitest/synthesis-scratch-reclaim.js.map +1 -0
  17. package/dist/core/host-rules-pointer.d.ts.map +1 -1
  18. package/dist/core/host-rules-pointer.js +30 -22
  19. package/dist/core/host-rules-pointer.js.map +1 -1
  20. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  21. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  22. package/dist/core/upstream-evidence-manifest.js +9 -1
  23. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  24. package/package.json +4 -4
  25. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  26. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  27. package/plugins/lisa-agy/plugin.json +1 -1
  28. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  29. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  30. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  31. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  32. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  33. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  34. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  35. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  36. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  37. package/plugins/lisa-expo-agy/plugin.json +1 -1
  38. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  39. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  40. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  41. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  42. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  43. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  44. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  46. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  47. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  48. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  52. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  53. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  57. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  58. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  62. package/plugins/lisa-rails-agy/plugin.json +1 -1
  63. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  64. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  67. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  68. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  69. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  72. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  73. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  74. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  75. package/scripts/cleanup-worktrees.sh +69 -16
@@ -0,0 +1,226 @@
1
+ /**
2
+ * Reclaim for abandoned CDK synthesis assemblies left in the platform temp root.
3
+ *
4
+ * The scratch sweep in this directory reclaims what Lisa created, proved by an
5
+ * owner token it wrote itself. Synthesis assemblies carry no such token: CDK
6
+ * calls `mkdtemp` against the platform temp root with prefix `cdk.out`, so the
7
+ * directory is real, unowned, and indistinguishable by name from one a live
8
+ * synthesis is still writing.
9
+ *
10
+ * `isStaleForeignEntry` refuses to authorize a foreign entry on age alone, and
11
+ * that refusal is correct — a long synthesis is indistinguishable from an
12
+ * abandoned one by mtime. This module supplies the authority age cannot:
13
+ * **evidence that the writer finished**. CDK writes `manifest.json` when an
14
+ * assembly completes, so its presence is positive proof that the process which
15
+ * created the directory got to the end of its work. A directory still being
16
+ * written has no manifest, and one that just finished has a recent mtime.
17
+ *
18
+ * Both facts must hold before anything is removed, and every other case is
19
+ * reported as undetermined rather than swept. The unsafe path here is the one
20
+ * that looks like progress: deleting everything matching the prefix finishes
21
+ * fast and frees the disk, right up until it takes a live synthesis with it.
22
+ * @module configs/vitest/synthesis-scratch-reclaim
23
+ */
24
+ import { randomBytes } from "node:crypto";
25
+ import * as fs from "node:fs";
26
+ import * as path from "node:path";
27
+ /** Prefix CDK uses for a `mkdtemp` cloud-assembly directory. */
28
+ export const SYNTHESIS_PREFIX = "cdk.out";
29
+ /** File CDK writes when an assembly completes. */
30
+ export const COMPLETION_MANIFEST = "manifest.json";
31
+ /** How long an assembly must be untouched before completion authorizes removal. */
32
+ export const DEFAULT_QUIESCENCE_MS = 24 * 60 * 60 * 1000;
33
+ /**
34
+ * Judge one candidate from its facts alone.
35
+ *
36
+ * Ordered so the conservative arms win: anything that is not a plain directory,
37
+ * or cannot be read, or was touched recently, is kept before completion is even
38
+ * consulted. Completion is necessary but never sufficient.
39
+ * @param facts - Facts read from the candidate
40
+ * @param quiescenceMs - Required untouched interval
41
+ * @returns The bucket and the reason for it
42
+ */
43
+ export const classifySynthesisEntry = (facts, quiescenceMs = DEFAULT_QUIESCENCE_MS) => {
44
+ const { name } = facts;
45
+ const minutes = String(Math.round(facts.ageMs / 60000));
46
+ const hours = String(Math.round(facts.ageMs / 3600000));
47
+ if (!facts.directory)
48
+ return {
49
+ disposition: "undetermined",
50
+ name,
51
+ reason: "not a plain directory; a link or file is never followed",
52
+ };
53
+ if (!facts.readable)
54
+ return {
55
+ disposition: "undetermined",
56
+ name,
57
+ reason: "contents could not be listed, so completion cannot be established",
58
+ };
59
+ if (facts.ageMs < quiescenceMs)
60
+ return {
61
+ disposition: "live",
62
+ name,
63
+ reason: `modified ${minutes} minute(s) ago, inside the quiescence window`,
64
+ };
65
+ if (!facts.complete)
66
+ return {
67
+ disposition: "undetermined",
68
+ name,
69
+ reason: `no ${COMPLETION_MANIFEST}, so the writer is not proven to have finished`,
70
+ };
71
+ return {
72
+ disposition: "reclaimable",
73
+ name,
74
+ reason: `completed assembly, untouched for ${hours} hour(s)`,
75
+ };
76
+ };
77
+ /**
78
+ * Stat a candidate without following it, returning nothing when it is absent.
79
+ * @param candidate - Absolute candidate path
80
+ * @returns Candidate metadata, or undefined
81
+ */
82
+ const lstatIfPresent = (candidate) => {
83
+ try {
84
+ return fs.lstatSync(candidate);
85
+ }
86
+ catch {
87
+ return undefined;
88
+ }
89
+ };
90
+ /**
91
+ * List a directory's children, returning nothing when it cannot be read.
92
+ * @param candidate - Absolute directory path
93
+ * @returns Direct child names, or undefined
94
+ */
95
+ const readdirIfPossible = (candidate) => {
96
+ try {
97
+ return fs.readdirSync(candidate);
98
+ }
99
+ catch {
100
+ return undefined;
101
+ }
102
+ };
103
+ /**
104
+ * Read the facts for one candidate without ever following a symlink.
105
+ * @param root - Directory holding the candidate
106
+ * @param name - Direct child basename
107
+ * @param now - Clock reading for the age computation
108
+ * @returns Facts describing the candidate
109
+ */
110
+ export const readSynthesisEntryFacts = (root, name, now) => {
111
+ const candidate = path.join(root, name);
112
+ const stat = lstatIfPresent(candidate);
113
+ if (stat === undefined || !stat.isDirectory())
114
+ return {
115
+ ageMs: 0,
116
+ complete: false,
117
+ directory: false,
118
+ name,
119
+ readable: false,
120
+ };
121
+ const children = readdirIfPossible(candidate);
122
+ return {
123
+ ageMs: Math.max(0, now - stat.mtimeMs),
124
+ complete: children?.includes(COMPLETION_MANIFEST) ?? false,
125
+ directory: true,
126
+ name,
127
+ readable: children !== undefined,
128
+ };
129
+ };
130
+ /**
131
+ * Revalidate a quarantined candidate against its pre-rename identity.
132
+ *
133
+ * This is the arm that survives a writer racing the decision: a directory
134
+ * swapped for a symlink between the judgement and the unlink fails here rather
135
+ * than being followed out of the root.
136
+ * @param quarantine - Quarantined path
137
+ * @param before - Pinned pre-rename metadata
138
+ * @throws When device, inode or kind changed across the rename
139
+ */
140
+ const assertIdentityUnchanged = (quarantine, before) => {
141
+ const after = fs.lstatSync(quarantine);
142
+ if (after.dev !== before.dev ||
143
+ after.ino !== before.ino ||
144
+ !after.isDirectory())
145
+ throw new Error("Synthesis assembly identity changed during quarantine");
146
+ };
147
+ /**
148
+ * Quarantine one candidate and unlink it, revalidating identity across the rename.
149
+ * @param root - Directory holding the candidate
150
+ * @param name - Direct child basename
151
+ * @param afterQuarantine - Adversarial hook for tests
152
+ * @returns True when the entry was removed
153
+ */
154
+ const quarantineAndRemove = (root, name, afterQuarantine) => {
155
+ const candidate = path.join(root, name);
156
+ const before = fs.lstatSync(candidate);
157
+ const suffix = randomBytes(6).toString("hex");
158
+ const quarantine = path.join(root, `.${SYNTHESIS_PREFIX}-reclaim-${String(process.pid)}-${suffix}`);
159
+ if (!before.isDirectory())
160
+ return false;
161
+ fs.renameSync(candidate, quarantine);
162
+ afterQuarantine?.(quarantine);
163
+ assertIdentityUnchanged(quarantine, before);
164
+ fs.rmSync(quarantine, { force: true, recursive: true });
165
+ return true;
166
+ };
167
+ /**
168
+ * Attempt one fenced removal, converting a refusal into a reported outcome.
169
+ * @param options - Root and hooks for this pass
170
+ * @param verdict - The reclaimable verdict to act on
171
+ * @returns Whether it was removed, and the verdict to report
172
+ */
173
+ const attemptRemoval = (options, verdict) => {
174
+ if (options.apply !== true)
175
+ return { removed: true, verdict };
176
+ try {
177
+ const removed = quarantineAndRemove(options.root, verdict.name, options.afterQuarantine);
178
+ return removed
179
+ ? { removed, verdict }
180
+ : {
181
+ removed,
182
+ verdict: { ...verdict, reason: "no longer a plain directory" },
183
+ };
184
+ }
185
+ catch (error) {
186
+ return {
187
+ removed: false,
188
+ verdict: { ...verdict, reason: error.message },
189
+ };
190
+ }
191
+ };
192
+ /**
193
+ * Reclaim completed, quiescent synthesis assemblies from one temp root.
194
+ *
195
+ * Removes nothing when no candidate matches the convention: a naming change in
196
+ * the producing tool must read as "recognised nothing" rather than as a clean
197
+ * sweep, because the two are opposite facts and only one of them is good news.
198
+ * @param options - Root, clock, thresholds and hooks
199
+ * @returns What was found in each bucket, and what was removed
200
+ */
201
+ export function reclaimSynthesisScratch(options) {
202
+ const now = options.now ?? Date.now();
203
+ const quiescenceMs = options.quiescenceMs ?? DEFAULT_QUIESCENCE_MS;
204
+ const names = (readdirIfPossible(options.root) ?? []).filter(entry => entry.startsWith(SYNTHESIS_PREFIX));
205
+ const empty = {
206
+ live: [],
207
+ reclaimed: [],
208
+ recognised: false,
209
+ refused: [],
210
+ undetermined: [],
211
+ };
212
+ if (names.length === 0)
213
+ return empty;
214
+ const verdicts = names.map(name => classifySynthesisEntry(readSynthesisEntryFacts(options.root, name, now), quiescenceMs));
215
+ const outcomes = verdicts
216
+ .filter(one => one.disposition === "reclaimable")
217
+ .map(verdict => attemptRemoval(options, verdict));
218
+ return {
219
+ live: verdicts.filter(one => one.disposition === "live"),
220
+ reclaimed: outcomes.filter(one => one.removed).map(one => one.verdict),
221
+ recognised: true,
222
+ refused: outcomes.filter(one => !one.removed).map(one => one.verdict),
223
+ undetermined: verdicts.filter(one => one.disposition === "undetermined"),
224
+ };
225
+ }
226
+ //# sourceMappingURL=synthesis-scratch-reclaim.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"synthesis-scratch-reclaim.js","sourceRoot":"","sources":["../../../src/configs/vitest/synthesis-scratch-reclaim.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"host-rules-pointer.d.ts","sourceRoot":"","sources":["../../src/core/host-rules-pointer.ts"],"names":[],"mappings":"AAiBA,8DAA8D;AAC9D,eAAO,MAAM,4BAA4B,mCAAmC,CAAC;AAC7E,8DAA8D;AAC9D,eAAO,MAAM,0BAA0B,iCAAiC,CAAC;AAEzE;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,MAAM,CA6BR;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAiBtE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO1D"}
1
+ {"version":3,"file":"host-rules-pointer.d.ts","sourceRoot":"","sources":["../../src/core/host-rules-pointer.ts"],"names":[],"mappings":"AA6BA,8DAA8D;AAC9D,eAAO,MAAM,4BAA4B,mCAAmC,CAAC;AAC7E,8DAA8D;AAC9D,eAAO,MAAM,0BAA0B,iCAAiC,CAAC;AAEzE;;;;;;;;;;;;GAYG;AACH,wBAAgB,mBAAmB,CACjC,IAAI,EAAE,MAAM,EACZ,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,MAAM,EACjB,WAAW,EAAE,MAAM,GAClB,MAAM,CA6BR;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,eAAe,CAAC,EAAE,MAAM,GAAG,MAAM,CAStE;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAO1D"}
@@ -11,6 +11,18 @@
11
11
  * Pointer only. Lisa never writes rule bodies into `AGENTS.md` or into
12
12
  * `.agents/rules/`; that is what distinguishes this block from the legacy
13
13
  * `LISA_RULES_START..END` bake that PR #1150 removed.
14
+ *
15
+ * The block is a plain-prose instruction, and short on purpose. Every line of
16
+ * it is loaded into every agent's context in every session, forever, so it
17
+ * carries the instruction and nothing else: the ownership and transition
18
+ * explanations it used to carry are Lisa internals that no agent acts on, and
19
+ * they live in this file's comments now instead of in every host's `AGENTS.md`.
20
+ *
21
+ * Prose rather than an import directive, because prose is the only form all six
22
+ * agents can act on. `@path` is Claude Code syntax that the other five do not
23
+ * parse, and it resolves files rather than directories even on Claude — an
24
+ * `@.agents/rules/` line was measured to load nothing at all, producing a block
25
+ * that reads as instruction-bearing while instructing no one.
14
26
  * @module core/host-rules-pointer
15
27
  */
16
28
  import { HOST_RULES_DIR } from "./project-config.js";
@@ -68,16 +80,8 @@ export function buildHostRulesPointer(legacyRulesFile) {
68
80
  LISA_HOST_RULES_START_MARKER,
69
81
  "## Host Rules",
70
82
  "",
71
- `This project's durable, host-authored operating rules live in \`${HOST_RULES_DIR}/\`.`,
72
- "Read those files when you need this project's standing rules. They are not",
73
- "injected at session start, so consult them on demand — which also means every",
74
- "agent reads them through this one pointer and no agent loads them twice.",
75
- "",
76
- `**Ownership.** The host owns every file in \`${HOST_RULES_DIR}/\`. Lisa never writes`,
77
- "rule bodies there; Lisa's own rules ship through its per-agent plugins. This",
78
- "marked block is the only Lisa-managed content in this file — everything outside",
79
- "the markers belongs to the host and is never touched.",
80
- ...transitionParagraph(legacyRulesFile),
83
+ `Read every file under \`${HOST_RULES_DIR}/\` for this project's standing rules.`,
84
+ ...transitionSentence(legacyRulesFile),
81
85
  LISA_HOST_RULES_END_MARKER,
82
86
  ].join("\n");
83
87
  }
@@ -91,25 +95,29 @@ export function stripHostRulesPointer(body) {
91
95
  return replaceManagedBlock(body, LISA_HOST_RULES_START_MARKER, LISA_HOST_RULES_END_MARKER, "");
92
96
  }
93
97
  /**
94
- * Lines naming a surviving legacy single-file rules document, so its content
95
- * stays reachable while the project transitions. Empty when the project has
96
- * none — the paragraph then disappears on its own.
98
+ * The clause naming a surviving legacy single-file rules document, so its
99
+ * content stays reachable while the project transitions. Empty when the project
100
+ * has none — the sentence then disappears on its own, which is what keeps the
101
+ * block from sending an agent after a path that is not there.
102
+ *
103
+ * The auto-load caveat is the one piece of the retired transition paragraph
104
+ * that has to survive: `.agents/rules/` is not a native auto-load tree for any
105
+ * runtime, but a legacy path can be. Claude Code auto-loads `.claude/rules/`,
106
+ * so an unqualified "also read it" would reintroduce exactly the double-load
107
+ * this block exists to prevent. It is phrased against the runtime rather than
108
+ * against the path because `projectRulesFile` may point somewhere Claude does
109
+ * not auto-load, and naming `.claude/rules/` unconditionally would be false
110
+ * there.
97
111
  * @param legacyRulesFile - Project-relative legacy rules path, if any.
98
112
  * @returns Zero or more block lines.
99
113
  */
100
- function transitionParagraph(legacyRulesFile) {
114
+ function transitionSentence(legacyRulesFile) {
101
115
  if (legacyRulesFile === undefined) {
102
116
  return [];
103
117
  }
104
118
  return [
105
- "",
106
- `**Transition.** This project still has host rules at \`${legacyRulesFile}\`.`,
107
- "They remain authoritative and are left exactly as written — Lisa does not",
108
- "move, rewrite, or delete them. Agents whose runtime auto-loads that path",
109
- "(Claude Code auto-loads `.claude/rules/`) already have that content and must",
110
- "not read it a second time; every other agent should read it alongside",
111
- `\`${HOST_RULES_DIR}/\`. Reclassifying or relocating it is a human-gated`,
112
- "decision, never an automated rewrite.",
119
+ `Also read \`${legacyRulesFile}\`, unless your runtime auto-loads it —`,
120
+ "Claude Code auto-loads `.claude/rules/`.",
113
121
  ];
114
122
  }
115
123
  //# sourceMappingURL=host-rules-pointer.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"host-rules-pointer.js","sourceRoot":"","sources":["../../src/core/host-rules-pointer.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"host-rules-pointer.js","sourceRoot":"","sources":["../../src/core/host-rules-pointer.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,8DAA8D;AAC9D,MAAM,CAAC,MAAM,4BAA4B,GAAG,gCAAgC,CAAC;AAC7E,8DAA8D;AAC9D,MAAM,CAAC,MAAM,0BAA0B,GAAG,8BAA8B,CAAC;AAEzE;;;;;;;;;;;;GAYG;AACH,MAAM,UAAU,mBAAmB,CACjC,IAAY,EACZ,WAAmB,EACnB,SAAiB,EACjB,WAAmB;IAEnB,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAC3C,MAAM,MAAM,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IACvC,MAAM,QAAQ,GAAG,QAAQ,KAAK,CAAC,CAAC,CAAC;IACjC,MAAM,MAAM,GAAG,MAAM,KAAK,CAAC,CAAC,CAAC;IAC7B,MAAM,iBAAiB,GACrB,QAAQ,IAAI,IAAI,CAAC,OAAO,CAAC,WAAW,EAAE,QAAQ,GAAG,WAAW,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IAC9E,MAAM,eAAe,GACnB,MAAM,IAAI,IAAI,CAAC,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,IACE,QAAQ,KAAK,MAAM;QACnB,CAAC,QAAQ,IAAI,MAAM,GAAG,QAAQ,CAAC;QAC/B,iBAAiB;QACjB,eAAe,EACf,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IACD,IAAI,CAAC,QAAQ,EAAE,CAAC;QACd,IAAI,WAAW,KAAK,EAAE,EAAE,CAAC;YACvB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,MAAM,CAAC;QACtD,OAAO,GAAG,IAAI,GAAG,SAAS,GAAG,WAAW,IAAI,CAAC;IAC/C,CAAC;IACD,MAAM,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC;IACvC,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC,CAAC;IACpD,MAAM,IAAI,GAAG,GAAG,MAAM,GAAG,WAAW,GAAG,KAAK,EAAE,CAAC;IAC/C,+EAA+E;IAC/E,OAAO,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC;AACxD,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,eAAwB;IAC5D,OAAO;QACL,4BAA4B;QAC5B,eAAe;QACf,EAAE;QACF,2BAA2B,cAAc,wCAAwC;QACjF,GAAG,kBAAkB,CAAC,eAAe,CAAC;QACtC,0BAA0B;KAC3B,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;AACf,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,IAAY;IAChD,OAAO,mBAAmB,CACxB,IAAI,EACJ,4BAA4B,EAC5B,0BAA0B,EAC1B,EAAE,CACH,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,SAAS,kBAAkB,CAAC,eAAmC;IAC7D,IAAI,eAAe,KAAK,SAAS,EAAE,CAAC;QAClC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,OAAO;QACL,eAAe,eAAe,yCAAyC;QACvE,0CAA0C;KAC3C,CAAC;AACJ,CAAC"}
@@ -34,9 +34,9 @@ export const NIGHTLY_E2E_GUARD_BEHAVIOR_CERTIFICATES = Object.freeze({
34
34
  }),
35
35
  dfd2fef680de5ef03e63075e8a61c62ca4d95cdfdff6201939b79c748d3397f6: Object.freeze({
36
36
  contractVersion: "1.9.0",
37
- packageVersions: Object.freeze(["4.47.0"]),
37
+ packageVersions: Object.freeze(["4.49.0"]),
38
38
  provenances: Object.freeze([
39
- "workspace package @codyswann/lisa@4.47.0 (typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs)",
39
+ "workspace package @codyswann/lisa@4.49.0 (typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs)",
40
40
  ]),
41
41
  }),
42
42
  });
@@ -1 +1 @@
1
- {"version":3,"file":"upstream-evidence-manifest.d.ts","sourceRoot":"","sources":["../../src/core/upstream-evidence-manifest.ts"],"names":[],"mappings":"AACA,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAwlFpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAi4QjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}
1
+ {"version":3,"file":"upstream-evidence-manifest.d.ts","sourceRoot":"","sources":["../../src/core/upstream-evidence-manifest.ts"],"names":[],"mappings":"AACA,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAwlFpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAy4QjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}
@@ -1165,7 +1165,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
1165
1165
  "scripts/cleanup-amplify-branches.sh": "eb9db90b07818dd156dd48d04b6350a10b39be8ffe0267d72cc13705c8eb5350",
1166
1166
  "scripts/cleanup-github-branches.sh": "88d7442700c3277cbf96c0f3250b8169fdd43812d585ddac417843a65e2b548c",
1167
1167
  "scripts/cleanup-local-merged-branches.sh": "1f9bc0419187b3cdf0182106588e35dc1068d921be74331aab3737a9de25de57",
1168
- "scripts/cleanup-worktrees.sh": "b47e79c3ad29c6bb0c8441cd99c851adf0bd5e8ded9840ca18fa40d5b7604be4",
1168
+ "scripts/cleanup-worktrees.sh": "711f73fc9238da6a41e16488b77fc7c6ffa1f60b1edec01111959830789d177c",
1169
1169
  "scripts/copy-codex-scripts.mjs": "2d7082d5033088c85f66995aee9e3ee1e7751435e65bfde8e1cb002e6689d476",
1170
1170
  "scripts/copy-opencode-plugin-templates.mjs": "4d68863cd8414d29218280cded63f2c29c3f8d51d8e74cc3b6adfec4f25b06ec",
1171
1171
  "scripts/detect-stale-workflow-inputs.mjs": "04274c1ed972c040ccf0b64aba193368d652769094db6d97706706530e93d74f",
@@ -7714,6 +7714,8 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7714
7714
  "src/configs/vitest/coverage-include-authority.ts": true,
7715
7715
  "src/configs/vitest/coverage-include-global-setup.ts": true,
7716
7716
  "src/configs/vitest/coverage-reports-directory.ts": true,
7717
+ "src/configs/vitest/fleet-admission-global-setup.ts": true,
7718
+ "src/configs/vitest/fleet-admission.ts": true,
7717
7719
  "src/configs/vitest/harper-fabric.ts": true,
7718
7720
  "src/configs/vitest/index.ts": true,
7719
7721
  "src/configs/vitest/nestjs.ts": true,
@@ -7736,6 +7738,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7736
7738
  "src/configs/vitest/scratch-sweep.ts": true,
7737
7739
  "src/configs/vitest/scratch-tmpdir-trust.ts": true,
7738
7740
  "src/configs/vitest/scratch.ts": true,
7741
+ "src/configs/vitest/synthesis-scratch-reclaim.ts": true,
7739
7742
  "src/configs/vitest/typescript.ts": true,
7740
7743
  "src/configs/worktrees.ts": true,
7741
7744
  "src/copilot/copilot-instructions-installer.ts": true,
@@ -8595,6 +8598,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
8595
8598
  "tests/unit/config/scratch-tmpdir-trust.test.ts": true,
8596
8599
  "tests/unit/config/security-pin-floors.test.ts": true,
8597
8600
  "tests/unit/config/shipped-mjs-roster.test.ts": true,
8601
+ "tests/unit/config/synthesis-scratch-reclaim.test.ts": true,
8598
8602
  "tests/unit/config/template-script-toolchain.test.ts": true,
8599
8603
  "tests/unit/config/test-run-child-process-analyzer.test.ts": true,
8600
8604
  "tests/unit/config/test-run-supervision-wiring.test.ts": true,
@@ -8604,6 +8608,8 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
8604
8608
  "tests/unit/config/tsconfig-template-references.test.ts": true,
8605
8609
  "tests/unit/config/vitest-base.test.ts": true,
8606
8610
  "tests/unit/config/vitest-cdk.test.ts": true,
8611
+ "tests/unit/config/vitest-fleet-admission.test.ts": true,
8612
+ "tests/unit/config/vitest-fleet-denominator.test.ts": true,
8607
8613
  "tests/unit/config/vitest-fleet-discovery.test.ts": true,
8608
8614
  "tests/unit/config/vitest-nestjs.test.ts": true,
8609
8615
  "tests/unit/config/vitest-scratch-inspection.test.ts": true,
@@ -8958,6 +8964,8 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
8958
8964
  "tests/unit/scripts/check-whole-output-guards.test.ts": true,
8959
8965
  "tests/unit/scripts/check-workflow-package-contracts.test.ts": true,
8960
8966
  "tests/unit/scripts/check-workflow-package-paths.test.ts": true,
8967
+ "tests/unit/scripts/cleanup-worktrees-apply.test.ts": true,
8968
+ "tests/unit/scripts/cleanup-worktrees-unreadable.test.ts": true,
8961
8969
  "tests/unit/scripts/codex-hook-filter.test.ts": true,
8962
8970
  "tests/unit/scripts/command-envelope.test.ts": true,
8963
8971
  "tests/unit/scripts/conflict-prover-markers-and-index.test.ts": true,