fix(hooks): a command with several merges says its run evidence is not shown

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
Kjell Tore Guttormsen 2026-11-04 10:54:56 +01:00
commit ff3e20919e
Signed by: ktg
SSH key fingerprint: SHA256:JakMjO6FTBBzN0Bhfj9saOoEjaFxlSdYuZQQpM/lF9Q
4 changed files with 566 additions and 5 deletions

View file

@ -240,3 +240,30 @@ export function evidenceLines(repoRoot, mergeArgs) {
return UNREADABLE;
}
}
/** The text for a command with several merges into main (N = the count). */
const MANY_MERGES = (n) =>
`Tested by: not shown (this command merges ${n} branches into main; merge one at a time to see each run's evidence).\nUndone by: not shown.`;
/**
* The evidence text for every merge approval of one command, for the guard's
* question: zero merges give '', one gives its two evidence lines (exactly
* evidenceLines), two or more give MANY_MERGES with the count: one question
* cannot show each run's evidence, so none is shown.
* @param {Array<{subject: string, merge: {args: string[]}}>} merges
* @returns {string} never throws
*/
export function evidenceForMerges(merges) {
try {
if (!Array.isArray(merges)) return UNREADABLE;
if (merges.length === 0) return '';
if (merges.length === 1) {
const m = merges[0];
if (!isObj(m)) return UNREADABLE;
return evidenceLines(m.subject, m.merge && m.merge.args);
}
return MANY_MERGES(merges.length);
} catch {
return UNREADABLE;
}
}

View file

@ -791,13 +791,14 @@ if (approvals.length > 0) {
// read from the evidence file /trekexecute Phase 8 wrote (hooks/lib/merge-evidence.mjs).
// The decision above is already 'ask'; this block only adds text to the
// reason, and a reader that fails to load or throws leaves a note, never a
// green line.
const merge = approvals.find((m) => m.cls === 'merge');
if (merge) {
// green line. A command with several merges gets one line that says the
// run evidence is not shown (one question cannot show each run's).
const merges = approvals.filter((m) => m.cls === 'merge');
if (merges.length > 0) {
let evidence;
try {
const { evidenceLines } = await import('../lib/merge-evidence.mjs');
evidence = ' ' + evidenceLines(merge.subject, merge.merge && merge.merge.args);
const { evidenceForMerges } = await import('../lib/merge-evidence.mjs');
evidence = ' ' + evidenceForMerges(merges);
} catch {
evidence = ' (run evidence not loaded)';
}