@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.
Files changed (136) hide show
  1. package/{scripts → all/copy-overwrite/scripts}/check-conflict-markers.mjs +15 -8
  2. package/all/copy-overwrite/scripts/lib/gate-failure-diagnosis.mjs +92 -5
  3. package/all/copy-overwrite/scripts/lisa-gates.mjs +1015 -33
  4. package/all/copy-overwrite/scripts/lisa-reconcile-policy.mjs +4 -4
  5. package/all/copy-overwrite/scripts/lisa-run-gates.mjs +12 -2
  6. package/dist/cli/gate-report-upstream.d.ts +33 -4
  7. package/dist/cli/gate-report-upstream.d.ts.map +1 -1
  8. package/dist/cli/gate-report-upstream.js +69 -11
  9. package/dist/cli/gate-report-upstream.js.map +1 -1
  10. package/dist/cli/gate-report.d.ts.map +1 -1
  11. package/dist/cli/gate-report.js +2 -10
  12. package/dist/cli/gate-report.js.map +1 -1
  13. package/dist/cli/ui-ci-quality-jobs-compute.js +2 -2
  14. package/dist/cli/ui-ci-quality-jobs-compute.js.map +1 -1
  15. package/dist/cli/ui-github-repo-expected.js +1 -1
  16. package/dist/cli/ui-github-repo-expected.js.map +1 -1
  17. package/dist/configs/vitest/base.d.ts +16 -12
  18. package/dist/configs/vitest/base.d.ts.map +1 -1
  19. package/dist/configs/vitest/base.js +51 -0
  20. package/dist/configs/vitest/base.js.map +1 -1
  21. package/dist/configs/vitest/cdk.d.ts +2 -2
  22. package/dist/configs/vitest/cdk.d.ts.map +1 -1
  23. package/dist/configs/vitest/cdk.js +4 -2
  24. package/dist/configs/vitest/cdk.js.map +1 -1
  25. package/dist/configs/vitest/harper-fabric.d.ts +2 -2
  26. package/dist/configs/vitest/harper-fabric.d.ts.map +1 -1
  27. package/dist/configs/vitest/harper-fabric.js +4 -2
  28. package/dist/configs/vitest/harper-fabric.js.map +1 -1
  29. package/dist/configs/vitest/nestjs.d.ts +2 -2
  30. package/dist/configs/vitest/nestjs.d.ts.map +1 -1
  31. package/dist/configs/vitest/nestjs.js +4 -2
  32. package/dist/configs/vitest/nestjs.js.map +1 -1
  33. package/dist/configs/vitest/phaser.d.ts +2 -2
  34. package/dist/configs/vitest/phaser.d.ts.map +1 -1
  35. package/dist/configs/vitest/phaser.js +4 -2
  36. package/dist/configs/vitest/phaser.js.map +1 -1
  37. package/dist/configs/vitest/scratch-global-setup.d.ts +72 -0
  38. package/dist/configs/vitest/scratch-global-setup.d.ts.map +1 -0
  39. package/dist/configs/vitest/scratch-global-setup.js +168 -0
  40. package/dist/configs/vitest/scratch-global-setup.js.map +1 -0
  41. package/dist/configs/vitest/scratch-setup.d.ts +12 -0
  42. package/dist/configs/vitest/scratch-setup.d.ts.map +1 -0
  43. package/dist/configs/vitest/scratch-setup.js +70 -0
  44. package/dist/configs/vitest/scratch-setup.js.map +1 -0
  45. package/dist/configs/vitest/scratch.d.ts +192 -0
  46. package/dist/configs/vitest/scratch.d.ts.map +1 -0
  47. package/dist/configs/vitest/scratch.js +301 -0
  48. package/dist/configs/vitest/scratch.js.map +1 -0
  49. package/dist/configs/vitest/typescript.d.ts +2 -2
  50. package/dist/configs/vitest/typescript.d.ts.map +1 -1
  51. package/dist/configs/vitest/typescript.js +4 -2
  52. package/dist/configs/vitest/typescript.js.map +1 -1
  53. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  54. package/dist/core/lisa-owned-hash-ledger.js +28 -0
  55. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  56. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  57. package/dist/core/upstream-evidence-manifest.js +35 -17
  58. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  59. package/dist/migrations/ensure-seeded-gates.d.ts +47 -0
  60. package/dist/migrations/ensure-seeded-gates.d.ts.map +1 -0
  61. package/dist/migrations/ensure-seeded-gates.js +139 -0
  62. package/dist/migrations/ensure-seeded-gates.js.map +1 -0
  63. package/dist/migrations/index.d.ts +1 -0
  64. package/dist/migrations/index.d.ts.map +1 -1
  65. package/dist/migrations/index.js +3 -0
  66. package/dist/migrations/index.js.map +1 -1
  67. package/expo/copy-overwrite/scripts/bdd/baseline.mjs +36 -45
  68. package/expo/copy-overwrite/scripts/bdd/render.mjs +1 -1
  69. package/expo/copy-overwrite/scripts/check-bdd-coverage.mjs +0 -6
  70. package/package.json +2 -2
  71. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  72. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  73. package/plugins/lisa/.codex-plugin/skills/lisa-setup-sonar/SKILL.md +1 -1
  74. package/plugins/lisa/rules/reference/bdd-e2e-coverage.md +3 -3
  75. package/plugins/lisa/skills/lisa-setup-sonar/SKILL.md +1 -1
  76. package/plugins/lisa-agy/plugin.json +1 -1
  77. package/plugins/lisa-agy/skills/lisa-setup-sonar/SKILL.md +1 -1
  78. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  79. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  80. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  81. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  82. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  83. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  84. package/plugins/lisa-copilot/rules/reference/bdd-e2e-coverage.md +3 -3
  85. package/plugins/lisa-copilot/skills/lisa-setup-sonar/SKILL.md +1 -1
  86. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  87. package/plugins/lisa-cursor/rules/bdd-e2e-coverage-reference.mdc +3 -3
  88. package/plugins/lisa-cursor/skills/lisa-setup-sonar/SKILL.md +1 -1
  89. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  90. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  91. package/plugins/lisa-expo-agy/plugin.json +1 -1
  92. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  93. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  94. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  95. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  96. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  97. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  98. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  99. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  100. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  101. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  102. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  103. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  104. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  105. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  106. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  107. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  108. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  109. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  110. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  111. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  112. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  113. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  114. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  115. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  116. package/plugins/lisa-rails-agy/plugin.json +1 -1
  117. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  118. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  119. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  120. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  121. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  122. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  123. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  124. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  125. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  126. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  127. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  128. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  129. package/plugins/src/base/rules/reference/bdd-e2e-coverage.md +3 -3
  130. package/plugins/src/base/skills/lisa-setup-sonar/SKILL.md +1 -1
  131. package/typescript/copy-contents/.husky/pre-push +21 -0
  132. package/typescript/copy-overwrite/.prettierignore +1 -0
  133. package/typescript/copy-overwrite/scripts/check-skipped-required-checks.mjs +13 -6
  134. package/typescript/create-only/.github/required-checks.json +1 -1
  135. package/typescript/package-lisa/package.lisa.json +1 -0
  136. 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":"AAcA,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,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;IAmB7C;;;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"}
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"}
@@ -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
- * complete `retirements` record AND the maintainer-applied label. Either alone
305
- * is not an authorization — that is the whole point of asking for two
306
- * artifacts one author cannot produce by editing one file.
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
- * @param {readonly string[]} labels - PR labels.
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, labels) {
312
- if (!record || !labels.includes(BASELINE_LABEL)) return false;
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, and PR labels.
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, labels }));
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, waived keys, and PR labels.
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, labels }) {
356
+ function regressionDefect(key, { retired, waived }) {
357
357
  const { scenario, platform } = partsOf(key);
358
- if (isRetired(retired.get(scenario), labels)) return [];
359
- if (waived.has(key) && labels.includes(BASELINE_LABEL)) return [];
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 — and get the maintainer-applied "${BASELINE_LABEL}" label on this pull request. ${routeTaken(key, { retired, waived, labels })}`
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 which half of the authorization is missing, so the operator is told what
370
- * to do rather than only what went wrong.
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, waived keys, labels, contract.
376
+ * @param {object} input - Retirement records.
373
377
  * @returns {string} A one-sentence next step.
374
378
  */
375
- function routeTaken(key, { retired, waived, labels }) {
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, head scenarios, and the PR labels.
422
+ * @param {object} input - Base IDs and head scenarios.
423
423
  * @returns {object[]} Defects found.
424
424
  */
425
- export function checkDeletions({ baseIds, scenarios, contract, labels }) {
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), labels));
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, labels) {
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 and the "${BASELINE_LABEL}" label.`
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 (a \`retirements\` record or a \`platformWaivers\` entry) plus the maintainer-applied \`bdd-floor-baseline\` label two artifacts one author cannot produce alone.
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.56.0",
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": {
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "3.56.0",
3
+ "version": "3.59.0",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "3.56.0",
3
+ "version": "3.59.0",
4
4
  "description": "Universal governance: agents, skills, commands, hooks, and rules for all projects.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -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 SonarCloud SAST job in `quality.yml` or its
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 two artifacts one author cannot
149
- produce alone: a recorded route (a `retirements` record or a `platformWaivers` entry) plus the
150
- maintainer-applied `bdd-floor-baseline` label. Gaps that predate the change are burndown, never a
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 SonarCloud SAST job in `quality.yml` or its
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "3.56.0",
3
+ "version": "3.59.0",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -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 SonarCloud SAST job in `quality.yml` or its
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "3.56.0",
3
+ "version": "3.59.0",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "3.56.0",
3
+ "version": "3.59.0",
4
4
  "description": "AWS CDK-specific Lisa plugin.",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "3.56.0",
3
+ "version": "3.59.0",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "3.56.0",
3
+ "version": "3.59.0",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa-cdk",
3
- "version": "3.56.0",
3
+ "version": "3.59.0",
4
4
  "description": "AWS CDK-specific plugin",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "lisa",
3
- "version": "3.56.0",
3
+ "version": "3.59.0",
4
4
  "description": "Universal governance — agents, skills, commands, hooks, and rules for all projects",
5
5
  "author": {
6
6
  "name": "Cody Swann"
@@ -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 two artifacts one author cannot
149
- produce alone: a recorded route (a `retirements` record or a `platformWaivers` entry) plus the
150
- maintainer-applied `bdd-floor-baseline` label. Gaps that predate the change are burndown, never a
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 SonarCloud SAST job in `quality.yml` or its
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