@feigi/fleet-ctl 3.21.6 → 3.21.8

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@feigi/fleet-ctl",
3
- "version": "3.21.6",
3
+ "version": "3.21.8",
4
4
  "description": "Agent fleet: run-team controller, merge bot, PR reviewer, and the ticket pipeline they share",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {
@@ -513,8 +513,12 @@ const FILES = [
513
513
  },
514
514
  {
515
515
  path: ["scripts", "ledger.mjs"],
516
- stale: [/fleet-plugin-design\.md:200/, /candidates\.mjs:279/],
517
- live: ["refuseIfCapped"],
516
+ // #2516. The `filed` subcommand's isDigits() comment pointed at
517
+ // "(line ~1527)" for the `keyNum` check it mirrors — a line that had
518
+ // already drifted into an unrelated comment. It names the check by its
519
+ // enclosing function now.
520
+ stale: [/fleet-plugin-design\.md:200/, /candidates\.mjs:279/, /\blines?\s+~?\d+/],
521
+ live: ["refuseIfCapped", "runDispatch's `keyNum` check"],
518
522
  },
519
523
  {
520
524
  path: ["scripts", "ledger.test.mjs"],
@@ -205,12 +205,13 @@ test("duty 1 says worktree-audit.sh takes no argument and audits every worktree"
205
205
  // equal alternatives, then halted on "dirty or diverged" — and neither can
206
206
  // see diverged. Porcelain is empty over a clean tree one commit past the pin,
207
207
  // and the audit's `ahead` is counted against `origin/main`
208
- // (worktree-audit.sh's `base=${BASE_REF:-origin/main}`), which a PR worktree
209
- // is always ahead of. The only divergence check is the cause block's
210
- // head-equality against the dispatch pin. And "find this worktree's row" gave
211
- // no rule for a row that cannot answer, or for no row at all. Each pin below
212
- // holds ONE sentence (`sentences()`, #1940), so a clause deleted from inside
213
- // the duty reds its own pin rather than being satisfied by a neighbour.
208
+ // (worktree-audit.sh's `base=${BASE_REF:-origin/main}`), which a healthy
209
+ // worktree on an open, unmerged PR is ahead of too. The only divergence check
210
+ // is the cause block's head-equality against the dispatch pin. And "find this
211
+ // worktree's row" gave no rule for a row that cannot answer, or for no row at
212
+ // all. Each pin below holds ONE sentence (`sentences()`, #1940), so a clause
213
+ // deleted from inside the duty reds its own pin rather than being satisfied by
214
+ // a neighbour.
214
215
  test("duty 1 names the instrument for each check, and halts on a row that cannot answer", () => {
215
216
  const said = (re) => sentences(duty1Text()).some((s) => re.test(s));
216
217
  assert.ok(
@@ -225,6 +226,19 @@ test("duty 1 names the instrument for each check, and halts on a row that cannot
225
226
  said(/row's `ahead`.*counted against `origin\/main`.*cannot answer/),
226
227
  "duty 1 no longer says the audit's `ahead` is counted against origin/main — a finisher reading it as divergence sees every PR worktree as diverged, or learns to ignore it",
227
228
  );
229
+ // The reason `ahead` cannot answer holds for the PR the finisher runs on: an
230
+ // open, unmerged one. It is not true of every PR worktree — after a merge
231
+ // commit into a fetched origin/main the branch's `ahead` reads 0 — so the
232
+ // claim is scoped, never "always", and the scope sits in the same sentence.
233
+ assert.ok(
234
+ said(/row's `ahead`.*counted against `origin\/main`.*open, unmerged PR.*cannot answer/),
235
+ "duty 1 no longer scopes the `ahead` reason to an open, unmerged PR's worktree — after a merge into a fetched origin/main a PR worktree's `ahead` reads 0, so an unscoped claim is false",
236
+ );
237
+ assert.doesNotMatch(
238
+ flat(RUN_TEAM),
239
+ /\balways\b[^.]{0,20}\bahead\b/i,
240
+ "the run-team skill states an unconditional lead over origin/main again — a PR worktree's `ahead` reads 0 once its merge commit is in a fetched origin/main",
241
+ );
228
242
  // The three non-clean row shapes, each halting and each named. Unreadable
229
243
  // and missing share `readable:false` and differ only in their counts, so
230
244
  // each is pinned with its count shape and stderr line — dropping one leaves
@@ -884,8 +884,8 @@ if (cmd === "read") {
884
884
  refuseStrayInId(issue, "an issue number");
885
885
  const subject = subjectParts.join(" ");
886
886
  const id = issue.replace(/^#/, "");
887
- // isDigits() gates id the same way the sibling ticket/PR check gates key
888
- // (line ~1527): left unvalidated, a non-digit id becomes a `#<id> ` prefix
887
+ // isDigits() gates id the same way runDispatch's `keyNum` check gates the
888
+ // ticket/PR key: left unvalidated, a non-digit id becomes a `#<id> ` prefix
889
889
  // subjectOf()'s digits-only regex cannot strip, so a near-duplicate
890
890
  // `check` against that row silently degrades from the hard "already
891
891
  // filed" block to a soft near-miss suggestion instead.
@@ -2578,10 +2578,10 @@ a minute apart showed *different* mutants, so a member's report and any single
2578
2578
  the worktree unreadable. **Diverged:** the worktree's `HEAD` against your
2579
2579
  dispatch pin — the cause block's head-equality check below. Neither
2580
2580
  instrument above answers it: `git status --porcelain` reports no commits,
2581
- and the row's `ahead` is counted against `origin/main`, which a PR worktree
2582
- is always ahead of, so it cannot answer this. Three row shapes halt too,
2583
- each named in the report with the script's stderr line quoted where it
2584
- prints one: `readable:false` with `null` counts
2581
+ and the row's `ahead` is counted against `origin/main`, which a healthy
2582
+ worktree on an open, unmerged PR is ahead of too, so it cannot answer this.
2583
+ Three row shapes halt too, each named in the report with the script's
2584
+ stderr line quoted where it prints one: `readable:false` with `null` counts
2585
2585
  (`UNREADABLE: <wt> (<cause>)`) is *worktree unreadable*, `readable:false`
2586
2586
  with zero counts (`MISSING on disk: <wt>`) is *worktree missing*, and no
2587
2587
  row for this worktree at all is *worktree absent*. `git status` is no