@codyswann/lisa 4.42.6 → 4.42.7
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.
- package/README.md +4 -0
- package/all/copy-overwrite/scripts/check-orphaned-branches.mjs +7 -0
- package/all/copy-overwrite/scripts/lib/process-tree-runner.mjs +12 -2
- package/all/copy-overwrite/scripts/lisa-cross-worktree-guard.mjs +4 -0
- package/all/copy-overwrite/scripts/lisa-environment-prepare.mjs +2 -0
- package/all/copy-overwrite/scripts/lisa-hooks/worktree-binding-guard.mjs +31 -3
- package/all/copy-overwrite/scripts/lisa-run-gates.mjs +4 -0
- package/all/copy-overwrite/scripts/lisa-work-item.mjs +13 -0
- package/dist/configs/vitest/base.d.ts +1 -1
- package/dist/configs/vitest/base.d.ts.map +1 -1
- package/dist/configs/vitest/base.js +1 -0
- package/dist/configs/vitest/base.js.map +1 -1
- package/dist/configs/vitest/cdk.d.ts +2 -2
- package/dist/configs/vitest/cdk.d.ts.map +1 -1
- package/dist/configs/vitest/cdk.js +5 -2
- package/dist/configs/vitest/cdk.js.map +1 -1
- package/dist/configs/vitest/coverage-reports-directory.d.ts +47 -0
- package/dist/configs/vitest/coverage-reports-directory.d.ts.map +1 -0
- package/dist/configs/vitest/coverage-reports-directory.js +131 -0
- package/dist/configs/vitest/coverage-reports-directory.js.map +1 -0
- package/dist/configs/vitest/harper-fabric.d.ts +2 -2
- package/dist/configs/vitest/harper-fabric.d.ts.map +1 -1
- package/dist/configs/vitest/harper-fabric.js +5 -2
- package/dist/configs/vitest/harper-fabric.js.map +1 -1
- package/dist/configs/vitest/nestjs.d.ts +2 -2
- package/dist/configs/vitest/nestjs.d.ts.map +1 -1
- package/dist/configs/vitest/nestjs.js +5 -2
- package/dist/configs/vitest/nestjs.js.map +1 -1
- package/dist/configs/vitest/phaser.d.ts +2 -2
- package/dist/configs/vitest/phaser.d.ts.map +1 -1
- package/dist/configs/vitest/phaser.js +5 -2
- package/dist/configs/vitest/phaser.js.map +1 -1
- package/dist/configs/vitest/typescript.d.ts +2 -2
- package/dist/configs/vitest/typescript.d.ts.map +1 -1
- package/dist/configs/vitest/typescript.js +5 -2
- package/dist/configs/vitest/typescript.js.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +24 -0
- package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
- package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +30 -23
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/expo/copy-overwrite/scripts/bdd/baseline.mjs +26 -7
- package/package.json +5 -4
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/skills/lisa-drive-pr-to-merge/SKILL.md +11 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/bootstrap-store.mjs +3 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/preflight-secrets.mjs +3 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-secrets-access/scripts/providers.mjs +4 -0
- package/plugins/lisa/.codex-plugin/skills/lisa-setup-workstation/scripts/workstation.mjs +3 -0
- package/plugins/lisa/hooks/threshold-ratchet.mjs +6 -0
- package/plugins/lisa/hooks/worktree-binding-guard.mjs +31 -3
- package/plugins/lisa/scripts/design-variable-ids.mjs +2 -0
- package/plugins/lisa/skills/lisa-drive-pr-to-merge/SKILL.md +11 -0
- package/plugins/lisa/skills/lisa-secrets-access/scripts/bootstrap-store.mjs +3 -0
- package/plugins/lisa/skills/lisa-secrets-access/scripts/preflight-secrets.mjs +3 -0
- package/plugins/lisa/skills/lisa-secrets-access/scripts/providers.mjs +4 -0
- package/plugins/lisa/skills/lisa-setup-workstation/scripts/workstation.mjs +3 -0
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/scripts/design-variable-ids.mjs +2 -0
- package/plugins/lisa-agy/skills/lisa-drive-pr-to-merge/SKILL.md +11 -0
- package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/bootstrap-store.mjs +3 -0
- package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/preflight-secrets.mjs +3 -0
- package/plugins/lisa-agy/skills/lisa-secrets-access/scripts/providers.mjs +4 -0
- package/plugins/lisa-agy/skills/lisa-setup-workstation/scripts/workstation.mjs +3 -0
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/hooks/threshold-ratchet.mjs +6 -0
- package/plugins/lisa-copilot/hooks/worktree-binding-guard.mjs +31 -3
- package/plugins/lisa-copilot/scripts/design-variable-ids.mjs +2 -0
- package/plugins/lisa-copilot/skills/lisa-drive-pr-to-merge/SKILL.md +11 -0
- package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/bootstrap-store.mjs +3 -0
- package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/preflight-secrets.mjs +3 -0
- package/plugins/lisa-copilot/skills/lisa-secrets-access/scripts/providers.mjs +4 -0
- package/plugins/lisa-copilot/skills/lisa-setup-workstation/scripts/workstation.mjs +3 -0
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/hooks/threshold-ratchet.mjs +6 -0
- package/plugins/lisa-cursor/hooks/worktree-binding-guard.mjs +31 -3
- package/plugins/lisa-cursor/scripts/design-variable-ids.mjs +2 -0
- package/plugins/lisa-cursor/skills/lisa-drive-pr-to-merge/SKILL.md +11 -0
- package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/bootstrap-store.mjs +3 -0
- package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/preflight-secrets.mjs +3 -0
- package/plugins/lisa-cursor/skills/lisa-secrets-access/scripts/providers.mjs +4 -0
- package/plugins/lisa-cursor/skills/lisa-setup-workstation/scripts/workstation.mjs +3 -0
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/scripts/ingest-git.mjs +2 -0
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/scripts/ingest-git.mjs +2 -0
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/scripts/ingest-git.mjs +2 -0
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/scripts/ingest-git.mjs +2 -0
- package/plugins/src/base/hooks/threshold-ratchet.mjs +6 -0
- package/plugins/src/base/hooks/worktree-binding-guard.mjs +31 -3
- package/plugins/src/base/scripts/design-variable-ids.mjs +2 -0
- package/plugins/src/base/skills/lisa-drive-pr-to-merge/SKILL.md +11 -0
- package/plugins/src/base/skills/lisa-secrets-access/scripts/bootstrap-store.mjs +3 -0
- package/plugins/src/base/skills/lisa-secrets-access/scripts/preflight-secrets.mjs +3 -0
- package/plugins/src/base/skills/lisa-secrets-access/scripts/providers.mjs +4 -0
- package/plugins/src/base/skills/lisa-setup-workstation/scripts/workstation.mjs +3 -0
- package/plugins/src/wiki/scripts/ingest-git.mjs +2 -0
- package/rails/copy-overwrite/scripts/check-threshold-ratchet.mjs +6 -0
- package/scripts/check-merge-driver-registration.mjs +2 -0
- package/scripts/check-probe-absence-direction.mjs +611 -0
- package/scripts/install-generated-artifact-merge-driver.mjs +7 -1
- package/scripts/lib/shell-guard-refusal-coverage.mjs +18 -19
- package/typescript/copy-overwrite/scripts/check-threshold-ratchet.mjs +6 -0
- package/typescript/copy-overwrite/scripts/lisa-mutation.mjs +4 -0
|
@@ -121,6 +121,10 @@ function git(args, cwd) {
|
|
|
121
121
|
timeout: 30_000,
|
|
122
122
|
});
|
|
123
123
|
} catch {
|
|
124
|
+
// probe-direction: fail-closed — null never reaches a verdict as "no
|
|
125
|
+
// weakening found". `changePlan` turns it into `undeterminable`, which
|
|
126
|
+
// REFUSES, and `isPromotion` falls to the strict reading that keeps the
|
|
127
|
+
// allow list pinned to the baseline.
|
|
124
128
|
return null;
|
|
125
129
|
}
|
|
126
130
|
}
|
|
@@ -166,6 +170,8 @@ function resolvePlan(mode, root, baseRef, onlyFiles) {
|
|
|
166
170
|
try {
|
|
167
171
|
return fs.readFileSync(path.join(root, f), "utf-8");
|
|
168
172
|
} catch {
|
|
173
|
+
// probe-direction: fail-closed — an unreadable current file compares as
|
|
174
|
+
// absent against the baseline, which is the strict side of the ratchet.
|
|
169
175
|
return null;
|
|
170
176
|
}
|
|
171
177
|
},
|
|
@@ -96,14 +96,35 @@ function git(args, cwd) {
|
|
|
96
96
|
stdio: ["ignore", "pipe", "ignore"],
|
|
97
97
|
}).trim();
|
|
98
98
|
} catch {
|
|
99
|
+
// probe-direction: neutral — this helper REPORTS, it does not decide. Both
|
|
100
|
+
// callers below read null and each one says out loud what it could not do
|
|
101
|
+
// before returning, so no gate outcome follows from this null silently
|
|
102
|
+
// (#3848). Keep that true: a caller added here that spends null as an
|
|
103
|
+
// answer has to say so at its own line.
|
|
99
104
|
return null;
|
|
100
105
|
}
|
|
101
106
|
}
|
|
102
107
|
|
|
103
|
-
/**
|
|
108
|
+
/**
|
|
109
|
+
* The worktree root containing `cwd`, or null when `cwd` is not in a repo.
|
|
110
|
+
*
|
|
111
|
+
* `--show-toplevel` exits non-zero for two OPPOSITE reasons and hands back the
|
|
112
|
+
* same nothing for both: `cwd` is outside any repository — a real absence, and
|
|
113
|
+
* a call there is genuinely none of this guard's business — or git could not
|
|
114
|
+
* answer at all, where the binding is unproven rather than inapplicable. Only
|
|
115
|
+
* the second is a withdrawal of enforcement, and it is the one that must not
|
|
116
|
+
* pass for the first. `git --version` succeeds wherever git can run, so its
|
|
117
|
+
* failure is what separates them.
|
|
118
|
+
* @param {string} cwd Directory the tool call runs in.
|
|
119
|
+
* @returns {string|null} Absolute worktree root, or null.
|
|
120
|
+
*/
|
|
104
121
|
function worktreeRoot(cwd) {
|
|
105
122
|
const top = git(["rev-parse", "--show-toplevel"], cwd);
|
|
106
|
-
|
|
123
|
+
if (top) return resolve(top);
|
|
124
|
+
if (git(["--version"], cwd) === null) {
|
|
125
|
+
say("git could not be run here, so the worktree binding is NOT enforced");
|
|
126
|
+
}
|
|
127
|
+
return null;
|
|
107
128
|
}
|
|
108
129
|
|
|
109
130
|
/**
|
|
@@ -117,7 +138,14 @@ function mainCheckout(cwd) {
|
|
|
117
138
|
["rev-parse", "--path-format=absolute", "--git-common-dir"],
|
|
118
139
|
cwd
|
|
119
140
|
);
|
|
120
|
-
|
|
141
|
+
if (common) return dirname(resolve(common));
|
|
142
|
+
// Reached only for an `EnterWorktree` naming a worktree, which means a
|
|
143
|
+
// repository was already in hand — so failing here is "could not ask", and
|
|
144
|
+
// the consequence is that the claim goes unrecorded and the NEXT call's
|
|
145
|
+
// displacement check has nothing to compare against. Said out loud rather
|
|
146
|
+
// than returned as a quiet null (#3848).
|
|
147
|
+
say("git could not resolve the main checkout, so this claim is NOT recorded");
|
|
148
|
+
return null;
|
|
121
149
|
}
|
|
122
150
|
|
|
123
151
|
function stateFile(sessionId) {
|
|
@@ -298,6 +298,8 @@ async function callMcp(token, tool, args) {
|
|
|
298
298
|
.map(part => part.text ?? "")
|
|
299
299
|
.join("");
|
|
300
300
|
} catch {
|
|
301
|
+
// probe-direction: neutral — this is a design-token lookup for a generator;
|
|
302
|
+
// no gate reads the result, and null renders as a missing token.
|
|
301
303
|
return null;
|
|
302
304
|
}
|
|
303
305
|
}
|
|
@@ -617,6 +617,17 @@ gh api "repos/<owner>/<repo>/actions/runs?head_sha=<head>" --jq .total_count
|
|
|
617
617
|
problem. If CI were merely slow you would see runs QUEUED, not absent. Resolve
|
|
618
618
|
the conflict and the runs appear; nothing else will make them appear.
|
|
619
619
|
|
|
620
|
+
**`<head>` must be the FULL 40-character SHA.** `head_sha=` does not match a
|
|
621
|
+
prefix and does not reject one: an abbreviated SHA returns a clean
|
|
622
|
+
`total_count: 0` — not a 404, not a validation error, an absence shaped exactly
|
|
623
|
+
like "no workflow ran". Measured on one pull request's own head: `77f223b9d` →
|
|
624
|
+
`total_count 0`, `77f223b9d8ffe7b172e9cac48b068b3bcac304c3` → `total_count 4`.
|
|
625
|
+
Take the SHA from `gh pr view <pr> --json headRefOid --jq .headRefOid`, never
|
|
626
|
+
from `git log --oneline` or a truncated line in a log or a UI. Copying a short
|
|
627
|
+
SHA here makes EVERY pull request read as having no CI, and the natural next
|
|
628
|
+
action — rebase and force-push — throws away the live run you could not see
|
|
629
|
+
(#3848).
|
|
630
|
+
|
|
620
631
|
**`mergeable` is computed asynchronously.** GitHub returns `null` while it is
|
|
621
632
|
still working it out, so a single read on a freshly-opened PR can say `null` on
|
|
622
633
|
a perfectly clean branch. Treat `null` as "cannot tell yet" and re-read — never
|
|
@@ -218,6 +218,9 @@ export function hasBootstrap(key, deps = {}) {
|
|
|
218
218
|
);
|
|
219
219
|
return true;
|
|
220
220
|
} catch {
|
|
221
|
+
// probe-direction: fail-closed — false means "no bootstrap value proven
|
|
222
|
+
// present", which makes the setup flow ASK for one. A keychain that cannot
|
|
223
|
+
// be queried costs a redundant prompt, never a skipped bootstrap.
|
|
221
224
|
return false;
|
|
222
225
|
}
|
|
223
226
|
}
|
|
@@ -270,6 +270,9 @@ export function runProbe(substrate) {
|
|
|
270
270
|
});
|
|
271
271
|
return true;
|
|
272
272
|
} catch {
|
|
273
|
+
// probe-direction: fail-closed — false makes the caller behave as if no
|
|
274
|
+
// substrate existed and fall through to the provider, which is the stricter
|
|
275
|
+
// path, exactly as the paragraph above states.
|
|
273
276
|
return false;
|
|
274
277
|
}
|
|
275
278
|
}
|
|
@@ -178,6 +178,8 @@ function keychainServiceNames() {
|
|
|
178
178
|
([, name]) => name
|
|
179
179
|
);
|
|
180
180
|
} catch {
|
|
181
|
+
// probe-direction: neutral — the names only enrich a diagnostic message on a
|
|
182
|
+
// path that has already failed; no verdict reads them.
|
|
181
183
|
// A locked, absent, or oversized keychain leaves the list empty.
|
|
182
184
|
return [];
|
|
183
185
|
}
|
|
@@ -253,6 +255,8 @@ export function providerCliPresent(prefix) {
|
|
|
253
255
|
).trim()
|
|
254
256
|
);
|
|
255
257
|
} catch {
|
|
258
|
+
// probe-direction: neutral — PATH presence is reported in the explanation of
|
|
259
|
+
// an already-failing lookup; it gates nothing on its own.
|
|
256
260
|
return false;
|
|
257
261
|
}
|
|
258
262
|
}
|
|
@@ -66,6 +66,9 @@ export function locate(name, exec = boundedChildOutput) {
|
|
|
66
66
|
exec("command", ["-v", name], { encoding: "utf8", shell: true })
|
|
67
67
|
).trim();
|
|
68
68
|
} catch {
|
|
69
|
+
// probe-direction: fail-closed — null means "not proven present", and the
|
|
70
|
+
// setup flow responds by installing. A probe that cannot answer costs a
|
|
71
|
+
// redundant install, never a missing tool reported as present.
|
|
69
72
|
return null;
|
|
70
73
|
}
|
|
71
74
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "4.42.
|
|
3
|
+
"version": "4.42.7",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "4.42.
|
|
3
|
+
"version": "4.42.7",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, across Claude and Codex.",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "4.42.
|
|
3
|
+
"version": "4.42.7",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "4.42.
|
|
3
|
+
"version": "4.42.7",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "lisa-openclaw",
|
|
3
|
-
"version": "4.42.
|
|
3
|
+
"version": "4.42.7",
|
|
4
4
|
"description": "Connect staff roles to Telegram or Slack via OpenClaw — facilitator/specialist hub-and-spoke routing and repo-coding topics, for Claude Code and Codex",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Cody Swann"
|
|
@@ -121,6 +121,10 @@ function git(args, cwd) {
|
|
|
121
121
|
timeout: 30_000,
|
|
122
122
|
});
|
|
123
123
|
} catch {
|
|
124
|
+
// probe-direction: fail-closed — null never reaches a verdict as "no
|
|
125
|
+
// weakening found". `changePlan` turns it into `undeterminable`, which
|
|
126
|
+
// REFUSES, and `isPromotion` falls to the strict reading that keeps the
|
|
127
|
+
// allow list pinned to the baseline.
|
|
124
128
|
return null;
|
|
125
129
|
}
|
|
126
130
|
}
|
|
@@ -166,6 +170,8 @@ function resolvePlan(mode, root, baseRef, onlyFiles) {
|
|
|
166
170
|
try {
|
|
167
171
|
return fs.readFileSync(path.join(root, f), "utf-8");
|
|
168
172
|
} catch {
|
|
173
|
+
// probe-direction: fail-closed — an unreadable current file compares as
|
|
174
|
+
// absent against the baseline, which is the strict side of the ratchet.
|
|
169
175
|
return null;
|
|
170
176
|
}
|
|
171
177
|
},
|