@telora/daemon 0.23.16 → 0.23.17
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 +2 -2
- package/dist/ci/candidate-ref.d.ts +13 -0
- package/dist/ci/candidate-ref.d.ts.map +1 -1
- package/dist/ci/candidate-ref.js +18 -0
- package/dist/ci/candidate-ref.js.map +1 -1
- package/dist/composition/execution-merge-context.d.ts +7 -1
- package/dist/composition/execution-merge-context.d.ts.map +1 -1
- package/dist/composition/execution-merge-context.js +42 -6
- package/dist/composition/execution-merge-context.js.map +1 -1
- package/dist/composition/execution-recovery-context.d.ts.map +1 -1
- package/dist/composition/execution-recovery-context.js +2 -0
- package/dist/composition/execution-recovery-context.js.map +1 -1
- package/dist/focus/crash-recovery.d.ts +7 -0
- package/dist/focus/crash-recovery.d.ts.map +1 -1
- package/dist/focus/crash-recovery.js +26 -13
- package/dist/focus/crash-recovery.js.map +1 -1
- package/dist/merge/candidate-rework.d.ts +3 -3
- package/dist/merge/candidate-rework.d.ts.map +1 -1
- package/dist/merge/candidate-rework.js +30 -10
- package/dist/merge/candidate-rework.js.map +1 -1
- package/dist/merge/completion-hold-record.d.ts +16 -0
- package/dist/merge/completion-hold-record.d.ts.map +1 -1
- package/dist/merge/completion-hold-record.js +60 -1
- package/dist/merge/completion-hold-record.js.map +1 -1
- package/dist/merge/completion-judge.d.ts +44 -0
- package/dist/merge/completion-judge.d.ts.map +1 -0
- package/dist/merge/completion-judge.js +36 -0
- package/dist/merge/completion-judge.js.map +1 -0
- package/dist/merge/completion-local-judge.d.ts +90 -0
- package/dist/merge/completion-local-judge.d.ts.map +1 -0
- package/dist/merge/completion-local-judge.js +193 -0
- package/dist/merge/completion-local-judge.js.map +1 -0
- package/dist/merge/completion-merge-driver.d.ts +31 -7
- package/dist/merge/completion-merge-driver.d.ts.map +1 -1
- package/dist/merge/completion-merge-driver.js +36 -8
- package/dist/merge/completion-merge-driver.js.map +1 -1
- package/dist/merge/completion-merge-gate.d.ts +10 -2
- package/dist/merge/completion-merge-gate.d.ts.map +1 -1
- package/dist/merge/completion-merge-gate.js +65 -19
- package/dist/merge/completion-merge-gate.js.map +1 -1
- package/dist/merge/merge-back-loop.d.ts +9 -1
- package/dist/merge/merge-back-loop.d.ts.map +1 -1
- package/dist/merge/merge-back-loop.js +28 -1
- package/dist/merge/merge-back-loop.js.map +1 -1
- package/dist/queries/api-client/shared.js +1 -1
- package/dist/testing/fixtures/api-client.js +1 -1
- package/dist/testing/fixtures/completion-judge-stubs.d.ts +15 -0
- package/dist/testing/fixtures/completion-judge-stubs.d.ts.map +1 -0
- package/dist/testing/fixtures/completion-judge-stubs.js +32 -0
- package/dist/testing/fixtures/completion-judge-stubs.js.map +1 -0
- package/dist/testing/fixtures/index.js +1 -1
- package/dist/verify/deterministic-gate/verification-checkout.d.ts.map +1 -1
- package/dist/verify/deterministic-gate/verification-checkout.js +1 -0
- package/dist/verify/deterministic-gate/verification-checkout.js.map +1 -1
- package/dist/verify/deterministic-gate/verification-deterministic.d.ts.map +1 -1
- package/dist/verify/deterministic-gate/verification-deterministic.js +1 -0
- package/dist/verify/deterministic-gate/verification-deterministic.js.map +1 -1
- package/dist/verify/gate-config/verification-manifest.d.ts +21 -1
- package/dist/verify/gate-config/verification-manifest.d.ts.map +1 -1
- package/dist/verify/gate-config/verification-manifest.js +25 -1
- package/dist/verify/gate-config/verification-manifest.js.map +1 -1
- package/dist/verify/run-selection/verification-default-on.d.ts +2 -0
- package/dist/verify/run-selection/verification-default-on.d.ts.map +1 -1
- package/dist/verify/run-selection/verification-default-on.js +1 -1
- package/dist/verify/run-selection/verification-default-on.js.map +1 -1
- package/dist/worktree/focus-worktree-state.d.ts.map +1 -1
- package/dist/worktree/focus-worktree-state.js +1 -0
- package/dist/worktree/focus-worktree-state.js.map +1 -1
- package/package.json +2 -2
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"completion-local-judge.js","sourceRoot":"","sources":["../../src/merge/completion-local-judge.ts"],"names":[],"mappings":"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"}
|
|
@@ -15,13 +15,24 @@
|
|
|
15
15
|
* push_candidate -> push the head to the focus's candidate branch so CI runs the
|
|
16
16
|
* full suite on exactly that commit (ci/candidate-ref.ts).
|
|
17
17
|
* wait_ci -> nothing, until CANDIDATE_CI_VERDICT_WAIT_MS has passed with
|
|
18
|
-
* no verdict; then the
|
|
19
|
-
*
|
|
20
|
-
*
|
|
21
|
-
*
|
|
18
|
+
* no verdict; then the candidate is RE-PUSHED once (deleted
|
|
19
|
+
* and pushed again, so CI sees a fresh push), and after a
|
|
20
|
+
* second window with no verdict the merge simply holds --
|
|
21
|
+
* the stuck_focus_branch observation surfaces it. A missing
|
|
22
|
+
* verdict is the CI's fault, not the focus's: it is never
|
|
23
|
+
* re-work (no team can fix a missing verdict, and a
|
|
24
|
+
* converged review resets the cycle cap, so re-work would
|
|
25
|
+
* never end). The wait is counted from a DURABLE stamp of the
|
|
26
|
+
* candidate (merge/completion-hold-record.ts), so a daemon
|
|
27
|
+
* restart neither restarts nor forgets the window.
|
|
28
|
+
* run_local -> start the daemon's own run of the completion command on the
|
|
29
|
+
* head (merge/completion-local-judge.ts); its verdict lands
|
|
30
|
+
* on a later tick.
|
|
22
31
|
* rework -> return the focus to coding: one Bug on the owning delivery,
|
|
23
32
|
* re-opened to verify_failed (merge/candidate-rework.ts). No
|
|
24
33
|
* escalation is filed.
|
|
34
|
+
* rework_local -> the same, for a candidate that failed the local run; the
|
|
35
|
+
* Bug names the command, its result and the log.
|
|
25
36
|
*
|
|
26
37
|
* Integration never moves here; a green candidate is admitted by the gate and
|
|
27
38
|
* fast-forwarded by the caller's normal merge.
|
|
@@ -29,7 +40,8 @@
|
|
|
29
40
|
* @module merge/completion-merge-driver
|
|
30
41
|
*/
|
|
31
42
|
import type { CompletionMergeStep } from './completion-merge-gate.js';
|
|
32
|
-
|
|
43
|
+
import type { LocalRunStart, LocalSuiteFailure } from './completion-local-judge.js';
|
|
44
|
+
/** How long a pushed candidate may sit with no published verdict before it is re-pushed (once). */
|
|
33
45
|
export declare const CANDIDATE_CI_VERDICT_WAIT_MS: number;
|
|
34
46
|
/** The focus branch a step acts on. */
|
|
35
47
|
export interface CompletionMergeSubject {
|
|
@@ -39,7 +51,9 @@ export interface CompletionMergeSubject {
|
|
|
39
51
|
branchName: string;
|
|
40
52
|
}
|
|
41
53
|
/** Why a candidate is returned to the focus as re-work. */
|
|
42
|
-
export type CandidateReworkCause = 'red' | '
|
|
54
|
+
export type CandidateReworkCause = 'red' | 'local_red' | 'conflict' | 'unreviewed_merge';
|
|
55
|
+
/** What a re-work Bug is told beyond its cause: a conflict's paths, or a failed local run. */
|
|
56
|
+
export type CandidateReworkDetail = CompletionMergeConflict | LocalSuiteFailure;
|
|
43
57
|
/** What a conflicting final merge left for the team: the paths, and the integration commits the branch lacks. */
|
|
44
58
|
export interface CompletionMergeConflict {
|
|
45
59
|
integrationBranch: string;
|
|
@@ -77,8 +91,18 @@ export interface CompletionMergeDriverDeps {
|
|
|
77
91
|
* becomes re-work.
|
|
78
92
|
*/
|
|
79
93
|
candidateWaitSince: (sha: string, now: number) => number | null;
|
|
94
|
+
/** Whether the focus's candidate `sha` was already re-pushed for a missing verdict. */
|
|
95
|
+
candidateRepushed: (sha: string) => boolean;
|
|
96
|
+
/** Record that `sha` was re-pushed at `now`, restarting its wait window. */
|
|
97
|
+
markCandidateRepushed: (sha: string, now: number) => void;
|
|
98
|
+
/** Delete and re-push the focus's candidate branch at `sha`, so CI sees a fresh push; false on failure. */
|
|
99
|
+
repushCandidate: (repoPath: string, focusId: string, sha: string) => boolean;
|
|
100
|
+
/** Start the daemon's local completion run of `sha` (never awaited). */
|
|
101
|
+
startLocalRun: (sha: string) => LocalRunStart;
|
|
102
|
+
/** What a failed local run of `sha` recorded, for the re-work Bug. */
|
|
103
|
+
readLocalFailure: (sha: string) => LocalSuiteFailure | null;
|
|
80
104
|
/** Return the focus to coding as re-work for the candidate at `sha`. */
|
|
81
|
-
routeRework: (subject: CompletionMergeSubject, sha: string, cause: CandidateReworkCause,
|
|
105
|
+
routeRework: (subject: CompletionMergeSubject, sha: string, cause: CandidateReworkCause, detail: CandidateReworkDetail | null) => Promise<CandidateReworkOutcome>;
|
|
82
106
|
now: () => number;
|
|
83
107
|
}
|
|
84
108
|
/** Reset the driver's memory -- tests start from a clean slate. */
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completion-merge-driver.d.ts","sourceRoot":"","sources":["../../src/merge/completion-merge-driver.ts"],"names":[],"mappings":"AASA
|
|
1
|
+
{"version":3,"file":"completion-merge-driver.d.ts","sourceRoot":"","sources":["../../src/merge/completion-merge-driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
// PINNED-BY-END
|
|
9
9
|
import { createLogger } from '../log/daemon-log.js';
|
|
10
10
|
const log = createLogger({ module: 'completion-merge' });
|
|
11
|
-
/** How long a pushed candidate may sit with no published verdict before it is re-
|
|
11
|
+
/** How long a pushed candidate may sit with no published verdict before it is re-pushed (once). */
|
|
12
12
|
export const CANDIDATE_CI_VERDICT_WAIT_MS = 3 * 60 * 60 * 1000;
|
|
13
13
|
/**
|
|
14
14
|
* The wait's fallback clock: when this process first saw each candidate waiting,
|
|
@@ -26,12 +26,12 @@ function key(subject, sha) {
|
|
|
26
26
|
}
|
|
27
27
|
const CAUSE_TEXT = {
|
|
28
28
|
red: 'is RED in CI',
|
|
29
|
-
|
|
29
|
+
local_red: 'FAILED the local completion run',
|
|
30
30
|
conflict: 'conflicts with the integration tip',
|
|
31
31
|
unreviewed_merge: 'carries a conflict-deciding merge no review judged',
|
|
32
32
|
};
|
|
33
|
-
async function rework(subject, sha, cause,
|
|
34
|
-
const outcome = await deps.routeRework(subject, sha, cause,
|
|
33
|
+
async function rework(subject, sha, cause, detail, deps) {
|
|
34
|
+
const outcome = await deps.routeRework(subject, sha, cause, detail);
|
|
35
35
|
if (outcome === 'not_reopened') {
|
|
36
36
|
log.warn(`[completion-merge] "${subject.focusName}": ${sha.slice(0, 9)} ${CAUSE_TEXT[cause]} but no work was re-opened -- retried next tick`);
|
|
37
37
|
return { reworked: false };
|
|
@@ -56,13 +56,37 @@ function fallbackSince(subject, sha, now) {
|
|
|
56
56
|
log.warn(`[completion-merge] "${subject.focusName}": the candidate-wait record is unusable; counting ${sha.slice(0, 9)}'s wait from this process's first sighting`);
|
|
57
57
|
return since;
|
|
58
58
|
}
|
|
59
|
-
/**
|
|
60
|
-
|
|
59
|
+
/**
|
|
60
|
+
* wait_ci: once the durable wait for `headSha` has run past the window, re-push
|
|
61
|
+
* the candidate ONCE; past a second window, hold (module doc). Never re-work.
|
|
62
|
+
*/
|
|
63
|
+
function waitForVerdict(subject, headSha, deps) {
|
|
61
64
|
const now = deps.now();
|
|
62
65
|
const since = deps.candidateWaitSince(headSha, now) ?? fallbackSince(subject, headSha, now);
|
|
63
66
|
if (now - since < CANDIDATE_CI_VERDICT_WAIT_MS)
|
|
64
67
|
return NOTHING;
|
|
65
|
-
|
|
68
|
+
if (deps.candidateRepushed(headSha)) {
|
|
69
|
+
log.debug(`[completion-merge] "${subject.focusName}": CI published no verdict for ${headSha.slice(0, 9)} even after a re-push -- holding (not re-work: a missing verdict is CI's fault)`);
|
|
70
|
+
return NOTHING;
|
|
71
|
+
}
|
|
72
|
+
const pushed = deps.repushCandidate(subject.repoPath, subject.focusId, headSha);
|
|
73
|
+
if (pushed) {
|
|
74
|
+
deps.markCandidateRepushed(headSha, now);
|
|
75
|
+
fallbackWaitSince.set(key(subject, headSha), now);
|
|
76
|
+
}
|
|
77
|
+
log.warn(`[completion-merge] "${subject.focusName}": CI published no verdict for ${headSha.slice(0, 9)} within ${Math.round(CANDIDATE_CI_VERDICT_WAIT_MS / 3_600_000)}h -- ${pushed ? 're-pushed the candidate once so CI sees a fresh push' : 'the re-push failed; retried next tick'}`);
|
|
78
|
+
return NOTHING;
|
|
79
|
+
}
|
|
80
|
+
/** run_local: start the daemon's run of the completion command on the head. */
|
|
81
|
+
function runLocal(subject, headSha, deps) {
|
|
82
|
+
const start = deps.startLocalRun(headSha);
|
|
83
|
+
if (start.kind === 'started')
|
|
84
|
+
log.info(`[completion-merge] "${subject.focusName}": started the local completion run of ${headSha.slice(0, 9)}`);
|
|
85
|
+
else if (start.kind === 'busy')
|
|
86
|
+
log.debug(`[completion-merge] "${subject.focusName}": local completion run of ${headSha.slice(0, 9)} waits for ${start.holder}`);
|
|
87
|
+
else if (start.kind === 'not_ready')
|
|
88
|
+
log.debug(`[completion-merge] "${subject.focusName}": local completion run of ${headSha.slice(0, 9)} not started: ${start.reason}`);
|
|
89
|
+
return NOTHING;
|
|
66
90
|
}
|
|
67
91
|
/**
|
|
68
92
|
* Take the step a held completion merge names, and say whether it returned the
|
|
@@ -77,6 +101,10 @@ export async function driveCompletionMergeStep(subject, step, headSha, deps) {
|
|
|
77
101
|
return await rework(subject, headSha, 'unreviewed_merge', null, deps);
|
|
78
102
|
if (step === 'rework')
|
|
79
103
|
return await rework(subject, headSha, 'red', null, deps);
|
|
104
|
+
if (step === 'rework_local')
|
|
105
|
+
return await rework(subject, headSha, 'local_red', deps.readLocalFailure(headSha), deps);
|
|
106
|
+
if (step === 'run_local')
|
|
107
|
+
return runLocal(subject, headSha, deps);
|
|
80
108
|
if (step === 'push_candidate') {
|
|
81
109
|
const pushed = deps.pushCandidate(subject.repoPath, subject.focusId, headSha);
|
|
82
110
|
if (pushed && deps.candidateWaitSince(headSha, deps.now()) === null)
|
|
@@ -84,7 +112,7 @@ export async function driveCompletionMergeStep(subject, step, headSha, deps) {
|
|
|
84
112
|
log.info(`[completion-merge] "${subject.focusName}": ${pushed ? 'pushed' : 'could not push'} integration candidate ${headSha.slice(0, 9)} for CI`);
|
|
85
113
|
return NOTHING;
|
|
86
114
|
}
|
|
87
|
-
return
|
|
115
|
+
return waitForVerdict(subject, headSha, deps);
|
|
88
116
|
}
|
|
89
117
|
catch (err) {
|
|
90
118
|
log.warn(`[completion-merge] "${subject.focusName}": ${step} for ${headSha.slice(0, 9)} failed: ${err.message}`);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completion-merge-driver.js","sourceRoot":"","sources":["../../src/merge/completion-merge-driver.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,mFAAmF;AACnF,wDAAwD;AACxD,kEAAkE;AAClE,+DAA+D;AAC/D,+DAA+D;AAC/D,sDAAsD;AACtD,gBAAgB;
|
|
1
|
+
{"version":3,"file":"completion-merge-driver.js","sourceRoot":"","sources":["../../src/merge/completion-merge-driver.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import type { CiRunStatus } from '../ci/ci-status.js';
|
|
2
|
+
import { type CompletionJudge } from './completion-judge.js';
|
|
3
|
+
import type { LocalCandidateStatus } from './completion-local-judge.js';
|
|
2
4
|
import type { ApprovalGateState } from './approval-gate-state.js';
|
|
3
5
|
import { type BranchMergeGateTarget, type GatedAnchor, type MergeGateTarget, type UnmergedCommit } from './merge-gate-coverage.js';
|
|
4
6
|
/** The step that advances a held completion merge; driven by the merge-back loop only. */
|
|
5
|
-
export type CompletionMergeStep = 'merge_out' | 'review_merge' | 'push_candidate' | 'wait_ci' | 'rework';
|
|
7
|
+
export type CompletionMergeStep = 'merge_out' | 'review_merge' | 'push_candidate' | 'wait_ci' | 'rework' | 'run_local' | 'rework_local';
|
|
6
8
|
/** A merge the gate holds (with why, and the step that advances it), or one it admits at an exact commit. */
|
|
7
9
|
export type MergeGateDecision = {
|
|
8
10
|
hold: string;
|
|
@@ -46,8 +48,14 @@ export interface CompletionMergeGateDeps {
|
|
|
46
48
|
readCandidateStatus: (target: MergeGateTarget, sha: string) => CiRunStatus;
|
|
47
49
|
/** The sha the focus's candidate branch points at on the remote; null when none / unreadable. */
|
|
48
50
|
readPushedCandidateSha: (target: MergeGateTarget) => string | null;
|
|
51
|
+
/** The completion judge the candidate commit's telora.verify.json declares. */
|
|
52
|
+
resolveCompletionJudge: (target: MergeGateTarget, sha: string) => CompletionJudge;
|
|
53
|
+
/** The candidate's standing under the local judge (its recorded verdict, or its run in flight). */
|
|
54
|
+
readLocalCandidateStatus: (target: MergeGateTarget, sha: string) => LocalCandidateStatus;
|
|
49
55
|
}
|
|
50
|
-
/**
|
|
56
|
+
/** Whether a delivery in this status still owes work, and so holds its focus's completion merge. Pure. */
|
|
57
|
+
export declare function deliveryHoldsCompletion(executionStatus: string | null): boolean;
|
|
58
|
+
/** Step 1: at least one delivery done, and none still owing work (module doc). Pure. */
|
|
51
59
|
export declare function focusCompletionHold(deliveries: readonly CompletionDeliveryFact[]): string | null;
|
|
52
60
|
/** The merges after the approved commit that git cannot prove clean (they decided a conflict, or edited). Pure. */
|
|
53
61
|
export declare function unreviewedMergesAfter(commits: readonly UnmergedCommit[], approval: GatedAnchor): UnmergedCommit[];
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completion-merge-gate.d.ts","sourceRoot":"","sources":["../../src/merge/completion-merge-gate.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"completion-merge-gate.d.ts","sourceRoot":"","sources":["../../src/merge/completion-merge-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,10 +21,12 @@
|
|
|
21
21
|
* integration once, at completion".
|
|
22
22
|
*
|
|
23
23
|
* The decision, in order (the first that fails holds):
|
|
24
|
-
* 1. COMPLETE:
|
|
25
|
-
*
|
|
26
|
-
*
|
|
27
|
-
*
|
|
24
|
+
* 1. COMPLETE: at least one focus delivery is done and none is still owed --
|
|
25
|
+
* cancelled, planning and draft deliveries do not hold (none of them has
|
|
26
|
+
* unfinished work on the branch: a cancelled one was dropped, a planning
|
|
27
|
+
* one -- recorded new intent included -- never started), while queued,
|
|
28
|
+
* coding, verify, verify_failed and paused ones do. Delivery facts, never
|
|
29
|
+
* product_focuses.status (humans own focus completion).
|
|
28
30
|
* 2. APPROVED HEAD: the focus's newest current approval
|
|
29
31
|
* (queries/focus-review/focus-review-approval.ts) is on the branch, the gate
|
|
30
32
|
* did not fail at it (merge/approval-gate-state.ts), and every commit after it
|
|
@@ -39,8 +41,15 @@
|
|
|
39
41
|
* the next step is MERGE_OUT -- one automatic merge, kept only when clean; a
|
|
40
42
|
* conflict is aborted and handed to the team (merge/focus-merge.ts
|
|
41
43
|
* attemptCompletionMergeOut). No resolver decides a conflict on this path.
|
|
42
|
-
* 4.
|
|
43
|
-
*
|
|
44
|
+
* 4. JUDGED CANDIDATE, by the judge the head's telora.verify.json declares
|
|
45
|
+
* (merge/completion-judge.ts):
|
|
46
|
+
* - ci: the head's refs/ci-status reads success (ci/candidate-ref.ts). Not
|
|
47
|
+
* pushed yet -> PUSH_CANDIDATE; pushed, no verdict -> WAIT_CI; red -> REWORK.
|
|
48
|
+
* - local: the daemon's run of the completion command on the head passed
|
|
49
|
+
* (merge/completion-local-judge.ts). No run yet -> RUN_LOCAL; running ->
|
|
50
|
+
* hold; failed -> REWORK_LOCAL.
|
|
51
|
+
* - none (no manifest): admitted on the approval alone, and the admission says so.
|
|
52
|
+
* - unreadable: hold (fail closed), naming why.
|
|
44
53
|
* A hold carries the step that would advance it (`next`) for the merge-back loop,
|
|
45
54
|
* which is the one driver of those steps; the other entry points just hold.
|
|
46
55
|
* An admission names the exact commit that passed (`candidateSha`), and
|
|
@@ -50,16 +59,28 @@
|
|
|
50
59
|
* @module merge/completion-merge-gate
|
|
51
60
|
*/
|
|
52
61
|
import { DELIVERY_STATUS } from '@telora/daemon-core';
|
|
62
|
+
import { describeCompletionJudge } from './completion-judge.js';
|
|
53
63
|
import { stopFires } from '../supervision/stop-registry.js';
|
|
54
64
|
import { judgeMergeGateCoverage, } from './merge-gate-coverage.js';
|
|
55
|
-
/**
|
|
65
|
+
/** Statuses that owe no work on the branch: they never hold a completion merge. */
|
|
66
|
+
const NOT_OWED = new Set([
|
|
67
|
+
DELIVERY_STATUS.DONE,
|
|
68
|
+
DELIVERY_STATUS.CANCELLED,
|
|
69
|
+
DELIVERY_STATUS.PLANNING,
|
|
70
|
+
DELIVERY_STATUS.DRAFT,
|
|
71
|
+
]);
|
|
72
|
+
/** Whether a delivery in this status still owes work, and so holds its focus's completion merge. Pure. */
|
|
73
|
+
export function deliveryHoldsCompletion(executionStatus) {
|
|
74
|
+
return executionStatus === null || !NOT_OWED.has(executionStatus);
|
|
75
|
+
}
|
|
76
|
+
/** Step 1: at least one delivery done, and none still owing work (module doc). Pure. */
|
|
56
77
|
export function focusCompletionHold(deliveries) {
|
|
57
|
-
const open = deliveries.filter((d) => d.executionStatus
|
|
78
|
+
const open = deliveries.filter((d) => deliveryHoldsCompletion(d.executionStatus));
|
|
58
79
|
if (open.length > 0) {
|
|
59
80
|
const names = open.slice(0, 3).map((d) => `"${d.name}" (${d.executionStatus ?? 'unknown'})`).join(', ');
|
|
60
81
|
return `the focus is not complete: ${open.length} delivery(ies) not done -- ${names}${open.length > 3 ? ', ...' : ''}`;
|
|
61
82
|
}
|
|
62
|
-
if (deliveries.
|
|
83
|
+
if (!deliveries.some((d) => d.executionStatus === DELIVERY_STATUS.DONE))
|
|
63
84
|
return 'the focus is not complete: no delivery is done';
|
|
64
85
|
return null;
|
|
65
86
|
}
|
|
@@ -102,7 +123,30 @@ async function readApproval(target, deps) {
|
|
|
102
123
|
}
|
|
103
124
|
return { ...resolved, source: state === 'auto_approval' ? 'auto_approval' : 'approved_review' };
|
|
104
125
|
}
|
|
105
|
-
/**
|
|
126
|
+
/** Step 4 under CI: the head's refs/ci-status. */
|
|
127
|
+
function ciStage(target, head, deps) {
|
|
128
|
+
const status = deps.readCandidateStatus(target, head);
|
|
129
|
+
if (status === 'green')
|
|
130
|
+
return { candidateSha: head, judgedBy: `candidate ${head.slice(0, 9)} green` };
|
|
131
|
+
if (status === 'red')
|
|
132
|
+
return { hold: `CI is RED on the integration candidate ${head.slice(0, 9)}`, next: 'rework', headSha: head };
|
|
133
|
+
if (deps.readPushedCandidateSha(target) !== head) {
|
|
134
|
+
return { hold: `the integration candidate ${head.slice(0, 9)} has not been pushed for CI`, next: 'push_candidate', headSha: head };
|
|
135
|
+
}
|
|
136
|
+
return { hold: `CI has not judged the integration candidate ${head.slice(0, 9)} yet`, next: 'wait_ci', headSha: head };
|
|
137
|
+
}
|
|
138
|
+
/** Step 4 under the local judge: the daemon's run of the completion command on the head. */
|
|
139
|
+
function localStage(target, head, judge, deps) {
|
|
140
|
+
const status = deps.readLocalCandidateStatus(target, head);
|
|
141
|
+
if (status === 'green')
|
|
142
|
+
return { candidateSha: head, judgedBy: `candidate ${head.slice(0, 9)} passed \`${judge.command}\` locally` };
|
|
143
|
+
if (status === 'red')
|
|
144
|
+
return { hold: `the integration candidate ${head.slice(0, 9)} FAILED \`${judge.command}\` locally`, next: 'rework_local', headSha: head };
|
|
145
|
+
if (status === 'running')
|
|
146
|
+
return { hold: `the daemon is running \`${judge.command}\` on the integration candidate ${head.slice(0, 9)}` };
|
|
147
|
+
return { hold: `the integration candidate ${head.slice(0, 9)} has not been run through \`${judge.command}\` yet`, next: 'run_local', headSha: head };
|
|
148
|
+
}
|
|
149
|
+
/** Steps 3-4: the candidate. Returns the admission when the head is judged good. */
|
|
106
150
|
function candidateStage(target, deps) {
|
|
107
151
|
const head = deps.resolveBranchHead(target.repoPath, target.branchName);
|
|
108
152
|
if (head === null)
|
|
@@ -113,15 +157,17 @@ function candidateStage(target, deps) {
|
|
|
113
157
|
if (!deps.isAncestor(target.repoPath, tip, head)) {
|
|
114
158
|
return { hold: `${target.branchName} does not contain the ${target.integrationBranch} tip ${tip.slice(0, 9)} yet`, next: 'merge_out', headSha: head };
|
|
115
159
|
}
|
|
116
|
-
const
|
|
117
|
-
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
122
|
-
|
|
160
|
+
const judge = deps.resolveCompletionJudge(target, head);
|
|
161
|
+
switch (judge.kind) {
|
|
162
|
+
case 'ci':
|
|
163
|
+
return ciStage(target, head, deps);
|
|
164
|
+
case 'local':
|
|
165
|
+
return localStage(target, head, judge, deps);
|
|
166
|
+
case 'none':
|
|
167
|
+
return { candidateSha: head, judgedBy: `candidate ${head.slice(0, 9)} judged by no suite -- ${describeCompletionJudge(judge)}; merged on the review approval alone` };
|
|
168
|
+
case 'unreadable':
|
|
169
|
+
return { hold: `the completion judge of the integration candidate ${head.slice(0, 9)} cannot be read: ${judge.reason}` };
|
|
123
170
|
}
|
|
124
|
-
return { hold: `CI has not judged the integration candidate ${head.slice(0, 9)} yet`, next: 'wait_ci', headSha: head };
|
|
125
171
|
}
|
|
126
172
|
async function decide(target, deps) {
|
|
127
173
|
const incomplete = focusCompletionHold(await deps.getFocusDeliveries(target.focusId));
|
|
@@ -150,7 +196,7 @@ async function decide(target, deps) {
|
|
|
150
196
|
return {
|
|
151
197
|
hold: null,
|
|
152
198
|
candidateSha: candidate.candidateSha,
|
|
153
|
-
admittedBy: `completion: ${approval.source} ${approval.sha.slice(0, 9)},
|
|
199
|
+
admittedBy: `completion: ${approval.source} ${approval.sha.slice(0, 9)}, ${candidate.judgedBy}`,
|
|
154
200
|
};
|
|
155
201
|
}
|
|
156
202
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"completion-merge-gate.js","sourceRoot":"","sources":["../../src/merge/completion-merge-gate.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,mFAAmF;AACnF,gFAAgF;AAChF,qEAAqE;AACrE,6DAA6D;AAC7D,8GAA8G;AAC9G,oEAAoE;AACpE,6DAA6D;AAC7D,gBAAgB;AAEhB
|
|
1
|
+
{"version":3,"file":"completion-merge-gate.js","sourceRoot":"","sources":["../../src/merge/completion-merge-gate.ts"],"names":[],"mappings":"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"}
|
|
@@ -132,8 +132,16 @@ export interface MergeBackLoopDeps {
|
|
|
132
132
|
* Combines getActiveFocuses (for org/name/readOnly context) with the
|
|
133
133
|
* in-memory worktree state (for branchName + worktreePath). Returns one
|
|
134
134
|
* entry per focus whose branch has unmerged commits.
|
|
135
|
+
*
|
|
136
|
+
* A focus that is no longer ACTIVE stays in view while this host holds a
|
|
137
|
+
* completion hold for it (merge/completion-hold-record.ts): its deliveries were
|
|
138
|
+
* complete and its merge was still pending when it left the active set -- a
|
|
139
|
+
* human marked it complete while the candidate was being judged. Dropping it
|
|
140
|
+
* there stranded its commits off integration (Tinker Tailor, 2026-10-04). It is
|
|
141
|
+
* carried with no pipeline config and as writable; the completion gate re-reads
|
|
142
|
+
* its deliveries, so a focus that is no longer complete still holds.
|
|
135
143
|
*/
|
|
136
|
-
export declare function defaultEnumerateFocusBranchesAhead(config: DaemonConfig): Promise<MergeBackFocusInfo[]>;
|
|
144
|
+
export declare function defaultEnumerateFocusBranchesAhead(config: DaemonConfig, hasPendingCompletion: (productId: string, focusId: string) => boolean): Promise<MergeBackFocusInfo[]>;
|
|
137
145
|
/**
|
|
138
146
|
* When a COMPLETED focus's integration merge was first held, from its durable
|
|
139
147
|
* record (merge/completion-hold-record.ts): stamped the first tick the focus is
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"merge-back-loop.d.ts","sourceRoot":"","sources":["../../src/merge/merge-back-loop.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"merge-back-loop.d.ts","sourceRoot":"","sources":["../../src/merge/merge-back-loop.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
// PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
|
|
2
2
|
// Pinned by: packages/daemon/src/completion/team-exit/teardown-merge-gate.test.ts,
|
|
3
3
|
// packages/daemon/src/integration/merge-back-resolver-timeout-regression.test.ts,
|
|
4
|
+
// packages/daemon/src/merge/merge-back-held-completion-scan.test.ts,
|
|
4
5
|
// packages/daemon/src/merge/merge-back-loop.test.ts,
|
|
5
6
|
// packages/daemon/src/merge/resolver-exhausted-observation.test.ts
|
|
6
7
|
// PINNED-BY-END
|
|
@@ -103,8 +104,16 @@ function readStuckBranchThresholdMs(env) {
|
|
|
103
104
|
* Combines getActiveFocuses (for org/name/readOnly context) with the
|
|
104
105
|
* in-memory worktree state (for branchName + worktreePath). Returns one
|
|
105
106
|
* entry per focus whose branch has unmerged commits.
|
|
107
|
+
*
|
|
108
|
+
* A focus that is no longer ACTIVE stays in view while this host holds a
|
|
109
|
+
* completion hold for it (merge/completion-hold-record.ts): its deliveries were
|
|
110
|
+
* complete and its merge was still pending when it left the active set -- a
|
|
111
|
+
* human marked it complete while the candidate was being judged. Dropping it
|
|
112
|
+
* there stranded its commits off integration (Tinker Tailor, 2026-10-04). It is
|
|
113
|
+
* carried with no pipeline config and as writable; the completion gate re-reads
|
|
114
|
+
* its deliveries, so a focus that is no longer complete still holds.
|
|
106
115
|
*/
|
|
107
|
-
export async function defaultEnumerateFocusBranchesAhead(config) {
|
|
116
|
+
export async function defaultEnumerateFocusBranchesAhead(config, hasPendingCompletion) {
|
|
108
117
|
const out = [];
|
|
109
118
|
const worktrees = getAllFocusWorktrees();
|
|
110
119
|
for (const product of config.products) {
|
|
@@ -117,6 +126,24 @@ export async function defaultEnumerateFocusBranchesAhead(config) {
|
|
|
117
126
|
log.warn(`[merge-back-loop] getActiveFocuses failed for product ${product.id}:`, err.message);
|
|
118
127
|
continue;
|
|
119
128
|
}
|
|
129
|
+
const activeIds = new Set(focuses.map((f) => f.focus_id));
|
|
130
|
+
for (const [focusId, wt] of worktrees) {
|
|
131
|
+
if (activeIds.has(focusId) || wt.productId !== product.id || !hasPendingCompletion(product.id, focusId))
|
|
132
|
+
continue;
|
|
133
|
+
if (!branchHasUnmergedCommits(wt.branchName, pc.integrationBranch, pc.repoPath))
|
|
134
|
+
continue;
|
|
135
|
+
out.push({
|
|
136
|
+
focusId,
|
|
137
|
+
focusName: wt.focusName || wt.branchName,
|
|
138
|
+
organizationId: pc.organizationId,
|
|
139
|
+
productId: product.id,
|
|
140
|
+
branchName: wt.branchName,
|
|
141
|
+
worktreePath: wt.worktreePath,
|
|
142
|
+
repoPath: pc.repoPath,
|
|
143
|
+
pipelineConfig: null,
|
|
144
|
+
readOnly: false,
|
|
145
|
+
});
|
|
146
|
+
}
|
|
120
147
|
for (const focus of focuses) {
|
|
121
148
|
const wt = worktrees.get(focus.focus_id);
|
|
122
149
|
if (!wt)
|