@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.
- package/build-info.json +6 -3
- package/dist/ci/candidate-failure-record.d.ts +104 -0
- package/dist/ci/candidate-failure-record.d.ts.map +1 -0
- package/dist/ci/candidate-failure-record.js +135 -0
- package/dist/ci/candidate-failure-record.js.map +1 -0
- package/dist/ci/candidate-ref.d.ts.map +1 -1
- package/dist/ci/candidate-ref.js +10 -3
- package/dist/ci/candidate-ref.js.map +1 -1
- package/dist/ci/ci-status-git.d.ts.map +1 -1
- package/dist/ci/ci-status-git.js +1 -0
- package/dist/ci/ci-status-git.js.map +1 -1
- package/dist/ci/ci-status.d.ts.map +1 -1
- package/dist/ci/ci-status.js +1 -0
- package/dist/ci/ci-status.js.map +1 -1
- package/dist/ci/gate-ref.d.ts +10 -1
- package/dist/ci/gate-ref.d.ts.map +1 -1
- package/dist/ci/gate-ref.js +11 -4
- package/dist/ci/gate-ref.js.map +1 -1
- package/dist/ci/product-ci-repo.d.ts.map +1 -1
- package/dist/ci/product-ci-repo.js +3 -2
- package/dist/ci/product-ci-repo.js.map +1 -1
- package/dist/composition/execution-merge-context.d.ts +13 -0
- package/dist/composition/execution-merge-context.d.ts.map +1 -1
- package/dist/composition/execution-merge-context.js +76 -3
- package/dist/composition/execution-merge-context.js.map +1 -1
- package/dist/composition/focus-activity-live-sources.d.ts.map +1 -1
- package/dist/composition/focus-activity-live-sources.js +1 -0
- package/dist/composition/focus-activity-live-sources.js.map +1 -1
- package/dist/composition/runtime-heartbeat-context.d.ts +11 -0
- package/dist/composition/runtime-heartbeat-context.d.ts.map +1 -1
- package/dist/composition/runtime-heartbeat-context.js +26 -1
- package/dist/composition/runtime-heartbeat-context.js.map +1 -1
- package/dist/composition/team-liveness-phase-sources.d.ts.map +1 -1
- package/dist/composition/team-liveness-phase-sources.js +1 -0
- package/dist/composition/team-liveness-phase-sources.js.map +1 -1
- package/dist/composition/verification-context.d.ts.map +1 -1
- package/dist/composition/verification-context.js +34 -4
- package/dist/composition/verification-context.js.map +1 -1
- package/dist/focus/heartbeat-metadata.d.ts +5 -0
- package/dist/focus/heartbeat-metadata.d.ts.map +1 -1
- package/dist/focus/heartbeat-metadata.js +12 -0
- package/dist/focus/heartbeat-metadata.js.map +1 -1
- package/dist/focus/heartbeat.d.ts.map +1 -1
- package/dist/focus/heartbeat.js +1 -0
- package/dist/focus/heartbeat.js.map +1 -1
- package/dist/focus/host-pressure.d.ts +77 -0
- package/dist/focus/host-pressure.d.ts.map +1 -0
- package/dist/focus/host-pressure.js +83 -0
- package/dist/focus/host-pressure.js.map +1 -0
- package/dist/git/types.js +1 -1
- package/dist/merge/candidate-ci-failures.d.ts +72 -0
- package/dist/merge/candidate-ci-failures.d.ts.map +1 -0
- package/dist/merge/candidate-ci-failures.js +240 -0
- package/dist/merge/candidate-ci-failures.js.map +1 -0
- package/dist/merge/candidate-red-record.d.ts +44 -0
- package/dist/merge/candidate-red-record.d.ts.map +1 -0
- package/dist/merge/candidate-red-record.js +98 -0
- package/dist/merge/candidate-red-record.js.map +1 -0
- package/dist/merge/candidate-rework.d.ts +4 -3
- package/dist/merge/candidate-rework.d.ts.map +1 -1
- package/dist/merge/candidate-rework.js +46 -14
- package/dist/merge/candidate-rework.js.map +1 -1
- package/dist/merge/candidate-tip-attribution.d.ts +135 -0
- package/dist/merge/candidate-tip-attribution.d.ts.map +1 -0
- package/dist/merge/candidate-tip-attribution.js +319 -0
- package/dist/merge/candidate-tip-attribution.js.map +1 -0
- package/dist/merge/completion-merge-driver.d.ts +49 -5
- package/dist/merge/completion-merge-driver.d.ts.map +1 -1
- package/dist/merge/completion-merge-driver.js +56 -2
- package/dist/merge/completion-merge-driver.js.map +1 -1
- package/dist/merge/completion-merge-gate.d.ts +4 -1
- package/dist/merge/completion-merge-gate.d.ts.map +1 -1
- package/dist/merge/completion-merge-gate.js +9 -8
- package/dist/merge/completion-merge-gate.js.map +1 -1
- package/dist/queries/api-client/shared.d.ts.map +1 -1
- package/dist/queries/api-client/shared.js +6 -1
- package/dist/queries/api-client/shared.js.map +1 -1
- package/dist/queries/candidate-ci-reds/candidate-ci-reds.d.ts +35 -0
- package/dist/queries/candidate-ci-reds/candidate-ci-reds.d.ts.map +1 -0
- package/dist/queries/candidate-ci-reds/candidate-ci-reds.js +42 -0
- package/dist/queries/candidate-ci-reds/candidate-ci-reds.js.map +1 -0
- package/dist/queries/candidate-ci-reds/gate-escape-files.d.ts +16 -0
- package/dist/queries/candidate-ci-reds/gate-escape-files.d.ts.map +1 -0
- package/dist/queries/candidate-ci-reds/gate-escape-files.js +51 -0
- package/dist/queries/candidate-ci-reds/gate-escape-files.js.map +1 -0
- package/dist/queries/sessions/daemon-connection.d.ts.map +1 -1
- package/dist/queries/sessions/daemon-connection.js +1 -0
- package/dist/queries/sessions/daemon-connection.js.map +1 -1
- package/dist/queries/verification/verification.js +1 -1
- package/dist/shell/unified-shell.d.ts +25 -0
- package/dist/shell/unified-shell.d.ts.map +1 -1
- package/dist/shell/unified-shell.js +26 -80
- package/dist/shell/unified-shell.js.map +1 -1
- package/dist/shell/update-restart.d.ts +47 -0
- package/dist/shell/update-restart.d.ts.map +1 -0
- package/dist/shell/update-restart.js +124 -0
- package/dist/shell/update-restart.js.map +1 -0
- package/dist/supervision/escalation-suppression.js +1 -1
- package/dist/testing/fixtures/api-client.js +1 -1
- package/dist/testing/fixtures/completion-judge-stubs.d.ts +7 -2
- package/dist/testing/fixtures/completion-judge-stubs.d.ts.map +1 -1
- package/dist/testing/fixtures/completion-judge-stubs.js +11 -1
- package/dist/testing/fixtures/completion-judge-stubs.js.map +1 -1
- package/dist/testing/fixtures/index.js +1 -1
- package/dist/testing/fixtures/merge-log-capture.d.ts.map +1 -1
- package/dist/testing/fixtures/merge-log-capture.js +1 -0
- package/dist/testing/fixtures/merge-log-capture.js.map +1 -1
- package/dist/testing/fixtures/recording-api-client.js +1 -1
- package/dist/testing/fixtures/verification-deps.d.ts +7 -0
- package/dist/testing/fixtures/verification-deps.d.ts.map +1 -1
- package/dist/testing/fixtures/verification-deps.js +17 -1
- package/dist/testing/fixtures/verification-deps.js.map +1 -1
- package/dist/testing/fixtures/vitest-failure-log.d.ts.map +1 -1
- package/dist/testing/fixtures/vitest-failure-log.js +2 -1
- package/dist/testing/fixtures/vitest-failure-log.js.map +1 -1
- package/dist/update/auto-update.d.ts +11 -5
- package/dist/update/auto-update.d.ts.map +1 -1
- package/dist/update/auto-update.js +11 -5
- package/dist/update/auto-update.js.map +1 -1
- package/dist/update/restart-contract.d.ts +62 -0
- package/dist/update/restart-contract.d.ts.map +1 -0
- package/dist/update/restart-contract.js +137 -0
- package/dist/update/restart-contract.js.map +1 -0
- package/dist/verify/attribution/verification-baseline-run.d.ts.map +1 -1
- package/dist/verify/attribution/verification-baseline-run.js +1 -0
- package/dist/verify/attribution/verification-baseline-run.js.map +1 -1
- package/dist/verify/ci-gate/ci-gate-dispatch.d.ts +3 -0
- package/dist/verify/ci-gate/ci-gate-dispatch.d.ts.map +1 -1
- package/dist/verify/ci-gate/ci-gate-dispatch.js +31 -9
- package/dist/verify/ci-gate/ci-gate-dispatch.js.map +1 -1
- package/dist/verify/ci-gate/ci-gate-wait-record.d.ts +6 -0
- package/dist/verify/ci-gate/ci-gate-wait-record.d.ts.map +1 -1
- package/dist/verify/ci-gate/ci-gate-wait-record.js +1 -0
- package/dist/verify/ci-gate/ci-gate-wait-record.js.map +1 -1
- package/dist/verify/deterministic-gate/verification-checkout.d.ts +12 -2
- package/dist/verify/deterministic-gate/verification-checkout.d.ts.map +1 -1
- package/dist/verify/deterministic-gate/verification-checkout.js +18 -3
- package/dist/verify/deterministic-gate/verification-checkout.js.map +1 -1
- package/dist/verify/deterministic-gate/verification-deterministic.js +1 -1
- package/dist/verify/deterministic-gate/verification-failure-parser.d.ts +30 -9
- package/dist/verify/deterministic-gate/verification-failure-parser.d.ts.map +1 -1
- package/dist/verify/deterministic-gate/verification-failure-parser.js +52 -8
- package/dist/verify/deterministic-gate/verification-failure-parser.js.map +1 -1
- package/dist/verify/engine/verification-commit-sharing.d.ts.map +1 -1
- package/dist/verify/engine/verification-commit-sharing.js +6 -2
- package/dist/verify/engine/verification-commit-sharing.js.map +1 -1
- package/dist/verify/engine/verification-deps.d.ts +9 -0
- package/dist/verify/engine/verification-deps.d.ts.map +1 -1
- package/dist/verify/engine/verification-deps.js +1 -1
- package/dist/verify/engine/verification-engine.d.ts.map +1 -1
- package/dist/verify/engine/verification-engine.js +4 -1
- package/dist/verify/engine/verification-engine.js.map +1 -1
- package/dist/verify/escaped-tests/escaped-pass-store.d.ts +19 -0
- package/dist/verify/escaped-tests/escaped-pass-store.d.ts.map +1 -0
- package/dist/verify/escaped-tests/escaped-pass-store.js +90 -0
- package/dist/verify/escaped-tests/escaped-pass-store.js.map +1 -0
- package/dist/verify/escaped-tests/escaped-test-run.d.ts +39 -0
- package/dist/verify/escaped-tests/escaped-test-run.d.ts.map +1 -0
- package/dist/verify/escaped-tests/escaped-test-run.js +156 -0
- package/dist/verify/escaped-tests/escaped-test-run.js.map +1 -0
- package/dist/verify/escaped-tests/escaped-test-set.d.ts +65 -0
- package/dist/verify/escaped-tests/escaped-test-set.d.ts.map +1 -0
- package/dist/verify/escaped-tests/escaped-test-set.js +95 -0
- package/dist/verify/escaped-tests/escaped-test-set.js.map +1 -0
- package/dist/verify/escaped-tests/escaped-tests-source.d.ts +44 -0
- package/dist/verify/escaped-tests/escaped-tests-source.d.ts.map +1 -0
- package/dist/verify/escaped-tests/escaped-tests-source.js +142 -0
- package/dist/verify/escaped-tests/escaped-tests-source.js.map +1 -0
- package/dist/verify/gate-config/verification-manifest.d.ts +12 -1
- package/dist/verify/gate-config/verification-manifest.d.ts.map +1 -1
- package/dist/verify/gate-config/verification-manifest.js +12 -1
- package/dist/verify/gate-config/verification-manifest.js.map +1 -1
- package/dist/verify/gate-verdicts/commit-verdict-record.js +1 -1
- package/package.json +2 -2
- 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;
|
|
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":"AAAA,8FAA8F;AAC9F,8HAA8H;AAC9H,gBAAgB;AAEhB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAqDG;AAEH,OAAO,EAAE,UAAU,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACnD,OAAO,EAAE,OAAO,EAAE,MAAM,WAAW,CAAC;AAEpC;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,wBAAwB,GAAG,oBAAoB,CAAC;
|
|
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:
|
|
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.
|
|
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.
|
|
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
|
|
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
|
-
#
|
|
9
|
-
#
|
|
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
|
|
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
|
-
#
|
|
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
|
-
|
|
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
|