@cleocode/core 2026.10.6 → 2026.10.7-rc.ci.674

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 (242) hide show
  1. package/dist/build-provenance.json +2 -2
  2. package/dist/cloud/http.d.ts +8 -0
  3. package/dist/cloud/http.d.ts.map +1 -1
  4. package/dist/cloud/http.js +11 -0
  5. package/dist/cloud/http.js.map +1 -1
  6. package/dist/cloud/journal.d.ts +6 -0
  7. package/dist/cloud/journal.d.ts.map +1 -1
  8. package/dist/cloud/journal.js +1 -1
  9. package/dist/cloud/journal.js.map +1 -1
  10. package/dist/cloud/nexus-cloud-status.d.ts.map +1 -1
  11. package/dist/cloud/nexus-cloud-status.js +3 -1
  12. package/dist/cloud/nexus-cloud-status.js.map +1 -1
  13. package/dist/cloud/nexus-vault.d.ts +86 -1
  14. package/dist/cloud/nexus-vault.d.ts.map +1 -1
  15. package/dist/cloud/nexus-vault.js +875 -98
  16. package/dist/cloud/nexus-vault.js.map +1 -1
  17. package/dist/docs/doctor.d.ts +183 -0
  18. package/dist/docs/doctor.d.ts.map +1 -0
  19. package/dist/docs/doctor.js +537 -0
  20. package/dist/docs/doctor.js.map +1 -0
  21. package/dist/doctor/system-health.d.ts +189 -0
  22. package/dist/doctor/system-health.d.ts.map +1 -0
  23. package/dist/doctor/system-health.js +783 -0
  24. package/dist/doctor/system-health.js.map +1 -0
  25. package/dist/git/hooks-install.d.ts +17 -34
  26. package/dist/git/hooks-install.d.ts.map +1 -1
  27. package/dist/git/hooks-install.js +173 -70
  28. package/dist/git/hooks-install.js.map +1 -1
  29. package/dist/harness/ask-enforce.d.ts +43 -0
  30. package/dist/harness/ask-enforce.d.ts.map +1 -0
  31. package/dist/harness/ask-enforce.js +165 -0
  32. package/dist/harness/ask-enforce.js.map +1 -0
  33. package/dist/hooks.d.ts +8 -30
  34. package/dist/hooks.d.ts.map +1 -1
  35. package/dist/hooks.js +36 -116
  36. package/dist/hooks.js.map +1 -1
  37. package/dist/init.d.ts +2 -1
  38. package/dist/init.d.ts.map +1 -1
  39. package/dist/init.js +5 -14
  40. package/dist/init.js.map +1 -1
  41. package/dist/injection.d.ts +2 -2
  42. package/dist/injection.d.ts.map +1 -1
  43. package/dist/injection.js +108 -10
  44. package/dist/injection.js.map +1 -1
  45. package/dist/internal.d.ts +1 -1
  46. package/dist/internal.d.ts.map +1 -1
  47. package/dist/internal.js +1 -1
  48. package/dist/internal.js.map +1 -1
  49. package/dist/issue/create.d.ts +4 -0
  50. package/dist/issue/create.d.ts.map +1 -1
  51. package/dist/issue/create.js +12 -0
  52. package/dist/issue/create.js.map +1 -1
  53. package/dist/issue/index.d.ts +1 -1
  54. package/dist/issue/index.d.ts.map +1 -1
  55. package/dist/issue/index.js +1 -1
  56. package/dist/issue/index.js.map +1 -1
  57. package/dist/orchestrate/spawn-ops.d.ts.map +1 -1
  58. package/dist/orchestrate/spawn-ops.js +8 -2
  59. package/dist/orchestrate/spawn-ops.js.map +1 -1
  60. package/dist/orchestration/lean-change.d.ts +15 -0
  61. package/dist/orchestration/lean-change.d.ts.map +1 -0
  62. package/dist/orchestration/lean-change.js +17 -0
  63. package/dist/orchestration/lean-change.js.map +1 -0
  64. package/dist/orchestration/spawn-prompt.d.ts.map +1 -1
  65. package/dist/orchestration/spawn-prompt.js +6 -4
  66. package/dist/orchestration/spawn-prompt.js.map +1 -1
  67. package/dist/release/ci-evidence.d.ts +59 -0
  68. package/dist/release/ci-evidence.d.ts.map +1 -1
  69. package/dist/release/ci-evidence.js +150 -5
  70. package/dist/release/ci-evidence.js.map +1 -1
  71. package/dist/release/plan.d.ts.map +1 -1
  72. package/dist/release/plan.js +11 -2
  73. package/dist/release/plan.js.map +1 -1
  74. package/dist/release/pr-evidence.d.ts +15 -0
  75. package/dist/release/pr-evidence.d.ts.map +1 -1
  76. package/dist/release/pr-evidence.js +42 -1
  77. package/dist/release/pr-evidence.js.map +1 -1
  78. package/dist/release/reconcile.js +2 -2
  79. package/dist/release/reconcile.js.map +1 -1
  80. package/dist/release/verify-provenance.js +2 -2
  81. package/dist/release/verify-provenance.js.map +1 -1
  82. package/dist/resources/admission-ledger.d.ts +8 -0
  83. package/dist/resources/admission-ledger.d.ts.map +1 -1
  84. package/dist/resources/admission-ledger.js +5 -0
  85. package/dist/resources/admission-ledger.js.map +1 -1
  86. package/dist/resources/claim-keepalive.d.ts +34 -0
  87. package/dist/resources/claim-keepalive.d.ts.map +1 -0
  88. package/dist/resources/claim-keepalive.js +49 -0
  89. package/dist/resources/claim-keepalive.js.map +1 -0
  90. package/dist/resources/governor.d.ts.map +1 -1
  91. package/dist/resources/governor.js +3 -0
  92. package/dist/resources/governor.js.map +1 -1
  93. package/dist/scaffold/ensure-config.js +1 -1
  94. package/dist/scaffold/ensure-config.js.map +1 -1
  95. package/dist/store/attachment-store.d.ts.map +1 -1
  96. package/dist/store/attachment-store.js +2 -1
  97. package/dist/store/attachment-store.js.map +1 -1
  98. package/dist/store/restore-marker.d.ts +50 -7
  99. package/dist/store/restore-marker.d.ts.map +1 -1
  100. package/dist/store/restore-marker.js +77 -25
  101. package/dist/store/restore-marker.js.map +1 -1
  102. package/dist/store/row-identity-registry.d.ts +6 -4
  103. package/dist/store/row-identity-registry.d.ts.map +1 -1
  104. package/dist/store/row-identity-registry.js +156 -33
  105. package/dist/store/row-identity-registry.js.map +1 -1
  106. package/dist/store/schema/cleo-project/provenance-orphans.d.ts +16 -0
  107. package/dist/store/schema/cleo-project/provenance-orphans.d.ts.map +1 -1
  108. package/dist/store/schema/cleo-project/provenance-orphans.js +4 -1
  109. package/dist/store/schema/cleo-project/provenance-orphans.js.map +1 -1
  110. package/dist/store/schema/cleo-shared/brain.d.ts +240 -0
  111. package/dist/store/schema/cleo-shared/brain.d.ts.map +1 -1
  112. package/dist/store/schema/cleo-shared/brain.js +69 -0
  113. package/dist/store/schema/cleo-shared/brain.js.map +1 -1
  114. package/dist/store/schema/tasks.d.ts +1 -1
  115. package/dist/store/schema/tasks.d.ts.map +1 -1
  116. package/dist/store/schema/tasks.js +9 -1
  117. package/dist/store/schema/tasks.js.map +1 -1
  118. package/dist/store/sync/apply/applier.d.ts.map +1 -1
  119. package/dist/store/sync/apply/applier.js +85 -3
  120. package/dist/store/sync/apply/applier.js.map +1 -1
  121. package/dist/store/sync/apply/parent-delete.d.ts.map +1 -1
  122. package/dist/store/sync/apply/parent-delete.js +4 -0
  123. package/dist/store/sync/apply/parent-delete.js.map +1 -1
  124. package/dist/store/sync/capture.d.ts +8 -0
  125. package/dist/store/sync/capture.d.ts.map +1 -1
  126. package/dist/store/sync/capture.js +20 -0
  127. package/dist/store/sync/capture.js.map +1 -1
  128. package/dist/store/sync/clock-store.d.ts +21 -0
  129. package/dist/store/sync/clock-store.d.ts.map +1 -1
  130. package/dist/store/sync/clock-store.js +47 -0
  131. package/dist/store/sync/clock-store.js.map +1 -1
  132. package/dist/store/sync/conflicts.d.ts +13 -0
  133. package/dist/store/sync/conflicts.d.ts.map +1 -1
  134. package/dist/store/sync/conflicts.js +22 -0
  135. package/dist/store/sync/conflicts.js.map +1 -1
  136. package/dist/store/sync/genesis.d.ts +113 -12
  137. package/dist/store/sync/genesis.d.ts.map +1 -1
  138. package/dist/store/sync/genesis.js +325 -27
  139. package/dist/store/sync/genesis.js.map +1 -1
  140. package/dist/store/sync/merge/types.d.ts +8 -2
  141. package/dist/store/sync/merge/types.d.ts.map +1 -1
  142. package/dist/store/sync/pull.d.ts +192 -0
  143. package/dist/store/sync/pull.d.ts.map +1 -0
  144. package/dist/store/sync/pull.js +429 -0
  145. package/dist/store/sync/pull.js.map +1 -0
  146. package/dist/store/sync/push.d.ts +110 -0
  147. package/dist/store/sync/push.d.ts.map +1 -0
  148. package/dist/store/sync/push.js +172 -0
  149. package/dist/store/sync/push.js.map +1 -0
  150. package/dist/store/sync/replay-pin.d.ts +70 -0
  151. package/dist/store/sync/replay-pin.d.ts.map +1 -0
  152. package/dist/store/sync/replay-pin.js +172 -0
  153. package/dist/store/sync/replay-pin.js.map +1 -0
  154. package/dist/store/sync/sealer.d.ts.map +1 -1
  155. package/dist/store/sync/sealer.js +6 -2
  156. package/dist/store/sync/sealer.js.map +1 -1
  157. package/dist/store/sync/timestamp-canon.d.ts.map +1 -1
  158. package/dist/store/sync/timestamp-canon.js +15 -0
  159. package/dist/store/sync/timestamp-canon.js.map +1 -1
  160. package/dist/store/table-classification.d.ts.map +1 -1
  161. package/dist/store/table-classification.js +51 -15
  162. package/dist/store/table-classification.js.map +1 -1
  163. package/dist/store/tasks-schema.d.ts +1 -1
  164. package/dist/store/tasks-schema.d.ts.map +1 -1
  165. package/dist/store/tasks-schema.js +1 -1
  166. package/dist/store/tasks-schema.js.map +1 -1
  167. package/dist/store/twin-collapse.d.ts.map +1 -1
  168. package/dist/store/twin-collapse.js +5 -0
  169. package/dist/store/twin-collapse.js.map +1 -1
  170. package/dist/store/vault-manifest.d.ts +7 -0
  171. package/dist/store/vault-manifest.d.ts.map +1 -1
  172. package/dist/store/vault-manifest.js +4 -0
  173. package/dist/store/vault-manifest.js.map +1 -1
  174. package/dist/tasks/ac-table.d.ts +17 -0
  175. package/dist/tasks/ac-table.d.ts.map +1 -1
  176. package/dist/tasks/ac-table.js +49 -0
  177. package/dist/tasks/ac-table.js.map +1 -1
  178. package/dist/tasks/affected-scope.d.ts +52 -3
  179. package/dist/tasks/affected-scope.d.ts.map +1 -1
  180. package/dist/tasks/affected-scope.js +94 -3
  181. package/dist/tasks/affected-scope.js.map +1 -1
  182. package/dist/tasks/change-set.d.ts.map +1 -1
  183. package/dist/tasks/change-set.js +9 -5
  184. package/dist/tasks/change-set.js.map +1 -1
  185. package/dist/tasks/complete-ci.d.ts +2 -0
  186. package/dist/tasks/complete-ci.d.ts.map +1 -1
  187. package/dist/tasks/complete-ci.js +26 -7
  188. package/dist/tasks/complete-ci.js.map +1 -1
  189. package/dist/tasks/complete.d.ts.map +1 -1
  190. package/dist/tasks/complete.js +10 -0
  191. package/dist/tasks/complete.js.map +1 -1
  192. package/dist/tasks/done-plan.d.ts.map +1 -1
  193. package/dist/tasks/done-plan.js +63 -6
  194. package/dist/tasks/done-plan.js.map +1 -1
  195. package/dist/tasks/evidence.d.ts +3 -0
  196. package/dist/tasks/evidence.d.ts.map +1 -1
  197. package/dist/tasks/evidence.js +106 -2
  198. package/dist/tasks/evidence.js.map +1 -1
  199. package/dist/tasks/gate-preview.d.ts +19 -1
  200. package/dist/tasks/gate-preview.d.ts.map +1 -1
  201. package/dist/tasks/gate-preview.js +44 -2
  202. package/dist/tasks/gate-preview.js.map +1 -1
  203. package/dist/tasks/gate-runner.d.ts +16 -0
  204. package/dist/tasks/gate-runner.d.ts.map +1 -1
  205. package/dist/tasks/gate-runner.js +25 -2
  206. package/dist/tasks/gate-runner.js.map +1 -1
  207. package/dist/tasks/qa-run-binding.d.ts +88 -0
  208. package/dist/tasks/qa-run-binding.d.ts.map +1 -0
  209. package/dist/tasks/qa-run-binding.js +188 -0
  210. package/dist/tasks/qa-run-binding.js.map +1 -0
  211. package/dist/tasks/req.d.ts +50 -0
  212. package/dist/tasks/req.d.ts.map +1 -1
  213. package/dist/tasks/req.js +99 -1
  214. package/dist/tasks/req.js.map +1 -1
  215. package/dist/tasks/test-run-binding.d.ts +29 -0
  216. package/dist/tasks/test-run-binding.d.ts.map +1 -1
  217. package/dist/tasks/test-run-binding.js +47 -23
  218. package/dist/tasks/test-run-binding.js.map +1 -1
  219. package/dist/tasks/tool-resolver.d.ts +9 -0
  220. package/dist/tasks/tool-resolver.d.ts.map +1 -1
  221. package/dist/tasks/tool-resolver.js +14 -3
  222. package/dist/tasks/tool-resolver.js.map +1 -1
  223. package/dist/tasks/tool-semaphore.d.ts.map +1 -1
  224. package/dist/tasks/tool-semaphore.js +3 -0
  225. package/dist/tasks/tool-semaphore.js.map +1 -1
  226. package/dist/upgrade.d.ts.map +1 -1
  227. package/dist/upgrade.js +10 -1
  228. package/dist/upgrade.js.map +1 -1
  229. package/dist/validation/engine-ops.d.ts.map +1 -1
  230. package/dist/validation/engine-ops.js +14 -3
  231. package/dist/validation/engine-ops.js.map +1 -1
  232. package/migrations/drizzle-cleo-global/20261010130000_t12895-brain-natural-uids/migration.sql +28 -0
  233. package/migrations/drizzle-cleo-global/20261010140000_t12896-brain-autoinc-uids/migration.sql +54 -0
  234. package/migrations/drizzle-cleo-project/20261010130000_t12895-brain-natural-uids/migration.sql +36 -0
  235. package/migrations/drizzle-cleo-project/20261010140000_t12896-brain-autoinc-uids/migration.sql +58 -0
  236. package/migrations/sync-journal/20261008120000_t12343-pull-cursor/migration.sql +28 -0
  237. package/migrations/sync-journal/20261009120000_t13318-seen-floor/migration.sql +41 -0
  238. package/package.json +18 -18
  239. package/templates/CLEO-INJECTION.md +5 -3
  240. package/templates/CLEO-REFERENCE.md +1 -1
  241. package/templates/git-hooks/legacy-hashes.json +20 -0
  242. package/templates/git-hooks/pre-commit +1 -0
@@ -0,0 +1,188 @@
1
+ /**
2
+ * Binding a `qa-run:` receipt — a recorded native typecheck or lint run — to
3
+ * the change it claims to check (T13427, design note
4
+ * `t13427-qa-run-binding-design`, owner decision option 1).
5
+ *
6
+ * What a bound atom guarantees, exactly:
7
+ * 1. **Result.** The receipt states exit code 0 and zero error diagnostics.
8
+ * 2. **Freshness.** The same clock as `test-run:` ({@link reportFreshness}):
9
+ * the run is not older than the change's commits, edits or deletions.
10
+ * 3. **Coverage.** Every changed code path (evidence-scoped, docs ignored)
11
+ * lies under one of the receipt's `roots`; in a workspace, every package
12
+ * that depends on a changed package is covered by a root at or above its
13
+ * directory, since a type change breaks importers. A workspace-wide change
14
+ * (a path outside every package) is refused: only a whole-project run
15
+ * speaks for it.
16
+ * 4. **Identity.** HEAD and the tool-cache tree hash are recorded by the
17
+ * validator; `cleo complete` refuses the atom once the tree moves, unless
18
+ * merged CI carries the gate.
19
+ *
20
+ * With no origin default branch to diff against (no merge base), nothing is
21
+ * judged beyond the result: the receipt binds with no coverage check, as a
22
+ * `test-run:` report does there.
23
+ *
24
+ * It does NOT prove the run happened (a receipt is a file the caller
25
+ * supplies), and a scoped typecheck does not see unchanged files outside its
26
+ * roots that import a changed export. Merged CI (`ci:<pr>`) or a whole-project
27
+ * `tool:typecheck` speaks for the whole program.
28
+ *
29
+ * @task T13427
30
+ */
31
+ import { isAbsolute } from 'node:path';
32
+ import { isCiDocumentPath } from '../release/ci-evidence.js';
33
+ import { deriveAffectedPackages, inPackageDir, listWorkspacePackages, } from './affected-packages.js';
34
+ import { reportFreshness } from './test-run-binding.js';
35
+ /** The QA checks a receipt can record: one of each satisfies `qaPassed`. */
36
+ export const QA_RUN_KINDS = ['typecheck', 'lint'];
37
+ /** Example shape, named in every refusal. */
38
+ export const QA_RUN_SHAPE_HINT = '{"kind":"typecheck"|"lint","command":["tsc","--noEmit",…],"exitCode":0,' +
39
+ '"diagnostics":{"errors":0},"roots":["src/a"],"startTime":<epoch ms>}';
40
+ /** A root as the binding compares it: slash-separated, no `./`, no trailing `/`; `.` is `''`. */
41
+ function normaliseRoot(root) {
42
+ const slashed = root.replace(/\\/g, '/').replace(/^\.\//, '').replace(/\/+$/, '');
43
+ return slashed === '.' ? '' : slashed;
44
+ }
45
+ /**
46
+ * Validate a parsed receipt's shape and result.
47
+ *
48
+ * @param raw - The parsed JSON.
49
+ * @returns The receipt, or the refusal.
50
+ * @task T13427
51
+ */
52
+ export function parseQaRunReceipt(raw) {
53
+ const invalid = (reason) => ({
54
+ ok: false,
55
+ codeName: 'E_EVIDENCE_INVALID',
56
+ reason: `${reason}. Expected: ${QA_RUN_SHAPE_HINT}`,
57
+ });
58
+ if (raw === null || typeof raw !== 'object' || Array.isArray(raw)) {
59
+ return invalid('qa-run receipt is not a JSON object');
60
+ }
61
+ const r = raw;
62
+ const kind = r['kind'];
63
+ if (kind !== 'typecheck' && kind !== 'lint') {
64
+ return invalid(`qa-run receipt's "kind" is ${JSON.stringify(kind)}; it must be "typecheck" or "lint"`);
65
+ }
66
+ const command = r['command'];
67
+ if (!Array.isArray(command) ||
68
+ command.length === 0 ||
69
+ !command.every((w) => typeof w === 'string' && w !== '')) {
70
+ return invalid('qa-run receipt\'s "command" must be a non-empty array of strings');
71
+ }
72
+ const exitCode = r['exitCode'];
73
+ if (typeof exitCode !== 'number' || !Number.isInteger(exitCode)) {
74
+ return invalid('qa-run receipt\'s "exitCode" must be an integer');
75
+ }
76
+ const diagnostics = r['diagnostics'];
77
+ const errors = diagnostics !== null && typeof diagnostics === 'object' && !Array.isArray(diagnostics)
78
+ ? diagnostics['errors']
79
+ : undefined;
80
+ if (typeof errors !== 'number' || !Number.isInteger(errors) || errors < 0) {
81
+ return invalid('qa-run receipt\'s "diagnostics.errors" must be a non-negative integer');
82
+ }
83
+ if (exitCode !== 0 || errors !== 0) {
84
+ return {
85
+ ok: false,
86
+ codeName: 'E_EVIDENCE_TOOL_FAILED',
87
+ reason: `qa-run ${kind} receipt reports exit code ${exitCode} with ${errors} error diagnostic(s); it must pass with none`,
88
+ };
89
+ }
90
+ const roots = r['roots'];
91
+ if (!Array.isArray(roots) ||
92
+ roots.length === 0 ||
93
+ !roots.every((p) => typeof p === 'string' && p.trim() !== '')) {
94
+ return invalid('qa-run receipt\'s "roots" must be a non-empty array of root-relative paths');
95
+ }
96
+ const outside = roots.find((p) => {
97
+ const n = normaliseRoot(p);
98
+ return isAbsolute(p) || n === '..' || n.startsWith('../');
99
+ });
100
+ if (outside !== undefined) {
101
+ return invalid(`qa-run receipt root ${JSON.stringify(outside)} is not relative to the project root`);
102
+ }
103
+ const startTime = r['startTime'];
104
+ if (startTime !== undefined && (typeof startTime !== 'number' || !Number.isFinite(startTime))) {
105
+ return invalid('qa-run receipt\'s "startTime" must be epoch milliseconds');
106
+ }
107
+ const tool = r['tool'];
108
+ const toolField = (field) => {
109
+ const v = tool !== null && typeof tool === 'object' && !Array.isArray(tool)
110
+ ? tool[field]
111
+ : undefined;
112
+ return typeof v === 'string' && v !== '' ? v : undefined;
113
+ };
114
+ const toolName = toolField('name');
115
+ const toolVersion = toolField('version');
116
+ return {
117
+ ok: true,
118
+ receipt: {
119
+ kind,
120
+ command,
121
+ roots: [...new Set(roots.map(normaliseRoot))].sort(),
122
+ ...(typeof startTime === 'number' ? { startTime } : {}),
123
+ ...(toolName ? { toolName } : {}),
124
+ ...(toolVersion ? { toolVersion } : {}),
125
+ },
126
+ };
127
+ }
128
+ /** Up to five items, then a count. */
129
+ function some(items) {
130
+ return `${items.slice(0, 5).join(', ')}${items.length > 5 ? `, … (${items.length})` : ''}`;
131
+ }
132
+ /**
133
+ * Bind a receipt to the change it claims to check, or refuse it when it is
134
+ * older than the change or does not cover it (see the module doc).
135
+ *
136
+ * @param receipt - From {@link parseQaRunReceipt}.
137
+ * @param receiptPath - Absolute path of the receipt file.
138
+ * @param root - The task's checkout.
139
+ * @returns The refusal, or ok.
140
+ * @task T13427
141
+ */
142
+ export function bindQaRunReceipt(receipt, receiptPath, root) {
143
+ const fresh = reportFreshness(receipt.startTime, receiptPath, root, 'qa-run');
144
+ if (!fresh.ok)
145
+ return fresh;
146
+ const refuse = (reason) => ({
147
+ ok: false,
148
+ codeName: 'E_EVIDENCE_INSUFFICIENT',
149
+ reason,
150
+ });
151
+ const changes = fresh.changes;
152
+ // A change whose every path is set aside as out of scope must not pass
153
+ // vacuously (as for test-run, T13135).
154
+ if (changes !== null && changes.paths.length === 0 && changes.excluded.length > 0) {
155
+ return refuse(`Every path this change touches is excluded from evidence scope (${some(changes.excluded)}), ` +
156
+ `so a qa-run ${receipt.kind} receipt cannot speak for it. Record tool:${receipt.kind}, or ci:<pr> once the PR merges.`);
157
+ }
158
+ const changed = changes?.paths ?? [];
159
+ if (!fresh.judged || changed.length === 0)
160
+ return { ok: true };
161
+ const scope = deriveAffectedPackages(root, changed);
162
+ if (scope.scope === 'full') {
163
+ return refuse(`The change is workspace-wide (${scope.reason}), so only a whole-project ${receipt.kind} ` +
164
+ `speaks for it. Record tool:${receipt.kind}, or ci:<pr> once the PR merges.`);
165
+ }
166
+ const covered = (path) => receipt.roots.some((r) => r === path || inPackageDir(path, r));
167
+ const uncovered = changed.filter((p) => !isCiDocumentPath(p) && !covered(p));
168
+ if (uncovered.length > 0) {
169
+ return refuse(`qa-run ${receipt.kind} receipt (roots ${some(receipt.roots.map((r) => r || '.'))}) does not ` +
170
+ `cover the changed path(s) ${some(uncovered)}. Run ${receipt.kind} over roots that hold ` +
171
+ `every changed file, or record tool:${receipt.kind}.`);
172
+ }
173
+ // A type change breaks importers: a dependent package must be checked too.
174
+ const dependents = scope.packages.filter((name) => !scope.direct.includes(name));
175
+ if (dependents.length > 0) {
176
+ const workspace = listWorkspacePackages(root);
177
+ const unchecked = dependents.filter((name) => {
178
+ const dir = workspace.find((p) => p.name === name)?.dir;
179
+ return dir === undefined || !covered(dir);
180
+ });
181
+ if (unchecked.length > 0) {
182
+ return refuse(`qa-run ${receipt.kind} receipt does not cover package(s) ${some(unchecked)}, which depend ` +
183
+ `on a changed package. Add their directories to the run's roots, or record tool:${receipt.kind}.`);
184
+ }
185
+ }
186
+ return { ok: true };
187
+ }
188
+ //# sourceMappingURL=qa-run-binding.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"qa-run-binding.js","sourceRoot":"","sources":["../../src/tasks/qa-run-binding.ts"],"names":[],"mappings":"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"}
@@ -78,6 +78,56 @@ export declare function reqAdd(projectRoot: string, taskId: string, gate: Accept
78
78
  acceptance: AcceptanceItem[];
79
79
  };
80
80
  }>;
81
+ /** Result of {@link reqReplace}. */
82
+ export interface ReqReplaceResult {
83
+ /** The task and its committed acceptance array. */
84
+ task: {
85
+ id: string;
86
+ acceptance: AcceptanceItem[];
87
+ };
88
+ /** The replaced REQ-ID. */
89
+ req: string;
90
+ /** Zero-based index of the gate in the acceptance array (unchanged). */
91
+ index: number;
92
+ /** The gate that was superseded, kept in the AC history and the audit row. */
93
+ superseded: AcceptanceGate;
94
+ /** False when the new gate equals the current one (nothing was written). */
95
+ changed: boolean;
96
+ }
97
+ /**
98
+ * Replace the typed gate that carries `req` with `gate`, in place (T12988).
99
+ *
100
+ * @remarks
101
+ * The gate keeps its index, its AC row (id and ordinal: a REQ-ID row's id
102
+ * derives from the REQ-ID, `evidenceBoundSourceKey`) and therefore its
103
+ * evidence bindings, which go stale rather than being re-pointed: typed results
104
+ * and criterion links are pinned to the criterion text hash, so the replaced
105
+ * gate must be verified again. The superseded gate is kept as an AC history row
106
+ * (reason `replace`) and in the task audit row, with its last typed result. In
107
+ * a locked pipeline stage the change needs `reason`, exactly as `cleo update
108
+ * --acceptance` does.
109
+ *
110
+ * @param projectRoot - Absolute path to the project root.
111
+ * @param taskId - Target task ID.
112
+ * @param req - REQ-ID of the gate to replace.
113
+ * @param gate - The new gate. Its `req` must be absent or equal `req`.
114
+ * @param options - `reason` for a locked stage; `accessor` for tests.
115
+ * @returns The committed acceptance array and the superseded gate.
116
+ * @throws CleoError E_NOT_FOUND for an unknown task or REQ-ID, E_VALIDATION for
117
+ * an invalid gate or a REQ-ID mismatch, AC_LOCKED in a locked stage without `reason`.
118
+ * @example
119
+ * ```typescript
120
+ * await reqReplace(root, 'T42', 'TIMER-01', {
121
+ * kind: 'test', command: 'pnpm', args: ['--filter', 'app', 'exec', 'vitest', 'run'],
122
+ * expect: 'pass', description: 'Timer tests pass', req: 'TIMER-01',
123
+ * });
124
+ * ```
125
+ * @task T12988
126
+ */
127
+ export declare function reqReplace(projectRoot: string, taskId: string, req: string, gate: AcceptanceGate, options?: {
128
+ reason?: string;
129
+ accessor?: DataAccessor;
130
+ }): Promise<ReqReplaceResult>;
81
131
  /**
82
132
  * List all REQ-ID–addressed acceptance gates on a task.
83
133
  *
@@ -1 +1 @@
1
- {"version":3,"file":"req.d.ts","sourceRoot":"","sources":["../../src/tasks/req.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAGH,OAAO,KAAK,EAAE,cAAc,EAAE,cAAc,EAAuB,MAAM,qBAAqB,CAAC;AAI/F,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,2BAA2B,CAAC;AAa9D,mCAAmC;AACnC,MAAM,WAAW,YAAY;IAC3B,uDAAuD;IACvD,KAAK,EAAE,MAAM,CAAC;IACd,8DAA8D;IAC9D,GAAG,EAAE,MAAM,CAAC;IACZ,8BAA8B;IAC9B,IAAI,EAAE,cAAc,CAAC,MAAM,CAAC,CAAC;IAC7B,kCAAkC;IAClC,WAAW,EAAE,MAAM,CAAC;IACpB,qBAAqB;IACrB,QAAQ,EAAE,OAAO,CAAC;CACnB;AAED,yCAAyC;AACzC,MAAM,WAAW,iBAAiB;IAChC,yDAAyD;IACzD,KAAK,EAAE,MAAM,CAAC;IACd,iCAAiC;IACjC,QAAQ,EAAE,MAAM,CAAC;IACjB,4EAA4E;IAC5E,QAAQ,EAAE,cAAc,GAAG,IAAI,CAAC;IAChC,mDAAmD;IACnD,KAAK,EAAE,MAAM,GAAG,IAAI,CAAC;IACrB,uFAAuF;IACvF,SAAS,EAAE,MAAM,GAAG,IAAI,CAAC;CAC1B;AAED,iDAAiD;AACjD,MAAM,WAAW,oBAAoB;IACnC,wEAAwE;IACxE,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAC/B,gEAAgE;IAChE,OAAO,EAAE,MAAM,CAAC;CACjB;AAkHD;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,wBAAsB,MAAM,CAC1B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,IAAI,EAAE,cAAc,EACpB,QAAQ,CAAC,EAAE,YAAY,GACtB,OAAO,CAAC;IAAE,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,cAAc,EAAE,CAAA;KAAE,CAAA;CAAE,CAAC,CA6BjE;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,wBAAsB,OAAO,CAC3B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,QAAQ,CAAC,EAAE,YAAY,GACtB,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,YAAY,EAAE,CAAA;CAAE,CAAC,CAsBpD;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAsB,UAAU,CAC9B,WAAW,EAAE,MAAM,EACnB,MAAM,EAAE,MAAM,EACd,KAAK,EAAE,OAAO,EACd,QAAQ,CAAC,EAAE,YAAY,GACtB,OAAO,CAAC;IAAE,SAAS,EAAE,iBAAiB,EAAE,CAAC;IAAC,OAAO,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAsD/D;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,wBAAgB,aAAa,CAAC,GAAG,EAAE,MAAM,GAAG,cAAc,CAWzD"}
1
+ {"version":3,"file":"req.d.ts","sourceRoot":"","sources":["../../src/tasks/req.ts"],"names":[],"mappings":"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"}
package/dist/tasks/req.js CHANGED
@@ -13,7 +13,8 @@ import { acceptanceGateSchema } from '@cleocode/contracts/acceptance-gate-schema
13
13
  import { ExitCode } from '@cleocode/contracts/exit-codes.js';
14
14
  import { CleoError } from '../errors.js';
15
15
  import { getTaskAccessor } from '../store/data-accessor.js';
16
- import { applyAcPlan, planAcUpdate } from './ac-table.js';
16
+ import { enforceAcceptanceImmutability } from './ac-immutability.js';
17
+ import { acItemToText, applyAcPlan, planAcUpdate, replaceAcRowPlan } from './ac-table.js';
17
18
  // ─── Heuristic regex patterns ─────────────────────────────────────────────────
18
19
  const RE_TEST = /\b(tests?\s+pass(es)?|npm\s+test|pnpm\s+test|yarn\s+test)\b/i;
19
20
  const RE_FILE_EXISTS = /^(?:file\s+(?:at\s+)?([^\s]+)|([^\s]+)\s+exists?)$/i;
@@ -165,6 +166,103 @@ export async function reqAdd(projectRoot, taskId, gate, accessor) {
165
166
  return { task: { id: taskId, acceptance: updated } };
166
167
  });
167
168
  }
169
+ /**
170
+ * Replace the typed gate that carries `req` with `gate`, in place (T12988).
171
+ *
172
+ * @remarks
173
+ * The gate keeps its index, its AC row (id and ordinal: a REQ-ID row's id
174
+ * derives from the REQ-ID, `evidenceBoundSourceKey`) and therefore its
175
+ * evidence bindings, which go stale rather than being re-pointed: typed results
176
+ * and criterion links are pinned to the criterion text hash, so the replaced
177
+ * gate must be verified again. The superseded gate is kept as an AC history row
178
+ * (reason `replace`) and in the task audit row, with its last typed result. In
179
+ * a locked pipeline stage the change needs `reason`, exactly as `cleo update
180
+ * --acceptance` does.
181
+ *
182
+ * @param projectRoot - Absolute path to the project root.
183
+ * @param taskId - Target task ID.
184
+ * @param req - REQ-ID of the gate to replace.
185
+ * @param gate - The new gate. Its `req` must be absent or equal `req`.
186
+ * @param options - `reason` for a locked stage; `accessor` for tests.
187
+ * @returns The committed acceptance array and the superseded gate.
188
+ * @throws CleoError E_NOT_FOUND for an unknown task or REQ-ID, E_VALIDATION for
189
+ * an invalid gate or a REQ-ID mismatch, AC_LOCKED in a locked stage without `reason`.
190
+ * @example
191
+ * ```typescript
192
+ * await reqReplace(root, 'T42', 'TIMER-01', {
193
+ * kind: 'test', command: 'pnpm', args: ['--filter', 'app', 'exec', 'vitest', 'run'],
194
+ * expect: 'pass', description: 'Timer tests pass', req: 'TIMER-01',
195
+ * });
196
+ * ```
197
+ * @task T12988
198
+ */
199
+ export async function reqReplace(projectRoot, taskId, req, gate, options = {}) {
200
+ const reqId = req.trim();
201
+ if (gate.req !== undefined && gate.req !== reqId) {
202
+ // @sync-invariant none:input-shape a gate naming another REQ-ID is refused before any read; nothing is written
203
+ throw new CleoError(ExitCode.VALIDATION_ERROR, `Gate JSON names REQ-ID "${gate.req}", but it replaces "${reqId}"`, { fix: `Set "req":"${reqId}" in the gate JSON, or omit it` });
204
+ }
205
+ const validated = validateGate({ ...gate, req: reqId });
206
+ const acc = options.accessor ?? (await getTaskAccessor(projectRoot));
207
+ return acc.transaction(async (tx) => {
208
+ const task = await loadTask(acc, taskId);
209
+ const existing = (task.acceptance ?? []);
210
+ const index = existing.findIndex((item) => typeof item === 'object' && item.req === reqId);
211
+ if (index < 0) {
212
+ const known = existing.flatMap((item) => typeof item === 'object' && item.req ? [item.req] : []);
213
+ // @sync-invariant none:input-shape an unknown REQ-ID is refused before any write; nothing is written
214
+ throw new CleoError(ExitCode.NOT_FOUND, `REQ-ID "${reqId}" is not a gate on task ${taskId}`, {
215
+ fix: known.length
216
+ ? `REQ-IDs on ${taskId}: ${known.join(', ')} (cleo req list ${taskId})`
217
+ : `${taskId} has no REQ-ID gates; add one with cleo req add ${taskId} --gate '<json>'`,
218
+ });
219
+ }
220
+ const superseded = existing[index];
221
+ if (acItemToText(superseded) === acItemToText(validated)) {
222
+ return {
223
+ task: { id: taskId, acceptance: existing },
224
+ req: reqId,
225
+ index,
226
+ superseded,
227
+ changed: false,
228
+ };
229
+ }
230
+ const updated = existing.map((item, i) => (i === index ? validated : item));
231
+ // Same guard as `cleo update --acceptance`: a locked stage needs a reason.
232
+ const authorization = enforceAcceptanceImmutability({
233
+ task,
234
+ newAcceptance: updated,
235
+ reason: options.reason,
236
+ projectRoot,
237
+ });
238
+ const now = new Date().toISOString();
239
+ await tx.updateTaskFields(taskId, { acceptanceJson: JSON.stringify(updated), updatedAt: now });
240
+ const rows = await tx.getAcRows(taskId);
241
+ await applyAcPlan(tx, taskId, replaceAcRowPlan(taskId, rows, index, validated));
242
+ const lastResult = task.verification?.gateResults?.find((r) => r.index === index);
243
+ await tx.appendLog({
244
+ timestamp: now,
245
+ action: 'req_replaced',
246
+ taskId,
247
+ actor: process.env['CLEO_AGENT_ID'] ?? 'cleo',
248
+ details: {
249
+ req: reqId,
250
+ index,
251
+ ...(options.reason?.trim() ? { reason: options.reason.trim() } : {}),
252
+ ...(authorization ? { acceptanceOverride: { ...authorization, status: 'committed' } } : {}),
253
+ },
254
+ before: { gate: superseded, ...(lastResult ? { lastResult } : {}) },
255
+ after: { gate: validated },
256
+ });
257
+ return {
258
+ task: { id: taskId, acceptance: updated },
259
+ req: reqId,
260
+ index,
261
+ superseded,
262
+ changed: true,
263
+ };
264
+ });
265
+ }
168
266
  /**
169
267
  * List all REQ-ID–addressed acceptance gates on a task.
170
268
  *
@@ -1 +1 @@
1
- {"version":3,"file":"req.js","sourceRoot":"","sources":["../../src/tasks/req.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,iBAAiB,EAAE,MAAM,WAAW,CAAC;AAE9C,OAAO,EAAE,oBAAoB,EAAE,MAAM,+CAA+C,CAAC;AACrF,OAAO,EAAE,QAAQ,EAAE,MAAM,mCAAmC,CAAC;AAC7D,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAC;AAEzC,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,EAAE,WAAW,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAE1D,iFAAiF;AAEjF,MAAM,OAAO,GAAG,8DAA8D,CAAC;AAC/E,MAAM,cAAc,GAAG,qDAAqD,CAAC;AAC7E,MAAM,OAAO,GAAG,yDAAyD,CAAC;AAC1E,MAAM,YAAY,GAAG,wEAAwE,CAAC;AAwC9F,iFAAiF;AAEjF,KAAK,UAAU,QAAQ,CAAC,QAAsB,EAAE,MAAc;IAC5D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC;IACnD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,mBAAmB,MAAM,EAAE,EAAE;YACnE,GAAG,EAAE,mBAAmB,MAAM,0BAA0B;SACzD,CAAC,CAAC;IACL,CAAC;IACD,OAAO,IAAI,CAAC;AACd,CAAC;AAED,KAAK,UAAU,2BAA2B,CACxC,EAAuB,EACvB,MAAc,EACd,UAAqC,EACrC,SAAiB;IAEjB,MAAM,EAAE,CAAC,gBAAgB,CAAC,MAAM,EAAE;QAChC,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,UAAU,CAAC;QAC1C,SAAS;KACV,CAAC,CAAC;IACH,MAAM,QAAQ,GAAG,MAAM,EAAE,CAAC,SAAS,CAAC,MAAM,CAAC,CAAC;IAC5C,MAAM,IAAI,GAAG,YAAY,CAAC,MAAM,EAAE,QAAQ,EAAE,UAAU,CAAC,CAAC;IACxD,MAAM,WAAW,CAAC,EAAE,EAAE,MAAM,EAAE,IAAI,CAAC,CAAC;AACtC,CAAC;AAED;;;;GAIG;AACH,SAAS,iBAAiB,CAAC,IAAY,EAAE,KAAa;IACpD,MAAM,CAAC,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAEtB,YAAY;IACZ,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,CAAC,CAAC,KAAK,CAAC,aAAa,CAAC;YACpC,CAAC,CAAC,UAAU;YACZ,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC;gBACvB,CAAC,CAAC,WAAW;gBACb,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC;oBACvB,CAAC,CAAC,WAAW;oBACb,CAAC,CAAC,WAAW,CAAC;QACpB,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,OAAO;YACP,MAAM,EAAE,MAAM;YACd,WAAW,EAAE,CAAC;YACd,GAAG,EAAE,KAAK;SACX,CAAC;IACJ,CAAC;IAED,cAAc;IACd,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,cAAc,CAAC,CAAC;IAC1C,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACzD,IAAI,IAAI,EAAE,CAAC;YACT,OAAO;gBACL,IAAI,EAAE,MAAM;gBACZ,IAAI;gBACJ,UAAU,EAAE,CAAC,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;gBAChC,WAAW,EAAE,CAAC;gBACd,GAAG,EAAE,KAAK;aACX,CAAC;QACJ,CAAC;IACH,CAAC;IAED,aAAa;IACb,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QACpB,MAAM,IAAI,GAAmD,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC;YAC5E,CAAC,CAAC,OAAO;YACT,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,SAAS,CAAC;gBAClB,CAAC,CAAC,QAAQ;gBACV,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC;oBACf,CAAC,CAAC,KAAK;oBACP,CAAC,CAAC,OAAO,CAAC;QAChB,OAAO;YACL,IAAI,EAAE,MAAM;YACZ,IAAI;YACJ,MAAM,EAAE,OAAO;YACf,WAAW,EAAE,CAAC;YACd,GAAG,EAAE,KAAK;SACX,CAAC;IACJ,CAAC;IAED,yBAAyB;IACzB,MAAM,SAAS,GAAG,CAAC,CAAC,KAAK,CAAC,YAAY,CAAC,CAAC;IACxC,IAAI,SAAS,EAAE,CAAC;QACd,MAAM,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,SAAS,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;QACxD,IAAI,GAAG,EAAE,CAAC;YACR,OAAO;gBACL,IAAI,EAAE,SAAS;gBACf,GAAG;gBACH,QAAQ,EAAE,CAAC;gBACX,WAAW,EAAE,CAAC;gBACd,GAAG,EAAE,KAAK;aACX,CAAC;QACJ,CAAC;IACH,CAAC;IAED,kBAAkB;IAClB,OAAO;QACL,IAAI,EAAE,QAAQ;QACd,MAAM,EAAE,CAAC;QACT,WAAW,EAAE,CAAC;QACd,GAAG,EAAE,KAAK;KACX,CAAC;AACJ,CAAC;AAED,iFAAiF;AAEjF;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACH,MAAM,CAAC,KAAK,UAAU,MAAM,CAC1B,WAAmB,EACnB,MAAc,EACd,IAAoB,EACpB,QAAuB;IAEvB,MAAM,SAAS,GAAG,YAAY,CAAC,IAAI,CAAC,CAAC;IACrC,MAAM,GAAG,GAAG,QAAQ,IAAI,CAAC,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC;IAC7D,OAAO,GAAG,CAAC,WAAW,CAAC,KAAK,EAAE,EAAE,EAAE,EAAE;QAClC,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAEzC,MAAM,QAAQ,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAqB,CAAC;QAE7D,0BAA0B;QAC1B,IAAI,SAAS,CAAC,GAAG,EAAE,CAAC;YAClB,MAAM,GAAG,GAAG,QAAQ,CAAC,IAAI,CACvB,CAAC,IAAI,EAA0B,EAAE,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,KAAK,SAAS,CAAC,GAAG,CACzF,CAAC;YACF,IAAI,GAAG,EAAE,CAAC;gBACR,MAAM,IAAI,SAAS,CACjB,QAAQ,CAAC,gBAAgB,EACzB,WAAW,SAAS,CAAC,GAAG,4BAA4B,MAAM,EAAE,EAC5D;oBACE,GAAG,EAAE,0EAA0E,MAAM,GAAG;iBACzF,CACF,CAAC;YACJ,CAAC;QACH,CAAC;QAED,MAAM,OAAO,GAAqB,CAAC,GAAG,QAAQ,EAAE,SAAS,CAAC,CAAC;QAC3D,MAAM,2BAA2B,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAEjF,OAAO,EAAE,IAAI,EAAE,EAAE,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,EAAE,CAAC;IACvD,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;;;;;;GAoBG;AACH,MAAM,CAAC,KAAK,UAAU,OAAO,CAC3B,WAAmB,EACnB,MAAc,EACd,QAAuB;IAEvB,MAAM,GAAG,GAAG,QAAQ,IAAI,CAAC,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC;IAC7D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;IAEzC,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAqB,CAAC;IAC/D,MAAM,KAAK,GAAmB,EAAE,CAAC;IAEjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;QAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;QAC3B,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,KAAK,IAAI,IAAK,IAAuB,CAAC,GAAG,EAAE,CAAC;YAC9E,MAAM,IAAI,GAAG,IAAsB,CAAC;YACpC,KAAK,CAAC,IAAI,CAAC;gBACT,KAAK,EAAE,CAAC;gBACR,GAAG,EAAE,IAAI,CAAC,GAAI;gBACd,IAAI,EAAE,IAAI,CAAC,IAAI;gBACf,WAAW,EAAE,IAAI,CAAC,WAAW;gBAC7B,QAAQ,EAAE,IAAI,CAAC,QAAQ,IAAI,KAAK;aACjC,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAED,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;AAC3B,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,MAAM,CAAC,KAAK,UAAU,UAAU,CAC9B,WAAmB,EACnB,MAAc,EACd,KAAc,EACd,QAAuB;IAEvB,MAAM,GAAG,GAAG,QAAQ,IAAI,CAAC,MAAM,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC;IAC7D,MAAM,OAAO,GAAG,KAAK,EAAE,EAAwB,EAAE,EAAE;QACjD,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QAEzC,MAAM,UAAU,GAAG,CAAC,IAAI,CAAC,UAAU,IAAI,EAAE,CAAqB,CAAC;QAC/D,MAAM,SAAS,GAAwB,EAAE,CAAC;QAC1C,IAAI,OAAO,GAAG,CAAC,CAAC;QAChB,MAAM,gBAAgB,GAAG,IAAI,GAAG,CAC9B,UAAU,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,OAAO,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CACvF,CAAC;QAEF,iCAAiC;QACjC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,UAAU,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC3C,MAAM,IAAI,GAAG,UAAU,CAAC,CAAC,CAAC,CAAC;YAC3B,IAAI,OAAO,IAAI,KAAK,QAAQ;gBAAE,SAAS,CAAC,sBAAsB;YAE9D,IAAI,KAAa,CAAC;YAClB,GAAG,CAAC;gBACF,KAAK,GAAG,YAAY,MAAM,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,CAAC,CAAC,EAAE,GAAG,CAAC,EAAE,CAAC;YAC3D,CAAC,QAAQ,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE;YACtC,gBAAgB,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YAE5B,MAAM,UAAU,GAAG,iBAAiB,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;YAClD,MAAM,QAAQ,GAAG,UAAU,CAAC,CAAC,CAAC,YAAY,CAAC,UAAU,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;YAC9D,SAAS,CAAC,IAAI,CAAC;gBACb,KAAK,EAAE,CAAC;gBACR,QAAQ,EAAE,IAAI;gBACd,QAAQ;gBACR,KAAK,EAAE,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI;gBAC9B,SAAS,EAAE,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI;aAC3C,CAAC,CAAC;QACL,CAAC;QAED,IAAI,CAAC,EAAE,EAAE,CAAC;YACR,OAAO,EAAE,SAAS,EAAE,CAAC;QACvB,CAAC;QAED,2DAA2D;QAC3D,4DAA4D;QAC5D,MAAM,OAAO,GAAqB,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE;YAC3D,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,KAAK,CAAC,CAAC,CAAC;YACtD,IAAI,QAAQ,EAAE,QAAQ;gBAAE,OAAO,QAAQ,CAAC,QAAQ,CAAC;YACjD,OAAO,IAAI,CAAC;QACd,CAAC,CAAC,CAAC;QAEH,MAAM,2BAA2B,CAAC,EAAE,EAAE,MAAM,EAAE,OAAO,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE,CAAC,CAAC;QAEjF,OAAO;YACL,SAAS;YACT,OAAO,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,CAAC,MAAM;SAC7D,CAAC;IACJ,CAAC,CAAC;IACF,OAAO,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,WAAW,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,OAAO,EAAE,CAAC;AACtD,CAAC;AAED;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,aAAa,CAAC,GAAW;IACvC,IAAI,MAAsB,CAAC;IAC3B,IAAI,CAAC;QACH,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IAC3B,CAAC;IAAC,MAAM,CAAC;QACP,MAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,mCAAmC,GAAG,EAAE,EAAE;YACvF,GAAG,EAAE,uIAAuI;SAC7I,CAAC,CAAC;IACL,CAAC;IAED,OAAO,YAAY,CAAC,MAAM,CAAC,CAAC;AAC9B,CAAC;AAED,uFAAuF;AACvF,SAAS,YAAY,CAAC,IAAoB;IACxC,MAAM,MAAM,GAAG,oBAAoB,CAAC,SAAS,CAAC,IAAI,CAAC,CAAC;IACpD,IAAI,CAAC,MAAM,CAAC,OAAO,EAAE,CAAC;QACpB,MAAM,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAC9F,MAAM,IAAI,SAAS,CACjB,QAAQ,CAAC,gBAAgB,EACzB,uCAAuC,MAAM,EAAE,EAC/C;YACE,GAAG,EAAE,mFAAmF;SACzF,CACF,CAAC;IACJ,CAAC;IAED,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;QAC1C,MAAM,IAAI,SAAS,CAAC,QAAQ,CAAC,gBAAgB,EAAE,kCAAkC,EAAE;YACjF,GAAG,EAAE,gHAAgH;SACtH,CAAC,CAAC;IACL,CAAC;IACD,OAAO,MAAM,CAAC,IAAI,CAAC;AACrB,CAAC"}
1
+ {"version":3,"file":"req.js","sourceRoot":"","sources":["../../src/tasks/req.ts"],"names":[],"mappings":"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"}
@@ -56,6 +56,7 @@
56
56
  *
57
57
  * @task T12965
58
58
  */
59
+ import { type ScopedChangedPaths } from './affected-packages.js';
59
60
  /** The parts of a vitest (or jest) JSON report the binding reads. */
60
61
  export interface TestRunReport {
61
62
  /** Epoch milliseconds the run started. */
@@ -115,6 +116,34 @@ export type TestRunBinding = {
115
116
  /** Affected packages with no test file, which no report could cover (sorted). */
116
117
  untestedPackages: string[];
117
118
  };
119
+ /** What the freshness check of a report or receipt decided. */
120
+ export type ReportFreshness = {
121
+ /** Older than the change. */
122
+ ok: false;
123
+ codeName: 'E_EVIDENCE_STALE';
124
+ reason: string;
125
+ } | {
126
+ ok: true;
127
+ /** False when the report has no run time at all, so nothing is judged. */
128
+ judged: boolean;
129
+ /** The change's scoped paths, or null outside git / with no origin. */
130
+ changes: ScopedChangedPaths | null;
131
+ };
132
+ /**
133
+ * Whether a report (or receipt) ran after every part of the change it claims
134
+ * to speak for — point 1 of the module doc, shared by `test-run:` and
135
+ * `qa-run:` (T13427).
136
+ *
137
+ * @param startTime - The run's own start time (epoch ms), if it states one;
138
+ * else the file's mtime is the run time.
139
+ * @param reportPath - Absolute path of the report file.
140
+ * @param root - The task's checkout.
141
+ * @param atom - The atom kind, named in the remedy.
142
+ * @returns The stale refusal, or the change's scoped paths for the relevance check.
143
+ * @task T12965
144
+ * @task T13427
145
+ */
146
+ export declare function reportFreshness(startTime: unknown, reportPath: string, root: string, atom: 'test-run' | 'qa-run'): ReportFreshness;
118
147
  /**
119
148
  * Bind a report to the change it claims to test, or refuse it when it is
120
149
  * older than the change or does not cover it (see the module doc for exactly
@@ -1 +1 @@
1
- {"version":3,"file":"test-run-binding.d.ts","sourceRoot":"","sources":["../../src/tasks/test-run-binding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AAeH,qEAAqE;AACrE,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,gBAAgB,CAAC,EAAE,KAAK,CAAC;YAAE,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC/C,CAAC,CAAC;CACJ;AAED;;;GAGG;AACH,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAc/C;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAe9E;AA6LD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAKnF;AAsCD,qCAAqC;AACrC,MAAM,MAAM,cAAc,GACtB;IACE,6BAA6B;IAC7B,EAAE,EAAE,KAAK,CAAC;IACV,wEAAwE;IACxE,QAAQ,EAAE,kBAAkB,GAAG,yBAAyB,CAAC;IACzD,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;CAChB,GACD;IACE,+BAA+B;IAC/B,EAAE,EAAE,IAAI,CAAC;IACT,iFAAiF;IACjF,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B,CAAC;AAEN;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,SAAS,MAAM,EAAE,GAC3B,cAAc,CAyHhB"}
1
+ {"version":3,"file":"test-run-binding.d.ts","sourceRoot":"","sources":["../../src/tasks/test-run-binding.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAyDG;AAMH,OAAO,EAKL,KAAK,kBAAkB,EAGxB,MAAM,wBAAwB,CAAC;AAEhC,qEAAqE;AACrE,MAAM,WAAW,aAAa;IAC5B,0CAA0C;IAC1C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,KAAK,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,IAAI,CAAC,EAAE,MAAM,CAAC;QACd,gBAAgB,CAAC,EAAE,KAAK,CAAC;YAAE,MAAM,CAAC,EAAE,MAAM,CAAA;SAAE,CAAC,CAAC;KAC/C,CAAC,CAAC;CACJ;AAED;;;GAGG;AACH,eAAO,MAAM,2BAA2B,MAAM,CAAC;AAc/C;;;;;;;;;;GAUG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,aAAa,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,EAAE,CAe9E;AA6LD;;;;;;;;GAQG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAKnF;AAsCD,qCAAqC;AACrC,MAAM,MAAM,cAAc,GACtB;IACE,6BAA6B;IAC7B,EAAE,EAAE,KAAK,CAAC;IACV,wEAAwE;IACxE,QAAQ,EAAE,kBAAkB,GAAG,yBAAyB,CAAC;IACzD,mCAAmC;IACnC,MAAM,EAAE,MAAM,CAAC;CAChB,GACD;IACE,+BAA+B;IAC/B,EAAE,EAAE,IAAI,CAAC;IACT,iFAAiF;IACjF,gBAAgB,EAAE,MAAM,EAAE,CAAC;CAC5B,CAAC;AAEN,+DAA+D;AAC/D,MAAM,MAAM,eAAe,GACvB;IACE,6BAA6B;IAC7B,EAAE,EAAE,KAAK,CAAC;IACV,QAAQ,EAAE,kBAAkB,CAAC;IAC7B,MAAM,EAAE,MAAM,CAAC;CAChB,GACD;IACE,EAAE,EAAE,IAAI,CAAC;IACT,0EAA0E;IAC1E,MAAM,EAAE,OAAO,CAAC;IAChB,uEAAuE;IACvE,OAAO,EAAE,kBAAkB,GAAG,IAAI,CAAC;CACpC,CAAC;AAEN;;;;;;;;;;;;;GAaG;AACH,wBAAgB,eAAe,CAC7B,SAAS,EAAE,OAAO,EAClB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,IAAI,EAAE,UAAU,GAAG,QAAQ,GAC1B,eAAe,CAuDjB;AAED;;;;;;;;;;;GAWG;AACH,wBAAgB,iBAAiB,CAC/B,MAAM,EAAE,aAAa,EACrB,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE,MAAM,EACZ,SAAS,EAAE,SAAS,MAAM,EAAE,GAC3B,cAAc,CA0EhB"}
@@ -297,23 +297,23 @@ function someNames(names) {
297
297
  return `${names.slice(0, 5).join(', ')}${names.length > 5 ? `, … (${names.length} packages)` : ''}`;
298
298
  }
299
299
  /**
300
- * Bind a report to the change it claims to test, or refuse it when it is
301
- * older than the change or does not cover it (see the module doc for exactly
302
- * what this guarantees).
300
+ * Whether a report (or receipt) ran after every part of the change it claims
301
+ * to speak for — point 1 of the module doc, shared by `test-run:` and
302
+ * `qa-run:` (T13427).
303
303
  *
304
- * @param report - Parsed report.
304
+ * @param startTime - The run's own start time (epoch ms), if it states one;
305
+ * else the file's mtime is the run time.
305
306
  * @param reportPath - Absolute path of the report file.
306
- * @param root - The task's checkout (a git checkout, or not).
307
- * @param testFiles - {@link coveredTestFiles} of the report.
308
- * @returns The refusal, or the binding with the affected packages left untested.
307
+ * @param root - The task's checkout.
308
+ * @param atom - The atom kind, named in the remedy.
309
+ * @returns The stale refusal, or the change's scoped paths for the relevance check.
309
310
  * @task T12965
311
+ * @task T13427
310
312
  */
311
- export function bindTestRunReport(report, reportPath, root, testFiles) {
312
- const ranAt = typeof report.startTime === 'number' && Number.isFinite(report.startTime)
313
- ? report.startTime
314
- : mtimeOf(reportPath);
313
+ export function reportFreshness(startTime, reportPath, root, atom) {
314
+ const ranAt = typeof startTime === 'number' && Number.isFinite(startTime) ? startTime : mtimeOf(reportPath);
315
315
  if (ranAt === null)
316
- return { ok: true, untestedPackages: [] };
316
+ return { ok: true, judged: false, changes: null };
317
317
  const clock = {
318
318
  ranAt,
319
319
  after: (at) => at > ranAt + MTIME_SLACK_MS,
@@ -325,29 +325,53 @@ export function bindTestRunReport(report, reportPath, root, testFiles) {
325
325
  codeName: 'E_EVIDENCE_STALE',
326
326
  reason,
327
327
  });
328
- const refuse = (reason) => ({
329
- ok: false,
330
- codeName: 'E_EVIDENCE_INSUFFICIENT',
331
- reason,
332
- });
328
+ const rerun = atom === 'test-run'
329
+ ? RERUN
330
+ : 'Re-run the check and record the fresh receipt (write receipts to a gitignored path or outside the checkout).';
333
331
  const commit = newestChangeCommit(root);
334
332
  if (commit !== null && clock.after(commit.at)) {
335
333
  const unseen = committedAfterRunUnseen(root, clock);
336
334
  if (unseen !== null) {
337
- return stale(staleRefusal(ranAt, `commit ${commit.sha.slice(0, 12)} of the change was made`, commit.at, `It may hold content the run did not see: ${unseen}. Bind test-run before committing ` +
338
- '(cleo verify right after the run), or re-run the tests and record the fresh report.'));
335
+ return stale(staleRefusal(ranAt, `commit ${commit.sha.slice(0, 12)} of the change was made`, commit.at, `It may hold content the run did not see: ${unseen}. Bind ${atom} before committing ` +
336
+ `(cleo verify right after the run), or ${atom === 'test-run' ? 're-run the tests and record the fresh report' : 're-run the check and record the fresh receipt'}.`));
339
337
  }
340
338
  }
341
339
  const changes = scopedChangedPaths(root);
342
- const changed = changes?.paths ?? null;
343
- const newest = newestModified(root, (changed ?? dirtyTracked(root)).filter((p) => p !== clock.reportRel));
340
+ const newest = newestModified(root, (changes?.paths ?? dirtyTracked(root)).filter((p) => p !== clock.reportRel));
344
341
  if (newest !== null && clock.after(newest.at)) {
345
- return stale(staleRefusal(ranAt, `${newest.path} was modified`, newest.at, RERUN));
342
+ return stale(staleRefusal(ranAt, `${newest.path} was modified`, newest.at, rerun));
346
343
  }
347
344
  const removed = deletedAfterRun(root, 'HEAD', clock);
348
345
  if (removed) {
349
- return stale(staleRefusal(ranAt, `${removed.path} was deleted or moved (its directory changed)`, removed.at, RERUN));
346
+ return stale(staleRefusal(ranAt, `${removed.path} was deleted or moved (its directory changed)`, removed.at, rerun));
350
347
  }
348
+ return { ok: true, judged: true, changes };
349
+ }
350
+ /**
351
+ * Bind a report to the change it claims to test, or refuse it when it is
352
+ * older than the change or does not cover it (see the module doc for exactly
353
+ * what this guarantees).
354
+ *
355
+ * @param report - Parsed report.
356
+ * @param reportPath - Absolute path of the report file.
357
+ * @param root - The task's checkout (a git checkout, or not).
358
+ * @param testFiles - {@link coveredTestFiles} of the report.
359
+ * @returns The refusal, or the binding with the affected packages left untested.
360
+ * @task T12965
361
+ */
362
+ export function bindTestRunReport(report, reportPath, root, testFiles) {
363
+ const fresh = reportFreshness(report.startTime, reportPath, root, 'test-run');
364
+ if (!fresh.ok)
365
+ return fresh;
366
+ if (!fresh.judged)
367
+ return { ok: true, untestedPackages: [] };
368
+ const changes = fresh.changes;
369
+ const changed = changes?.paths ?? null;
370
+ const refuse = (reason) => ({
371
+ ok: false,
372
+ codeName: 'E_EVIDENCE_INSUFFICIENT',
373
+ reason,
374
+ });
351
375
  // T13135: a change whose every path was set aside as out of scope has
352
376
  // nothing a targeted report can speak for; it must not pass vacuously.
353
377
  if (changes !== null && changes.paths.length === 0 && changes.excluded.length > 0) {