@codyswann/lisa 4.12.0 → 4.13.1
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-hooks/parity-safety-net.sh +7 -1
- package/dist/cli/doctor-two-channel-drift.d.ts +20 -0
- package/dist/cli/doctor-two-channel-drift.d.ts.map +1 -0
- package/dist/cli/doctor-two-channel-drift.js +190 -0
- package/dist/cli/doctor-two-channel-drift.js.map +1 -0
- package/dist/cli/doctor-wiki.d.ts +8 -0
- package/dist/cli/doctor-wiki.d.ts.map +1 -0
- package/dist/cli/doctor-wiki.js +42 -0
- package/dist/cli/doctor-wiki.js.map +1 -0
- package/dist/cli/doctor.d.ts.map +1 -1
- package/dist/cli/doctor.js +7 -30
- package/dist/cli/doctor.js.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
- package/dist/core/lisa-owned-hash-ledger.js +3 -0
- package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
- package/dist/core/two-channel-delivery-scan.d.ts +81 -0
- package/dist/core/two-channel-delivery-scan.d.ts.map +1 -0
- package/dist/core/two-channel-delivery-scan.js +191 -0
- package/dist/core/two-channel-delivery-scan.js.map +1 -0
- package/dist/core/two-channel-delivery.d.ts +215 -0
- package/dist/core/two-channel-delivery.d.ts.map +1 -0
- package/dist/core/two-channel-delivery.js +259 -0
- package/dist/core/two-channel-delivery.js.map +1 -0
- package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
- package/dist/core/upstream-evidence-manifest.js +18 -5
- package/dist/core/upstream-evidence-manifest.js.map +1 -1
- package/dist/opencode/plugin-templates/parity-safety-net.sh +7 -1
- package/package.json +4 -2
- package/plugins/lisa/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa/hooks/parity-safety-net.sh +7 -1
- package/plugins/lisa/rules/eager/falsifiable-checks.md +1 -1
- package/plugins/lisa/rules/reference/falsifiable-checks.md +1 -1
- package/plugins/lisa-agy/hooks/parity-safety-net.sh +7 -1
- package/plugins/lisa-agy/plugin.json +1 -1
- package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-agy/plugin.json +1 -1
- package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-copilot/hooks/parity-safety-net.sh +7 -1
- package/plugins/lisa-copilot/rules/eager/falsifiable-checks.md +1 -1
- package/plugins/lisa-copilot/rules/reference/falsifiable-checks.md +1 -1
- package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-cursor/hooks/parity-safety-net.sh +7 -1
- package/plugins/lisa-cursor/rules/falsifiable-checks-reference.mdc +1 -1
- package/plugins/lisa-cursor/rules/falsifiable-checks.mdc +1 -1
- package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-agy/plugin.json +1 -1
- package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-agy/plugin.json +1 -1
- package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-agy/plugin.json +1 -1
- package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-agy/plugin.json +1 -1
- package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-agy/plugin.json +1 -1
- package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-agy/plugin.json +1 -1
- package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-agy/plugin.json +1 -1
- package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
- package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
- package/plugins/src/base/hooks/parity-safety-net.sh +7 -1
- package/plugins/src/base/rules/eager/falsifiable-checks.md +1 -1
- package/plugins/src/base/rules/reference/falsifiable-checks.md +1 -1
- package/scripts/generate-two-channel-couplings.ts +427 -0
- package/scripts/two-channel-couplings.json +214 -0
- package/typescript/copy-overwrite/scripts/lisa-mutation.mjs +19 -20
|
@@ -0,0 +1,259 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Measure the gap between the two speeds Lisa ships a change at.
|
|
3
|
+
*
|
|
4
|
+
* Lisa reaches a consumer down two channels, and they do not move together:
|
|
5
|
+
*
|
|
6
|
+
* | half | channel | reaches a consumer |
|
|
7
|
+
* | --- | --- | --- |
|
|
8
|
+
* | the reusable workflow body | `uses: …@main` | their next workflow run |
|
|
9
|
+
* | scripts, configs, declarations | `lisa apply` | their next apply |
|
|
10
|
+
*
|
|
11
|
+
* For an *additive* change the asymmetry is harmless — the new workflow finds
|
|
12
|
+
* no declaration and falls back. For a change that REMOVES a built-in and
|
|
13
|
+
* replaces it with something the consumer's tree must provide, the halves are
|
|
14
|
+
* not interchangeable and they land in the wrong order: the removing half is
|
|
15
|
+
* live everywhere immediately, the restoring half only where someone applied.
|
|
16
|
+
* In the gap the property is proved by nothing, and nothing reads as red —
|
|
17
|
+
* the replacement never runs, so it posts no context, and an ABSENT required
|
|
18
|
+
* context is not a failing one (CodySwannGT/lisa#3050).
|
|
19
|
+
*
|
|
20
|
+
* ## What this module measures, and what it deliberately does not
|
|
21
|
+
*
|
|
22
|
+
* A **coupling** is one step of a `@main`-delivered reusable workflow naming a
|
|
23
|
+
* path in the CALLER's tree. `scripts/check-e2e-coverage.mjs` is a coupling;
|
|
24
|
+
* `node_modules/@codyswann/lisa/all/copy-overwrite/scripts/lisa-gates.mjs` is
|
|
25
|
+
* not — that path is inside the installed package, and whether it survives a
|
|
26
|
+
* release is `check-workflow-package-paths.mjs`'s question (#2960).
|
|
27
|
+
*
|
|
28
|
+
* That script states its own boundary: *"HOST-relative candidates in the same
|
|
29
|
+
* step (`scripts/foo.mjs`) do not count and are never extracted."* This module
|
|
30
|
+
* is exactly that excluded arm. The two do not overlap, and neither subsumes
|
|
31
|
+
* the other: #2960 asks whether a PACKAGE path survives a release, this asks
|
|
32
|
+
* whether a HOST path ever arrives at all.
|
|
33
|
+
*
|
|
34
|
+
* ## Why the resolver loop matters more than it looks
|
|
35
|
+
*
|
|
36
|
+
* Most steps resolve a script by trying candidates in order — the packaged
|
|
37
|
+
* copy first, the consumer's own copy as a fallback. Such a step is
|
|
38
|
+
* `package-backed`: the package channel delivers it, and the host copy is
|
|
39
|
+
* belt-and-braces. **A step naming a host path with NO package candidate has
|
|
40
|
+
* exactly one delivery channel, and it is the slow one.** Those are the
|
|
41
|
+
* couplings this module exists to count.
|
|
42
|
+
*
|
|
43
|
+
* ## Why an inventory of apply-lagged couplings is the deliverable, not a failure
|
|
44
|
+
*
|
|
45
|
+
* Fourteen of Lisa's own fifteen host-only couplings are `apply-lagged`, and
|
|
46
|
+
* every one of them is deliberate — Lisa's design is that `quality.yml` calls
|
|
47
|
+
* scripts `lisa apply` installs. Failing on them would mean ratifying fourteen
|
|
48
|
+
* entries on day one, and an allowlist that large stops being a record of
|
|
49
|
+
* decisions and becomes the bypass (the lesson of #2639). So `apply-lagged` is
|
|
50
|
+
* RECORDED. The ledger is the baseline; a change that adds a coupling shows up
|
|
51
|
+
* as a ledger diff a reviewer must look at, which is the reachable check the
|
|
52
|
+
* issue asked for.
|
|
53
|
+
*
|
|
54
|
+
* What fails is the shape nothing restores: `never-delivered` (create-only, so
|
|
55
|
+
* an existing consumer receives it once at scaffold time or never) and
|
|
56
|
+
* `undelivered` (Lisa ships no such path anywhere). Those are #3030's lesson
|
|
57
|
+
* — *"fixed upstream" is not "a bump brings it"* — reached from the other
|
|
58
|
+
* side, and #3169's honestly-stated haves/have-nots split.
|
|
59
|
+
*
|
|
60
|
+
* ## Refusing to pass on nothing
|
|
61
|
+
*
|
|
62
|
+
* Zero workflows, zero steps, zero couplings, or an empty delivery inventory
|
|
63
|
+
* all mean the measurement did not happen, and every one of them is reported
|
|
64
|
+
* as unmeasured rather than as a clean sweep. An empty comparison and a
|
|
65
|
+
* converged consumer must not produce the same output — this whole subject is
|
|
66
|
+
* failures that read as normal, and reproducing that here would be perverse.
|
|
67
|
+
* @module core/two-channel-delivery
|
|
68
|
+
*/
|
|
69
|
+
/** The channel a refreshing lane puts an artifact on. */
|
|
70
|
+
const CHANNEL_APPLY = "apply";
|
|
71
|
+
/** The channel a scaffold-time-only lane puts an artifact on. */
|
|
72
|
+
const CHANNEL_CREATE_ONLY = "create-only";
|
|
73
|
+
/** The channel the installed package puts an artifact on. */
|
|
74
|
+
const CHANNEL_PACKAGE = "package";
|
|
75
|
+
/** The channel of a path nothing delivers. */
|
|
76
|
+
const CHANNEL_UNDELIVERED = "undelivered";
|
|
77
|
+
/** Copy strategies that REFRESH an existing consumer's file on every apply. */
|
|
78
|
+
const REFRESHING_LANES = new Set([
|
|
79
|
+
"copy-overwrite",
|
|
80
|
+
"copy-contents",
|
|
81
|
+
"merge",
|
|
82
|
+
"tagged-merge",
|
|
83
|
+
"package-lisa",
|
|
84
|
+
]);
|
|
85
|
+
/** The one lane that writes a file exactly once and never returns to it. */
|
|
86
|
+
const CREATE_ONLY_LANE = CHANNEL_CREATE_ONLY;
|
|
87
|
+
/** Every verdict, named once so no two mentions can drift apart. */
|
|
88
|
+
const PACKAGE_BACKED = "package-backed";
|
|
89
|
+
const APPLY_LAGGED = "apply-lagged";
|
|
90
|
+
const NEVER_DELIVERED = "never-delivered";
|
|
91
|
+
const UNDELIVERED = CHANNEL_UNDELIVERED;
|
|
92
|
+
/** The remedy each verdict calls for. */
|
|
93
|
+
const REMEDIES = {
|
|
94
|
+
[PACKAGE_BACKED]: "none",
|
|
95
|
+
[APPLY_LAGGED]: "run-lisa-apply",
|
|
96
|
+
[NEVER_DELIVERED]: "adopt-the-artifact",
|
|
97
|
+
[UNDELIVERED]: "author-the-artifact",
|
|
98
|
+
};
|
|
99
|
+
/** Every verdict, so a count of zero is still a stated zero. */
|
|
100
|
+
const VERDICTS = Object.keys(REMEDIES);
|
|
101
|
+
/** Verdicts where nothing Lisa does on its own ever closes the gap. */
|
|
102
|
+
const UNRESTORABLE = new Set([
|
|
103
|
+
NEVER_DELIVERED,
|
|
104
|
+
UNDELIVERED,
|
|
105
|
+
]);
|
|
106
|
+
/**
|
|
107
|
+
* Which channel a path arrives on, given the lanes shipping it.
|
|
108
|
+
*
|
|
109
|
+
* A refreshing lane wins over `create-only` when both ship the same path,
|
|
110
|
+
* because an apply reaching ANY refreshing lane rewrites the file. That is
|
|
111
|
+
* deliberately optimistic and stated rather than hidden: a project on only the
|
|
112
|
+
* create-only stack still never receives it, and resolving lanes per active
|
|
113
|
+
* stack is a later stage. Optimism that is written down can be argued with;
|
|
114
|
+
* optimism inside a `find` cannot.
|
|
115
|
+
* @param lanes - `<stack>/<strategy>` lanes shipping the path
|
|
116
|
+
* @returns The channel an existing consumer receives it on
|
|
117
|
+
*/
|
|
118
|
+
export function resolveDeliveryChannel(lanes) {
|
|
119
|
+
const strategies = lanes.map(lane => lane.slice(lane.indexOf("/") + 1));
|
|
120
|
+
if (strategies.some(strategy => REFRESHING_LANES.has(strategy))) {
|
|
121
|
+
return CHANNEL_APPLY;
|
|
122
|
+
}
|
|
123
|
+
if (strategies.includes(CREATE_ONLY_LANE))
|
|
124
|
+
return CHANNEL_CREATE_ONLY;
|
|
125
|
+
return CHANNEL_UNDELIVERED;
|
|
126
|
+
}
|
|
127
|
+
/**
|
|
128
|
+
* The verdict for one coupling.
|
|
129
|
+
* @param input - The coupling
|
|
130
|
+
* @param channel - The channel its path arrives on
|
|
131
|
+
* @returns The verdict
|
|
132
|
+
*/
|
|
133
|
+
function verdictFor(input, channel) {
|
|
134
|
+
// Ahead of every channel branch: a step that names a package candidate is
|
|
135
|
+
// covered by the fast channel whatever the host copy's lane says. Reading
|
|
136
|
+
// the lane first would classify every resolver loop in `quality.yml` as
|
|
137
|
+
// apply-lagged and drown the twenty real couplings in ninety false ones.
|
|
138
|
+
if (input.packageBacked)
|
|
139
|
+
return PACKAGE_BACKED;
|
|
140
|
+
if (channel === CHANNEL_APPLY)
|
|
141
|
+
return APPLY_LAGGED;
|
|
142
|
+
if (channel === CHANNEL_CREATE_ONLY)
|
|
143
|
+
return NEVER_DELIVERED;
|
|
144
|
+
return UNDELIVERED;
|
|
145
|
+
}
|
|
146
|
+
/**
|
|
147
|
+
* How an absent path shows up, which is not the same as whether it is absent.
|
|
148
|
+
* @param guarded - Whether the read sits behind an existence test
|
|
149
|
+
* @returns One clause describing the failure's shape
|
|
150
|
+
*/
|
|
151
|
+
function absenceShape(guarded) {
|
|
152
|
+
return guarded
|
|
153
|
+
? "The read is guarded by an existence test, so an absent path SKIPS rather than fails — the step posts no context, and an absent required context is not a red one. Nothing reads as broken."
|
|
154
|
+
: "The read is unguarded, so an absent path fails the job loudly. Visible, which makes it the better of the two failures.";
|
|
155
|
+
}
|
|
156
|
+
/**
|
|
157
|
+
* The sentence one verdict is explained with.
|
|
158
|
+
* @param input - The coupling
|
|
159
|
+
* @param verdict - Its verdict
|
|
160
|
+
* @returns One operator-readable sentence
|
|
161
|
+
*/
|
|
162
|
+
function detailFor(input, verdict) {
|
|
163
|
+
const called = `\`${input.workflow}\` is delivered at \`@main\`, so this step is live in every consumer on their next run.`;
|
|
164
|
+
if (verdict === PACKAGE_BACKED) {
|
|
165
|
+
return `${called} It resolves \`${input.path}\` only after a package-relative candidate, which travels with the installed package — the caller-tree copy is a fallback, not the delivery channel.`;
|
|
166
|
+
}
|
|
167
|
+
if (verdict === APPLY_LAGGED) {
|
|
168
|
+
return `${called} It reads \`${input.path}\` from the CALLER's tree with no package-relative candidate, and Lisa delivers that path on the \`lisa apply\` channel (${input.lanes.join(", ")}). The two halves land in the wrong order: this step is live everywhere immediately, the file it needs is live only where somebody applied. ${absenceShape(input.guarded)}`;
|
|
169
|
+
}
|
|
170
|
+
if (verdict === NEVER_DELIVERED) {
|
|
171
|
+
return `${called} It reads \`${input.path}\` from the CALLER's tree, and Lisa ships that path create-only (${input.lanes.join(", ")}) — written once at scaffold time and never refreshed, so an existing consumer NEVER receives it. Fixing it upstream does not mean a bump brings it; adoption is a manual step the consumer must take. ${absenceShape(input.guarded)}`;
|
|
172
|
+
}
|
|
173
|
+
return `${called} It reads \`${input.path}\` from the CALLER's tree, and Lisa ships no such path in any delivery lane — no apply and no bump ever produces it. Either the consumer authors it or this step proves nothing wherever it is absent. ${absenceShape(input.guarded)}`;
|
|
174
|
+
}
|
|
175
|
+
/**
|
|
176
|
+
* Compare `<workflow>::<path>` keys the same way everywhere, so two runs over
|
|
177
|
+
* the same tree emit the same bytes.
|
|
178
|
+
* @param left - One keyed value
|
|
179
|
+
* @param right - The other
|
|
180
|
+
* @returns Sort order
|
|
181
|
+
*/
|
|
182
|
+
function byKey(left, right) {
|
|
183
|
+
return left.key.localeCompare(right.key);
|
|
184
|
+
}
|
|
185
|
+
/**
|
|
186
|
+
* Turn one raw coupling into a classified entry.
|
|
187
|
+
* @param input - The coupling
|
|
188
|
+
* @returns The entry
|
|
189
|
+
*/
|
|
190
|
+
function toEntry(input) {
|
|
191
|
+
const channel = input.packageBacked
|
|
192
|
+
? CHANNEL_PACKAGE
|
|
193
|
+
: resolveDeliveryChannel(input.lanes);
|
|
194
|
+
const verdict = verdictFor(input, channel);
|
|
195
|
+
return {
|
|
196
|
+
...input,
|
|
197
|
+
key: `${input.workflow}::${input.path}`,
|
|
198
|
+
channel,
|
|
199
|
+
verdict,
|
|
200
|
+
remedy: REMEDIES[verdict],
|
|
201
|
+
detail: detailFor(input, verdict),
|
|
202
|
+
};
|
|
203
|
+
}
|
|
204
|
+
/**
|
|
205
|
+
* Why a run measured nothing, or null when it measured something.
|
|
206
|
+
* @param inspected - What the run looked at
|
|
207
|
+
* @returns The reason, or null
|
|
208
|
+
*/
|
|
209
|
+
function unmeasuredReasonFor(inspected) {
|
|
210
|
+
if (inspected.workflows === 0) {
|
|
211
|
+
return "no reusable workflows were discovered, so the fast channel was never read";
|
|
212
|
+
}
|
|
213
|
+
if (inspected.steps === 0) {
|
|
214
|
+
return "the reusable workflows yielded no steps, so nothing could name a caller-tree path";
|
|
215
|
+
}
|
|
216
|
+
if (inspected.inventory === 0) {
|
|
217
|
+
return "the delivery inventory is empty, so every path would resolve to `undelivered` whether or not Lisa ships it";
|
|
218
|
+
}
|
|
219
|
+
if (inspected.couplings === 0) {
|
|
220
|
+
return "no step named a caller-tree path, which cannot be true of a tree that ships reusable workflows at all";
|
|
221
|
+
}
|
|
222
|
+
return null;
|
|
223
|
+
}
|
|
224
|
+
/**
|
|
225
|
+
* Classify every coupling and decide whether the run measured anything.
|
|
226
|
+
*
|
|
227
|
+
* Total and pure — the same inputs always produce the same entries in the same
|
|
228
|
+
* order. Reaching the tree is the caller's job, and a caller that could not
|
|
229
|
+
* reach it must pass the zeroes it actually saw rather than omit them: this
|
|
230
|
+
* function reports an empty sweep as unmeasured precisely so a caller cannot
|
|
231
|
+
* turn "I could not look" into "there was nothing to find".
|
|
232
|
+
* @param options - Inputs
|
|
233
|
+
* @param options.couplings - Every caller-tree path read that was found
|
|
234
|
+
* @param options.inspected - What the run looked at
|
|
235
|
+
* @param options.ratified - Ratification reasons, keyed `<workflow>::<path>`
|
|
236
|
+
* @returns The measurement
|
|
237
|
+
*/
|
|
238
|
+
export function classifyTwoChannelDelivery(options) {
|
|
239
|
+
const { couplings, inspected, ratified } = options;
|
|
240
|
+
const entries = couplings.map(toEntry).sort(byKey);
|
|
241
|
+
const unrestorable = entries.filter(entry => UNRESTORABLE.has(entry.verdict));
|
|
242
|
+
const live = new Set(unrestorable.map(entry => entry.key));
|
|
243
|
+
const unmeasuredReason = unmeasuredReasonFor(inspected);
|
|
244
|
+
return {
|
|
245
|
+
entries,
|
|
246
|
+
counts: Object.fromEntries(VERDICTS.map(verdict => [
|
|
247
|
+
verdict,
|
|
248
|
+
entries.filter(entry => entry.verdict === verdict).length,
|
|
249
|
+
])),
|
|
250
|
+
inspected,
|
|
251
|
+
findings: unrestorable.filter(entry => !Object.hasOwn(ratified, entry.key)),
|
|
252
|
+
staleRatifications: Object.keys(ratified)
|
|
253
|
+
.filter(key => !live.has(key))
|
|
254
|
+
.sort((left, right) => left.localeCompare(right)),
|
|
255
|
+
measured: unmeasuredReason === null,
|
|
256
|
+
unmeasuredReason,
|
|
257
|
+
};
|
|
258
|
+
}
|
|
259
|
+
//# sourceMappingURL=two-channel-delivery.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"two-channel-delivery.js","sourceRoot":"","sources":["../../src/core/two-channel-delivery.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,
|
|
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,CAk6EpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAgsPjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}
|
|
@@ -21,7 +21,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
21
21
|
"all/copy-overwrite/scripts/lisa-hooks/block-managed-file-edits.sh": "d3ef2562b718156912f0877f8a0668026f5966fcca43eb9e064aa57a4e9a4976",
|
|
22
22
|
"all/copy-overwrite/scripts/lisa-hooks/block-no-verify.sh": "cdf59a4423ced0c1744a9742cd20a3e59eb728972be0657acde7c4658528fbfc",
|
|
23
23
|
"all/copy-overwrite/scripts/lisa-hooks/block-shell-json-parsing.sh": "234cb82cc9033bd04940a553d4ddc95b078e585e41777d6529d887676edc40b1",
|
|
24
|
-
"all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh": "
|
|
24
|
+
"all/copy-overwrite/scripts/lisa-hooks/parity-safety-net.sh": "fb487a2d54b05a8d3268ce46e64b044a68896827941eb9e6e25b975e76762e13",
|
|
25
25
|
"all/copy-overwrite/scripts/lisa-hooks/sonar-secrets.sh": "f21cdcb54b353714a92c2d1e25fd6b76318e8e8d7cb90cdb016f174923c532ef",
|
|
26
26
|
"all/copy-overwrite/scripts/lisa-lint-staged-preflight.mjs": "ce4bc224a102e3ac2bc29d8f2038eefd619129d4639c25954c93f05011f7f977",
|
|
27
27
|
"all/copy-overwrite/scripts/lisa-postinstall.mjs": "d22fe47acf9a68828ca28b19b88e269bf535e77bc38952dec9f7a703269f1c44",
|
|
@@ -365,7 +365,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
365
365
|
"plugins/src/base/hooks/install-pkgs.sh": "e9a13faba849a277410dde911ab102ee6f88ef915b33571bb1d4eef904172db5",
|
|
366
366
|
"plugins/src/base/hooks/parity-safety-net-heredoc.py": "f21b1232ac82bd0e42d2ba43c68f4cc4546334fc885ba31747881f427097ef78",
|
|
367
367
|
"plugins/src/base/hooks/parity-safety-net.agy.sh": "ce9bd2b4566ad9147e4ace56434cffbbe87edb4ccbb57549ab3fd9f4c671ced4",
|
|
368
|
-
"plugins/src/base/hooks/parity-safety-net.sh": "
|
|
368
|
+
"plugins/src/base/hooks/parity-safety-net.sh": "67a600105e3d96c0bfedcfc576fe667c4698679236a6c8253fcd8ff2eaf9e649",
|
|
369
369
|
"plugins/src/base/hooks/secrets-preflight.sh": "cdc638627e5769770aefb061ea0ddfacc1888a8eab3a5fade6c43129a2d3ff6e",
|
|
370
370
|
"plugins/src/base/hooks/setup-jira-cli.sh": "384bc8d935a2ed5788d7185979b3e74c75c17cd4bc5c230d7d8f086ab2703443",
|
|
371
371
|
"plugins/src/base/hooks/shell-write-nudge.sh": "69839af423f8792b1e52c71097316c3264425553031627c0a2f9409a9d5becd0",
|
|
@@ -396,7 +396,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
396
396
|
"plugins/src/base/rules/eager/documentation-source-paths.md": "3a7c2a6264654a3cc44dd326441ba211a39c1c267033cc189c1c635adb84b52b",
|
|
397
397
|
"plugins/src/base/rules/eager/empirical-inquiry.md": "67aa64ba3ecc4f3cd761111d2562662e0a2acf7892703b14ec83f7f7b073e670",
|
|
398
398
|
"plugins/src/base/rules/eager/factory-model.md": "dee39b4276926ee27a2614bf26b985fd33bb3d115313fa6e2893de12da13ed7c",
|
|
399
|
-
"plugins/src/base/rules/eager/falsifiable-checks.md": "
|
|
399
|
+
"plugins/src/base/rules/eager/falsifiable-checks.md": "0ffbd0ee8d699bd55aebfcc9fff560b32f6b09f7b5ab6378270c7e1d21b9c4c3",
|
|
400
400
|
"plugins/src/base/rules/eager/history-audit.md": "e2365e3fb28230c643e943d26688a93906afa68e3e1355d3e86d4b22ab3db559",
|
|
401
401
|
"plugins/src/base/rules/eager/integration-access-layer.md": "e5675ec414d0dcfbbf7a29912f39ea5fb02747aa4e6045493e636cba1e635eb7",
|
|
402
402
|
"plugins/src/base/rules/eager/intent-routing.md": "a2ef2397a98fb3d991fcfb39b669e289c1e2b697191cbeb6c071d71eca836207",
|
|
@@ -447,7 +447,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
447
447
|
"plugins/src/base/rules/reference/documentation-source-paths.md": "555155889c9cf279865b9d8fc554bdd461c96a3ec76a5001dfeb361a71056999",
|
|
448
448
|
"plugins/src/base/rules/reference/empirical-inquiry.md": "8cb166ab9eff4eb30287822a4d7843f76884d70d683d7c61d6a7ffd4ff9f7159",
|
|
449
449
|
"plugins/src/base/rules/reference/factory-model.md": "b28a2ea4df7c33390111667a2807d9003cf8c9a14829f6fb0dbc929b05bfed3a",
|
|
450
|
-
"plugins/src/base/rules/reference/falsifiable-checks.md": "
|
|
450
|
+
"plugins/src/base/rules/reference/falsifiable-checks.md": "4a54264fcbdca01beac7412e68de005b8aabedae266b2266a2940190c0e35f5b",
|
|
451
451
|
"plugins/src/base/rules/reference/history-audit.md": "20a46390f71fadda499c61193d430c3d53df49b55a4cefa50a112f82fa4b05ef",
|
|
452
452
|
"plugins/src/base/rules/reference/integration-access-layer.md": "c5fc07f5f46ba1f99403b6e4fd5603d153411a9bb1838bea320b26a5bd5273d6",
|
|
453
453
|
"plugins/src/base/rules/reference/intent-routing.md": "988f8f45b41056c2adaa1a3e5f6ea926ac56a2fd041c07f98a9c2b271050efdd",
|
|
@@ -1108,6 +1108,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
1108
1108
|
"scripts/generate-copilot-plugin-artifacts.mjs": "7af923118c49101e6ba46da73a8eee8aee9b797e074618aa5345913e638d7cdb",
|
|
1109
1109
|
"scripts/generate-cursor-plugin-artifacts.mjs": "45d3bde7b6c55310f0d9436dd68a1bdeefb6fa817be4d15ef745421b39a2cf47",
|
|
1110
1110
|
"scripts/generate-lisa-owned-hash-ledger.mjs": "7f6c5456c50cd3ab33f528eff40a13f501521bbe6dd0e068afd599e5da1c1f89",
|
|
1111
|
+
"scripts/generate-two-channel-couplings.ts": "8c1f5b8d6ac5043dec9789f3ac1fe83d9ba00d1e1eccf9c6a92f274ab8da919e",
|
|
1111
1112
|
"scripts/generate-upstream-evidence-manifest.mjs": "8f18972834d6be9771501c35da30de95539a7e7b3fb3d7605e0bc31477812a5f",
|
|
1112
1113
|
"scripts/github-status-check.sh": "c6a4a13ff5cf689fcbd7a6aca718f9e7d46d54ccb6687f662b055c1ca20e792f",
|
|
1113
1114
|
"scripts/install-claude-plugins.sh": "0e96ebbae1e59304bb432286eccba38900a6008b80f2c53a1ec2c95801d4087c",
|
|
@@ -1150,6 +1151,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
1150
1151
|
"scripts/remote-agent-aws-setup.sh": "f181062436c214c95fe15be8000cce18de0b553b3dab06b822a4fe55cb285ca6",
|
|
1151
1152
|
"scripts/setup-deploy-key.sh": "2bed19346810b7af18a5225fd463c4d553a7bcc7b2f11a21bd47b93e6b5e1719",
|
|
1152
1153
|
"scripts/test-intent-routing.sh": "97b9dc86cbd805df8a7fdb8c99ffab9b8c5e751ba2e84c05420b2a124f80635d",
|
|
1154
|
+
"scripts/two-channel-couplings.json": "ed012cd2a38a9d6cd7c4068963b841693c10eb5b40223500d9e5f09bf931a48f",
|
|
1153
1155
|
"scripts/update-node-version.ts": "dcfec9f8666f65925deb9efdc8a4bebb6c3f41d9fa1c1365be23edb82c40fffa",
|
|
1154
1156
|
"scripts/update-test-skill-paths.mjs": "e26a3ac716c33013e22bf5223a58457452f5af2038218a0e3a51c244eab5ddc9",
|
|
1155
1157
|
"scripts/verify-health-agentic-built.mjs": "4b0d20b2c94390ff6f5af881fc50c5c225215a282891db0b3e3d84a7e6455367",
|
|
@@ -1199,7 +1201,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
|
|
|
1199
1201
|
"typescript/copy-overwrite/scripts/check-verification-coverage.mjs": "777e46c8e8147935f0b944dc21536f6238b26b5b7dca06c5fdb2d2898a9790dc",
|
|
1200
1202
|
"typescript/copy-overwrite/scripts/lib/bounded-spawn.mjs": "72e277ada531914d7bc51c3cb8dc67b8881aa817d96fa2f9f4d81668a3d3bbc1",
|
|
1201
1203
|
"typescript/copy-overwrite/scripts/lib/invoked-as-script.mjs": "fbb9b88fc85a3e22f21af39e1c17acf67ff83fc6b5a6cdc8081bde333c48faa7",
|
|
1202
|
-
"typescript/copy-overwrite/scripts/lisa-mutation.mjs": "
|
|
1204
|
+
"typescript/copy-overwrite/scripts/lisa-mutation.mjs": "df4bce62dd2bd40fb6c4f9646d4249063523d82bb7653c0720ccd4222557ef3f",
|
|
1203
1205
|
"typescript/copy-overwrite/scripts/nightly-e2e-suites.schema.json": "bce579fc87a3ca892dc96f0366ef8afdc650a20015f4623f2561662ec7a1f6c8",
|
|
1204
1206
|
"typescript/copy-overwrite/scripts/threshold-ratchet-compare.mjs": "874f0792beab000939d480c1a0547ce4dd351421b4e5f0fbb495aae246ab85c2",
|
|
1205
1207
|
"typescript/copy-overwrite/scripts/threshold-ratchet-families.mjs": "47d44b2bca383ae395b4e415e06c97a127327ab13762ee95b8c43d0198639bbb",
|
|
@@ -1475,6 +1477,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
1475
1477
|
"docs/design/gates-and-policy.md": true,
|
|
1476
1478
|
"docs/design/release-evidence-reuse.md": true,
|
|
1477
1479
|
"docs/design/reset-production-absence.md": true,
|
|
1480
|
+
"docs/design/two-channel-delivery.md": true,
|
|
1478
1481
|
"docs/design/uat-acceptance-verification-gate.md": true,
|
|
1479
1482
|
"docs/kane-cli-integration.md": true,
|
|
1480
1483
|
"docs/kane-cli-pilot.example.json": true,
|
|
@@ -7118,6 +7121,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7118
7121
|
"scripts/generate-copilot-plugin-artifacts.mjs": true,
|
|
7119
7122
|
"scripts/generate-cursor-plugin-artifacts.mjs": true,
|
|
7120
7123
|
"scripts/generate-lisa-owned-hash-ledger.mjs": true,
|
|
7124
|
+
"scripts/generate-two-channel-couplings.ts": true,
|
|
7121
7125
|
"scripts/generate-upstream-evidence-manifest.mjs": true,
|
|
7122
7126
|
"scripts/github-status-check.sh": true,
|
|
7123
7127
|
"scripts/install-claude-plugins.sh": true,
|
|
@@ -7160,6 +7164,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7160
7164
|
"scripts/remote-agent-aws-setup.sh": true,
|
|
7161
7165
|
"scripts/setup-deploy-key.sh": true,
|
|
7162
7166
|
"scripts/test-intent-routing.sh": true,
|
|
7167
|
+
"scripts/two-channel-couplings.json": true,
|
|
7163
7168
|
"scripts/update-node-version.ts": true,
|
|
7164
7169
|
"scripts/update-test-skill-paths.mjs": true,
|
|
7165
7170
|
"scripts/verify-health-agentic-built.mjs": true,
|
|
@@ -7231,6 +7236,8 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7231
7236
|
"src/cli/doctor-skip-jobs-migration.ts": true,
|
|
7232
7237
|
"src/cli/doctor-sonar.ts": true,
|
|
7233
7238
|
"src/cli/doctor-traceability-gate.ts": true,
|
|
7239
|
+
"src/cli/doctor-two-channel-drift.ts": true,
|
|
7240
|
+
"src/cli/doctor-wiki.ts": true,
|
|
7234
7241
|
"src/cli/doctor-worker-epoch.ts": true,
|
|
7235
7242
|
"src/cli/doctor-worker-journey.ts": true,
|
|
7236
7243
|
"src/cli/doctor-worktree-hygiene.ts": true,
|
|
@@ -7438,6 +7445,8 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7438
7445
|
"src/core/self-apply.ts": true,
|
|
7439
7446
|
"src/core/sonar-integration.ts": true,
|
|
7440
7447
|
"src/core/template-ownership.ts": true,
|
|
7448
|
+
"src/core/two-channel-delivery-scan.ts": true,
|
|
7449
|
+
"src/core/two-channel-delivery.ts": true,
|
|
7441
7450
|
"src/core/upstream-attribution-body.ts": true,
|
|
7442
7451
|
"src/core/workflow-reference-guard.ts": true,
|
|
7443
7452
|
"src/detection/detector.interface.ts": true,
|
|
@@ -7882,6 +7891,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
7882
7891
|
"tests/unit/cli/doctor-skip-jobs-moment-callers.test.ts": true,
|
|
7883
7892
|
"tests/unit/cli/doctor-sonar.test.ts": true,
|
|
7884
7893
|
"tests/unit/cli/doctor-traceability-gate.test.ts": true,
|
|
7894
|
+
"tests/unit/cli/doctor-two-channel-drift.test.ts": true,
|
|
7885
7895
|
"tests/unit/cli/doctor-worker-epoch.test.ts": true,
|
|
7886
7896
|
"tests/unit/cli/doctor-worker-journey.test.ts": true,
|
|
7887
7897
|
"tests/unit/cli/doctor-worktree-hygiene.test.ts": true,
|
|
@@ -8119,6 +8129,8 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
8119
8129
|
"tests/unit/core/self-apply.test.ts": true,
|
|
8120
8130
|
"tests/unit/core/skill-frontmatter-contract.test.ts": true,
|
|
8121
8131
|
"tests/unit/core/sonar-integration.test.ts": true,
|
|
8132
|
+
"tests/unit/core/two-channel-delivery-scan.test.ts": true,
|
|
8133
|
+
"tests/unit/core/two-channel-delivery.test.ts": true,
|
|
8122
8134
|
"tests/unit/core/update-skill-apply-mode.test.ts": true,
|
|
8123
8135
|
"tests/unit/core/upstream-attribution-body-hardening.test.ts": true,
|
|
8124
8136
|
"tests/unit/core/upstream-attribution-body.test.ts": true,
|
|
@@ -8311,6 +8323,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
|
|
|
8311
8323
|
"tests/unit/scripts/generate-copilot-plugin-artifacts.test.ts": true,
|
|
8312
8324
|
"tests/unit/scripts/generate-cursor-plugin-artifacts.artifacts.test.ts": true,
|
|
8313
8325
|
"tests/unit/scripts/generate-cursor-plugin-artifacts.test.ts": true,
|
|
8326
|
+
"tests/unit/scripts/generate-two-channel-couplings.test.ts": true,
|
|
8314
8327
|
"tests/unit/scripts/github-governance.test.ts": true,
|
|
8315
8328
|
"tests/unit/scripts/install-claude-plugins-self.test.ts": true,
|
|
8316
8329
|
"tests/unit/scripts/invoked-as-script.test.ts": true,
|