@nanobpm/nano-workforce 0.200.4 → 0.200.5
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 +6 -0
- package/SPEC.md +33 -0
- package/app/deliveryGraph.test.ts +1750 -0
- package/app/deliveryGraph.ts +1277 -1
- package/package.json +1 -1
- package/resources/prompts/feature.md +11 -0
- package/resources/prompts/plan.md +61 -4
- package/resources/prompts/scope-classify.md +35 -2
- package/scripts/scope-closing-keyword.test.ts +139 -0
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
## [0.200.5](https://github.com/nanobpm/nano-workforce/compare/v0.200.4...v0.200.5) (2026-10-04)
|
|
2
|
+
|
|
3
|
+
### Bug Fixes
|
|
4
|
+
|
|
5
|
+
* 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)
|
|
6
|
+
|
|
1
7
|
## [0.200.4](https://github.com/nanobpm/nano-workforce/compare/v0.200.3...v0.200.4) (2026-10-04)
|
|
2
8
|
|
|
3
9
|
### 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
|