agent-coord-mcp 0.26.20 → 0.26.22

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.
Files changed (68) hide show
  1. package/dist/capabilities.js +250 -2
  2. package/dist/capabilities.js.map +1 -1
  3. package/dist/closing-line.js +83 -0
  4. package/dist/closing-line.js.map +1 -0
  5. package/dist/commit-cite.js +55 -0
  6. package/dist/commit-cite.js.map +1 -0
  7. package/dist/gated-head.js +177 -0
  8. package/dist/gated-head.js.map +1 -0
  9. package/dist/server-spread.js +195 -0
  10. package/dist/server-spread.js.map +1 -0
  11. package/dist/server.js +4 -2
  12. package/dist/server.js.map +1 -1
  13. package/dist/store.js +32 -0
  14. package/dist/store.js.map +1 -1
  15. package/dist/tools/away.js +67 -7
  16. package/dist/tools/away.js.map +1 -1
  17. package/dist/tools/board-ref.js +44 -4
  18. package/dist/tools/board-ref.js.map +1 -1
  19. package/dist/tools/event-kinds.js +5 -1
  20. package/dist/tools/event-kinds.js.map +1 -1
  21. package/dist/tools/events.js +31 -2
  22. package/dist/tools/events.js.map +1 -1
  23. package/dist/tools/messaging.js +64 -6
  24. package/dist/tools/messaging.js.map +1 -1
  25. package/dist/tools/queue-write.js +431 -0
  26. package/dist/tools/queue-write.js.map +1 -0
  27. package/dist/tools/record-events.js +85 -5
  28. package/dist/tools/record-events.js.map +1 -1
  29. package/dist/tools/records.js +384 -33
  30. package/dist/tools/records.js.map +1 -1
  31. package/dist/tools/registry.js +52 -2
  32. package/dist/tools/registry.js.map +1 -1
  33. package/dist/tools/seat-build.js +173 -0
  34. package/dist/tools/seat-build.js.map +1 -0
  35. package/dist/tools/shared.js.map +1 -1
  36. package/dist/tools/stall.js +1095 -18
  37. package/dist/tools/stall.js.map +1 -1
  38. package/dist/tools/transport.js +21 -2
  39. package/dist/tools/transport.js.map +1 -1
  40. package/dist/tools/tree-provenance.js +107 -0
  41. package/dist/tools/tree-provenance.js.map +1 -0
  42. package/dist/tools/worktrees.js +14 -0
  43. package/dist/tools/worktrees.js.map +1 -1
  44. package/package.json +1 -1
  45. package/scripts/coord-attention-clock.mjs +2 -0
  46. package/scripts/coord-stall-clock.mjs +52 -11
  47. package/src/capabilities.ts +264 -2
  48. package/src/closing-line.ts +85 -0
  49. package/src/commit-cite.ts +58 -0
  50. package/src/gated-head.ts +236 -0
  51. package/src/server-spread.ts +233 -0
  52. package/src/server.ts +10 -2
  53. package/src/store.ts +32 -0
  54. package/src/tools/away.ts +82 -9
  55. package/src/tools/board-ref.ts +70 -3
  56. package/src/tools/event-kinds.ts +17 -1
  57. package/src/tools/events.ts +33 -2
  58. package/src/tools/messaging.ts +63 -6
  59. package/src/tools/queue-write.ts +485 -0
  60. package/src/tools/record-events.ts +78 -5
  61. package/src/tools/records.ts +423 -31
  62. package/src/tools/registry.ts +54 -3
  63. package/src/tools/seat-build.ts +194 -0
  64. package/src/tools/shared.ts +22 -0
  65. package/src/tools/stall.ts +1266 -23
  66. package/src/tools/transport.ts +21 -2
  67. package/src/tools/tree-provenance.ts +136 -0
  68. package/src/tools/worktrees.ts +13 -0
@@ -41,6 +41,68 @@ import { recordAuthorityFor } from "./roles.js";
41
41
  import { subscriptionHealth } from "./tools/events.js";
42
42
  import { configuredTransport, runningTransport, isTmuxKind, targetOf, } from "./transports/index.js";
43
43
  import { readAllTransportMarkers } from "./tools/registry.js";
44
+ import { queueWriteSchema } from "./tools/queue-write.js";
45
+ import { treeProvenance } from "./tools/tree-provenance.js";
46
+ import { detectSpread } from "./server-spread.js";
47
+ /**
48
+ * ⛔⛆⛆ THE PROBE DECISIONS ARE EXPORTED AS PURE PREDICATES, AND THE MUTATION
49
+ * MATRIX IS WHY.
50
+ *
51
+ * Their first form computed `present` inline and built an evidence string from
52
+ * the same raw values. Deleting a conjunct from `present` reddened NOTHING: the
53
+ * tests asserted the EVIDENCE TEXT, which the mutation did not touch, and the
54
+ * probe's own fixed input could not produce the rejected case. ⭐⭐ ***A
55
+ * predicate that cannot be handed the input it is supposed to reject is not
56
+ * guarded — it is decorative, which is the defect one row over and the same
57
+ * shape this row is about.***
58
+ *
59
+ * Exported so a control can pass the failing shape directly.
60
+ */
61
+ export function retagAccepted(parse) {
62
+ // BOTH halves matter: the new member must parse AND a pre-existing one must
63
+ // still parse. Without the control a schema that accepted ANY string would pass.
64
+ return parse("retag") === true && parse("reprioritise") === true;
65
+ }
66
+ /**
67
+ * `#283`'s load-bearing property, and it is NOT "it answered": an unfetchable
68
+ * tree must report `"unknown"` and NEVER `0`. A distance of `0` from an
69
+ * unfetched ref and from a fetched one are byte-identical and mean opposite
70
+ * things — so a numeric `behind` on a tree that was never fetched is the exact
71
+ * failure the verb exists to prevent.
72
+ */
73
+ export function treeProvenanceRefusesZero(r) {
74
+ return r.behind === "unknown" && r.fetched === false && r.stale === false;
75
+ }
76
+ /**
77
+ * `#293`'s load-bearing property (0.26.22): a seat that publishes NO module path
78
+ * makes the fleet `CANNOT_COMPARE` — it is never dropped from the population so
79
+ * the readable rest can answer `AGREED`. ⛔ BOTH CONTROLS ARE CONJUNCTS ON
80
+ * PURPOSE: readable seats on one side of the install must still `AGREED` and on
81
+ * two sides must still `DIVERGED`, or a detector that answered
82
+ * `CANNOT_COMPARE` for everything would pass this probe while detecting nothing.
83
+ *
84
+ * ⭐ AND THIS PROBE EXISTS BECAUSE THE GATE ONE ROW OVER FIRED ON ITS OWN PR:
85
+ * `#293` bumped `0.26.22` with behaviour and no probe, `main` moved under
86
+ * `#292`, and qa measured `probedThrough 0.26.21 < running 0.26.22 → ok:false`.
87
+ * The remedy is the probe, not a softer comparison — softening it would turn
88
+ * the verb back into the label read ⟨q-1c8e35f9⟩ exists to end.
89
+ */
90
+ /**
91
+ * ⟨q-8a3f1c05⟩ / #303 — IN-FLIGHT IS DERIVED FROM THE SEAM, NOT MATCHED ON A GLYPH.
92
+ * A 0.26.21 server read `⛔ Blocked — was 🚧 until the base went red` as IN FLIGHT
93
+ * (the regex `/🚧|🔍/` matched the mention); the seam's `workStateOf` reads the
94
+ * LEADING glyph and answers blocked. All three conjuncts matter: the old answer
95
+ * for the blocked row must be refused AND the two genuine in-flight states must
96
+ * still read in flight, or a predicate that answers false to everything passes.
97
+ * The version label did not move for #303 (still 0.26.22), so `check-probe-coverage`
98
+ * could not see the behaviour arrive — this probe is what sees it.
99
+ */
100
+ export function inFlightDerivedFromSeam(inFlight) {
101
+ return inFlight("⛔ Blocked — was 🚧 until the base went red") === false && inFlight("🔍 In Review") === true && inFlight("🚧 In Progress") === true;
102
+ }
103
+ export function spreadPoisonedByUnreadableSeat(states) {
104
+ return states.unreadable === "CANNOT_COMPARE" && states.agreed === "AGREED" && states.diverged === "DIVERGED";
105
+ }
44
106
  /**
45
107
  * Each probe calls a behaviour that did not exist before its release and
46
108
  * reports what it observed. A probe that could pass without the code being
@@ -106,6 +168,86 @@ const PROBES = [
106
168
  };
107
169
  },
108
170
  },
171
+ /**
172
+ * ⛔⛆⛆ THE PROBES BELOW CLOSE THE WINDOW ⟨q-1c8e35f9⟩ MEASURED.
173
+ *
174
+ * Before them the newest `since` was `0.26.15`, so `capabilities` answered
175
+ * `ok · missing: []` identically on every version from `0.26.16` to `0.26.21`
176
+ * — the whole set the fleet was about to install.
177
+ *
178
+ * ⚠ AND THE TRAP THE ROW NAMES IS THE ONE TO AVOID WHILE WRITING THESE:
179
+ * `away-means-david-away` EXISTS, its NAME matches the changed area, and its
180
+ * ASSERTION predates the change — it tests `0.26.13`'s refusal list, not
181
+ * `#216`'s query mode. ⭐⭐ ***A probe whose name matches while its assertion
182
+ * predates reads as coverage and is not. So each probe below asserts a
183
+ * behaviour that DID NOT EXIST before its own `since`, and would throw or
184
+ * return `false` on the release before it.***
185
+ */
186
+ {
187
+ // #284 — `queue_write` gained `op: "retag"`. On 0.26.20 the enum has three
188
+ // members and parsing `"retag"` throws, which is the probe's whole point.
189
+ id: "queue-write-retag",
190
+ since: "0.26.21",
191
+ run: () => {
192
+ const parse = (v) => queueWriteSchema.op.safeParse(v).success === true;
193
+ const present = retagAccepted(parse);
194
+ return {
195
+ present,
196
+ evidence: `queue_write op accepts "retag": ${parse("retag")} (control "reprioritise": ${parse("reprioritise")}) -> present=${present}`,
197
+ };
198
+ },
199
+ },
200
+ {
201
+ // #283 — every `repo`-taking verb reports the tree it read. The load-bearing
202
+ // property is NOT that it answers, it is that an unfetchable tree yields
203
+ // `"unknown"` and NEVER `0`: a distance of 0 from an unfetched ref and from a
204
+ // fetched one are byte-identical and mean opposite things.
205
+ id: "tree-provenance-unknown-not-zero",
206
+ since: "0.26.21",
207
+ run: () => {
208
+ const r = treeProvenance("/nonexistent-path-for-capability-probe");
209
+ const present = treeProvenanceRefusesZero(r);
210
+ return {
211
+ present,
212
+ evidence: `unreachable tree -> behind=${JSON.stringify(r.behind)} fetched=${r.fetched} stale=${r.stale} -> present=${present}`,
213
+ };
214
+ },
215
+ },
216
+ {
217
+ // #293 — `detectSpread` did not exist before 0.26.22. The property is not
218
+ // "it answers": an UNREADABLE seat must poison the verdict rather than be
219
+ // dropped, while readable seats still resolve to AGREED / DIVERGED.
220
+ id: "server-spread-unreadable-poisons",
221
+ since: "0.26.22",
222
+ run: () => {
223
+ const installed = { mtime: 1_000, module: "/installed-for-capability-probe" };
224
+ const a = { agentId: "a", serverStartedAt: 2_000, serverModule: installed.module };
225
+ const b = { agentId: "b", serverStartedAt: 3_000, serverModule: installed.module };
226
+ const older = { agentId: "older", serverStartedAt: 500, serverModule: installed.module };
227
+ const mute = { agentId: "mute" };
228
+ const states = {
229
+ unreadable: detectSpread([a, mute], installed).state,
230
+ agreed: detectSpread([a, b], installed).state,
231
+ diverged: detectSpread([a, older], installed).state,
232
+ };
233
+ const present = spreadPoisonedByUnreadableSeat(states);
234
+ return {
235
+ present,
236
+ evidence: `unreadable seat -> ${states.unreadable} · same side -> ${states.agreed} · two sides -> ${states.diverged} -> present=${present}`,
237
+ };
238
+ },
239
+ },
240
+ {
241
+ // #303 (shipped under 0.26.22, no bump) — `isInFlightStatus` derives from the seam.
242
+ id: "in-flight-derives-from-seam",
243
+ since: "0.26.22",
244
+ run: () => {
245
+ const blocked = isInFlightStatus("⛔ Blocked — was 🚧 until the base went red");
246
+ const review = isInFlightStatus("🔍 In Review");
247
+ const present = inFlightDerivedFromSeam(isInFlightStatus);
248
+ return { present, evidence: `"⛔ Blocked — was 🚧 …" in flight: ${blocked} (0.26.21 said true) · "🔍 In Review": ${review} -> present=${present}` };
249
+ },
250
+ },
109
251
  {
110
252
  id: "record-authority",
111
253
  since: "0.24.0",
@@ -118,6 +260,65 @@ const PROBES = [
118
260
  },
119
261
  },
120
262
  ];
263
+ /**
264
+ * ⛔⛆⛆ `missing: []` MEANS TWO DIFFERENT THINGS AND THIS SEPARATES THEM.
265
+ *
266
+ * "Nothing is missing" and "nothing was tested" produce the SAME answer today.
267
+ * ⭐⭐ ***Measured 2026-09-14: `capabilities` answered `ok · missing: []`
268
+ * IDENTICALLY on `0.26.20` and `0.26.21` — the probe set stops at `since
269
+ * 0.26.15`, so every version the fleet was about to install was unprobed, and
270
+ * the verb the fleet reaches for to prove a restart took could not see the three
271
+ * changes it would have been asked to certify.***
272
+ *
273
+ * That is `0`-vs-`unknown` inside the instrument the six delivery states END on:
274
+ * while this is blind, `observed` is unmeasurable BY CONSTRUCTION and every
275
+ * "delivered" claim in the fleet rests on a version LABEL.
276
+ *
277
+ * ⚠ THE COMPARISON IS AGAINST THE LABEL, WHICH IS NOT EVIDENCE — and that is
278
+ * deliberate rather than sloppy. The label is the only statement of intent
279
+ * available about what this process is SUPPOSED to be; the probes are the only
280
+ * evidence about what it IS. Comparing them is precisely how a divergence
281
+ * becomes visible, and this function says which side is which rather than
282
+ * blending them.
283
+ */
284
+ function coverageOf(probes, versionLabel) {
285
+ const cmp = (a, b) => {
286
+ const pa = a.split(".").map((n) => Number.parseInt(n, 10));
287
+ const pb = b.split(".").map((n) => Number.parseInt(n, 10));
288
+ for (let i = 0; i < Math.max(pa.length, pb.length); i += 1) {
289
+ const x = Number.isFinite(pa[i]) ? pa[i] : 0;
290
+ const y = Number.isFinite(pb[i]) ? pb[i] : 0;
291
+ if (x !== y)
292
+ return x < y ? -1 : 1;
293
+ }
294
+ return 0;
295
+ };
296
+ const sinces = probes.map((p) => p.since).filter((v) => /^\d+(\.\d+)*$/.test(v));
297
+ const probedThrough = sinces.length ? sinces.reduce((hi, v) => (cmp(v, hi) > 0 ? v : hi)) : null;
298
+ const labelUsable = /^\d+(\.\d+)*$/.test(versionLabel);
299
+ if (!probedThrough || !labelUsable) {
300
+ return {
301
+ probedThrough,
302
+ running: versionLabel,
303
+ covered: false,
304
+ verdict: `COVERAGE UNKNOWN — ${!probedThrough ? "no probe declares a numeric `since`" : "the version label is not numeric"}. ` +
305
+ `Unknown is not covered: this cannot be read as "nothing is missing".`,
306
+ };
307
+ }
308
+ const covered = cmp(probedThrough, versionLabel) >= 0;
309
+ return {
310
+ probedThrough,
311
+ running: versionLabel,
312
+ covered,
313
+ verdict: covered
314
+ ? `PROBES REACH THE RUNNING VERSION — newest probe \`since ${probedThrough}\`, label \`${versionLabel}\`. ` +
315
+ `So \`missing: []\` here means TESTED-AND-PRESENT rather than untested.`
316
+ : `UNPROBED WINDOW \`${probedThrough}\` → \`${versionLabel}\` — every behaviour introduced after ` +
317
+ `\`${probedThrough}\` is UNTESTED by this verb. \`missing: []\` below therefore does NOT mean "nothing is ` +
318
+ `missing"; it means "nothing in that window was looked at". A restart certified on this answer certifies the ` +
319
+ `versions it can see and is silent about the ones it cannot.`,
320
+ };
321
+ }
121
322
  export function probeCapabilities(context) {
122
323
  const probes = PROBES.map((p) => {
123
324
  try {
@@ -133,7 +334,9 @@ export function probeCapabilities(context) {
133
334
  }
134
335
  });
135
336
  const missing = probes.filter((p) => !p.present).map((p) => p.id);
337
+ const coverage = coverageOf(probes, context.versionLabel);
136
338
  return {
339
+ coverage,
137
340
  answeredBy: {
138
341
  pid: process.pid,
139
342
  startedAtIso: new Date(Date.now() - Math.round(process.uptime() * 1000)).toISOString(),
@@ -142,7 +345,14 @@ export function probeCapabilities(context) {
142
345
  },
143
346
  probes,
144
347
  missing,
145
- ok: missing.length === 0,
348
+ /**
349
+ * ⛔ `ok` NOW REQUIRES COVERAGE AS WELL AS PRESENCE. It previously meant
350
+ * "no probe failed", which on an unprobed version is "no probe ran" — the
351
+ * reading this row exists to stop. A reader asking "is this server good?"
352
+ * gets `false` when the honest answer is "I cannot tell", and `coverage`
353
+ * says which of the two it is.
354
+ */
355
+ ok: missing.length === 0 && coverage.covered,
146
356
  note: "Every line above was produced by CALLING the code in this process. `versionLabel` is a label someone typed " +
147
357
  "into package.json and is context, never evidence — a published tarball has already been observed carrying a " +
148
358
  "change its version said it could not. THIS ANSWER IS ABOUT ONE PROCESS: a release is delivered when every " +
@@ -152,6 +362,8 @@ export function probeCapabilities(context) {
152
362
  }
153
363
  /* ── the verb ──────────────────────────────────────────────────────────────── */
154
364
  import { resolveServerIdentity } from "./server-identity.js";
365
+ import { seatBuildOf, installedFrom, psReader } from "./tools/seat-build.js";
366
+ import { isInFlightStatus } from "./tools/stall.js";
155
367
  export const capabilitiesSchema = {};
156
368
  /**
157
369
  * Build the transport capability by CALLING things, then compare.
@@ -195,11 +407,47 @@ export async function probeTransport() {
195
407
  disagreeingAgents,
196
408
  };
197
409
  }
410
+ /**
411
+ * ⟨q-8a3f1c05⟩ — EVERY LIVE SEAT'S BUILD STATE, STATED. The restart operation read
412
+ * `capabilities` to certify a stage and it could not see a pusher; this is that verb
413
+ * answering the question it was asked. `seats[]` carries each live seat's PUSHER half
414
+ * (keyed by the `--agent` on its own command line, against the installed hook's mtime);
415
+ * `answering` carries the SERVER half of the one process that can know it — this one.
416
+ * Servers carry no `--agent`, so no other seat's server is observable from here, and
417
+ * each seat entry says so rather than borrowing its marker's attach-time stamp.
418
+ */
419
+ export async function seatBuilds() {
420
+ const id = resolveServerIdentity();
421
+ const installed = installedFrom(id.path);
422
+ const startedAt = Date.now() - Math.round(process.uptime() * 1000);
423
+ const answering = seatBuildOf({ agentId: "(answering process)", marker: undefined, installed, ps: psReader, server: { pid: process.pid, startedAt, buildMtime: installed.buildMtime } }).server;
424
+ const seats = [];
425
+ try {
426
+ for (const { marker, live } of await readAllTransportMarkers()) {
427
+ if (!live)
428
+ continue;
429
+ seats.push(seatBuildOf({ agentId: marker.agentId, marker, installed, ps: psReader, server: null }));
430
+ }
431
+ }
432
+ catch {
433
+ /* an unreadable transports dir yields no seats — an empty list, not a healthy fleet */
434
+ }
435
+ const toIso = (ms) => (ms === null ? null : new Date(ms).toISOString());
436
+ return {
437
+ installed: { module: installed.module, hookPath: installed.hookPath, hookMtime: toIso(installed.hookMtime), buildMtime: toIso(installed.buildMtime) },
438
+ answering,
439
+ seats,
440
+ note: "seats[] states each live seat's PUSHER against the installed hook's own mtime (hooks/tmux-pusher.mjs, read directly), " +
441
+ "keyed by the --agent on the pusher's command line. The SERVER half is known only for the answering process " +
442
+ "(`answering`): servers carry no --agent, so another seat's server cannot be keyed from ps — ask that seat's own " +
443
+ "`status`, which states both halves for itself. A seat that reads current here and stale in its own status is half-restarted.",
444
+ };
445
+ }
198
446
  export async function capabilitiesTool() {
199
447
  const id = resolveServerIdentity();
200
448
  const report = probeCapabilities({ module: id.path, versionLabel: id.version });
201
449
  try {
202
- return { ...report, transport: await probeTransport() };
450
+ return { ...report, transport: await probeTransport(), seats: await seatBuilds() };
203
451
  }
204
452
  catch (e) {
205
453
  // A THROWN TRANSPORT PROBE IS NOT A BROKEN VERB. An unknown configured value
@@ -1 +1 @@
1
- {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAkCG;AACH,OAAO,EAAE,QAAQ,EAAE,MAAM,0BAA0B,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,wBAAwB,CAAC;AACxD,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,oBAAoB,CAAC;AACxE,OAAO,EAAE,YAAY,EAAE,iBAAiB,EAAE,MAAM,iBAAiB,CAAC;AAClE,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAChD,OAAO,EAAE,kBAAkB,EAAE,MAAM,mBAAmB,CAAC;AACvD,OAAO,EACL,mBAAmB,EACnB,gBAAgB,EAChB,UAAU,EACV,QAAQ,GAET,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAa9D;;;;GAIG;AACH,MAAM,MAAM,GAAY;IACtB;QACE,EAAE,EAAE,0BAA0B;QAC9B,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,GAAG,EAAE;YACR,MAAM,CAAC,GAAG,iBAAiB,CAAC,kBAAkB,EAAE,EAAE,CAAC,CAAC;YACpD,MAAM,IAAI,GAAG,eAAe,EAAE,CAAC;YAC/B,OAAO;gBACL,OAAO,EAAE,CAAC,CAAC,IAAI,KAAK,MAAM,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,KAAK,QAAQ,CAAC;gBACpE,QAAQ,EAAE,oCAAoC,CAAC,CAAC,IAAI,mBAAmB,IAAI,GAAG;aAC/E,CAAC;QACJ,CAAC;KACF;IACD;QACE,EAAE,EAAE,yBAAyB;QAC7B,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,GAAG,EAAE;YACR,MAAM,KAAK,GAAG,CAAC,GAAG,cAAc,CAAC,CAAC,IAAI,EAAE,CAAC;YACzC,MAAM,OAAO,GAAG,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAU,CAAC,CAAC,CAAC;YACzF,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,uBAAuB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,CAAC;QAC1E,CAAC;KACF;IACD;QACE,EAAE,EAAE,mBAAmB;QACvB,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,GAAG,EAAE;YACR,MAAM,IAAI,GAAG,QAAQ,CAAC,sBAAsB,CAAC,CAAC;YAC9C,OAAO;gBACL,OAAO,EAAE,IAAI,CAAC,MAAM,KAAK,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,KAAK,gBAAgB;gBAC1D,QAAQ,EAAE,wCAAwC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;aACrE,CAAC;QACJ,CAAC;KACF;IACD;QACE,EAAE,EAAE,uBAAuB;QAC3B,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,GAAG,EAAE;YACR,MAAM,OAAO,GAAG,OAAO,IAAI,YAAY,IAAI,iBAAiB,CAAC,QAAQ,CAAC,SAAkB,CAAC,CAAC;YAC1F,OAAO;gBACL,OAAO;gBACP,QAAQ,EAAE,uBAAuB,MAAM,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,yBAAyB,iBAAiB,CAAC,MAAM,aAAa;aACpI,CAAC;QACJ,CAAC;KACF;IACD;QACE,EAAE,EAAE,mCAAmC;QACvC,KAAK,EAAE,SAAS;QAChB,GAAG,EAAE,GAAG,EAAE;YACR,uEAAuE;YACvE,wEAAwE;YACxE,2DAA2D;YAC3D,MAAM,IAAI,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,EAAE,SAAS,EAAE,CAAC,EAAE,eAAe,EAAE,IAAI,EAAE,WAAW,EAAE,IAAI,EAAE,SAAS,EAAE,EAAE,EAAW,CAAC;YAClJ,MAAM,KAAK,GAAG,kBAAkB,CAAC,EAAE,GAAI,IAAe,EAAE,aAAa,EAAE,IAAI,CAAC,GAAG,EAAE,EAAW,CAAC,CAAC;YAC9F,MAAM,SAAS,GAAG,kBAAkB,CAAC,EAAE,GAAI,IAAe,EAAE,aAAa,EAAE,IAAI,EAAW,CAAC,CAAC;YAC5F,OAAO;gBACL,OAAO,EAAE,KAAK,CAAC,KAAK,KAAK,IAAI,IAAI,SAAS,CAAC,KAAK,KAAK,OAAO;gBAC5D,QAAQ,EAAE,qBAAqB,KAAK,CAAC,KAAK,wBAAwB,SAAS,CAAC,KAAK,GAAG;aACrF,CAAC;QACJ,CAAC;KACF;IACD;QACE,EAAE,EAAE,kBAAkB;QACtB,KAAK,EAAE,QAAQ;QACf,GAAG,EAAE,GAAG,EAAE;YACR,MAAM,MAAM,GAAG,kBAAkB,CAAC,EAAE,MAAM,EAAE,QAAQ,EAAE,CAAC,CAAC;YACxD,OAAO;gBACL,OAAO,EAAE,MAAM,CAAC,UAAU,CAAC,QAAQ,CAAC,SAAS,CAAC;gBAC9C,QAAQ,EAAE,yBAAyB,MAAM,CAAC,UAAU,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG;aACnE,CAAC;QACJ,CAAC;KACF;CACF,CAAC;AAwDF,MAAM,UAAU,iBAAiB,CAAC,OAAiD;IACjF,MAAM,MAAM,GAAkB,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;QAC7C,IAAI,CAAC;YACH,MAAM,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,CAAC;YAClB,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,CAAC,CAAC,OAAO,EAAE,QAAQ,EAAE,CAAC,CAAC,QAAQ,EAAE,CAAC;QAChF,CAAC;QAAC,OAAO,CAAC,EAAE,CAAC;YACX,yEAAyE;YACzE,sEAAsE;YACtE,sEAAsE;YACtE,eAAe;YACf,OAAO,EAAE,EAAE,EAAE,CAAC,CAAC,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,gBAAiB,CAAW,CAAC,OAAO,EAAE,EAAE,CAAC;QACxG,CAAC;IACH,CAAC,CAAC,CAAC;IACH,MAAM,OAAO,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC;IAClE,OAAO;QACL,UAAU,EAAE;YACV,GAAG,EAAE,OAAO,CAAC,GAAG;YAChB,YAAY,EAAE,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,WAAW,EAAE;YACtF,MAAM,EAAE,OAAO,CAAC,MAAM;YACtB,YAAY,EAAE,OAAO,CAAC,YAAY;SACnC;QACD,MAAM;QACN,OAAO;QACP,EAAE,EAAE,OAAO,CAAC,MAAM,KAAK,CAAC;QACxB,IAAI,EACF,6GAA6G;YAC7G,8GAA8G;YAC9G,4GAA4G;YAC5G,qHAAqH;YACrH,0FAA0F;KAC7F,CAAC;AACJ,CAAC;AAED,kFAAkF;AAElF,OAAO,EAAE,qBAAqB,EAAE,MAAM,sBAAsB,CAAC;AAE7D,MAAM,CAAC,MAAM,kBAAkB,GAAG,EAAW,CAAC;AAE9C;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,cAAc;IAClC,MAAM,IAAI,GAAG,mBAAmB,EAAE,CAAC;IACnC,MAAM,OAAO,GAAG,MAAM,gBAAgB,EAAE,CAAC;IAEzC,2EAA2E;IAC3E,8EAA8E;IAC9E,kEAAkE;IAClE,MAAM,iBAAiB,GAA0C,EAAE,CAAC;IACpE,IAAI,CAAC;QACH,0EAA0E;QAC1E,6EAA6E;QAC7E,yEAAyE;QACzE,KAAK,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,IAAI,MAAM,uBAAuB,EAAE,EAAE,CAAC;YAC/D,IAAI,OAAO,CAAC,IAAI,KAAK,SAAS,IAAI,MAAM,CAAC,SAAS,KAAK,OAAO,CAAC,IAAI,EAAE,CAAC;gBACpE,MAAM,KAAK,GAAG,UAAU,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,SAAS,CAAC;gBAC1E,iBAAiB,CAAC,IAAI,CAAC;oBACrB,OAAO,EAAE,MAAM,CAAC,OAAO;oBACvB,MAAM,EAAE,GAAG,MAAM,CAAC,SAAS,GAAG,KAAK,CAAC,CAAC,CAAC,KAAK,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,EAAE;iBACpF,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAAC,MAAM,CAAC;QACP,wEAAwE;QACxE,8DAA8D;IAChE,CAAC;IAED,OAAO;QACL,UAAU,EAAE,IAAI,CAAC,IAAI;QACrB,OAAO,EAAE,OAAO,CAAC,IAAI;QACrB,MAAM,EAAE,OAAO,CAAC,IAAI,KAAK,IAAI,CAAC,IAAI;QAClC,QAAQ,EAAE,OAAO,CAAC,QAAQ;QAC1B,gBAAgB,EAAE,IAAI,CAAC,MAAM;QAC7B,iBAAiB;KAClB,CAAC;AACJ,CAAC;AAED,MAAM,CAAC,KAAK,UAAU,gBAAgB;IACpC,MAAM,EAAE,GAAG,qBAAqB,EAAE,CAAC;IACnC,MAAM,MAAM,GAAG,iBAAiB,CAAC,EAAE,MAAM,EAAE,EAAE,CAAC,IAAI,EAAE,YAAY,EAAE,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC;IAChF,IAAI,CAAC;QACH,OAAO,EAAE,GAAG,MAAM,EAAE,SAAS,EAAE,MAAM,cAAc,EAAE,EAAE,CAAC;IAC1D,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,6EAA6E;QAC7E,0EAA0E;QAC1E,6EAA6E;QAC7E,OAAO;YACL,GAAG,MAAM;YACT,cAAc,EAAE,0BAA2B,CAAW,CAAC,OAAO,EAAE;SACjE,CAAC;IACJ,CAAC;AACH,CAAC"}
1
+ {"version":3,"file":"capabilities.js","sourceRoot":"","sources":["../src/capabilities.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,83 @@
1
+ /*
2
+ * ⟨q-fee7239f⟩ — A CLOSING LINE STATES AN ARTEFACT IT HAS NOT READ.
3
+ *
4
+ * Measured 2026-09-14 in one clock: #318 merged 18:12:42Z · "Remote branch
5
+ * deleted" posted 18:12:53.626Z · head_ref_deleted 18:13:27Z — the claim
6
+ * preceded its artefact by 33.4s; #319 by 61.7s. Then qa re-read
7
+ * `git ls-remote --heads origin` after #321 and withdrew the same line for
8
+ * FIVE merges (#309 #311 #315 #317 #321) where the remote was NEVER deleted:
9
+ * `gh --delete-branch` had not deleted the remote when the local delete
10
+ * errored, and the closing line reported THE FLAG IT PASSED rather than the
11
+ * remote it never read. A closing line already verifies the squash by content;
12
+ * the ref gets the same rule. The grammar admits exactly two forms for a
13
+ * deletion: a post-delete observation — `remote ref read: 0 refs at <ts>` —
14
+ * or the weaker `delete requested`, which claims no state. A closing that
15
+ * asserts deletion in any other wording is refused at the send, by the same
16
+ * check that requires a DONE to cite its PR, naming both forms.
17
+ *
18
+ * Dated adoption floor: qa's 18:36:30.939Z message — "From here every closing
19
+ * line reads the remote before claiming a delete". Closings at or before it
20
+ * are LISTED, never raised.
21
+ */
22
+ export const CLOSING_GRAMMAR_ADOPTED_MS = 1789410990939; // 2026-09-14T18:36:30.939Z
23
+ /** A merge-closing line: a `done` whose text says MERGED. */
24
+ export const isMergeClosing = (text) => /\bMERGED\b/.test(text);
25
+ /**
26
+ * A deletion CLAIM is a statement, read by POSITION: the wording at the start
27
+ * of a sentence. The same words quoted mid-sentence — qa's own correction says
28
+ * `My "remote branch deleted" lines … were wrong` — are a mention, not a claim.
29
+ */
30
+ export const DELETE_CLAIM = /(?:^|[.;!]\s+|\n\s*)(?:(?:Remote|Local and remote|Remote and local) (?:branch|ref) deleted|Deleted the remote (?:branch|ref))\b/;
31
+ /** The observation form: what `git ls-remote --heads origin <branch>` returned, and when. */
32
+ export const REMOTE_READ = /remote ref read:\s*(\d+)\s*refs?\s+at\s+(\S+?)(?=[.;,)]?(?:\s|$))/i;
33
+ /** The weaker form: a command was issued; the state is left unclaimed. */
34
+ export const DELETE_REQUESTED = /\bdelete requested\b/i;
35
+ export const ACCEPTED_FORMS = "`remote ref read: 0 refs at <ISO ts>` (an `ls-remote` observation taken AFTER the delete) or `delete requested` (a command issued; state unclaimed)";
36
+ export function closingLineOf(text) {
37
+ const merged = isMergeClosing(text);
38
+ const claimsDelete = DELETE_CLAIM.test(text);
39
+ const r = REMOTE_READ.exec(text);
40
+ const form = r ? "read" : DELETE_REQUESTED.test(text) ? "requested" : null;
41
+ return { merged, claimsDelete, form, ...(r ? { read: { refs: Number(r[1]), at: r[2] } } : {}) };
42
+ }
43
+ /** The refusal: a merge closing that asserts deletion without either accepted form. */
44
+ export function checkClosingLine(text) {
45
+ const closing = closingLineOf(text);
46
+ if (closing.merged && closing.claimsDelete && closing.form === null) {
47
+ return {
48
+ ok: false,
49
+ closing,
50
+ error: `a merge-closing line asserts a branch deletion it has not shown it read — "Remote branch deleted" reports a flag passed, not a remote observed (2 of 2 measured were premature, 5 of 7 were false). ` +
51
+ `State the deletion in one of the two accepted forms: ${ACCEPTED_FORMS}.`,
52
+ };
53
+ }
54
+ return { ok: true, closing };
55
+ }
56
+ /** Every merge closing in a log, judged; `beforeAdoption` for those at or before the floor. */
57
+ export function closingsIn(logText, floorMs = CLOSING_GRAMMAR_ADOPTED_MS) {
58
+ const out = [];
59
+ for (const l of logText.split("\n")) {
60
+ if (!l.trim())
61
+ continue;
62
+ let o;
63
+ try {
64
+ o = JSON.parse(l);
65
+ }
66
+ catch {
67
+ continue;
68
+ }
69
+ if (o.record?.type !== "done")
70
+ continue;
71
+ const text = String(o.text ?? "");
72
+ const c = closingLineOf(text);
73
+ if (!c.merged)
74
+ continue;
75
+ const cited = (o.record.cites ?? []).map((x) => (String(x?.ref ?? "").match(/#(\d+)/) ?? [])[1]).find(Boolean);
76
+ const inText = (text.match(/MERGED[^\n]*?#(\d+)/) ?? [])[1];
77
+ const pr = cited ?? inText;
78
+ const ts = Number(o.ts ?? 0);
79
+ out.push({ pr: pr ? Number(pr) : null, from: String(o.from ?? ""), ts, claimsDelete: c.claimsDelete, form: c.form, beforeAdoption: ts <= floorMs });
80
+ }
81
+ return out.sort((a, b) => a.ts - b.ts);
82
+ }
83
+ //# sourceMappingURL=closing-line.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"closing-line.js","sourceRoot":"","sources":["../src/closing-line.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * ⟨q-cc0819dc⟩ — A `done` MAY CITE A COMMIT WHEN THE WORK HAS NO PR BY RULE.
3
+ *
4
+ * Docs-direct work (queue curation, canon, board moves) is pushed straight to the shared
5
+ * branch by policy; the `done` gate demanded a `{kind:'pr'}` cite, so the compliant path did
6
+ * not exist and the aide downgraded to `fyi` (2026-09-12 15:50). The fix accepts a commit
7
+ * cite — and only a commit that is REAL: a fabricated sha must not become a citable DONE.
8
+ *
9
+ * What "real" means here, stated so the ancestry call below is not mistaken for a merge test:
10
+ * is this exact commit object reachable from origin/main in `repo`? A docs-direct push puts
11
+ * THE COMMIT ITSELF on the shared branch, so reachability is the right question for it — this
12
+ * is not "was this branch's work squashed in", which `--is-ancestor` cannot answer
13
+ * (docs/LANDEDNESS.md); a squash-merged PR is cited by its PR, never by its branch sha.
14
+ *
15
+ * Full 40-hex only, REFUSED rather than normalised: a prefix is a claim about a sha the
16
+ * joiners (verdict/landing/closure readers) compare in full; normalising here would write a
17
+ * sha the sender never saw. No network: one local `git` in `repo`, which the caller passes
18
+ * because the send path has no repository of its own.
19
+ */
20
+ import { execFileSync } from "node:child_process";
21
+ export const FULL_SHA = /^[0-9a-f]{40}$/;
22
+ export const SHARED_BRANCH_CANDIDATES = ["origin/main", "origin/master"];
23
+ function git(repo, args) {
24
+ try {
25
+ const out = execFileSync("git", ["-C", repo, ...args], { encoding: "utf8", stdio: ["ignore", "pipe", "ignore"] });
26
+ return { status: 0, out: out.trim() };
27
+ }
28
+ catch (e) {
29
+ return { status: Number(e.status ?? 1), out: "" };
30
+ }
31
+ }
32
+ /** Verify one commit cite against the shared branch of `repo`. */
33
+ export function verifyCommitCite(ref, repo) {
34
+ const sha = String(ref ?? "").trim();
35
+ if (!FULL_SHA.test(sha)) {
36
+ return { ok: false, why: `commit cite '${sha}' is not a full 40-hex sha — refused, not normalised: a prefix is a claim the joiners compare in full` };
37
+ }
38
+ if (!repo) {
39
+ return { ok: false, why: `commit cite ${sha.slice(0, 7)} cannot be verified without \`repo\` — pass the repository whose origin/main carries it (no network is used)` };
40
+ }
41
+ if (git(repo, ["rev-parse", "--verify", "--quiet", `${sha}^{commit}`]).status !== 0) {
42
+ return { ok: false, why: `commit ${sha.slice(0, 7)} does not exist in ${repo} — a sha the repository has never seen cannot be a citable DONE` };
43
+ }
44
+ for (const branch of SHARED_BRANCH_CANDIDATES) {
45
+ if (git(repo, ["rev-parse", "--verify", "--quiet", branch]).status !== 0)
46
+ continue;
47
+ // Is the cited commit reachable from the shared branch? (the reachability question,
48
+ // asked of the commit object itself — see the header for why that is the right one here)
49
+ if (git(repo, ["merge-base", "--is-ancestor", sha, branch]).status === 0)
50
+ return { ok: true, sha, branch };
51
+ return { ok: false, why: `commit ${sha.slice(0, 7)} exists but is not reachable from ${branch} — work that is done is on the shared branch; a commit that is not is not done` };
52
+ }
53
+ return { ok: false, why: `${repo} has no origin/main or origin/master to verify commit ${sha.slice(0, 7)} against — fetch the shared branch first` };
54
+ }
55
+ //# sourceMappingURL=commit-cite.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"commit-cite.js","sourceRoot":"","sources":["../src/commit-cite.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EAAE,YAAY,EAAE,MAAM,oBAAoB,CAAC;AAElD,MAAM,CAAC,MAAM,QAAQ,GAAG,gBAAgB,CAAC;AACzC,MAAM,CAAC,MAAM,wBAAwB,GAAG,CAAC,aAAa,EAAE,eAAe,CAAC,CAAC;AAMzE,SAAS,GAAG,CAAC,IAAY,EAAE,IAAc;IACvC,IAAI,CAAC;QACH,MAAM,GAAG,GAAG,YAAY,CAAC,KAAK,EAAE,CAAC,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,CAAC,EAAE,EAAE,QAAQ,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,CAAC,CAAC;QAClH,OAAO,EAAE,MAAM,EAAE,CAAC,EAAE,GAAG,EAAE,GAAG,CAAC,IAAI,EAAE,EAAE,CAAC;IACxC,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,OAAO,EAAE,MAAM,EAAE,MAAM,CAAE,CAAyB,CAAC,MAAM,IAAI,CAAC,CAAC,EAAE,GAAG,EAAE,EAAE,EAAE,CAAC;IAC7E,CAAC;AACH,CAAC;AAED,kEAAkE;AAClE,MAAM,UAAU,gBAAgB,CAAC,GAAW,EAAE,IAAwB;IACpE,MAAM,GAAG,GAAG,MAAM,CAAC,GAAG,IAAI,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;IACrC,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC;QACxB,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,gBAAgB,GAAG,uGAAuG,EAAE,CAAC;IACxJ,CAAC;IACD,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,eAAe,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,8GAA8G,EAAE,CAAC;IAC1K,CAAC;IACD,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,GAAG,GAAG,WAAW,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACpF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,sBAAsB,IAAI,iEAAiE,EAAE,CAAC;IAClJ,CAAC;IACD,KAAK,MAAM,MAAM,IAAI,wBAAwB,EAAE,CAAC;QAC9C,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,SAAS;QACnF,oFAAoF;QACpF,yFAAyF;QACzF,IAAI,GAAG,CAAC,IAAI,EAAE,CAAC,YAAY,EAAE,eAAe,EAAE,GAAG,EAAE,MAAM,CAAC,CAAC,CAAC,MAAM,KAAK,CAAC;YAAE,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,CAAC;QAC3G,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,UAAU,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,qCAAqC,MAAM,gFAAgF,EAAE,CAAC;IAClL,CAAC;IACD,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,GAAG,EAAE,GAAG,IAAI,yDAAyD,GAAG,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,0CAA0C,EAAE,CAAC;AACvJ,CAAC"}