@codyswann/lisa 4.42.7 → 4.43.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 (91) hide show
  1. package/dist/cli/doctor-readiness-delivery.d.ts.map +1 -1
  2. package/dist/cli/doctor-readiness-delivery.js +13 -6
  3. package/dist/cli/doctor-readiness-delivery.js.map +1 -1
  4. package/dist/cli/doctor-readiness-deploy-outcome.d.ts +9 -0
  5. package/dist/cli/doctor-readiness-deploy-outcome.d.ts.map +1 -0
  6. package/dist/cli/doctor-readiness-deploy-outcome.js +87 -0
  7. package/dist/cli/doctor-readiness-deploy-outcome.js.map +1 -0
  8. package/dist/cli/doctor-readiness-workflows.d.ts +8 -0
  9. package/dist/cli/doctor-readiness-workflows.d.ts.map +1 -1
  10. package/dist/cli/doctor-readiness-workflows.js +1 -0
  11. package/dist/cli/doctor-readiness-workflows.js.map +1 -1
  12. package/dist/core/deploy-release-dependence.d.ts +72 -0
  13. package/dist/core/deploy-release-dependence.d.ts.map +1 -0
  14. package/dist/core/deploy-release-dependence.js +236 -0
  15. package/dist/core/deploy-release-dependence.js.map +1 -0
  16. package/dist/core/github-actions-condition.d.ts +78 -0
  17. package/dist/core/github-actions-condition.d.ts.map +1 -0
  18. package/dist/core/github-actions-condition.js +307 -0
  19. package/dist/core/github-actions-condition.js.map +1 -0
  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 +15 -1
  23. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  24. package/dist/migrations/deploy-outcome-guard-edit.d.ts +11 -0
  25. package/dist/migrations/deploy-outcome-guard-edit.d.ts.map +1 -0
  26. package/dist/migrations/deploy-outcome-guard-edit.js +184 -0
  27. package/dist/migrations/deploy-outcome-guard-edit.js.map +1 -0
  28. package/dist/migrations/deploy-outcome-guard-yaml.d.ts +91 -0
  29. package/dist/migrations/deploy-outcome-guard-yaml.d.ts.map +1 -0
  30. package/dist/migrations/deploy-outcome-guard-yaml.js +180 -0
  31. package/dist/migrations/deploy-outcome-guard-yaml.js.map +1 -0
  32. package/dist/migrations/ensure-deploy-outcome-guard.d.ts +41 -0
  33. package/dist/migrations/ensure-deploy-outcome-guard.d.ts.map +1 -0
  34. package/dist/migrations/ensure-deploy-outcome-guard.js +238 -0
  35. package/dist/migrations/ensure-deploy-outcome-guard.js.map +1 -0
  36. package/dist/migrations/index.d.ts +1 -0
  37. package/dist/migrations/index.d.ts.map +1 -1
  38. package/dist/migrations/index.js +3 -0
  39. package/dist/migrations/index.js.map +1 -1
  40. package/package.json +4 -4
  41. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  43. package/plugins/lisa-agy/plugin.json +1 -1
  44. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  45. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  46. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  47. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  48. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  49. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  50. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  52. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  53. package/plugins/lisa-expo-agy/plugin.json +1 -1
  54. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  57. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  58. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  59. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  60. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  61. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  63. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  64. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  68. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  69. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  72. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  73. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  74. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  76. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  77. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  78. package/plugins/lisa-rails-agy/plugin.json +1 -1
  79. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  80. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  81. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  82. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  83. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  84. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  85. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  86. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  87. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  88. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  89. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  90. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  91. package/scripts/check-test-case-executed.mjs +184 -0
@@ -0,0 +1,78 @@
1
+ /**
2
+ * A deliberately small evaluator for the subset of GitHub Actions expression
3
+ * syntax that Lisa's deploy workflows use in a job-level `if:`, plus the rule
4
+ * that turns the result into "this job RAN" or "this job was SKIPPED".
5
+ *
6
+ * It exists because the defect in #3467 is invisible to anything that only
7
+ * reads the YAML for the presence or absence of a substring. What went wrong
8
+ * was a job OUTCOME — a deploy that was skipped rather than failed — and an
9
+ * outcome is what has to be established. Lisa never runs a host's deploy
10
+ * workflow itself, so no observation of CI can stand in for that; the
11
+ * expression has to be evaluated against a scenario.
12
+ *
13
+ * ## Why this is production code and not a test helper
14
+ *
15
+ * It began as one, under `tests/integration/`. It moved here when #3740 needed
16
+ * the same question answered in a host repository — *would this job skip
17
+ * because the release failed?* — by `lisa doctor` and by the migration that
18
+ * repairs an already-seeded `deploy.yml`. Reimplementing GitHub's implicit
19
+ * `success()` rule a second time in `src/` would have put two subtly different
20
+ * copies of one semantics in the tree, which is the drift this repository
21
+ * repeatedly pays for. There is one implementation, and the test that made it
22
+ * imports it from here.
23
+ *
24
+ * The evaluator THROWS on anything outside the supported subset rather than
25
+ * guessing. An expression it cannot parse must never quietly evaluate to a
26
+ * plausible-looking boolean: a caller that cannot read a condition must say so,
27
+ * because reporting a confident verdict about an expression nobody understood
28
+ * is the failure mode this whole family of checks exists to catch.
29
+ *
30
+ * Supported: `&&`, `||`, `!`, `==`, `!=`, parentheses, single-quoted strings,
31
+ * `true`/`false`, the status functions `always()` / `cancelled()` / `success()`
32
+ * / `failure()`, the string functions `startsWith()` / `contains()`, and
33
+ * context paths under `needs.`, `github.` and `inputs.`.
34
+ * @module core/github-actions-condition
35
+ */
36
+ /** The four conclusions a `needs` job can report to a dependent job. */
37
+ export type JobResult = "success" | "failure" | "cancelled" | "skipped";
38
+ /** One upstream job as a dependent job sees it. */
39
+ export interface NeedsEntry {
40
+ readonly result: JobResult;
41
+ readonly outputs?: Readonly<Record<string, string>>;
42
+ }
43
+ /** The run state a job-level `if:` is evaluated against. */
44
+ export interface RunScenario {
45
+ readonly needs: Readonly<Record<string, NeedsEntry>>;
46
+ /** Flattened `github.*` paths, e.g. `github.event.head_commit.message`. */
47
+ readonly github: Readonly<Record<string, string>>;
48
+ /** Flattened `inputs.*` values. */
49
+ readonly inputs?: Readonly<Record<string, string>>;
50
+ /** Whether an operator cancelled the run. */
51
+ readonly cancelled: boolean;
52
+ }
53
+ /**
54
+ * Split an expression into tokens.
55
+ * @param source - Raw `if:` text, with any `${{ }}` wrapper already stripped
56
+ * @returns The token list
57
+ */
58
+ export declare function tokenize(source: string): readonly string[];
59
+ /**
60
+ * Evaluate a job-level `if:` under one scenario.
61
+ * @param condition - The raw `if:` text
62
+ * @param scenario - The run state
63
+ * @returns Whether the condition holds
64
+ */
65
+ export declare function evaluateCondition(condition: string, scenario: RunScenario): boolean;
66
+ /**
67
+ * Whether a job with this `if:` runs, applying GitHub's rule that an implicit
68
+ * `success()` is ANDed on unless the condition names a status function.
69
+ *
70
+ * That implicit AND is the whole mechanism behind the rails half of #3467: the
71
+ * condition there said nothing about the release at all, and still skipped when
72
+ * the release failed.
73
+ * @param condition - The raw `if:` text, or `""` when the job has none
74
+ * @param scenario - The run state
75
+ * @returns True when the job runs, false when GitHub skips it
76
+ */
77
+ export declare function jobRuns(condition: string, scenario: RunScenario): boolean;
78
+ //# sourceMappingURL=github-actions-condition.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-actions-condition.d.ts","sourceRoot":"","sources":["../../src/core/github-actions-condition.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAEH,wEAAwE;AACxE,MAAM,MAAM,SAAS,GAAG,SAAS,GAAG,SAAS,GAAG,WAAW,GAAG,SAAS,CAAC;AAExE,mDAAmD;AACnD,MAAM,WAAW,UAAU;IACzB,QAAQ,CAAC,MAAM,EAAE,SAAS,CAAC;IAC3B,QAAQ,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;CACrD;AAED,4DAA4D;AAC5D,MAAM,WAAW,WAAW;IAC1B,QAAQ,CAAC,KAAK,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,UAAU,CAAC,CAAC,CAAC;IACrD,2EAA2E;IAC3E,QAAQ,CAAC,MAAM,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IAClD,mCAAmC;IACnC,QAAQ,CAAC,MAAM,CAAC,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;IACnD,6CAA6C;IAC7C,QAAQ,CAAC,SAAS,EAAE,OAAO,CAAC;CAC7B;AA6CD;;;;GAIG;AACH,wBAAgB,QAAQ,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,MAAM,EAAE,CAO1D;AAyOD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,WAAW,GACpB,OAAO,CAYT;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,OAAO,CAAC,SAAS,EAAE,MAAM,EAAE,QAAQ,EAAE,WAAW,GAAG,OAAO,CAYzE"}
@@ -0,0 +1,307 @@
1
+ /**
2
+ * A deliberately small evaluator for the subset of GitHub Actions expression
3
+ * syntax that Lisa's deploy workflows use in a job-level `if:`, plus the rule
4
+ * that turns the result into "this job RAN" or "this job was SKIPPED".
5
+ *
6
+ * It exists because the defect in #3467 is invisible to anything that only
7
+ * reads the YAML for the presence or absence of a substring. What went wrong
8
+ * was a job OUTCOME — a deploy that was skipped rather than failed — and an
9
+ * outcome is what has to be established. Lisa never runs a host's deploy
10
+ * workflow itself, so no observation of CI can stand in for that; the
11
+ * expression has to be evaluated against a scenario.
12
+ *
13
+ * ## Why this is production code and not a test helper
14
+ *
15
+ * It began as one, under `tests/integration/`. It moved here when #3740 needed
16
+ * the same question answered in a host repository — *would this job skip
17
+ * because the release failed?* — by `lisa doctor` and by the migration that
18
+ * repairs an already-seeded `deploy.yml`. Reimplementing GitHub's implicit
19
+ * `success()` rule a second time in `src/` would have put two subtly different
20
+ * copies of one semantics in the tree, which is the drift this repository
21
+ * repeatedly pays for. There is one implementation, and the test that made it
22
+ * imports it from here.
23
+ *
24
+ * The evaluator THROWS on anything outside the supported subset rather than
25
+ * guessing. An expression it cannot parse must never quietly evaluate to a
26
+ * plausible-looking boolean: a caller that cannot read a condition must say so,
27
+ * because reporting a confident verdict about an expression nobody understood
28
+ * is the failure mode this whole family of checks exists to catch.
29
+ *
30
+ * Supported: `&&`, `||`, `!`, `==`, `!=`, parentheses, single-quoted strings,
31
+ * `true`/`false`, the status functions `always()` / `cancelled()` / `success()`
32
+ * / `failure()`, the string functions `startsWith()` / `contains()`, and
33
+ * context paths under `needs.`, `github.` and `inputs.`.
34
+ * @module core/github-actions-condition
35
+ */
36
+ /** The status functions whose presence removes GitHub's implicit `success()`. */
37
+ const STATUS_FUNCTIONS = ["always", "cancelled", "success", "failure"];
38
+ /** The two-character operators, matched before the single-character ones. */
39
+ const PAIR_OPERATORS = ["&&", "||", "==", "!="];
40
+ /**
41
+ * Read the single token at the head of the text.
42
+ * @param text - Expression text with leading whitespace already removed
43
+ * @returns The token, quotes included for a string literal
44
+ */
45
+ function headToken(text) {
46
+ if (text.startsWith("'")) {
47
+ const close = text.indexOf("'", 1);
48
+ if (close < 0) {
49
+ throw new Error(`unterminated string in expression: ${text}`);
50
+ }
51
+ return text.slice(0, close + 1);
52
+ }
53
+ if (PAIR_OPERATORS.includes(text.slice(0, 2))) {
54
+ return text.slice(0, 2);
55
+ }
56
+ if ("()!,".includes(text.slice(0, 1))) {
57
+ return text.slice(0, 1);
58
+ }
59
+ const word = /^[A-Za-z0-9_.-]+/.exec(text)?.[0];
60
+ if (!word) {
61
+ throw new Error(`unsupported character '${text.slice(0, 1)}' in expression`);
62
+ }
63
+ return word;
64
+ }
65
+ /**
66
+ * Split an expression into tokens.
67
+ * @param source - Raw `if:` text, with any `${{ }}` wrapper already stripped
68
+ * @returns The token list
69
+ */
70
+ export function tokenize(source) {
71
+ const text = source.trimStart();
72
+ if (text === "") {
73
+ return [];
74
+ }
75
+ const token = headToken(text);
76
+ return [token, ...tokenize(text.slice(token.length))];
77
+ }
78
+ /**
79
+ * GitHub's string-to-boolean cast: only the empty string is falsy.
80
+ * @param value - An evaluated operand
81
+ * @returns Its truthiness
82
+ */
83
+ function truthy(value) {
84
+ return typeof value === "boolean" ? value : value !== "";
85
+ }
86
+ /**
87
+ * GitHub compares strings case-insensitively; every operand here is a string or
88
+ * a boolean, so a normalized string comparison is the whole rule.
89
+ * @param left - Left operand
90
+ * @param right - Right operand
91
+ * @returns Whether the two are equal
92
+ */
93
+ function equal(left, right) {
94
+ return String(left).toLowerCase() === String(right).toLowerCase();
95
+ }
96
+ /**
97
+ * Resolve one `needs.*` path.
98
+ * @param segments - The dot-split path
99
+ * @param scenario - The run state
100
+ * @returns The value
101
+ */
102
+ function resolveNeeds(segments, scenario) {
103
+ const entry = scenario.needs[segments[1] ?? ""];
104
+ if (!entry) {
105
+ throw new Error(`expression reads ${segments.join(".")}, absent from needs`);
106
+ }
107
+ if (segments[2] === "result") {
108
+ return entry.result;
109
+ }
110
+ if (segments[2] !== "outputs") {
111
+ throw new Error(`unsupported needs path: ${segments.join(".")}`);
112
+ }
113
+ // A job that did not succeed publishes no outputs at all. Modelling that is
114
+ // load-bearing: `needs.x.outputs.y == 'true'` is the shape that silently
115
+ // turns an upstream failure into a skipped dependent.
116
+ return entry.result === "success"
117
+ ? (entry.outputs?.[segments[3] ?? ""] ?? "")
118
+ : "";
119
+ }
120
+ /**
121
+ * Resolve one dotted context path against the scenario.
122
+ * @param path - A path such as `needs.release.result`
123
+ * @param scenario - The run state
124
+ * @returns The value, or `""` for a path that resolves to nothing
125
+ */
126
+ function resolvePath(path, scenario) {
127
+ if (path === "true" || path === "false") {
128
+ return path === "true";
129
+ }
130
+ const segments = path.split(".");
131
+ if (segments[0] === "needs") {
132
+ return resolveNeeds(segments, scenario);
133
+ }
134
+ if (segments[0] === "github") {
135
+ return scenario.github[path] ?? "";
136
+ }
137
+ if (segments[0] === "inputs") {
138
+ return scenario.inputs?.[segments[1] ?? ""] ?? "";
139
+ }
140
+ throw new Error(`unsupported context path: ${path}`);
141
+ }
142
+ /**
143
+ * Evaluate a call to one of the supported functions.
144
+ * @param name - Function name
145
+ * @param args - Already-evaluated arguments
146
+ * @param scenario - The run state
147
+ * @returns The call's value
148
+ */
149
+ function callFunction(name, args, scenario) {
150
+ const results = Object.values(scenario.needs).map(entry => entry.result);
151
+ const first = String(args[0] ?? "").toLowerCase();
152
+ const second = String(args[1] ?? "").toLowerCase();
153
+ switch (name) {
154
+ case "always":
155
+ return true;
156
+ case "cancelled":
157
+ return scenario.cancelled;
158
+ case "success":
159
+ return !scenario.cancelled && results.every(r => r === "success");
160
+ case "failure":
161
+ return results.includes("failure");
162
+ case "startsWith":
163
+ return first.startsWith(second);
164
+ case "contains":
165
+ return first.includes(second);
166
+ default:
167
+ throw new Error(`unsupported function: ${name}()`);
168
+ }
169
+ }
170
+ /**
171
+ * Collect and evaluate a function call's arguments.
172
+ * @param tokens - The token list
173
+ * @param index - Position just after the opening parenthesis
174
+ * @param scenario - The run state
175
+ * @param collected - Arguments parsed so far
176
+ * @returns The arguments and the position just after the closing parenthesis
177
+ */
178
+ function callArguments(tokens, index, scenario, collected) {
179
+ if (tokens[index] === ")") {
180
+ return { args: collected, index: index + 1 };
181
+ }
182
+ const argument = expression(tokens, index, scenario);
183
+ const next = tokens[argument.index] === "," ? argument.index + 1 : argument.index;
184
+ return callArguments(tokens, next, scenario, [...collected, argument.value]);
185
+ }
186
+ /**
187
+ * Parse and evaluate a primary term: a negation, a parenthesized expression, a
188
+ * string literal, a function call, or a context path.
189
+ * @param tokens - The token list
190
+ * @param index - Position of the term's first token
191
+ * @param scenario - The run state
192
+ * @returns The term's value and the position after it
193
+ */
194
+ function primary(tokens, index, scenario) {
195
+ const token = tokens[index];
196
+ if (token === undefined) {
197
+ throw new Error("expression ended early");
198
+ }
199
+ if (token === "!") {
200
+ const inner = primary(tokens, index + 1, scenario);
201
+ return { value: !truthy(inner.value), index: inner.index };
202
+ }
203
+ if (token === "(") {
204
+ const inner = expression(tokens, index + 1, scenario);
205
+ if (tokens[inner.index] !== ")") {
206
+ throw new Error("unbalanced parentheses in expression");
207
+ }
208
+ return { value: inner.value, index: inner.index + 1 };
209
+ }
210
+ if (token.startsWith("'")) {
211
+ return { value: token.slice(1, -1), index: index + 1 };
212
+ }
213
+ if (tokens[index + 1] === "(") {
214
+ const call = callArguments(tokens, index + 2, scenario, []);
215
+ return {
216
+ value: callFunction(token, call.args, scenario),
217
+ index: call.index,
218
+ };
219
+ }
220
+ return { value: resolvePath(token, scenario), index: index + 1 };
221
+ }
222
+ /**
223
+ * Parse and evaluate an equality comparison.
224
+ * @param tokens - The token list
225
+ * @param index - Position of the comparison's first token
226
+ * @param scenario - The run state
227
+ * @returns The comparison's value and the position after it
228
+ */
229
+ function comparison(tokens, index, scenario) {
230
+ const left = primary(tokens, index, scenario);
231
+ const operator = tokens[left.index];
232
+ if (operator !== "==" && operator !== "!=") {
233
+ return left;
234
+ }
235
+ const right = primary(tokens, left.index + 1, scenario);
236
+ const same = equal(left.value, right.value);
237
+ return { value: operator === "==" ? same : !same, index: right.index };
238
+ }
239
+ /**
240
+ * Fold the `&&` / `||` operators that follow an already-parsed operand.
241
+ * @param left - The operand parsed so far
242
+ * @param tokens - The token list
243
+ * @param scenario - The run state
244
+ * @returns The folded value and the position after it
245
+ */
246
+ function logicalTail(left, tokens, scenario) {
247
+ const operator = tokens[left.index];
248
+ if (operator !== "&&" && operator !== "||") {
249
+ return left;
250
+ }
251
+ const right = comparison(tokens, left.index + 1, scenario);
252
+ const value = operator === "&&"
253
+ ? truthy(left.value) && truthy(right.value)
254
+ : truthy(left.value) || truthy(right.value);
255
+ return logicalTail({ value, index: right.index }, tokens, scenario);
256
+ }
257
+ /**
258
+ * Parse and evaluate a full expression.
259
+ * @param tokens - The token list
260
+ * @param index - Position of the expression's first token
261
+ * @param scenario - The run state
262
+ * @returns The expression's value and the position after it
263
+ */
264
+ function expression(tokens, index, scenario) {
265
+ return logicalTail(comparison(tokens, index, scenario), tokens, scenario);
266
+ }
267
+ /**
268
+ * Evaluate a job-level `if:` under one scenario.
269
+ * @param condition - The raw `if:` text
270
+ * @param scenario - The run state
271
+ * @returns Whether the condition holds
272
+ */
273
+ export function evaluateCondition(condition, scenario) {
274
+ const stripped = condition
275
+ .trim()
276
+ .replace(/^\$\{\{/, "")
277
+ .replace(/\}\}$/, "")
278
+ .trim();
279
+ const tokens = tokenize(stripped);
280
+ const parsed = expression(tokens, 0, scenario);
281
+ if (parsed.index !== tokens.length) {
282
+ throw new Error(`unparsed tail in expression: ${condition}`);
283
+ }
284
+ return truthy(parsed.value);
285
+ }
286
+ /**
287
+ * Whether a job with this `if:` runs, applying GitHub's rule that an implicit
288
+ * `success()` is ANDed on unless the condition names a status function.
289
+ *
290
+ * That implicit AND is the whole mechanism behind the rails half of #3467: the
291
+ * condition there said nothing about the release at all, and still skipped when
292
+ * the release failed.
293
+ * @param condition - The raw `if:` text, or `""` when the job has none
294
+ * @param scenario - The run state
295
+ * @returns True when the job runs, false when GitHub skips it
296
+ */
297
+ export function jobRuns(condition, scenario) {
298
+ const results = Object.values(scenario.needs).map(entry => entry.result);
299
+ const dependenciesSucceeded = !scenario.cancelled && results.every(result => result === "success");
300
+ if (condition.trim() === "") {
301
+ return dependenciesSucceeded;
302
+ }
303
+ const namesStatusFunction = STATUS_FUNCTIONS.some(name => new RegExp(`\\b${name}\\s*\\(`).test(condition));
304
+ const holds = evaluateCondition(condition, scenario);
305
+ return namesStatusFunction ? holds : holds && dependenciesSucceeded;
306
+ }
307
+ //# sourceMappingURL=github-actions-condition.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"github-actions-condition.js","sourceRoot":"","sources":["../../src/core/github-actions-condition.ts"],"names":[],"mappings":"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"}
@@ -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.42.7"]),
37
+ packageVersions: Object.freeze(["4.43.0"]),
38
38
  provenances: Object.freeze([
39
- "workspace package @codyswann/lisa@4.42.7 (typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs)",
39
+ "workspace package @codyswann/lisa@4.43.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,CAokFpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAuzQjE,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,CAskFpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAo0QjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}
@@ -1148,6 +1148,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
1148
1148
  "scripts/check-shell-guard-refusal-coverage.mjs": "d6b056c4311ea612e85d16ae565a57c5e10c822e87e21d689e12a6cc89dfda3f",
1149
1149
  "scripts/check-state-classification.mjs": "26baaa85c0758fa41f1f66257f7d3a31ea4dd5cf17a9c0acaa3e89caaaf6265a",
1150
1150
  "scripts/check-template-workflow-refs.mjs": "89176394a933d0a42c39ab1805a45e782a2f3e1893d707ac1afb439062397088",
1151
+ "scripts/check-test-case-executed.mjs": "99c4e0f4544f67c920d787fe6a7fb801ac37c591b6392791b4e3d1802bec5359",
1151
1152
  "scripts/check-third-party-action-pins.mjs": "c085949d734edfef2807a95bc7c4814485e30f7bfad4d5054586aa264a5d42b4",
1152
1153
  "scripts/check-typecheck-tests.mjs": "f09e5da1e70b20228c39f6133fc355bcbc8c3af0fb65e1afd100203d862b1b9e",
1153
1154
  "scripts/check-ui-demo-data.mjs": "82a5ed89ae830482dbaab99e2f8eeededcde60a7dd6ac145f191b4ac8394c85b",
@@ -1421,6 +1422,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
1421
1422
  ".github/workflows/nightly-e2e-health.yml": true,
1422
1423
  ".github/workflows/nightly-e2e-report.yml": true,
1423
1424
  ".github/workflows/nightly-e2e-tracking.yml": true,
1425
+ ".github/workflows/nightly-tmpdir-growth-benchmark.yml": true,
1424
1426
  ".github/workflows/playwright-e2e.yml": true,
1425
1427
  ".github/workflows/plugins-sync.yml": true,
1426
1428
  ".github/workflows/publish-to-npm.yml": true,
@@ -7350,6 +7352,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7350
7352
  "scripts/check-shell-guard-refusal-coverage.mjs": true,
7351
7353
  "scripts/check-state-classification.mjs": true,
7352
7354
  "scripts/check-template-workflow-refs.mjs": true,
7355
+ "scripts/check-test-case-executed.mjs": true,
7353
7356
  "scripts/check-third-party-action-pins.mjs": true,
7354
7357
  "scripts/check-typecheck-tests.mjs": true,
7355
7358
  "scripts/check-ui-demo-data.mjs": true,
@@ -7487,6 +7490,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7487
7490
  "src/cli/doctor-readiness-context.ts": true,
7488
7491
  "src/cli/doctor-readiness-credentials.ts": true,
7489
7492
  "src/cli/doctor-readiness-delivery.ts": true,
7493
+ "src/cli/doctor-readiness-deploy-outcome.ts": true,
7490
7494
  "src/cli/doctor-readiness-domain.ts": true,
7491
7495
  "src/cli/doctor-readiness-guardrails.ts": true,
7492
7496
  "src/cli/doctor-readiness-journey-freshness.ts": true,
@@ -7715,6 +7719,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7715
7719
  "src/core/config.ts": true,
7716
7720
  "src/core/configured-learnings-path.ts": true,
7717
7721
  "src/core/deletion-basis.ts": true,
7722
+ "src/core/deploy-release-dependence.ts": true,
7718
7723
  "src/core/downstream-names.ts": true,
7719
7724
  "src/core/downstream-references.ts": true,
7720
7725
  "src/core/enforcement-census-report.ts": true,
@@ -7724,6 +7729,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7724
7729
  "src/core/gate-declaration-drift.ts": true,
7725
7730
  "src/core/git-service.ts": true,
7726
7731
  "src/core/gitattributes-merge-drivers.ts": true,
7732
+ "src/core/github-actions-condition.ts": true,
7727
7733
  "src/core/guard-capabilities.ts": true,
7728
7734
  "src/core/hook-copy-parity.ts": true,
7729
7735
  "src/core/host-rules-pointer.ts": true,
@@ -7823,7 +7829,10 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7823
7829
  "src/logging/index.ts": true,
7824
7830
  "src/logging/logger.interface.ts": true,
7825
7831
  "src/logging/silent-logger.ts": true,
7832
+ "src/migrations/deploy-outcome-guard-edit.ts": true,
7833
+ "src/migrations/deploy-outcome-guard-yaml.ts": true,
7826
7834
  "src/migrations/ensure-audit-ignore-local-exclusions.ts": true,
7835
+ "src/migrations/ensure-deploy-outcome-guard.ts": true,
7827
7836
  "src/migrations/ensure-jest-rn-mock-accessibility-manager.ts": true,
7828
7837
  "src/migrations/ensure-learnings-gitattributes.ts": true,
7829
7838
  "src/migrations/ensure-learnings-merge-driver.ts": true,
@@ -8139,7 +8148,6 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
8139
8148
  "tests/integration/deploy-gate-blocks-release.test.ts": true,
8140
8149
  "tests/integration/deploy-moment-evidence.test.ts": true,
8141
8150
  "tests/integration/deploy-moment-runner.test.ts": true,
8142
- "tests/integration/deploy-outcome-guard-helper.ts": true,
8143
8151
  "tests/integration/deploy-outcome-guard.test.ts": true,
8144
8152
  "tests/integration/doctor-nightly-e2e-guard-cli-helper.ts": true,
8145
8153
  "tests/integration/doctor-nightly-e2e-guard-cli.test.ts": true,
@@ -8331,6 +8339,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
8331
8339
  "tests/unit/cli/doctor-readiness-delivery-reusable-callers.test.ts": true,
8332
8340
  "tests/unit/cli/doctor-readiness-delivery-triggers.test.ts": true,
8333
8341
  "tests/unit/cli/doctor-readiness-delivery.test.ts": true,
8342
+ "tests/unit/cli/doctor-readiness-deploy-outcome.test.ts": true,
8334
8343
  "tests/unit/cli/doctor-readiness-domain-ephemeral.test.ts": true,
8335
8344
  "tests/unit/cli/doctor-readiness-domain-negatives.test.ts": true,
8336
8345
  "tests/unit/cli/doctor-readiness-domain.test.ts": true,
@@ -8553,6 +8562,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
8553
8562
  "tests/unit/config/test-run-child-process-analyzer.test.ts": true,
8554
8563
  "tests/unit/config/test-run-supervision-wiring.test.ts": true,
8555
8564
  "tests/unit/config/test-scratch-guard.test.ts": true,
8565
+ "tests/unit/config/tmpdir-growth-benchmark-scheduled.test.ts": true,
8556
8566
  "tests/unit/config/tsconfig-no-unused-flags.test.ts": true,
8557
8567
  "tests/unit/config/tsconfig-template-references.test.ts": true,
8558
8568
  "tests/unit/config/vitest-base.test.ts": true,
@@ -8578,6 +8588,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
8578
8588
  "tests/unit/core/apply-mode.test.ts": true,
8579
8589
  "tests/unit/core/bootstrap-environment.test.ts": true,
8580
8590
  "tests/unit/core/deletion-basis.test.ts": true,
8591
+ "tests/unit/core/deploy-release-dependence.test.ts": true,
8581
8592
  "tests/unit/core/enforcement-census-roster.test.ts": true,
8582
8593
  "tests/unit/core/enforcement-census.test.ts": true,
8583
8594
  "tests/unit/core/fs-extra-namespace-callsites.test.ts": true,
@@ -8794,6 +8805,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
8794
8805
  "tests/unit/hooks/worktree-create.test.ts": true,
8795
8806
  "tests/unit/migrations/ensure-audit-ignore-local-exclusions-esbuild.test.ts": true,
8796
8807
  "tests/unit/migrations/ensure-audit-ignore-local-exclusions.test.ts": true,
8808
+ "tests/unit/migrations/ensure-deploy-outcome-guard.test.ts": true,
8797
8809
  "tests/unit/migrations/ensure-jest-rn-mock-accessibility-manager.test.ts": true,
8798
8810
  "tests/unit/migrations/ensure-learnings-gitattributes.test.ts": true,
8799
8811
  "tests/unit/migrations/ensure-learnings-merge-driver.test.ts": true,
@@ -8885,6 +8897,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
8885
8897
  "tests/unit/scripts/check-self-dependency-pin.test.ts": true,
8886
8898
  "tests/unit/scripts/check-shell-guard-refusal-coverage.test.ts": true,
8887
8899
  "tests/unit/scripts/check-template-workflow-refs.test.ts": true,
8900
+ "tests/unit/scripts/check-test-case-executed.test.ts": true,
8888
8901
  "tests/unit/scripts/check-third-party-action-pins.test.ts": true,
8889
8902
  "tests/unit/scripts/check-ui-demo-data.test.ts": true,
8890
8903
  "tests/unit/scripts/check-whole-output-guards.test.ts": true,
@@ -9587,6 +9600,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
9587
9600
  "wiki/decisions/2026-08-12-in-session-ticket-ready-role.md": true,
9588
9601
  "wiki/decisions/2026-08-12-ratchet-policy.md": true,
9589
9602
  "wiki/decisions/2026-08-19-guard-mutation-gate.md": true,
9603
+ "wiki/decisions/2026-09-04-state-change-without-inverse.md": true,
9590
9604
  "wiki/documentation/assets/lisa-architecture.svg": true,
9591
9605
  "wiki/documentation/claude/overinstructions.md": true,
9592
9606
  "wiki/documentation/claude/review.md": true,