@telora/daemon 0.24.16 → 0.24.25

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 (211) hide show
  1. package/build-info.json +7 -3
  2. package/dist/ci/candidate-failure-record.d.ts +104 -0
  3. package/dist/ci/candidate-failure-record.d.ts.map +1 -0
  4. package/dist/ci/candidate-failure-record.js +135 -0
  5. package/dist/ci/candidate-failure-record.js.map +1 -0
  6. package/dist/ci/candidate-ref.d.ts.map +1 -1
  7. package/dist/ci/candidate-ref.js +10 -3
  8. package/dist/ci/candidate-ref.js.map +1 -1
  9. package/dist/ci/ci-status-git.d.ts.map +1 -1
  10. package/dist/ci/ci-status-git.js +1 -0
  11. package/dist/ci/ci-status-git.js.map +1 -1
  12. package/dist/ci/ci-status.d.ts.map +1 -1
  13. package/dist/ci/ci-status.js +1 -0
  14. package/dist/ci/ci-status.js.map +1 -1
  15. package/dist/ci/gate-ref.d.ts +10 -1
  16. package/dist/ci/gate-ref.d.ts.map +1 -1
  17. package/dist/ci/gate-ref.js +11 -4
  18. package/dist/ci/gate-ref.js.map +1 -1
  19. package/dist/ci/product-ci-repo.d.ts.map +1 -1
  20. package/dist/ci/product-ci-repo.js +3 -2
  21. package/dist/ci/product-ci-repo.js.map +1 -1
  22. package/dist/completion/review-exit/review-exit-phase.js +7 -3
  23. package/dist/completion/review-exit/review-exit-phase.js.map +1 -1
  24. package/dist/completion/review-exit/review-exit-rehoming.d.ts +27 -3
  25. package/dist/completion/review-exit/review-exit-rehoming.d.ts.map +1 -1
  26. package/dist/completion/review-exit/review-exit-rehoming.js +29 -5
  27. package/dist/completion/review-exit/review-exit-rehoming.js.map +1 -1
  28. package/dist/composition/execution-merge-context.d.ts +13 -0
  29. package/dist/composition/execution-merge-context.d.ts.map +1 -1
  30. package/dist/composition/execution-merge-context.js +76 -3
  31. package/dist/composition/execution-merge-context.js.map +1 -1
  32. package/dist/composition/focus-activity-live-sources.d.ts.map +1 -1
  33. package/dist/composition/focus-activity-live-sources.js +1 -0
  34. package/dist/composition/focus-activity-live-sources.js.map +1 -1
  35. package/dist/composition/runtime-heartbeat-context.d.ts +11 -0
  36. package/dist/composition/runtime-heartbeat-context.d.ts.map +1 -1
  37. package/dist/composition/runtime-heartbeat-context.js +26 -1
  38. package/dist/composition/runtime-heartbeat-context.js.map +1 -1
  39. package/dist/composition/team-liveness-phase-sources.d.ts.map +1 -1
  40. package/dist/composition/team-liveness-phase-sources.js +1 -0
  41. package/dist/composition/team-liveness-phase-sources.js.map +1 -1
  42. package/dist/composition/verification-context.d.ts.map +1 -1
  43. package/dist/composition/verification-context.js +34 -4
  44. package/dist/composition/verification-context.js.map +1 -1
  45. package/dist/focus/control-state.d.ts +12 -6
  46. package/dist/focus/control-state.d.ts.map +1 -1
  47. package/dist/focus/control-state.js +16 -9
  48. package/dist/focus/control-state.js.map +1 -1
  49. package/dist/focus/heartbeat-metadata.d.ts +5 -0
  50. package/dist/focus/heartbeat-metadata.d.ts.map +1 -1
  51. package/dist/focus/heartbeat-metadata.js +12 -0
  52. package/dist/focus/heartbeat-metadata.js.map +1 -1
  53. package/dist/focus/heartbeat.d.ts.map +1 -1
  54. package/dist/focus/heartbeat.js +1 -0
  55. package/dist/focus/heartbeat.js.map +1 -1
  56. package/dist/focus/host-pressure.d.ts +77 -0
  57. package/dist/focus/host-pressure.d.ts.map +1 -0
  58. package/dist/focus/host-pressure.js +83 -0
  59. package/dist/focus/host-pressure.js.map +1 -0
  60. package/dist/focus-stage-lifecycle/index.js +1 -1
  61. package/dist/focus-stage-lifecycle/index.js.map +1 -1
  62. package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts +17 -7
  63. package/dist/focus-stage-lifecycle/wedge-watchdog.d.ts.map +1 -1
  64. package/dist/focus-stage-lifecycle/wedge-watchdog.js +58 -28
  65. package/dist/focus-stage-lifecycle/wedge-watchdog.js.map +1 -1
  66. package/dist/git/types.js +1 -1
  67. package/dist/merge/candidate-ci-failures.d.ts +72 -0
  68. package/dist/merge/candidate-ci-failures.d.ts.map +1 -0
  69. package/dist/merge/candidate-ci-failures.js +240 -0
  70. package/dist/merge/candidate-ci-failures.js.map +1 -0
  71. package/dist/merge/candidate-red-record.d.ts +44 -0
  72. package/dist/merge/candidate-red-record.d.ts.map +1 -0
  73. package/dist/merge/candidate-red-record.js +98 -0
  74. package/dist/merge/candidate-red-record.js.map +1 -0
  75. package/dist/merge/candidate-rework.d.ts +4 -3
  76. package/dist/merge/candidate-rework.d.ts.map +1 -1
  77. package/dist/merge/candidate-rework.js +46 -14
  78. package/dist/merge/candidate-rework.js.map +1 -1
  79. package/dist/merge/candidate-tip-attribution.d.ts +135 -0
  80. package/dist/merge/candidate-tip-attribution.d.ts.map +1 -0
  81. package/dist/merge/candidate-tip-attribution.js +319 -0
  82. package/dist/merge/candidate-tip-attribution.js.map +1 -0
  83. package/dist/merge/completion-merge-driver.d.ts +49 -5
  84. package/dist/merge/completion-merge-driver.d.ts.map +1 -1
  85. package/dist/merge/completion-merge-driver.js +56 -2
  86. package/dist/merge/completion-merge-driver.js.map +1 -1
  87. package/dist/merge/completion-merge-gate.d.ts +4 -1
  88. package/dist/merge/completion-merge-gate.d.ts.map +1 -1
  89. package/dist/merge/completion-merge-gate.js +9 -8
  90. package/dist/merge/completion-merge-gate.js.map +1 -1
  91. package/dist/queries/api-client/shared.d.ts.map +1 -1
  92. package/dist/queries/api-client/shared.js +6 -1
  93. package/dist/queries/api-client/shared.js.map +1 -1
  94. package/dist/queries/candidate-ci-reds/candidate-ci-reds.d.ts +35 -0
  95. package/dist/queries/candidate-ci-reds/candidate-ci-reds.d.ts.map +1 -0
  96. package/dist/queries/candidate-ci-reds/candidate-ci-reds.js +42 -0
  97. package/dist/queries/candidate-ci-reds/candidate-ci-reds.js.map +1 -0
  98. package/dist/queries/candidate-ci-reds/gate-escape-files.d.ts +16 -0
  99. package/dist/queries/candidate-ci-reds/gate-escape-files.d.ts.map +1 -0
  100. package/dist/queries/candidate-ci-reds/gate-escape-files.js +51 -0
  101. package/dist/queries/candidate-ci-reds/gate-escape-files.js.map +1 -0
  102. package/dist/queries/focuses/ended-arm.d.ts +55 -7
  103. package/dist/queries/focuses/ended-arm.d.ts.map +1 -1
  104. package/dist/queries/focuses/ended-arm.js +59 -8
  105. package/dist/queries/focuses/ended-arm.js.map +1 -1
  106. package/dist/queries/focuses/focus-discovery.d.ts +18 -8
  107. package/dist/queries/focuses/focus-discovery.d.ts.map +1 -1
  108. package/dist/queries/focuses/focus-discovery.js +1 -0
  109. package/dist/queries/focuses/focus-discovery.js.map +1 -1
  110. package/dist/queries/sessions/daemon-connection.d.ts.map +1 -1
  111. package/dist/queries/sessions/daemon-connection.js +1 -0
  112. package/dist/queries/sessions/daemon-connection.js.map +1 -1
  113. package/dist/queries/verification/verification.js +1 -1
  114. package/dist/queries/wire-schemas/schemas.d.ts +2 -0
  115. package/dist/queries/wire-schemas/schemas.d.ts.map +1 -1
  116. package/dist/queries/wire-schemas/schemas.js +10 -3
  117. package/dist/queries/wire-schemas/schemas.js.map +1 -1
  118. package/dist/resolvers/delivery-acceptance-criteria.d.ts +23 -1
  119. package/dist/resolvers/delivery-acceptance-criteria.d.ts.map +1 -1
  120. package/dist/resolvers/delivery-acceptance-criteria.js +52 -8
  121. package/dist/resolvers/delivery-acceptance-criteria.js.map +1 -1
  122. package/dist/shell/unified-shell.d.ts +25 -0
  123. package/dist/shell/unified-shell.d.ts.map +1 -1
  124. package/dist/shell/unified-shell.js +26 -80
  125. package/dist/shell/unified-shell.js.map +1 -1
  126. package/dist/shell/update-restart.d.ts +47 -0
  127. package/dist/shell/update-restart.d.ts.map +1 -0
  128. package/dist/shell/update-restart.js +124 -0
  129. package/dist/shell/update-restart.js.map +1 -0
  130. package/dist/supervision/escalation-suppression.js +1 -1
  131. package/dist/supervision/recorded-new-intent.d.ts +49 -0
  132. package/dist/supervision/recorded-new-intent.d.ts.map +1 -1
  133. package/dist/supervision/recorded-new-intent.js +10 -2
  134. package/dist/supervision/recorded-new-intent.js.map +1 -1
  135. package/dist/testing/fixtures/api-client.js +1 -1
  136. package/dist/testing/fixtures/completion-judge-stubs.d.ts +7 -2
  137. package/dist/testing/fixtures/completion-judge-stubs.d.ts.map +1 -1
  138. package/dist/testing/fixtures/completion-judge-stubs.js +11 -1
  139. package/dist/testing/fixtures/completion-judge-stubs.js.map +1 -1
  140. package/dist/testing/fixtures/index.js +1 -1
  141. package/dist/testing/fixtures/merge-log-capture.d.ts.map +1 -1
  142. package/dist/testing/fixtures/merge-log-capture.js +1 -0
  143. package/dist/testing/fixtures/merge-log-capture.js.map +1 -1
  144. package/dist/testing/fixtures/recording-api-client.js +1 -1
  145. package/dist/testing/fixtures/verification-deps.d.ts +7 -0
  146. package/dist/testing/fixtures/verification-deps.d.ts.map +1 -1
  147. package/dist/testing/fixtures/verification-deps.js +17 -1
  148. package/dist/testing/fixtures/verification-deps.js.map +1 -1
  149. package/dist/testing/fixtures/vitest-failure-log.d.ts.map +1 -1
  150. package/dist/testing/fixtures/vitest-failure-log.js +2 -1
  151. package/dist/testing/fixtures/vitest-failure-log.js.map +1 -1
  152. package/dist/update/auto-update.d.ts +11 -5
  153. package/dist/update/auto-update.d.ts.map +1 -1
  154. package/dist/update/auto-update.js +11 -5
  155. package/dist/update/auto-update.js.map +1 -1
  156. package/dist/update/restart-contract.d.ts +62 -0
  157. package/dist/update/restart-contract.d.ts.map +1 -0
  158. package/dist/update/restart-contract.js +137 -0
  159. package/dist/update/restart-contract.js.map +1 -0
  160. package/dist/verify/attribution/verification-baseline-run.d.ts.map +1 -1
  161. package/dist/verify/attribution/verification-baseline-run.js +1 -0
  162. package/dist/verify/attribution/verification-baseline-run.js.map +1 -1
  163. package/dist/verify/ci-gate/ci-gate-dispatch.d.ts +3 -0
  164. package/dist/verify/ci-gate/ci-gate-dispatch.d.ts.map +1 -1
  165. package/dist/verify/ci-gate/ci-gate-dispatch.js +31 -9
  166. package/dist/verify/ci-gate/ci-gate-dispatch.js.map +1 -1
  167. package/dist/verify/ci-gate/ci-gate-wait-record.d.ts +6 -0
  168. package/dist/verify/ci-gate/ci-gate-wait-record.d.ts.map +1 -1
  169. package/dist/verify/ci-gate/ci-gate-wait-record.js +1 -0
  170. package/dist/verify/ci-gate/ci-gate-wait-record.js.map +1 -1
  171. package/dist/verify/deterministic-gate/verification-checkout.d.ts +12 -2
  172. package/dist/verify/deterministic-gate/verification-checkout.d.ts.map +1 -1
  173. package/dist/verify/deterministic-gate/verification-checkout.js +18 -3
  174. package/dist/verify/deterministic-gate/verification-checkout.js.map +1 -1
  175. package/dist/verify/deterministic-gate/verification-deterministic.js +1 -1
  176. package/dist/verify/deterministic-gate/verification-failure-parser.d.ts +30 -9
  177. package/dist/verify/deterministic-gate/verification-failure-parser.d.ts.map +1 -1
  178. package/dist/verify/deterministic-gate/verification-failure-parser.js +52 -8
  179. package/dist/verify/deterministic-gate/verification-failure-parser.js.map +1 -1
  180. package/dist/verify/engine/verification-commit-sharing.d.ts.map +1 -1
  181. package/dist/verify/engine/verification-commit-sharing.js +6 -2
  182. package/dist/verify/engine/verification-commit-sharing.js.map +1 -1
  183. package/dist/verify/engine/verification-deps.d.ts +9 -0
  184. package/dist/verify/engine/verification-deps.d.ts.map +1 -1
  185. package/dist/verify/engine/verification-deps.js +1 -1
  186. package/dist/verify/engine/verification-engine.d.ts.map +1 -1
  187. package/dist/verify/engine/verification-engine.js +4 -1
  188. package/dist/verify/engine/verification-engine.js.map +1 -1
  189. package/dist/verify/escaped-tests/escaped-pass-store.d.ts +19 -0
  190. package/dist/verify/escaped-tests/escaped-pass-store.d.ts.map +1 -0
  191. package/dist/verify/escaped-tests/escaped-pass-store.js +90 -0
  192. package/dist/verify/escaped-tests/escaped-pass-store.js.map +1 -0
  193. package/dist/verify/escaped-tests/escaped-test-run.d.ts +39 -0
  194. package/dist/verify/escaped-tests/escaped-test-run.d.ts.map +1 -0
  195. package/dist/verify/escaped-tests/escaped-test-run.js +156 -0
  196. package/dist/verify/escaped-tests/escaped-test-run.js.map +1 -0
  197. package/dist/verify/escaped-tests/escaped-test-set.d.ts +65 -0
  198. package/dist/verify/escaped-tests/escaped-test-set.d.ts.map +1 -0
  199. package/dist/verify/escaped-tests/escaped-test-set.js +95 -0
  200. package/dist/verify/escaped-tests/escaped-test-set.js.map +1 -0
  201. package/dist/verify/escaped-tests/escaped-tests-source.d.ts +44 -0
  202. package/dist/verify/escaped-tests/escaped-tests-source.d.ts.map +1 -0
  203. package/dist/verify/escaped-tests/escaped-tests-source.js +142 -0
  204. package/dist/verify/escaped-tests/escaped-tests-source.js.map +1 -0
  205. package/dist/verify/gate-config/verification-manifest.d.ts +12 -1
  206. package/dist/verify/gate-config/verification-manifest.d.ts.map +1 -1
  207. package/dist/verify/gate-config/verification-manifest.js +12 -1
  208. package/dist/verify/gate-config/verification-manifest.js.map +1 -1
  209. package/dist/verify/gate-verdicts/commit-verdict-record.js +1 -1
  210. package/package.json +2 -2
  211. package/scripts/telora-daemon-wrapper.sh +16 -7
@@ -0,0 +1,240 @@
1
+ // PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
2
+ // Pinned by: packages/daemon/src/ci/candidate-failure-contract.test.ts,
3
+ // packages/daemon/src/merge/candidate-ci-failures.test.ts,
4
+ // packages/daemon/src/merge/candidate-red-record.test.ts,
5
+ // packages/daemon/src/merge/candidate-tip-attribution.test.ts,
6
+ // packages/daemon/src/merge/completion-merge-driver.test.ts
7
+ // PINNED-BY-END
8
+ /**
9
+ * The test files a red integration candidate failed in CI, as the daemon HOLDS
10
+ * them: read back over git from the run's failure records
11
+ * (ci/candidate-failure-record.ts), parsed with the gate's own failure parser
12
+ * (verify/deterministic-gate/verification-failure-parser.ts), and kept per
13
+ * (product, focus, candidate sha) under the global state dir.
14
+ *
15
+ * Read when the completion merge driver routes a red candidate's rework
16
+ * (merge/completion-merge-driver.ts), whose Bug names the files
17
+ * (merge/candidate-rework.ts). A held set is reused while the run that decided
18
+ * red, and the records that run has published, are the ones it was read from; a
19
+ * newer red run of the same commit, or another job's record of the same run, is
20
+ * read afresh.
21
+ *
22
+ * Sharded CI: every record (job) of the deciding run is merged into ONE set. A
23
+ * record whose log was cut, could not be read, or reported failures none of
24
+ * whose ids names a test file makes the set INCOMPLETE (`complete: false`):
25
+ * the files it holds failed, but they may not be all that failed. A run that
26
+ * published no record yields null -- the daemon holds nothing, exactly as before
27
+ * records existed -- and so does any read that fails. Nothing here can turn a red
28
+ * into a green.
29
+ *
30
+ * A LATE RECORD: CI may publish the red status before the failing job's record
31
+ * lands, and the red's rework is routed once (it re-opens the focus, and the
32
+ * candidate is not read again). So for a product whose CI has published a
33
+ * failure record before (one is held for it on this host), a red with no record
34
+ * yet waits up to FAILURE_RECORD_WAIT_MS from this process's first sighting
35
+ * before its rework is routed without files ({@link awaitsFailureRecord}). A
36
+ * product that has never published one waits not at all: no record is coming.
37
+ *
38
+ * @module merge/candidate-ci-failures
39
+ */
40
+ import { mkdirSync, readdirSync, readFileSync, renameSync, writeFileSync } from 'node:fs';
41
+ import { resolve } from 'node:path';
42
+ import { resolveGlobalStateDir } from '../daemon-state/daemon-process.js';
43
+ import { createLogger } from '../log/daemon-log.js';
44
+ import { decidingRedRun, recordsOfRun, } from '../ci/candidate-failure-record.js';
45
+ import { parseFailingTests, reportedFailureCount } from '../verify/deterministic-gate/verification-failure-parser.js';
46
+ import { testFileOfId } from '../verify/failing-test-rerun/rerun-command.js';
47
+ const log = createLogger({ module: 'completion-merge' });
48
+ /** How long a red with no failure record yet waits for one, when its product's CI publishes them (module doc). */
49
+ export const FAILURE_RECORD_WAIT_MS = 15 * 60 * 1000;
50
+ /** The most failing-test ids a held set keeps (the files are what is used; ids are for the record). */
51
+ export const HELD_FAILING_TEST_IDS_MAX = 200;
52
+ /** The repo-relative test file an id names in a log run under `root`, or null. Pure. */
53
+ function repoFileOf(id, root, workspace) {
54
+ const prefix = (file) => (root ? `${root}/${file}` : file);
55
+ const relative = testFileOfId(id, []);
56
+ if (relative !== null && !id.trimStart().startsWith('/'))
57
+ return prefix(relative);
58
+ if (workspace === null)
59
+ return null;
60
+ const absRoot = root ? `${workspace.replace(/\/+$/, '')}/${root}` : workspace;
61
+ const underRoot = testFileOfId(id, [absRoot]);
62
+ if (underRoot !== null)
63
+ return prefix(underRoot);
64
+ return testFileOfId(id, [workspace]);
65
+ }
66
+ /**
67
+ * Merge a run's records into one failing set; null when there is no record.
68
+ * A log whose step exited non-zero (its record's `exitCode`) but which yields
69
+ * no failing-test id is unparseable red, so the set is incomplete -- never a
70
+ * complete empty one. Pure (the read time is passed in).
71
+ */
72
+ export function failuresFromRecords(sha, run, records, readAt) {
73
+ if (records.length === 0)
74
+ return null;
75
+ const files = new Set();
76
+ const tests = new Set();
77
+ let complete = true;
78
+ for (const record of records) {
79
+ for (const logEntry of record.logs) {
80
+ if (logEntry.text === null || logEntry.truncated)
81
+ complete = false;
82
+ if (logEntry.text === null)
83
+ continue;
84
+ const ids = [...parseFailingTests(logEntry.text)];
85
+ let named = 0;
86
+ for (const id of ids) {
87
+ const file = repoFileOf(id, logEntry.root, record.workspace);
88
+ if (file === null) {
89
+ tests.add(id);
90
+ continue;
91
+ }
92
+ named += 1;
93
+ files.add(file);
94
+ tests.add([file, ...id.split(' > ').slice(1)].join(' > '));
95
+ }
96
+ const reported = reportedFailureCount(logEntry.text);
97
+ if ((ids.length > 0 && named === 0) || (ids.length === 0 && reported !== null && reported > 0))
98
+ complete = false;
99
+ const stepFailed = typeof logEntry.exitCode === 'number' && logEntry.exitCode !== 0;
100
+ if (ids.length === 0 && stepFailed)
101
+ complete = false;
102
+ }
103
+ }
104
+ return {
105
+ sha,
106
+ run,
107
+ jobs: [...new Set(records.map((r) => r.job))].sort(),
108
+ failingFiles: [...files].sort(),
109
+ failingTests: [...tests].sort().slice(0, HELD_FAILING_TEST_IDS_MAX),
110
+ complete,
111
+ readAt,
112
+ };
113
+ }
114
+ /** Whether a held set was read from exactly the records the run has published now. Pure. */
115
+ function sameJobs(heldJobs, published) {
116
+ const now = [...new Set(published.map((p) => p.job))].sort();
117
+ return now.length === heldJobs.length && now.every((job, i) => job === heldJobs[i]);
118
+ }
119
+ /**
120
+ * The failing test files of the red candidate `sha`: the held set when it was
121
+ * read from the run that decided red AND from every record that run has
122
+ * published now -- a job whose record lands after the set was held (another
123
+ * shard, the e2e job) makes it read again -- else read now (and held). Null when the
124
+ * deciding run published no record -- a set held from ANOTHER run of the same
125
+ * commit is never answered for it, since its files did not fail in this run --
126
+ * or on any failure. Never throws.
127
+ */
128
+ export function readCandidateCiFailures(sha, deps) {
129
+ try {
130
+ const run = decidingRedRun(deps.listCiStatusRefs(sha));
131
+ const published = recordsOfRun(deps.listRecords(sha), run);
132
+ const held = deps.readHeld(sha);
133
+ if (held !== null && run !== null && held.run === run && sameJobs(held.jobs, published))
134
+ return held;
135
+ const records = published.map((p) => deps.readRecord(p)).filter((r) => r !== null);
136
+ const failures = failuresFromRecords(sha, run ?? published[0]?.run ?? null, records, deps.now());
137
+ if (failures === null)
138
+ return null;
139
+ // A record that was listed but could not be read is part of the run that is missing.
140
+ const read = records.length === published.length ? failures : { ...failures, complete: false };
141
+ deps.hold(read);
142
+ return read;
143
+ }
144
+ catch (err) {
145
+ log.warn(`[completion-merge] the CI failure record of candidate ${sha.slice(0, 9)} could not be read: ${err.message}`);
146
+ return null;
147
+ }
148
+ }
149
+ // ---------------------------------------------------------------------------
150
+ // The hold: one file per (product, focus, candidate sha), written atomically.
151
+ // ---------------------------------------------------------------------------
152
+ function heldDir() {
153
+ return resolve(resolveGlobalStateDir(), 'candidate-ci-failures');
154
+ }
155
+ /** The held file for a candidate; `dir` defaults to the global state dir. Exported for tests. */
156
+ export function candidateCiFailuresPath(productId, focusId, sha, dir = heldDir()) {
157
+ return resolve(dir, `${productId}-${focusId}-${sha}.json`.replace(/[^a-zA-Z0-9._-]/g, '_'));
158
+ }
159
+ const isStrings = (v) => Array.isArray(v) && v.every((s) => typeof s === 'string');
160
+ /** Parse a held file; null when it is not a well-formed set. Pure. */
161
+ export function parseHeldCandidateCiFailures(text) {
162
+ let raw;
163
+ try {
164
+ raw = JSON.parse(text);
165
+ }
166
+ catch {
167
+ return null;
168
+ }
169
+ if (typeof raw !== 'object' || raw === null)
170
+ return null;
171
+ const r = raw;
172
+ if (typeof r.sha !== 'string' || !(r.run === null || (typeof r.run === 'number' && Number.isSafeInteger(r.run))))
173
+ return null;
174
+ if (!isStrings(r.jobs) || !isStrings(r.failingFiles) || !isStrings(r.failingTests))
175
+ return null;
176
+ if (typeof r.complete !== 'boolean' || typeof r.readAt !== 'string')
177
+ return null;
178
+ return { sha: r.sha, run: r.run, jobs: r.jobs, failingFiles: r.failingFiles, failingTests: r.failingTests, complete: r.complete, readAt: r.readAt };
179
+ }
180
+ /** The set held for a candidate; null when none is, or it is unreadable. */
181
+ export function readHeldCandidateCiFailures(productId, focusId, sha, dir = heldDir()) {
182
+ try {
183
+ return parseHeldCandidateCiFailures(readFileSync(candidateCiFailuresPath(productId, focusId, sha, dir), 'utf8'));
184
+ }
185
+ catch {
186
+ return null;
187
+ }
188
+ }
189
+ /** Hold a candidate's set (temp + rename). A failed write is logged, never thrown. */
190
+ export function holdCandidateCiFailures(productId, focusId, failures, dir = heldDir()) {
191
+ const path = candidateCiFailuresPath(productId, focusId, failures.sha, dir);
192
+ try {
193
+ mkdirSync(dir, { recursive: true });
194
+ const tmp = `${path}.${process.pid}.tmp`;
195
+ writeFileSync(tmp, JSON.stringify(failures, null, 2));
196
+ renameSync(tmp, path);
197
+ }
198
+ catch (err) {
199
+ log.warn(`[completion-merge] could not hold the CI failures of candidate ${failures.sha.slice(0, 9)}: ${err.message}`);
200
+ }
201
+ }
202
+ // ---------------------------------------------------------------------------
203
+ // The wait for a late record (module doc).
204
+ // ---------------------------------------------------------------------------
205
+ /** When this process first saw each (product, focus, candidate) red with no record. */
206
+ const firstSeenWithoutRecord = new Map();
207
+ /** Reset the wait's memory -- tests start from a clean slate. */
208
+ export function __resetFailureRecordWaitForTests() {
209
+ firstSeenWithoutRecord.clear();
210
+ }
211
+ /** Whether this host has ever held a CI failure set for the product: its CI publishes records. */
212
+ export function productPublishesFailureRecords(productId, dir = heldDir()) {
213
+ const prefix = `${productId}-`.replace(/[^a-zA-Z0-9._-]/g, '_');
214
+ try {
215
+ return readdirSync(dir).some((name) => name.startsWith(prefix) && name.endsWith('.json'));
216
+ }
217
+ catch {
218
+ return false;
219
+ }
220
+ }
221
+ /**
222
+ * Whether the red candidate `sha`, which has no failure record yet, should wait
223
+ * for one this tick rather than have its rework routed without files: only when
224
+ * the product publishes records, and only within FAILURE_RECORD_WAIT_MS of this
225
+ * process's first sighting. Never throws.
226
+ */
227
+ export function awaitsFailureRecord(subject, sha, now, publishes) {
228
+ const key = `${subject.productId}:${subject.focusId}:${sha}`;
229
+ const since = firstSeenWithoutRecord.get(key) ?? now;
230
+ firstSeenWithoutRecord.set(key, since);
231
+ if (now - since >= FAILURE_RECORD_WAIT_MS)
232
+ return false;
233
+ try {
234
+ return publishes(subject.productId);
235
+ }
236
+ catch {
237
+ return false;
238
+ }
239
+ }
240
+ //# sourceMappingURL=candidate-ci-failures.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"candidate-ci-failures.js","sourceRoot":"","sources":["../../src/merge/candidate-ci-failures.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,44 @@
1
+ import { type CandidateCiRedRequest, type CandidateCiRedResult, type CandidateRedGateOutcome } from '../queries/candidate-ci-reds/candidate-ci-reds.js';
2
+ import type { CandidateCiFailures } from './candidate-ci-failures.js';
3
+ /** The focus a red candidate belongs to. */
4
+ export interface CandidateRedSubject {
5
+ productId: string;
6
+ focusId: string;
7
+ focusName: string;
8
+ }
9
+ /** The newest gate verdict recorded at a commit, as the record reads it. */
10
+ export interface CandidateRedVerdict {
11
+ outcome: 'passed' | 'failed';
12
+ /** ci/gate-ref.ts gateRunKey of the gate the verdict was rendered under. */
13
+ gateKey: string;
14
+ recordedAt: string;
15
+ }
16
+ /** The reads and the write, bound at the composition root (composition/execution-merge-context.ts). */
17
+ export interface CandidateRedRecordDeps {
18
+ /** The newest verdict recorded for the commit under any gate; null when none is. */
19
+ readVerdict: (productId: string, focusId: string, sha: string) => CandidateRedVerdict | null;
20
+ /** The shas carrying a recorded review auto-approval. */
21
+ listAutoApprovalShas: (productId: string, focusId: string) => string[];
22
+ /**
23
+ * The CI run that decided the candidate red, from its refs/ci-status refs
24
+ * (ci/candidate-failure-record.ts decidingRedRun) -- so a red recorded before
25
+ * its failure record exists is keyed by the same run as one recorded after.
26
+ */
27
+ readRedRun: (candidateSha: string) => number | null;
28
+ record: (request: CandidateCiRedRequest) => Promise<CandidateCiRedResult>;
29
+ }
30
+ /** Reset the recorded keys -- tests start from a clean slate. */
31
+ export declare function __resetCandidateRedRecordForTests(): void;
32
+ /** The gate's outcome at the approved head, with the verdict that gives it its key (module doc). Pure. */
33
+ export declare function gateAtApprovedHead(verdict: CandidateRedVerdict | null, autoApproved: boolean): {
34
+ gateOutcome: CandidateRedGateOutcome;
35
+ verdict: CandidateRedVerdict | null;
36
+ };
37
+ /** The record of a red candidate. Pure apart from the gate reads in `deps`; throws when one does. */
38
+ export declare function buildCandidateRedRequest(subject: CandidateRedSubject, candidateSha: string, approvedSha: string | undefined, failures: CandidateCiFailures | null, deps: Pick<CandidateRedRecordDeps, 'readVerdict' | 'listAutoApprovalShas' | 'readRedRun'>): CandidateCiRedRequest;
39
+ /**
40
+ * Record the red candidate `candidateSha` of the subject's focus (module doc).
41
+ * Never throws; a failed read or write is logged and retried on a later tick.
42
+ */
43
+ export declare function recordCandidateRed(subject: CandidateRedSubject, candidateSha: string, approvedSha: string | undefined, failures: CandidateCiFailures | null, deps: CandidateRedRecordDeps): Promise<void>;
44
+ //# sourceMappingURL=candidate-red-record.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"candidate-red-record.d.ts","sourceRoot":"","sources":["../../src/merge/candidate-red-record.ts"],"names":[],"mappings":"AAoCA,OAAO,EAEL,KAAK,qBAAqB,EAC1B,KAAK,oBAAoB,EACzB,KAAK,uBAAuB,EAC7B,MAAM,mDAAmD,CAAC;AAC3D,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,4BAA4B,CAAC;AAKtE,4CAA4C;AAC5C,MAAM,WAAW,mBAAmB;IAClC,SAAS,EAAE,MAAM,CAAC;IAClB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC;CACnB;AAED,4EAA4E;AAC5E,MAAM,WAAW,mBAAmB;IAClC,OAAO,EAAE,QAAQ,GAAG,QAAQ,CAAC;IAC7B,4EAA4E;IAC5E,OAAO,EAAE,MAAM,CAAC;IAChB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,uGAAuG;AACvG,MAAM,WAAW,sBAAsB;IACrC,oFAAoF;IACpF,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,KAAK,mBAAmB,GAAG,IAAI,CAAC;IAC7F,yDAAyD;IACzD,oBAAoB,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,KAAK,MAAM,EAAE,CAAC;IACvE;;;;OAIG;IACH,UAAU,EAAE,CAAC,YAAY,EAAE,MAAM,KAAK,MAAM,GAAG,IAAI,CAAC;IACpD,MAAM,EAAE,CAAC,OAAO,EAAE,qBAAqB,KAAK,OAAO,CAAC,oBAAoB,CAAC,CAAC;CAC3E;AAUD,iEAAiE;AACjE,wBAAgB,iCAAiC,IAAI,IAAI,CAExD;AAED,0GAA0G;AAC1G,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,mBAAmB,GAAG,IAAI,EACnC,YAAY,EAAE,OAAO,GACpB;IAAE,WAAW,EAAE,uBAAuB,CAAC;IAAC,OAAO,EAAE,mBAAmB,GAAG,IAAI,CAAA;CAAE,CAG/E;AAED,qGAAqG;AACrG,wBAAgB,wBAAwB,CACtC,OAAO,EAAE,mBAAmB,EAC5B,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,QAAQ,EAAE,mBAAmB,GAAG,IAAI,EACpC,IAAI,EAAE,IAAI,CAAC,sBAAsB,EAAE,aAAa,GAAG,sBAAsB,GAAG,YAAY,CAAC,GACxF,qBAAqB,CAoBvB;AASD;;;GAGG;AACH,wBAAsB,kBAAkB,CACtC,OAAO,EAAE,mBAAmB,EAC5B,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,QAAQ,EAAE,mBAAmB,GAAG,IAAI,EACpC,IAAI,EAAE,sBAAsB,GAC3B,OAAO,CAAC,IAAI,CAAC,CAYf"}
@@ -0,0 +1,98 @@
1
+ // PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
2
+ // Pinned by: packages/daemon/src/merge/candidate-red-record.test.ts
3
+ // PINNED-BY-END
4
+ /**
5
+ * The record of a red integration candidate beside the gate verdict of the head
6
+ * it was built from -- and so of a GATE ESCAPE: the focus's deterministic gate
7
+ * passed the approved head, and CI found the candidate built from it red.
8
+ *
9
+ * The completion merge driver (merge/completion-merge-driver.ts) calls this in
10
+ * its `rework` step, before the re-work is routed, with the approved head the
11
+ * gate's hold names (merge/completion-merge-gate.ts) and the failing test files
12
+ * CI's failure record holds (merge/candidate-ci-failures.ts). The gate outcome
13
+ * at the approved head is:
14
+ * - 'passed' when the newest verdict recorded for that commit under any gate
15
+ * (verify/gate-verdicts/commit-verdict-record.ts) passed, or the commit
16
+ * carries a recorded review auto-approval
17
+ * (merge/review-auto-approval-record.ts), which is written only after a
18
+ * passing verdict gate;
19
+ * - 'failed' when that newest verdict failed;
20
+ * - 'none' when no verdict is recorded there, or no approved head was named.
21
+ * The gate's key and recordedAt are sent only from a verdict whose outcome is
22
+ * the one reported. The record goes to product-api
23
+ * (queries/candidate-ci-reds/candidate-ci-reds.ts), which upserts it.
24
+ *
25
+ * NEVER THROWS and never blocks the re-work: a failed read or write is logged
26
+ * and swallowed. A (focus, candidate, run) this process recorded is posted
27
+ * again only when what it says of the failing files changed -- a failure record
28
+ * that arrived after the red was first recorded is posted as a refresh, which
29
+ * product-api applies to the existing row -- and one whose post failed is
30
+ * retried on a later tick.
31
+ *
32
+ * @module merge/candidate-red-record
33
+ */
34
+ import { sameCommit } from '../queries/focus-review/focus-review-approval.js';
35
+ import { CANDIDATE_CI_RED_MAX_FILES, } from '../queries/candidate-ci-reds/candidate-ci-reds.js';
36
+ import { createLogger } from '../log/daemon-log.js';
37
+ const log = createLogger({ module: 'completion-merge' });
38
+ /** The (focus, candidate, run) keys this process recorded, each with what its post said of the failing files. */
39
+ const recorded = new Map();
40
+ /** What a request says of the failing files: none held, or the held set and whether it is complete. Pure. */
41
+ function filesSignature(request) {
42
+ return request.failingFilesComplete === null ? 'no-record' : `${request.failingFilesComplete}:${request.failingTestFiles.join('\n')}`;
43
+ }
44
+ /** Reset the recorded keys -- tests start from a clean slate. */
45
+ export function __resetCandidateRedRecordForTests() {
46
+ recorded.clear();
47
+ }
48
+ /** The gate's outcome at the approved head, with the verdict that gives it its key (module doc). Pure. */
49
+ export function gateAtApprovedHead(verdict, autoApproved) {
50
+ const gateOutcome = autoApproved ? 'passed' : verdict?.outcome ?? 'none';
51
+ return { gateOutcome, verdict: verdict !== null && verdict.outcome === gateOutcome ? verdict : null };
52
+ }
53
+ /** The record of a red candidate. Pure apart from the gate reads in `deps`; throws when one does. */
54
+ export function buildCandidateRedRequest(subject, candidateSha, approvedSha, failures, deps) {
55
+ const { productId, focusId } = subject;
56
+ const gate = approvedSha === undefined
57
+ ? { gateOutcome: 'none', verdict: null }
58
+ : gateAtApprovedHead(deps.readVerdict(productId, focusId, approvedSha), deps.listAutoApprovalShas(productId, focusId).some((s) => sameCommit(s, approvedSha)));
59
+ return {
60
+ productId,
61
+ focusId,
62
+ candidateSha,
63
+ ciRun: failures?.run ?? deps.readRedRun(candidateSha),
64
+ approvedHeadSha: approvedSha ?? null,
65
+ gateOutcome: gate.gateOutcome,
66
+ gateKey: gate.verdict?.gateKey ?? null,
67
+ gateRecordedAt: gate.verdict?.recordedAt ?? null,
68
+ failingTestFiles: (failures?.failingFiles ?? []).slice(0, CANDIDATE_CI_RED_MAX_FILES),
69
+ failingFilesComplete: failures === null ? null : failures.complete,
70
+ };
71
+ }
72
+ function describeEscape(request) {
73
+ const head = request.approvedHeadSha?.slice(0, 9) ?? 'unknown';
74
+ const run = request.ciRun === null ? 'an unknown run' : `run ${request.ciRun}`;
75
+ const files = `${request.failingTestFiles.length} failing file(s)${request.failingFilesComplete === false ? ' (incomplete)' : ''}`;
76
+ return `gate escape: gate passed ${head}, candidate ${request.candidateSha.slice(0, 9)} red in CI ${run}, ${files}`;
77
+ }
78
+ /**
79
+ * Record the red candidate `candidateSha` of the subject's focus (module doc).
80
+ * Never throws; a failed read or write is logged and retried on a later tick.
81
+ */
82
+ export async function recordCandidateRed(subject, candidateSha, approvedSha, failures, deps) {
83
+ try {
84
+ const request = buildCandidateRedRequest(subject, candidateSha, approvedSha, failures, deps);
85
+ const key = `${subject.productId}:${subject.focusId}:${candidateSha}:${request.ciRun ?? 'none'}`;
86
+ const signature = filesSignature(request);
87
+ if (recorded.get(key) === signature)
88
+ return;
89
+ const result = await deps.record(request);
90
+ recorded.set(key, signature);
91
+ if (result.isGateEscape)
92
+ log.info(`[completion-merge] "${subject.focusName}": ${describeEscape(request)}`);
93
+ }
94
+ catch (err) {
95
+ log.warn(`[completion-merge] "${subject.focusName}": the red candidate ${candidateSha.slice(0, 9)} could not be recorded (retried next tick): ${err.message}`);
96
+ }
97
+ }
98
+ //# sourceMappingURL=candidate-red-record.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"candidate-red-record.js","sourceRoot":"","sources":["../../src/merge/candidate-red-record.ts"],"names":[],"mappings":"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"}
@@ -35,9 +35,10 @@ export interface CandidateReworkDeps {
35
35
  export declare function candidateReworkTitle(sha: string, cause: CandidateReworkCause): string;
36
36
  /**
37
37
  * The Bug's description, within ISSUE_DESCRIPTION_BUDGET whatever its lists and
38
- * fields hold. Pure. A red candidate's names the CI-log read for THIS
39
- * product's repo (`ciRepo`, from its origin remote) at the candidate commit --
40
- * never the reader's syntelyos/telora default.
38
+ * fields hold. Pure. A red candidate's names the test files that failed when
39
+ * the daemon holds them, and the CI-log read for THIS product's repo (`ciRepo`,
40
+ * from its origin remote) at the candidate commit -- never the reader's
41
+ * syntelyos/telora default.
41
42
  */
42
43
  export declare function candidateReworkDescription(subject: CompletionMergeSubject, sha: string, cause: CandidateReworkCause, detail: CandidateReworkDetail | null, ciRepo: ProductCiRepo): string;
43
44
  /** Which done delivery owns the re-work. Pure. */
@@ -1 +1 @@
1
- {"version":3,"file":"candidate-rework.d.ts","sourceRoot":"","sources":["../../src/merge/candidate-rework.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"candidate-rework.d.ts","sourceRoot":"","sources":["../../src/merge/candidate-rework.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,9 @@
1
1
  // PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
2
- // Pinned by: packages/daemon/src/ci/ci-log-instruction-bindings.test.ts,
2
+ // Pinned by: packages/daemon/src/ci/candidate-failure-contract.test.ts,
3
+ // packages/daemon/src/ci/ci-log-instruction-bindings.test.ts,
3
4
  // packages/daemon/src/integration/commits-after-approval-review-regression.test.ts,
4
5
  // packages/daemon/src/integration/same-run-rerun-candidate-merge-regression.test.ts,
6
+ // packages/daemon/src/merge/candidate-ci-failures.test.ts,
5
7
  // packages/daemon/src/merge/candidate-rework.test.ts,
6
8
  // packages/daemon/src/merge/completion-conflict-rework.test.ts,
7
9
  // packages/daemon/src/merge/completion-rework-armed.test.ts
@@ -113,6 +115,44 @@ function isLocalFailure(detail) {
113
115
  function isUnreviewedCommits(detail) {
114
116
  return detail !== null && 'approvedSha' in detail;
115
117
  }
118
+ function isCiFailures(detail) {
119
+ return detail !== null && 'failingFiles' in detail;
120
+ }
121
+ /**
122
+ * A red candidate's Bug: the failing test files CI's failure record named (when
123
+ * the daemon holds them), then the CI-log read for THIS product's repo at the
124
+ * candidate commit -- kept either way, since the files say where, not why.
125
+ */
126
+ function redCandidateDescription(subject, sha, failures, ciRepo) {
127
+ const intro = [
128
+ `CI's full suite FAILED on the focus's integration candidate ${field(sha)} (the focus branch merged with the integration tip).`,
129
+ '',
130
+ ];
131
+ const outro = [
132
+ '',
133
+ `Integration does not move until a candidate is green. Read the failing run first (its ref is ` +
134
+ `refs/heads/${field(candidateBranchForFocus(subject.focusId))}). ` +
135
+ // Only a pathological origin URL makes the CI-log instruction long; it is clipped like any other field.
136
+ clipText(ciLogInstructionText(ciLogInstruction(ciRepo, sha), sha), 3 * ISSUE_DESCRIPTION_FIELD_CAP),
137
+ '',
138
+ `Then fix it on ${field(subject.branchName)} and commit; the next review and candidate run judge the fix.`,
139
+ ];
140
+ if (failures === null || failures.failingFiles.length === 0) {
141
+ if (failures !== null) {
142
+ intro.push('CI published a failure record for the run, but no test file could be read from it -- the log names why.', '');
143
+ }
144
+ return [...intro, ...outro];
145
+ }
146
+ const run = failures.run === null ? 'its CI run' : `CI run ${failures.run}`;
147
+ const caveat = failures.complete
148
+ ? []
149
+ : ['', 'The record is INCOMPLETE (a log was cut, unreadable, or a failure named no file): other tests may have failed too.'];
150
+ const files = { title: `Test files that failed in ${run}`, items: failures.failingFiles, empty: 'none read' };
151
+ // One list: it takes all the room the fixed text leaves (its heading priced at its widest).
152
+ const room = ISSUE_DESCRIPTION_BUDGET - linesCost([...intro, ...caveat, ...outro, listHeading(files, files.items.length)]);
153
+ const list = renderBudgetedList(files.items.map((f) => field(f)), room);
154
+ return [...intro, listHeading(files, list.omitted), ...list.lines, ...caveat, ...outro];
155
+ }
116
156
  function unreviewedCommitsDescription(subject, sha, detail) {
117
157
  const approved = detail ? field(detail.approvedSha) : null;
118
158
  return [
@@ -139,9 +179,10 @@ function localFailureDescription(subject, sha, failure) {
139
179
  }
140
180
  /**
141
181
  * The Bug's description, within ISSUE_DESCRIPTION_BUDGET whatever its lists and
142
- * fields hold. Pure. A red candidate's names the CI-log read for THIS
143
- * product's repo (`ciRepo`, from its origin remote) at the candidate commit --
144
- * never the reader's syntelyos/telora default.
182
+ * fields hold. Pure. A red candidate's names the test files that failed when
183
+ * the daemon holds them, and the CI-log read for THIS product's repo (`ciRepo`,
184
+ * from its origin remote) at the candidate commit -- never the reader's
185
+ * syntelyos/telora default.
145
186
  */
146
187
  export function candidateReworkDescription(subject, sha, cause, detail, ciRepo) {
147
188
  if (cause === 'conflict')
@@ -159,16 +200,7 @@ export function candidateReworkDescription(subject, sha, cause, detail, ciRepo)
159
200
  'review before the completion merge is tried again.',
160
201
  ].join('\n');
161
202
  }
162
- return [
163
- `CI's full suite FAILED on the focus's integration candidate ${field(sha)} (the focus branch merged with the integration tip).`,
164
- '',
165
- `Integration does not move until a candidate is green. Read the failing run first (its ref is ` +
166
- `refs/heads/${field(candidateBranchForFocus(subject.focusId))}). ` +
167
- // Only a pathological origin URL makes the CI-log instruction long; it is clipped like any other field.
168
- clipText(ciLogInstructionText(ciLogInstruction(ciRepo, sha), sha), 3 * ISSUE_DESCRIPTION_FIELD_CAP),
169
- '',
170
- `Then fix it on ${field(subject.branchName)} and commit; the next review and candidate run judge the fix.`,
171
- ].join('\n');
203
+ return redCandidateDescription(subject, sha, isCiFailures(detail) ? detail : null, ciRepo).join('\n');
172
204
  }
173
205
  /** Which done delivery owns the re-work. Pure. */
174
206
  export function chooseReworkOwner(deliveries, trailers) {
@@ -1 +1 @@
1
- {"version":3,"file":"candidate-rework.js","sourceRoot":"","sources":["../../src/merge/candidate-rework.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"candidate-rework.js","sourceRoot":"","sources":["../../src/merge/candidate-rework.ts"],"names":[],"mappings":"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"}