@ai-dossier/sched 0.48.0 → 0.49.0
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/README.md +83 -6
- package/dist/anchor-close.d.ts +160 -0
- package/dist/anchor-close.d.ts.map +1 -1
- package/dist/anchor-close.js +319 -36
- package/dist/anchor-close.js.map +1 -1
- package/dist/batch-dispatch.d.ts.map +1 -1
- package/dist/batch-dispatch.js +67 -0
- package/dist/batch-dispatch.js.map +1 -1
- package/dist/index.d.ts +4 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +23 -5
- package/dist/index.js.map +1 -1
- package/dist/labels.d.ts +9 -0
- package/dist/labels.d.ts.map +1 -1
- package/dist/labels.js +10 -1
- package/dist/labels.js.map +1 -1
- package/dist/status.d.ts +111 -6
- package/dist/status.d.ts.map +1 -1
- package/dist/status.js +253 -4
- package/dist/status.js.map +1 -1
- package/dist/teardown.d.ts +9 -0
- package/dist/teardown.d.ts.map +1 -1
- package/dist/teardown.js +19 -10
- package/dist/teardown.js.map +1 -1
- package/dist/types.d.ts +1 -1
- package/dist/types.d.ts.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -28,7 +28,7 @@ ai-dossier sched enqueue --issues 101,105..109 --deps 100 --tier strong # flag
|
|
|
28
28
|
ai-dossier sched enqueue --from-manifest batch-prep.json # batch-prep output
|
|
29
29
|
ai-dossier sched start # the dispatch engine: spawn, verify, escalate, watch parked PRs (Ctrl-C stops it)
|
|
30
30
|
ai-dossier sched start --once # a single reconcile+refill tick (cron-style)
|
|
31
|
-
ai-dossier sched status # queue (+pr/cleanup), engine lease, slots, batches, blocked/failed; --anchors adds the
|
|
31
|
+
ai-dossier sched status # queue (+pr/cleanup), engine lease, slots, batches, blocked/failed; --anchors adds the ledger anchor sweep (#768) plus orphaned anchors no longer in state.batches (#790)
|
|
32
32
|
ai-dossier sched pause # prevent every new agent process; live units keep running
|
|
33
33
|
ai-dossier sched resume
|
|
34
34
|
ai-dossier sched stop --issue 42 # terminate one full-cycle agent and record it stopped (no recovery)
|
|
@@ -1123,11 +1123,18 @@ import {
|
|
|
1123
1123
|
// so batch-dispatch.ts can share it.
|
|
1124
1124
|
TRANSITIONS, // the transition tables themselves (for previews)
|
|
1125
1125
|
buildStatusReport, // machine-readable status incl. blocked/failed sets
|
|
1126
|
-
// (+ optional `anchorSweep` → `anchors`, #768
|
|
1126
|
+
// (+ optional `anchorSweep` → `anchors`/`orphan_anchors`, #768/#790)
|
|
1127
|
+
// (+ optional `worktreeReader` → `kept-worktree` warnings, #791)
|
|
1128
|
+
keptWorktreeCandidates, buildKeptWorktreeWarnings, defaultKeptWorktreeReader, // #791
|
|
1127
1129
|
sweepAnchors, classifyAnchor, membersShippedVerdict, anchorLedgerBlockers,
|
|
1128
1130
|
shippingEvidence, // #768 anchor-close predicate (pure; readers injected)
|
|
1129
1131
|
closeAnchor, // #768 idempotent comment-then-close, `-R <repo>` explicit
|
|
1130
1132
|
anchorCloseMarker, renderAnchorCloseComment, openAnchorBatches, formatBatchStatus,
|
|
1133
|
+
sweepOrphanAnchors, classifyOrphanAnchor, parseOrphanAnchorBody, batchAnchorStillOpen,
|
|
1134
|
+
// #790 orphan sweep — batches gone from state.batches entirely;
|
|
1135
|
+
// pure, GitHub/git only via the injected list/read (never exec)
|
|
1136
|
+
ORPHAN_SWEEP_MAX_ANCHORS, ORPHAN_SWEEP_MAX_MEMBERS, DEFAULT_ORPHAN_BASE_BRANCH, // #790
|
|
1137
|
+
BATCH_ANCHOR_LABEL, // #790, also used by cli/src/batch-compose.ts (single source)
|
|
1131
1138
|
issueCloseReader, parseIssueCloseTruthJson, parseRepoName,
|
|
1132
1139
|
resolveProjectRepo, // #768 owner/name of the cwd repo only when it IS the project's
|
|
1133
1140
|
hasLabel, // case-insensitive label match (#768)
|
|
@@ -1327,10 +1334,14 @@ after-the-fact recovery, not a missing-data bug.
|
|
|
1327
1334
|
can be manual (`sched pause`) or automatic (dispatch-health, #505/#629 above); `sched
|
|
1328
1335
|
resume` clears the flag and both dispatch-health streaks.
|
|
1329
1336
|
|
|
1330
|
-
## Status health warnings (#776)
|
|
1337
|
+
## Status health warnings (#776, #791)
|
|
1331
1338
|
|
|
1332
|
-
`sched status` (and `warnings[]` in `--json
|
|
1333
|
-
|
|
1339
|
+
`sched status` (and `warnings[]` in `--json`) flags state nobody came back to, each with
|
|
1340
|
+
its exact remedy. Most kinds come from `buildStatusWarnings`, pure over state + engine
|
|
1341
|
+
lease + clock; `kept-worktree` (below) comes from the separate `buildKeptWorktreeWarnings`,
|
|
1342
|
+
since it needs local git/fs reads — it only appears when the caller passes a
|
|
1343
|
+
`KeptWorktreeReader` to `buildStatusReport` (the CLI always does; a test harness omits it
|
|
1344
|
+
to skip the check entirely):
|
|
1334
1345
|
|
|
1335
1346
|
- **`long-pause`** — paused for more than 24 h (`STATUS_HEALTH_WARNING_AGE_MS`), measured
|
|
1336
1347
|
from `paused_at`, which `setPaused` stamps on the running → paused edge and clears on
|
|
@@ -1344,6 +1355,25 @@ nobody came back to, each with its exact remedy:
|
|
|
1344
1355
|
closed issue sets the entry's sticky `stale_closed_at`, journals `stale-closed` once, and
|
|
1345
1356
|
the recovery rail never respawns it (even after `sched resume`). Report slots are exempt:
|
|
1346
1357
|
their issue is closed at merge by design. Remedy: `sched stop --issue N`.
|
|
1358
|
+
- **`kept-worktree`** (#791) — a `done` batch whose `worktree` or `member_worktree` is
|
|
1359
|
+
still set in the ledger: the `members-closed` stale-blocked reconcile below
|
|
1360
|
+
intentionally leaves it in place (it may hold unpushed operator repair work), and
|
|
1361
|
+
nothing else surfaced it until now. For each kept path, `sched status` reports:
|
|
1362
|
+
whether it still exists on disk; whether it is pool-claimed (the claim is held
|
|
1363
|
+
indefinitely until returned); and, via two local, read-only `git` probes scoped to
|
|
1364
|
+
that worktree's own `HEAD` (`git --no-optional-locks status --porcelain`, `git log
|
|
1365
|
+
HEAD --not --remotes`), whether it has uncommitted or unpushed work. The remedy is the
|
|
1366
|
+
exact `git worktree remove <path>` or `worktree-pool return --path <path>` command,
|
|
1367
|
+
properly shell-quoted — report-only, never executed. `reconcileKeptWorktrees`
|
|
1368
|
+
(`batch-dispatch.ts`, run every tick) separately clears the ledger's `worktree`/
|
|
1369
|
+
`pool_claimed` fields once there is DEFINITIVE evidence the cleanup already
|
|
1370
|
+
happened — the path no longer exists, or the pool itself reports it back as a warm
|
|
1371
|
+
spare — so the warning does not persist after the operator (or the pool) has already
|
|
1372
|
+
dealt with it; it never removes anything itself. A candidate whose path is currently
|
|
1373
|
+
claimed by a different, still in-flight batch is skipped (a returned pool worktree can
|
|
1374
|
+
be re-issued before the done batch's own field clears). Local-git-only, capped at 10
|
|
1375
|
+
probed candidates per run — no network call, so unlike `sched status --anchors` this
|
|
1376
|
+
runs by default.
|
|
1347
1377
|
|
|
1348
1378
|
## Batch anchors close only on positive evidence (#768)
|
|
1349
1379
|
|
|
@@ -1380,7 +1410,9 @@ predicate in `anchor-close.ts`) over `blocked`/`done` batches touched within the
|
|
|
1380
1410
|
for #686's stale-blocked reconcile (`members-closed`), which survives the mandated
|
|
1381
1411
|
rebase-merge that makes the ancestry probe structurally dead. It finishes the terminal
|
|
1382
1412
|
rail inline but never tears the blocked worktree down (it may hold unpushed work);
|
|
1383
|
-
the journal line says the worktree was kept
|
|
1413
|
+
the journal line says the worktree was kept, and `sched status` then raises a
|
|
1414
|
+
`kept-worktree` warning for it on every run until the ledger field clears — see
|
|
1415
|
+
above and `reconcileKeptWorktrees` (#791).
|
|
1384
1416
|
|
|
1385
1417
|
Everything else is surfaced, never closed: `sched status --anchors` (opt-in; `status`
|
|
1386
1418
|
makes no GitHub call without it) lists each still-open anchor of a batch no longer in
|
|
@@ -1392,6 +1424,51 @@ Journal: `anchor-closed` (including "found already closed") and `anchor-close-fa
|
|
|
1392
1424
|
(deduped like `pr-watch-failed`: once per streak, re-announced every
|
|
1393
1425
|
`JOURNAL_DEDUP_REANNOUNCE_TICKS`).
|
|
1394
1426
|
|
|
1427
|
+
### Orphaned anchors — batches dropped from the ledger entirely (#790)
|
|
1428
|
+
|
|
1429
|
+
The sweep above only ever walks `state.batches` (`openAnchorBatches`) — an anchor whose
|
|
1430
|
+
batch fell out of the ledger ENTIRELY (a lost or reset `state.json`; imboard#4244/#4253
|
|
1431
|
+
were exactly this shape: `sched status --json` showed `batches: []` with both anchors
|
|
1432
|
+
still open) is invisible to it. The same `--anchors` flag also runs a GitHub-only sweep
|
|
1433
|
+
for exactly that: `gh issue list --label batch-epic --state open` for the pinned
|
|
1434
|
+
project repo, excluding anchors the ledger sweep already covers, recovering each
|
|
1435
|
+
orphan's members from its own issue-body checklist (`parseOrphanAnchorBody`) and
|
|
1436
|
+
classifying with the same shipping-evidence logic (`classifyOrphanAnchor`, sharing
|
|
1437
|
+
`readMembersShipping`/`anchorGroundVerdict` with `classifyAnchor` above) — minus the
|
|
1438
|
+
ledger check, which cannot apply to something not in the ledger. Reported under
|
|
1439
|
+
`== Orphaned batch anchors (not in ledger) ==` (`orphan_anchors` in `--json`, `null` when
|
|
1440
|
+
the sweep did not run OR the GitHub list call itself failed — rendered `(unavailable)`,
|
|
1441
|
+
never silently as `(none)`) as `orphan-closable-candidate`, `orphan-needs-operator`, or
|
|
1442
|
+
`orphan-unknown` — deliberately never the ledger sweep's bare `closable`: without a
|
|
1443
|
+
ledger there is no eviction/requeue trail to rule out, so even a clean read is a
|
|
1444
|
+
CANDIDATE for a human to confirm. Capped at `ORPHAN_SWEEP_MAX_ANCHORS` (20) classified
|
|
1445
|
+
per run — ledger-tracked anchors are excluded BEFORE that cap, from a GitHub fetch
|
|
1446
|
+
(`ORPHAN_LIST_FETCH_LIMIT`, 100) wider than it, so a busy repo's tracked anchors cannot
|
|
1447
|
+
crowd real orphans out; `orphan_anchors_truncated` (`StatusReport`) and a rendered
|
|
1448
|
+
truncation line fire when candidates still exceeded the cap. The anchor body is
|
|
1449
|
+
untrusted input (anyone who can edit an open `batch-epic` issue controls it): member
|
|
1450
|
+
numbers outside the valid GitHub issue range are dropped, a body over
|
|
1451
|
+
`ORPHAN_SWEEP_MAX_MEMBERS` (50) refuses with NO reads at all (`members-over-cap`), and
|
|
1452
|
+
`base_branch` is checked twice — syntactically (`SAFE_REF_RE`, falling back to
|
|
1453
|
+
`DEFAULT_ORPHAN_BASE_BRANCH`/`main` when unsafe) and then against the expected/configured
|
|
1454
|
+
base (`expectedBaseBranch`, default `main`): a value that names a DIFFERENT — even
|
|
1455
|
+
syntactically valid — branch can never produce `orphan-closable-candidate`, only
|
|
1456
|
+
`orphan-needs-operator` with reason `base-branch-nonstandard:<value>`, since it decides
|
|
1457
|
+
what counts as shipped and an editable issue field is not trusted to pick that
|
|
1458
|
+
unsupervised. Report-only by construction, exactly like the ledger sweep — `list`/`read`
|
|
1459
|
+
are pure lookups with no write capability, proven by a recording-`ExecFn` test over the
|
|
1460
|
+
real gh-argv-building path (`anchor-close.test.ts`).
|
|
1461
|
+
|
|
1462
|
+
Separately, `sched abandon --batch` warns — stderr line plus a journaled
|
|
1463
|
+
`batch-anchor-open-on-abandon` event, and an additive `anchor_open` field on
|
|
1464
|
+
`abandon --json` — rather than refuses, when it dissolves a batch whose anchor is still
|
|
1465
|
+
open on GitHub. Nothing in this codebase currently removes a batch row from
|
|
1466
|
+
`state.batches` (`abandonBatch` dissolves in place, status `dissolved`, still
|
|
1467
|
+
ledger-swept above), so this is a courtesy at the one real moment an operator ends a
|
|
1468
|
+
batch's active lifecycle — never a gate, and never a substitute for the orphan sweep. The
|
|
1469
|
+
CLI's repo-verification exec is timed (10s) on this path too, so an abandon that used to
|
|
1470
|
+
make no network calls at all cannot hang on an unresponsive `gh`.
|
|
1471
|
+
|
|
1395
1472
|
## Hard-block labels are re-read every tick (#544)
|
|
1396
1473
|
|
|
1397
1474
|
#507's enqueue pre-screen resolves an issue's GitHub labels in the CLI and lands the
|
package/dist/anchor-close.d.ts
CHANGED
|
@@ -169,4 +169,164 @@ export declare function sweepAnchors(state: SchedState, read: IssueCloseReader,
|
|
|
169
169
|
repo?: string;
|
|
170
170
|
commitInBase?: CommitInBase;
|
|
171
171
|
}): AnchorReportItem[];
|
|
172
|
+
/** The base branch `parseOrphanAnchorBody` falls back to, and `classifyOrphanAnchor` treats as the expected/project-standard base absent an `expectedBaseBranch` override — what `gate-issue` itself defaults to. */
|
|
173
|
+
export declare const DEFAULT_ORPHAN_BASE_BRANCH = "main";
|
|
174
|
+
/**
|
|
175
|
+
* #790 (security review): the anchor body is untrusted input — anyone who can
|
|
176
|
+
* comment-and-edit an open `batch-epic` issue controls it. Without a cap, a
|
|
177
|
+
* body with thousands of checklist lines would cost thousands of GraphQL
|
|
178
|
+
* reads per sweep (`classifyOrphanAnchor` runs `exhaustive: true`), and one
|
|
179
|
+
* crafted out-of-range member number would error that member's read,
|
|
180
|
+
* `orphan-unknown` it, and abort {@link sweepOrphanAnchors}'s reads for every
|
|
181
|
+
* later anchor. Both are answered the same way: a body over the cap is
|
|
182
|
+
* reported `orphan-needs-operator` (reason `members-over-cap`) with NO reads
|
|
183
|
+
* performed at all — see {@link classifyOrphanAnchor}.
|
|
184
|
+
*/
|
|
185
|
+
export declare const ORPHAN_SWEEP_MAX_MEMBERS = 50;
|
|
186
|
+
/**
|
|
187
|
+
* Recover a batch anchor's members and base branch from its own issue body —
|
|
188
|
+
* the only record left once the batch has dropped out of `state.batches`.
|
|
189
|
+
* The body is the batch-compose format (RFC-0001): one member checklist line
|
|
190
|
+
* per issue, then metadata lines including `base_branch: <name>`. Nothing in
|
|
191
|
+
* this codebase edits an anchor's body after creation (verified: no
|
|
192
|
+
* `gh issue edit ... --body` targets an anchor), so the checklist is already
|
|
193
|
+
* the complete, stable membership — a `batch-setup` runstate milestone would
|
|
194
|
+
* only repeat the same list less reliably (missing entirely for an anchor
|
|
195
|
+
* that predates runstate, or belonging to a requeued run's earlier attempt).
|
|
196
|
+
*
|
|
197
|
+
* Both fields are untrusted (#790 security review) and validated before use:
|
|
198
|
+
* a member number outside `1..MAX_GITHUB_ISSUE_NUMBER` is dropped (never sent
|
|
199
|
+
* to `read`), and `base_branch` falls back to `main` — never propagating a
|
|
200
|
+
* string {@link SAFE_REF_RE} would reject as a git ref — when the metadata
|
|
201
|
+
* line is missing OR unsafe. `main` is what `gate-issue` defaults to, so it
|
|
202
|
+
* is what `shippingEvidence` checks a closer against either way.
|
|
203
|
+
* `members_over_cap` is set (members truncated to {@link ORPHAN_SWEEP_MAX_MEMBERS})
|
|
204
|
+
* rather than silently proceeding on a partial list — the caller reports it,
|
|
205
|
+
* never reads a partial membership as if it were the whole batch.
|
|
206
|
+
*/
|
|
207
|
+
export declare function parseOrphanAnchorBody(body: string): {
|
|
208
|
+
members: number[];
|
|
209
|
+
base_branch: string;
|
|
210
|
+
members_over_cap: boolean;
|
|
211
|
+
};
|
|
212
|
+
/** A batch-epic anchor recovered from GitHub, with no `state.batches` row behind it. */
|
|
213
|
+
export interface OrphanAnchorCandidate {
|
|
214
|
+
anchor: number;
|
|
215
|
+
members: number[];
|
|
216
|
+
base_branch: string;
|
|
217
|
+
/** Set when {@link parseOrphanAnchorBody} truncated the member list at {@link ORPHAN_SWEEP_MAX_MEMBERS} — `classifyOrphanAnchor` refuses to read a partial membership. */
|
|
218
|
+
members_over_cap?: boolean;
|
|
219
|
+
}
|
|
220
|
+
/**
|
|
221
|
+
* {@link classifyOrphanAnchor}'s answer. Deliberately its own vocabulary —
|
|
222
|
+
* `orphan-closable-candidate`, never bare `closable` — because without a
|
|
223
|
+
* ledger there is no failure-trail evidence (no eviction/requeue record to
|
|
224
|
+
* rule out, the operator's rule from #768 is POSITIVE evidence only): even a
|
|
225
|
+
* verdict with zero disqualifying reasons is a CANDIDATE for a human to
|
|
226
|
+
* confirm, not the ledger-backed `sweepAnchors`' stronger `closable`.
|
|
227
|
+
*/
|
|
228
|
+
export type OrphanAnchorVerdict = {
|
|
229
|
+
kind: 'orphan-closable-candidate' | 'orphan-needs-operator' | 'orphan-unknown';
|
|
230
|
+
reasons: string[];
|
|
231
|
+
members: AnchorMemberReport[];
|
|
232
|
+
};
|
|
233
|
+
/**
|
|
234
|
+
* Classify one orphan anchor candidate, or `null` when it turns out not to be
|
|
235
|
+
* an orphan at all — the anchor CLOSED between the GitHub list and this read
|
|
236
|
+
* (the caller only ever lists open anchors), the same list-then-read race
|
|
237
|
+
* `sweepAnchors` answers by `continue`-ing past a freshly `anchor-closed`
|
|
238
|
+
* verdict rather than reporting one. Deliberately NOT `classifyAnchor` /
|
|
239
|
+
* `membersShippedVerdict` verbatim: those consult `anchorLedgerBlockers`,
|
|
240
|
+
* which pushes `member-not-in-ledger:#N` for every member of ANY batch not
|
|
241
|
+
* in `state.batches` — for an orphan that is true by construction, so the
|
|
242
|
+
* ledger-backed predicate would answer `needs-operator` unconditionally and
|
|
243
|
+
* this sweep could never report a clean batch as a candidate. This reuses
|
|
244
|
+
* the SAME shipping-evidence logic ({@link readMembersShipping}, which is
|
|
245
|
+
* {@link shippingEvidence} plus the open/not-completed/handed-back checks)
|
|
246
|
+
* and the SAME anchor-level ground truth ({@link anchorGroundVerdict}) that
|
|
247
|
+
* `classifyAnchor` uses — the ledger check is the one piece structurally
|
|
248
|
+
* inapplicable to something not in the ledger.
|
|
249
|
+
*/
|
|
250
|
+
export declare function classifyOrphanAnchor(candidate: OrphanAnchorCandidate, read: IssueCloseReader, opts?: {
|
|
251
|
+
repo?: string;
|
|
252
|
+
commitInBase?: CommitInBase;
|
|
253
|
+
expectedBaseBranch?: string;
|
|
254
|
+
}): OrphanAnchorVerdict | null;
|
|
255
|
+
/** One open `batch-epic` anchor issue, as listed from GitHub. */
|
|
256
|
+
export interface OpenAnchorIssue {
|
|
257
|
+
number: number;
|
|
258
|
+
title: string;
|
|
259
|
+
body: string;
|
|
260
|
+
}
|
|
261
|
+
/** Lists open `batch-epic` anchor issues for the pinned project repo, or `undefined` on a failed read (unverified repo, `gh` unreachable). */
|
|
262
|
+
export type OpenAnchorLister = () => OpenAnchorIssue[] | undefined;
|
|
263
|
+
/**
|
|
264
|
+
* The exact `gh issue list` argv for the #790 orphan lister — exported so
|
|
265
|
+
* the CLI's real lister (`orphanAnchorListerFor`, `cli/src/commands/sched.ts`)
|
|
266
|
+
* and this package's own tests build the SAME command from ONE definition
|
|
267
|
+
* (#790 review: the earlier AC6 test built its own copy of this argv, so a
|
|
268
|
+
* future change to the production command would not have been caught by
|
|
269
|
+
* it). Read-only by construction — `gh issue list` never writes.
|
|
270
|
+
*/
|
|
271
|
+
export declare function orphanAnchorListArgs(repo: string, limit: number): string[];
|
|
272
|
+
/** `sched status --anchors`' orphan sweep (#790): bounded read cost per run — a GitHub-side sweep must never grow with the repo's total anchor count. */
|
|
273
|
+
export declare const ORPHAN_SWEEP_MAX_ANCHORS = 20;
|
|
274
|
+
/** One `sched status --anchors` orphan-sweep row. */
|
|
275
|
+
export interface OrphanAnchorReportItem {
|
|
276
|
+
anchor: number;
|
|
277
|
+
title: string;
|
|
278
|
+
verdict: OrphanAnchorVerdict['kind'];
|
|
279
|
+
reasons: string[];
|
|
280
|
+
members: AnchorMemberReport[];
|
|
281
|
+
}
|
|
282
|
+
/**
|
|
283
|
+
* {@link sweepOrphanAnchors}'s result: the classified rows plus whether the
|
|
284
|
+
* cap left anything unprobed. `truncated` distinguishes "these are ALL the
|
|
285
|
+
* open orphans" from "more may exist beyond what was classified" — silently
|
|
286
|
+
* capping without saying so would read as a complete, clean sweep on a busy
|
|
287
|
+
* repo where it is neither.
|
|
288
|
+
*/
|
|
289
|
+
export interface OrphanAnchorSweepResult {
|
|
290
|
+
items: OrphanAnchorReportItem[];
|
|
291
|
+
/** True when more ledger-unbound open `batch-epic` anchors existed than {@link ORPHAN_SWEEP_MAX_ANCHORS} could classify this run. */
|
|
292
|
+
truncated: boolean;
|
|
293
|
+
}
|
|
294
|
+
/**
|
|
295
|
+
* `sched status --anchors`' orphan sweep (#790): every open `batch-epic`
|
|
296
|
+
* anchor in the pinned project repo whose batch is no longer in
|
|
297
|
+
* `state.batches` — invisible to {@link sweepAnchors}, which only walks the
|
|
298
|
+
* ledger. Report-only by construction, exactly like `sweepAnchors`: `list`
|
|
299
|
+
* and `read` are both pure lookups with no write capability, so this
|
|
300
|
+
* function has no way to close, comment on, label, or edit anything — it
|
|
301
|
+
* only ever builds and returns {@link OrphanAnchorReportItem} rows.
|
|
302
|
+
*
|
|
303
|
+
* `null` means the list itself failed (an unverified repo, or `gh`
|
|
304
|
+
* unreachable) — distinct from `{items: [], truncated: false}` ("asked,
|
|
305
|
+
* found zero orphans"), the same null-vs-empty convention
|
|
306
|
+
* `StatusReport.anchors`/`orphan_anchors` already use for "the sweep did not
|
|
307
|
+
* run at all". Ledger-tracked anchors are excluded BEFORE the
|
|
308
|
+
* {@link ORPHAN_SWEEP_MAX_ANCHORS} cap is applied — a busy repo with 20+ open
|
|
309
|
+
* ledger-tracked `batch-epic` anchors must not let them crowd out the
|
|
310
|
+
* orphans this sweep exists to find; `truncated=true` when the cap still
|
|
311
|
+
* left real orphan candidates unprobed. Classifying stops at the first
|
|
312
|
+
* failed member/anchor read (the same fail-closed posture as
|
|
313
|
+
* `sweepAnchors`): every anchor after that point is reported `orphan-unknown`
|
|
314
|
+
* without a further call.
|
|
315
|
+
*/
|
|
316
|
+
export declare function sweepOrphanAnchors(state: SchedState, list: OpenAnchorLister, read: IssueCloseReader, opts?: {
|
|
317
|
+
repo?: string;
|
|
318
|
+
commitInBase?: CommitInBase;
|
|
319
|
+
expectedBaseBranch?: string;
|
|
320
|
+
}): OrphanAnchorSweepResult | null;
|
|
321
|
+
/**
|
|
322
|
+
* Whether dissolving `batch` (`sched abandon --batch`) should warn an
|
|
323
|
+
* operator: its anchor is set and, per `read`, still OPEN. Pure predicate —
|
|
324
|
+
* the CLI performs the actual GitHub read and the print/journal side effect
|
|
325
|
+
* (`sched abandon --batch`'s handler). `null` covers both "no anchor to warn
|
|
326
|
+
* about" and "read failed / anchor already closed or missing" alike: this
|
|
327
|
+
* function only ever tells the caller whether to warn, never why not to —
|
|
328
|
+
* `abandonBatch` itself must NEVER refuse over this (#790: refusing would
|
|
329
|
+
* wedge exactly the cleanup `abandon` exists for).
|
|
330
|
+
*/
|
|
331
|
+
export declare function batchAnchorStillOpen(batch: Pick<BatchEntry, 'anchor'>, read: IssueCloseReader): number | null;
|
|
172
332
|
//# sourceMappingURL=anchor-close.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"anchor-close.d.ts","sourceRoot":"","sources":["../src/anchor-close.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;GAsBG;
|
|
1
|
+
{"version":3,"file":"anchor-close.d.ts","sourceRoot":"","sources":["../src/anchor-close.ts"],"names":[],"mappings":"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"}
|