@codyswann/lisa 4.8.1 → 4.8.3
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/all/copy-overwrite/scripts/lisa-gates.mjs +212 -3
- package/all/copy-overwrite/scripts/lisa-reconcile-policy.mjs +11 -0
- package/dist/cli/gate-report-cells.d.ts +1 -1
- package/dist/cli/gate-report-cells.d.ts.map +1 -1
- package/dist/cli/gate-report-cells.js +18 -2
- package/dist/cli/gate-report-cells.js.map +1 -1
- package/dist/cli/gate-report-joins.d.ts.map +1 -1
- package/dist/cli/gate-report-joins.js +36 -4
- package/dist/cli/gate-report-joins.js.map +1 -1
- package/dist/cli/gate-report-registry.d.ts +30 -0
- package/dist/cli/gate-report-registry.d.ts.map +1 -1
- package/dist/cli/gate-report-registry.js +25 -0
- package/dist/cli/gate-report-registry.js.map +1 -1
- package/dist/core/gate-declaration-drift.d.ts +18 -0
- package/dist/core/gate-declaration-drift.d.ts.map +1 -1
- package/dist/core/gate-declaration-drift.js +30 -1
- package/dist/core/gate-declaration-drift.js.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +4 -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 +10 -6
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/migrations/ensure-lighthouse-collect-options.d.ts +3 -1
- package/dist/migrations/ensure-lighthouse-collect-options.d.ts.map +1 -1
- package/dist/migrations/ensure-lighthouse-collect-options.js +12 -4
- package/dist/migrations/ensure-lighthouse-collect-options.js.map +1 -1
- package/dist/migrations/ensure-nightly-e2e-workflow-pins.d.ts +51 -0
- package/dist/migrations/ensure-nightly-e2e-workflow-pins.d.ts.map +1 -0
- package/dist/migrations/ensure-nightly-e2e-workflow-pins.js +122 -0
- package/dist/migrations/ensure-nightly-e2e-workflow-pins.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/create-only/lighthouserc.js +1 -1
- package/package.json +1 -1
- 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-doctor/SKILL.md +41 -0
- package/plugins/lisa/skills/lisa-doctor/SKILL.md +41 -0
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-doctor/SKILL.md +41 -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/skills/lisa-doctor/SKILL.md +41 -0
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/skills/lisa-doctor/SKILL.md +41 -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-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/skills/lisa-doctor/SKILL.md +41 -0
- package/scripts/lisa-github-rulesets.sh +15 -5
- package/scripts/lisa-ruleset-payload.mjs +30 -0
|
@@ -5,8 +5,10 @@ import type { Migration, MigrationContext, MigrationResult } from "./migration.i
|
|
|
5
5
|
* from rewriting a host-diverged configuration.
|
|
6
6
|
*/
|
|
7
7
|
export declare const STALE_COLLECT_BLOCK = " collect: {\n staticDistDir: collect.staticDistDir,\n numberOfRuns: collect.numberOfRuns,\n chromePath: process.env.CHROME_PATH || undefined,\n },";
|
|
8
|
+
/** The collect block first shipped by Lisa 4.6.11. */
|
|
9
|
+
export declare const ENV_FIRST_COLLECT_BLOCK = " collect: {\n ...collect,\n chromePath: process.env.CHROME_PATH || collect.chromePath || undefined,\n },";
|
|
8
10
|
/** The current template block. */
|
|
9
|
-
export declare const CURRENT_COLLECT_BLOCK = " collect: {\n ...collect,\n chromePath: process.env.CHROME_PATH ||
|
|
11
|
+
export declare const CURRENT_COLLECT_BLOCK = " collect: {\n ...collect,\n chromePath: collect.chromePath || process.env.CHROME_PATH || undefined,\n },";
|
|
10
12
|
/**
|
|
11
13
|
* Retrofit the exact create-only Lighthouse configuration Lisa used to seed.
|
|
12
14
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ensure-lighthouse-collect-options.d.ts","sourceRoot":"","sources":["../../src/migrations/ensure-lighthouse-collect-options.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAIlC;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,4KAIzB,CAAC;AAER,kCAAkC;AAClC,eAAO,MAAM,qBAAqB,6HAG3B,CAAC;
|
|
1
|
+
{"version":3,"file":"ensure-lighthouse-collect-options.d.ts","sourceRoot":"","sources":["../../src/migrations/ensure-lighthouse-collect-options.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAIlC;;;;GAIG;AACH,eAAO,MAAM,mBAAmB,4KAIzB,CAAC;AAER,sDAAsD;AACtD,eAAO,MAAM,uBAAuB,6HAG7B,CAAC;AAER,kCAAkC;AAClC,eAAO,MAAM,qBAAqB,6HAG3B,CAAC;AAIR;;;;;;GAMG;AACH,qBAAa,uCAAwC,YAAW,SAAS;IACvE,QAAQ,CAAC,IAAI,uCAAuC;IACpD,QAAQ,CAAC,WAAW,kEAC6C;IAEjE;;;;;OAKG;IACG,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAQtD;;;;;OAKG;IACG,KAAK,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;CAiC7D"}
|
|
@@ -12,11 +12,17 @@ export const STALE_COLLECT_BLOCK = ` collect: {
|
|
|
12
12
|
numberOfRuns: collect.numberOfRuns,
|
|
13
13
|
chromePath: process.env.CHROME_PATH || undefined,
|
|
14
14
|
},`;
|
|
15
|
+
/** The collect block first shipped by Lisa 4.6.11. */
|
|
16
|
+
export const ENV_FIRST_COLLECT_BLOCK = ` collect: {
|
|
17
|
+
...collect,
|
|
18
|
+
chromePath: process.env.CHROME_PATH || collect.chromePath || undefined,
|
|
19
|
+
},`;
|
|
15
20
|
/** The current template block. */
|
|
16
21
|
export const CURRENT_COLLECT_BLOCK = ` collect: {
|
|
17
22
|
...collect,
|
|
18
|
-
chromePath: process.env.CHROME_PATH ||
|
|
23
|
+
chromePath: collect.chromePath || process.env.CHROME_PATH || undefined,
|
|
19
24
|
},`;
|
|
25
|
+
const STALE_BLOCKS = [STALE_COLLECT_BLOCK, ENV_FIRST_COLLECT_BLOCK];
|
|
20
26
|
/**
|
|
21
27
|
* Retrofit the exact create-only Lighthouse configuration Lisa used to seed.
|
|
22
28
|
*
|
|
@@ -39,7 +45,8 @@ export class EnsureLighthouseCollectOptionsMigration {
|
|
|
39
45
|
const file = path.join(ctx.projectDir, CONFIG_FILE);
|
|
40
46
|
if (!(await fse.pathExists(file)))
|
|
41
47
|
return false;
|
|
42
|
-
|
|
48
|
+
const source = await readFile(file, "utf8");
|
|
49
|
+
return STALE_BLOCKS.some(block => source.includes(block));
|
|
43
50
|
}
|
|
44
51
|
/**
|
|
45
52
|
* Replace the stale block while preserving every other host-owned byte.
|
|
@@ -53,7 +60,8 @@ export class EnsureLighthouseCollectOptionsMigration {
|
|
|
53
60
|
return { name: this.name, action: "noop" };
|
|
54
61
|
}
|
|
55
62
|
const before = await readFile(file, "utf8");
|
|
56
|
-
|
|
63
|
+
const staleBlock = STALE_BLOCKS.find(block => before.includes(block));
|
|
64
|
+
if (!staleBlock) {
|
|
57
65
|
return { name: this.name, action: "noop" };
|
|
58
66
|
}
|
|
59
67
|
const message = "Forwarded project-specific Lighthouse static discovery options";
|
|
@@ -66,7 +74,7 @@ export class EnsureLighthouseCollectOptionsMigration {
|
|
|
66
74
|
message,
|
|
67
75
|
};
|
|
68
76
|
}
|
|
69
|
-
await writeFile(file, before.replace(
|
|
77
|
+
await writeFile(file, before.replace(staleBlock, CURRENT_COLLECT_BLOCK));
|
|
70
78
|
ctx.logger.success(message);
|
|
71
79
|
return {
|
|
72
80
|
name: this.name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ensure-lighthouse-collect-options.js","sourceRoot":"","sources":["../../src/migrations/ensure-lighthouse-collect-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAOhC,MAAM,WAAW,GAAG,iBAAiB,CAAC;AAEtC;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;OAI5B,CAAC;AAER,kCAAkC;AAClC,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;OAG9B,CAAC;AAER;;;;;;GAMG;AACH,MAAM,OAAO,uCAAuC;IACzC,IAAI,GAAG,mCAAmC,CAAC;IAC3C,WAAW,GAClB,8DAA8D,CAAC;IAEjE;;;;;OAKG;IACH,KAAK,CAAC,OAAO,CAAC,GAAqB;QACjC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACpD,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAChD,
|
|
1
|
+
{"version":3,"file":"ensure-lighthouse-collect-options.js","sourceRoot":"","sources":["../../src/migrations/ensure-lighthouse-collect-options.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,KAAK,GAAG,MAAM,UAAU,CAAC;AAOhC,MAAM,WAAW,GAAG,iBAAiB,CAAC;AAEtC;;;;GAIG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAG;;;;OAI5B,CAAC;AAER,sDAAsD;AACtD,MAAM,CAAC,MAAM,uBAAuB,GAAG;;;OAGhC,CAAC;AAER,kCAAkC;AAClC,MAAM,CAAC,MAAM,qBAAqB,GAAG;;;OAG9B,CAAC;AAER,MAAM,YAAY,GAAG,CAAC,mBAAmB,EAAE,uBAAuB,CAAU,CAAC;AAE7E;;;;;;GAMG;AACH,MAAM,OAAO,uCAAuC;IACzC,IAAI,GAAG,mCAAmC,CAAC;IAC3C,WAAW,GAClB,8DAA8D,CAAC;IAEjE;;;;;OAKG;IACH,KAAK,CAAC,OAAO,CAAC,GAAqB;QACjC,IAAI,CAAC,GAAG,CAAC,aAAa,CAAC,QAAQ,CAAC,MAAM,CAAC;YAAE,OAAO,KAAK,CAAC;QACtD,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACpD,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC;YAAE,OAAO,KAAK,CAAC;QAChD,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5C,OAAO,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;IAC5D,CAAC;IAED;;;;;OAKG;IACH,KAAK,CAAC,KAAK,CAAC,GAAqB;QAC/B,MAAM,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,UAAU,EAAE,WAAW,CAAC,CAAC;QACpD,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,EAAE,CAAC;YAClC,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC7C,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAC5C,MAAM,UAAU,GAAG,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,EAAE,CAAC,MAAM,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,CAAC;QACtE,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC;QAC7C,CAAC;QAED,MAAM,OAAO,GACX,gEAAgE,CAAC;QACnE,IAAI,GAAG,CAAC,MAAM,EAAE,CAAC;YACf,GAAG,CAAC,MAAM,CAAC,GAAG,CAAC,gBAAgB,WAAW,EAAE,CAAC,CAAC;YAC9C,OAAO;gBACL,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,MAAM,EAAE,SAAS;gBACjB,YAAY,EAAE,CAAC,WAAW,CAAC;gBAC3B,OAAO;aACR,CAAC;QACJ,CAAC;QAED,MAAM,SAAS,CAAC,IAAI,EAAE,MAAM,CAAC,OAAO,CAAC,UAAU,EAAE,qBAAqB,CAAC,CAAC,CAAC;QACzE,GAAG,CAAC,MAAM,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QAC5B,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,MAAM,EAAE,SAAS;YACjB,YAAY,EAAE,CAAC,WAAW,CAAC;YAC3B,OAAO;SACR,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import type { Migration, MigrationContext, MigrationResult } from "./migration.interface.js";
|
|
2
|
+
/** Read the installed Lisa package version. */
|
|
3
|
+
type VersionReader = () => string;
|
|
4
|
+
/** Keep an installed nightly E2E caller on the same immutable Lisa release. */
|
|
5
|
+
export declare class EnsureNightlyE2EWorkflowPinsMigration implements Migration {
|
|
6
|
+
private readonly readLisaVersion;
|
|
7
|
+
readonly name = "ensure-nightly-e2e-workflow-pins";
|
|
8
|
+
readonly description = "Align nightly E2E reusable-workflow pins with installed Lisa";
|
|
9
|
+
/**
|
|
10
|
+
* Create the migration.
|
|
11
|
+
*
|
|
12
|
+
* @param readLisaVersion - Version reader, injectable for deterministic tests
|
|
13
|
+
*/
|
|
14
|
+
constructor(readLisaVersion?: VersionReader);
|
|
15
|
+
/**
|
|
16
|
+
* Decide whether an Expo caller still points at another Lisa release.
|
|
17
|
+
*
|
|
18
|
+
* @param ctx - Migration context
|
|
19
|
+
* @returns True when one supported caller needs a safe literal update
|
|
20
|
+
*/
|
|
21
|
+
applies(ctx: MigrationContext): Promise<boolean>;
|
|
22
|
+
/**
|
|
23
|
+
* Update only Lisa's literal semver caller pins and their matching comment.
|
|
24
|
+
*
|
|
25
|
+
* A host that deliberately uses a branch, SHA, or different workflow path is
|
|
26
|
+
* left untouched because Lisa cannot infer that host's release policy.
|
|
27
|
+
*
|
|
28
|
+
* @param ctx - Migration context
|
|
29
|
+
* @returns Applied or no-op result
|
|
30
|
+
*/
|
|
31
|
+
apply(ctx: MigrationContext): Promise<MigrationResult>;
|
|
32
|
+
/**
|
|
33
|
+
* Read the contract version shipped into the destination project.
|
|
34
|
+
*
|
|
35
|
+
* @param projectDir - Destination project directory
|
|
36
|
+
* @returns Contract version, or null when the guard is absent or diverged
|
|
37
|
+
*/
|
|
38
|
+
private readContractVersion;
|
|
39
|
+
/**
|
|
40
|
+
* Update a supported caller without touching host-selected non-semver refs.
|
|
41
|
+
*
|
|
42
|
+
* @param source - Workflow source
|
|
43
|
+
* @param file - Supported workflow filename
|
|
44
|
+
* @param lisaVersion - Installed Lisa version
|
|
45
|
+
* @param contractVersion - Guard contract version, when available
|
|
46
|
+
* @returns Updated or original workflow source
|
|
47
|
+
*/
|
|
48
|
+
private updateSource;
|
|
49
|
+
}
|
|
50
|
+
export {};
|
|
51
|
+
//# sourceMappingURL=ensure-nightly-e2e-workflow-pins.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure-nightly-e2e-workflow-pins.d.ts","sourceRoot":"","sources":["../../src/migrations/ensure-nightly-e2e-workflow-pins.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,EACV,SAAS,EACT,gBAAgB,EAChB,eAAe,EAChB,MAAM,0BAA0B,CAAC;AAWlC,+CAA+C;AAC/C,KAAK,aAAa,GAAG,MAAM,MAAM,CAAC;AAElC,+EAA+E;AAC/E,qBAAa,qCAAsC,YAAW,SAAS;IAWnE,OAAO,CAAC,QAAQ,CAAC,eAAe;IAVlC,QAAQ,CAAC,IAAI,sCAAsC;IACnD,QAAQ,CAAC,WAAW,kEAC6C;IAEjE;;;;OAIG;gBAEgB,eAAe,GAAE,aAAiC;IAGrE;;;;;OAKG;IACG,OAAO,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,OAAO,CAAC;IAkBtD;;;;;;;;OAQG;IACG,KAAK,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,eAAe,CAAC;IAuC5D;;;;;OAKG;YACW,mBAAmB;IAQjC;;;;;;;;OAQG;IACH,OAAO,CAAC,YAAY;CA6BrB"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import * as path from "node:path";
|
|
3
|
+
import * as fse from "fs-extra";
|
|
4
|
+
import { getPackageVersion } from "../cli/version.js";
|
|
5
|
+
const WORKFLOW_DIR = path.join(".github", "workflows");
|
|
6
|
+
const WORKFLOW_FILES = [
|
|
7
|
+
"nightly-e2e-health.yml",
|
|
8
|
+
"nightly-e2e-report.yml",
|
|
9
|
+
];
|
|
10
|
+
const CONTRACT_SCRIPT = path.join("scripts", "check-nightly-e2e-health.mjs");
|
|
11
|
+
const CONTRACT_PATTERN = /NIGHTLY_E2E_CONTRACT_VERSION\s*=\s*["'](\d+\.\d+\.\d+)["']/;
|
|
12
|
+
/** Keep an installed nightly E2E caller on the same immutable Lisa release. */
|
|
13
|
+
export class EnsureNightlyE2EWorkflowPinsMigration {
|
|
14
|
+
readLisaVersion;
|
|
15
|
+
name = "ensure-nightly-e2e-workflow-pins";
|
|
16
|
+
description = "Align nightly E2E reusable-workflow pins with installed Lisa";
|
|
17
|
+
/**
|
|
18
|
+
* Create the migration.
|
|
19
|
+
*
|
|
20
|
+
* @param readLisaVersion - Version reader, injectable for deterministic tests
|
|
21
|
+
*/
|
|
22
|
+
constructor(readLisaVersion = getPackageVersion) {
|
|
23
|
+
this.readLisaVersion = readLisaVersion;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Decide whether an Expo caller still points at another Lisa release.
|
|
27
|
+
*
|
|
28
|
+
* @param ctx - Migration context
|
|
29
|
+
* @returns True when one supported caller needs a safe literal update
|
|
30
|
+
*/
|
|
31
|
+
async applies(ctx) {
|
|
32
|
+
if (!ctx.detectedTypes.includes("expo"))
|
|
33
|
+
return false;
|
|
34
|
+
const contractVersion = await this.readContractVersion(ctx.projectDir);
|
|
35
|
+
const lisaVersion = this.readLisaVersion();
|
|
36
|
+
for (const file of WORKFLOW_FILES) {
|
|
37
|
+
const absolute = path.join(ctx.projectDir, WORKFLOW_DIR, file);
|
|
38
|
+
if (!(await fse.pathExists(absolute)))
|
|
39
|
+
continue;
|
|
40
|
+
const source = await readFile(absolute, "utf8");
|
|
41
|
+
if (this.updateSource(source, file, lisaVersion, contractVersion) !== source) {
|
|
42
|
+
return true;
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
return false;
|
|
46
|
+
}
|
|
47
|
+
/**
|
|
48
|
+
* Update only Lisa's literal semver caller pins and their matching comment.
|
|
49
|
+
*
|
|
50
|
+
* A host that deliberately uses a branch, SHA, or different workflow path is
|
|
51
|
+
* left untouched because Lisa cannot infer that host's release policy.
|
|
52
|
+
*
|
|
53
|
+
* @param ctx - Migration context
|
|
54
|
+
* @returns Applied or no-op result
|
|
55
|
+
*/
|
|
56
|
+
async apply(ctx) {
|
|
57
|
+
const lisaVersion = this.readLisaVersion();
|
|
58
|
+
const contractVersion = await this.readContractVersion(ctx.projectDir);
|
|
59
|
+
const changedFiles = [];
|
|
60
|
+
const updates = [];
|
|
61
|
+
for (const file of WORKFLOW_FILES) {
|
|
62
|
+
const relative = path.join(WORKFLOW_DIR, file);
|
|
63
|
+
const absolute = path.join(ctx.projectDir, relative);
|
|
64
|
+
if (!(await fse.pathExists(absolute)))
|
|
65
|
+
continue;
|
|
66
|
+
const before = await readFile(absolute, "utf8");
|
|
67
|
+
const after = this.updateSource(before, file, lisaVersion, contractVersion);
|
|
68
|
+
if (after === before)
|
|
69
|
+
continue;
|
|
70
|
+
changedFiles.push(relative);
|
|
71
|
+
updates.push({ absolute, source: after });
|
|
72
|
+
}
|
|
73
|
+
if (changedFiles.length === 0) {
|
|
74
|
+
return { name: this.name, action: "noop" };
|
|
75
|
+
}
|
|
76
|
+
const message = `Aligned nightly E2E callers with Lisa ${lisaVersion}`;
|
|
77
|
+
if (ctx.dryRun) {
|
|
78
|
+
ctx.logger.dry(`Would update ${changedFiles.join(", ")}`);
|
|
79
|
+
return { name: this.name, action: "applied", changedFiles, message };
|
|
80
|
+
}
|
|
81
|
+
for (const update of updates) {
|
|
82
|
+
await writeFile(update.absolute, update.source);
|
|
83
|
+
}
|
|
84
|
+
ctx.logger.success(message);
|
|
85
|
+
return { name: this.name, action: "applied", changedFiles, message };
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Read the contract version shipped into the destination project.
|
|
89
|
+
*
|
|
90
|
+
* @param projectDir - Destination project directory
|
|
91
|
+
* @returns Contract version, or null when the guard is absent or diverged
|
|
92
|
+
*/
|
|
93
|
+
async readContractVersion(projectDir) {
|
|
94
|
+
const file = path.join(projectDir, CONTRACT_SCRIPT);
|
|
95
|
+
if (!(await fse.pathExists(file)))
|
|
96
|
+
return null;
|
|
97
|
+
return CONTRACT_PATTERN.exec(await readFile(file, "utf8"))?.[1] ?? null;
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Update a supported caller without touching host-selected non-semver refs.
|
|
101
|
+
*
|
|
102
|
+
* @param source - Workflow source
|
|
103
|
+
* @param file - Supported workflow filename
|
|
104
|
+
* @param lisaVersion - Installed Lisa version
|
|
105
|
+
* @param contractVersion - Guard contract version, when available
|
|
106
|
+
* @returns Updated or original workflow source
|
|
107
|
+
*/
|
|
108
|
+
updateSource(source, file, lisaVersion, contractVersion) {
|
|
109
|
+
const reusable = file.replace(/\.yml$/, "");
|
|
110
|
+
const pinPattern = new RegExp(`(uses:\\s*CodySwannGT/lisa/\\.github/workflows/${reusable}\\.yml@)v\\d+\\.\\d+\\.\\d+`, "g");
|
|
111
|
+
const pinUpdated = source.replace(pinPattern, `$1v${lisaVersion}`);
|
|
112
|
+
const pinChanged = pinUpdated !== source;
|
|
113
|
+
if (file === "nightly-e2e-health.yml" && pinChanged) {
|
|
114
|
+
const commentUpdated = pinUpdated.replace(/# v\d+\.\d+\.\d+ matches this repo's own installed Lisa/, `# v${lisaVersion} matches this repo's own installed Lisa`);
|
|
115
|
+
return contractVersion
|
|
116
|
+
? commentUpdated.replace(/# the guard reports contract \d+\.\d+\.\d+ and the reusable asserts its MAJOR/, `# the guard reports contract ${contractVersion} and the reusable asserts its MAJOR`)
|
|
117
|
+
: commentUpdated;
|
|
118
|
+
}
|
|
119
|
+
return pinUpdated;
|
|
120
|
+
}
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=ensure-nightly-e2e-workflow-pins.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ensure-nightly-e2e-workflow-pins.js","sourceRoot":"","sources":["../../src/migrations/ensure-nightly-e2e-workflow-pins.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ export { EnsureJestRnMockAccessibilityManagerMigration } from "./ensure-jest-rn-
|
|
|
5
5
|
export { EnsureLearningsGitattributesMigration } from "./ensure-learnings-gitattributes.js";
|
|
6
6
|
export { EnsureLearningsMergeDriverMigration } from "./ensure-learnings-merge-driver.js";
|
|
7
7
|
export { EnsureLighthouseCollectOptionsMigration } from "./ensure-lighthouse-collect-options.js";
|
|
8
|
+
export { EnsureNightlyE2EWorkflowPinsMigration } from "./ensure-nightly-e2e-workflow-pins.js";
|
|
8
9
|
export { EnsureLisaPostinstallMigration } from "./ensure-lisa-postinstall.js";
|
|
9
10
|
export { EnsureOxlintBaseConfigsMigration } from "./ensure-oxlint-base-configs.js";
|
|
10
11
|
export { EnsurePlaywrightDedicatedCallerMigration } from "./ensure-playwright-dedicated-caller.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":"AAiBA,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,uCAAuC,EAAE,MAAM,wCAAwC,CAAC;AACjG,OAAO,EAAE,qCAAqC,EAAE,MAAM,uCAAuC,CAAC;AAC9F,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;IAsB7C;;;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
|
@@ -3,6 +3,7 @@ import { EnsureJestRnMockAccessibilityManagerMigration } from "./ensure-jest-rn-
|
|
|
3
3
|
import { EnsureLearningsGitattributesMigration } from "./ensure-learnings-gitattributes.js";
|
|
4
4
|
import { EnsureLearningsMergeDriverMigration } from "./ensure-learnings-merge-driver.js";
|
|
5
5
|
import { EnsureLighthouseCollectOptionsMigration } from "./ensure-lighthouse-collect-options.js";
|
|
6
|
+
import { EnsureNightlyE2EWorkflowPinsMigration } from "./ensure-nightly-e2e-workflow-pins.js";
|
|
6
7
|
import { EnsureLisaPostinstallMigration } from "./ensure-lisa-postinstall.js";
|
|
7
8
|
import { EnsureOxlintBaseConfigsMigration } from "./ensure-oxlint-base-configs.js";
|
|
8
9
|
import { EnsurePlaywrightDedicatedCallerMigration } from "./ensure-playwright-dedicated-caller.js";
|
|
@@ -19,6 +20,7 @@ export { EnsureJestRnMockAccessibilityManagerMigration } from "./ensure-jest-rn-
|
|
|
19
20
|
export { EnsureLearningsGitattributesMigration } from "./ensure-learnings-gitattributes.js";
|
|
20
21
|
export { EnsureLearningsMergeDriverMigration } from "./ensure-learnings-merge-driver.js";
|
|
21
22
|
export { EnsureLighthouseCollectOptionsMigration } from "./ensure-lighthouse-collect-options.js";
|
|
23
|
+
export { EnsureNightlyE2EWorkflowPinsMigration } from "./ensure-nightly-e2e-workflow-pins.js";
|
|
22
24
|
export { EnsureLisaPostinstallMigration } from "./ensure-lisa-postinstall.js";
|
|
23
25
|
export { EnsureOxlintBaseConfigsMigration } from "./ensure-oxlint-base-configs.js";
|
|
24
26
|
export { EnsurePlaywrightDedicatedCallerMigration } from "./ensure-playwright-dedicated-caller.js";
|
|
@@ -48,6 +50,7 @@ export class MigrationRegistry {
|
|
|
48
50
|
new EnsureLearningsGitattributesMigration(),
|
|
49
51
|
new EnsureLearningsMergeDriverMigration(),
|
|
50
52
|
new EnsureLighthouseCollectOptionsMigration(),
|
|
53
|
+
new EnsureNightlyE2EWorkflowPinsMigration(),
|
|
51
54
|
new EnsureLisaPostinstallMigration(),
|
|
52
55
|
new EnsureOxlintBaseConfigsMigration(),
|
|
53
56
|
new EnsurePlaywrightDedicatedCallerMigration(),
|
|
@@ -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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"}
|
package/package.json
CHANGED
|
@@ -148,7 +148,7 @@
|
|
|
148
148
|
"zod-validation-error": "^4.0.0"
|
|
149
149
|
},
|
|
150
150
|
"name": "@codyswann/lisa",
|
|
151
|
-
"version": "4.8.
|
|
151
|
+
"version": "4.8.3",
|
|
152
152
|
"description": "Claude Code governance framework that applies guardrails, guidance, and automated enforcement to projects",
|
|
153
153
|
"main": "dist/index.js",
|
|
154
154
|
"exports": {
|
|
@@ -569,6 +569,37 @@ additive-only `addRequiredChecks`, which is still read but can never express "st
|
|
|
569
569
|
Both surfaces name the ruleset a repair writes to, so `--ruleset` is needed only for a
|
|
570
570
|
gate-DERIVED context on a repository whose rulesets are ambiguous.
|
|
571
571
|
|
|
572
|
+
**2b. A gate proved OUTSIDE the quality facade names its own check-run chain.** A run-mode gate's
|
|
573
|
+
required context is derived by prefixing the gate's label with the chain of jobs that reach the
|
|
574
|
+
facade. When a project proves one property from a workflow of its own instead, that chain describes
|
|
575
|
+
a route that never reaches the prover, and the derived name is one nothing posts — which does not
|
|
576
|
+
turn a pull request red, it holds it at "Expected — Waiting for status to be reported" for ever.
|
|
577
|
+
Declare the real chain on that moment:
|
|
578
|
+
|
|
579
|
+
```json
|
|
580
|
+
"gates": {
|
|
581
|
+
"e2e-browser": {
|
|
582
|
+
"run": "test:e2e:pr",
|
|
583
|
+
"pull-request": {
|
|
584
|
+
"level": "required",
|
|
585
|
+
"caller_chain": ["🎭 PR Browser Coverage"]
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
Read the chain off a completed run, never off the YAML: a check run's reported name is the
|
|
592
|
+
`/`-joined chain of the JOB names that reach it, outermost first, and the top workflow's own `name:`
|
|
593
|
+
never appears in it. Take it from
|
|
594
|
+
`gh api repos/OWNER/NAME/commits/SHA/check-runs --paginate --slurp`, or let
|
|
595
|
+
`lisa-gates.mjs verify-contexts --posted=<file>` compare a derivation against what actually posted.
|
|
596
|
+
Either spelling works — `["A", "B"]` or `"A / B"` — and the override replaces the caller's chain for
|
|
597
|
+
that gate only; every other gate keeps deriving exactly what it derived before. It is declared per
|
|
598
|
+
MOMENT, because the same job posts a one-level name on the pull-request path and a two-level one on
|
|
599
|
+
the release path. Declaring it on the whole gate, on an `await`ing moment, at a moment that posts no
|
|
600
|
+
status, or with a blank level is refused by `lisa-gates.mjs validate` — at declaration time, which
|
|
601
|
+
is the last point at which any of those can still fail loudly.
|
|
602
|
+
|
|
572
603
|
**3. Keep both names during a rename.** `--previous=<old label>` requires the old and the new
|
|
573
604
|
context simultaneously for one release. Without it the reconciliation reports the still-live old
|
|
574
605
|
context as EXTRA (and `--prune` would delete it) while in-flight pull requests wait on a context
|
|
@@ -588,6 +619,16 @@ That rule construction is itself config-driven now. `all/github-rulesets/base.js
|
|
|
588
619
|
`policy.review.required_approving_review_count`, none of which config could express while the
|
|
589
620
|
template owned them.
|
|
590
621
|
|
|
622
|
+
`policy.review.require_extra_approval_for_unattributed_changes` is declarable for a reason worth
|
|
623
|
+
stating, because its default is not "leave it alone". Measured against the live rulesets API on
|
|
624
|
+
2026-08-25: a `pull_request` rule sent WITHOUT the parameter came back with it `true`; set
|
|
625
|
+
explicitly to `false` it came back `false`; sent again without it, it came back `true`. GitHub
|
|
626
|
+
re-applies its own default on every write that omits the field. So an operator who wants it OFF
|
|
627
|
+
cannot hold it off unless the payload names it, and an operator who wants it ON is recording no
|
|
628
|
+
choice at all — the value is whatever GitHub's default happens to be. Declaring it pins the choice
|
|
629
|
+
and makes it visible to the reconciler; declaring nothing keeps the payload byte-for-byte what it
|
|
630
|
+
was, parameter absent.
|
|
631
|
+
|
|
591
632
|
## Secrets configuration
|
|
592
633
|
|
|
593
634
|
Run the secrets health checks through the skill that owns the contract, rather than reimplementing
|
|
@@ -569,6 +569,37 @@ additive-only `addRequiredChecks`, which is still read but can never express "st
|
|
|
569
569
|
Both surfaces name the ruleset a repair writes to, so `--ruleset` is needed only for a
|
|
570
570
|
gate-DERIVED context on a repository whose rulesets are ambiguous.
|
|
571
571
|
|
|
572
|
+
**2b. A gate proved OUTSIDE the quality facade names its own check-run chain.** A run-mode gate's
|
|
573
|
+
required context is derived by prefixing the gate's label with the chain of jobs that reach the
|
|
574
|
+
facade. When a project proves one property from a workflow of its own instead, that chain describes
|
|
575
|
+
a route that never reaches the prover, and the derived name is one nothing posts — which does not
|
|
576
|
+
turn a pull request red, it holds it at "Expected — Waiting for status to be reported" for ever.
|
|
577
|
+
Declare the real chain on that moment:
|
|
578
|
+
|
|
579
|
+
```json
|
|
580
|
+
"gates": {
|
|
581
|
+
"e2e-browser": {
|
|
582
|
+
"run": "test:e2e:pr",
|
|
583
|
+
"pull-request": {
|
|
584
|
+
"level": "required",
|
|
585
|
+
"caller_chain": ["🎭 PR Browser Coverage"]
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
Read the chain off a completed run, never off the YAML: a check run's reported name is the
|
|
592
|
+
`/`-joined chain of the JOB names that reach it, outermost first, and the top workflow's own `name:`
|
|
593
|
+
never appears in it. Take it from
|
|
594
|
+
`gh api repos/OWNER/NAME/commits/SHA/check-runs --paginate --slurp`, or let
|
|
595
|
+
`lisa-gates.mjs verify-contexts --posted=<file>` compare a derivation against what actually posted.
|
|
596
|
+
Either spelling works — `["A", "B"]` or `"A / B"` — and the override replaces the caller's chain for
|
|
597
|
+
that gate only; every other gate keeps deriving exactly what it derived before. It is declared per
|
|
598
|
+
MOMENT, because the same job posts a one-level name on the pull-request path and a two-level one on
|
|
599
|
+
the release path. Declaring it on the whole gate, on an `await`ing moment, at a moment that posts no
|
|
600
|
+
status, or with a blank level is refused by `lisa-gates.mjs validate` — at declaration time, which
|
|
601
|
+
is the last point at which any of those can still fail loudly.
|
|
602
|
+
|
|
572
603
|
**3. Keep both names during a rename.** `--previous=<old label>` requires the old and the new
|
|
573
604
|
context simultaneously for one release. Without it the reconciliation reports the still-live old
|
|
574
605
|
context as EXTRA (and `--prune` would delete it) while in-flight pull requests wait on a context
|
|
@@ -588,6 +619,16 @@ That rule construction is itself config-driven now. `all/github-rulesets/base.js
|
|
|
588
619
|
`policy.review.required_approving_review_count`, none of which config could express while the
|
|
589
620
|
template owned them.
|
|
590
621
|
|
|
622
|
+
`policy.review.require_extra_approval_for_unattributed_changes` is declarable for a reason worth
|
|
623
|
+
stating, because its default is not "leave it alone". Measured against the live rulesets API on
|
|
624
|
+
2026-08-25: a `pull_request` rule sent WITHOUT the parameter came back with it `true`; set
|
|
625
|
+
explicitly to `false` it came back `false`; sent again without it, it came back `true`. GitHub
|
|
626
|
+
re-applies its own default on every write that omits the field. So an operator who wants it OFF
|
|
627
|
+
cannot hold it off unless the payload names it, and an operator who wants it ON is recording no
|
|
628
|
+
choice at all — the value is whatever GitHub's default happens to be. Declaring it pins the choice
|
|
629
|
+
and makes it visible to the reconciler; declaring nothing keeps the payload byte-for-byte what it
|
|
630
|
+
was, parameter absent.
|
|
631
|
+
|
|
591
632
|
## Secrets configuration
|
|
592
633
|
|
|
593
634
|
Run the secrets health checks through the skill that owns the contract, rather than reimplementing
|
|
@@ -569,6 +569,37 @@ additive-only `addRequiredChecks`, which is still read but can never express "st
|
|
|
569
569
|
Both surfaces name the ruleset a repair writes to, so `--ruleset` is needed only for a
|
|
570
570
|
gate-DERIVED context on a repository whose rulesets are ambiguous.
|
|
571
571
|
|
|
572
|
+
**2b. A gate proved OUTSIDE the quality facade names its own check-run chain.** A run-mode gate's
|
|
573
|
+
required context is derived by prefixing the gate's label with the chain of jobs that reach the
|
|
574
|
+
facade. When a project proves one property from a workflow of its own instead, that chain describes
|
|
575
|
+
a route that never reaches the prover, and the derived name is one nothing posts — which does not
|
|
576
|
+
turn a pull request red, it holds it at "Expected — Waiting for status to be reported" for ever.
|
|
577
|
+
Declare the real chain on that moment:
|
|
578
|
+
|
|
579
|
+
```json
|
|
580
|
+
"gates": {
|
|
581
|
+
"e2e-browser": {
|
|
582
|
+
"run": "test:e2e:pr",
|
|
583
|
+
"pull-request": {
|
|
584
|
+
"level": "required",
|
|
585
|
+
"caller_chain": ["🎭 PR Browser Coverage"]
|
|
586
|
+
}
|
|
587
|
+
}
|
|
588
|
+
}
|
|
589
|
+
```
|
|
590
|
+
|
|
591
|
+
Read the chain off a completed run, never off the YAML: a check run's reported name is the
|
|
592
|
+
`/`-joined chain of the JOB names that reach it, outermost first, and the top workflow's own `name:`
|
|
593
|
+
never appears in it. Take it from
|
|
594
|
+
`gh api repos/OWNER/NAME/commits/SHA/check-runs --paginate --slurp`, or let
|
|
595
|
+
`lisa-gates.mjs verify-contexts --posted=<file>` compare a derivation against what actually posted.
|
|
596
|
+
Either spelling works — `["A", "B"]` or `"A / B"` — and the override replaces the caller's chain for
|
|
597
|
+
that gate only; every other gate keeps deriving exactly what it derived before. It is declared per
|
|
598
|
+
MOMENT, because the same job posts a one-level name on the pull-request path and a two-level one on
|
|
599
|
+
the release path. Declaring it on the whole gate, on an `await`ing moment, at a moment that posts no
|
|
600
|
+
status, or with a blank level is refused by `lisa-gates.mjs validate` — at declaration time, which
|
|
601
|
+
is the last point at which any of those can still fail loudly.
|
|
602
|
+
|
|
572
603
|
**3. Keep both names during a rename.** `--previous=<old label>` requires the old and the new
|
|
573
604
|
context simultaneously for one release. Without it the reconciliation reports the still-live old
|
|
574
605
|
context as EXTRA (and `--prune` would delete it) while in-flight pull requests wait on a context
|
|
@@ -588,6 +619,16 @@ That rule construction is itself config-driven now. `all/github-rulesets/base.js
|
|
|
588
619
|
`policy.review.required_approving_review_count`, none of which config could express while the
|
|
589
620
|
template owned them.
|
|
590
621
|
|
|
622
|
+
`policy.review.require_extra_approval_for_unattributed_changes` is declarable for a reason worth
|
|
623
|
+
stating, because its default is not "leave it alone". Measured against the live rulesets API on
|
|
624
|
+
2026-08-25: a `pull_request` rule sent WITHOUT the parameter came back with it `true`; set
|
|
625
|
+
explicitly to `false` it came back `false`; sent again without it, it came back `true`. GitHub
|
|
626
|
+
re-applies its own default on every write that omits the field. So an operator who wants it OFF
|
|
627
|
+
cannot hold it off unless the payload names it, and an operator who wants it ON is recording no
|
|
628
|
+
choice at all — the value is whatever GitHub's default happens to be. Declaring it pins the choice
|
|
629
|
+
and makes it visible to the reconciler; declaring nothing keeps the payload byte-for-byte what it
|
|
630
|
+
was, parameter absent.
|
|
631
|
+
|
|
591
632
|
## Secrets configuration
|
|
592
633
|
|
|
593
634
|
Run the secrets health checks through the skill that owns the contract, rather than reimplementing
|