@codyswann/lisa 4.42.1 → 4.42.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.
Files changed (107) hide show
  1. package/all/copy-overwrite/scripts/check-orphaned-branches.mjs +458 -29
  2. package/dist/cli/doctor-reusable-workflow-refs.d.ts +3 -3
  3. package/dist/cli/doctor-reusable-workflow-refs.d.ts.map +1 -1
  4. package/dist/cli/doctor-reusable-workflow-refs.js +46 -74
  5. package/dist/cli/doctor-reusable-workflow-refs.js.map +1 -1
  6. package/dist/cli/version.d.ts +17 -0
  7. package/dist/cli/version.d.ts.map +1 -1
  8. package/dist/cli/version.js +34 -0
  9. package/dist/cli/version.js.map +1 -1
  10. package/dist/core/lisa-owned-hash-ledger.d.ts.map +1 -1
  11. package/dist/core/lisa-owned-hash-ledger.js +18 -0
  12. package/dist/core/lisa-owned-hash-ledger.js.map +1 -1
  13. package/dist/core/lisa-release-pin.d.ts +63 -0
  14. package/dist/core/lisa-release-pin.d.ts.map +1 -0
  15. package/dist/core/lisa-release-pin.js +147 -0
  16. package/dist/core/lisa-release-pin.js.map +1 -0
  17. package/dist/core/lisa.d.ts.map +1 -1
  18. package/dist/core/lisa.js +4 -1
  19. package/dist/core/lisa.js.map +1 -1
  20. package/dist/core/nightly-e2e-guard-behavior-certificate.js +2 -2
  21. package/dist/core/reusable-workflow-pin.d.ts +113 -0
  22. package/dist/core/reusable-workflow-pin.d.ts.map +1 -0
  23. package/dist/core/reusable-workflow-pin.js +165 -0
  24. package/dist/core/reusable-workflow-pin.js.map +1 -0
  25. package/dist/core/upstream-evidence-manifest.d.ts.map +1 -1
  26. package/dist/core/upstream-evidence-manifest.js +17 -8
  27. package/dist/core/upstream-evidence-manifest.js.map +1 -1
  28. package/dist/migrations/ensure-nightly-e2e-workflow-pins.d.ts +16 -36
  29. package/dist/migrations/ensure-nightly-e2e-workflow-pins.d.ts.map +1 -1
  30. package/dist/migrations/ensure-nightly-e2e-workflow-pins.js +33 -76
  31. package/dist/migrations/ensure-nightly-e2e-workflow-pins.js.map +1 -1
  32. package/dist/migrations/ensure-pinned-reusable-workflow-refs.d.ts +143 -0
  33. package/dist/migrations/ensure-pinned-reusable-workflow-refs.d.ts.map +1 -0
  34. package/dist/migrations/ensure-pinned-reusable-workflow-refs.js +293 -0
  35. package/dist/migrations/ensure-pinned-reusable-workflow-refs.js.map +1 -0
  36. package/dist/migrations/index.d.ts +1 -0
  37. package/dist/migrations/index.d.ts.map +1 -1
  38. package/dist/migrations/index.js +5 -0
  39. package/dist/migrations/index.js.map +1 -1
  40. package/package.json +5 -4
  41. package/plugins/lisa/.claude-plugin/plugin.json +1 -1
  42. package/plugins/lisa/.codex-plugin/plugin.json +1 -1
  43. package/plugins/lisa/.codex-plugin/skills/lisa-drive-pr-to-merge/SKILL.md +27 -0
  44. package/plugins/lisa/.codex-plugin/skills/lisa-git-submit-pr/SKILL.md +16 -0
  45. package/plugins/lisa/skills/lisa-drive-pr-to-merge/SKILL.md +27 -0
  46. package/plugins/lisa/skills/lisa-git-submit-pr/SKILL.md +16 -0
  47. package/plugins/lisa-agy/plugin.json +1 -1
  48. package/plugins/lisa-agy/skills/lisa-drive-pr-to-merge/SKILL.md +27 -0
  49. package/plugins/lisa-agy/skills/lisa-git-submit-pr/SKILL.md +16 -0
  50. package/plugins/lisa-cdk/.claude-plugin/plugin.json +1 -1
  51. package/plugins/lisa-cdk/.codex-plugin/plugin.json +1 -1
  52. package/plugins/lisa-cdk-agy/plugin.json +1 -1
  53. package/plugins/lisa-cdk-copilot/.claude-plugin/plugin.json +1 -1
  54. package/plugins/lisa-cdk-cursor/.claude-plugin/plugin.json +1 -1
  55. package/plugins/lisa-copilot/.claude-plugin/plugin.json +1 -1
  56. package/plugins/lisa-copilot/skills/lisa-drive-pr-to-merge/SKILL.md +27 -0
  57. package/plugins/lisa-copilot/skills/lisa-git-submit-pr/SKILL.md +16 -0
  58. package/plugins/lisa-cursor/.claude-plugin/plugin.json +1 -1
  59. package/plugins/lisa-cursor/skills/lisa-drive-pr-to-merge/SKILL.md +27 -0
  60. package/plugins/lisa-cursor/skills/lisa-git-submit-pr/SKILL.md +16 -0
  61. package/plugins/lisa-expo/.claude-plugin/plugin.json +1 -1
  62. package/plugins/lisa-expo/.codex-plugin/plugin.json +1 -1
  63. package/plugins/lisa-expo-agy/plugin.json +1 -1
  64. package/plugins/lisa-expo-copilot/.claude-plugin/plugin.json +1 -1
  65. package/plugins/lisa-expo-cursor/.claude-plugin/plugin.json +1 -1
  66. package/plugins/lisa-harper-fabric/.claude-plugin/plugin.json +1 -1
  67. package/plugins/lisa-harper-fabric/.codex-plugin/plugin.json +1 -1
  68. package/plugins/lisa-harper-fabric-agy/plugin.json +1 -1
  69. package/plugins/lisa-harper-fabric-copilot/.claude-plugin/plugin.json +1 -1
  70. package/plugins/lisa-harper-fabric-cursor/.claude-plugin/plugin.json +1 -1
  71. package/plugins/lisa-nestjs/.claude-plugin/plugin.json +1 -1
  72. package/plugins/lisa-nestjs/.codex-plugin/plugin.json +1 -1
  73. package/plugins/lisa-nestjs-agy/plugin.json +1 -1
  74. package/plugins/lisa-nestjs-copilot/.claude-plugin/plugin.json +1 -1
  75. package/plugins/lisa-nestjs-cursor/.claude-plugin/plugin.json +1 -1
  76. package/plugins/lisa-openclaw/.claude-plugin/plugin.json +1 -1
  77. package/plugins/lisa-openclaw/.codex-plugin/plugin.json +1 -1
  78. package/plugins/lisa-openclaw-agy/plugin.json +1 -1
  79. package/plugins/lisa-openclaw-copilot/.claude-plugin/plugin.json +1 -1
  80. package/plugins/lisa-openclaw-cursor/.claude-plugin/plugin.json +1 -1
  81. package/plugins/lisa-phaser/.claude-plugin/plugin.json +1 -1
  82. package/plugins/lisa-phaser/.codex-plugin/plugin.json +1 -1
  83. package/plugins/lisa-phaser-agy/plugin.json +1 -1
  84. package/plugins/lisa-phaser-copilot/.claude-plugin/plugin.json +1 -1
  85. package/plugins/lisa-phaser-cursor/.claude-plugin/plugin.json +1 -1
  86. package/plugins/lisa-rails/.claude-plugin/plugin.json +1 -1
  87. package/plugins/lisa-rails/.codex-plugin/plugin.json +1 -1
  88. package/plugins/lisa-rails-agy/plugin.json +1 -1
  89. package/plugins/lisa-rails-copilot/.claude-plugin/plugin.json +1 -1
  90. package/plugins/lisa-rails-cursor/.claude-plugin/plugin.json +1 -1
  91. package/plugins/lisa-typescript/.claude-plugin/plugin.json +1 -1
  92. package/plugins/lisa-typescript/.codex-plugin/plugin.json +1 -1
  93. package/plugins/lisa-typescript-agy/plugin.json +1 -1
  94. package/plugins/lisa-typescript-copilot/.claude-plugin/plugin.json +1 -1
  95. package/plugins/lisa-typescript-cursor/.claude-plugin/plugin.json +1 -1
  96. package/plugins/lisa-wiki/.claude-plugin/plugin.json +1 -1
  97. package/plugins/lisa-wiki/.codex-plugin/plugin.json +1 -1
  98. package/plugins/lisa-wiki-agy/plugin.json +1 -1
  99. package/plugins/lisa-wiki-copilot/.claude-plugin/plugin.json +1 -1
  100. package/plugins/lisa-wiki-cursor/.claude-plugin/plugin.json +1 -1
  101. package/plugins/src/base/skills/lisa-drive-pr-to-merge/SKILL.md +27 -0
  102. package/plugins/src/base/skills/lisa-git-submit-pr/SKILL.md +16 -0
  103. package/scripts/lisa-update-local.sh +1 -0
  104. package/scripts/measure-tmpdir-growth.mjs +24 -3
  105. package/typescript/copy-overwrite/.github/GITHUB_ACTIONS.md +6 -1
  106. package/typescript/copy-overwrite/scripts/check-skipped-required-checks.mjs +370 -4
  107. package/typescript/create-only/.github/workflows/review-evidence.yml +20 -0
@@ -0,0 +1,165 @@
1
+ /**
2
+ * Reading and rewriting the ref a host project's workflow uses to call one of
3
+ * Lisa's reusable workflows.
4
+ *
5
+ * ## What a caller line looks like
6
+ *
7
+ * ```yaml
8
+ * jobs:
9
+ * quality:
10
+ * uses: CodySwannGT/lisa/.github/workflows/quality.yml@<40-char sha> # v4.4.11
11
+ * ```
12
+ *
13
+ * The SHA is what Actions resolves; the trailing comment is what a human
14
+ * reads. Both are written by the pinner, so the comment can never disagree
15
+ * with the pin — a reader who trusts it is right to.
16
+ *
17
+ * ## Why a full SHA and not `@main`
18
+ *
19
+ * `@main` means every host repository executes whatever is on Lisa's default
20
+ * branch at the moment its run starts: not the Lisa the project installed, not
21
+ * the Lisa anyone reviewed, and not the Lisa that was green the last time CI
22
+ * passed. A caller's CI can then change without the caller changing, an old
23
+ * run cannot be reproduced, and the trust boundary moves from "what the pin
24
+ * pointed at when it was reviewed" to "whatever that ref points at later" —
25
+ * the supply-chain hole GitHub's own hardening guidance answers by pinning to
26
+ * a full-length commit SHA.
27
+ *
28
+ * A short SHA is not a substitute. It is ambiguous by construction, and
29
+ * several GitHub APIs in this repository's history have been measured
30
+ * answering `total_count: 0` for a short SHA that had runs at its full form.
31
+ *
32
+ * ## The two failure modes this module has to hold together
33
+ *
34
+ * Pinning trades one silent failure for another, and pretending otherwise is
35
+ * how this decision has already been reversed twice:
36
+ *
37
+ * - **A frozen ref stops receiving fixes** and never goes red. A caller sat
38
+ * on a `@v3.35.0` tag while Lisa shipped 4.x, for months, reporting
39
+ * healthily the whole time. That is what `@main` was reinstated to solve.
40
+ * - **An unreachable ref stops loading.** Actions creates zero jobs, so a
41
+ * required check is ABSENT rather than red and pull requests hang on a
42
+ * verdict that never arrives.
43
+ *
44
+ * The answer to the first is that nothing here is hand-maintained: the pin is
45
+ * rewritten from the installed version's tag every time Lisa is applied, so it
46
+ * moves when the package pin moves and cannot silently fall behind it. The
47
+ * answer to the second is that Lisa's release pipeline refuses to publish a
48
+ * release commit that is reachable from no durable ref, so the SHA a consumer
49
+ * is handed is always a tagged commit rather than a loose one; and if history
50
+ * ever does move under it, the next apply re-derives the pin from the tag and
51
+ * repairs it without anyone noticing it was broken.
52
+ * @module core/reusable-workflow-pin
53
+ */
54
+ /** The repository whose reusable workflows this module governs. */
55
+ export const LISA_REUSABLE_PREFIX = "CodySwannGT/lisa/.github/workflows/";
56
+ /** The only ref shape a caller may carry: a full-length commit SHA. */
57
+ export const FULL_COMMIT_SHA = /^[0-9a-f]{40}$/u;
58
+ /**
59
+ * A job-level `uses:` pointing at a Lisa reusable workflow.
60
+ *
61
+ * Matched as text rather than through a YAML round-trip because these files
62
+ * are human-maintained and dense with explanatory comments that a parse and
63
+ * reserialize would delete. The same technique is used by the sibling
64
+ * workflow migrations for the same reason.
65
+ */
66
+ const USES_LINE = /^(?<lead>[ \t]*uses:[ \t]*)(?<open>["']?)CodySwannGT\/lisa\/\.github\/workflows\/(?<workflow>[A-Za-z0-9._-]+)@(?<ref>[^\s"'#]+)(?<tail>["' \t]*(?:#[^\n]*)?)$/u;
67
+ /**
68
+ * Whether a line is entirely a YAML comment.
69
+ *
70
+ * A commented-out caller is documentation, not a call. Rewriting one would
71
+ * edit prose, and reporting one would raise a finding about a line that
72
+ * invokes nothing.
73
+ * @param line - One line of a workflow file
74
+ * @returns True when the first non-space character is `#`
75
+ */
76
+ function isCommentLine(line) {
77
+ return /^\s*#/u.test(line);
78
+ }
79
+ /**
80
+ * Extract the comment text from the tail of a matched `uses:` line.
81
+ * @param tail - Everything after the ref and its closing quote
82
+ * @returns Comment text without the `#` and surrounding space, or null
83
+ */
84
+ function commentOf(tail) {
85
+ const hash = tail.indexOf("#");
86
+ return hash < 0 ? null : tail.slice(hash + 1).trim();
87
+ }
88
+ /**
89
+ * Every Lisa reusable-workflow caller reference in one workflow file.
90
+ * @param source - Full text of a workflow file
91
+ * @returns One entry per reference, in file order
92
+ */
93
+ export function findReusableWorkflowRefs(source) {
94
+ return source.split("\n").flatMap((line, index) => {
95
+ if (isCommentLine(line))
96
+ return [];
97
+ const groups = USES_LINE.exec(line)?.groups;
98
+ if (groups === undefined)
99
+ return [];
100
+ const { workflow, ref, tail } = groups;
101
+ if (workflow === undefined || ref === undefined)
102
+ return [];
103
+ return [
104
+ {
105
+ line: index + 1,
106
+ workflow,
107
+ ref,
108
+ comment: commentOf(tail ?? ""),
109
+ },
110
+ ];
111
+ });
112
+ }
113
+ /**
114
+ * Whether a reference already carries the exact pin, comment included.
115
+ * @param reference - A parsed caller reference
116
+ * @param pin - The identity every caller must carry
117
+ * @returns True when nothing about this reference needs rewriting
118
+ */
119
+ export function isPinnedAt(reference, pin) {
120
+ return reference.ref === pin.sha && reference.comment === `v${pin.version}`;
121
+ }
122
+ /**
123
+ * Whether a reference names anything other than a full commit SHA.
124
+ *
125
+ * This is the question the reporting surface asks, and it is deliberately NOT
126
+ * "is it the pin I expect": a repository one release behind is current-enough
127
+ * and self-heals on its next apply, while a repository on `@main` never does.
128
+ * @param reference - A parsed caller reference
129
+ * @returns True when the ref is a branch, a tag, or a short SHA
130
+ */
131
+ export function isMutableRef(reference) {
132
+ return !FULL_COMMIT_SHA.test(reference.ref);
133
+ }
134
+ /**
135
+ * Rewrite every Lisa reusable-workflow caller in a file to the given pin.
136
+ *
137
+ * The trailing comment on a caller line is Lisa-owned and is replaced
138
+ * wholesale with `# v<version>`. That is what makes the rewrite idempotent —
139
+ * appending would grow the line on every apply — and what makes the version a
140
+ * reader sees impossible to disagree with the SHA above it.
141
+ *
142
+ * Quoting, indentation, and everything else on the line are preserved.
143
+ * @param source - Full text of a workflow file
144
+ * @param pin - The identity every caller must carry
145
+ * @returns The rewritten text, byte-identical to the input when nothing changed
146
+ */
147
+ export function pinReusableWorkflowRefs(source, pin) {
148
+ return source
149
+ .split("\n")
150
+ .map(line => {
151
+ if (isCommentLine(line))
152
+ return line;
153
+ const groups = USES_LINE.exec(line)?.groups;
154
+ if (groups === undefined)
155
+ return line;
156
+ const { lead, open, workflow } = groups;
157
+ // The closing quote is reconstructed from the opening one rather than
158
+ // captured: YAML quoting is symmetric, and a separate optional-quote
159
+ // group adjacent to a greedy tail is the ambiguity that makes this
160
+ // pattern backtrack super-linearly on a long line.
161
+ return `${lead ?? ""}${open ?? ""}${LISA_REUSABLE_PREFIX}${workflow ?? ""}@${pin.sha}${open ?? ""} # v${pin.version}`;
162
+ })
163
+ .join("\n");
164
+ }
165
+ //# sourceMappingURL=reusable-workflow-pin.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"reusable-workflow-pin.js","sourceRoot":"","sources":["../../src/core/reusable-workflow-pin.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,CAgkFpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAmyQjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,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,CAgkFpE,CAAC;AAEL,4EAA4E;AAC5E,eAAO,MAAM,yBAAyB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CA4yQjE,CAAC;AAEL,sFAAsF;AACtF,eAAO,MAAM,uBAAuB,EAAE,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC,CAk6I/D,CAAC"}
@@ -5,7 +5,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
5
5
  "all/copy-contents/gitignore": "66e105ae1b6874e6c587d128a04ff5a5005bf923759fc41cc31d73b9ba44bacf",
6
6
  "all/copy-overwrite/scripts/check-conflict-markers.mjs": "d7a689bcc122af7f38d1c536924fc2f3dcb503b09658ffc6035ccbe720d14d6b",
7
7
  "all/copy-overwrite/scripts/check-npm-publish-landed.mjs": "bba6114e5e4643575749210819acfda207260ac1db5fcb48c33c320c3a9503ca",
8
- "all/copy-overwrite/scripts/check-orphaned-branches.mjs": "b2a63c522fdc99dd7b89707fd734da9d1cb534bc9a505589c503f2576ac3e39b",
8
+ "all/copy-overwrite/scripts/check-orphaned-branches.mjs": "857b923b3fb19db9755e5a62e54ad14a33862a17051bc63ec65563c1295713c3",
9
9
  "all/copy-overwrite/scripts/check-release-package-identity.mjs": "a0f17592d4436de4c240f7c78512537581aa2ed5e89f0caf1fe890694163a873",
10
10
  "all/copy-overwrite/scripts/check-state-classification.mjs": "a72910f9885629dd6d8a739b900f5603e4b53d68ece64100a2a5647016b58e1e",
11
11
  "all/copy-overwrite/scripts/check-third-party-action-pins.mjs": "9f441b6b8697f0a64abd29125eb7881ebdb0c8d47487bdd18ff09633eb3dab19",
@@ -576,7 +576,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
576
576
  "plugins/src/base/skills/lisa-detect-tooling/scripts/commands.mjs": "e28bd61fdde4a336b56ae3395423026943a5816015719d31d04f0d5a0ab50eec",
577
577
  "plugins/src/base/skills/lisa-detect-tooling/scripts/detect-tooling.mjs": "d9419814fc04c935bd7e320e85b1977c9bfc9275d9ea5fb557002ad438ee7925",
578
578
  "plugins/src/base/skills/lisa-doctor/SKILL.md": "ab7bb855fd3ebe321e41b0143815f202b70f6ba38f6678791d6d9e933e0c3fd8",
579
- "plugins/src/base/skills/lisa-drive-pr-to-merge/SKILL.md": "7a0b633393b6c3f607019db8417c224209321cc49bf75849c77124b5c27482a0",
579
+ "plugins/src/base/skills/lisa-drive-pr-to-merge/SKILL.md": "76b7df5e37ca70d2b48401325974f45d4a89ec2f3a7103cabecc6bdf0f05e08c",
580
580
  "plugins/src/base/skills/lisa-epic-triage/SKILL.md": "d02760411249bddbd396f283191fe3e82bb7b95bf9393a19a7025dc5a57c3ab7",
581
581
  "plugins/src/base/skills/lisa-evaluation-suite/SKILL.md": "96b5c2091ccd22a565935a7b0b917f67998881b81055ce3e4d518319472eac8b",
582
582
  "plugins/src/base/skills/lisa-exploratory-qa/SKILL.md": "562b80ea0be5ffb1087386495a380bfb5808a1da4c08a7e253c5229d747bc5c7",
@@ -584,7 +584,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
584
584
  "plugins/src/base/skills/lisa-generate-claude-remote-build-script/SKILL.md": "9ae66050b046b3d5bcf4acb582928cb56f295d4d869b712e85b6e0717b67dc7b",
585
585
  "plugins/src/base/skills/lisa-git-commit/SKILL.md": "56320566e9278fb43b4d51c00854f3714dc61edc960292d51962a6f49116ac0f",
586
586
  "plugins/src/base/skills/lisa-git-prune/SKILL.md": "11fad06d109538f1a8ee4ef8043bb0e083672e3c9a7cb7ae8a7233c5411d6dd2",
587
- "plugins/src/base/skills/lisa-git-submit-pr/SKILL.md": "71165d6df755c55532ca41703374d384ccf06a6cad1ddeeb76846d716b30d7bb",
587
+ "plugins/src/base/skills/lisa-git-submit-pr/SKILL.md": "7847ee39ea3a14445fbf1d459e3cd7d93ed67dcdcf8b6f161ca64bb307233245",
588
588
  "plugins/src/base/skills/lisa-github-add-journey/SKILL.md": "4ceda3474a9b32abae835c2676e8cb2b7e888c6ba04b95843dbe7254293bbf32",
589
589
  "plugins/src/base/skills/lisa-github-build-intake/SKILL.md": "48ecd7ed8fb69b2023ae87f04cc48963bbc67aec5a8d92d5021d39d83e33f305",
590
590
  "plugins/src/base/skills/lisa-github-claim/SKILL.md": "71301c6d45d7eb5523e74aa7f070bb2becf57ca68fb8bde9e02ee937b78815f7",
@@ -1210,10 +1210,10 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
1210
1210
  "scripts/lisa-remote-env/setup.sh": "803ceee995da51503202458a24b4f5bd80ace8c779d0c782bf1197c36e1ebe91",
1211
1211
  "scripts/lisa-ruleset-payload.mjs": "3e10b5a4c113e3aa895c6a09f063045eb198dbdabb11a00be87bea1477c91fbb",
1212
1212
  "scripts/lisa-ruleset-reach.mjs": "e51b12092062379e7317b368c89a789e2067ec302388e557ea84a29a35ffc238",
1213
- "scripts/lisa-update-local.sh": "c811f9e10dbcb38499a9791c1ae9051460b347051d04a1d2046925bab9a53c96",
1213
+ "scripts/lisa-update-local.sh": "eb031a6bb4735e5096ac52efc3ef027233485c86524a83cd7f258d0b6f7b985b",
1214
1214
  "scripts/lisa-work-item.mjs": "51081847e980f314a764c2e50a7a121b1ced9ef4b980f33898057de4c7b852e6",
1215
1215
  "scripts/materialize-copy-overwrite.mjs": "f510944db5b234131cb659b8780f571b460f8052a854131aa27558d73e126f36",
1216
- "scripts/measure-tmpdir-growth.mjs": "ee8c3464fb529061eeacfe67844828b983f7f53785c3f4eba50e6c20c8efb431",
1216
+ "scripts/measure-tmpdir-growth.mjs": "aa2f336fdb9592e4b7bda1a676d0915ba259e66a06081622a7e724604219d56b",
1217
1217
  "scripts/merge-generated-artifact.mjs": "d5abe45efb47732aa59da587f2ccfc9c2290b113a2bcab8b305ff46ab39c273e",
1218
1218
  "scripts/mutation-performance-measure.mjs": "0dc9719648ae7a94ccad57587cef8cd03e8d38bbc33d47c1863b503a7d8350c6",
1219
1219
  "scripts/mutation-performance.schema.json": "b99a447bb5b3ff73b22d2a1539a0effedadaa5fc08e546f988f5c4e9e5682499",
@@ -1249,7 +1249,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
1249
1249
  "typescript/copy-contents/.husky/pre-push": "e73dde7a1dcb3c10be5db540b9d9f46ec74b90ecc10a850b4fb098481ef6de6e",
1250
1250
  "typescript/copy-contents/.husky/prepare-commit-msg": "4a719c20da65653f266e7c8a346b5546ad05f1dfa34665fc7fec47e89d2f58d1",
1251
1251
  "typescript/copy-overwrite/.claude/hooks/worktree-create.sh": "888cfd16bd1ac04f9f8a835eae62f8bd2c956de654bce12ce9a6a52947b121ca",
1252
- "typescript/copy-overwrite/.github/GITHUB_ACTIONS.md": "3f5d8e7f5f2c8ec1d369359f2ee64c033736df4bc172d06da1b4be5ee65b173b",
1252
+ "typescript/copy-overwrite/.github/GITHUB_ACTIONS.md": "4289146bae8e112049387d4be86941c563b02376a06f0238364aaf3e61c2b127",
1253
1253
  "typescript/copy-overwrite/.lintstagedrc.json": "60bf2d5e86bf9d72f04b8b14368591f104674ff80046fe8bd82e4174ca1523fd",
1254
1254
  "typescript/copy-overwrite/.nvmrc": "0775c6feb7638122e8b68d611cd709bf270f7b5adb5d0d2baa9afab8a6c0fc42",
1255
1255
  "typescript/copy-overwrite/.prettierignore": "b3b3910fbea6fb918cb213935d3a7a356d0d5d554dd9aca66fb1beb672124d30",
@@ -1270,7 +1270,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
1270
1270
  "typescript/copy-overwrite/eslint.slow.config.ts": "9f0efef2d1012e21a1d5e03eb98634bfeb459e3427147d75ad6905acbbab8466",
1271
1271
  "typescript/copy-overwrite/knip.json": "d557bfb64c8c23d9f03c173798aa1f176f5e28d395ad6667f855049d4b886db6",
1272
1272
  "typescript/copy-overwrite/scripts/check-nightly-e2e-health.mjs": "dfd2fef680de5ef03e63075e8a61c62ca4d95cdfdff6201939b79c748d3397f6",
1273
- "typescript/copy-overwrite/scripts/check-skipped-required-checks.mjs": "b0fd287c90182cc0d2f0c29281bc88020cef441a6449c15a99b1c85ea2ed3205",
1273
+ "typescript/copy-overwrite/scripts/check-skipped-required-checks.mjs": "ad97de4cea9ca61b10d637ef093e1697e434942d14d92e3e59955b9a81304a4c",
1274
1274
  "typescript/copy-overwrite/scripts/check-threshold-ratchet.mjs": "47bc8b91e38535e694f43d9d3b76c4589ae2796e4ce9e875ab6b09a273e0c93a",
1275
1275
  "typescript/copy-overwrite/scripts/check-verification-coverage.mjs": "777e46c8e8147935f0b944dc21536f6238b26b5b7dca06c5fdb2d2898a9790dc",
1276
1276
  "typescript/copy-overwrite/scripts/lib/bounded-spawn.mjs": "72e277ada531914d7bc51c3cb8dc67b8881aa817d96fa2f9f4d81668a3d3bbc1",
@@ -1292,7 +1292,7 @@ export const UPSTREAM_EVIDENCE_MANIFEST = Object.freeze({
1292
1292
  "typescript/copy-overwrite/vitest.config.ts": "dc140e617db43da38f456bcc909ae621a62996fe25e7b0babd5e81941308365c",
1293
1293
  "typescript/create-only/.github/required-checks.json": "01f5b7d8587adc21e85f525b57ac04a8143427459d95b48b616216eca54a73df",
1294
1294
  "typescript/create-only/.github/workflows/ci.yml": "409799708fe51716f3c8228950db3bb26864f43a01a9e6186f6d3d1970e29f2d",
1295
- "typescript/create-only/.github/workflows/review-evidence.yml": "9111a7cc14f7fcab5b7db374933536b01b4a651d14b069321c14c428145809a7",
1295
+ "typescript/create-only/.github/workflows/review-evidence.yml": "62a115d54c084c64d067825daf869f737e1c25dfd2a6e8b3a9df284d069229a6",
1296
1296
  "typescript/create-only/.github/workflows/third-party-review-evidence.yml": "8f1a3b04fa483c59ac4513a2d16eabf4a3e3bba447a562734b1f35fba2552769",
1297
1297
  "typescript/create-only/.gitleaksignore": "6927d376648675331801c798a4390b652a22a3e5d350cd26f36d42c10af02d67",
1298
1298
  "typescript/create-only/audit.ignore.local.json": "096eba7c600446a2f906369a6ff747804a51b9ad3153ca10d9a1d673e416b337",
@@ -7755,6 +7755,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7755
7755
  "src/core/lisa-owned-provenance.ts": true,
7756
7756
  "src/core/lisa-owned-templates.ts": true,
7757
7757
  "src/core/lisa-plugin-selection.ts": true,
7758
+ "src/core/lisa-release-pin.ts": true,
7758
7759
  "src/core/lisa-rules-mirror.ts": true,
7759
7760
  "src/core/lisa-skill-sources.ts": true,
7760
7761
  "src/core/lisa.ts": true,
@@ -7767,6 +7768,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7767
7768
  "src/core/project-config-nightly-e2e.ts": true,
7768
7769
  "src/core/project-config.ts": true,
7769
7770
  "src/core/reconciliation-report.ts": true,
7771
+ "src/core/reusable-workflow-pin.ts": true,
7770
7772
  "src/core/safe-relative-markdown-path.ts": true,
7771
7773
  "src/core/self-apply.ts": true,
7772
7774
  "src/core/sonar-integration.ts": true,
@@ -7824,6 +7826,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
7824
7826
  "src/migrations/ensure-lisa-postinstall.ts": true,
7825
7827
  "src/migrations/ensure-nightly-e2e-workflow-pins.ts": true,
7826
7828
  "src/migrations/ensure-oxlint-base-configs.ts": true,
7829
+ "src/migrations/ensure-pinned-reusable-workflow-refs.ts": true,
7827
7830
  "src/migrations/ensure-playwright-dedicated-caller.ts": true,
7828
7831
  "src/migrations/ensure-push-default-safe.ts": true,
7829
7832
  "src/migrations/ensure-quality-caller-scopes.ts": true,
@@ -8105,6 +8108,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
8105
8108
  "tests/helpers/test-run-module-closure.ts": true,
8106
8109
  "tests/helpers/test-run-supervision-analyzer.ts": true,
8107
8110
  "tests/helpers/test-utils.ts": true,
8111
+ "tests/helpers/tmpdir-growth-cap-boundary.ts": true,
8108
8112
  "tests/helpers/tmpdir-growth-command-harness.ts": true,
8109
8113
  "tests/helpers/tmpdir-growth-darwin-performance.ts": true,
8110
8114
  "tests/helpers/tmpdir-growth-performance-types.ts": true,
@@ -8115,6 +8119,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
8115
8119
  "tests/helpers/verification-gate-harness.ts": true,
8116
8120
  "tests/helpers/workflow-job-graph.ts": true,
8117
8121
  "tests/helpers/workflow-test-utils.ts": true,
8122
+ "tests/integration/applied-project-pins-lisa-workflows.test.ts": true,
8118
8123
  "tests/integration/apply-prompted-guard-downgrade.test.ts": true,
8119
8124
  "tests/integration/apply-reports-unchanged-manifest.test.ts": true,
8120
8125
  "tests/integration/apply-unattended-preserves-host-config.test.ts": true,
@@ -8618,6 +8623,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
8618
8623
  "tests/unit/core/lisa-owned-templates-classification.test.ts": true,
8619
8624
  "tests/unit/core/lisa-owned-templates.test.ts": true,
8620
8625
  "tests/unit/core/lisa-plugin-selection.test.ts": true,
8626
+ "tests/unit/core/lisa-release-pin.test.ts": true,
8621
8627
  "tests/unit/core/lisa-skill-sources.test.ts": true,
8622
8628
  "tests/unit/core/nightly-e2e-pull-request-triggers.test.ts": true,
8623
8629
  "tests/unit/core/no-downstream-project-names.test.ts": true,
@@ -8631,6 +8637,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
8631
8637
  "tests/unit/core/project-config-nightly-e2e-default.test.ts": true,
8632
8638
  "tests/unit/core/project-config-nightly-e2e.test.ts": true,
8633
8639
  "tests/unit/core/project-config.test.ts": true,
8640
+ "tests/unit/core/reusable-workflow-pin.test.ts": true,
8634
8641
  "tests/unit/core/role-agent-template-contract.test.ts": true,
8635
8642
  "tests/unit/core/self-apply.test.ts": true,
8636
8643
  "tests/unit/core/skill-frontmatter-contract.test.ts": true,
@@ -8786,6 +8793,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
8786
8793
  "tests/unit/migrations/ensure-lisa-postinstall.test.ts": true,
8787
8794
  "tests/unit/migrations/ensure-nightly-e2e-workflow-pins.test.ts": true,
8788
8795
  "tests/unit/migrations/ensure-oxlint-base-configs.test.ts": true,
8796
+ "tests/unit/migrations/ensure-pinned-reusable-workflow-refs.test.ts": true,
8789
8797
  "tests/unit/migrations/ensure-playwright-dedicated-caller.test.ts": true,
8790
8798
  "tests/unit/migrations/ensure-push-default-safe.test.ts": true,
8791
8799
  "tests/unit/migrations/ensure-quality-caller-scopes.test.ts": true,
@@ -8974,6 +8982,7 @@ export const UPSTREAM_SURFACE_MANIFEST = Object.freeze({
8974
8982
  "tests/unit/scripts/maestro-flake-classification.test.ts": true,
8975
8983
  "tests/unit/scripts/maestro-flake-helpers.ts": true,
8976
8984
  "tests/unit/scripts/maestro-intermittent-registry.test.ts": true,
8985
+ "tests/unit/scripts/measure-tmpdir-growth-performance.test.ts": true,
8977
8986
  "tests/unit/scripts/measure-tmpdir-growth.test.ts": true,
8978
8987
  "tests/unit/scripts/merge-driver-registration.test.ts": true,
8979
8988
  "tests/unit/scripts/merge-generated-artifact-derived-entries.test.ts": true,