@telora/daemon 0.24.2 → 0.24.5

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 (138) hide show
  1. package/build-info.json +8 -3
  2. package/dist/backends/claude/one-shot-model.d.ts.map +1 -1
  3. package/dist/backends/claude/one-shot-model.js +2 -0
  4. package/dist/backends/claude/one-shot-model.js.map +1 -1
  5. package/dist/ci/ci-status.d.ts.map +1 -1
  6. package/dist/ci/ci-status.js +1 -0
  7. package/dist/ci/ci-status.js.map +1 -1
  8. package/dist/ci/product-ci-repo.d.ts.map +1 -1
  9. package/dist/ci/product-ci-repo.js +3 -1
  10. package/dist/ci/product-ci-repo.js.map +1 -1
  11. package/dist/completion/state-cascade/review-approved-head-gate.d.ts.map +1 -1
  12. package/dist/completion/state-cascade/review-approved-head-gate.js +2 -0
  13. package/dist/completion/state-cascade/review-approved-head-gate.js.map +1 -1
  14. package/dist/completion/state-cascade/review-capture-head-gate.d.ts +28 -0
  15. package/dist/completion/state-cascade/review-capture-head-gate.d.ts.map +1 -0
  16. package/dist/completion/state-cascade/review-capture-head-gate.js +48 -0
  17. package/dist/completion/state-cascade/review-capture-head-gate.js.map +1 -0
  18. package/dist/completion/state-cascade/state-cascade.d.ts +12 -0
  19. package/dist/completion/state-cascade/state-cascade.d.ts.map +1 -1
  20. package/dist/completion/state-cascade/state-cascade.js +19 -10
  21. package/dist/completion/state-cascade/state-cascade.js.map +1 -1
  22. package/dist/composition/daemon-contexts.d.ts.map +1 -1
  23. package/dist/composition/daemon-contexts.js +3 -1
  24. package/dist/composition/daemon-contexts.js.map +1 -1
  25. package/dist/composition/execution-git-context.d.ts.map +1 -1
  26. package/dist/composition/execution-git-context.js +1 -0
  27. package/dist/composition/execution-git-context.js.map +1 -1
  28. package/dist/composition/execution-worktree-context.js +1 -1
  29. package/dist/composition/release-note-pass-context.d.ts +7 -0
  30. package/dist/composition/release-note-pass-context.d.ts.map +1 -0
  31. package/dist/composition/release-note-pass-context.js +64 -0
  32. package/dist/composition/release-note-pass-context.js.map +1 -0
  33. package/dist/composition/runtime-contexts.d.ts.map +1 -1
  34. package/dist/composition/runtime-contexts.js +2 -0
  35. package/dist/composition/runtime-contexts.js.map +1 -1
  36. package/dist/composition/spawn-pass-deps.d.ts +2 -2
  37. package/dist/composition/spawn-pass-deps.d.ts.map +1 -1
  38. package/dist/composition/spawn-pass-deps.js +3 -1
  39. package/dist/composition/spawn-pass-deps.js.map +1 -1
  40. package/dist/composition/state-cascade-context.d.ts.map +1 -1
  41. package/dist/composition/state-cascade-context.js +2 -0
  42. package/dist/composition/state-cascade-context.js.map +1 -1
  43. package/dist/config/live-daemon-config.js +1 -1
  44. package/dist/daemon-state/provider-window.d.ts.map +1 -1
  45. package/dist/daemon-state/provider-window.js +1 -0
  46. package/dist/daemon-state/provider-window.js.map +1 -1
  47. package/dist/directive/directive-queue.js +1 -1
  48. package/dist/focus/daemon-contexts.d.ts +3 -0
  49. package/dist/focus/daemon-contexts.d.ts.map +1 -1
  50. package/dist/focus/daemon-contexts.js.map +1 -1
  51. package/dist/focus/focus-loop-registry.d.ts.map +1 -1
  52. package/dist/focus/focus-loop-registry.js +21 -0
  53. package/dist/focus/focus-loop-registry.js.map +1 -1
  54. package/dist/focus/pending-review-approved-head.d.ts +5 -1
  55. package/dist/focus/pending-review-approved-head.d.ts.map +1 -1
  56. package/dist/focus/pending-review-approved-head.js +35 -1
  57. package/dist/focus/pending-review-approved-head.js.map +1 -1
  58. package/dist/focus/review-spawn-coverage.d.ts +11 -0
  59. package/dist/focus/review-spawn-coverage.d.ts.map +1 -1
  60. package/dist/focus/review-spawn-coverage.js +14 -0
  61. package/dist/focus/review-spawn-coverage.js.map +1 -1
  62. package/dist/git/delivery-trailer.d.ts.map +1 -1
  63. package/dist/git/delivery-trailer.js +2 -0
  64. package/dist/git/delivery-trailer.js.map +1 -1
  65. package/dist/git/utils.d.ts.map +1 -1
  66. package/dist/git/utils.js +2 -1
  67. package/dist/git/utils.js.map +1 -1
  68. package/dist/merge/candidate-rework.d.ts.map +1 -1
  69. package/dist/merge/candidate-rework.js +24 -2
  70. package/dist/merge/candidate-rework.js.map +1 -1
  71. package/dist/merge/completion-merge-activity.d.ts.map +1 -1
  72. package/dist/merge/completion-merge-activity.js +7 -1
  73. package/dist/merge/completion-merge-activity.js.map +1 -1
  74. package/dist/merge/completion-merge-driver.d.ts +15 -5
  75. package/dist/merge/completion-merge-driver.d.ts.map +1 -1
  76. package/dist/merge/completion-merge-driver.js +7 -2
  77. package/dist/merge/completion-merge-driver.js.map +1 -1
  78. package/dist/merge/completion-merge-gate.d.ts +5 -1
  79. package/dist/merge/completion-merge-gate.d.ts.map +1 -1
  80. package/dist/merge/completion-merge-gate.js +23 -7
  81. package/dist/merge/completion-merge-gate.js.map +1 -1
  82. package/dist/merge/merge-back-loop.d.ts.map +1 -1
  83. package/dist/merge/merge-back-loop.js +2 -1
  84. package/dist/merge/merge-back-loop.js.map +1 -1
  85. package/dist/merge/merge-gate-coverage.d.ts +0 -2
  86. package/dist/merge/merge-gate-coverage.d.ts.map +1 -1
  87. package/dist/merge/merge-gate-coverage.js +11 -9
  88. package/dist/merge/merge-gate-coverage.js.map +1 -1
  89. package/dist/prompt-sections/release-note-faithfulness-section.d.ts +28 -0
  90. package/dist/prompt-sections/release-note-faithfulness-section.d.ts.map +1 -0
  91. package/dist/prompt-sections/release-note-faithfulness-section.js +99 -0
  92. package/dist/prompt-sections/release-note-faithfulness-section.js.map +1 -0
  93. package/dist/prompt-sections/release-note-section.d.ts +58 -0
  94. package/dist/prompt-sections/release-note-section.d.ts.map +1 -0
  95. package/dist/prompt-sections/release-note-section.js +285 -0
  96. package/dist/prompt-sections/release-note-section.js.map +1 -0
  97. package/dist/queries/api-client/shared.d.ts +1 -0
  98. package/dist/queries/api-client/shared.d.ts.map +1 -1
  99. package/dist/queries/api-client/shared.js +16 -1
  100. package/dist/queries/api-client/shared.js.map +1 -1
  101. package/dist/queries/release-notes/release-notes.d.ts +242 -0
  102. package/dist/queries/release-notes/release-notes.d.ts.map +1 -0
  103. package/dist/queries/release-notes/release-notes.js +148 -0
  104. package/dist/queries/release-notes/release-notes.js.map +1 -0
  105. package/dist/release-notes/release-note-author.d.ts +56 -0
  106. package/dist/release-notes/release-note-author.d.ts.map +1 -0
  107. package/dist/release-notes/release-note-author.js +107 -0
  108. package/dist/release-notes/release-note-author.js.map +1 -0
  109. package/dist/release-notes/release-note-faithfulness.d.ts +40 -0
  110. package/dist/release-notes/release-note-faithfulness.d.ts.map +1 -0
  111. package/dist/release-notes/release-note-faithfulness.js +107 -0
  112. package/dist/release-notes/release-note-faithfulness.js.map +1 -0
  113. package/dist/release-notes/release-note-pass.d.ts +77 -0
  114. package/dist/release-notes/release-note-pass.d.ts.map +1 -0
  115. package/dist/release-notes/release-note-pass.js +201 -0
  116. package/dist/release-notes/release-note-pass.js.map +1 -0
  117. package/dist/testing/fixtures/api-client.js +1 -1
  118. package/dist/testing/fixtures/approved-head-inert-deps.d.ts +4 -3
  119. package/dist/testing/fixtures/approved-head-inert-deps.d.ts.map +1 -1
  120. package/dist/testing/fixtures/approved-head-inert-deps.js +3 -0
  121. package/dist/testing/fixtures/approved-head-inert-deps.js.map +1 -1
  122. package/dist/testing/fixtures/completion-judge-stubs.d.ts.map +1 -1
  123. package/dist/testing/fixtures/completion-judge-stubs.js +2 -0
  124. package/dist/testing/fixtures/completion-judge-stubs.js.map +1 -1
  125. package/dist/testing/fixtures/index.js +1 -1
  126. package/dist/testing/fixtures/pending-spawn-world.d.ts.map +1 -1
  127. package/dist/testing/fixtures/pending-spawn-world.js +1 -0
  128. package/dist/testing/fixtures/pending-spawn-world.js.map +1 -1
  129. package/dist/types/index.js +1 -1
  130. package/dist/worktree/capture-head-adoption.d.ts +44 -0
  131. package/dist/worktree/capture-head-adoption.d.ts.map +1 -0
  132. package/dist/worktree/capture-head-adoption.js +96 -0
  133. package/dist/worktree/capture-head-adoption.js.map +1 -0
  134. package/dist/worktree/safety.d.ts +12 -3
  135. package/dist/worktree/safety.d.ts.map +1 -1
  136. package/dist/worktree/safety.js +15 -3
  137. package/dist/worktree/safety.js.map +1 -1
  138. package/package.json +2 -2
@@ -0,0 +1,201 @@
1
+ // PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
2
+ // Pinned by: packages/daemon/src/release-notes/release-note-pass.test.ts
3
+ // PINNED-BY-END
4
+ import { createLogger } from '../log/daemon-log.js';
5
+ import { readReleaseNoteWriteFailure, } from '../queries/release-notes/release-notes.js';
6
+ const log = createLogger({ module: 'release-notes' });
7
+ /** The loop's cadence. */
8
+ export const RELEASE_NOTE_PASS_INTERVAL_MS = 60_000;
9
+ let passInFlight = false;
10
+ function errorMessage(err) {
11
+ return err instanceof Error ? err.message : String(err);
12
+ }
13
+ /** What a failed write said, whatever kind it was. */
14
+ function failureText(failure) {
15
+ return failure.kind === 'refused' ? failure.violations.join('; ') : failure.detail;
16
+ }
17
+ /** Give the claim back. Released when it was still this pass's; lost when it was not. */
18
+ async function giveBack(deps, held, why) {
19
+ try {
20
+ const released = await deps.unclaim(held.releaseId, held.claimId);
21
+ log.info(`[release-notes] ${held.tag}: ${released ? 'claim given back' : 'claim already gone'} -- ${why}`);
22
+ return released ? 'released' : 'lost';
23
+ }
24
+ catch (err) {
25
+ const failure = readReleaseNoteWriteFailure(err);
26
+ if (failure.kind === 'conflict') {
27
+ log.info(`[release-notes] ${held.tag}: the claim was lost (${failure.detail}) -- ${why}`);
28
+ return 'lost';
29
+ }
30
+ log.warn(`[release-notes] ${held.tag}: could not give the claim back (${why}): ${failureText(failure)}`);
31
+ return 'errors';
32
+ }
33
+ }
34
+ /** Write the release draft_failed with the reason; a human redraft retries. */
35
+ async function recordFailed(deps, held, reason) {
36
+ try {
37
+ await deps.write({ releaseId: held.releaseId, claimId: held.claimId, outcome: 'failed', failureReason: reason });
38
+ log.warn(`[release-notes] ${held.tag}: drafting failed -- ${reason}`);
39
+ return 'failed';
40
+ }
41
+ catch (err) {
42
+ const failure = readReleaseNoteWriteFailure(err);
43
+ if (failure.kind === 'conflict') {
44
+ log.info(`[release-notes] ${held.tag}: the claim was lost before the failure was recorded (${failure.detail})`);
45
+ return 'lost';
46
+ }
47
+ log.warn(`[release-notes] ${held.tag}: could not record the failure (${reason}): ${failureText(failure)}`);
48
+ return 'errors';
49
+ }
50
+ }
51
+ /** Write the note as the release's draft. A refusal is handed back for the corrective attempt. */
52
+ async function writeDraft(deps, held, note) {
53
+ try {
54
+ await deps.write({
55
+ releaseId: held.releaseId,
56
+ claimId: held.claimId,
57
+ outcome: 'draft',
58
+ note,
59
+ draftedFromDeliveryIds: held.context.work.map((w) => w.deliveryId),
60
+ });
61
+ log.info(`[release-notes] ${held.tag}: draft stored (${note.items.length} item(s))`);
62
+ return { kind: 'done', outcome: 'drafted' };
63
+ }
64
+ catch (err) {
65
+ const failure = readReleaseNoteWriteFailure(err);
66
+ if (failure.kind === 'refused')
67
+ return failure;
68
+ // A conflict: the human changed the release's work (give the claim back so
69
+ // the next tick drafts it again) or this pass lost the claim (the give-back
70
+ // is refused the same way, and nothing is written). Any other failure gives
71
+ // the claim back too, so the next tick can try at once.
72
+ const why = failure.kind === 'conflict' ? `the draft was not stored: ${failure.detail}` : `the draft write failed: ${failure.detail}`;
73
+ const outcome = await giveBack(deps, held, why);
74
+ return { kind: 'done', outcome: failure.kind === 'error' && outcome === 'released' ? 'errors' : outcome };
75
+ }
76
+ }
77
+ async function judgeSafely(deps, context, note) {
78
+ try {
79
+ return await deps.judge(context, note);
80
+ }
81
+ catch (err) {
82
+ return { kind: 'failed', reason: `the faithfulness check threw: ${errorMessage(err)}` };
83
+ }
84
+ }
85
+ /**
86
+ * Judge the note, then write it. An unfaithful verdict comes back as violations
87
+ * for the corrective attempt, exactly as an edge refusal does; a check held by
88
+ * the provider gives the claim back, and one that could not judge records the
89
+ * failure.
90
+ */
91
+ async function judgeThenWrite(deps, held, note) {
92
+ const verdict = await judgeSafely(deps, held.context, note);
93
+ if (verdict.kind === 'unfaithful') {
94
+ log.info(`[release-notes] ${held.tag}: the faithfulness check found ${verdict.violations.length} Why(s) unfaithful`);
95
+ return { kind: 'refused', violations: verdict.violations };
96
+ }
97
+ if (verdict.kind === 'held')
98
+ return { kind: 'done', outcome: await giveBack(deps, held, verdict.reason) };
99
+ if (verdict.kind === 'failed')
100
+ return { kind: 'done', outcome: await recordFailed(deps, held, verdict.reason) };
101
+ return writeDraft(deps, held, note);
102
+ }
103
+ async function authorSafely(deps, context, correction) {
104
+ try {
105
+ return await deps.author(context, correction);
106
+ }
107
+ catch (err) {
108
+ return { kind: 'failed', reason: `the release-note pass threw: ${errorMessage(err)}` };
109
+ }
110
+ }
111
+ /** Draft the held release: author, judge, write, and on an unfaithful verdict or a refusal ONE corrective attempt. */
112
+ async function draftHeld(deps, held) {
113
+ if (held.context.work.length === 0)
114
+ return recordFailed(deps, held, 'the release carries no work to describe');
115
+ let result = await authorSafely(deps, held.context, null);
116
+ if (result.kind === 'note') {
117
+ const first = await judgeThenWrite(deps, held, result.note);
118
+ if (first.kind === 'done')
119
+ return first.outcome;
120
+ log.info(`[release-notes] ${held.tag}: draft refused; one corrective attempt -- ${first.violations.join('; ')}`);
121
+ result = await authorSafely(deps, held.context, { previous: result.note, violations: first.violations });
122
+ if (result.kind === 'note') {
123
+ const second = await judgeThenWrite(deps, held, result.note);
124
+ if (second.kind === 'done')
125
+ return second.outcome;
126
+ return recordFailed(deps, held, `the note was refused after one corrective attempt: ${second.violations.join('; ')}`);
127
+ }
128
+ if (result.kind === 'failed') {
129
+ result = { kind: 'failed', reason: `${result.reason} (the corrective attempt after: ${first.violations.join('; ')})` };
130
+ }
131
+ }
132
+ if (result.kind === 'held')
133
+ return giveBack(deps, held, result.reason);
134
+ return recordFailed(deps, held, result.reason);
135
+ }
136
+ async function runCandidate(deps, candidate) {
137
+ const tag = `release ${candidate.releaseId.slice(0, 8)} ("${candidate.name}")`;
138
+ let claim;
139
+ try {
140
+ claim = await deps.claim(candidate.releaseId);
141
+ }
142
+ catch (err) {
143
+ log.warn(`[release-notes] ${tag}: claim failed: ${errorMessage(err)}`);
144
+ return 'errors';
145
+ }
146
+ if (!claim.claimed) {
147
+ log.info(`[release-notes] ${tag}: not claimed -- ${claim.reason || 'another pass holds it'}`);
148
+ return 'notClaimed';
149
+ }
150
+ return draftHeld(deps, { releaseId: candidate.releaseId, claimId: claim.claimId, context: claim.context, tag });
151
+ }
152
+ /** Run one pass over every product. One product's failed read never stops another's. */
153
+ export async function runReleaseNotePass(deps) {
154
+ const outcome = { skipped: null, drafted: 0, failed: 0, released: 0, lost: 0, notClaimed: 0, errors: 0 };
155
+ if (passInFlight)
156
+ return { ...outcome, skipped: 'a release-note pass is already running' };
157
+ passInFlight = true;
158
+ try {
159
+ for (const product of deps.products) {
160
+ const before = deps.holdReason();
161
+ if (before)
162
+ return { ...outcome, skipped: before };
163
+ let candidates;
164
+ try {
165
+ candidates = await deps.readCandidates(product.id);
166
+ }
167
+ catch (err) {
168
+ log.warn(`[release-notes] candidate read failed for product ${product.id.slice(0, 8)}: ${errorMessage(err)}`);
169
+ outcome.errors++;
170
+ continue;
171
+ }
172
+ for (const candidate of candidates) {
173
+ const hold = deps.holdReason();
174
+ if (hold)
175
+ return { ...outcome, skipped: hold };
176
+ outcome[await runCandidate(deps, candidate)]++;
177
+ }
178
+ }
179
+ return outcome;
180
+ }
181
+ finally {
182
+ passInFlight = false;
183
+ }
184
+ }
185
+ /** The loop tick: one pass over the live deps, never throwing into the timer. */
186
+ export async function runReleaseNotePassSafely(source, governor) {
187
+ try {
188
+ const deps = source(governor);
189
+ if (!deps)
190
+ return;
191
+ const o = await runReleaseNotePass(deps);
192
+ if (o.drafted + o.failed + o.released + o.lost + o.errors > 0) {
193
+ log.info(`[release-notes] pass: drafted=${o.drafted} failed=${o.failed} released=${o.released} lost=${o.lost} ` +
194
+ `notClaimed=${o.notClaimed} errors=${o.errors}` + (o.skipped ? ` stopped=(${o.skipped})` : ''));
195
+ }
196
+ }
197
+ catch (err) {
198
+ log.warn(`[release-notes] pass failed: ${errorMessage(err)}`);
199
+ }
200
+ }
201
+ //# sourceMappingURL=release-note-pass.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"release-note-pass.js","sourceRoot":"","sources":["../../src/release-notes/release-note-pass.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: 81 tests -- run: npm run gen:pinned-by -- --list packages/daemon/src/testing/fixtures/api-client.ts
2
+ // Pinned by: 82 tests -- run: npm run gen:pinned-by -- --list packages/daemon/src/testing/fixtures/api-client.ts
3
3
  // PINNED-BY-END
4
4
  /** A fake ApiClient whose every call is answered by `handle`. */
5
5
  export function makeFakeApiClient(handle) {
@@ -4,9 +4,10 @@
4
4
  * REQUIRED since the dependency fallbacks were removed.
5
5
  *
6
6
  * Inert means: no approval of a known head, no unchanged reviewed range, no
7
- * recorded verdict, nothing filed, no deliveries, and a window clear that does
8
- * nothing -- so the gate answers 'spawn' unless a test overrides the read it is
9
- * about. Pass overrides for the members a test exercises.
7
+ * recorded verdict, nothing filed, no deliveries, a window clear that does
8
+ * nothing, and no head for the capture-head adoption to read -- so the gate
9
+ * answers 'spawn' unless a test overrides the read it is about. Pass overrides
10
+ * for the members a test exercises.
10
11
  */
11
12
  import type { PendingReviewApprovedHeadDeps } from '../../focus/pending-review-approved-head.js';
12
13
  export declare function makeInertApprovedHeadDeps(overrides?: Partial<PendingReviewApprovedHeadDeps>): PendingReviewApprovedHeadDeps;
@@ -1 +1 @@
1
- {"version":3,"file":"approved-head-inert-deps.d.ts","sourceRoot":"","sources":["../../../src/testing/fixtures/approved-head-inert-deps.ts"],"names":[],"mappings":"AAUA;;;;;;;;;GASG;AAEH,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,6CAA6C,CAAC;AAEjG,wBAAgB,yBAAyB,CACvC,SAAS,GAAE,OAAO,CAAC,6BAA6B,CAAM,GACrD,6BAA6B,CAU/B"}
1
+ {"version":3,"file":"approved-head-inert-deps.d.ts","sourceRoot":"","sources":["../../../src/testing/fixtures/approved-head-inert-deps.ts"],"names":[],"mappings":"AAYA;;;;;;;;;;GAUG;AAEH,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,6CAA6C,CAAC;AAEjG,wBAAgB,yBAAyB,CACvC,SAAS,GAAE,OAAO,CAAC,6BAA6B,CAAM,GACrD,6BAA6B,CAW/B"}
@@ -2,9 +2,11 @@
2
2
  // Pinned by: packages/daemon/src/completion/review-exit/review-census-never-reached.test.ts,
3
3
  // packages/daemon/src/focus/gaps-found-hands-to-coding.test.ts,
4
4
  // packages/daemon/src/focus/pending-review-approved-head.test.ts,
5
+ // packages/daemon/src/focus/pending-review-capture-head.test.ts,
5
6
  // packages/daemon/src/focus/ready-focus-no-work-spawn.test.ts,
6
7
  // packages/daemon/src/focus/unchanged-reviewed-head.test.ts,
7
8
  // packages/daemon/src/focus/unclaimed-notice-coding-precedence.test.ts,
9
+ // packages/daemon/src/integration/capture-head-review-regression.test.ts,
8
10
  // packages/daemon/src/integration/model-reached-review-exit-effects.test.ts
9
11
  // PINNED-BY-END
10
12
  export function makeInertApprovedHeadDeps(overrides = {}) {
@@ -15,6 +17,7 @@ export function makeInertApprovedHeadDeps(overrides = {}) {
15
17
  fileReworkForFailedVerdict: async () => ({ kind: 'no_owner_delivery' }),
16
18
  getFocusDeliveries: async () => [],
17
19
  clearReviewRequestedAt: async () => { },
20
+ adoptCaptureHead: () => ({ kind: 'unreadable', reason: 'inert approved-head deps read no head' }),
18
21
  ...overrides,
19
22
  };
20
23
  }
@@ -1 +1 @@
1
- {"version":3,"file":"approved-head-inert-deps.js","sourceRoot":"","sources":["../../../src/testing/fixtures/approved-head-inert-deps.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,6FAA6F;AAC7F,kEAAkE;AAClE,oEAAoE;AACpE,iEAAiE;AACjE,+DAA+D;AAC/D,0EAA0E;AAC1E,8EAA8E;AAC9E,gBAAgB;AAehB,MAAM,UAAU,yBAAyB,CACvC,YAAoD,EAAE;IAEtD,OAAO;QACL,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QAC1E,yBAAyB,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;QAC3C,iBAAiB,EAAE,GAAG,EAAE,CAAC,IAAI;QAC7B,0BAA0B,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,mBAA4B,EAAE,CAAC;QAChF,kBAAkB,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;QAClC,sBAAsB,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACtC,GAAG,SAAS;KACb,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"approved-head-inert-deps.js","sourceRoot":"","sources":["../../../src/testing/fixtures/approved-head-inert-deps.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,6FAA6F;AAC7F,kEAAkE;AAClE,oEAAoE;AACpE,mEAAmE;AACnE,iEAAiE;AACjE,+DAA+D;AAC/D,0EAA0E;AAC1E,4EAA4E;AAC5E,8EAA8E;AAC9E,gBAAgB;AAgBhB,MAAM,UAAU,yBAAyB,CACvC,YAAoD,EAAE;IAEtD,OAAO;QACL,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,OAAO,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,CAAC;QAC1E,yBAAyB,EAAE,KAAK,IAAI,EAAE,CAAC,IAAI;QAC3C,iBAAiB,EAAE,GAAG,EAAE,CAAC,IAAI;QAC7B,0BAA0B,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,mBAA4B,EAAE,CAAC;QAChF,kBAAkB,EAAE,KAAK,IAAI,EAAE,CAAC,EAAE;QAClC,sBAAsB,EAAE,KAAK,IAAI,EAAE,GAAE,CAAC;QACtC,gBAAgB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,YAAqB,EAAE,MAAM,EAAE,uCAAuC,EAAE,CAAC;QAC1G,GAAG,SAAS;KACb,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"completion-judge-stubs.d.ts","sourceRoot":"","sources":["../../../src/testing/fixtures/completion-judge-stubs.ts"],"names":[],"mappings":"AAkBA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AACxF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAEpF,+EAA+E;AAC/E,wBAAgB,gBAAgB,IAAI,IAAI,CAAC,uBAAuB,EAAE,wBAAwB,GAAG,0BAA0B,CAAC,CAKvH;AAED,6GAA6G;AAC7G,wBAAgB,qBAAqB,IAAI,IAAI,CAC3C,yBAAyB,EACzB,mBAAmB,GAAG,uBAAuB,GAAG,iBAAiB,GAAG,eAAe,GAAG,kBAAkB,CACzG,CAQA"}
1
+ {"version":3,"file":"completion-judge-stubs.d.ts","sourceRoot":"","sources":["../../../src/testing/fixtures/completion-judge-stubs.ts"],"names":[],"mappings":"AAoBA;;;;;;;GAOG;AAEH,OAAO,KAAK,EAAE,yBAAyB,EAAE,MAAM,wCAAwC,CAAC;AACxF,OAAO,KAAK,EAAE,uBAAuB,EAAE,MAAM,sCAAsC,CAAC;AAEpF,+EAA+E;AAC/E,wBAAgB,gBAAgB,IAAI,IAAI,CAAC,uBAAuB,EAAE,wBAAwB,GAAG,0BAA0B,CAAC,CAKvH;AAED,6GAA6G;AAC7G,wBAAgB,qBAAqB,IAAI,IAAI,CAC3C,yBAAyB,EACzB,mBAAmB,GAAG,uBAAuB,GAAG,iBAAiB,GAAG,eAAe,GAAG,kBAAkB,CACzG,CAQA"}
@@ -4,6 +4,8 @@
4
4
  // packages/daemon/src/focus/focus-activity-completion-merge.test.ts,
5
5
  // packages/daemon/src/focus/heartbeat-completion-merge.test.ts,
6
6
  // packages/daemon/src/integration/approved-head-hold-release-completion-regression.test.ts,
7
+ // packages/daemon/src/integration/capture-head-review-regression.test.ts,
8
+ // packages/daemon/src/integration/commits-after-approval-review-regression.test.ts,
7
9
  // packages/daemon/src/integration/merge-back-resolver-timeout-regression.test.ts,
8
10
  // packages/daemon/src/merge/candidate-rework.test.ts,
9
11
  // packages/daemon/src/merge/completion-conflict-rework.test.ts,
@@ -1 +1 @@
1
- {"version":3,"file":"completion-judge-stubs.js","sourceRoot":"","sources":["../../../src/testing/fixtures/completion-judge-stubs.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,mFAAmF;AACnF,gFAAgF;AAChF,uEAAuE;AACvE,kEAAkE;AAClE,8FAA8F;AAC9F,oFAAoF;AACpF,wDAAwD;AACxD,kEAAkE;AAClE,+DAA+D;AAC/D,6DAA6D;AAC7D,+DAA+D;AAC/D,8GAA8G;AAC9G,oEAAoE;AACpE,sEAAsE;AACtE,6DAA6D;AAC7D,gBAAgB;AAchB,+EAA+E;AAC/E,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC9C,wBAAwB,EAAE,GAAG,EAAE,CAAC,SAAS;KAC1C,CAAC;AACJ,CAAC;AAED,6GAA6G;AAC7G,MAAM,UAAU,qBAAqB;IAInC,OAAO;QACL,iBAAiB,EAAE,GAAG,EAAE,CAAC,KAAK;QAC9B,qBAAqB,EAAE,GAAG,EAAE,GAAE,CAAC;QAC/B,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI;QAC3B,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC1C,gBAAgB,EAAE,GAAG,EAAE,CAAC,IAAI;KAC7B,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"completion-judge-stubs.js","sourceRoot":"","sources":["../../../src/testing/fixtures/completion-judge-stubs.ts"],"names":[],"mappings":"AAAA,8FAA8F;AAC9F,mFAAmF;AACnF,gFAAgF;AAChF,uEAAuE;AACvE,kEAAkE;AAClE,8FAA8F;AAC9F,4EAA4E;AAC5E,sFAAsF;AACtF,oFAAoF;AACpF,wDAAwD;AACxD,kEAAkE;AAClE,+DAA+D;AAC/D,6DAA6D;AAC7D,+DAA+D;AAC/D,8GAA8G;AAC9G,oEAAoE;AACpE,sEAAsE;AACtE,6DAA6D;AAC7D,gBAAgB;AAchB,+EAA+E;AAC/E,MAAM,UAAU,gBAAgB;IAC9B,OAAO;QACL,sBAAsB,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC9C,wBAAwB,EAAE,GAAG,EAAE,CAAC,SAAS;KAC1C,CAAC;AACJ,CAAC;AAED,6GAA6G;AAC7G,MAAM,UAAU,qBAAqB;IAInC,OAAO;QACL,iBAAiB,EAAE,GAAG,EAAE,CAAC,KAAK;QAC9B,qBAAqB,EAAE,GAAG,EAAE,GAAE,CAAC;QAC/B,eAAe,EAAE,GAAG,EAAE,CAAC,IAAI;QAC3B,aAAa,EAAE,GAAG,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,CAAC;QAC1C,gBAAgB,EAAE,GAAG,EAAE,CAAC,IAAI;KAC7B,CAAC;AACJ,CAAC"}
@@ -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: 350 tests -- run: npm run gen:pinned-by -- --list packages/daemon/src/testing/fixtures/index.ts
2
+ // Pinned by: 356 tests -- run: npm run gen:pinned-by -- --list packages/daemon/src/testing/fixtures/index.ts
3
3
  // PINNED-BY-END
4
4
  /**
5
5
  * Build an ActiveFocusRow (a getActiveFocuses row): an active, armed focus with
@@ -1 +1 @@
1
- {"version":3,"file":"pending-spawn-world.d.ts","sourceRoot":"","sources":["../../../src/testing/fixtures/pending-spawn-world.ts"],"names":[],"mappings":"AAsCA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iDAAiD,CAAC;AACnF,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6DAA6D,CAAC;AAOtG,4EAA4E;AAC5E,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,cAAc,CAAC;IACpB,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,mEAAmE;IACnE,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,+DAA+D;IAC/D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,YAAY,CAAC,EAAE,kBAAkB,GAAG,YAAY,CAAC;CAClD;AAED,kFAAkF;AAClF,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC;CACzC;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG;IACxD,kBAAkB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACtE,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;CAChE,CAWA;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,oBAAoB,CAgFhH;AAED,0FAA0F;AAC1F,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,CAgB5F"}
1
+ {"version":3,"file":"pending-spawn-world.d.ts","sourceRoot":"","sources":["../../../src/testing/fixtures/pending-spawn-world.ts"],"names":[],"mappings":"AAsCA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,0CAA0C,CAAC;AAC/E,OAAO,KAAK,EAAE,oBAAoB,EAAE,MAAM,wCAAwC,CAAC;AACnF,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,iDAAiD,CAAC;AACnF,OAAO,KAAK,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,sBAAsB,CAAC;AAC9E,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,6DAA6D,CAAC;AAOtG,4EAA4E;AAC5E,MAAM,WAAW,iBAAiB;IAChC,GAAG,EAAE,cAAc,CAAC;IACpB,UAAU,EAAE,iBAAiB,EAAE,CAAC;IAChC,MAAM,EAAE,cAAc,EAAE,CAAC;IACzB,mEAAmE;IACnE,mBAAmB,CAAC,EAAE,OAAO,CAAC;IAC9B,+DAA+D;IAC/D,eAAe,CAAC,EAAE,OAAO,CAAC;IAC1B;;;;OAIG;IACH,YAAY,CAAC,EAAE,kBAAkB,GAAG,YAAY,CAAC;CAClD;AAED,kFAAkF;AAClF,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,WAAW,EAAE,QAAQ,GAAG,QAAQ,GAAG,IAAI,CAAC;CACzC;AAED,6EAA6E;AAC7E,wBAAgB,cAAc,CAAC,KAAK,EAAE,iBAAiB,GAAG;IACxD,kBAAkB,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,iBAAiB,EAAE,CAAC,CAAC;IACtE,cAAc,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,OAAO,CAAC,cAAc,EAAE,CAAC,CAAC;CAChE,CAWA;AAED;;;;GAIG;AACH,wBAAgB,wBAAwB,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,aAAa,EAAE,GAAG,oBAAoB,CAiFhH;AAED,0FAA0F;AAC1F,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,iBAAiB,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,WAAW,CAgB5F"}
@@ -115,6 +115,7 @@ export function makePendingSpawnPassDeps(world, spawns) {
115
115
  clearReviewRequestedAt: async () => {
116
116
  world.row = { ...world.row, review_requested_at: null };
117
117
  },
118
+ adoptCaptureHead: () => ({ kind: 'unreadable', reason: 'the pending-spawn world has no git head' }),
118
119
  },
119
120
  verifyHold: {
120
121
  ...reads,
@@ -1 +1 @@
1
- {"version":3,"file":"pending-spawn-world.js","sourceRoot":"","sources":["../../../src/testing/fixtures/pending-spawn-world.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"pending-spawn-world.js","sourceRoot":"","sources":["../../../src/testing/fixtures/pending-spawn-world.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: 273 tests -- run: npm run gen:pinned-by -- --list packages/daemon/src/types/index.ts
2
+ // Pinned by: 276 tests -- run: npm run gen:pinned-by -- --list packages/daemon/src/types/index.ts
3
3
  // PINNED-BY-END
4
4
  /**
5
5
  * Domain-specific type re-exports.
@@ -0,0 +1,44 @@
1
+ /** The focus branch whose head a review would judge, and the repo its ref lives in (worktrees share it). */
2
+ export interface CaptureHeadTarget {
3
+ repoPath: string;
4
+ branchName: string | null;
5
+ }
6
+ /** What the adoption found at the focus head, and did. */
7
+ export type CaptureHeadAdoption =
8
+ /** The head is not a daemon capture: nothing to adopt, review may judge it. */
9
+ {
10
+ kind: 'not_capture';
11
+ headSha: string;
12
+ }
13
+ /** The head was a capture; `adoptedSha` (the new head) commits it as the team's own. */
14
+ | {
15
+ kind: 'adopted';
16
+ captureSha: string;
17
+ adoptedSha: string;
18
+ trailerValue: string;
19
+ }
20
+ /** The head is a capture and could not be adopted (or the branch moved meanwhile); retried next read. */
21
+ | {
22
+ kind: 'failed';
23
+ captureSha: string;
24
+ reason: string;
25
+ }
26
+ /** The head could not be read. */
27
+ | {
28
+ kind: 'unreadable';
29
+ reason: string;
30
+ };
31
+ /** Subject prefix of an adoption commit -- deliberately not a capture subject. */
32
+ export declare const CAPTURE_ADOPTION_SUBJECT_PREFIX = "chore: adopt captured agent work as the team's own commit (";
33
+ /** The adoption commit's message, as commit-tree `-m` paragraphs (the last one is the trailer block). */
34
+ export declare function captureAdoptionMessage(capture: {
35
+ sha: string;
36
+ subject: string;
37
+ }, trailerValue: string): string[];
38
+ /**
39
+ * Adopt the focus head when it is a daemon capture (module doc). Never throws:
40
+ * an unreadable head, a failed commit or a branch that moved meanwhile is
41
+ * reported, and the next read retries against whatever the head is then.
42
+ */
43
+ export declare function adoptCaptureHead(target: CaptureHeadTarget): CaptureHeadAdoption;
44
+ //# sourceMappingURL=capture-head-adoption.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture-head-adoption.d.ts","sourceRoot":"","sources":["../../src/worktree/capture-head-adoption.ts"],"names":[],"mappings":"AAwCA,4GAA4G;AAC5G,MAAM,WAAW,iBAAiB;IAChC,QAAQ,EAAE,MAAM,CAAC;IACjB,UAAU,EAAE,MAAM,GAAG,IAAI,CAAC;CAC3B;AAED,0DAA0D;AAC1D,MAAM,MAAM,mBAAmB;AAC7B,+EAA+E;AAC7E;IAAE,IAAI,EAAE,aAAa,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE;AAC1C,wFAAwF;GACtF;IAAE,IAAI,EAAE,SAAS,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAA;CAAE;AACnF,yGAAyG;GACvG;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE;AACxD,kCAAkC;GAChC;IAAE,IAAI,EAAE,YAAY,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAE3C,kFAAkF;AAClF,eAAO,MAAM,+BAA+B,gEAAiE,CAAC;AAmB9G,yGAAyG;AACzG,wBAAgB,sBAAsB,CAAC,OAAO,EAAE;IAAE,GAAG,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAA;CAAE,EAAE,YAAY,EAAE,MAAM,GAAG,MAAM,EAAE,CAShH;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,iBAAiB,GAAG,mBAAmB,CAsB/E"}
@@ -0,0 +1,96 @@
1
+ // PINNED-BY-BEGIN (generated by gen:pinned-by -- do not hand-edit; checked by lint:pinned-by)
2
+ // Pinned by: packages/daemon/src/completion/state-cascade/review-capture-head-gate.test.ts,
3
+ // packages/daemon/src/focus/pending-review-capture-head.test.ts,
4
+ // packages/daemon/src/integration/capture-head-review-regression.test.ts,
5
+ // packages/daemon/src/integration/commits-after-approval-review-regression.test.ts,
6
+ // packages/daemon/src/integration/fully-merged-focus-sibling-red-scenario.test.ts,
7
+ // packages/daemon/src/worktree/capture-head-adoption.test.ts
8
+ // PINNED-BY-END
9
+ /**
10
+ * A focus review never judges a daemon WIP capture: before a review window opens
11
+ * or a review spawns, a focus head that is a daemon capture of uncommitted agent
12
+ * work is ADOPTED as the team's own commit, and the review judges that commit.
13
+ *
14
+ * Why: the completion merge gate never lets a capture anchor its own approval
15
+ * (merge/merge-gate-coverage.ts anchorGates), and review runs once per focus head
16
+ * (focus/pending-review-approved-head.ts), so a review that approved a capture
17
+ * head left a finished focus held off integration with no step that advances it.
18
+ * The fix is at the source: the head a review judges is never a capture.
19
+ * History: docs/daemon/history-platform.md (worktree/capture-head-adoption.ts).
20
+ *
21
+ * The adoption is the daemon committing on the team's behalf, append-only: a new
22
+ * commit on top of the capture with the capture's tree (it changes no file), a
23
+ * subject that is not a capture subject, and the capture's Telora-Delivery
24
+ * trailer -- its delivery's id, or `none` when the capture names no delivery (the
25
+ * adoption itself carries no work, and an `unattributed` stamp would be named as
26
+ * misattributed work). History is never rewritten: verdicts, attribution and
27
+ * holds are keyed on commit shas. The branch moves by a compare-and-swap ref
28
+ * update, so a commit that landed meanwhile is never overwritten. Plumbing
29
+ * (commit-tree + update-ref) runs no hooks and touches no worktree: a worktree on
30
+ * the branch follows it to a commit with the same tree, so its index and files
31
+ * stay exactly as they were.
32
+ *
33
+ * @module worktree/capture-head-adoption
34
+ */
35
+ import { runGitSync } from '../git/types.js';
36
+ import { classifyDeliveryTrailer, DELIVERY_TRAILER_KEY, NON_DELIVERY_SENTINEL } from '../git/delivery-trailer.js';
37
+ import { isDaemonWipCapture } from './safety.js';
38
+ /** Subject prefix of an adoption commit -- deliberately not a capture subject. */
39
+ export const CAPTURE_ADOPTION_SUBJECT_PREFIX = 'chore: adopt captured agent work as the team\'s own commit (';
40
+ const SHA_RE = /^[0-9a-f]{40,64}$/i;
41
+ const FIELD_SEP = '\x1f';
42
+ /** The head commit of `ref`, or why it could not be read. */
43
+ function readHead(repoPath, ref) {
44
+ const result = runGitSync(['log', '-1', `--format=%H${FIELD_SEP}%s`, ref, '--'], repoPath);
45
+ if (!result.success)
46
+ return { reason: `git log ${ref} failed: ${result.error || result.output}` };
47
+ const [sha = '', ...subject] = result.output.trim().split(FIELD_SEP);
48
+ return SHA_RE.test(sha) ? { sha, subject: subject.join(FIELD_SEP) } : { reason: `${ref} has no readable head` };
49
+ }
50
+ /** The trailer an adoption carries: the capture's delivery, else the non-delivery sentinel (module doc). */
51
+ function adoptionTrailerValue(repoPath, captureSha) {
52
+ const attribution = classifyDeliveryTrailer(repoPath, captureSha);
53
+ return attribution.kind === 'delivery' ? attribution.deliveryId : NON_DELIVERY_SENTINEL;
54
+ }
55
+ /** The adoption commit's message, as commit-tree `-m` paragraphs (the last one is the trailer block). */
56
+ export function captureAdoptionMessage(capture, trailerValue) {
57
+ return [
58
+ `${CAPTURE_ADOPTION_SUBJECT_PREFIX}${capture.sha.slice(0, 12)})`,
59
+ `The daemon captured this focus's uncommitted agent work as ${capture.sha.slice(0, 12)} ` +
60
+ `("${capture.subject}"). A focus review never judges a daemon capture: the completion merge gate ` +
61
+ `never lets a capture anchor its own approval. This commit adopts that work as the team's own, so ` +
62
+ `the review judges a commit the merge gate accepts. It changes no files.`,
63
+ `${DELIVERY_TRAILER_KEY}: ${trailerValue}`,
64
+ ];
65
+ }
66
+ /**
67
+ * Adopt the focus head when it is a daemon capture (module doc). Never throws:
68
+ * an unreadable head, a failed commit or a branch that moved meanwhile is
69
+ * reported, and the next read retries against whatever the head is then.
70
+ */
71
+ export function adoptCaptureHead(target) {
72
+ if (!target.branchName)
73
+ return { kind: 'unreadable', reason: 'the focus has no branch' };
74
+ const ref = `refs/heads/${target.branchName}`;
75
+ const head = readHead(target.repoPath, ref);
76
+ if ('reason' in head)
77
+ return { kind: 'unreadable', reason: head.reason };
78
+ if (!isDaemonWipCapture(head))
79
+ return { kind: 'not_capture', headSha: head.sha };
80
+ const trailerValue = adoptionTrailerValue(target.repoPath, head.sha);
81
+ const paragraphs = captureAdoptionMessage(head, trailerValue).flatMap((p) => ['-m', p]);
82
+ const commit = runGitSync(['commit-tree', `${head.sha}^{tree}`, '-p', head.sha, ...paragraphs], target.repoPath);
83
+ const adoptedSha = commit.output.trim();
84
+ if (!commit.success || !SHA_RE.test(adoptedSha)) {
85
+ return { kind: 'failed', captureSha: head.sha, reason: `git commit-tree failed: ${commit.error || commit.output}` };
86
+ }
87
+ // Compare-and-swap: moves the branch only if its head is still the capture. The
88
+ // reflog step reads as a commit, so git/focus-own-delta.ts counts it as the focus's own.
89
+ const reflog = `commit: adopt daemon capture ${head.sha.slice(0, 12)} as the team's own (telora-daemon)`;
90
+ const moved = runGitSync(['update-ref', '-m', reflog, ref, adoptedSha, head.sha], target.repoPath);
91
+ if (!moved.success) {
92
+ return { kind: 'failed', captureSha: head.sha, reason: `${ref} moved or could not be updated: ${moved.error || moved.output}` };
93
+ }
94
+ return { kind: 'adopted', captureSha: head.sha, adoptedSha, trailerValue };
95
+ }
96
+ //# sourceMappingURL=capture-head-adoption.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"capture-head-adoption.js","sourceRoot":"","sources":["../../src/worktree/capture-head-adoption.ts"],"names":[],"mappings":"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"}
@@ -29,12 +29,21 @@ export declare function branchHasUnmergedCommits(branchName: string, targetBranc
29
29
  /**
30
30
  * Subject prefixes of the two commits the daemon writes to capture an agent's
31
31
  * uncommitted work: commitWipChanges (team exit) and safetyCommitWorktree
32
- * (worktree removal, terminated-team reconcile). The merge gate recognizes a
33
- * daemon capture by these (merge/merge-gate-coverage.ts), so the writers build
34
- * their subjects from the same constants.
32
+ * (worktree removal, terminated-team reconcile). A daemon capture is recognized
33
+ * by these (isDaemonWipCapture), so the writers build their subjects from the
34
+ * same constants.
35
35
  */
36
36
  export declare const WIP_CAPTURE_SUBJECT_PREFIX = "WIP: Uncommitted work captured by daemon on agent exit (";
37
37
  export declare const SAFETY_COMMIT_SUBJECT_PREFIX = "wip: uncommitted agent work for \"";
38
+ /**
39
+ * True for a commit the daemon wrote to capture an agent's uncommitted work (a
40
+ * commitWipChanges or safetyCommitWorktree subject). The ONE recognizer: the merge
41
+ * gate's capture rule (merge/merge-gate-coverage.ts) and the review's capture-head
42
+ * adoption (worktree/capture-head-adoption.ts) both read it. Pure.
43
+ */
44
+ export declare function isDaemonWipCapture(commit: {
45
+ readonly subject: string;
46
+ }): boolean;
38
47
  /** The subject commitWipChanges writes for `contextName`. */
39
48
  export declare function wipCaptureSubject(contextName: string): string;
40
49
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../src/worktree/safety.ts"],"names":[],"mappings":"AA0BA,OAAO,EAIL,KAAK,sBAAsB,EAC5B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,0BAA0B,EAChC,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,kCAAkC,CAAC;AAEtF;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,gBAAgB,EAAE,sBAAsB,CAAC;IAClD,QAAQ,CAAC,kBAAkB,EAAE,6BAA6B,CAAC;IAC3D,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,0BAA0B,EAAE,gBAAgB,CAAC,CAAC;CAC9E;AAMD;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAa3E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,OAAO,CAMT;AAED;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,6DAA6D,CAAC;AACrG,eAAO,MAAM,4BAA4B,uCAAsC,CAAC;AAEhF,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,sBAAsB,EACjC,WAAW,CAAC,EAAE,uBAAuB,GACpC,MAAM,GAAG,IAAI,CAaf;AAED;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,EAAE,SAAS,MAAM,EAMzD,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,qCAAqC,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAOnF;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,sBAAsB,GAChC,MAAM,GAAG,IAAI,CAUf;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iEAAiE;IACjE,SAAS,EAAE,sBAAsB,CAAC;IAClC,4EAA4E;IAC5E,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,GACA,OAAO,CAoFT;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,sBAAsB,EACjC,WAAW,CAAC,EAAE,uBAAuB,GACpC,MAAM,GAAG,IAAI,CASf"}
1
+ {"version":3,"file":"safety.d.ts","sourceRoot":"","sources":["../../src/worktree/safety.ts"],"names":[],"mappings":"AA6BA,OAAO,EAIL,KAAK,sBAAsB,EAC5B,MAAM,oBAAoB,CAAC;AAG5B,OAAO,EAEL,KAAK,uBAAuB,EAC5B,KAAK,0BAA0B,EAChC,MAAM,+BAA+B,CAAC;AACvC,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,kCAAkC,CAAC;AAEtF;;;;;GAKG;AACH,MAAM,WAAW,mBAAmB;IAClC,QAAQ,CAAC,gBAAgB,EAAE,sBAAsB,CAAC;IAClD,QAAQ,CAAC,kBAAkB,EAAE,6BAA6B,CAAC;IAC3D,QAAQ,CAAC,eAAe,EAAE,IAAI,CAAC,0BAA0B,EAAE,gBAAgB,CAAC,CAAC;CAC9E;AAMD;;;;;;;;GAQG;AACH,wBAAgB,6BAA6B,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAa3E;AAED;;GAEG;AACH,wBAAgB,wBAAwB,CACtC,UAAU,EAAE,MAAM,EAClB,YAAY,EAAE,MAAM,EACpB,QAAQ,EAAE,MAAM,GACf,OAAO,CAMT;AAED;;;;;;GAMG;AACH,eAAO,MAAM,0BAA0B,6DAA6D,CAAC;AACrG,eAAO,MAAM,4BAA4B,uCAAsC,CAAC;AAEhF;;;;;GAKG;AACH,wBAAgB,kBAAkB,CAAC,MAAM,EAAE;IAAE,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAA;CAAE,GAAG,OAAO,CAEhF;AAED,6DAA6D;AAC7D,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,MAAM,CAE7D;AAED;;;GAGG;AACH,wBAAgB,oBAAoB,CAClC,YAAY,EAAE,MAAM,EACpB,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,sBAAsB,EACjC,WAAW,CAAC,EAAE,uBAAuB,GACpC,MAAM,GAAG,IAAI,CAaf;AAED;;;;;;GAMG;AACH,eAAO,MAAM,4BAA4B,EAAE,SAAS,MAAM,EAMzD,CAAC;AAEF;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,wBAAgB,qCAAqC,CAAC,YAAY,EAAE,MAAM,GAAG,OAAO,CAOnF;AAED;;;;;;;GAOG;AACH,wBAAgB,wBAAwB,CACtC,YAAY,EAAE,MAAM,EACpB,SAAS,EAAE,sBAAsB,GAChC,MAAM,GAAG,IAAI,CAUf;AAED;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,MAAM,EAChB,YAAY,EAAE,MAAM,EACpB,OAAO,EAAE;IACP,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAC3B,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,iEAAiE;IACjE,SAAS,EAAE,sBAAsB,CAAC;IAClC,4EAA4E;IAC5E,WAAW,CAAC,EAAE,uBAAuB,CAAC;CACvC,GACA,OAAO,CAoFT;AAED;;;;;;;;;;;;;;;;;;GAkBG;AACH,wBAAgB,gBAAgB,CAC9B,YAAY,EAAE,MAAM,EACpB,WAAW,EAAE,MAAM,EACnB,SAAS,EAAE,sBAAsB,EACjC,WAAW,CAAC,EAAE,uBAAuB,GACpC,MAAM,GAAG,IAAI,CASf"}
@@ -1,13 +1,16 @@
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/completion/team-teardown/mid-flight-merge-gate.test.ts,
4
+ // packages/daemon/src/focus/pending-review-capture-head.test.ts,
4
5
  // packages/daemon/src/integration/approved-head-hold-release-completion-regression.test.ts,
6
+ // packages/daemon/src/integration/capture-head-review-regression.test.ts,
5
7
  // packages/daemon/src/merge/attributed-capture-merge-gate.test.ts,
6
8
  // packages/daemon/src/merge/completion-merge-gate.test.ts,
7
9
  // packages/daemon/src/merge/merge-gate-coverage.test.ts,
8
10
  // packages/daemon/src/merge/safe-remove-merge-gate.test.ts,
9
11
  // packages/daemon/src/verify/attribution/exit-capture-attribution-regression.test.ts,
10
12
  // packages/daemon/src/worktree/capture-attribution-commit.test.ts,
13
+ // packages/daemon/src/worktree/capture-head-adoption.test.ts,
11
14
  // packages/daemon/src/worktree/safety-commit-guard.test.ts,
12
15
  // packages/daemon/src/worktree/safety-commit-under-guard.test.ts,
13
16
  // packages/daemon/src/worktree/unmerged-capture-refusal.test.ts,
@@ -60,12 +63,21 @@ export function branchHasUnmergedCommits(branchName, targetBranch, repoPath) {
60
63
  /**
61
64
  * Subject prefixes of the two commits the daemon writes to capture an agent's
62
65
  * uncommitted work: commitWipChanges (team exit) and safetyCommitWorktree
63
- * (worktree removal, terminated-team reconcile). The merge gate recognizes a
64
- * daemon capture by these (merge/merge-gate-coverage.ts), so the writers build
65
- * their subjects from the same constants.
66
+ * (worktree removal, terminated-team reconcile). A daemon capture is recognized
67
+ * by these (isDaemonWipCapture), so the writers build their subjects from the
68
+ * same constants.
66
69
  */
67
70
  export const WIP_CAPTURE_SUBJECT_PREFIX = 'WIP: Uncommitted work captured by daemon on agent exit (';
68
71
  export const SAFETY_COMMIT_SUBJECT_PREFIX = 'wip: uncommitted agent work for "';
72
+ /**
73
+ * True for a commit the daemon wrote to capture an agent's uncommitted work (a
74
+ * commitWipChanges or safetyCommitWorktree subject). The ONE recognizer: the merge
75
+ * gate's capture rule (merge/merge-gate-coverage.ts) and the review's capture-head
76
+ * adoption (worktree/capture-head-adoption.ts) both read it. Pure.
77
+ */
78
+ export function isDaemonWipCapture(commit) {
79
+ return commit.subject.startsWith(WIP_CAPTURE_SUBJECT_PREFIX) || commit.subject.startsWith(SAFETY_COMMIT_SUBJECT_PREFIX);
80
+ }
69
81
  /** The subject commitWipChanges writes for `contextName`. */
70
82
  export function wipCaptureSubject(contextName) {
71
83
  return `${WIP_CAPTURE_SUBJECT_PREFIX}${contextName})`;