@telora/daemon 0.20.78 → 0.20.89
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/ai-inspection-context.d.ts.map +1 -1
- package/dist/ai-inspection-context.js +4 -2
- package/dist/ai-inspection-context.js.map +1 -1
- package/dist/audit-prompt.d.ts.map +1 -1
- package/dist/audit-prompt.js +9 -5
- package/dist/audit-prompt.js.map +1 -1
- package/dist/completion/completion-decision.d.ts +3 -29
- package/dist/completion/completion-decision.d.ts.map +1 -1
- package/dist/completion/completion-decision.js +3 -15
- package/dist/completion/completion-decision.js.map +1 -1
- package/dist/completion/event-phases.d.ts +0 -8
- package/dist/completion/event-phases.d.ts.map +1 -1
- package/dist/completion/event-phases.js +4 -52
- package/dist/completion/event-phases.js.map +1 -1
- package/dist/completion/event.d.ts +1 -11
- package/dist/completion/event.d.ts.map +1 -1
- package/dist/completion/event.js +1 -3
- package/dist/completion/event.js.map +1 -1
- package/dist/delivery-artifacts.d.ts.map +1 -1
- package/dist/delivery-artifacts.js +9 -8
- package/dist/delivery-artifacts.js.map +1 -1
- package/dist/prompt-sections/execution-sections.d.ts.map +1 -1
- package/dist/prompt-sections/execution-sections.js +44 -3
- package/dist/prompt-sections/execution-sections.js.map +1 -1
- package/dist/prompt-sections/scoping-sections.d.ts.map +1 -1
- package/dist/prompt-sections/scoping-sections.js +8 -0
- package/dist/prompt-sections/scoping-sections.js.map +1 -1
- package/dist/queries/deliveries.d.ts +20 -153
- package/dist/queries/deliveries.d.ts.map +1 -1
- package/dist/queries/deliveries.js +26 -0
- package/dist/queries/deliveries.js.map +1 -1
- package/dist/queries/delivery-gate-state.d.ts +192 -0
- package/dist/queries/delivery-gate-state.d.ts.map +1 -0
- package/dist/queries/delivery-gate-state.js +23 -0
- package/dist/queries/delivery-gate-state.js.map +1 -0
- package/dist/queries/holds.d.ts +52 -59
- package/dist/queries/holds.d.ts.map +1 -1
- package/dist/queries/holds.js +60 -68
- package/dist/queries/holds.js.map +1 -1
- package/dist/queries/issues.d.ts +2 -2
- package/dist/queries/issues.d.ts.map +1 -1
- package/dist/queries/issues.js +2 -2
- package/dist/queries/issues.js.map +1 -1
- package/dist/reality-pole.d.ts +5 -3
- package/dist/reality-pole.d.ts.map +1 -1
- package/dist/reality-pole.js +13 -4
- package/dist/reality-pole.js.map +1 -1
- package/dist/resolvers/git-diff-against-base.d.ts.map +1 -1
- package/dist/resolvers/git-diff-against-base.js +12 -5
- package/dist/resolvers/git-diff-against-base.js.map +1 -1
- package/dist/resolvers/index.d.ts +1 -1
- package/dist/resolvers/index.d.ts.map +1 -1
- package/dist/resolvers/index.js +1 -1
- package/dist/resolvers/index.js.map +1 -1
- package/dist/resolvers/shared/git-diff.d.ts +147 -26
- package/dist/resolvers/shared/git-diff.d.ts.map +1 -1
- package/dist/resolvers/shared/git-diff.js +275 -35
- package/dist/resolvers/shared/git-diff.js.map +1 -1
- package/dist/templates/claude-md.d.ts +1 -1
- package/dist/templates/claude-md.d.ts.map +1 -1
- package/dist/templates/claude-md.js +20 -0
- package/dist/templates/claude-md.js.map +1 -1
- package/dist/verification-deps.d.ts +151 -0
- package/dist/verification-deps.d.ts.map +1 -0
- package/dist/verification-deps.js +19 -0
- package/dist/verification-deps.js.map +1 -0
- package/dist/verification-engine.d.ts +10 -112
- package/dist/verification-engine.d.ts.map +1 -1
- package/dist/verification-engine.js +84 -30
- package/dist/verification-engine.js.map +1 -1
- package/dist/verification-evidence.d.ts +33 -1
- package/dist/verification-evidence.d.ts.map +1 -1
- package/dist/verification-evidence.js +55 -13
- package/dist/verification-evidence.js.map +1 -1
- package/dist/verification-feedback.d.ts +31 -27
- package/dist/verification-feedback.d.ts.map +1 -1
- package/dist/verification-feedback.js +76 -85
- package/dist/verification-feedback.js.map +1 -1
- package/dist/verify-restatement.d.ts +12 -9
- package/dist/verify-restatement.d.ts.map +1 -1
- package/dist/verify-restatement.js +11 -9
- package/dist/verify-restatement.js.map +1 -1
- package/package.json +1 -1
|
@@ -116,62 +116,302 @@ export function findDeliveryMergeCommit(worktreePath, baseBranch) {
|
|
|
116
116
|
}
|
|
117
117
|
}
|
|
118
118
|
/**
|
|
119
|
-
* Verify a commit sha exists locally
|
|
120
|
-
* range that recovers
|
|
121
|
-
* (`<sha>^1...<sha>`).
|
|
122
|
-
*
|
|
123
|
-
*
|
|
119
|
+
* Verify a commit sha exists locally AND is a real MERGE commit (>= 2 parents),
|
|
120
|
+
* and if so return the first-parent diff range that recovers its second-parent
|
|
121
|
+
* contribution (`<sha>^1...<sha>`).
|
|
122
|
+
*
|
|
123
|
+
* Returns null when the sha is empty, malformed, not present in the repo (e.g.
|
|
124
|
+
* not yet fetched), OR has fewer than two parents. That last guard is
|
|
125
|
+
* load-bearing: the recorded merge_commit_sha was observed to be
|
|
126
|
+
* HEAD-at-stamp-time -- an ordinary sequential commit shared across several
|
|
127
|
+
* deliveries, NOT a per-delivery merge (and a FAST-FORWARDED merge-back leaves
|
|
128
|
+
* no merge commit at all). On such a sha `<sha>^1...<sha>` is that ONE commit's
|
|
129
|
+
* own diff -- WRONG attribution masquerading as a verdict, not the delivery's
|
|
130
|
+
* contribution. `^1...` only recovers a delivery's contribution when `<sha>` is
|
|
131
|
+
* a genuine merge whose non-first parent is the merged-in tip. Refusing it here
|
|
132
|
+
* makes the caller fall through to the recorded-commit-set range
|
|
133
|
+
* (resolveRecordedCommitRange) or live topology instead of judging a whole
|
|
134
|
+
* focus against a single trailing commit.
|
|
124
135
|
*/
|
|
125
136
|
export function resolveRecordedMergeRange(worktreePath, mergeCommitSha) {
|
|
126
137
|
const sha = (mergeCommitSha ?? '').trim();
|
|
127
138
|
if (sha === '')
|
|
128
139
|
return null;
|
|
140
|
+
let parentCount;
|
|
129
141
|
try {
|
|
130
|
-
// `--
|
|
131
|
-
|
|
142
|
+
// `--parents -n 1 <sha>^{commit}` confirms the object exists AND is a
|
|
143
|
+
// commit, and yields `<sha> <parent1> [<parent2> ...]` in one call.
|
|
144
|
+
const out = execSync(`git rev-list --parents -n 1 ${sha}^{commit}`, {
|
|
132
145
|
cwd: worktreePath, maxBuffer: 1024 * 1024, encoding: 'utf-8',
|
|
133
146
|
});
|
|
147
|
+
const parts = out.trim().split(/\s+/).filter((p) => p !== '');
|
|
148
|
+
parentCount = Math.max(0, parts.length - 1); // first token is the commit itself
|
|
134
149
|
}
|
|
135
150
|
catch {
|
|
136
151
|
return null;
|
|
137
152
|
}
|
|
153
|
+
if (parentCount < 2)
|
|
154
|
+
return null; // not a merge commit -> `^1...` is meaningless
|
|
138
155
|
return `${sha}^1...${sha}`;
|
|
139
156
|
}
|
|
140
157
|
/**
|
|
141
|
-
*
|
|
142
|
-
*
|
|
158
|
+
* Derive a diff range from a delivery's RECORDED constituent commit set
|
|
159
|
+
* (focus_merges.commit_shas -- the durable record the daemon writes at merge
|
|
160
|
+
* time via extractConstituentCommits/recordFocusMerge). The set is authored by
|
|
161
|
+
* `git log --format=%H <preMergeRef>..<branch>`, so it is newest-first and
|
|
162
|
+
* forms a contiguous first-parent chain for the ff / no-ff merge-back
|
|
163
|
+
* strategies the daemon uses. The range is `<oldest>^1...<newest>` -- the whole
|
|
164
|
+
* recorded set diffed against the commit just before it.
|
|
165
|
+
*
|
|
166
|
+
* Both boundaries (and the parent of the oldest) are verified reachable in the
|
|
167
|
+
* worktree; returns null when the set is empty or a boundary is absent (e.g. a
|
|
168
|
+
* --squash merge rewrote history, breaking the recorded shas' reachability, or
|
|
169
|
+
* the oldest commit is a root with no parent) so the caller falls through to
|
|
170
|
+
* its live-topology sources. This is the record-sourced path that survives a
|
|
171
|
+
* FAST-FORWARD (no merge marker to search for) and a REBASE (merge-base moved),
|
|
172
|
+
* both of which corrupt a topology-derived range.
|
|
173
|
+
*/
|
|
174
|
+
export function resolveRecordedCommitRange(worktreePath, commitShas) {
|
|
175
|
+
const shas = (commitShas ?? []).map((s) => s.trim()).filter((s) => s !== '');
|
|
176
|
+
if (shas.length === 0)
|
|
177
|
+
return null;
|
|
178
|
+
const newest = shas[0];
|
|
179
|
+
const oldest = shas[shas.length - 1];
|
|
180
|
+
try {
|
|
181
|
+
for (const ref of [`${newest}^{commit}`, `${oldest}^{commit}`, `${oldest}^1^{commit}`]) {
|
|
182
|
+
execSync(`git rev-parse --verify --quiet ${ref}`, {
|
|
183
|
+
cwd: worktreePath, maxBuffer: 1024 * 1024, encoding: 'utf-8',
|
|
184
|
+
});
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
catch {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
return `${oldest}^1...${newest}`;
|
|
191
|
+
}
|
|
192
|
+
/**
|
|
193
|
+
* The git trailer key that attributes a commit to the delivery whose work it is.
|
|
194
|
+
* Stamped by agents at commit time (see execution-sections / the agent CLAUDE.md
|
|
195
|
+
* template). The value is the delivery UUID. The trailer travels with the commit
|
|
196
|
+
* object, so it survives fast-forward and rebase exactly like the recorded commit
|
|
197
|
+
* set -- reading it is reading a durable fact, not re-deriving from branch topology.
|
|
198
|
+
*/
|
|
199
|
+
export const DELIVERY_TRAILER_KEY = 'Telora-Delivery';
|
|
200
|
+
/**
|
|
201
|
+
* Read the `Telora-Delivery` trailer of a single commit. Returns the trimmed
|
|
202
|
+
* delivery id, or '' when the commit carries no such trailer (a merge-back / daemon
|
|
203
|
+
* commit, or an agent commit made before the convention). Empty on any git failure.
|
|
204
|
+
*/
|
|
205
|
+
export function readDeliveryTrailer(worktreePath, sha) {
|
|
206
|
+
const clean = (sha ?? '').trim();
|
|
207
|
+
if (clean === '')
|
|
208
|
+
return '';
|
|
209
|
+
try {
|
|
210
|
+
// Single-quote the format: the `%(...)` parentheses are shell metacharacters.
|
|
211
|
+
const out = execSync(`git show -s '--format=%(trailers:key=${DELIVERY_TRAILER_KEY},valueonly)' ${clean}^{commit}`, { cwd: worktreePath, maxBuffer: 1024 * 1024, encoding: 'utf-8' });
|
|
212
|
+
// A commit can in principle carry several trailer lines; take the first
|
|
213
|
+
// non-empty value -- attribution is single-delivery by construction.
|
|
214
|
+
return out.split('\n').map((l) => l.trim()).find((l) => l !== '') ?? '';
|
|
215
|
+
}
|
|
216
|
+
catch {
|
|
217
|
+
return '';
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* Partition a RECORDED batch commit set (focus_merges.commit_shas, which spans
|
|
222
|
+
* every delivery merged together) down to the commits attributable to ONE
|
|
223
|
+
* delivery, using each commit's `Telora-Delivery` trailer.
|
|
224
|
+
*
|
|
225
|
+
* This is what gives a delivery merged alongside siblings its OWN commits instead
|
|
226
|
+
* of the batch's combined set: the trailer is the per-commit fact that a shared
|
|
227
|
+
* focus branch's interleaved commits cannot otherwise be partitioned by.
|
|
228
|
+
*
|
|
229
|
+
* GRACEFUL FALLBACK: when NO commit in the set carries a Telora-Delivery trailer
|
|
230
|
+
* (a legacy / pre-convention batch), the set cannot be partitioned, so the whole
|
|
231
|
+
* set is returned unchanged -- exactly today's behavior, no regression. When ANY
|
|
232
|
+
* commit is trailered, the set IS partitionable and only this delivery's commits
|
|
233
|
+
* are returned; untrailered commits (merge-back / daemon) fall out naturally, and
|
|
234
|
+
* a delivery with no trailered commits of its own correctly resolves to an empty
|
|
235
|
+
* set (which the completeness gate then treats as nothing-to-measure).
|
|
236
|
+
*
|
|
237
|
+
* Order is preserved (newest-first), so the result still forms the contiguous
|
|
238
|
+
* chain resolveRecordedCommitRange expects.
|
|
239
|
+
*/
|
|
240
|
+
export function filterCommitsByDelivery(worktreePath, commitShas, deliveryId) {
|
|
241
|
+
const shas = (commitShas ?? []).map((s) => s.trim()).filter((s) => s !== '');
|
|
242
|
+
if (shas.length === 0)
|
|
243
|
+
return [];
|
|
244
|
+
const wanted = (deliveryId ?? '').trim();
|
|
245
|
+
const trailers = shas.map((sha) => ({ sha, delivery: readDeliveryTrailer(worktreePath, sha) }));
|
|
246
|
+
const anyTrailered = trailers.some((t) => t.delivery !== '');
|
|
247
|
+
if (!anyTrailered)
|
|
248
|
+
return shas; // un-partitionable legacy batch -> preserve current behavior
|
|
249
|
+
if (wanted === '')
|
|
250
|
+
return shas; // no delivery to filter by -> do not silently drop work
|
|
251
|
+
return trailers.filter((t) => t.delivery === wanted).map((t) => t.sha);
|
|
252
|
+
}
|
|
253
|
+
/**
|
|
254
|
+
* The commit SHAs contained in a diff range (`git rev-list <range>`). Empty on
|
|
255
|
+
* failure. Used by the verify COMPLETENESS check to prove the resolved range
|
|
256
|
+
* actually covers a delivery's recorded commits before rendering a verdict.
|
|
257
|
+
*/
|
|
258
|
+
export function listRangeCommits(worktreePath, range) {
|
|
259
|
+
try {
|
|
260
|
+
const out = execSync(`git rev-list ${range}`, { cwd: worktreePath, maxBuffer: 10 * 1024 * 1024, encoding: 'utf-8' });
|
|
261
|
+
return out.split('\n').map((l) => l.trim()).filter((l) => l !== '');
|
|
262
|
+
}
|
|
263
|
+
catch {
|
|
264
|
+
return [];
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
/** Confirm a sha names a commit that exists locally. */
|
|
268
|
+
function commitExists(worktreePath, sha) {
|
|
269
|
+
const clean = (sha ?? '').trim();
|
|
270
|
+
if (clean === '')
|
|
271
|
+
return false;
|
|
272
|
+
try {
|
|
273
|
+
execSync(`git rev-parse --verify --quiet ${clean}^{commit}`, {
|
|
274
|
+
cwd: worktreePath, maxBuffer: 1024 * 1024, encoding: 'utf-8',
|
|
275
|
+
});
|
|
276
|
+
return true;
|
|
277
|
+
}
|
|
278
|
+
catch {
|
|
279
|
+
return false;
|
|
280
|
+
}
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* True when `span` (a `<oldest>^1...<newest>` range) contains EXACTLY the recorded
|
|
284
|
+
* set -- no interleaved foreign commits. When true the cheap span is exact; when
|
|
285
|
+
* false a sibling's commits sit between the endpoints and the set must be diffed
|
|
286
|
+
* commit-by-commit. `shas` is the delivery's own (already trailer-filtered) set.
|
|
287
|
+
*/
|
|
288
|
+
function spanCoversRecordedExactly(worktreePath, span, shas) {
|
|
289
|
+
const inSpan = new Set(listRangeCommits(worktreePath, span));
|
|
290
|
+
return inSpan.size === shas.length && shas.every((s) => inSpan.has(s));
|
|
291
|
+
}
|
|
292
|
+
/**
|
|
293
|
+
* Resolve HOW to produce a delivery's evidence, sourced from the DURABLE recorded
|
|
294
|
+
* attribution first and live branch topology only as a fallback (defects #2/#3).
|
|
295
|
+
* Order:
|
|
296
|
+
*
|
|
297
|
+
* 1. RECORDED commit set present, CONTIGUOUS -> `{range: <oldest>^1...<newest>}`
|
|
298
|
+
* from focus_merges.commit_shas (the delivery's own, trailer-filtered set) --
|
|
299
|
+
* the exact record written at merge time, immune to fast-forward and rebase.
|
|
300
|
+
* 1b. RECORDED commit set present, INTERLEAVED with a sibling's commits, OR its
|
|
301
|
+
* span boundary is unreachable (e.g. --squash rewrote history) but the
|
|
302
|
+
* commits themselves survive -> `{commits}` (diffed one by one, so the span
|
|
303
|
+
* never re-absorbs a sibling that sits between the endpoints).
|
|
304
|
+
* 2. RECORDED merge commit present -> `{range: <sha>^1...<sha>}`, ONLY for a real
|
|
305
|
+
* >=2-parent merge (single-parent ff commits are refused -- see
|
|
306
|
+
* resolveRecordedMergeRange).
|
|
307
|
+
* 3. branch AHEAD of base -> `{range: base...HEAD}` (an unmerged branch has no
|
|
308
|
+
* focus_merges row; topology is correct and byte-identical to the old path).
|
|
309
|
+
* 4. branch LEVEL/BEHIND after merge -> `{range: <merge>^1...<merge>}` (searched
|
|
310
|
+
* merge commit -- last-ditch when nothing was recorded).
|
|
311
|
+
* 5. no attributable commits -> null (caller yields empty; instrument-fault path).
|
|
143
312
|
*
|
|
144
|
-
*
|
|
145
|
-
*
|
|
146
|
-
*
|
|
147
|
-
* recorded the merge sha on the delivery
|
|
148
|
-
* row; trust it directly rather than
|
|
149
|
-
* re-searching -- survives a stale/teamless
|
|
150
|
-
* worktree whose integration ref is not
|
|
151
|
-
* current, which the search-based fallback
|
|
152
|
-
* does not)
|
|
153
|
-
* - branch LEVEL/BEHIND after merge -> `<merge>^1...<merge>` (recovered by
|
|
154
|
-
* SEARCHING the base for the merge commit
|
|
155
|
-
* that brought it in -- fallback for when
|
|
156
|
-
* no sha was recorded)
|
|
157
|
-
* - no attributable commits -> null (caller yields empty; the
|
|
158
|
-
* instrument-fault path handles it)
|
|
313
|
+
* The recorded sources are preferred over `getCommitsAhead` so a merged-back
|
|
314
|
+
* branch that has since taken one new commit (routine: every spawn rebases onto
|
|
315
|
+
* integration) is NOT truncated to that single trailing commit.
|
|
159
316
|
*
|
|
160
|
-
* `
|
|
161
|
-
*
|
|
162
|
-
*
|
|
317
|
+
* `recordedCommitShas` is the delivery's OWN commit set (focus_merges.commit_shas
|
|
318
|
+
* already partitioned per-delivery by the Telora-Delivery trailer); `recordedMergeSha`
|
|
319
|
+
* is the row's merge_commit_sha. Callers without a record (assembly resolvers) pass
|
|
320
|
+
* neither and get the topology path.
|
|
163
321
|
*/
|
|
164
|
-
export function
|
|
322
|
+
export function resolveDeliveryDiffSource(worktreePath, baseBranch, recordedMergeSha, recordedCommitShas) {
|
|
323
|
+
const shas = (recordedCommitShas ?? []).map((s) => s.trim()).filter((s) => s !== '');
|
|
324
|
+
if (shas.length > 0) {
|
|
325
|
+
const span = resolveRecordedCommitRange(worktreePath, shas);
|
|
326
|
+
if (span) {
|
|
327
|
+
// A span is exact only when it re-lists ONLY the delivery's own commits.
|
|
328
|
+
// When a sibling interleaves, the span re-absorbs it -> diff commit-by-commit.
|
|
329
|
+
if (spanCoversRecordedExactly(worktreePath, span, shas))
|
|
330
|
+
return { kind: 'range', range: span };
|
|
331
|
+
return { kind: 'commits', commits: shas };
|
|
332
|
+
}
|
|
333
|
+
// Span boundary unreachable (e.g. --squash, or oldest is a root): if the
|
|
334
|
+
// commits themselves still exist, diff them directly; else fall through to
|
|
335
|
+
// topology rather than fabricate a range from missing commits.
|
|
336
|
+
if (shas.every((s) => commitExists(worktreePath, s)))
|
|
337
|
+
return { kind: 'commits', commits: shas };
|
|
338
|
+
}
|
|
339
|
+
const recordedMerge = resolveRecordedMergeRange(worktreePath, recordedMergeSha);
|
|
340
|
+
if (recordedMerge)
|
|
341
|
+
return { kind: 'range', range: recordedMerge };
|
|
165
342
|
if (getCommitsAhead(worktreePath, baseBranch) > 0)
|
|
166
|
-
return `${baseBranch}...HEAD
|
|
167
|
-
const recorded = resolveRecordedMergeRange(worktreePath, recordedMergeSha);
|
|
168
|
-
if (recorded)
|
|
169
|
-
return recorded;
|
|
343
|
+
return { kind: 'range', range: `${baseBranch}...HEAD` };
|
|
170
344
|
const merge = findDeliveryMergeCommit(worktreePath, baseBranch);
|
|
171
345
|
if (merge)
|
|
172
|
-
return `${merge}^1...${merge}
|
|
346
|
+
return { kind: 'range', range: `${merge}^1...${merge}` };
|
|
173
347
|
return null;
|
|
174
348
|
}
|
|
349
|
+
/**
|
|
350
|
+
* String-range view of {@link resolveDeliveryDiffSource}, for consumers that need
|
|
351
|
+
* a single range expression (assembly resolvers). Those callers pass no recorded
|
|
352
|
+
* commit set, so they always resolve to a `range` source; a `commits` source
|
|
353
|
+
* (interleaved per-delivery set) degrades to its best-effort span here -- only the
|
|
354
|
+
* verify path, which uses the source API directly, isolates interleaved commits.
|
|
355
|
+
*/
|
|
356
|
+
export function resolveDeliveryDiffRange(worktreePath, baseBranch, recordedMergeSha, recordedCommitShas) {
|
|
357
|
+
const source = resolveDeliveryDiffSource(worktreePath, baseBranch, recordedMergeSha, recordedCommitShas);
|
|
358
|
+
if (!source)
|
|
359
|
+
return null;
|
|
360
|
+
if (source.kind === 'range')
|
|
361
|
+
return source.range;
|
|
362
|
+
return resolveRecordedCommitRange(worktreePath, [...source.commits]);
|
|
363
|
+
}
|
|
364
|
+
/** The per-commit patch range (`<sha>^ <sha>`) that yields a single commit's own diff. */
|
|
365
|
+
function commitDiffRange(sha) {
|
|
366
|
+
return `${sha}^ ${sha}`;
|
|
367
|
+
}
|
|
368
|
+
/**
|
|
369
|
+
* The delivery's diff, from a resolved source. A `range` source diffs the span
|
|
370
|
+
* directly (byte-identical to the old range path). A `commits` source sums each
|
|
371
|
+
* commit's own patch (oldest-first for readable order), so interleaved siblings
|
|
372
|
+
* never appear.
|
|
373
|
+
*/
|
|
374
|
+
export function getDeliveryDiffFromSource(worktreePath, source) {
|
|
375
|
+
if (source.kind === 'range')
|
|
376
|
+
return getGitDiffRange(worktreePath, source.range);
|
|
377
|
+
return [...source.commits]
|
|
378
|
+
.reverse()
|
|
379
|
+
.map((sha) => getGitDiffRange(worktreePath, commitDiffRange(sha)))
|
|
380
|
+
.filter((p) => p !== '')
|
|
381
|
+
.join('\n');
|
|
382
|
+
}
|
|
383
|
+
/** Changed-files for a source: the range's name-only list, or the UNION per commit. */
|
|
384
|
+
export function getDeliveryChangedFilesFromSource(worktreePath, source) {
|
|
385
|
+
if (source.kind === 'range')
|
|
386
|
+
return getChangedFilesRange(worktreePath, source.range);
|
|
387
|
+
const files = new Set();
|
|
388
|
+
for (const sha of source.commits) {
|
|
389
|
+
for (const f of getChangedFilesRange(worktreePath, commitDiffRange(sha)))
|
|
390
|
+
files.add(f);
|
|
391
|
+
}
|
|
392
|
+
return [...files];
|
|
393
|
+
}
|
|
394
|
+
/** Diff-stat for a source: the range's stat, or per-commit stats concatenated. */
|
|
395
|
+
export function getDeliveryDiffStatFromSource(worktreePath, source) {
|
|
396
|
+
if (source.kind === 'range')
|
|
397
|
+
return getDiffStatRange(worktreePath, source.range);
|
|
398
|
+
return [...source.commits]
|
|
399
|
+
.reverse()
|
|
400
|
+
.map((sha) => getDiffStatRange(worktreePath, commitDiffRange(sha)))
|
|
401
|
+
.filter((s) => s.trim() !== '')
|
|
402
|
+
.join('\n');
|
|
403
|
+
}
|
|
404
|
+
/**
|
|
405
|
+
* The commits a source actually diffs, for the completeness check. A `range`
|
|
406
|
+
* source lists the range; a `commits` source is exactly its (existing) commits --
|
|
407
|
+
* so a per-delivery commit set covers itself by construction and never reads as
|
|
408
|
+
* half-blind for interleaving alone.
|
|
409
|
+
*/
|
|
410
|
+
export function listSourceCommits(worktreePath, source) {
|
|
411
|
+
if (source.kind === 'range')
|
|
412
|
+
return listRangeCommits(worktreePath, source.range);
|
|
413
|
+
return source.commits.filter((sha) => commitExists(worktreePath, sha));
|
|
414
|
+
}
|
|
175
415
|
/**
|
|
176
416
|
* The delivery's diff, resolved from the range that actually contains its work
|
|
177
417
|
* (see resolveDeliveryDiffRange). For a branch still ahead of base this is
|
|
@@ -180,7 +420,7 @@ export function resolveDeliveryDiffRange(worktreePath, baseBranch, recordedMerge
|
|
|
180
420
|
* with no attributable commits it returns ''.
|
|
181
421
|
*/
|
|
182
422
|
export function getDeliveryDiff(worktreePath, baseBranch) {
|
|
183
|
-
const
|
|
184
|
-
return
|
|
423
|
+
const source = resolveDeliveryDiffSource(worktreePath, baseBranch);
|
|
424
|
+
return source ? getDeliveryDiffFromSource(worktreePath, source) : '';
|
|
185
425
|
}
|
|
186
426
|
//# sourceMappingURL=git-diff.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"git-diff.js","sourceRoot":"","sources":["../../../src/resolvers/shared/git-diff.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"git-diff.js","sourceRoot":"","sources":["../../../src/resolvers/shared/git-diff.ts"],"names":[],"mappings":"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"}
|
|
@@ -29,7 +29,7 @@ export declare const TELORA_CLAUDE_MD_END = "<!-- END TELORA SEED -->";
|
|
|
29
29
|
* For Codex: the MCP server is registered in `~/.codex/config.toml` (global).
|
|
30
30
|
*/
|
|
31
31
|
export declare const SEED_MCP_REGISTRATION_SENTENCE = "The Telora MCP server is registered in `.mcp.json`.";
|
|
32
|
-
export declare const SEED_BODY = "# Telora workstation context\n\nThis repo is connected to Telora -- a differential control plane for\nsoftware delivery. Intent and reality are paired signals; the meaningful\nwork happens at the difference.\n\n## Before you write any code (read this first)\n\nDEFAULT: on a Telora-connected workstation, a new capability starts as\n**declared intent** before any code. When the user says \"I want to build\nX\", your first move is NOT to scaffold X -- it is to declare it: create\n(or select) a Focus -> delivery -> issue and move an issue to **In\nProgress**. Code is written only after intent is anchored above it.\n\nThis polarity is deliberate and easy to get backwards. Building directly\nin the working tree -- scaffolding, installing dependencies, starting a\ndev server, writing application files -- is the **exception**, taken ONLY\nwhen the user explicitly asks for it. Recognized bypass phrases:\n\"build locally\", \"just write it\", \"skip Telora\", \"don't track this\",\n\"throwaway\". Absent an explicit signal like these, treat any build\nrequest as a request to declare intent in Telora first.\n\nAsking good clarifying questions about stack, scope, or dependencies is\nNOT a substitute for this step -- that is execution-layer scoping, and it\ncomes *after* the capability is declared, not instead of it. Scoping is\nagent work; declaring that a capability matters is the part that must\nland in Telora first.\n\n**Surface the fork; do not silently pick it.** The common failure is\nresolving an ambiguous request toward the path of least resistance --\ne.g. reading \"a web app I run locally on my LAN\" (a deployment target) as\n\"build locally\" (skip Telora). When intent is not already explicit, your\nFIRST response to a build request names the choice rather than assuming\nit: \"I'll scope this in Telora unless you want it built locally -- which?\"\nOne question, once, at the start. Let the user pick; never pick for them\nby starting to type code.\n\n**First action rule.** On a build / new-capability request, your first\ntool call is a Telora planning call (telora_product_focus / _delivery /\n_issue) OR the fork question above -- never Write, Edit, or a code-running\nBash command. If the first move cannot be code, building-before-intent\ncannot happen.\n\nWhy: an artifact with no declared intent above it is reality moving with\nnothing to measure it against -- pure noise to the differential loop. The\nwhole system is built to compute intent-minus-reality; code that skips\nthe intent half defeats the instrument.\n\n## Execution polarity (which path executes this?)\n\nOnce intent is declared, a second polarity governs HOW it executes -- and it\nhas the same default-and-exception shape as the intent polarity above. A\ndeclared focus is handed to the **daemon team + review loop** by default.\nTeam execution IS THE DEFAULT; building it inline yourself in this interactive\nsession is the **explicit, named bypass**, taken ONLY when the user says so.\n\nThree execution forks recur. On each, the left side is the default and the\nright side is the effortful, must-be-named bypass:\n\n- **Daemon team + review vs. inline coding.** Default: hand the focus to the\n daemon team, which executes and runs it through the review gate. Bypass:\n build it inline in this session -- only on an explicit signal.\n- **Tree-anchored delivery vs. unanchored delivery.** Default: anchor each\n delivery to a reality-tree injection. Bypass: an unanchored delivery\n (`allowUnanchored`) -- a deliberate, reason-bearing act, not a silent flag.\n- **Review-gated Done vs. self-marked Done.** Default: work is confirmed Done\n by the review gate. Bypass: marking your own work Done without review.\n\nThe recognized signal that switches execution to inline is an explicit\n\"build it now\" (and the same throwaway phrases that bypass the intent step:\n\"build locally\", \"just write it\", \"skip Telora\", \"don't track this\",\n\"throwaway\"). Absent such a signal, hand off to the team -- do not fill the\nchoice with the lowest-resistance path (typing code yourself).\n\n**Surface the fork; do not silently pick it.** When the execution path is not\nalready explicit, your response NAMES the choice rather than assuming it:\n\"I'll hand this to the daemon team + review unless you want it built inline\nnow -- which?\" One question, once. Let the user pick; never default to inline\nby starting to type code.\n\n## Planning hierarchy\n\n- **Focus** = the context that defines an area of work -- not \"one\n capability.\" All phases of building within that area belong in one\n focus; if a \"focus\" is really just one phase, fold it back in.\n- **Delivery** = a shippable phase or major component of a capability.\n- **Context Group** = optional grouping of related issues that share\n meaningful context (relevant files, architectural notes). A CG earns its\n existence by carrying context, not by being a folder.\n- **Task** = one discrete implementable unit. Bounded files, focused\n session. Multiple \"and\" clauses across different concerns means split.\n\nScope by purpose, not count. The right number of deliveries is however\nmany phases the work naturally has.\n\n## PRD: \"build a working app in one run\"\n\nA **PRD** sits one altitude above Focus (Product -> PRD -> Focus): a\nbounded, verifiable, retire-able milestone carrying a **Prerequisite Tree**\nof `goal` / `obstacle` / `overcome` nodes. Each `overcome` materializes\nas a focus; the daemon progressively arms the **frontier** of foci as\nupstream obstacles clear. This is the entry point a user means by \"build a\nfully working app in one go.\"\n\nIt is NOT big-bang generation: you author the tree once, commit a path,\nand the differential loop walks the frontier to completion -- the execution\nunderneath is still the normal focus -> delivery -> issue + review loop.\n\nThe PRD tools are **lazy-loaded** -- they do not exist until you load the\ndomain. If you don't see `telora_prd` / `telora_prd_tree`, run:\n\n```\ntelora_discover { action: \"load\", domain: \"prd\" }\n```\n\nThen: `telora_prd` create (referencing a Vision) -> `telora_prd_tree`\nauthor nodes (an obstacle's `clearancePredicate` is OPTIONAL and advisory --\nthe frontier advances as upstream obstacles clear via focus-completion, i.e.\neach overcome's focus finishing its deliveries' verify gates, not via a\nper-obstacle predicate) + edges -> commit a pathway -> `materialize_overcome`\neach into a focus -> arm the daemon PRD loop. All authoring is harness+MCP;\nthere is no Telora authoring UI.\n\n## Issue workflow\n\n`To Do` -> `In Progress` -> `In Review` / `Blocked` -> `Done`.\n\nIssue types: **Context Group**, **Task**, **Bug**.\n\nMovement rules:\n\n- An issue MUST be set to `In Progress` before any work begins on it.\n- Never skip `In Progress`. Never move directly from `To Do` to `Done`.\n- Set status with `telora_product_issue` action=update.\n\nDelivery and focus stages advance automatically based on issue\nactivity. Agents never set delivery executionStatus directly.\n\n## MCP tool surface (what's available in this session)\n\nThe Telora MCP server is registered in `.mcp.json`. Core tool families:\n\n- `telora_product` -- list/get/create/update products\n- `telora_product_focus` -- focuses under a product\n- `telora_product_delivery` -- deliveries under a focus\n- `telora_product_issue` -- issues (Context Groups, Tasks, Bugs) under a delivery\n- `telora_agent` -- agent roles, escalation requests\n- `telora_loop_*` -- loop documents, questions, answers\n- `telora_discover` -- on-demand registration of deferred tool domains\n\nResolve the live tool list at runtime via `telora_discover` rather than\nhard-coding a list that drifts.\n\n## Human-vs-agent boundaries\n\n- Humans own **intent** and **completion**.\n - Intent: what capability matters, what changes when. Pre-handoff.\n - Completion: closing the loop on whether a focus is done. Post-handoff.\n- Agents own **scoping** and **execution**.\n - Scoping: decomposing a focus into deliveries, deliveries into\n issues, restructuring mid-flight as the agent learns more.\n - Execution: writing code, running tests, committing, reporting.\n\nDo not ask humans for operational details they expect the agent to figure\nout. Do not silently complete a focus on the human's behalf. Escalate\nwhen stuck via `telora_agent` action=escalate.\n\nWhen communicating with a human, refer to focuses, deliveries, and issues\nby their **title**, never their UUID. UUIDs are for tool calls only and must\nnot be surfaced in chat. MCP tool results carry both, so this is a\ncommunication choice, not a data-availability problem: keep the id in the\ntool call, name the work by its title in the conversation.\n\n## Differential signaling\n\nTelora is asymmetric: it moves reality toward intent, never the reverse.\nAgents do not lower the bar to make signals look better -- they escalate.\nEvery artifact (commit, work summary, gate result) is signal toward the\ndeclared intent; raw activity without intent reduction is noise.\n\nA short corrective comment from the user is high-signal -- treat brief\npushback as the most important input in the session.\n\n## Workflows and policies\n\n- **Workflow**: stage directives shape agent behavior at discrete\n transitions. What context the agent sees (assembly recipes), what tools\n it can use, how it thinks (prompt + model). Live in Telora's\n `workflow_stages.agent_directive` JSONB.\n- **Policy** (organizational, deferred): cross-cutting constraints that\n feed into stage directives.\n\nWhen you cross a stage transition, the daemon may inject context or spawn\na fresh sub-agent per the directive. Don't override that flow without a\nclear reason.\n";
|
|
32
|
+
export declare const SEED_BODY = "# Telora workstation context\n\nThis repo is connected to Telora -- a differential control plane for\nsoftware delivery. Intent and reality are paired signals; the meaningful\nwork happens at the difference.\n\n## Before you write any code (read this first)\n\nDEFAULT: on a Telora-connected workstation, a new capability starts as\n**declared intent** before any code. When the user says \"I want to build\nX\", your first move is NOT to scaffold X -- it is to declare it: create\n(or select) a Focus -> delivery -> issue and move an issue to **In\nProgress**. Code is written only after intent is anchored above it.\n\nThis polarity is deliberate and easy to get backwards. Building directly\nin the working tree -- scaffolding, installing dependencies, starting a\ndev server, writing application files -- is the **exception**, taken ONLY\nwhen the user explicitly asks for it. Recognized bypass phrases:\n\"build locally\", \"just write it\", \"skip Telora\", \"don't track this\",\n\"throwaway\". Absent an explicit signal like these, treat any build\nrequest as a request to declare intent in Telora first.\n\nAsking good clarifying questions about stack, scope, or dependencies is\nNOT a substitute for this step -- that is execution-layer scoping, and it\ncomes *after* the capability is declared, not instead of it. Scoping is\nagent work; declaring that a capability matters is the part that must\nland in Telora first.\n\n**Surface the fork; do not silently pick it.** The common failure is\nresolving an ambiguous request toward the path of least resistance --\ne.g. reading \"a web app I run locally on my LAN\" (a deployment target) as\n\"build locally\" (skip Telora). When intent is not already explicit, your\nFIRST response to a build request names the choice rather than assuming\nit: \"I'll scope this in Telora unless you want it built locally -- which?\"\nOne question, once, at the start. Let the user pick; never pick for them\nby starting to type code.\n\n**First action rule.** On a build / new-capability request, your first\ntool call is a Telora planning call (telora_product_focus / _delivery /\n_issue) OR the fork question above -- never Write, Edit, or a code-running\nBash command. If the first move cannot be code, building-before-intent\ncannot happen.\n\nWhy: an artifact with no declared intent above it is reality moving with\nnothing to measure it against -- pure noise to the differential loop. The\nwhole system is built to compute intent-minus-reality; code that skips\nthe intent half defeats the instrument.\n\n## Execution polarity (which path executes this?)\n\nOnce intent is declared, a second polarity governs HOW it executes -- and it\nhas the same default-and-exception shape as the intent polarity above. A\ndeclared focus is handed to the **daemon team + review loop** by default.\nTeam execution IS THE DEFAULT; building it inline yourself in this interactive\nsession is the **explicit, named bypass**, taken ONLY when the user says so.\n\nThree execution forks recur. On each, the left side is the default and the\nright side is the effortful, must-be-named bypass:\n\n- **Daemon team + review vs. inline coding.** Default: hand the focus to the\n daemon team, which executes and runs it through the review gate. Bypass:\n build it inline in this session -- only on an explicit signal.\n- **Tree-anchored delivery vs. unanchored delivery.** Default: anchor each\n delivery to a reality-tree injection. Bypass: an unanchored delivery\n (`allowUnanchored`) -- a deliberate, reason-bearing act, not a silent flag.\n- **Review-gated Done vs. self-marked Done.** Default: work is confirmed Done\n by the review gate. Bypass: marking your own work Done without review.\n\nThe recognized signal that switches execution to inline is an explicit\n\"build it now\" (and the same throwaway phrases that bypass the intent step:\n\"build locally\", \"just write it\", \"skip Telora\", \"don't track this\",\n\"throwaway\"). Absent such a signal, hand off to the team -- do not fill the\nchoice with the lowest-resistance path (typing code yourself).\n\n**Surface the fork; do not silently pick it.** When the execution path is not\nalready explicit, your response NAMES the choice rather than assuming it:\n\"I'll hand this to the daemon team + review unless you want it built inline\nnow -- which?\" One question, once. Let the user pick; never default to inline\nby starting to type code.\n\n## Planning hierarchy\n\n- **Focus** = the context that defines an area of work -- not \"one\n capability.\" All phases of building within that area belong in one\n focus; if a \"focus\" is really just one phase, fold it back in.\n- **Delivery** = a shippable phase or major component of a capability.\n- **Context Group** = optional grouping of related issues that share\n meaningful context (relevant files, architectural notes). A CG earns its\n existence by carrying context, not by being a folder.\n- **Task** = one discrete implementable unit. Bounded files, focused\n session. Multiple \"and\" clauses across different concerns means split.\n\nScope by purpose, not count. The right number of deliveries is however\nmany phases the work naturally has.\n\n## PRD: \"build a working app in one run\"\n\nA **PRD** sits one altitude above Focus (Product -> PRD -> Focus): a\nbounded, verifiable, retire-able milestone carrying a **Prerequisite Tree**\nof `goal` / `obstacle` / `overcome` nodes. Each `overcome` materializes\nas a focus; the daemon progressively arms the **frontier** of foci as\nupstream obstacles clear. This is the entry point a user means by \"build a\nfully working app in one go.\"\n\nIt is NOT big-bang generation: you author the tree once, commit a path,\nand the differential loop walks the frontier to completion -- the execution\nunderneath is still the normal focus -> delivery -> issue + review loop.\n\nThe PRD tools are **lazy-loaded** -- they do not exist until you load the\ndomain. If you don't see `telora_prd` / `telora_prd_tree`, run:\n\n```\ntelora_discover { action: \"load\", domain: \"prd\" }\n```\n\nThen: `telora_prd` create (referencing a Vision) -> `telora_prd_tree`\nauthor nodes (an obstacle's `clearancePredicate` is OPTIONAL and advisory --\nthe frontier advances as upstream obstacles clear via focus-completion, i.e.\neach overcome's focus finishing its deliveries' verify gates, not via a\nper-obstacle predicate) + edges -> commit a pathway -> `materialize_overcome`\neach into a focus -> arm the daemon PRD loop. All authoring is harness+MCP;\nthere is no Telora authoring UI.\n\n## Issue workflow\n\n`To Do` -> `In Progress` -> `In Review` / `Blocked` -> `Done`.\n\nIssue types: **Context Group**, **Task**, **Bug**.\n\nMovement rules:\n\n- An issue MUST be set to `In Progress` before any work begins on it.\n- Never skip `In Progress`. Never move directly from `To Do` to `Done`.\n- Set status with `telora_product_issue` action=update.\n\nDelivery and focus stages advance automatically based on issue\nactivity. Agents never set delivery executionStatus directly.\n\n## MCP tool surface (what's available in this session)\n\nThe Telora MCP server is registered in `.mcp.json`. Core tool families:\n\n- `telora_product` -- list/get/create/update products\n- `telora_product_focus` -- focuses under a product\n- `telora_product_delivery` -- deliveries under a focus\n- `telora_product_issue` -- issues (Context Groups, Tasks, Bugs) under a delivery\n- `telora_agent` -- agent roles, escalation requests\n- `telora_loop_*` -- loop documents, questions, answers\n- `telora_discover` -- on-demand registration of deferred tool domains\n\nResolve the live tool list at runtime via `telora_discover` rather than\nhard-coding a list that drifts.\n\n## Human-vs-agent boundaries\n\n- Humans own **intent** and **completion**.\n - Intent: what capability matters, what changes when. Pre-handoff.\n - Completion: closing the loop on whether a focus is done. Post-handoff.\n- Agents own **scoping** and **execution**.\n - Scoping: decomposing a focus into deliveries, deliveries into\n issues, restructuring mid-flight as the agent learns more.\n - Execution: writing code, running tests, committing, reporting.\n\nDo not ask humans for operational details they expect the agent to figure\nout. Do not silently complete a focus on the human's behalf. Escalate\nwhen stuck via `telora_agent` action=escalate.\n\nWhen communicating with a human, refer to focuses, deliveries, and issues\nby their **title**, never their UUID. UUIDs are for tool calls only and must\nnot be surfaced in chat. MCP tool results carry both, so this is a\ncommunication choice, not a data-availability problem: keep the id in the\ntool call, name the work by its title in the conversation.\n\n## Commit attribution\n\nDeliveries on a focus share one branch, so their commits interleave. Every\ncommit you make for a delivery MUST carry a git trailer naming that delivery:\n\n```\nTelora-Delivery: <deliveryId>\n```\n\n- `<deliveryId>` is the delivery UUID whose work the commit advances (not the\n issue id, not the focus id). E.g.\n `git commit -m \"<subject>\" -m \"Telora-Delivery: <deliveryId>\"`.\n- One delivery per commit; split a change that spans two deliveries.\n- Merge-resolution / housekeeping commits carry no trailer.\n\nThe verify gate partitions the recorded commit set by this trailer to judge each\ndelivery against its OWN work and to prove its evidence is complete. A missing\ntrailer never corrupts a sibling -- at worst this delivery's evidence becomes\nunvouchable and the gate re-queues it instead of rendering a verdict.\n\n## Differential signaling\n\nTelora is asymmetric: it moves reality toward intent, never the reverse.\nAgents do not lower the bar to make signals look better -- they escalate.\nEvery artifact (commit, work summary, gate result) is signal toward the\ndeclared intent; raw activity without intent reduction is noise.\n\nA short corrective comment from the user is high-signal -- treat brief\npushback as the most important input in the session.\n\n## Workflows and policies\n\n- **Workflow**: stage directives shape agent behavior at discrete\n transitions. What context the agent sees (assembly recipes), what tools\n it can use, how it thinks (prompt + model). Live in Telora's\n `workflow_stages.agent_directive` JSONB.\n- **Policy** (organizational, deferred): cross-cutting constraints that\n feed into stage directives.\n\nWhen you cross a stage transition, the daemon may inject context or spawn\na fresh sub-agent per the directive. Don't override that flow without a\nclear reason.\n";
|
|
33
33
|
/**
|
|
34
34
|
* Render a fresh-repo CLAUDE.md.
|
|
35
35
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-md.d.ts","sourceRoot":"","sources":["../../src/templates/claude-md.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,sBAAsB,+BAA+B,CAAC;AACnE,eAAO,MAAM,oBAAoB,6BAA6B,CAAC;AAE/D;;;;;;GAMG;AACH;;;;;;;GAOG;AACH,eAAO,MAAM,8BAA8B,wDACY,CAAC;AAExD,eAAO,MAAM,SAAS,
|
|
1
|
+
{"version":3,"file":"claude-md.d.ts","sourceRoot":"","sources":["../../src/templates/claude-md.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,eAAO,MAAM,sBAAsB,+BAA+B,CAAC;AACnE,eAAO,MAAM,oBAAoB,6BAA6B,CAAC;AAE/D;;;;;;GAMG;AACH;;;;;;;GAOG;AACH,eAAO,MAAM,8BAA8B,wDACY,CAAC;AAExD,eAAO,MAAM,SAAS,y4UAuNrB,CAAC;AAEF;;;;;;GAMG;AACH,wBAAgB,cAAc,CAAC,WAAW,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,CASjE"}
|
|
@@ -202,6 +202,26 @@ not be surfaced in chat. MCP tool results carry both, so this is a
|
|
|
202
202
|
communication choice, not a data-availability problem: keep the id in the
|
|
203
203
|
tool call, name the work by its title in the conversation.
|
|
204
204
|
|
|
205
|
+
## Commit attribution
|
|
206
|
+
|
|
207
|
+
Deliveries on a focus share one branch, so their commits interleave. Every
|
|
208
|
+
commit you make for a delivery MUST carry a git trailer naming that delivery:
|
|
209
|
+
|
|
210
|
+
\`\`\`
|
|
211
|
+
Telora-Delivery: <deliveryId>
|
|
212
|
+
\`\`\`
|
|
213
|
+
|
|
214
|
+
- \`<deliveryId>\` is the delivery UUID whose work the commit advances (not the
|
|
215
|
+
issue id, not the focus id). E.g.
|
|
216
|
+
\`git commit -m "<subject>" -m "Telora-Delivery: <deliveryId>"\`.
|
|
217
|
+
- One delivery per commit; split a change that spans two deliveries.
|
|
218
|
+
- Merge-resolution / housekeeping commits carry no trailer.
|
|
219
|
+
|
|
220
|
+
The verify gate partitions the recorded commit set by this trailer to judge each
|
|
221
|
+
delivery against its OWN work and to prove its evidence is complete. A missing
|
|
222
|
+
trailer never corrupts a sibling -- at worst this delivery's evidence becomes
|
|
223
|
+
unvouchable and the gate re-queues it instead of rendering a verdict.
|
|
224
|
+
|
|
205
225
|
## Differential signaling
|
|
206
226
|
|
|
207
227
|
Telora is asymmetric: it moves reality toward intent, never the reverse.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"claude-md.js","sourceRoot":"","sources":["../../src/templates/claude-md.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,4BAA4B,CAAC;AACnE,MAAM,CAAC,MAAM,oBAAoB,GAAG,0BAA0B,CAAC;AAE/D;;;;;;GAMG;AACH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,8BAA8B,GACzC,qDAAqD,CAAC;AAExD,MAAM,CAAC,MAAM,SAAS,GAAG
|
|
1
|
+
{"version":3,"file":"claude-md.js","sourceRoot":"","sources":["../../src/templates/claude-md.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,MAAM,CAAC,MAAM,sBAAsB,GAAG,4BAA4B,CAAC;AACnE,MAAM,CAAC,MAAM,oBAAoB,GAAG,0BAA0B,CAAC;AAE/D;;;;;;GAMG;AACH;;;;;;;GAOG;AACH,MAAM,CAAC,MAAM,8BAA8B,GACzC,qDAAqD,CAAC;AAExD,MAAM,CAAC,MAAM,SAAS,GAAG;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAuNxB,CAAC;AAEF;;;;;;GAMG;AACH,MAAM,UAAU,cAAc,CAAC,WAA0B;IACvD,MAAM,WAAW,GAAG,WAAW;QAC7B,CAAC,CAAC,kCAAkC,WAAW,SAAS;QACxD,CAAC,CAAC,EAAE,CAAC;IACP,MAAM,KAAK,GACT,GAAG,sBAAsB,IAAI;QAC7B,GAAG,WAAW,GAAG,SAAS,EAAE;QAC5B,GAAG,oBAAoB,IAAI,CAAC;IAC9B,OAAO,KAAK,CAAC;AACf,CAAC"}
|
|
@@ -0,0 +1,151 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The verification engine's injectable dependency surface.
|
|
3
|
+
*
|
|
4
|
+
* Split out of `verification-engine.ts` (which holds the dispatch + tick logic)
|
|
5
|
+
* because this is a CONTRACT, not behavior: every seam the engine reaches
|
|
6
|
+
* reality through -- pending-verification reads, the injection flip, target
|
|
7
|
+
* reconciliation, escalation filing, drift emission, the three strategies, cwd
|
|
8
|
+
* and commit-set resolution, the security gate, and the three feedback re-entry
|
|
9
|
+
* paths -- is declared here, and every test that drives the engine constructs
|
|
10
|
+
* one of these. The wiring that fills it (`defaultDeps`) stays in the engine,
|
|
11
|
+
* next to the imports it binds.
|
|
12
|
+
*
|
|
13
|
+
* Type-only module: no runtime imports, so it adds no edge to the module graph
|
|
14
|
+
* that `import-x/no-cycle` has to reason about.
|
|
15
|
+
*
|
|
16
|
+
* @module verification-deps
|
|
17
|
+
*/
|
|
18
|
+
import type { StrategyResult } from './verification-deterministic.js';
|
|
19
|
+
import type { runDeterministicStrategy } from './verification-deterministic.js';
|
|
20
|
+
import type { getPendingVerifications, PendingVerification, VerificationOutcome } from './queries/verification.js';
|
|
21
|
+
import type { NodeWriteback } from './reality-writeback.js';
|
|
22
|
+
import type { ReconcileTargetsResult, TargetRestatement, TargetShortfall, VerifyEvidence } from './verify-restatement.js';
|
|
23
|
+
import type { FileEscalationInput } from './escalations.js';
|
|
24
|
+
import type { EvidenceUnavailableDetail } from './queries/delivery-gate-state.js';
|
|
25
|
+
import type { DaemonConfig } from './types.js';
|
|
26
|
+
import type { ResolvedDefaultVerification } from './verification-config.js';
|
|
27
|
+
import type { getActiveFocuses, getFocusDeliveries } from './supabase.js';
|
|
28
|
+
import type { AiInspectionInputs } from './ai-inspection-context.js';
|
|
29
|
+
import type { runAiInspection as defaultRunAiInspection } from './ai-inspection-runner.js';
|
|
30
|
+
import type { SecurityFindingGateDeps } from './security-finding-gate.js';
|
|
31
|
+
import type { FailureClassification } from './verification-baseline.js';
|
|
32
|
+
export interface DriftProposalCreatePayload {
|
|
33
|
+
focusId: string | null;
|
|
34
|
+
productId: string | null;
|
|
35
|
+
injectionNodeId: string;
|
|
36
|
+
observation: {
|
|
37
|
+
nodeId: string | null;
|
|
38
|
+
kind: 'update_statement' | 'add_node' | 'retire_node' | 'change_node_type' | 'flip_ude_to_de';
|
|
39
|
+
observed: string;
|
|
40
|
+
suggestedCorrection: string;
|
|
41
|
+
};
|
|
42
|
+
}
|
|
43
|
+
export interface VerificationDeps {
|
|
44
|
+
getPendingVerifications: typeof getPendingVerifications;
|
|
45
|
+
recordOutcome: (deliveryId: string, outcome: VerificationOutcome) => Promise<void>;
|
|
46
|
+
verifyInjection: (injectionNodeId: string, restatements?: TargetRestatement[]) => Promise<void>;
|
|
47
|
+
/**
|
|
48
|
+
* Reconcile the declared desired effect against the achieved outcome (authored
|
|
49
|
+
* from the supplied EVIDENCE -- diff/tests/inspection, NOT the UDE problem text)
|
|
50
|
+
* for each UDE the injection targets, classifying match / legitimate_divergence
|
|
51
|
+
* / shortfall. match / legitimate_divergence come back in `restatements` for the
|
|
52
|
+
* engine to carry INTO the verify call; shortfalls come back in `shortfalls` so
|
|
53
|
+
* the engine can hold the gate and escalate. The edge applies the supplied prose
|
|
54
|
+
* + classification; it never runs the LLM.
|
|
55
|
+
*/
|
|
56
|
+
authorTargetRestatements?: (injectionNodeId: string, focusId: string | null, evidence: VerifyEvidence,
|
|
57
|
+
/**
|
|
58
|
+
* True when the resolved diff range does not cover the delivery's recorded
|
|
59
|
+
* commit set (half-blind). Treated the same as an empty bundle: the gate
|
|
60
|
+
* declines to render a verdict and returns the instrument-fault signal.
|
|
61
|
+
*/
|
|
62
|
+
evidenceIncomplete: boolean) => Promise<ReconcileTargetsResult>;
|
|
63
|
+
/**
|
|
64
|
+
* File a human escalation when an injection's achieved outcome falls SHORT of
|
|
65
|
+
* its declared desired effect. Reality is asymmetric: we never soften the
|
|
66
|
+
* declared DE to match a lesser achievement -- we hold the gate and hand the
|
|
67
|
+
* gap to the intent owner.
|
|
68
|
+
*/
|
|
69
|
+
fileEscalation: (input: FileEscalationInput) => Promise<void>;
|
|
70
|
+
/** Org scope for filed escalations. */
|
|
71
|
+
organizationId: string;
|
|
72
|
+
/** Persist a single drift proposal observed during ai_inspection. */
|
|
73
|
+
emitDriftProposal: (payload: DriftProposalCreatePayload) => Promise<void>;
|
|
74
|
+
/**
|
|
75
|
+
* Surface INWARD drift proposals (TEL-4): for each target the verify path
|
|
76
|
+
* stamped `legitimate_divergence`, create one `update_statement` drift
|
|
77
|
+
* proposal flagged `inward:true` so a confident-but-wrong tree claim is
|
|
78
|
+
* corrected by drift rather than frozen. Best-effort + non-fatal: a failure
|
|
79
|
+
* here must not undo the verify flip that already landed. Defaults to the
|
|
80
|
+
* `emitInwardDriftProposals` seam in queries/verification.
|
|
81
|
+
*/
|
|
82
|
+
emitInwardDrift: (injectionNodeId: string, writebacks: readonly NodeWriteback[], realityTreeId?: string) => Promise<void>;
|
|
83
|
+
runDeterministic: typeof runDeterministicStrategy;
|
|
84
|
+
runAiInspection: typeof defaultRunAiInspection;
|
|
85
|
+
resolveAiInspectionInputs: (v: PendingVerification) => Promise<AiInspectionInputs | null>;
|
|
86
|
+
resolveCwd: (productId: string | null) => string;
|
|
87
|
+
integrationBranch: string;
|
|
88
|
+
/**
|
|
89
|
+
* Security workflow verify-closed gate. Consulted before
|
|
90
|
+
* `verifyInjection` so a security-linked injection cannot be retired
|
|
91
|
+
* unless the linked finding has flipped to 'resolved'. On failure the
|
|
92
|
+
* gate escalates the finding (status='escalated', reason='verify_gate_failed')
|
|
93
|
+
* and the engine demotes the verification outcome to 'failed'.
|
|
94
|
+
*/
|
|
95
|
+
securityFindingGate: SecurityFindingGateDeps;
|
|
96
|
+
/**
|
|
97
|
+
* Resolve the default-on deterministic verification config (env > file >
|
|
98
|
+
* default). When it yields `enabled: false` (no command configured) the
|
|
99
|
+
* default-on scan is a no-op and only explicit-method deliveries verify.
|
|
100
|
+
*/
|
|
101
|
+
resolveDefaultVerification: (config: DaemonConfig) => ResolvedDefaultVerification;
|
|
102
|
+
/** Enumerate active focuses for a product (default-on candidate discovery). */
|
|
103
|
+
getActiveFocuses: typeof getActiveFocuses;
|
|
104
|
+
/** Fetch a focus's deliveries (default-on candidate discovery). */
|
|
105
|
+
getFocusDeliveries: typeof getFocusDeliveries;
|
|
106
|
+
/** Failed-run feedback (gate_state + live inject). Optional; defaultDeps provides it. */
|
|
107
|
+
deliverFailureFeedback?: (v: PendingVerification, result: StrategyResult) => Promise<void>;
|
|
108
|
+
/**
|
|
109
|
+
* Shortfall-origin re-work re-entry: route the delivery verify -> verify_failed
|
|
110
|
+
* through the single-writer reconciler (carrying the declared-vs-achieved gap in
|
|
111
|
+
* gate_state under the shortfall guard) so it re-enters bounded re-work instead
|
|
112
|
+
* of a human inbox, and live-inject the gap into a running coding team.
|
|
113
|
+
* Distinct from deliverFailureFeedback so a shortfall hold never reports under
|
|
114
|
+
* the deterministic guard. Optional; defaultDeps provides it (requeueShortfallAsRework).
|
|
115
|
+
*/
|
|
116
|
+
deliverShortfallFeedback?: (v: PendingVerification, shortfalls: readonly TargetShortfall[]) => Promise<void>;
|
|
117
|
+
/**
|
|
118
|
+
* Instrument-fault re-work re-entry: the verify path was handed no evidence it
|
|
119
|
+
* could judge the work against (an empty bundle). Routes the delivery
|
|
120
|
+
* verify -> verify_failed through the single-writer reconciler (carrying the
|
|
121
|
+
* instrument-fault context in gate_state under the evidence-unavailable guard)
|
|
122
|
+
* so it re-enters the EXISTING bounded verify_failed re-work cycle, and
|
|
123
|
+
* live-injects the fault into a running coding team. Files NO escalation --
|
|
124
|
+
* "fix the diff range / confirm the merge" names no act only a human can
|
|
125
|
+
* perform, so an empty bundle never reaches a human inbox
|
|
126
|
+
* (verify_gate_unclearable, from the iteration cap, is the sole residue).
|
|
127
|
+
* Optional; defaultDeps provides it (requeueEvidenceUnavailableAsRework).
|
|
128
|
+
*/
|
|
129
|
+
requeueEvidenceUnavailableAsRework?: (v: PendingVerification, fault: Omit<EvidenceUnavailableDetail, 'heldAt'>) => Promise<void>;
|
|
130
|
+
/** cwd for the HEAD run -- the focus worktree. Optional; dispatch falls back to resolveCwd. */
|
|
131
|
+
resolveVerificationCwd?: (v: PendingVerification) => string;
|
|
132
|
+
/**
|
|
133
|
+
* Count of commits the delivery branch is ahead of the integration base.
|
|
134
|
+
* Used by the evidence-integrity guard to tell a broken diff MEASUREMENT
|
|
135
|
+
* (commits present but diff empty -> hold) from genuine inaction (no commits
|
|
136
|
+
* -> a real shortfall). Optional; defaultDeps resolves it in the focus worktree.
|
|
137
|
+
*/
|
|
138
|
+
resolveCommitsAhead?: (v: PendingVerification) => number;
|
|
139
|
+
/**
|
|
140
|
+
* Resolve the delivery's RECORDED constituent commit shas (focus_merges.commit_shas)
|
|
141
|
+
* for the merge_commit_sha the row carries -- the durable attribution written at
|
|
142
|
+
* merge time. The verify diff resolver prefers this over live branch topology so a
|
|
143
|
+
* fast-forwarded or rebased merge-back is judged against the delivery's real commit
|
|
144
|
+
* set, not a truncated trailing-commit range. Returns [] when no record exists (the
|
|
145
|
+
* resolver then falls through to topology). Optional; defaultDeps provides it.
|
|
146
|
+
*/
|
|
147
|
+
resolveRecordedCommitShas?: (v: PendingVerification) => Promise<string[]>;
|
|
148
|
+
/** Baseline-diff attribution; null => no baseline resolvable (gate all). Optional. */
|
|
149
|
+
attributeFailures?: (v: PendingVerification, result: StrategyResult) => Promise<FailureClassification | null>;
|
|
150
|
+
}
|
|
151
|
+
//# sourceMappingURL=verification-deps.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"verification-deps.d.ts","sourceRoot":"","sources":["../src/verification-deps.ts"],"names":[],"mappings":"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"}
|