@nanobpm/nano-workforce 0.200.4 → 0.200.6

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/CHANGELOG.md CHANGED
@@ -1,3 +1,15 @@
1
+ ## [0.200.6](https://github.com/nanobpm/nano-workforce/compare/v0.200.5...v0.200.6) (2026-10-04)
2
+
3
+ ### Bug Fixes
4
+
5
+ * **delivery-graph:** dispatch large graphs without UI timeout or a stranded phantom run ([#853](https://github.com/nanobpm/nano-workforce/issues/853)) ([d1adc47](https://github.com/nanobpm/nano-workforce/commit/d1adc4752690a91cb764ec3a49015f5a46ac7378)), closes [#852](https://github.com/nanobpm/nano-workforce/issues/852) [#852](https://github.com/nanobpm/nano-workforce/issues/852)
6
+
7
+ ## [0.200.5](https://github.com/nanobpm/nano-workforce/compare/v0.200.4...v0.200.5) (2026-10-04)
8
+
9
+ ### Bug Fixes
10
+
11
+ * don't tell a part-scope node to close its issue; gate commit bodies ([#859](https://github.com/nanobpm/nano-workforce/issues/859)) ([daf36d5](https://github.com/nanobpm/nano-workforce/commit/daf36d57a29f2910b532e6c2b0395d9b938802dc)), closes [#858](https://github.com/nanobpm/nano-workforce/issues/858) [#858](https://github.com/nanobpm/nano-workforce/issues/858) [#858](https://github.com/nanobpm/nano-workforce/issues/858) [#N](https://github.com/nanobpm/nano-workforce/issues/N) [#N](https://github.com/nanobpm/nano-workforce/issues/N) [connective/#N](https://github.com/connective/nano-workforce/issues/N) [owner/beta#12](https://github.com/owner/beta/issues/12) [owner/repo#N](https://github.com/owner/repo/issues/N) [#N](https://github.com/nanobpm/nano-workforce/issues/N) [#12](https://github.com/nanobpm/nano-workforce/issues/12) [#12](https://github.com/nanobpm/nano-workforce/issues/12) [issue-#N](https://github.com/nanobpm/issue-/issues/N) [#12](https://github.com/nanobpm/nano-workforce/issues/12) [#12](https://github.com/nanobpm/nano-workforce/issues/12) [#12](https://github.com/nanobpm/nano-workforce/issues/12) [#858](https://github.com/nanobpm/nano-workforce/issues/858) [#858](https://github.com/nanobpm/nano-workforce/issues/858) [#12](https://github.com/nanobpm/nano-workforce/issues/12) [#858](https://github.com/nanobpm/nano-workforce/issues/858) [#12](https://github.com/nanobpm/nano-workforce/issues/12) [#12](https://github.com/nanobpm/nano-workforce/issues/12) [#12](https://github.com/nanobpm/nano-workforce/issues/12) [#N](https://github.com/nanobpm/nano-workforce/issues/N) [owner/repo#N](https://github.com/owner/repo/issues/N) [#N](https://github.com/nanobpm/nano-workforce/issues/N) [#12](https://github.com/nanobpm/nano-workforce/issues/12) [#12](https://github.com/nanobpm/nano-workforce/issues/12) [#12](https://github.com/nanobpm/nano-workforce/issues/12) [#12](https://github.com/nanobpm/nano-workforce/issues/12) [#12](https://github.com/nanobpm/nano-workforce/issues/12) [#12](https://github.com/nanobpm/nano-workforce/issues/12) [#12](https://github.com/nanobpm/nano-workforce/issues/12) [#N](https://github.com/nanobpm/nano-workforce/issues/N) [#12](https://github.com/nanobpm/nano-workforce/issues/12) [#13](https://github.com/nanobpm/nano-workforce/issues/13) [owner/repo#N](https://github.com/owner/repo/issues/N) [856/#857](https://github.com/856/nano-workforce/issues/857)
12
+
1
13
  ## [0.200.4](https://github.com/nanobpm/nano-workforce/compare/v0.200.3...v0.200.4) (2026-10-04)
2
14
 
3
15
  ### Bug Fixes
package/SPEC.md CHANGED
@@ -285,6 +285,39 @@ Notes:
285
285
  the (re-dispatched) agent cannot decide and returns **`needs_input`** — that
286
286
  routes through the normal status-escalation arm to `wait-answer`. Decline =
287
287
  agent-adjudicated → converge; `needs_input` = agent defers → human.
288
+ - **Scope-integrity gate: a closed issue must not be under-delivered (issue #858).**
289
+ Convergence is guarded against a partial delivery that silently under-delivers a
290
+ broader-scoped parent — an agent ships one slice of an issue, `Closes #N` it, and
291
+ records the deferred remainder only in prose (never a filed, tracked issue), so the
292
+ parent reads as fully done. Two layers enforce this:
293
+ - **Compile/lint-time (deterministic, lexical).** `validateDeliveryGraph`
294
+ (`app/deliveryGraph.ts`, `isPartialScopeClose`) rejects an `agent` node whose
295
+ `prompt` pairs a GitHub closing keyword (`Closes/Fixes/Resolves #N`,
296
+ `owner/repo#N`, or an issue URL) with NO full-scope acknowledgement **tied to
297
+ that same issue** (`partial-scope-close`). The acknowledgement must assert THIS
298
+ brief owns the issue's whole stated scope and be anchored to the issue it closes:
299
+ a marker for a different issue, one **attributed to siblings/others**, one
300
+ **negated/disclaimed** in its clause ("does not deliver the full scope of #N"),
301
+ or one **qualified down to a part** ("the whole issue's parser slice") does not
302
+ count. Issue **identity preserves the repository** — `owner/alpha#12`,
303
+ `owner/beta#12`, and a bare `#12` are distinct, so an acknowledgement of one repo
304
+ cannot licence closing a same-numbered issue in another. A part-scoped brief must
305
+ instead reference the issue non-blockingly (`Part of #N` / `Refs #N`) and leave
306
+ it open.
307
+ - **Convergence-time (semantic, `scope-classify`).** After the comment-gate passes,
308
+ the `Scope classifier` (`resources/prompts/scope-classify.md`) reads each closed
309
+ issue's stated scope and blocks (`scopeBlocked = true`, routing to a human) when
310
+ the PR leaves part of a *closed* issue's stated scope undelivered with the
311
+ remainder untracked. It extracts closing keywords from the **PR title, the PR
312
+ body, AND every commit body** (via `git log origin/<base>..<head>`, not the GitHub
313
+ CLI's
314
+ `--json commits`, which silently truncates at 100 entries): this repo family
315
+ **squash-merges with `COMMIT_MESSAGES`**, so the squash commit concatenates every
316
+ commit body — and takes the **PR title as its subject** — so a `Closes #N` left in
317
+ ANY commit body (or in the PR title) closes #N on merge even if
318
+ the PR body was later reworded to `Part of #N`. Such a PR — body `Part of #N`,
319
+ a commit body still `Closes #N`, part of #N undelivered and untracked — is a
320
+ genuine under-delivery the gate blocks (naming the offending commit to reword).
288
321
  - **No-progress guard + husk classification (issue #786).** Before the review
289
322
  wait, an `addressed` round passes through `pr.progress-check`
290
323
  (`workers/progress-check/worker.ts`, mirrored by `app/roundProgress.ts`): it