@telora/daemon 0.24.17 → 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 (175) hide show
  1. package/build-info.json +6 -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/composition/execution-merge-context.d.ts +13 -0
  23. package/dist/composition/execution-merge-context.d.ts.map +1 -1
  24. package/dist/composition/execution-merge-context.js +76 -3
  25. package/dist/composition/execution-merge-context.js.map +1 -1
  26. package/dist/composition/focus-activity-live-sources.d.ts.map +1 -1
  27. package/dist/composition/focus-activity-live-sources.js +1 -0
  28. package/dist/composition/focus-activity-live-sources.js.map +1 -1
  29. package/dist/composition/runtime-heartbeat-context.d.ts +11 -0
  30. package/dist/composition/runtime-heartbeat-context.d.ts.map +1 -1
  31. package/dist/composition/runtime-heartbeat-context.js +26 -1
  32. package/dist/composition/runtime-heartbeat-context.js.map +1 -1
  33. package/dist/composition/team-liveness-phase-sources.d.ts.map +1 -1
  34. package/dist/composition/team-liveness-phase-sources.js +1 -0
  35. package/dist/composition/team-liveness-phase-sources.js.map +1 -1
  36. package/dist/composition/verification-context.d.ts.map +1 -1
  37. package/dist/composition/verification-context.js +34 -4
  38. package/dist/composition/verification-context.js.map +1 -1
  39. package/dist/focus/heartbeat-metadata.d.ts +5 -0
  40. package/dist/focus/heartbeat-metadata.d.ts.map +1 -1
  41. package/dist/focus/heartbeat-metadata.js +12 -0
  42. package/dist/focus/heartbeat-metadata.js.map +1 -1
  43. package/dist/focus/heartbeat.d.ts.map +1 -1
  44. package/dist/focus/heartbeat.js +1 -0
  45. package/dist/focus/heartbeat.js.map +1 -1
  46. package/dist/focus/host-pressure.d.ts +77 -0
  47. package/dist/focus/host-pressure.d.ts.map +1 -0
  48. package/dist/focus/host-pressure.js +83 -0
  49. package/dist/focus/host-pressure.js.map +1 -0
  50. package/dist/git/types.js +1 -1
  51. package/dist/merge/candidate-ci-failures.d.ts +72 -0
  52. package/dist/merge/candidate-ci-failures.d.ts.map +1 -0
  53. package/dist/merge/candidate-ci-failures.js +240 -0
  54. package/dist/merge/candidate-ci-failures.js.map +1 -0
  55. package/dist/merge/candidate-red-record.d.ts +44 -0
  56. package/dist/merge/candidate-red-record.d.ts.map +1 -0
  57. package/dist/merge/candidate-red-record.js +98 -0
  58. package/dist/merge/candidate-red-record.js.map +1 -0
  59. package/dist/merge/candidate-rework.d.ts +4 -3
  60. package/dist/merge/candidate-rework.d.ts.map +1 -1
  61. package/dist/merge/candidate-rework.js +46 -14
  62. package/dist/merge/candidate-rework.js.map +1 -1
  63. package/dist/merge/candidate-tip-attribution.d.ts +135 -0
  64. package/dist/merge/candidate-tip-attribution.d.ts.map +1 -0
  65. package/dist/merge/candidate-tip-attribution.js +319 -0
  66. package/dist/merge/candidate-tip-attribution.js.map +1 -0
  67. package/dist/merge/completion-merge-driver.d.ts +49 -5
  68. package/dist/merge/completion-merge-driver.d.ts.map +1 -1
  69. package/dist/merge/completion-merge-driver.js +56 -2
  70. package/dist/merge/completion-merge-driver.js.map +1 -1
  71. package/dist/merge/completion-merge-gate.d.ts +4 -1
  72. package/dist/merge/completion-merge-gate.d.ts.map +1 -1
  73. package/dist/merge/completion-merge-gate.js +9 -8
  74. package/dist/merge/completion-merge-gate.js.map +1 -1
  75. package/dist/queries/api-client/shared.d.ts.map +1 -1
  76. package/dist/queries/api-client/shared.js +6 -1
  77. package/dist/queries/api-client/shared.js.map +1 -1
  78. package/dist/queries/candidate-ci-reds/candidate-ci-reds.d.ts +35 -0
  79. package/dist/queries/candidate-ci-reds/candidate-ci-reds.d.ts.map +1 -0
  80. package/dist/queries/candidate-ci-reds/candidate-ci-reds.js +42 -0
  81. package/dist/queries/candidate-ci-reds/candidate-ci-reds.js.map +1 -0
  82. package/dist/queries/candidate-ci-reds/gate-escape-files.d.ts +16 -0
  83. package/dist/queries/candidate-ci-reds/gate-escape-files.d.ts.map +1 -0
  84. package/dist/queries/candidate-ci-reds/gate-escape-files.js +51 -0
  85. package/dist/queries/candidate-ci-reds/gate-escape-files.js.map +1 -0
  86. package/dist/queries/sessions/daemon-connection.d.ts.map +1 -1
  87. package/dist/queries/sessions/daemon-connection.js +1 -0
  88. package/dist/queries/sessions/daemon-connection.js.map +1 -1
  89. package/dist/queries/verification/verification.js +1 -1
  90. package/dist/shell/unified-shell.d.ts +25 -0
  91. package/dist/shell/unified-shell.d.ts.map +1 -1
  92. package/dist/shell/unified-shell.js +26 -80
  93. package/dist/shell/unified-shell.js.map +1 -1
  94. package/dist/shell/update-restart.d.ts +47 -0
  95. package/dist/shell/update-restart.d.ts.map +1 -0
  96. package/dist/shell/update-restart.js +124 -0
  97. package/dist/shell/update-restart.js.map +1 -0
  98. package/dist/supervision/escalation-suppression.js +1 -1
  99. package/dist/testing/fixtures/api-client.js +1 -1
  100. package/dist/testing/fixtures/completion-judge-stubs.d.ts +7 -2
  101. package/dist/testing/fixtures/completion-judge-stubs.d.ts.map +1 -1
  102. package/dist/testing/fixtures/completion-judge-stubs.js +11 -1
  103. package/dist/testing/fixtures/completion-judge-stubs.js.map +1 -1
  104. package/dist/testing/fixtures/index.js +1 -1
  105. package/dist/testing/fixtures/merge-log-capture.d.ts.map +1 -1
  106. package/dist/testing/fixtures/merge-log-capture.js +1 -0
  107. package/dist/testing/fixtures/merge-log-capture.js.map +1 -1
  108. package/dist/testing/fixtures/recording-api-client.js +1 -1
  109. package/dist/testing/fixtures/verification-deps.d.ts +7 -0
  110. package/dist/testing/fixtures/verification-deps.d.ts.map +1 -1
  111. package/dist/testing/fixtures/verification-deps.js +17 -1
  112. package/dist/testing/fixtures/verification-deps.js.map +1 -1
  113. package/dist/testing/fixtures/vitest-failure-log.d.ts.map +1 -1
  114. package/dist/testing/fixtures/vitest-failure-log.js +2 -1
  115. package/dist/testing/fixtures/vitest-failure-log.js.map +1 -1
  116. package/dist/update/auto-update.d.ts +11 -5
  117. package/dist/update/auto-update.d.ts.map +1 -1
  118. package/dist/update/auto-update.js +11 -5
  119. package/dist/update/auto-update.js.map +1 -1
  120. package/dist/update/restart-contract.d.ts +62 -0
  121. package/dist/update/restart-contract.d.ts.map +1 -0
  122. package/dist/update/restart-contract.js +137 -0
  123. package/dist/update/restart-contract.js.map +1 -0
  124. package/dist/verify/attribution/verification-baseline-run.d.ts.map +1 -1
  125. package/dist/verify/attribution/verification-baseline-run.js +1 -0
  126. package/dist/verify/attribution/verification-baseline-run.js.map +1 -1
  127. package/dist/verify/ci-gate/ci-gate-dispatch.d.ts +3 -0
  128. package/dist/verify/ci-gate/ci-gate-dispatch.d.ts.map +1 -1
  129. package/dist/verify/ci-gate/ci-gate-dispatch.js +31 -9
  130. package/dist/verify/ci-gate/ci-gate-dispatch.js.map +1 -1
  131. package/dist/verify/ci-gate/ci-gate-wait-record.d.ts +6 -0
  132. package/dist/verify/ci-gate/ci-gate-wait-record.d.ts.map +1 -1
  133. package/dist/verify/ci-gate/ci-gate-wait-record.js +1 -0
  134. package/dist/verify/ci-gate/ci-gate-wait-record.js.map +1 -1
  135. package/dist/verify/deterministic-gate/verification-checkout.d.ts +12 -2
  136. package/dist/verify/deterministic-gate/verification-checkout.d.ts.map +1 -1
  137. package/dist/verify/deterministic-gate/verification-checkout.js +18 -3
  138. package/dist/verify/deterministic-gate/verification-checkout.js.map +1 -1
  139. package/dist/verify/deterministic-gate/verification-deterministic.js +1 -1
  140. package/dist/verify/deterministic-gate/verification-failure-parser.d.ts +30 -9
  141. package/dist/verify/deterministic-gate/verification-failure-parser.d.ts.map +1 -1
  142. package/dist/verify/deterministic-gate/verification-failure-parser.js +52 -8
  143. package/dist/verify/deterministic-gate/verification-failure-parser.js.map +1 -1
  144. package/dist/verify/engine/verification-commit-sharing.d.ts.map +1 -1
  145. package/dist/verify/engine/verification-commit-sharing.js +6 -2
  146. package/dist/verify/engine/verification-commit-sharing.js.map +1 -1
  147. package/dist/verify/engine/verification-deps.d.ts +9 -0
  148. package/dist/verify/engine/verification-deps.d.ts.map +1 -1
  149. package/dist/verify/engine/verification-deps.js +1 -1
  150. package/dist/verify/engine/verification-engine.d.ts.map +1 -1
  151. package/dist/verify/engine/verification-engine.js +4 -1
  152. package/dist/verify/engine/verification-engine.js.map +1 -1
  153. package/dist/verify/escaped-tests/escaped-pass-store.d.ts +19 -0
  154. package/dist/verify/escaped-tests/escaped-pass-store.d.ts.map +1 -0
  155. package/dist/verify/escaped-tests/escaped-pass-store.js +90 -0
  156. package/dist/verify/escaped-tests/escaped-pass-store.js.map +1 -0
  157. package/dist/verify/escaped-tests/escaped-test-run.d.ts +39 -0
  158. package/dist/verify/escaped-tests/escaped-test-run.d.ts.map +1 -0
  159. package/dist/verify/escaped-tests/escaped-test-run.js +156 -0
  160. package/dist/verify/escaped-tests/escaped-test-run.js.map +1 -0
  161. package/dist/verify/escaped-tests/escaped-test-set.d.ts +65 -0
  162. package/dist/verify/escaped-tests/escaped-test-set.d.ts.map +1 -0
  163. package/dist/verify/escaped-tests/escaped-test-set.js +95 -0
  164. package/dist/verify/escaped-tests/escaped-test-set.js.map +1 -0
  165. package/dist/verify/escaped-tests/escaped-tests-source.d.ts +44 -0
  166. package/dist/verify/escaped-tests/escaped-tests-source.d.ts.map +1 -0
  167. package/dist/verify/escaped-tests/escaped-tests-source.js +142 -0
  168. package/dist/verify/escaped-tests/escaped-tests-source.js.map +1 -0
  169. package/dist/verify/gate-config/verification-manifest.d.ts +12 -1
  170. package/dist/verify/gate-config/verification-manifest.d.ts.map +1 -1
  171. package/dist/verify/gate-config/verification-manifest.js +12 -1
  172. package/dist/verify/gate-config/verification-manifest.js.map +1 -1
  173. package/dist/verify/gate-verdicts/commit-verdict-record.js +1 -1
  174. package/package.json +2 -2
  175. package/scripts/telora-daemon-wrapper.sh +16 -7
@@ -0,0 +1,44 @@
1
+ import type { DeclaredRerun, StrategyResult } from '../deterministic-gate/verification-deterministic.js';
2
+ import { type EscapedFile } from './escaped-test-set.js';
3
+ import type { EscapedPassStore } from './escaped-pass-store.js';
4
+ /** How long a gate run waits for the product's escapes before it runs without them. */
5
+ export declare const ESCAPED_SET_READ_TIMEOUT_MS = 10000;
6
+ /** The collaborators, bound at the composition root (composition/verification-context.ts). */
7
+ export interface EscapedTestsDeps {
8
+ /** The product's escaped files, newest escape first (product-api); throws on a failed read. */
9
+ listEscapes: (productId: string) => Promise<EscapedFile[]>;
10
+ passes: EscapedPassStore;
11
+ now: () => number;
12
+ /** How long the escape read may take before the run goes ahead with no added files. */
13
+ readTimeoutMs: number;
14
+ /** Which of `files` exist at commit `sha` of the repo at `repoPath` (a CI-run gate has no checkout here). */
15
+ filesAtCommit: (repoPath: string, sha: string, files: readonly string[]) => string[];
16
+ }
17
+ /** The gate a run applies, as far as adding files is concerned. */
18
+ type GateToExtend = {
19
+ command: string;
20
+ rerun?: DeclaredRerun | undefined;
21
+ };
22
+ /** The product's escaped set (module doc); [] on any failed or slow read. */
23
+ export declare function escapedFilesFor(productId: string | null, deps: EscapedTestsDeps): Promise<string[]>;
24
+ /** The files of `files` present in the checkout at `checkoutPath` (never a path outside it). */
25
+ export declare function filesInCheckout(checkoutPath: string, files: readonly string[]): string[];
26
+ /** The command a LOCAL gate run of `productId` spawns in the checkout at `checkoutPath` (module doc). */
27
+ export declare function localGateCommand(productId: string | null, gate: GateToExtend, checkoutPath: string, deps: EscapedTestsDeps): Promise<string>;
28
+ /**
29
+ * The command a CI-run gate of `productId` at `sha` ships in its spec (module
30
+ * doc), and the escaped files it adds ([] when the command is the gate's own).
31
+ */
32
+ export declare function ciGateCommand(productId: string | null, gate: GateToExtend, repoPath: string, sha: string, deps: EscapedTestsDeps): Promise<{
33
+ command: string;
34
+ files: string[];
35
+ }>;
36
+ /**
37
+ * A gate run's result with its escaped files judged (module doc): the exit
38
+ * rule's exception applied, and the files it passed counted. A product that
39
+ * declares no re-run command added no files, and its result is returned as is,
40
+ * with no log read.
41
+ */
42
+ export declare function judgeEscapedTests(productId: string | null, result: StrategyResult, readLogText: (source: StrategyResult) => string, deps: EscapedTestsDeps): StrategyResult;
43
+ export {};
44
+ //# sourceMappingURL=escaped-tests-source.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escaped-tests-source.d.ts","sourceRoot":"","sources":["../../../src/verify/escaped-tests/escaped-tests-source.ts"],"names":[],"mappings":"AAoCA,OAAO,KAAK,EAAE,aAAa,EAAE,cAAc,EAAE,MAAM,qDAAqD,CAAC;AAEzG,OAAO,EAAuC,KAAK,WAAW,EAAE,MAAM,uBAAuB,CAAC;AAE9F,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,yBAAyB,CAAC;AAIhE,uFAAuF;AACvF,eAAO,MAAM,2BAA2B,QAAS,CAAC;AAElD,8FAA8F;AAC9F,MAAM,WAAW,gBAAgB;IAC/B,+FAA+F;IAC/F,WAAW,EAAE,CAAC,SAAS,EAAE,MAAM,KAAK,OAAO,CAAC,WAAW,EAAE,CAAC,CAAC;IAC3D,MAAM,EAAE,gBAAgB,CAAC;IACzB,GAAG,EAAE,MAAM,MAAM,CAAC;IAClB,uFAAuF;IACvF,aAAa,EAAE,MAAM,CAAC;IACtB,6GAA6G;IAC7G,aAAa,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,KAAK,MAAM,EAAE,CAAC;CACtF;AAED,mEAAmE;AACnE,KAAK,YAAY,GAAG;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,CAAC,EAAE,aAAa,GAAG,SAAS,CAAA;CAAE,CAAC;AAY3E,6EAA6E;AAC7E,wBAAsB,eAAe,CAAC,SAAS,EAAE,MAAM,GAAG,IAAI,EAAE,IAAI,EAAE,gBAAgB,GAAG,OAAO,CAAC,MAAM,EAAE,CAAC,CAUzG;AAED,gGAAgG;AAChG,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,KAAK,EAAE,SAAS,MAAM,EAAE,GAAG,MAAM,EAAE,CAMxF;AASD,yGAAyG;AACzG,wBAAsB,gBAAgB,CACpC,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,IAAI,EAAE,YAAY,EAClB,YAAY,EAAE,MAAM,EACpB,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC,MAAM,CAAC,CAIjB;AAED;;;GAGG;AACH,wBAAsB,aAAa,CACjC,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,IAAI,EAAE,YAAY,EAClB,QAAQ,EAAE,MAAM,EAChB,GAAG,EAAE,MAAM,EACX,IAAI,EAAE,gBAAgB,GACrB,OAAO,CAAC;IAAE,OAAO,EAAE,MAAM,CAAC;IAAC,KAAK,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAc/C;AAoBD;;;;;GAKG;AACH,wBAAgB,iBAAiB,CAC/B,SAAS,EAAE,MAAM,GAAG,IAAI,EACxB,MAAM,EAAE,cAAc,EACtB,WAAW,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,MAAM,EAC/C,IAAI,EAAE,gBAAgB,GACrB,cAAc,CAOhB"}
@@ -0,0 +1,142 @@
1
+ // PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
2
+ // Pinned by: packages/daemon/src/verify/escaped-tests/escaped-gate-run.test.ts,
3
+ // packages/daemon/src/verify/escaped-tests/escaped-tests-source.test.ts
4
+ // PINNED-BY-END
5
+ /**
6
+ * Escaped test files in a product's gate runs: what a gate run adds, and what
7
+ * its verdict counts.
8
+ *
9
+ * ADDED, ONLY TO THE GATE RUN OF A FOCUS HEAD (the local strategy's run of a
10
+ * default-on candidate, verify/deterministic-gate/verification-checkout.ts, and
11
+ * the CI hand-over of one, verify/ci-gate/ci-gate-dispatch.ts) -- never to a
12
+ * re-run, a continuation, a base run or a rework re-check. A run adds files only
13
+ * when the judged commit's manifest declares a `rerunCommand` and the product's
14
+ * escaped set (escaped-test-set.ts) holds files that exist at the judged commit;
15
+ * the gate command it then spawns is escaped-test-run.ts
16
+ * composeGateWithEscapedTests. With no `rerunCommand`, or no such file, the run
17
+ * spawns exactly the gate command, as before.
18
+ *
19
+ * The set is read ONCE per gate run, fail-soft: a failed or slow read of the
20
+ * product's escapes (bounded by `readTimeoutMs`) adds no files and is logged --
21
+ * the gate is never blocked or failed by it.
22
+ *
23
+ * COUNTED, when a run rendered a verdict about its commit (verify/engine/
24
+ * verification-commit-sharing.ts judges every local and CI run through
25
+ * {@link judgeEscapedTests}): each added file the run passed
26
+ * (escaped-test-run.ts passedEscapedFiles) gets one pass for the judged commit
27
+ * in the product's host-local record (escaped-pass-store.ts); a commit counts
28
+ * once. The same step applies the exit rule's one exception
29
+ * (escaped-test-run.ts settleEscapedRun).
30
+ *
31
+ * @module verify/escaped-tests/escaped-tests-source
32
+ */
33
+ import { existsSync } from 'node:fs';
34
+ import { resolve, sep } from 'node:path';
35
+ import { createLogger } from '../../log/daemon-log.js';
36
+ import { escapedTestSet, recordEscapedPasses } from './escaped-test-set.js';
37
+ import { composeGateWithEscapedTests, passedEscapedFiles, settleEscapedRun } from './escaped-test-run.js';
38
+ const log = createLogger({ module: 'verification' });
39
+ /** How long a gate run waits for the product's escapes before it runs without them. */
40
+ export const ESCAPED_SET_READ_TIMEOUT_MS = 10_000;
41
+ /** `promise`, or a rejection once `ms` has passed. */
42
+ function withTimeout(promise, ms) {
43
+ let timer;
44
+ const timeout = new Promise((_, reject) => {
45
+ timer = setTimeout(() => reject(new Error(`no answer within ${ms} ms`)), ms);
46
+ timer.unref?.();
47
+ });
48
+ return Promise.race([promise, timeout]).finally(() => clearTimeout(timer));
49
+ }
50
+ /** The product's escaped set (module doc); [] on any failed or slow read. */
51
+ export async function escapedFilesFor(productId, deps) {
52
+ if (!productId)
53
+ return [];
54
+ try {
55
+ const escapes = await withTimeout(deps.listEscapes(productId), deps.readTimeoutMs);
56
+ return escapedTestSet(escapes, deps.passes.read(productId));
57
+ }
58
+ catch (err) {
59
+ log.warn(`[verification] escaped tests: the gate escapes of product ${productId} could not be read `
60
+ + `(${err.message}); this gate run adds no escaped test files`);
61
+ return [];
62
+ }
63
+ }
64
+ /** The files of `files` present in the checkout at `checkoutPath` (never a path outside it). */
65
+ export function filesInCheckout(checkoutPath, files) {
66
+ const root = resolve(checkoutPath);
67
+ return files.filter((file) => {
68
+ const path = resolve(root, file);
69
+ return path.startsWith(root + sep) && existsSync(path);
70
+ });
71
+ }
72
+ /** The command a gate run spawns: the gate's own, plus the escaped `files` when there are any and a re-run command names them. */
73
+ function extendGate(gate, files, where) {
74
+ if (!gate.rerun || files.length === 0)
75
+ return gate.command;
76
+ log.info(`[verification] escaped tests: ${where} adds ${files.length} test file(s) a gate escape recorded: ${files.join(', ')}`);
77
+ return composeGateWithEscapedTests(gate.command, gate.rerun.command, files);
78
+ }
79
+ /** The command a LOCAL gate run of `productId` spawns in the checkout at `checkoutPath` (module doc). */
80
+ export async function localGateCommand(productId, gate, checkoutPath, deps) {
81
+ if (!gate.rerun)
82
+ return gate.command;
83
+ const files = filesInCheckout(checkoutPath, await escapedFilesFor(productId, deps));
84
+ return extendGate(gate, files, `the gate run in ${checkoutPath}`);
85
+ }
86
+ /**
87
+ * The command a CI-run gate of `productId` at `sha` ships in its spec (module
88
+ * doc), and the escaped files it adds ([] when the command is the gate's own).
89
+ */
90
+ export async function ciGateCommand(productId, gate, repoPath, sha, deps) {
91
+ const unchanged = { command: gate.command, files: [] };
92
+ if (!gate.rerun)
93
+ return unchanged;
94
+ const wanted = await escapedFilesFor(productId, deps);
95
+ if (wanted.length === 0)
96
+ return unchanged;
97
+ let present;
98
+ try {
99
+ present = new Set(deps.filesAtCommit(repoPath, sha, wanted));
100
+ }
101
+ catch (err) {
102
+ log.warn(`[verification] escaped tests: could not list the escaped files at ${sha.slice(0, 8)} (${err.message}); none added`);
103
+ return unchanged;
104
+ }
105
+ const files = wanted.filter((f) => present.has(f));
106
+ return { command: extendGate(gate, files, `the CI gate run of ${sha.slice(0, 8)}`), files };
107
+ }
108
+ /** True when `result` is a gate run's verdict about its commit (no re-run, timeout or unavailable checkout). */
109
+ function renderedGateVerdict(result) {
110
+ return (result.outcome === 'passed' || result.outcome === 'failed')
111
+ && typeof result.verifiedSha === 'string' && result.verifiedSha.length > 0
112
+ && result.timedOut !== true && result.renderedBeforeKill === undefined
113
+ && result.rerunOf === undefined && result.checkoutUnavailable !== true && result.configUnresolved !== true;
114
+ }
115
+ /** Record one pass at the judged commit for each added file the run passed (module doc). */
116
+ function notePasses(productId, result, logText, deps) {
117
+ const passed = passedEscapedFiles(logText);
118
+ if (passed.length === 0)
119
+ return;
120
+ const next = recordEscapedPasses(deps.passes.read(productId), passed, result.verifiedSha, deps.now());
121
+ if (deps.passes.write(productId, next)) {
122
+ log.info(`[verification] escaped tests: ${passed.length} escaped test file(s) passed at ${result.verifiedSha.slice(0, 8)}: ${passed.join(', ')}`);
123
+ }
124
+ }
125
+ /**
126
+ * A gate run's result with its escaped files judged (module doc): the exit
127
+ * rule's exception applied, and the files it passed counted. A product that
128
+ * declares no re-run command added no files, and its result is returned as is,
129
+ * with no log read.
130
+ */
131
+ export function judgeEscapedTests(productId, result, readLogText, deps) {
132
+ if (!result.appliedConfig?.rerun || !renderedGateVerdict(result))
133
+ return result;
134
+ const logText = readLogText(result);
135
+ const settled = settleEscapedRun(result, logText);
136
+ if (settled !== result)
137
+ log.info(`[verification] escaped tests: ${settled.rationale}`);
138
+ if (productId)
139
+ notePasses(productId, result, logText, deps);
140
+ return settled;
141
+ }
142
+ //# sourceMappingURL=escaped-tests-source.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"escaped-tests-source.js","sourceRoot":"","sources":["../../../src/verify/escaped-tests/escaped-tests-source.ts"],"names":[],"mappings":"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"}
@@ -74,6 +74,17 @@ export interface VerifyManifest {
74
74
  * docs/runbook-verify-gate-in-ci.md.
75
75
  */
76
76
  gateRunner?: GateRunnerName;
77
+ /**
78
+ * Optional: `true` declares that the product's CI publishes a FAILURE RECORD
79
+ * for a failed run (refs/ci-failures/<sha>/<run>/<job>, ci/candidate-failure-record.ts;
80
+ * contract: docs/runbook-ci-log-diagnosis.md, "The failure record"). Declared,
81
+ * a red integration candidate whose record has not landed yet waits a bounded
82
+ * window for it before its rework is routed, even on the first record the
83
+ * product ever publishes (merge/candidate-ci-failures.ts awaitsFailureRecord).
84
+ * Absent or `false` => no wait unless this host has held one of the product's
85
+ * records before.
86
+ */
87
+ ciFailureRecords?: boolean;
77
88
  }
78
89
  /** The completion judges a manifest may name. */
79
90
  export declare const COMPLETION_JUDGE_NAMES: readonly ["ci", "local"];
@@ -118,7 +129,7 @@ export declare function gateRunsOnCi(manifest: Pick<VerifyManifest, 'gateRunner'
118
129
  * `rerunMaxFailures` / carries an unknown `completionJudge`, a
119
130
  * `completionCommand` that is not a non-empty string, a non-positive
120
131
  * `completionTimeoutMs`, or a completion command beside `"ci"` /
121
- * carries an unknown `gateRunner`.
132
+ * carries an unknown `gateRunner` / carries a non-boolean `ciFailureRecords`.
122
133
  */
123
134
  export declare function readVerifyManifestFrom(repoPath: string | undefined, fs: VerifyManifestFs): VerifyManifest | undefined;
124
135
  /** Read the repo's verification manifest from the working tree on disk (see readVerifyManifestFrom). */
@@ -1 +1 @@
1
- {"version":3,"file":"verification-manifest.d.ts","sourceRoot":"","sources":["../../../src/verify/gate-config/verification-manifest.ts"],"names":[],"mappings":"AA8DA;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,uBAAuB,CAAC;AAE7D;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;;;;;OASG;IACH,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,+FAA+F;IAC/F,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,+EAA+E;IAC/E,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B;AAED,iDAAiD;AACjD,eAAO,MAAM,sBAAsB,0BAA2B,CAAC;AAC/D,MAAM,MAAM,mBAAmB,GAAG,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAExE,uDAAuD;AACvD,eAAO,MAAM,iBAAiB,0BAA2B,CAAC;AAC1D,MAAM,MAAM,cAAc,GAAG,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAE9D,0EAA0E;AAC1E,eAAO,MAAM,uBAAuB,YAAY,CAAC;AAEjD,wGAAwG;AACxG,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qDAAqD;IACrD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,6EAA6E;IAC7E,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC;AAQD,qFAAqF;AACrF,MAAM,MAAM,oBAAoB,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,KAAK,cAAc,GAAG,SAAS,CAAC;AAEhG,0DAA0D;AAC1D,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAElE;AAsFD,8GAA8G;AAC9G,wBAAgB,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,GAAG,SAAS,GAAG,OAAO,CAE9F;AAYD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,EAAE,EAAE,gBAAgB,GAAG,cAAc,GAAG,SAAS,CAqDrH;AAED,wGAAwG;AACxG,eAAO,MAAM,kBAAkB,EAAE,oBAAoF,CAAC;AAEtH;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,GAAG,SAAS,CAOzG"}
1
+ {"version":3,"file":"verification-manifest.d.ts","sourceRoot":"","sources":["../../../src/verify/gate-config/verification-manifest.ts"],"names":[],"mappings":"AA8DA;;;;;;;GAOG;AACH,eAAO,MAAM,wBAAwB,uBAAuB,CAAC;AAE7D;;;;;;;GAOG;AACH,MAAM,WAAW,cAAc;IAC7B,sEAAsE;IACtE,OAAO,EAAE,MAAM,CAAC;IAChB,uEAAuE;IACvE,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6EAA6E;IAC7E,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB;;;;;OAKG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB;;;;;;;;;;;OAWG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB;;;;OAIG;IACH,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B;;;;;;;;;OASG;IACH,eAAe,CAAC,EAAE,mBAAmB,CAAC;IACtC,+FAA+F;IAC/F,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,+EAA+E;IAC/E,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B;;;;;;;;;OASG;IACH,UAAU,CAAC,EAAE,cAAc,CAAC;IAC5B;;;;;;;;;OASG;IACH,gBAAgB,CAAC,EAAE,OAAO,CAAC;CAC5B;AAED,iDAAiD;AACjD,eAAO,MAAM,sBAAsB,0BAA2B,CAAC;AAC/D,MAAM,MAAM,mBAAmB,GAAG,OAAO,sBAAsB,CAAC,MAAM,CAAC,CAAC;AAExE,uDAAuD;AACvD,eAAO,MAAM,iBAAiB,0BAA2B,CAAC;AAC1D,MAAM,MAAM,cAAc,GAAG,OAAO,iBAAiB,CAAC,MAAM,CAAC,CAAC;AAE9D,0EAA0E;AAC1E,eAAO,MAAM,uBAAuB,YAAY,CAAC;AAEjD,wGAAwG;AACxG,eAAO,MAAM,0BAA0B,IAAI,CAAC;AAE5C;;;;;GAKG;AACH,MAAM,WAAW,gBAAgB;IAC/B,qDAAqD;IACrD,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAAC;IAC9B,6EAA6E;IAC7E,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAAC;CAChC;AAQD,qFAAqF;AACrF,MAAM,MAAM,oBAAoB,GAAG,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,KAAK,cAAc,GAAG,SAAS,CAAC;AAEhG,0DAA0D;AAC1D,wBAAgB,yBAAyB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CAElE;AAsFD,8GAA8G;AAC9G,wBAAgB,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,cAAc,EAAE,YAAY,CAAC,GAAG,SAAS,GAAG,OAAO,CAE9F;AAoBD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,QAAQ,EAAE,MAAM,GAAG,SAAS,EAAE,EAAE,EAAE,gBAAgB,GAAG,cAAc,GAAG,SAAS,CAuDrH;AAED,wGAAwG;AACxG,eAAO,MAAM,kBAAkB,EAAE,oBAAoF,CAAC;AAEtH;;;;;;GAMG;AACH,wBAAgB,eAAe,CAAC,YAAY,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,GAAG,MAAM,GAAG,SAAS,CAOzG"}
@@ -172,6 +172,15 @@ function optionalGateRunner(raw, path) {
172
172
  }
173
173
  return { gateRunner: runner };
174
174
  }
175
+ /** Validate the optional failure-record declaration (present-but-not-boolean is malformed, like every key). */
176
+ function optionalCiFailureRecords(raw, path) {
177
+ const value = raw.ciFailureRecords;
178
+ if (value === undefined)
179
+ return {};
180
+ if (typeof value !== 'boolean')
181
+ manifestError(path, `"ciFailureRecords" must be true or false (got ${JSON.stringify(value)})`);
182
+ return { ciFailureRecords: value };
183
+ }
175
184
  /**
176
185
  * Read the repo's verification manifest through `fs`.
177
186
  *
@@ -187,7 +196,7 @@ function optionalGateRunner(raw, path) {
187
196
  * `rerunMaxFailures` / carries an unknown `completionJudge`, a
188
197
  * `completionCommand` that is not a non-empty string, a non-positive
189
198
  * `completionTimeoutMs`, or a completion command beside `"ci"` /
190
- * carries an unknown `gateRunner`.
199
+ * carries an unknown `gateRunner` / carries a non-boolean `ciFailureRecords`.
191
200
  */
192
201
  export function readVerifyManifestFrom(repoPath, fs) {
193
202
  if (!repoPath)
@@ -228,6 +237,7 @@ export function readVerifyManifestFrom(repoPath, fs) {
228
237
  const rerun = optionalRerun(raw, path);
229
238
  const completion = optionalCompletion(raw, path);
230
239
  const gateRunner = optionalGateRunner(raw, path);
240
+ const ciFailureRecords = optionalCiFailureRecords(raw, path);
231
241
  return {
232
242
  command,
233
243
  ...(timeoutMs !== undefined ? { timeoutMs } : {}),
@@ -236,6 +246,7 @@ export function readVerifyManifestFrom(repoPath, fs) {
236
246
  ...rerun,
237
247
  ...completion,
238
248
  ...gateRunner,
249
+ ...ciFailureRecords,
239
250
  };
240
251
  }
241
252
  /** Read the repo's verification manifest from the working tree on disk (see readVerifyManifestFrom). */
@@ -1 +1 @@
1
- {"version":3,"file":"verification-manifest.js","sourceRoot":"","sources":["../../../src/verify/gate-config/verification-manifest.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"verification-manifest.js","sourceRoot":"","sources":["../../../src/verify/gate-config/verification-manifest.ts"],"names":[],"mappings":"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"}
@@ -1,5 +1,5 @@
1
1
  // PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
2
- // Pinned by: 38 tests -- run: npm run gen:pinned-by -- --list packages/daemon/src/verify/gate-verdicts/commit-verdict-record.ts
2
+ // Pinned by: 39 tests -- run: npm run gen:pinned-by -- --list packages/daemon/src/verify/gate-verdicts/commit-verdict-record.ts
3
3
  // PINNED-BY-END
4
4
  /**
5
5
  * The deterministic gate verdict for a focus commit, recorded durably.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@telora/daemon",
3
- "version": "0.24.17",
3
+ "version": "0.24.25",
4
4
  "description": "Agent orchestration daemon for Telora - spawns and manages Claude Code instances",
5
5
  "type": "module",
6
6
  "bin": {
@@ -41,7 +41,7 @@
41
41
  "//testRunner": "Uses Node.js built-in test runner (node:test) via tsx for TypeScript support. The root package uses Vitest; this is a deliberate choice for the daemon package to avoid framework dependencies. Test files live beside the modules they exercise (owner-directory layout); the runner discovers them recursively.",
42
42
  "dependencies": {
43
43
  "@telora/daemon-core": "^0.3.1",
44
- "@telora/mcp-products": "^0.23.11",
44
+ "@telora/mcp-products": "^0.23.12",
45
45
  "commander": "^14.0.3",
46
46
  "yaml": "^2.4.0",
47
47
  "zod": "^4.3.6"
@@ -1,19 +1,27 @@
1
1
  #!/usr/bin/env bash
2
2
  #
3
- # Wrapper script for telora-daemon that restarts on exit code 75 (auto-update).
3
+ # Wrapper script for telora-daemon that restarts it after a self-update.
4
4
  #
5
5
  # Usage:
6
6
  # telora-daemon-wrapper.sh [daemon args...]
7
7
  #
8
- # The daemon exits with code 75 after installing a newer version of itself.
9
- # This wrapper simply re-launches the daemon, which now runs the new code.
8
+ # Restart-after-update contract (stated once, in the daemon package:
9
+ # src/update/restart-contract.ts): a daemon run by a supervisor that restarts
10
+ # on exit 75 exits 75 after installing a newer version of itself and spawns
11
+ # nothing; the supervisor starts the new version. This wrapper IS such a
12
+ # supervisor, and declares itself by exporting TELORA_DAEMON_SUPERVISOR=wrapper
13
+ # so the daemon exits 75 to it instead of re-exec'ing a detached child.
10
14
  #
11
- # For systemd users, you can instead configure:
15
+ # For systemd users, you can instead run telora-daemon directly from a unit
16
+ # with, in the [Service] section:
17
+ # Restart=on-failure
12
18
  # RestartForceExitStatus=75
13
- # in the [Service] section and run telora-daemon directly.
19
+ # (see docs/DAEMON_SETUP.md).
14
20
 
15
21
  set -euo pipefail
16
22
 
23
+ export TELORA_DAEMON_SUPERVISOR=wrapper
24
+
17
25
  # Default to 'run' subcommand if no args given
18
26
  ARGS=("$@")
19
27
  if [ ${#ARGS[@]} -eq 0 ]; then
@@ -21,8 +29,9 @@ if [ ${#ARGS[@]} -eq 0 ]; then
21
29
  fi
22
30
 
23
31
  while true; do
24
- telora-daemon "${ARGS[@]}"
25
- rc=$?
32
+ # `|| rc=$?` keeps a non-zero exit from tripping `set -e` before it is read.
33
+ rc=0
34
+ telora-daemon "${ARGS[@]}" || rc=$?
26
35
  if [ "$rc" -eq 75 ]; then
27
36
  echo "[wrapper] Daemon exited with code 75 (auto-updated), restarting..."
28
37
  continue