instar 1.3.992 → 1.3.994
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/dist/core/ProjectRoundExecution.d.ts +48 -6
- package/dist/core/ProjectRoundExecution.d.ts.map +1 -1
- package/dist/core/ProjectRoundExecution.js +134 -30
- package/dist/core/ProjectRoundExecution.js.map +1 -1
- package/dist/core/RecurrenceActuator.d.ts +79 -0
- package/dist/core/RecurrenceActuator.d.ts.map +1 -0
- package/dist/core/RecurrenceActuator.js +116 -0
- package/dist/core/RecurrenceActuator.js.map +1 -0
- package/dist/core/recurrenceLoop.d.ts +66 -0
- package/dist/core/recurrenceLoop.d.ts.map +1 -0
- package/dist/core/recurrenceLoop.js +76 -0
- package/dist/core/recurrenceLoop.js.map +1 -0
- package/dist/server/routes.d.ts.map +1 -1
- package/dist/server/routes.js +1 -51
- package/dist/server/routes.js.map +1 -1
- package/package.json +1 -1
- package/src/data/builtin-manifest.json +46 -46
- package/upgrades/1.3.993.md +73 -0
- package/upgrades/1.3.994.md +69 -0
- package/upgrades/side-effects/recurrence-actuator.md +130 -0
- package/upgrades/side-effects/recurrence-loop.md +112 -0
- package/upgrades/side-effects/round-completion-verifies-merged.md +137 -0
|
@@ -73,14 +73,39 @@ export interface RunRoundInput {
|
|
|
73
73
|
/** Max resume attempts on transient failures; defaults to 3. */
|
|
74
74
|
maxResumeAttempts?: number;
|
|
75
75
|
/**
|
|
76
|
-
*
|
|
77
|
-
*
|
|
78
|
-
*
|
|
79
|
-
*
|
|
76
|
+
* Seam for verifying per-item artifacts. Defaults to the REAL git-backed
|
|
77
|
+
* `verifyMergedItemsViaGit`; tests inject a stub.
|
|
78
|
+
*
|
|
79
|
+
* It returns the three-state verdict deliberately — `verified` /
|
|
80
|
+
* `regressed` / `unverifiable`. A flat `Set<string>` cannot express "I
|
|
81
|
+
* could not check", so every item merely absent from it reads as
|
|
82
|
+
* not-merged, and this runner would respawn a child to redo work that may
|
|
83
|
+
* already be done. See the verdict handling in `runRound` below.
|
|
84
|
+
*
|
|
85
|
+
* HISTORY: this defaulted to a no-op that returned an EMPTY SET
|
|
86
|
+
* unconditionally, documented in place as "production callers should pass
|
|
87
|
+
* a real one". No production caller ever did. The consequence was that the
|
|
88
|
+
* all-items-merged stop condition could never fire, `outcome: 'complete'`
|
|
89
|
+
* was unreachable, and a round whose items were all merged still spawned a
|
|
90
|
+
* child to redo them. The default is now the real verifier precisely so a
|
|
91
|
+
* caller cannot forget: a seam whose default silently reports "nothing
|
|
92
|
+
* verified" is indistinguishable, to its caller, from "nothing is merged".
|
|
93
|
+
*/
|
|
94
|
+
verifyMergedItems?: (childIds: string[]) => Promise<MergedVerificationResult>;
|
|
95
|
+
/**
|
|
96
|
+
* Canonical-main ref for the merge-base check. Defaults to the resolved
|
|
97
|
+
* canonical ref (see `resolveCanonicalMainRef`), which matters on a
|
|
98
|
+
* fork-origin agent home where `origin/main` does not contain the merge
|
|
99
|
+
* commit and every healthy item would otherwise read as regressed.
|
|
80
100
|
*/
|
|
81
|
-
|
|
101
|
+
mergeBaseBranch?: string;
|
|
82
102
|
}
|
|
83
|
-
|
|
103
|
+
/**
|
|
104
|
+
* `unverifiable` is NOT a soft `partially-complete`. It means the runner could
|
|
105
|
+
* not establish whether the round's work is done, so it has no verdict to
|
|
106
|
+
* record and no basis to redo the work either.
|
|
107
|
+
*/
|
|
108
|
+
export type RoundOutcome = 'complete' | 'partially-complete' | 'failed' | 'halted' | 'unverifiable';
|
|
84
109
|
export interface RunRoundResult {
|
|
85
110
|
outcome: RoundOutcome;
|
|
86
111
|
/** Verified-merged itemIds. */
|
|
@@ -106,6 +131,23 @@ export interface RunRoundDeps {
|
|
|
106
131
|
* Run one round to completion. Caller is expected to preflight first.
|
|
107
132
|
*/
|
|
108
133
|
export declare function runRound(input: RunRoundInput, deps: RunRoundDeps): Promise<RunRoundResult>;
|
|
134
|
+
/**
|
|
135
|
+
* Resolve the ref that actually holds canonical `main` for this checkout.
|
|
136
|
+
*
|
|
137
|
+
* On a fork-origin agent home `origin/main` does NOT contain the canonical
|
|
138
|
+
* merge commit, so a merge-base check against it reports every healthy item
|
|
139
|
+
* as regressed. Falls back to the documented `origin/main` when `gh` or the
|
|
140
|
+
* remote mapping is unavailable (canonical-origin installs).
|
|
141
|
+
*
|
|
142
|
+
* Lives here rather than in the server layer because BOTH consumers — the
|
|
143
|
+
* lazy reconciler in `routes.ts` and this round runner — need the same
|
|
144
|
+
* resolution, and a core module must not import from `server/`.
|
|
145
|
+
*
|
|
146
|
+
* READ-ONLY: `gh repo view` + `git remote -v` (the latter via
|
|
147
|
+
* SafeGitExecutor.readSync — `remote` is a READONLY_GIT_VERB, shape-checked
|
|
148
|
+
* to list/get-url only).
|
|
149
|
+
*/
|
|
150
|
+
export declare function resolveCanonicalMainRef(repoPath: string): string;
|
|
109
151
|
/**
|
|
110
152
|
* Three-state outcome. `unverifiable` is NOT a soft `regressed`: it means the
|
|
111
153
|
* check could not be run at all, and collapsing the two is how a refusal becomes
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectRoundExecution.d.ts","sourceRoot":"","sources":["../../src/core/ProjectRoundExecution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAIH,OAAO,KAAK,EAAc,iBAAiB,EAAe,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"ProjectRoundExecution.d.ts","sourceRoot":"","sources":["../../src/core/ProjectRoundExecution.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AAIH,OAAO,KAAK,EAAc,iBAAiB,EAAe,MAAM,wBAAwB,CAAC;AAMzF,sEAAsE;AACtE,eAAO,MAAM,wBAAwB,QAAS,CAAC;AAC/C,eAAO,MAAM,wBAAwB,OAAQ,CAAC;AAC9C,gDAAgD;AAChD,eAAO,MAAM,2BAA2B,IAAI,CAAC;AAE7C,MAAM,WAAW,aAAa;IAC5B,OAAO,EAAE,iBAAiB,CAAC;IAC3B,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB;;;OAGG;IACH,cAAc,EAAE,MAAM,CAAC;IAEvB;;;;OAIG;IACH,cAAc,CAAC,EAAE,MAAM,CAAC;IAExB;;;;;;;;;OASG;IACH,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,EAAE,MAAM,EAAE,CAAC;IAErB,qCAAqC;IACrC,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,6CAA6C;IAC7C,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,gEAAgE;IAChE,iBAAiB,CAAC,EAAE,MAAM,CAAC;IAE3B;;;;;;;;;;;;;;;;;;OAkBG;IACH,iBAAiB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC,wBAAwB,CAAC,CAAC;IAE9E;;;;;OAKG;IACH,eAAe,CAAC,EAAE,MAAM,CAAC;CAC1B;AAED;;;;GAIG;AACH,MAAM,MAAM,YAAY,GACpB,UAAU,GACV,oBAAoB,GACpB,QAAQ,GACR,QAAQ,GACR,cAAc,CAAC;AAEnB,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,YAAY,CAAC;IACtB,+BAA+B;IAC/B,aAAa,EAAE,MAAM,EAAE,CAAC;IACxB,oFAAoF;IACpF,eAAe,EAAE,MAAM,EAAE,CAAC;IAC1B,mFAAmF;IACnF,aAAa,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,cAAc,EAAE,MAAM,CAAC;IACvB,mEAAmE;IACnE,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED;;GAEG;AACH,wBAAsB,QAAQ,CAAC,KAAK,EAAE,aAAa,EAAE,IAAI,EAAE,YAAY,GAAG,OAAO,CAAC,cAAc,CAAC,CA0NhG;AAiLD;;;;;;;;;;;;;;;GAeG;AACH,wBAAgB,uBAAuB,CAAC,QAAQ,EAAE,MAAM,GAAG,MAAM,CA2ChE;AAED;;;;;GAKG;AACH,MAAM,WAAW,wBAAwB;IACvC,oDAAoD;IACpD,QAAQ,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACtB,gEAAgE;IAChE,SAAS,EAAE,GAAG,CAAC,MAAM,CAAC,CAAC;IACvB,gFAAgF;IAChF,YAAY,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CACnC;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,wBAAsB,uBAAuB,CAC3C,cAAc,EAAE,MAAM,EACtB,QAAQ,EAAE,MAAM,EAAE,EAClB,OAAO,EAAE,iBAAiB;AAC1B;mFACmF;AACnF,eAAe,GAAE,MAAsB,GACtC,OAAO,CAAC,wBAAwB,CAAC,CAmCnC"}
|
|
@@ -33,10 +33,11 @@
|
|
|
33
33
|
* for group signals) targets only the child's group — never reaps
|
|
34
34
|
* the runner.
|
|
35
35
|
*/
|
|
36
|
-
import { spawn } from 'node:child_process';
|
|
36
|
+
import { spawn, execFileSync } from 'node:child_process';
|
|
37
37
|
import { ProjectRoundLock } from './ProjectRoundLock.js';
|
|
38
38
|
import { ProjectRoundWorktrees } from './ProjectRoundWorktrees.js';
|
|
39
39
|
import { SafeGitExecutor } from './SafeGitExecutor.js';
|
|
40
|
+
import { withSyncOp } from './InFlightSyncOpMarker.js';
|
|
40
41
|
/** Per-spec defaults. Tests dial both down to keep the suite fast. */
|
|
41
42
|
export const DEFAULT_POLL_INTERVAL_MS = 60_000;
|
|
42
43
|
export const DEFAULT_SIGTERM_GRACE_MS = 5_000;
|
|
@@ -49,7 +50,25 @@ export async function runRound(input, deps) {
|
|
|
49
50
|
const pollIntervalMs = input.pollIntervalMs ?? DEFAULT_POLL_INTERVAL_MS;
|
|
50
51
|
const sigtermGraceMs = input.sigtermGraceMs ?? DEFAULT_SIGTERM_GRACE_MS;
|
|
51
52
|
const maxResumeAttempts = input.maxResumeAttempts ?? DEFAULT_MAX_RESUME_ATTEMPTS;
|
|
52
|
-
|
|
53
|
+
/**
|
|
54
|
+
* The items that are GENUINELY uncheckable: absent from `verified` for a
|
|
55
|
+
* reason the runner could not establish, AND carrying a merge commit that
|
|
56
|
+
* says work may already have landed.
|
|
57
|
+
*
|
|
58
|
+
* An item with no `mergeCommitOid` is also reported `unverifiable` by the
|
|
59
|
+
* git verifier, but that is not the same claim — it means nothing has landed
|
|
60
|
+
* yet, which is ordinary. Splitting on EVIDENCE rather than on the reason
|
|
61
|
+
* text keeps a reworded message from silently changing control flow.
|
|
62
|
+
*
|
|
63
|
+
* Defined once and used at BOTH decision points. The first draft of this
|
|
64
|
+
* change inlined it at the pre-spawn check only, and the post-exit check
|
|
65
|
+
* kept the old conflation — caught by the test that asserts a fresh round
|
|
66
|
+
* still spawns.
|
|
67
|
+
*/
|
|
68
|
+
const uncheckable = (ids, v) => ids.filter((id) => v.unverifiable.has(id) && Boolean(input.tracker.get(id)?.mergeCommitOid));
|
|
69
|
+
const mergeBaseBranch = input.mergeBaseBranch ?? resolveCanonicalMainRef(input.targetRepoPath);
|
|
70
|
+
const verifyMergedItems = input.verifyMergedItems ??
|
|
71
|
+
((ids) => verifyMergedItemsViaGit(input.targetRepoPath, ids, input.tracker, mergeBaseBranch));
|
|
53
72
|
const lock = new ProjectRoundLock({ stateDir: deps.stateDir });
|
|
54
73
|
// Step 1: acquire lock.
|
|
55
74
|
const acquired = lock.acquire(input.projectId, input.roundIndex);
|
|
@@ -112,12 +131,36 @@ export async function runRound(input, deps) {
|
|
|
112
131
|
break;
|
|
113
132
|
}
|
|
114
133
|
// Compute current stop condition: itemIds verified-merged.
|
|
115
|
-
const
|
|
116
|
-
if (lastItemIds.every((id) => verified.has(id))) {
|
|
134
|
+
const verdict = await verifyMergedItems(lastItemIds);
|
|
135
|
+
if (lastItemIds.every((id) => verdict.verified.has(id))) {
|
|
117
136
|
outcome = 'complete';
|
|
118
137
|
mergedItemIds = [...lastItemIds];
|
|
119
138
|
break;
|
|
120
139
|
}
|
|
140
|
+
// "I could not check" is not "not done" — but neither is it a reason to
|
|
141
|
+
// stall a round that has simply not been worked yet.
|
|
142
|
+
//
|
|
143
|
+
// `verifyMergedItemsViaGit` reports `unverifiable` for BOTH of these:
|
|
144
|
+
// (a) the item records no mergeCommitOid at all — nothing has landed
|
|
145
|
+
// yet, which is the ordinary state of a fresh round. Spawning is
|
|
146
|
+
// exactly right here.
|
|
147
|
+
// (b) the item DOES record a merge commit, but git could not answer
|
|
148
|
+
// (guard refusal, missing binary, bad ref). Here the work may
|
|
149
|
+
// already be done, and spawning would redo it.
|
|
150
|
+
//
|
|
151
|
+
// They are told apart by EVIDENCE — whether the item carries a
|
|
152
|
+
// mergeCommitOid — not by matching the reason text, which would make a
|
|
153
|
+
// reworded message silently change the control flow.
|
|
154
|
+
const uncheckableWithEvidence = uncheckable(lastItemIds, verdict);
|
|
155
|
+
if (uncheckableWithEvidence.length > 0) {
|
|
156
|
+
outcome = 'unverifiable';
|
|
157
|
+
unmergedItemIds = lastItemIds.filter((id) => !verdict.verified.has(id));
|
|
158
|
+
reason =
|
|
159
|
+
`could not verify ${uncheckableWithEvidence.length} item(s) that DO record a merge commit ` +
|
|
160
|
+
`(${uncheckableWithEvidence.join(', ')}); refusing to respawn work that may already be done, ` +
|
|
161
|
+
'and recording no round verdict';
|
|
162
|
+
break;
|
|
163
|
+
}
|
|
121
164
|
// Spawn the autonomous child with stop condition + ids in env.
|
|
122
165
|
const child = spawnAutonomousChild(input, lastItemIds);
|
|
123
166
|
const exit = await waitForExitOrPollChange(child, input.tracker, input.projectId, input.roundIndex, lastItemIds, pollIntervalMs, sigtermGraceMs);
|
|
@@ -143,13 +186,29 @@ export async function runRound(input, deps) {
|
|
|
143
186
|
// Natural exit.
|
|
144
187
|
if (exit.kind === 'exited' && exit.code === 0) {
|
|
145
188
|
// Step 6: verify per-item artifacts.
|
|
146
|
-
const
|
|
147
|
-
mergedItemIds = lastItemIds.filter((id) =>
|
|
148
|
-
unmergedItemIds = lastItemIds.filter((id) => !
|
|
149
|
-
|
|
189
|
+
const final = await verifyMergedItems(lastItemIds);
|
|
190
|
+
mergedItemIds = lastItemIds.filter((id) => final.verified.has(id));
|
|
191
|
+
unmergedItemIds = lastItemIds.filter((id) => !final.verified.has(id));
|
|
192
|
+
const finalUncheckable = uncheckable(unmergedItemIds, final);
|
|
193
|
+
if (unmergedItemIds.length === 0) {
|
|
150
194
|
outcome = 'complete';
|
|
151
|
-
|
|
195
|
+
}
|
|
196
|
+
else if (finalUncheckable.length > 0) {
|
|
197
|
+
// At least one item RECORDS a merge commit the runner could not
|
|
198
|
+
// check. `partially-complete` asserts "this genuinely did not land",
|
|
199
|
+
// which that item cannot support — so no verdict is recorded.
|
|
200
|
+
//
|
|
201
|
+
// An item with no merge commit at all, by contrast, genuinely did
|
|
202
|
+
// not land after a clean child exit, and falls through to
|
|
203
|
+
// partially-complete below where it belongs.
|
|
204
|
+
outcome = 'unverifiable';
|
|
205
|
+
reason =
|
|
206
|
+
`child exited 0 but ${finalUncheckable.length} item(s) recording a merge commit ` +
|
|
207
|
+
`could not be checked (${finalUncheckable.join(', ')}); no round verdict recorded`;
|
|
208
|
+
}
|
|
209
|
+
else {
|
|
152
210
|
outcome = 'partially-complete';
|
|
211
|
+
}
|
|
153
212
|
break;
|
|
154
213
|
}
|
|
155
214
|
// Non-zero exit → resume attempt.
|
|
@@ -201,12 +260,19 @@ async function recordOutcome(tracker, projectId, roundIndex, outcome) {
|
|
|
201
260
|
const proj = tracker.get(projectId);
|
|
202
261
|
if (!proj)
|
|
203
262
|
return;
|
|
263
|
+
// `unverifiable` has NO status. Every other outcome is a verdict the runner
|
|
264
|
+
// actually reached; this one is the absence of one, so the round keeps the
|
|
265
|
+
// status it had and gets asked again later. Mapping it onto `failed` or
|
|
266
|
+
// `partially-complete` would record a conclusion nothing established — the
|
|
267
|
+
// precise move that made a no-op verifier look like a healthy answer.
|
|
204
268
|
const map = {
|
|
205
269
|
complete: 'complete',
|
|
206
270
|
'partially-complete': 'partially-complete',
|
|
207
271
|
failed: 'failed',
|
|
208
272
|
halted: 'failed',
|
|
209
273
|
};
|
|
274
|
+
if (outcome === 'unverifiable')
|
|
275
|
+
return;
|
|
210
276
|
const newStatus = map[outcome];
|
|
211
277
|
const completedAt = new Date().toISOString();
|
|
212
278
|
const rounds = (proj.rounds ?? []).map((r, i) => i === roundIndex ? { ...r, status: newStatus, completedAt } : r);
|
|
@@ -315,29 +381,67 @@ function sleep(ms) {
|
|
|
315
381
|
return new Promise((resolve) => setTimeout(resolve, ms));
|
|
316
382
|
}
|
|
317
383
|
/**
|
|
318
|
-
*
|
|
319
|
-
*
|
|
320
|
-
*
|
|
321
|
-
*
|
|
384
|
+
* Resolve the ref that actually holds canonical `main` for this checkout.
|
|
385
|
+
*
|
|
386
|
+
* On a fork-origin agent home `origin/main` does NOT contain the canonical
|
|
387
|
+
* merge commit, so a merge-base check against it reports every healthy item
|
|
388
|
+
* as regressed. Falls back to the documented `origin/main` when `gh` or the
|
|
389
|
+
* remote mapping is unavailable (canonical-origin installs).
|
|
322
390
|
*
|
|
323
|
-
*
|
|
324
|
-
*
|
|
325
|
-
*
|
|
326
|
-
*
|
|
327
|
-
*
|
|
328
|
-
*
|
|
391
|
+
* Lives here rather than in the server layer because BOTH consumers — the
|
|
392
|
+
* lazy reconciler in `routes.ts` and this round runner — need the same
|
|
393
|
+
* resolution, and a core module must not import from `server/`.
|
|
394
|
+
*
|
|
395
|
+
* READ-ONLY: `gh repo view` + `git remote -v` (the latter via
|
|
396
|
+
* SafeGitExecutor.readSync — `remote` is a READONLY_GIT_VERB, shape-checked
|
|
397
|
+
* to list/get-url only).
|
|
329
398
|
*/
|
|
330
|
-
function
|
|
331
|
-
|
|
332
|
-
|
|
333
|
-
//
|
|
334
|
-
//
|
|
335
|
-
//
|
|
336
|
-
//
|
|
337
|
-
//
|
|
338
|
-
|
|
339
|
-
|
|
340
|
-
|
|
399
|
+
export function resolveCanonicalMainRef(repoPath) {
|
|
400
|
+
const FALLBACK = 'origin/main';
|
|
401
|
+
try {
|
|
402
|
+
// `gh repo view` is a BLOCKING spawn and this runs inside the server
|
|
403
|
+
// process (the auto-advance poller calls runRound). It funnels through
|
|
404
|
+
// withSyncOp so the in-flight marker sees the stall instead of it looking
|
|
405
|
+
// like an unexplained event-loop freeze.
|
|
406
|
+
//
|
|
407
|
+
// In `routes.ts` this callsite sat on the chokepoint lint's frozen
|
|
408
|
+
// baseline — grandfathered, not blessed. Moving it into core made it a NEW
|
|
409
|
+
// violation, and the lint refused it. That refusal is the useful part: it
|
|
410
|
+
// stopped a pre-existing blocking hazard from spreading into a module the
|
|
411
|
+
// round runner calls on every pass.
|
|
412
|
+
const GH_ARGS = ['repo', 'view', '--json', 'nameWithOwner', '-q', '.nameWithOwner'];
|
|
413
|
+
const GH_OPTS = {
|
|
414
|
+
cwd: repoPath,
|
|
415
|
+
encoding: 'utf-8',
|
|
416
|
+
stdio: ['ignore', 'pipe', 'ignore'],
|
|
417
|
+
};
|
|
418
|
+
// The wrap must sit on the SAME LINE as the spawn: the chokepoint lint is a
|
|
419
|
+
// deliberately lexical, same-line matcher (it documents that it cannot prove
|
|
420
|
+
// runtime wrapping — that is the marker's own unit test's job). A cheap
|
|
421
|
+
// signal, not an authority, so it is satisfied literally.
|
|
422
|
+
const ghRepo = withSyncOp(() => execFileSync('gh', GH_ARGS, GH_OPTS)).trim();
|
|
423
|
+
if (!ghRepo)
|
|
424
|
+
return FALLBACK;
|
|
425
|
+
const remotesOut = SafeGitExecutor.readSync(['remote', '-v'], {
|
|
426
|
+
cwd: repoPath,
|
|
427
|
+
operation: 'ProjectRoundExecution.resolveCanonicalMainRef',
|
|
428
|
+
encoding: 'utf-8',
|
|
429
|
+
});
|
|
430
|
+
for (const line of remotesOut.split('\n')) {
|
|
431
|
+
// format: "<name>\t<url> (fetch)"
|
|
432
|
+
const m = /^(\S+)\s+(\S+)\s+\(fetch\)/.exec(line.trim());
|
|
433
|
+
if (!m)
|
|
434
|
+
continue;
|
|
435
|
+
const [, name, url] = m;
|
|
436
|
+
if (url.includes(ghRepo) || url.includes(`${ghRepo}.git`)) {
|
|
437
|
+
return `${name}/main`;
|
|
438
|
+
}
|
|
439
|
+
}
|
|
440
|
+
return FALLBACK;
|
|
441
|
+
}
|
|
442
|
+
catch { /* @silent-fallback-ok: resolving the canonical-main ref is best-effort — gh missing / not-a-gh-repo / git error falls back to the documented `origin/main` default (the prior behavior), which the merge-base gate then re-validates. Not a degradation: it's the conservative default this resolver exists to refine, not replace. */
|
|
443
|
+
return FALLBACK;
|
|
444
|
+
}
|
|
341
445
|
}
|
|
342
446
|
/**
|
|
343
447
|
* Helper exported so callers can wire a SafeGit-backed verifier.
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ProjectRoundExecution.js","sourceRoot":"","sources":["../../src/core/ProjectRoundExecution.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"ProjectRoundExecution.js","sourceRoot":"","sources":["../../src/core/ProjectRoundExecution.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RecurrenceActuator — turns a recurrence finding into tracked work, once.
|
|
3
|
+
*
|
|
4
|
+
* `RecurrenceReader` makes recurrence VISIBLE. Visibility is not the goal: the
|
|
5
|
+
* project's whole diagnosis is that instar notices constantly and closes almost
|
|
6
|
+
* nothing (filing-to-completion ≈ 30:1). A reader that produces a beautiful
|
|
7
|
+
* report which nobody acts on would be the 30:1 ratio with better typography.
|
|
8
|
+
*
|
|
9
|
+
* Operator directive, 2026-07-26 20:08Z: *"the synthesis itself must lead to
|
|
10
|
+
* ACTION and a fully closed loop"*, with as little user dependence as possible.
|
|
11
|
+
*
|
|
12
|
+
* So this proposes ONE thing, through a path that already exists: for a cluster
|
|
13
|
+
* that genuinely recurs and that nobody has ever turned into work, create a
|
|
14
|
+
* tracked action on the EXISTING evolution action queue. That closes the loop —
|
|
15
|
+
* noticed repeatedly → becomes real work → appears where work is tracked → gets
|
|
16
|
+
* done or explicitly cancelled.
|
|
17
|
+
*
|
|
18
|
+
* WHAT THIS IS NOT:
|
|
19
|
+
* - Not a new notification channel. The single funniest way to fail at fixing
|
|
20
|
+
* "we notice things and never close them" is to build a fourth place that
|
|
21
|
+
* notices things. Nothing here notifies anybody.
|
|
22
|
+
* - Not authority. Creating a tracked action QUEUES work for a human or agent to
|
|
23
|
+
* judge. It does not close, prioritise, escalate, or act on anything.
|
|
24
|
+
* - Not a bulk importer. See "the fix must not become its own pile" below.
|
|
25
|
+
*/
|
|
26
|
+
import type { RecurrenceReport } from './RecurrenceReader.js';
|
|
27
|
+
/** A proposed piece of tracked work. The caller performs the actual write. */
|
|
28
|
+
export interface ProposedAction {
|
|
29
|
+
title: string;
|
|
30
|
+
description: string;
|
|
31
|
+
priority: 'critical' | 'high' | 'medium' | 'low';
|
|
32
|
+
/**
|
|
33
|
+
* Stable key derived from the cluster, so a re-run UPDATES rather than
|
|
34
|
+
* duplicates. Without this the actuator would itself become a generator of
|
|
35
|
+
* repeated noticings — the precise disease it treats.
|
|
36
|
+
*/
|
|
37
|
+
externalKey: string;
|
|
38
|
+
/** The cluster this came from, for the caller's audit trail. */
|
|
39
|
+
sourceKey: string;
|
|
40
|
+
observedCount: number;
|
|
41
|
+
}
|
|
42
|
+
export type ActuationRefusal = {
|
|
43
|
+
reason: 'actions-store-unreadable';
|
|
44
|
+
detail: string;
|
|
45
|
+
} | {
|
|
46
|
+
reason: 'no-qualifying-clusters';
|
|
47
|
+
detail: string;
|
|
48
|
+
};
|
|
49
|
+
export interface ActuationPlan {
|
|
50
|
+
/** Empty when `refused` is set. */
|
|
51
|
+
propose: ProposedAction[];
|
|
52
|
+
/** Set when the actuator declined to act at all, with why. */
|
|
53
|
+
refused?: ActuationRefusal;
|
|
54
|
+
/** Clusters that qualified but were held back by the per-run cap. */
|
|
55
|
+
deferredByCap: number;
|
|
56
|
+
/** Always present, so a caller can report honestly even on a refusal. */
|
|
57
|
+
consideredClusters: number;
|
|
58
|
+
}
|
|
59
|
+
export interface ActuationOptions {
|
|
60
|
+
/**
|
|
61
|
+
* A thing seen twice is not yet a pattern worth spending a work item on.
|
|
62
|
+
* Default 10: high enough that a proposal is obviously justified by volume.
|
|
63
|
+
*/
|
|
64
|
+
minCount?: number;
|
|
65
|
+
/**
|
|
66
|
+
* Hard cap per run. 69 qualifying clusters turned into 69 action items would
|
|
67
|
+
* be a new backlog wearing a different hat — the fix becoming its own pile.
|
|
68
|
+
* A small cap converges across sessions instead, densest-first.
|
|
69
|
+
*/
|
|
70
|
+
maxPerRun?: number;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Decide what work to propose from a recurrence report.
|
|
74
|
+
*
|
|
75
|
+
* Pure: it returns a PLAN. The caller writes it, so the write path (and its
|
|
76
|
+
* gating) stays exactly where it already is.
|
|
77
|
+
*/
|
|
78
|
+
export declare function planActuation(report: RecurrenceReport, opts?: ActuationOptions): ActuationPlan;
|
|
79
|
+
//# sourceMappingURL=RecurrenceActuator.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecurrenceActuator.d.ts","sourceRoot":"","sources":["../../src/core/RecurrenceActuator.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AAEH,OAAO,KAAK,EAAqB,gBAAgB,EAAE,MAAM,uBAAuB,CAAC;AAEjF,8EAA8E;AAC9E,MAAM,WAAW,cAAc;IAC7B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,UAAU,GAAG,MAAM,GAAG,QAAQ,GAAG,KAAK,CAAC;IACjD;;;;OAIG;IACH,WAAW,EAAE,MAAM,CAAC;IACpB,gEAAgE;IAChE,SAAS,EAAE,MAAM,CAAC;IAClB,aAAa,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,MAAM,gBAAgB,GACxB;IAAE,MAAM,EAAE,0BAA0B,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GACtD;IAAE,MAAM,EAAE,wBAAwB,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC;AAEzD,MAAM,WAAW,aAAa;IAC5B,mCAAmC;IACnC,OAAO,EAAE,cAAc,EAAE,CAAC;IAC1B,8DAA8D;IAC9D,OAAO,CAAC,EAAE,gBAAgB,CAAC;IAC3B,qEAAqE;IACrE,aAAa,EAAE,MAAM,CAAC;IACtB,yEAAyE;IACzE,kBAAkB,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,gBAAgB;IAC/B;;;OAGG;IACH,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB;;;;OAIG;IACH,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED;;;;;GAKG;AACH,wBAAgB,aAAa,CAC3B,MAAM,EAAE,gBAAgB,EACxB,IAAI,GAAE,gBAAqB,GAC1B,aAAa,CAyDf"}
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* RecurrenceActuator — turns a recurrence finding into tracked work, once.
|
|
3
|
+
*
|
|
4
|
+
* `RecurrenceReader` makes recurrence VISIBLE. Visibility is not the goal: the
|
|
5
|
+
* project's whole diagnosis is that instar notices constantly and closes almost
|
|
6
|
+
* nothing (filing-to-completion ≈ 30:1). A reader that produces a beautiful
|
|
7
|
+
* report which nobody acts on would be the 30:1 ratio with better typography.
|
|
8
|
+
*
|
|
9
|
+
* Operator directive, 2026-07-26 20:08Z: *"the synthesis itself must lead to
|
|
10
|
+
* ACTION and a fully closed loop"*, with as little user dependence as possible.
|
|
11
|
+
*
|
|
12
|
+
* So this proposes ONE thing, through a path that already exists: for a cluster
|
|
13
|
+
* that genuinely recurs and that nobody has ever turned into work, create a
|
|
14
|
+
* tracked action on the EXISTING evolution action queue. That closes the loop —
|
|
15
|
+
* noticed repeatedly → becomes real work → appears where work is tracked → gets
|
|
16
|
+
* done or explicitly cancelled.
|
|
17
|
+
*
|
|
18
|
+
* WHAT THIS IS NOT:
|
|
19
|
+
* - Not a new notification channel. The single funniest way to fail at fixing
|
|
20
|
+
* "we notice things and never close them" is to build a fourth place that
|
|
21
|
+
* notices things. Nothing here notifies anybody.
|
|
22
|
+
* - Not authority. Creating a tracked action QUEUES work for a human or agent to
|
|
23
|
+
* judge. It does not close, prioritise, escalate, or act on anything.
|
|
24
|
+
* - Not a bulk importer. See "the fix must not become its own pile" below.
|
|
25
|
+
*/
|
|
26
|
+
/**
|
|
27
|
+
* Decide what work to propose from a recurrence report.
|
|
28
|
+
*
|
|
29
|
+
* Pure: it returns a PLAN. The caller writes it, so the write path (and its
|
|
30
|
+
* gating) stays exactly where it already is.
|
|
31
|
+
*/
|
|
32
|
+
export function planActuation(report, opts = {}) {
|
|
33
|
+
const minCount = opts.minCount ?? 10;
|
|
34
|
+
const maxPerRun = opts.maxPerRun ?? 3;
|
|
35
|
+
// THE REFUSAL, and it is sharper than the reader's.
|
|
36
|
+
//
|
|
37
|
+
// The reader withholds a VERDICT on any partial read. The actuator must
|
|
38
|
+
// withhold the ACTION — but only one missing store actually invalidates the
|
|
39
|
+
// decision, and conflating them would be lazy symmetry:
|
|
40
|
+
//
|
|
41
|
+
// attention/sentinel unreadable → the reader saw FEWER observations. Counts
|
|
42
|
+
// are understated, so a cluster that qualifies still genuinely qualifies.
|
|
43
|
+
// Acting is conservative and safe.
|
|
44
|
+
//
|
|
45
|
+
// ACTIONS unreadable → `tracked` is UNKNOWABLE for every cluster, because
|
|
46
|
+
// `tracked` means "a member came from the action queue". Every cluster
|
|
47
|
+
// would look untracked. Acting would duplicate work that may already
|
|
48
|
+
// exist — the actuator would manufacture the exact redundancy it exists to
|
|
49
|
+
// remove, and do it under the banner of fixing it.
|
|
50
|
+
//
|
|
51
|
+
// So: actions-store unreadable ⇒ propose NOTHING, and say why.
|
|
52
|
+
const actionsUnreadable = report.coverage.unreadable.find((u) => u.store === 'actions');
|
|
53
|
+
if (actionsUnreadable) {
|
|
54
|
+
return {
|
|
55
|
+
propose: [],
|
|
56
|
+
refused: {
|
|
57
|
+
reason: 'actions-store-unreadable',
|
|
58
|
+
detail: `the action queue could not be read (${actionsUnreadable.reason}), so "has anyone already ` +
|
|
59
|
+
'committed to this?" is unanswerable for every cluster. Proposing work now would duplicate ' +
|
|
60
|
+
'whatever is already tracked. No actions proposed.',
|
|
61
|
+
},
|
|
62
|
+
deferredByCap: 0,
|
|
63
|
+
consideredClusters: report.clusters.length,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
const qualifying = report.clusters.filter((c) => !c.tracked && c.count >= minCount);
|
|
67
|
+
if (qualifying.length === 0) {
|
|
68
|
+
return {
|
|
69
|
+
propose: [],
|
|
70
|
+
refused: {
|
|
71
|
+
reason: 'no-qualifying-clusters',
|
|
72
|
+
detail: `no untracked cluster reached the minCount=${minCount} threshold`,
|
|
73
|
+
},
|
|
74
|
+
deferredByCap: 0,
|
|
75
|
+
consideredClusters: report.clusters.length,
|
|
76
|
+
};
|
|
77
|
+
}
|
|
78
|
+
const selected = qualifying.slice(0, maxPerRun);
|
|
79
|
+
return {
|
|
80
|
+
propose: selected.map(toProposedAction),
|
|
81
|
+
deferredByCap: qualifying.length - selected.length,
|
|
82
|
+
consideredClusters: report.clusters.length,
|
|
83
|
+
};
|
|
84
|
+
}
|
|
85
|
+
/** Priority from volume alone — deterministic, no model, no judgment. */
|
|
86
|
+
function priorityFor(count) {
|
|
87
|
+
if (count >= 100)
|
|
88
|
+
return 'high';
|
|
89
|
+
if (count >= 25)
|
|
90
|
+
return 'medium';
|
|
91
|
+
return 'low';
|
|
92
|
+
}
|
|
93
|
+
function toProposedAction(c) {
|
|
94
|
+
const span = c.firstSeen && c.lastSeen && c.firstSeen !== c.lastSeen
|
|
95
|
+
? ` between ${c.firstSeen} and ${c.lastSeen}`
|
|
96
|
+
: '';
|
|
97
|
+
return {
|
|
98
|
+
title: `Recurring, untracked: ${c.exemplar.slice(0, 90)}`,
|
|
99
|
+
description: `Noticed ${c.count} times${span} across ${c.stores.join(', ')}` +
|
|
100
|
+
(c.sources.length ? ` (sources: ${c.sources.slice(0, 5).join(', ')})` : '') +
|
|
101
|
+
`, and never turned into tracked work.\n\n` +
|
|
102
|
+
'Surfaced by RecurrenceReader, which groups observations across the attention queue, the ' +
|
|
103
|
+
'action queue and the sentinel log. The individual noticings are each minor and each true; ' +
|
|
104
|
+
'the VOLUME is the finding.\n\n' +
|
|
105
|
+
'This action exists so the recurrence is either fixed or deliberately dismissed, rather than ' +
|
|
106
|
+
'noticed a further N times. Cancelling it IS a valid outcome — an explicit decision beats ' +
|
|
107
|
+
'silent accumulation.',
|
|
108
|
+
priority: priorityFor(c.count),
|
|
109
|
+
// Stable across runs: the same cluster always maps to the same key, so a
|
|
110
|
+
// second pass updates one row instead of adding another.
|
|
111
|
+
externalKey: `recurrence:${c.key}`,
|
|
112
|
+
sourceKey: c.key,
|
|
113
|
+
observedCount: c.count,
|
|
114
|
+
};
|
|
115
|
+
}
|
|
116
|
+
//# sourceMappingURL=RecurrenceActuator.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"RecurrenceActuator.js","sourceRoot":"","sources":["../../src/core/RecurrenceActuator.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* recurrenceLoop — the caller that makes the loop actually close.
|
|
3
|
+
*
|
|
4
|
+
* `RecurrenceReader` sees. `RecurrenceActuator` decides. Neither touches a store,
|
|
5
|
+
* which is what keeps both pure and testable — but it also meant "the loop
|
|
6
|
+
* closes" was a DESIGNED property and not a demonstrated one. This is the piece
|
|
7
|
+
* that demonstrates it: it reads the three stores, plans, and writes the result
|
|
8
|
+
* through the caller-supplied action-creation function.
|
|
9
|
+
*
|
|
10
|
+
* It is deliberately the ONLY place in this feature that performs I/O, so every
|
|
11
|
+
* read failure has exactly one place to be reported from and cannot be swallowed
|
|
12
|
+
* somewhere in the middle.
|
|
13
|
+
*
|
|
14
|
+
* Operator directive 2026-07-26 20:08Z: synthesis must lead to ACTION, through
|
|
15
|
+
* paths that already exist, with the loop closed and minimal user dependence.
|
|
16
|
+
*/
|
|
17
|
+
import { type Observation, type RecurrenceReport } from './RecurrenceReader.js';
|
|
18
|
+
import { type ActuationOptions, type ProposedAction } from './RecurrenceActuator.js';
|
|
19
|
+
/** Reads one store. Returning a rejected promise is how it reports "unreadable". */
|
|
20
|
+
export type StoreReader = () => Promise<Observation[]>;
|
|
21
|
+
export interface LoopDeps {
|
|
22
|
+
readAttention: StoreReader;
|
|
23
|
+
readActions: StoreReader;
|
|
24
|
+
readSentinel: StoreReader;
|
|
25
|
+
/**
|
|
26
|
+
* Creates ONE tracked action. The caller supplies this so the write goes
|
|
27
|
+
* through whatever path it already uses, with whatever gating that path
|
|
28
|
+
* already has. This module never constructs an HTTP call itself.
|
|
29
|
+
*/
|
|
30
|
+
createAction: (a: ProposedAction) => Promise<{
|
|
31
|
+
id: string;
|
|
32
|
+
}>;
|
|
33
|
+
}
|
|
34
|
+
export interface LoopResult {
|
|
35
|
+
report: RecurrenceReport;
|
|
36
|
+
/** Actions actually created, with the ids the store returned. */
|
|
37
|
+
created: {
|
|
38
|
+
id: string;
|
|
39
|
+
title: string;
|
|
40
|
+
observedCount: number;
|
|
41
|
+
}[];
|
|
42
|
+
/** Set when the actuator declined; `created` is then empty. */
|
|
43
|
+
refused?: {
|
|
44
|
+
reason: string;
|
|
45
|
+
detail: string;
|
|
46
|
+
};
|
|
47
|
+
/** Qualifying clusters held back by the per-run cap. */
|
|
48
|
+
deferredByCap: number;
|
|
49
|
+
/**
|
|
50
|
+
* Proposals whose WRITE failed. Distinct from `refused` (a decision not to
|
|
51
|
+
* act) — this is a decision to act that did not land, and conflating the two
|
|
52
|
+
* would hide real breakage behind a principled-looking refusal.
|
|
53
|
+
*/
|
|
54
|
+
writeFailures: {
|
|
55
|
+
title: string;
|
|
56
|
+
error: string;
|
|
57
|
+
}[];
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Run one pass: read → group → plan → create.
|
|
61
|
+
*
|
|
62
|
+
* Never throws for an unreadable store — that is data, reported in
|
|
63
|
+
* `report.coverage`, and it is what the actuator's refusal reads.
|
|
64
|
+
*/
|
|
65
|
+
export declare function runRecurrenceLoop(deps: LoopDeps, opts?: ActuationOptions): Promise<LoopResult>;
|
|
66
|
+
//# sourceMappingURL=recurrenceLoop.d.ts.map
|