@codyswann/lisa 3.51.7 → 3.53.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/dist/cli/doctor-declared-contexts.d.ts +32 -0
- package/dist/cli/doctor-declared-contexts.d.ts.map +1 -0
- package/dist/cli/doctor-declared-contexts.js +144 -0
- package/dist/cli/doctor-declared-contexts.js.map +1 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +6 -0
- package/dist/cli/doctor.js.map +1 -1
- package/dist/cli/gate-report-drift-section.d.ts +8 -0
- package/dist/cli/gate-report-drift-section.d.ts.map +1 -0
- package/dist/cli/gate-report-drift-section.js +68 -0
- package/dist/cli/gate-report-drift-section.js.map +1 -0
- package/dist/cli/gate-report-fragment.d.ts.map +1 -1
- package/dist/cli/gate-report-fragment.js +4 -0
- package/dist/cli/gate-report-fragment.js.map +1 -1
- package/dist/cli/gate-report-joins.d.ts +45 -0
- package/dist/cli/gate-report-joins.d.ts.map +1 -1
- package/dist/cli/gate-report-joins.js +56 -0
- package/dist/cli/gate-report-joins.js.map +1 -1
- package/dist/cli/gate-report-registry.d.ts +9 -0
- package/dist/cli/gate-report-registry.d.ts.map +1 -1
- package/dist/cli/gate-report-registry.js +15 -0
- package/dist/cli/gate-report-registry.js.map +1 -1
- package/dist/cli/gate-report-style.d.ts +1 -1
- package/dist/cli/gate-report-style.d.ts.map +1 -1
- package/dist/cli/gate-report-style.js +3 -0
- package/dist/cli/gate-report-style.js.map +1 -1
- package/dist/cli/gate-report-templates.d.ts +22 -0
- package/dist/cli/gate-report-templates.d.ts.map +1 -0
- package/dist/cli/gate-report-templates.js +110 -0
- package/dist/cli/gate-report-templates.js.map +1 -0
- package/dist/cli/gate-report-types.d.ts +19 -5
- package/dist/cli/gate-report-types.d.ts.map +1 -1
- package/dist/cli/gate-report-types.js.map +1 -1
- package/dist/cli/gate-report.d.ts +3 -0
- package/dist/cli/gate-report.d.ts.map +1 -1
- package/dist/cli/gate-report.js +26 -2
- package/dist/cli/gate-report.js.map +1 -1
- package/dist/core/gate-declaration-drift.d.ts +190 -0
- package/dist/core/gate-declaration-drift.d.ts.map +1 -0
- package/dist/core/gate-declaration-drift.js +300 -0
- package/dist/core/gate-declaration-drift.js.map +1 -0
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +17 -4
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/health/declared-checks-inspection.d.ts +48 -0
- package/dist/health/declared-checks-inspection.d.ts.map +1 -0
- package/dist/health/declared-checks-inspection.js +154 -0
- package/dist/health/declared-checks-inspection.js.map +1 -0
- package/dist/health/deterministic-inputs.d.ts +40 -0
- package/dist/health/deterministic-inputs.d.ts.map +1 -0
- package/dist/health/deterministic-inputs.js +71 -0
- package/dist/health/deterministic-inputs.js.map +1 -0
- package/dist/health/deterministic.d.ts.map +1 -1
- package/dist/health/deterministic.js +10 -45
- package/dist/health/deterministic.js.map +1 -1
- package/dist/health/ruleset-inspection.d.ts +27 -0
- package/dist/health/ruleset-inspection.d.ts.map +1 -1
- package/dist/health/ruleset-inspection.js +70 -0
- package/dist/health/ruleset-inspection.js.map +1 -1
- package/expo/package-lisa/package.lisa.json +3 -1
- package/nestjs/package-lisa/package.lisa.json +2 -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 +33 -1
- package/plugins/lisa/skills/lisa-doctor/SKILL.md +33 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-agy/skills/lisa-doctor/SKILL.md +33 -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/skills/lisa-doctor/SKILL.md +33 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/skills/lisa-doctor/SKILL.md +33 -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/skills/lisa-doctor/SKILL.md +33 -1
- package/typescript/package-lisa/package.lisa.json +8 -1
|
@@ -0,0 +1,300 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hold the gates declaration against the ruleset that enforces it.
|
|
3
|
+
*
|
|
4
|
+
* Three surfaces answer "what must pass before this merges" — the project's
|
|
5
|
+
* `gates` declarations, the shipped ruleset template, and the live GitHub
|
|
6
|
+
* ruleset — and until this module existed no comparator joined the first to
|
|
7
|
+
* either of the others. `contextsFor()` derived contexts from declarations,
|
|
8
|
+
* `lisa health` compared template against live, and the two halves never met,
|
|
9
|
+
* so a declaration and the protection enforcing it could disagree indefinitely
|
|
10
|
+
* with every check green.
|
|
11
|
+
*
|
|
12
|
+
* Two properties are load-bearing, and both are structural rather than
|
|
13
|
+
* conventional:
|
|
14
|
+
*
|
|
15
|
+
* 1. **`off` and undeclared are different findings.** `off` is a decision that
|
|
16
|
+
* a property is not proved here, so protection requiring it is a live
|
|
17
|
+
* contradiction. Undeclared is silence — the registry still has gates whose
|
|
18
|
+
* jobs run with no declaration at all, so silence must never be read as
|
|
19
|
+
* "not required", and must never justify removing live protection.
|
|
20
|
+
* 2. **Agreement is not proof.** A `matched` verdict means the declaration and
|
|
21
|
+
* the ruleset name the same required context. It says nothing about whether
|
|
22
|
+
* that context proves anything: one required context in this repository
|
|
23
|
+
* ships a skip step printing "This job going green does NOT mean any
|
|
24
|
+
* ast-grep rule has test coverage", and a required review context has gone
|
|
25
|
+
* green carrying "Review skipped". A drift report that could not tell
|
|
26
|
+
* "agreed and proved" from "agreed and unproved" would itself be a control
|
|
27
|
+
* reporting more than it measured, so the word this module uses is
|
|
28
|
+
* `matched` — the two surfaces agree — and never `enforced` or `proved`.
|
|
29
|
+
* 3. **No remedy in this module can say "remove the context".** Third-party
|
|
30
|
+
* contexts are enforced by construction and declared by nobody; a
|
|
31
|
+
* comparator whose vocabulary contained a removal would eventually propose
|
|
32
|
+
* deleting one. The `DriftRemedy` union simply has no such member, so the
|
|
33
|
+
* guarantee holds for every caller rather than for the careful ones.
|
|
34
|
+
* @module core/gate-declaration-drift
|
|
35
|
+
*/
|
|
36
|
+
/** The moment a branch ruleset guards. */
|
|
37
|
+
export const MERGE_MOMENT = "pull-request";
|
|
38
|
+
/** Every verdict, named once so no two mentions can drift apart. */
|
|
39
|
+
const MATCHED = "matched";
|
|
40
|
+
const DECLARED_NOT_ENFORCED = "declared-not-enforced";
|
|
41
|
+
const ENFORCED_DECLARED_OPTIONAL = "enforced-declared-optional";
|
|
42
|
+
const ENFORCED_DECLARED_OFF = "enforced-declared-off";
|
|
43
|
+
const ENFORCED_UNDECLARED = "enforced-undeclared";
|
|
44
|
+
const ENFORCED_NOT_LISA_OWNED = "enforced-not-lisa-owned";
|
|
45
|
+
/** Verdicts where the two surfaces state opposite things. */
|
|
46
|
+
const CONTRADICTIONS = new Set([
|
|
47
|
+
DECLARED_NOT_ENFORCED,
|
|
48
|
+
ENFORCED_DECLARED_OFF,
|
|
49
|
+
]);
|
|
50
|
+
/** Verdicts where one surface is silent rather than contrary. */
|
|
51
|
+
const GAPS = new Set([
|
|
52
|
+
ENFORCED_DECLARED_OPTIONAL,
|
|
53
|
+
ENFORCED_UNDECLARED,
|
|
54
|
+
]);
|
|
55
|
+
/** The remedy each verdict calls for. */
|
|
56
|
+
const REMEDIES = {
|
|
57
|
+
[MATCHED]: "none",
|
|
58
|
+
[DECLARED_NOT_ENFORCED]: "enforce-the-context",
|
|
59
|
+
[ENFORCED_DECLARED_OPTIONAL]: "decide-which-surface-wins",
|
|
60
|
+
[ENFORCED_DECLARED_OFF]: "resolve-the-contradiction",
|
|
61
|
+
[ENFORCED_UNDECLARED]: "declare-the-gate",
|
|
62
|
+
[ENFORCED_NOT_LISA_OWNED]: "none",
|
|
63
|
+
};
|
|
64
|
+
/** Every verdict, so a count of zero is still a stated zero. */
|
|
65
|
+
const VERDICTS = Object.keys(REMEDIES);
|
|
66
|
+
/** How the enforcing surface is named in a sentence. */
|
|
67
|
+
const SURFACE_NAMES = {
|
|
68
|
+
"ruleset-templates": "the shipped ruleset template",
|
|
69
|
+
"live-ruleset": "the live branch-protection ruleset",
|
|
70
|
+
};
|
|
71
|
+
/**
|
|
72
|
+
* Sort strings the same way everywhere, so two runs emit the same bytes.
|
|
73
|
+
* @param values - Caller-owned strings
|
|
74
|
+
* @returns A sorted copy
|
|
75
|
+
*/
|
|
76
|
+
function sorted(values) {
|
|
77
|
+
return [...values].sort((left, right) => left.localeCompare(right));
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* The declaration state one resolved level names.
|
|
81
|
+
*
|
|
82
|
+
* Anything that is not one of the three levels is `not-declared`, because an
|
|
83
|
+
* unknown level is a typo rather than a claim.
|
|
84
|
+
* @param level - The resolved level
|
|
85
|
+
* @returns The declaration state
|
|
86
|
+
*/
|
|
87
|
+
function asDeclaration(level) {
|
|
88
|
+
return level === "required" || level === "optional" || level === "off"
|
|
89
|
+
? level
|
|
90
|
+
: "not-declared";
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Map every context a registry gate can produce to that gate.
|
|
94
|
+
*
|
|
95
|
+
* Built from the whole registry rather than from the declared gates, which is
|
|
96
|
+
* the difference between "protection requires a context whose gate nobody
|
|
97
|
+
* declared" and "protection requires a context Lisa knows nothing about". Those
|
|
98
|
+
* are different findings with different remedies, and a map built only from
|
|
99
|
+
* declarations could not tell them apart.
|
|
100
|
+
* @param options - Inputs
|
|
101
|
+
* @param options.registry - The shipped registry
|
|
102
|
+
* @param options.gates - The project's gates block
|
|
103
|
+
* @param options.workflowName - The workflow whose name prefixes a context
|
|
104
|
+
* @returns Context string to owning gate
|
|
105
|
+
*/
|
|
106
|
+
export function contextOwners(options) {
|
|
107
|
+
const { registry, gates, workflowName } = options;
|
|
108
|
+
const resolved = resolveMergeMoment(registry, gates);
|
|
109
|
+
const family = registry.momentFamily(MERGE_MOMENT);
|
|
110
|
+
const owners = Object.entries(registry.REGISTRY).map(([gateId, definition]) => {
|
|
111
|
+
const hit = resolved.get(gateId);
|
|
112
|
+
return [
|
|
113
|
+
`${workflowName} / ${definition.label}`,
|
|
114
|
+
{
|
|
115
|
+
gateId,
|
|
116
|
+
declaration: asDeclaration(hit?.level),
|
|
117
|
+
legalAtMerge: definition.moments.includes(family),
|
|
118
|
+
},
|
|
119
|
+
];
|
|
120
|
+
});
|
|
121
|
+
const awaited = [...resolved.values()].flatMap(hit => hit.mode === "await" && hit.awaits !== null
|
|
122
|
+
? [
|
|
123
|
+
[
|
|
124
|
+
hit.awaits,
|
|
125
|
+
{
|
|
126
|
+
gateId: hit.id,
|
|
127
|
+
declaration: asDeclaration(hit.level),
|
|
128
|
+
legalAtMerge: registry.REGISTRY[hit.id]?.moments.includes(family) === true,
|
|
129
|
+
},
|
|
130
|
+
],
|
|
131
|
+
]
|
|
132
|
+
: []);
|
|
133
|
+
return new Map([...owners, ...awaited]);
|
|
134
|
+
}
|
|
135
|
+
/**
|
|
136
|
+
* Resolve the merge moment, treating a refusal as "nothing resolved".
|
|
137
|
+
*
|
|
138
|
+
* A refusal is never swallowed by the caller: `readTemplateEnforcement` and the
|
|
139
|
+
* health check both report the declaration problems separately. What must not
|
|
140
|
+
* happen here is a throw that turns a comparison into no comparison at all.
|
|
141
|
+
* @param registry - The shipped registry
|
|
142
|
+
* @param gates - The project's gates block
|
|
143
|
+
* @returns Resolved gates keyed by id
|
|
144
|
+
*/
|
|
145
|
+
function resolveMergeMoment(registry, gates) {
|
|
146
|
+
try {
|
|
147
|
+
return new Map(registry
|
|
148
|
+
.resolveMoment({ gates, moment: MERGE_MOMENT, includeOff: true })
|
|
149
|
+
.map(entry => [entry.id, { ...entry }]));
|
|
150
|
+
}
|
|
151
|
+
catch {
|
|
152
|
+
return new Map();
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
/**
|
|
156
|
+
* The contexts a `required` declaration promises protection will require.
|
|
157
|
+
* @param owners - Context to owning gate
|
|
158
|
+
* @returns The contexts, sorted
|
|
159
|
+
*/
|
|
160
|
+
export function declaredRequiredContexts(owners) {
|
|
161
|
+
return sorted([...owners.entries()]
|
|
162
|
+
.filter(([, owner]) => owner.declaration === "required")
|
|
163
|
+
.map(([context]) => context));
|
|
164
|
+
}
|
|
165
|
+
/**
|
|
166
|
+
* The verdict for one enforced context.
|
|
167
|
+
* @param owner - The gate producing it, when one does
|
|
168
|
+
* @returns The verdict
|
|
169
|
+
*/
|
|
170
|
+
function verdictForEnforced(owner) {
|
|
171
|
+
if (owner === undefined)
|
|
172
|
+
return ENFORCED_NOT_LISA_OWNED;
|
|
173
|
+
if (owner.declaration === "required")
|
|
174
|
+
return MATCHED;
|
|
175
|
+
if (owner.declaration === "optional")
|
|
176
|
+
return ENFORCED_DECLARED_OPTIONAL;
|
|
177
|
+
if (owner.declaration === "off")
|
|
178
|
+
return ENFORCED_DECLARED_OFF;
|
|
179
|
+
return ENFORCED_UNDECLARED;
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* The sentence one verdict is explained with.
|
|
183
|
+
* @param options - Inputs
|
|
184
|
+
* @param options.verdict - The verdict
|
|
185
|
+
* @param options.surface - The enforcing surface
|
|
186
|
+
* @param options.gateId - The owning gate, when there is one
|
|
187
|
+
* @param options.sources - Where the requirement was read from
|
|
188
|
+
* @returns One operator-readable sentence
|
|
189
|
+
*/
|
|
190
|
+
// eslint-disable-next-line sonarjs/cognitive-complexity -- one branch per verdict keeps the wording auditable
|
|
191
|
+
function detailFor(options) {
|
|
192
|
+
const { verdict, gateId, sources } = options;
|
|
193
|
+
const surface = SURFACE_NAMES[options.surface];
|
|
194
|
+
const where = sources.length === 0 ? "" : ` (${sources.join(", ")})`;
|
|
195
|
+
if (verdict === MATCHED) {
|
|
196
|
+
return `Declared required, and ${surface} requires it${where}. The two surfaces agree; that is not evidence the check proves its property.`;
|
|
197
|
+
}
|
|
198
|
+
if (verdict === DECLARED_NOT_ENFORCED) {
|
|
199
|
+
return `The settings file declares "${String(gateId)}" required at ${MERGE_MOMENT}, but ${surface} does not require this context, so the declaration blocks nothing.`;
|
|
200
|
+
}
|
|
201
|
+
if (verdict === ENFORCED_DECLARED_OPTIONAL) {
|
|
202
|
+
return `${surface} requires this context${where}, while the settings file declares "${String(gateId)}" optional at ${MERGE_MOMENT}. Two surfaces, two answers — name which one wins.`;
|
|
203
|
+
}
|
|
204
|
+
if (verdict === ENFORCED_DECLARED_OFF) {
|
|
205
|
+
return `The settings file declares "${String(gateId)}" off at ${MERGE_MOMENT} — an explicit decision not to prove it here — yet ${surface} requires this context${where}. That is a contradiction, not a gap.`;
|
|
206
|
+
}
|
|
207
|
+
if (verdict === ENFORCED_UNDECLARED) {
|
|
208
|
+
return `${surface} requires this context${where}, and it is produced by the gate "${String(gateId)}", which the settings file never declares at any moment. Undeclared is silence, not permission to stop requiring it.`;
|
|
209
|
+
}
|
|
210
|
+
return `${surface} requires this context${where}, and no gate in Lisa's registry produces it — it comes from a third-party app or from a job this project's own CI defines. Matching is on the exact context string, never on a job name that merely resembles it: a third-party app status and a Lisa job with a similar name are different things, and treating them as one produces a false drift report, or worse a false clean one. Reported so it can be told apart from a Lisa gate that fell out of the settings file, never so it can be removed.`;
|
|
211
|
+
}
|
|
212
|
+
/**
|
|
213
|
+
* Group enforced contexts, keeping every ruleset and source that named one.
|
|
214
|
+
* @param enforced - Enforced contexts, possibly repeating a context
|
|
215
|
+
* @returns Context to its rulesets and sources
|
|
216
|
+
*/
|
|
217
|
+
function groupEnforced(enforced) {
|
|
218
|
+
return enforced.reduce((grouped, entry) => {
|
|
219
|
+
const existing = grouped.get(entry.context) ?? {
|
|
220
|
+
rulesets: [],
|
|
221
|
+
sources: [],
|
|
222
|
+
};
|
|
223
|
+
return new Map(grouped).set(entry.context, {
|
|
224
|
+
rulesets: [...existing.rulesets, entry.ruleset],
|
|
225
|
+
sources: [...existing.sources, entry.source],
|
|
226
|
+
});
|
|
227
|
+
}, new Map());
|
|
228
|
+
}
|
|
229
|
+
/**
|
|
230
|
+
* Compare a project's declarations with one enforcing surface.
|
|
231
|
+
*
|
|
232
|
+
* Total and pure — the same inputs always produce the same entries in the same
|
|
233
|
+
* order. Reaching the surface is the caller's job, and a caller that could not
|
|
234
|
+
* reach it must report an unknown rather than call this with an empty list: a
|
|
235
|
+
* comparison against nothing would report every declaration as unenforced,
|
|
236
|
+
* which is a different and false claim.
|
|
237
|
+
* @param options - Inputs
|
|
238
|
+
* @param options.surface - Which surface `enforced` was read from
|
|
239
|
+
* @param options.owners - Context to owning gate
|
|
240
|
+
* @param options.enforced - Contexts the surface requires
|
|
241
|
+
* @returns The comparison
|
|
242
|
+
*/
|
|
243
|
+
export function classifyDeclarationDrift(options) {
|
|
244
|
+
const { surface, owners, enforced } = options;
|
|
245
|
+
const grouped = groupEnforced(enforced);
|
|
246
|
+
const enforcedEntries = sorted(grouped.keys()).map((context) => {
|
|
247
|
+
const owner = owners.get(context);
|
|
248
|
+
const verdict = verdictForEnforced(owner);
|
|
249
|
+
const found = grouped.get(context);
|
|
250
|
+
const sources = sorted(new Set(found?.sources ?? []));
|
|
251
|
+
return {
|
|
252
|
+
context,
|
|
253
|
+
verdict,
|
|
254
|
+
remedy: REMEDIES[verdict],
|
|
255
|
+
gateId: owner?.gateId ?? null,
|
|
256
|
+
declaration: owner?.declaration ?? null,
|
|
257
|
+
rulesets: sorted(new Set(found?.rulesets ?? [])),
|
|
258
|
+
sources,
|
|
259
|
+
detail: detailFor({
|
|
260
|
+
verdict,
|
|
261
|
+
surface,
|
|
262
|
+
gateId: owner?.gateId ?? null,
|
|
263
|
+
sources,
|
|
264
|
+
}),
|
|
265
|
+
};
|
|
266
|
+
});
|
|
267
|
+
const unenforced = declaredRequiredContexts(owners)
|
|
268
|
+
.filter(context => !grouped.has(context))
|
|
269
|
+
.map((context) => {
|
|
270
|
+
const gateId = owners.get(context)?.gateId ?? null;
|
|
271
|
+
return {
|
|
272
|
+
context,
|
|
273
|
+
verdict: DECLARED_NOT_ENFORCED,
|
|
274
|
+
remedy: REMEDIES[DECLARED_NOT_ENFORCED],
|
|
275
|
+
gateId,
|
|
276
|
+
declaration: "required",
|
|
277
|
+
rulesets: [],
|
|
278
|
+
sources: [],
|
|
279
|
+
detail: detailFor({
|
|
280
|
+
verdict: DECLARED_NOT_ENFORCED,
|
|
281
|
+
surface,
|
|
282
|
+
gateId,
|
|
283
|
+
sources: [],
|
|
284
|
+
}),
|
|
285
|
+
};
|
|
286
|
+
});
|
|
287
|
+
const entries = [...enforcedEntries, ...unenforced].sort((left, right) => left.context.localeCompare(right.context));
|
|
288
|
+
return {
|
|
289
|
+
surface,
|
|
290
|
+
entries,
|
|
291
|
+
counts: Object.fromEntries(VERDICTS.map(verdict => [
|
|
292
|
+
verdict,
|
|
293
|
+
entries.filter(entry => entry.verdict === verdict).length,
|
|
294
|
+
])),
|
|
295
|
+
contradictions: entries.filter(entry => CONTRADICTIONS.has(entry.verdict))
|
|
296
|
+
.length,
|
|
297
|
+
gaps: entries.filter(entry => GAPS.has(entry.verdict)).length,
|
|
298
|
+
};
|
|
299
|
+
}
|
|
300
|
+
//# sourceMappingURL=gate-declaration-drift.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"gate-declaration-drift.js","sourceRoot":"","sources":["../../src/core/gate-declaration-drift.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"upstream-evidence-manifest.d.ts","sourceRoot":"","sources":["../../src/core/upstream-evidence-manifest.ts"],"names":[],"mappings":"AACA,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAg3EpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,
|
|
1
|
+
{"version":3,"file":"upstream-evidence-manifest.d.ts","sourceRoot":"","sources":["../../src/core/upstream-evidence-manifest.ts"],"names":[],"mappings":"AACA,iFAAiF;AACjF,eAAO,MAAM,0BAA0B,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAg3EpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CA65OjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}
|
|
@@ -145,7 +145,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
145
145
|
"expo/github-rulesets/nightly-e2e-health.json": "af9556f52bbb04d303f557eb178d876d82348d15a991729b8a96fb1f06d5b03a",
|
|
146
146
|
"expo/merge/.claude/settings.json": "e97b33d7ad86b71abba94ab957d725e34c3cafca455e92fba0b29ebabc3b73d1",
|
|
147
147
|
"expo/merge/.oxlintrc.json": "95b3069256c0040be0ef1a5adae46d14687ad56fb18f473a653ba2de45d106bb",
|
|
148
|
-
"expo/package-lisa/package.lisa.json": "
|
|
148
|
+
"expo/package-lisa/package.lisa.json": "fe9b22bc59d9e95680f37f102dc353c4badb8266c31a765deab84e9b48ec437d",
|
|
149
149
|
"harper-fabric/copy-contents/.prettierignore": "478c782f4c5611187e21584dfd5522e37fc636c5eb03394fea3db45321c6712c",
|
|
150
150
|
"harper-fabric/copy-contents/gitignore": "d091c40fd0ea3068491f1be0d6510090ae872ca95d0d058ef4595d6492d13897",
|
|
151
151
|
"harper-fabric/copy-overwrite/.github/workflows/ci.yml": "1fef0b72f890869e656dbe3b9463c83725ea8ca8e24e50b58d93c68502603fd0",
|
|
@@ -209,7 +209,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
209
209
|
"nestjs/deletions.json": "037a64f96b76670326bc61921f4484e864e02c09786adabbd1cfdf886183cad5",
|
|
210
210
|
"nestjs/merge/.claude/settings.json": "d0ce50361a1f3868d15728646e66b9e1cdb8373688eb22459adbdb176e342aca",
|
|
211
211
|
"nestjs/merge/.oxlintrc.json": "1de29d135744df0258e8659ee0b684acf84e687bbefade51db0576813e6ff097",
|
|
212
|
-
"nestjs/package-lisa/package.lisa.json": "
|
|
212
|
+
"nestjs/package-lisa/package.lisa.json": "0988afbca21b2bbdfa2bd5ef9623e6b560cfdf0a5c18bf75385d4d21d7725441",
|
|
213
213
|
"npm-package/create-only/.github/workflows/publish-to-npm.yml": "1d051007a328ba4f6c67a5e3123593921b823e0866c05343c4588a6156e9f593",
|
|
214
214
|
"npm-package/package-lisa/package.lisa.json": "4a17f67b6ac09e239f4afb3cf71ecd42e1b6890164008aa8e654f3110b1d65fd",
|
|
215
215
|
"oxlint/base.json": "8cbc563bdfbbaf455742cef24d33676f45b55baf1ea62b529018b2d112d70f8a",
|
|
@@ -521,7 +521,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
521
521
|
"plugins/src/base/skills/lisa-detect-tooling/SKILL.md": "6ea2b1404d5c27f8a5bec8c90ad35ed0124789b70c091869455f538a2a9debbe",
|
|
522
522
|
"plugins/src/base/skills/lisa-detect-tooling/scripts/commands.mjs": "e28bd61fdde4a336b56ae3395423026943a5816015719d31d04f0d5a0ab50eec",
|
|
523
523
|
"plugins/src/base/skills/lisa-detect-tooling/scripts/detect-tooling.mjs": "d9419814fc04c935bd7e320e85b1977c9bfc9275d9ea5fb557002ad438ee7925",
|
|
524
|
-
"plugins/src/base/skills/lisa-doctor/SKILL.md": "
|
|
524
|
+
"plugins/src/base/skills/lisa-doctor/SKILL.md": "83fd779c341108729a926bc2680d54f0b69044137840b1d80d660243a7f74ba5",
|
|
525
525
|
"plugins/src/base/skills/lisa-drive-pr-to-merge/SKILL.md": "e27849a2567081bce5ea3aa31f7cc5868f884a59c343c685b900ac7aa707666a",
|
|
526
526
|
"plugins/src/base/skills/lisa-epic-triage/SKILL.md": "d02760411249bddbd396f283191fe3e82bb7b95bf9393a19a7025dc5a57c3ab7",
|
|
527
527
|
"plugins/src/base/skills/lisa-evaluation-suite/SKILL.md": "96b5c2091ccd22a565935a7b0b917f67998881b81055ce3e4d518319472eac8b",
|
|
@@ -1205,7 +1205,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
1205
1205
|
"typescript/github-rulesets/quality-checks.json": "bcc64e1d21bb7c1466c58b1726788ce33a22229c5be363bb39fa5ce60209af39",
|
|
1206
1206
|
"typescript/merge/.claude/settings.json": "834e6456cae81f45073bbbb08bf731fef043efb30cae2658cb4a59f17e66d165",
|
|
1207
1207
|
"typescript/merge/.oxlintrc.json": "9504c20db80470c242c4ffe8cccad6951ed8141dfb5bf6503053e0b2712ab276",
|
|
1208
|
-
"typescript/package-lisa/package.lisa.json": "
|
|
1208
|
+
"typescript/package-lisa/package.lisa.json": "705debefdf6f88877e796436619509104c1368e376852ddb1eb451b0e63e5248",
|
|
1209
1209
|
"ui/README.md": "ee05dac69cbba5f74a4ff945e78afdd54bd62d26087a255799dbbfc943f52b45",
|
|
1210
1210
|
"ui/index.html": "259e62a02f99c7957cb5f83cc9f5678971df8c6c37495566f88b919ccddc1ade",
|
|
1211
1211
|
});
|
|
@@ -7110,6 +7110,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7110
7110
|
"src/cli/cross-pollinate-nudge.ts": true,
|
|
7111
7111
|
"src/cli/doctor-apply-failure.ts": true,
|
|
7112
7112
|
"src/cli/doctor-apply-freshness.ts": true,
|
|
7113
|
+
"src/cli/doctor-declared-contexts.ts": true,
|
|
7113
7114
|
"src/cli/doctor-gate-recommendation.ts": true,
|
|
7114
7115
|
"src/cli/doctor-hook-copy-parity.ts": true,
|
|
7115
7116
|
"src/cli/doctor-kane.ts": true,
|
|
@@ -7174,6 +7175,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7174
7175
|
"src/cli/gate-report-cells.ts": true,
|
|
7175
7176
|
"src/cli/gate-report-config.ts": true,
|
|
7176
7177
|
"src/cli/gate-report-contexts.ts": true,
|
|
7178
|
+
"src/cli/gate-report-drift-section.ts": true,
|
|
7177
7179
|
"src/cli/gate-report-executors.ts": true,
|
|
7178
7180
|
"src/cli/gate-report-facade.ts": true,
|
|
7179
7181
|
"src/cli/gate-report-fragment.ts": true,
|
|
@@ -7188,6 +7190,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7188
7190
|
"src/cli/gate-report-skip-jobs.ts": true,
|
|
7189
7191
|
"src/cli/gate-report-style.ts": true,
|
|
7190
7192
|
"src/cli/gate-report-summary.ts": true,
|
|
7193
|
+
"src/cli/gate-report-templates.ts": true,
|
|
7191
7194
|
"src/cli/gate-report-types.ts": true,
|
|
7192
7195
|
"src/cli/gate-report-upstream.ts": true,
|
|
7193
7196
|
"src/cli/gate-report.ts": true,
|
|
@@ -7300,6 +7303,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7300
7303
|
"src/core/config.ts": true,
|
|
7301
7304
|
"src/core/downstream-names.ts": true,
|
|
7302
7305
|
"src/core/downstream-references.ts": true,
|
|
7306
|
+
"src/core/gate-declaration-drift.ts": true,
|
|
7303
7307
|
"src/core/git-service.ts": true,
|
|
7304
7308
|
"src/core/guard-capabilities.ts": true,
|
|
7305
7309
|
"src/core/hook-copy-parity.ts": true,
|
|
@@ -7361,6 +7365,8 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7361
7365
|
"src/health/consumer.ts": true,
|
|
7362
7366
|
"src/health/contract.ts": true,
|
|
7363
7367
|
"src/health/deadline.ts": true,
|
|
7368
|
+
"src/health/declared-checks-inspection.ts": true,
|
|
7369
|
+
"src/health/deterministic-inputs.ts": true,
|
|
7364
7370
|
"src/health/deterministic.ts": true,
|
|
7365
7371
|
"src/health/drift-tickets.ts": true,
|
|
7366
7372
|
"src/health/evaluation-protocol.ts": true,
|
|
@@ -7573,6 +7579,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7573
7579
|
"tests/helpers/safety-net-guard-fixtures.ts": true,
|
|
7574
7580
|
"tests/helpers/safety-net-guard-harness.ts": true,
|
|
7575
7581
|
"tests/helpers/safety-net-subst-fixtures.ts": true,
|
|
7582
|
+
"tests/helpers/template-toolchain.ts": true,
|
|
7576
7583
|
"tests/helpers/test-utils.ts": true,
|
|
7577
7584
|
"tests/helpers/verification-gate-fixtures.ts": true,
|
|
7578
7585
|
"tests/helpers/verification-gate-harness.ts": true,
|
|
@@ -7659,6 +7666,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7659
7666
|
"tests/unit/cli/check-learnings-budget-cmd.test.ts": true,
|
|
7660
7667
|
"tests/unit/cli/doctor-apply-failure.test.ts": true,
|
|
7661
7668
|
"tests/unit/cli/doctor-apply-freshness.test.ts": true,
|
|
7669
|
+
"tests/unit/cli/doctor-declared-contexts.test.ts": true,
|
|
7662
7670
|
"tests/unit/cli/doctor-gate-recommendation.test.ts": true,
|
|
7663
7671
|
"tests/unit/cli/doctor-hook-copy-parity.test.ts": true,
|
|
7664
7672
|
"tests/unit/cli/doctor-kane.test.ts": true,
|
|
@@ -7714,8 +7722,10 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7714
7722
|
"tests/unit/cli/file-upstream-contract.test.ts": true,
|
|
7715
7723
|
"tests/unit/cli/gate-commands.test.ts": true,
|
|
7716
7724
|
"tests/unit/cli/gate-report-attribution.test.ts": true,
|
|
7725
|
+
"tests/unit/cli/gate-report-declaration-drift.test.ts": true,
|
|
7717
7726
|
"tests/unit/cli/gate-report-executors.test.ts": true,
|
|
7718
7727
|
"tests/unit/cli/gate-report-fixtures.ts": true,
|
|
7728
|
+
"tests/unit/cli/gate-report-preview-escaping.test.ts": true,
|
|
7719
7729
|
"tests/unit/cli/gate-report-preview.test.ts": true,
|
|
7720
7730
|
"tests/unit/cli/gate-report-ruleset.test.ts": true,
|
|
7721
7731
|
"tests/unit/cli/gate-report-states.test.ts": true,
|
|
@@ -7840,6 +7850,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7840
7850
|
"tests/unit/config/rails-template.test.ts": true,
|
|
7841
7851
|
"tests/unit/config/release-push-retry.test.ts": true,
|
|
7842
7852
|
"tests/unit/config/security-pin-floors.test.ts": true,
|
|
7853
|
+
"tests/unit/config/template-script-toolchain.test.ts": true,
|
|
7843
7854
|
"tests/unit/config/tsconfig-no-unused-flags.test.ts": true,
|
|
7844
7855
|
"tests/unit/config/tsconfig-template-references.test.ts": true,
|
|
7845
7856
|
"tests/unit/config/vitest-base.test.ts": true,
|
|
@@ -7854,6 +7865,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7854
7865
|
"tests/unit/core/bootstrap-environment.test.ts": true,
|
|
7855
7866
|
"tests/unit/core/fs-extra-namespace-callsites.test.ts": true,
|
|
7856
7867
|
"tests/unit/core/fs-extra-namespace-members.test.ts": true,
|
|
7868
|
+
"tests/unit/core/gate-declaration-drift.test.ts": true,
|
|
7857
7869
|
"tests/unit/core/hook-copy-parity.test.ts": true,
|
|
7858
7870
|
"tests/unit/core/host-rules-parity.test.ts": true,
|
|
7859
7871
|
"tests/unit/core/host-rules-pointer.test.ts": true,
|
|
@@ -7911,6 +7923,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7911
7923
|
"tests/unit/health/consumer.test.ts": true,
|
|
7912
7924
|
"tests/unit/health/contract.test.ts": true,
|
|
7913
7925
|
"tests/unit/health/deadline.test.ts": true,
|
|
7926
|
+
"tests/unit/health/declared-checks.test.ts": true,
|
|
7914
7927
|
"tests/unit/health/deterministic-regressions.test.ts": true,
|
|
7915
7928
|
"tests/unit/health/deterministic.test.ts": true,
|
|
7916
7929
|
"tests/unit/health/drift-tickets.test.ts": true,
|