@codyswann/lisa 3.56.0 → 3.59.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.
- package/{scripts → all/copy-overwrite/scripts}/check-conflict-markers.mjs +15 -8
- package/all/copy-overwrite/scripts/lib/gate-failure-diagnosis.mjs +92 -5
- package/all/copy-overwrite/scripts/lisa-gates.mjs +1015 -33
- package/all/copy-overwrite/scripts/lisa-reconcile-policy.mjs +4 -4
- package/all/copy-overwrite/scripts/lisa-run-gates.mjs +12 -2
- package/dist/cli/gate-report-upstream.d.ts +33 -4
- package/dist/cli/gate-report-upstream.d.ts.map +1 -1
- package/dist/cli/gate-report-upstream.js +69 -11
- package/dist/cli/gate-report-upstream.js.map +1 -1
- package/dist/cli/gate-report.d.ts.map +1 -1
- package/dist/cli/gate-report.js +2 -10
- package/dist/cli/gate-report.js.map +1 -1
- package/dist/cli/ui-ci-quality-jobs-compute.js +2 -2
- package/dist/cli/ui-ci-quality-jobs-compute.js.map +1 -1
- package/dist/cli/ui-github-repo-expected.js +1 -1
- package/dist/cli/ui-github-repo-expected.js.map +1 -1
- package/dist/configs/vitest/base.d.ts +16 -12
- package/dist/configs/vitest/base.d.ts.map +1 -1
- package/dist/configs/vitest/base.js +51 -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 +4 -2
- package/dist/configs/vitest/cdk.js.map +1 -1
- 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 +4 -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 +4 -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 +4 -2
- package/dist/configs/vitest/phaser.js.map +1 -1
- package/dist/configs/vitest/scratch-global-setup.d.ts +72 -0
- package/dist/configs/vitest/scratch-global-setup.d.ts.map +1 -0
- package/dist/configs/vitest/scratch-global-setup.js +168 -0
- package/dist/configs/vitest/scratch-global-setup.js.map +1 -0
- package/dist/configs/vitest/scratch-setup.d.ts +12 -0
- package/dist/configs/vitest/scratch-setup.d.ts.map +1 -0
- package/dist/configs/vitest/scratch-setup.js +70 -0
- package/dist/configs/vitest/scratch-setup.js.map +1 -0
- package/dist/configs/vitest/scratch.d.ts +192 -0
- package/dist/configs/vitest/scratch.d.ts.map +1 -0
- package/dist/configs/vitest/scratch.js +301 -0
- package/dist/configs/vitest/scratch.js.map +1 -0
- 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 +4 -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 +28 -0
- package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +35 -17
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/migrations/ensure-seeded-gates.d.ts +47 -0
- package/dist/migrations/ensure-seeded-gates.d.ts.map +1 -0
- package/dist/migrations/ensure-seeded-gates.js +139 -0
- package/dist/migrations/ensure-seeded-gates.js.map +1 -0
- package/dist/migrations/index.d.ts +1 -0
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +3 -0
- package/dist/migrations/index.js.map +1 -1
- package/expo/copy-overwrite/scripts/bdd/baseline.mjs +36 -45
- package/expo/copy-overwrite/scripts/bdd/render.mjs +1 -1
- package/expo/copy-overwrite/scripts/check-bdd-coverage.mjs +0 -6
- package/package.json +2 -2
- 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-setup-sonar/SKILL.md +1 -1
- package/plugins/lisa/rules/reference/bdd-e2e-coverage.md +3 -3
- package/plugins/lisa/skills/lisa-setup-sonar/SKILL.md +1 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-setup-sonar/SKILL.md +1 -1
- 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/rules/reference/bdd-e2e-coverage.md +3 -3
- package/plugins/lisa-copilot/skills/lisa-setup-sonar/SKILL.md +1 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/rules/bdd-e2e-coverage-reference.mdc +3 -3
- package/plugins/lisa-cursor/skills/lisa-setup-sonar/SKILL.md +1 -1
- 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-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/rules/reference/bdd-e2e-coverage.md +3 -3
- package/plugins/src/base/skills/lisa-setup-sonar/SKILL.md +1 -1
- package/typescript/copy-contents/.husky/pre-push +21 -0
- package/typescript/copy-overwrite/.prettierignore +1 -0
- package/typescript/copy-overwrite/scripts/check-skipped-required-checks.mjs +13 -6
- package/typescript/create-only/.github/required-checks.json +1 -1
- package/typescript/package-lisa/package.lisa.json +1 -0
- package/ui/index.html +2 -2
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import type { Migration, MigrationContext, MigrationResult } from "./migration.interface.js";
|
|
2
|
+
/**
|
|
3
|
+
* Migration: declare, in `.lisa.config.json`, the gates this project is already
|
|
4
|
+
* proving with a command written into a Lisa-shipped hook or workflow.
|
|
5
|
+
*
|
|
6
|
+
* WHY A MIGRATION AND NOT A TEMPLATE. Nothing seeds a `gates` block into a
|
|
7
|
+
* consumer: exactly one `.lisa.config.json` is tracked anywhere in Lisa, and it
|
|
8
|
+
* is Lisa's own. So the hardcoded path in the pre-push hook and in every gated
|
|
9
|
+
* CI job is not a fallback for the unusual project — it is the DEFAULT for
|
|
10
|
+
* essentially every installed one. A create-only artifact would never reach a
|
|
11
|
+
* repository that already exists, and a version bump alone would deliver
|
|
12
|
+
* nothing, which is why this is a migration that runs on `lisa apply`.
|
|
13
|
+
*
|
|
14
|
+
* WHY IT SEEDS LESS THAN THE REGISTRY. A seeded declaration has to reproduce
|
|
15
|
+
* what the built-in did, or the migration reddens a fleet on a version bump.
|
|
16
|
+
* `seedGates` therefore declares a gate only when the task that reproduces the
|
|
17
|
+
* built-in is a script the project actually has, and only at a moment the
|
|
18
|
+
* registry says the gate may be declared at. Everything it declines stays
|
|
19
|
+
* ungoverned — and stays reported by `lisa-gates.mjs unconfigured`, which the
|
|
20
|
+
* pre-push hook and every gated CI job now print. Visible beats declared-away.
|
|
21
|
+
*
|
|
22
|
+
* Idempotent: an existing declaration always wins, so a second run seeds
|
|
23
|
+
* nothing. Never removes or rewrites a declaration the project made.
|
|
24
|
+
*/
|
|
25
|
+
export declare class EnsureSeededGatesMigration implements Migration {
|
|
26
|
+
readonly name = "ensure-seeded-gates";
|
|
27
|
+
readonly description = "Declare the gates the project already proves with a command written into a Lisa-shipped hook or workflow";
|
|
28
|
+
/**
|
|
29
|
+
* Resolve what seeding would change, or null when there is nothing to do.
|
|
30
|
+
* @param ctx - Migration context
|
|
31
|
+
* @returns The plan, or null
|
|
32
|
+
*/
|
|
33
|
+
private plan;
|
|
34
|
+
/**
|
|
35
|
+
* Applies when at least one ungoverned property has a task that reproduces it.
|
|
36
|
+
* @param ctx - Migration context
|
|
37
|
+
* @returns True when there is work to do
|
|
38
|
+
*/
|
|
39
|
+
applies(ctx: MigrationContext): Promise<boolean>;
|
|
40
|
+
/**
|
|
41
|
+
* Write the seeded declarations into `.lisa.config.json`.
|
|
42
|
+
* @param ctx - Migration context
|
|
43
|
+
* @returns Result describing the action taken
|
|
44
|
+
*/
|
|
45
|
+
apply(ctx: MigrationContext): Promise<MigrationResult>;
|
|
46
|
+
}
|
|
47
|
+
//# sourceMappingURL=ensure-seeded-gates.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure-seeded-gates.d.ts","sourceRoot":"","sources":["../../src/migrations/ensure-seeded-gates.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AA+DlC;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,qBAAa,0BAA2B,YAAW,SAAS;IAC1D,QAAQ,CAAC,IAAI,yBAAyB;IACtC,QAAQ,CAAC,WAAW,8GACyF;IAE7G;;;;OAIG;YACW,IAAI;IAoClB;;;;OAIG;IACG,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAItD;;;;OAIG;IACG,KAAK,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;CAyB7D"}
|
|
@@ -0,0 +1,139 @@
|
|
|
1
|
+
import * as path from "node:path";
|
|
2
|
+
import * as fse from "fs-extra";
|
|
3
|
+
import { importGateRegistry } from "../cli/gate-registry-source.js";
|
|
4
|
+
import { readJsonOrNull, writeJson } from "../utils/json-utils.js";
|
|
5
|
+
const LISA_CONFIG = ".lisa.config.json";
|
|
6
|
+
const PACKAGE_JSON = "package.json";
|
|
7
|
+
/**
|
|
8
|
+
* The task runner a seeded block should record, from the project's lockfile.
|
|
9
|
+
*
|
|
10
|
+
* LOCKFILE ONLY, and deliberately so. This matches the pre-push hook's
|
|
11
|
+
* PRIORITY (bun, then yarn, then npm) but not its `command -v` availability
|
|
12
|
+
* check, because the two answer different questions. The hook decides what to
|
|
13
|
+
* run on THIS machine, now, and re-decides on every machine. `gates.runner` is
|
|
14
|
+
* written into `.lisa.config.json` and committed: one value, resolved once,
|
|
15
|
+
* then read by every contributor and every CI runner.
|
|
16
|
+
*
|
|
17
|
+
* Probing the seeding machine's PATH and freezing the result would let a
|
|
18
|
+
* laptop that happens not to have bun installed record `npm run` for a bun
|
|
19
|
+
* project, permanently and for everyone. The lockfile is the portable fact
|
|
20
|
+
* about which runner the project uses; an absent binary is a local
|
|
21
|
+
* environment gap to fix locally, not a property of the repository.
|
|
22
|
+
* @param projectDir - Destination project directory
|
|
23
|
+
* @returns A runner string for `gates.runner`
|
|
24
|
+
*/
|
|
25
|
+
async function detectRunner(projectDir) {
|
|
26
|
+
const has = async (file) => fse.pathExists(path.join(projectDir, file));
|
|
27
|
+
if ((await has("bun.lockb")) || (await has("bun.lock")))
|
|
28
|
+
return "bun run";
|
|
29
|
+
if (await has("yarn.lock"))
|
|
30
|
+
return "yarn";
|
|
31
|
+
return "npm run";
|
|
32
|
+
}
|
|
33
|
+
/**
|
|
34
|
+
* Migration: declare, in `.lisa.config.json`, the gates this project is already
|
|
35
|
+
* proving with a command written into a Lisa-shipped hook or workflow.
|
|
36
|
+
*
|
|
37
|
+
* WHY A MIGRATION AND NOT A TEMPLATE. Nothing seeds a `gates` block into a
|
|
38
|
+
* consumer: exactly one `.lisa.config.json` is tracked anywhere in Lisa, and it
|
|
39
|
+
* is Lisa's own. So the hardcoded path in the pre-push hook and in every gated
|
|
40
|
+
* CI job is not a fallback for the unusual project — it is the DEFAULT for
|
|
41
|
+
* essentially every installed one. A create-only artifact would never reach a
|
|
42
|
+
* repository that already exists, and a version bump alone would deliver
|
|
43
|
+
* nothing, which is why this is a migration that runs on `lisa apply`.
|
|
44
|
+
*
|
|
45
|
+
* WHY IT SEEDS LESS THAN THE REGISTRY. A seeded declaration has to reproduce
|
|
46
|
+
* what the built-in did, or the migration reddens a fleet on a version bump.
|
|
47
|
+
* `seedGates` therefore declares a gate only when the task that reproduces the
|
|
48
|
+
* built-in is a script the project actually has, and only at a moment the
|
|
49
|
+
* registry says the gate may be declared at. Everything it declines stays
|
|
50
|
+
* ungoverned — and stays reported by `lisa-gates.mjs unconfigured`, which the
|
|
51
|
+
* pre-push hook and every gated CI job now print. Visible beats declared-away.
|
|
52
|
+
*
|
|
53
|
+
* Idempotent: an existing declaration always wins, so a second run seeds
|
|
54
|
+
* nothing. Never removes or rewrites a declaration the project made.
|
|
55
|
+
*/
|
|
56
|
+
export class EnsureSeededGatesMigration {
|
|
57
|
+
name = "ensure-seeded-gates";
|
|
58
|
+
description = "Declare the gates the project already proves with a command written into a Lisa-shipped hook or workflow";
|
|
59
|
+
/**
|
|
60
|
+
* Resolve what seeding would change, or null when there is nothing to do.
|
|
61
|
+
* @param ctx - Migration context
|
|
62
|
+
* @returns The plan, or null
|
|
63
|
+
*/
|
|
64
|
+
async plan(ctx) {
|
|
65
|
+
const configPath = path.join(ctx.projectDir, LISA_CONFIG);
|
|
66
|
+
const config = await readJsonOrNull(configPath);
|
|
67
|
+
// No config file means the project has not been onboarded at all. Creating
|
|
68
|
+
// one here would declare gates for a repository that has not asked Lisa to
|
|
69
|
+
// govern anything, so this stays a migration for projects that already
|
|
70
|
+
// carry the file.
|
|
71
|
+
if (config === null)
|
|
72
|
+
return null;
|
|
73
|
+
const manifest = await readJsonOrNull(path.join(ctx.projectDir, PACKAGE_JSON));
|
|
74
|
+
if (manifest === null)
|
|
75
|
+
return null;
|
|
76
|
+
const registry = await importGateRegistry();
|
|
77
|
+
if (registry === null)
|
|
78
|
+
return null;
|
|
79
|
+
const { runner: declaredRunner, ...gates } = config.gates ?? {};
|
|
80
|
+
const result = registry.seedGates({
|
|
81
|
+
gates: gates,
|
|
82
|
+
scripts: manifest.scripts ?? {},
|
|
83
|
+
runner: typeof declaredRunner === "string"
|
|
84
|
+
? declaredRunner
|
|
85
|
+
: await detectRunner(ctx.projectDir),
|
|
86
|
+
});
|
|
87
|
+
if (result.seeded.length === 0)
|
|
88
|
+
return null;
|
|
89
|
+
return {
|
|
90
|
+
configPath,
|
|
91
|
+
config,
|
|
92
|
+
gates: result.gates,
|
|
93
|
+
seeded: result.seeded.map(entry => ({
|
|
94
|
+
gate: entry.gate,
|
|
95
|
+
moment: entry.moment,
|
|
96
|
+
})),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Applies when at least one ungoverned property has a task that reproduces it.
|
|
101
|
+
* @param ctx - Migration context
|
|
102
|
+
* @returns True when there is work to do
|
|
103
|
+
*/
|
|
104
|
+
async applies(ctx) {
|
|
105
|
+
return (await this.plan(ctx)) !== null;
|
|
106
|
+
}
|
|
107
|
+
/**
|
|
108
|
+
* Write the seeded declarations into `.lisa.config.json`.
|
|
109
|
+
* @param ctx - Migration context
|
|
110
|
+
* @returns Result describing the action taken
|
|
111
|
+
*/
|
|
112
|
+
async apply(ctx) {
|
|
113
|
+
const plan = await this.plan(ctx);
|
|
114
|
+
if (plan === null)
|
|
115
|
+
return { name: this.name, action: "noop" };
|
|
116
|
+
const declared = plan.seeded
|
|
117
|
+
.map(entry => `${entry.gate}@${entry.moment}`)
|
|
118
|
+
.join(", ");
|
|
119
|
+
const message = `Declared ${plan.seeded.length} gate(s) in ${LISA_CONFIG} that were running a command written into a Lisa-shipped hook or workflow: ${declared}`;
|
|
120
|
+
if (ctx.dryRun) {
|
|
121
|
+
ctx.logger.dry(`Would seed ${plan.seeded.length} gate declaration(s)`);
|
|
122
|
+
return {
|
|
123
|
+
name: this.name,
|
|
124
|
+
action: "applied",
|
|
125
|
+
changedFiles: [LISA_CONFIG],
|
|
126
|
+
message,
|
|
127
|
+
};
|
|
128
|
+
}
|
|
129
|
+
await writeJson(plan.configPath, { ...plan.config, gates: plan.gates });
|
|
130
|
+
ctx.logger.success(message);
|
|
131
|
+
return {
|
|
132
|
+
name: this.name,
|
|
133
|
+
action: "applied",
|
|
134
|
+
changedFiles: [LISA_CONFIG],
|
|
135
|
+
message,
|
|
136
|
+
};
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
//# sourceMappingURL=ensure-seeded-gates.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure-seeded-gates.js","sourceRoot":"","sources":["../../src/migrations/ensure-seeded-gates.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,6 +8,7 @@ export { EnsureLisaPostinstallMigration } from "./ensure-lisa-postinstall.js";
|
|
|
8
8
|
export { EnsureOxlintBaseConfigsMigration } from "./ensure-oxlint-base-configs.js";
|
|
9
9
|
export { EnsurePlaywrightDedicatedCallerMigration } from "./ensure-playwright-dedicated-caller.js";
|
|
10
10
|
export { EnsureQualityCallerScopesMigration } from "./ensure-quality-caller-scopes.js";
|
|
11
|
+
export { EnsureSeededGatesMigration } from "./ensure-seeded-gates.js";
|
|
11
12
|
export { EnsureSonarExcludesLisaHarnessMigration } from "./ensure-sonar-excludes-lisa-harness.js";
|
|
12
13
|
export { EnsureTsconfigLocalFilesFallbackMigration } from "./ensure-tsconfig-local-files-fallback.js";
|
|
13
14
|
export { EnsureWikiSourceDeclaredMigration } from "./ensure-wiki-source-declared.js";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAElC,YAAY,EACV,SAAS,EACT,eAAe,EACf,gBAAgB,EAChB,eAAe,GAChB,MAAM,0BAA0B,CAAC;AAClC,OAAO,EAAE,yCAAyC,EAAE,MAAM,2CAA2C,CAAC;AACtG,OAAO,EAAE,6CAA6C,EAAE,MAAM,gDAAgD,CAAC;AAC/G,OAAO,EAAE,qCAAqC,EAAE,MAAM,qCAAqC,CAAC;AAC5F,OAAO,EAAE,mCAAmC,EAAE,MAAM,oCAAoC,CAAC;AACzF,OAAO,EAAE,8BAA8B,EAAE,MAAM,8BAA8B,CAAC;AAC9E,OAAO,EAAE,gCAAgC,EAAE,MAAM,iCAAiC,CAAC;AACnF,OAAO,EAAE,wCAAwC,EAAE,MAAM,yCAAyC,CAAC;AACnG,OAAO,EAAE,kCAAkC,EAAE,MAAM,mCAAmC,CAAC;AACvF,OAAO,EAAE,0BAA0B,EAAE,MAAM,0BAA0B,CAAC;AACtE,OAAO,EAAE,uCAAuC,EAAE,MAAM,yCAAyC,CAAC;AAClG,OAAO,EAAE,yCAAyC,EAAE,MAAM,2CAA2C,CAAC;AACtG,OAAO,EAAE,iCAAiC,EAAE,MAAM,kCAAkC,CAAC;AACrF,OAAO,EAAE,oCAAoC,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,oCAAoC,EAAE,MAAM,qCAAqC,CAAC;AAC3F,OAAO,EAAE,gCAAgC,EAAE,MAAM,gCAAgC,CAAC;AAElF;;GAEG;AACH,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAuB;IAElD;;;OAGG;gBACS,UAAU,CAAC,EAAE,SAAS,SAAS,EAAE;IAoB7C;;;OAGG;IACH,MAAM,IAAI,SAAS,SAAS,EAAE;IAI9B;;;;OAIG;IACG,mBAAmB,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ/D;;;;OAIG;IACG,MAAM,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,SAAS,eAAe,EAAE,CAAC;CAazE;AAED;;;GAGG;AACH,wBAAgB,uBAAuB,IAAI,iBAAiB,CAE3D"}
|
package/dist/migrations/index.js
CHANGED
|
@@ -6,6 +6,7 @@ import { EnsureLisaPostinstallMigration } from "./ensure-lisa-postinstall.js";
|
|
|
6
6
|
import { EnsureOxlintBaseConfigsMigration } from "./ensure-oxlint-base-configs.js";
|
|
7
7
|
import { EnsurePlaywrightDedicatedCallerMigration } from "./ensure-playwright-dedicated-caller.js";
|
|
8
8
|
import { EnsureQualityCallerScopesMigration } from "./ensure-quality-caller-scopes.js";
|
|
9
|
+
import { EnsureSeededGatesMigration } from "./ensure-seeded-gates.js";
|
|
9
10
|
import { EnsureSonarExcludesLisaHarnessMigration } from "./ensure-sonar-excludes-lisa-harness.js";
|
|
10
11
|
import { EnsureTsconfigLocalFilesFallbackMigration } from "./ensure-tsconfig-local-files-fallback.js";
|
|
11
12
|
import { EnsureWikiSourceDeclaredMigration } from "./ensure-wiki-source-declared.js";
|
|
@@ -20,6 +21,7 @@ export { EnsureLisaPostinstallMigration } from "./ensure-lisa-postinstall.js";
|
|
|
20
21
|
export { EnsureOxlintBaseConfigsMigration } from "./ensure-oxlint-base-configs.js";
|
|
21
22
|
export { EnsurePlaywrightDedicatedCallerMigration } from "./ensure-playwright-dedicated-caller.js";
|
|
22
23
|
export { EnsureQualityCallerScopesMigration } from "./ensure-quality-caller-scopes.js";
|
|
24
|
+
export { EnsureSeededGatesMigration } from "./ensure-seeded-gates.js";
|
|
23
25
|
export { EnsureSonarExcludesLisaHarnessMigration } from "./ensure-sonar-excludes-lisa-harness.js";
|
|
24
26
|
export { EnsureTsconfigLocalFilesFallbackMigration } from "./ensure-tsconfig-local-files-fallback.js";
|
|
25
27
|
export { EnsureWikiSourceDeclaredMigration } from "./ensure-wiki-source-declared.js";
|
|
@@ -47,6 +49,7 @@ export class MigrationRegistry {
|
|
|
47
49
|
new EnsureOxlintBaseConfigsMigration(),
|
|
48
50
|
new EnsurePlaywrightDedicatedCallerMigration(),
|
|
49
51
|
new EnsureQualityCallerScopesMigration(),
|
|
52
|
+
new EnsureSeededGatesMigration(),
|
|
50
53
|
new EnsureSonarExcludesLisaHarnessMigration(),
|
|
51
54
|
new EnsureWikiSourceDeclaredMigration(),
|
|
52
55
|
new ReconcileClaudeStackPluginsMigration(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/migrations/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -41,9 +41,6 @@ const defect = (code, message) => ({ code, message });
|
|
|
41
41
|
/** Defect / evidence code, named once. */
|
|
42
42
|
const SCENARIO_DELETED = "scenario-deleted";
|
|
43
43
|
|
|
44
|
-
/** The maintainer-applied PR label that authorizes giving coverage back. */
|
|
45
|
-
export const BASELINE_LABEL = "bdd-floor-baseline";
|
|
46
|
-
|
|
47
44
|
/**
|
|
48
45
|
* Fixed absolute locations git is installed at, tried before anything on PATH.
|
|
49
46
|
*
|
|
@@ -301,15 +298,23 @@ const RETIREMENT_FIELDS = ["reason", "ticket", "approvedBy", "recordedAt"];
|
|
|
301
298
|
|
|
302
299
|
/**
|
|
303
300
|
* Whether a scenario has been retired the way the contract requires: a
|
|
304
|
-
*
|
|
305
|
-
*
|
|
306
|
-
*
|
|
301
|
+
* COMPLETE `retirements` record.
|
|
302
|
+
*
|
|
303
|
+
* This used to also demand a maintainer-applied PR label, on the reasoning that
|
|
304
|
+
* two artifacts one author cannot produce alone is a stronger guarantee than
|
|
305
|
+
* one. The label was dropped because it guarantees the wrong thing: it verifies
|
|
306
|
+
* that a second person clicked, not that the behavior is actually gone, and it
|
|
307
|
+
* stalls the case it was most needed for — an agent retiring coverage for a
|
|
308
|
+
* feature the product genuinely no longer has.
|
|
309
|
+
*
|
|
310
|
+
* The record is the part that carries information. It still owes every field in
|
|
311
|
+
* {@link RETIREMENT_FIELDS}, is still refused when incomplete, and still lands
|
|
312
|
+
* in the diff where it can be read and challenged.
|
|
307
313
|
* @param {object|undefined} record - The retirements entry, if any.
|
|
308
|
-
* @
|
|
309
|
-
* @returns {boolean} True when the retirement is authorized and complete.
|
|
314
|
+
* @returns {boolean} True when the retirement is complete.
|
|
310
315
|
*/
|
|
311
|
-
function isRetired(record
|
|
312
|
-
if (!record
|
|
316
|
+
function isRetired(record) {
|
|
317
|
+
if (!record) return false;
|
|
313
318
|
return RETIREMENT_FIELDS.every(field => Boolean(record[field]));
|
|
314
319
|
}
|
|
315
320
|
|
|
@@ -324,15 +329,10 @@ function isRetired(record, labels) {
|
|
|
324
329
|
* Keys whose scenario disappeared from the contract entirely are left to
|
|
325
330
|
* {@link checkDeletions}, which names that act precisely; reporting both would
|
|
326
331
|
* describe one deletion as two different failures.
|
|
327
|
-
* @param {object} input - Baseline, head contract and scenarios
|
|
332
|
+
* @param {object} input - Baseline, and head contract and scenarios.
|
|
328
333
|
* @returns {object[]} Defects found.
|
|
329
334
|
*/
|
|
330
|
-
export function checkCoverageRegression({
|
|
331
|
-
baseline,
|
|
332
|
-
contract,
|
|
333
|
-
scenarios,
|
|
334
|
-
labels,
|
|
335
|
-
}) {
|
|
335
|
+
export function checkCoverageRegression({ baseline, contract, scenarios }) {
|
|
336
336
|
const before = acceptedKeys(baseline.scenarios, baseline.contract);
|
|
337
337
|
const after = acceptedKeys(scenarios, contract);
|
|
338
338
|
const present = new Set(scenarios.map(scenario => scenario.id));
|
|
@@ -343,42 +343,42 @@ export function checkCoverageRegression({
|
|
|
343
343
|
return [...before]
|
|
344
344
|
.filter(key => !after.has(key) && present.has(partsOf(key).scenario))
|
|
345
345
|
.sort(byCodeUnit)
|
|
346
|
-
.flatMap(key => regressionDefect(key, { retired, waived
|
|
346
|
+
.flatMap(key => regressionDefect(key, { retired, waived }));
|
|
347
347
|
}
|
|
348
348
|
|
|
349
349
|
/**
|
|
350
350
|
* The defect for one obligation whose accepted coverage disappeared, or none
|
|
351
351
|
* when it left the denominator through an authorized route.
|
|
352
352
|
* @param {string} key - The `SCENARIO:platform` key.
|
|
353
|
-
* @param {object} input - Retirement records
|
|
353
|
+
* @param {object} input - Retirement records and waived keys.
|
|
354
354
|
* @returns {object[]} Zero or one defect.
|
|
355
355
|
*/
|
|
356
|
-
function regressionDefect(key, { retired, waived
|
|
356
|
+
function regressionDefect(key, { retired, waived }) {
|
|
357
357
|
const { scenario, platform } = partsOf(key);
|
|
358
|
-
if (isRetired(retired.get(scenario)
|
|
359
|
-
if (waived.has(key)
|
|
358
|
+
if (isRetired(retired.get(scenario))) return [];
|
|
359
|
+
if (waived.has(key)) return [];
|
|
360
360
|
return [
|
|
361
361
|
defect(
|
|
362
362
|
"coverage-regression",
|
|
363
|
-
`${scenario}:${platform} was covered at the base revision and is not covered here. Coverage this repository already accepted cannot be handed back quietly. Restore the mapping, or take one of the two recorded routes out — a retirements record (${RETIREMENT_FIELDS.join(", ")}) for a behavior the product no longer has, or a platformWaivers entry for a runner that cannot decide it
|
|
363
|
+
`${scenario}:${platform} was covered at the base revision and is not covered here. Coverage this repository already accepted cannot be handed back quietly. Restore the mapping, or take one of the two recorded routes out — a retirements record (${RETIREMENT_FIELDS.join(", ")}) for a behavior the product no longer has, or a platformWaivers entry for a runner that cannot decide it. ${routeTaken(key, { retired })}`
|
|
364
364
|
),
|
|
365
365
|
];
|
|
366
366
|
}
|
|
367
367
|
|
|
368
368
|
/**
|
|
369
|
-
* Say
|
|
370
|
-
*
|
|
369
|
+
* Say what is missing from the authorization, so the operator is told what to
|
|
370
|
+
* do rather than only what went wrong.
|
|
371
|
+
*
|
|
372
|
+
* Only reached for a key that took NEITHER route: {@link regressionDefect}
|
|
373
|
+
* returns early for a waived one, so the waiver set cannot inform this
|
|
374
|
+
* sentence and is not passed.
|
|
371
375
|
* @param {string} key - The `SCENARIO:platform` key.
|
|
372
|
-
* @param {object} input - Retirement records
|
|
376
|
+
* @param {object} input - Retirement records.
|
|
373
377
|
* @returns {string} A one-sentence next step.
|
|
374
378
|
*/
|
|
375
|
-
function routeTaken(key, { retired
|
|
379
|
+
function routeTaken(key, { retired }) {
|
|
376
380
|
const { scenario } = partsOf(key);
|
|
377
381
|
const record = retired.get(scenario);
|
|
378
|
-
const authorized = labels.includes(BASELINE_LABEL);
|
|
379
|
-
if ((record || waived.has(key)) && !authorized) {
|
|
380
|
-
return `A record is present but the "${BASELINE_LABEL}" label is not: recording a reduction in the same pull request that makes it is not an authorization.`;
|
|
381
|
-
}
|
|
382
382
|
if (record) {
|
|
383
383
|
const missing = RETIREMENT_FIELDS.filter(field => !record[field]);
|
|
384
384
|
return `Its retirements record is incomplete (no ${missing.join(", no ")}).`;
|
|
@@ -419,10 +419,10 @@ export function checkNewObligations({ baseline, contract, scenarios }) {
|
|
|
419
419
|
* The contract's answer to a retired behavior is `@superseded`, which keeps
|
|
420
420
|
* the audit trail. Deleting the scenario instead makes coverage look better
|
|
421
421
|
* by describing less of the product.
|
|
422
|
-
* @param {object} input - Base IDs
|
|
422
|
+
* @param {object} input - Base IDs and head scenarios.
|
|
423
423
|
* @returns {object[]} Defects found.
|
|
424
424
|
*/
|
|
425
|
-
export function checkDeletions({ baseIds, scenarios, contract
|
|
425
|
+
export function checkDeletions({ baseIds, scenarios, contract }) {
|
|
426
426
|
const present = new Set(scenarios.map(scenario => scenario.id));
|
|
427
427
|
const retired = new Map(
|
|
428
428
|
(contract.retirements ?? []).map(entry => [entry.scenario, entry])
|
|
@@ -430,22 +430,21 @@ export function checkDeletions({ baseIds, scenarios, contract, labels }) {
|
|
|
430
430
|
return [...baseIds]
|
|
431
431
|
.filter(id => !present.has(id))
|
|
432
432
|
.sort(byCodeUnit)
|
|
433
|
-
.flatMap(id => deletionDefects(id, retired.get(id)
|
|
433
|
+
.flatMap(id => deletionDefects(id, retired.get(id)));
|
|
434
434
|
}
|
|
435
435
|
|
|
436
436
|
/**
|
|
437
437
|
* Defects for one deleted scenario.
|
|
438
438
|
* @param {string} id - The scenario ID that disappeared.
|
|
439
439
|
* @param {object|undefined} record - Its retirement record, if any.
|
|
440
|
-
* @param {readonly string[]} labels - PR labels.
|
|
441
440
|
* @returns {object[]} Defects found.
|
|
442
441
|
*/
|
|
443
|
-
function deletionDefects(id, record
|
|
442
|
+
function deletionDefects(id, record) {
|
|
444
443
|
if (!record) {
|
|
445
444
|
return [
|
|
446
445
|
defect(
|
|
447
446
|
SCENARIO_DELETED,
|
|
448
|
-
`${id} was deleted from the contract. Retiring a behavior is @superseded, not deletion — deleting it shrinks the denominator instead of the gap. A genuine removal needs a retirements record
|
|
447
|
+
`${id} was deleted from the contract. Retiring a behavior is @superseded, not deletion — deleting it shrinks the denominator instead of the gap. A genuine removal needs a complete retirements record (${RETIREMENT_FIELDS.join(", ")}).`
|
|
449
448
|
),
|
|
450
449
|
];
|
|
451
450
|
}
|
|
@@ -453,13 +452,5 @@ function deletionDefects(id, record, labels) {
|
|
|
453
452
|
const defects = missing.map(field =>
|
|
454
453
|
defect(SCENARIO_DELETED, `${id}: retirements record has no ${field}`)
|
|
455
454
|
);
|
|
456
|
-
if (!labels.includes(BASELINE_LABEL)) {
|
|
457
|
-
defects.push(
|
|
458
|
-
defect(
|
|
459
|
-
SCENARIO_DELETED,
|
|
460
|
-
`${id}: a retirement needs the maintainer-applied "${BASELINE_LABEL}" label`
|
|
461
|
-
)
|
|
462
|
-
);
|
|
463
|
-
}
|
|
464
455
|
return defects;
|
|
465
456
|
}
|
|
@@ -208,7 +208,7 @@ ${executionSection(report)}
|
|
|
208
208
|
|
|
209
209
|
## Coverage floor
|
|
210
210
|
|
|
211
|
-
The committed floor is an absolute bar — "is this platform below it right now" — and nothing else. It is **not** a ratchet and nobody has to nudge it upward: what protects coverage already earned is a separate, per-obligation check. Coverage accepted at the base revision cannot disappear, and behavior that is new must arrive mapped or waived; either reduction takes a recorded route
|
|
211
|
+
The committed floor is an absolute bar — "is this platform below it right now" — and nothing else. It is **not** a ratchet and nobody has to nudge it upward: what protects coverage already earned is a separate, per-obligation check. Coverage accepted at the base revision cannot disappear, and behavior that is new must arrive mapped or waived; either reduction takes a recorded route — a complete \`retirements\` record or a \`platformWaivers\` entry — which lands in the diff where it can be read and challenged.
|
|
212
212
|
|
|
213
213
|
${floorTable(report)}
|
|
214
214
|
|
|
@@ -312,14 +312,12 @@ function validateAll({
|
|
|
312
312
|
baseline,
|
|
313
313
|
contract,
|
|
314
314
|
scenarios,
|
|
315
|
-
labels: options.labels,
|
|
316
315
|
}),
|
|
317
316
|
...checkNewObligations({ baseline, contract, scenarios }),
|
|
318
317
|
...checkDeletions({
|
|
319
318
|
baseIds: baseline.scenarioIds,
|
|
320
319
|
scenarios,
|
|
321
320
|
contract,
|
|
322
|
-
labels: options.labels,
|
|
323
321
|
}),
|
|
324
322
|
];
|
|
325
323
|
}
|
|
@@ -679,10 +677,6 @@ export function parseArgs(argv, env) {
|
|
|
679
677
|
report: argv.includes("--report"),
|
|
680
678
|
resultFiles,
|
|
681
679
|
baseSha: env.BDD_BASE_SHA || null,
|
|
682
|
-
labels: (env.BDD_PR_LABELS ?? "")
|
|
683
|
-
.split(",")
|
|
684
|
-
.map(item => item.trim())
|
|
685
|
-
.filter(Boolean),
|
|
686
680
|
today: env.BDD_TODAY || new Date().toISOString().slice(0, 10),
|
|
687
681
|
};
|
|
688
682
|
}
|
package/package.json
CHANGED
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
"refresh:upstream-public-commits": "node scripts/generate-upstream-evidence-manifest.mjs --refresh-public-commits",
|
|
47
47
|
"check:rules-pairing": "bash scripts/check-rules-pairing.sh",
|
|
48
48
|
"check:workflow-inputs": "node scripts/detect-stale-workflow-inputs.mjs --project . --project typescript/create-only --project rails/create-only --json",
|
|
49
|
-
"check:conflict-markers": "node scripts/check-conflict-markers.mjs",
|
|
49
|
+
"check:conflict-markers": "node all/copy-overwrite/scripts/check-conflict-markers.mjs",
|
|
50
50
|
"check:template-workflow-refs": "node scripts/check-template-workflow-refs.mjs",
|
|
51
51
|
"check:delivery-deletion-conflicts": "node scripts/check-delivery-deletion-conflicts.mjs",
|
|
52
52
|
"check:duplicate-versions": "node scripts/check-duplicate-versions.mjs",
|
|
@@ -141,7 +141,7 @@
|
|
|
141
141
|
"zod-validation-error": "^4.0.0"
|
|
142
142
|
},
|
|
143
143
|
"name": "@codyswann/lisa",
|
|
144
|
-
"version": "3.
|
|
144
|
+
"version": "3.59.0",
|
|
145
145
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
146
146
|
"main": "dist/index.js",
|
|
147
147
|
"exports": {
|
|
@@ -12,7 +12,7 @@ unattended factories run. It replaces Lisa's former hand-rolled SonarCloud REST
|
|
|
12
12
|
access with the vendor's official token-authed MCP, which is Lisa's single Sonar
|
|
13
13
|
substrate on both developer machines and headless cloud routines.
|
|
14
14
|
|
|
15
|
-
This does **not** touch the CI
|
|
15
|
+
This does **not** touch the CI static-security job in `quality.yml` or its
|
|
16
16
|
`SONAR_TOKEN` secret — that enforcement gate is separate and stays as-is.
|
|
17
17
|
|
|
18
18
|
## Supported agents
|
|
@@ -145,9 +145,9 @@ forces it upward, and lowering it needs no ceremony.
|
|
|
145
145
|
|
|
146
146
|
What stops coverage sliding backwards is checked directly, per obligation, against the base
|
|
147
147
|
revision — **an obligation that was mapped may not stop being mapped, and new behavior arrives
|
|
148
|
-
mapped or waived**. Giving coverage back is legitimate but takes
|
|
149
|
-
|
|
150
|
-
|
|
148
|
+
mapped or waived**. Giving coverage back is legitimate but takes a recorded route: a complete `retirements`
|
|
149
|
+
record (for a behavior the product no longer has) or a `platformWaivers` entry (for a runner
|
|
150
|
+
that cannot decide it). Gaps that predate the change are burndown, never a
|
|
151
151
|
gate failure — which is what lets a brownfield project adopt `enforced` without first backfilling
|
|
152
152
|
its whole history.
|
|
153
153
|
|
|
@@ -12,7 +12,7 @@ unattended factories run. It replaces Lisa's former hand-rolled SonarCloud REST
|
|
|
12
12
|
access with the vendor's official token-authed MCP, which is Lisa's single Sonar
|
|
13
13
|
substrate on both developer machines and headless cloud routines.
|
|
14
14
|
|
|
15
|
-
This does **not** touch the CI
|
|
15
|
+
This does **not** touch the CI static-security job in `quality.yml` or its
|
|
16
16
|
`SONAR_TOKEN` secret — that enforcement gate is separate and stays as-is.
|
|
17
17
|
|
|
18
18
|
## Supported agents
|
|
@@ -12,7 +12,7 @@ unattended factories run. It replaces Lisa's former hand-rolled SonarCloud REST
|
|
|
12
12
|
access with the vendor's official token-authed MCP, which is Lisa's single Sonar
|
|
13
13
|
substrate on both developer machines and headless cloud routines.
|
|
14
14
|
|
|
15
|
-
This does **not** touch the CI
|
|
15
|
+
This does **not** touch the CI static-security job in `quality.yml` or its
|
|
16
16
|
`SONAR_TOKEN` secret — that enforcement gate is separate and stays as-is.
|
|
17
17
|
|
|
18
18
|
## Supported agents
|
|
@@ -145,9 +145,9 @@ forces it upward, and lowering it needs no ceremony.
|
|
|
145
145
|
|
|
146
146
|
What stops coverage sliding backwards is checked directly, per obligation, against the base
|
|
147
147
|
revision — **an obligation that was mapped may not stop being mapped, and new behavior arrives
|
|
148
|
-
mapped or waived**. Giving coverage back is legitimate but takes
|
|
149
|
-
|
|
150
|
-
|
|
148
|
+
mapped or waived**. Giving coverage back is legitimate but takes a recorded route: a complete `retirements`
|
|
149
|
+
record (for a behavior the product no longer has) or a `platformWaivers` entry (for a runner
|
|
150
|
+
that cannot decide it). Gaps that predate the change are burndown, never a
|
|
151
151
|
gate failure — which is what lets a brownfield project adopt `enforced` without first backfilling
|
|
152
152
|
its whole history.
|
|
153
153
|
|
|
@@ -12,7 +12,7 @@ unattended factories run. It replaces Lisa's former hand-rolled SonarCloud REST
|
|
|
12
12
|
access with the vendor's official token-authed MCP, which is Lisa's single Sonar
|
|
13
13
|
substrate on both developer machines and headless cloud routines.
|
|
14
14
|
|
|
15
|
-
This does **not** touch the CI
|
|
15
|
+
This does **not** touch the CI static-security job in `quality.yml` or its
|
|
16
16
|
`SONAR_TOKEN` secret — that enforcement gate is separate and stays as-is.
|
|
17
17
|
|
|
18
18
|
## Supported agents
|