@nanobpm/nano-workforce 0.187.3 → 0.187.4
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/README.md +1 -1
- package/SPEC.md +2 -2
- package/app/contracts.ts +1 -0
- package/app/persist-escalation.test.ts +1 -1
- package/app/reviewWait.test.ts +7 -0
- package/app/reviewWait.ts +1 -1
- package/docs/agent-guide.md +1 -1
- package/package.json +1 -1
package/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,9 @@
|
|
|
1
|
+
## [0.187.4](https://github.com/nanobpm/nano-workforce/compare/v0.187.3...v0.187.4) (2026-09-14)
|
|
2
|
+
|
|
3
|
+
### Bug Fixes
|
|
4
|
+
|
|
5
|
+
* raise default review-wait timeout to PT30M ([#792](https://github.com/nanobpm/nano-workforce/issues/792)) ([042573d](https://github.com/nanobpm/nano-workforce/commit/042573dc5e691dc97efebc12da6a63f2cf398c2a)), closes [#783](https://github.com/nanobpm/nano-workforce/issues/783) [#791](https://github.com/nanobpm/nano-workforce/issues/791)
|
|
6
|
+
|
|
1
7
|
## [0.187.3](https://github.com/nanobpm/nano-workforce/compare/v0.187.2...v0.187.3) (2026-09-14)
|
|
2
8
|
|
|
3
9
|
### Bug Fixes
|
package/README.md
CHANGED
|
@@ -360,7 +360,7 @@ agent at that URL to author, compile, and submit a graph unaided. See
|
|
|
360
360
|
| `NANO_PR_MERGE_METHOD` | `squash` | merge method: `squash`, `merge`, or `rebase` |
|
|
361
361
|
| `NANO_PR_MERGE_ADMIN` | `0` | pass `--admin` to override failing non-required checks (use with care) |
|
|
362
362
|
| `NANO_PR_MAX_CI_FIX_ROUNDS` | `3` | max `senior:fix-ci` attempts to green a `blocked` PR before escalating; `0` disables (escalate immediately), clamped 0–20 |
|
|
363
|
-
| `NANO_PR_REVIEW_WAIT_TIMEOUT` | `
|
|
363
|
+
| `NANO_PR_REVIEW_WAIT_TIMEOUT` | `PT30M` | ISO-8601 duration the loop waits for a fresh review before escalating a stalled review (timer arm of the `wait-review` gateway) |
|
|
364
364
|
| `NANO_PR_REVIEW_NUDGE_MINUTES` | `5` | cooldown between the poller's automatic reviewer re-request nudges for one waiting PR (clamped 1–1440) |
|
|
365
365
|
| `NANO_WORKFORCE_BASE_URL` | `http://localhost:3000` | externally-reachable base URL for the capability hooks (`/app/api/hooks/*`). Must resolve from **wherever the agent runs** — set it to the app's LAN address (or console-proxy URL) for a remote fleet. See [Fleet networking](#fleet-networking-remote-workers) |
|
|
366
366
|
| `NANO_AGENTIC_SECRET` | — | enables **secure mode** for the agentic visibility channel (`/agentic`): every peer must present the **same** `NANO_AGENTIC_SECRET` value (set the identical env var on the server and every worker box — Tab A → Slot A). Unset = on-by-default **LOCAL mode** — the well-known token is honoured from **any origin** (open on the trusted LAN, matching the engine's posture); exposure is governed by the server bind address, not a shared secret. Also accepts `NANO_PR_WEBHOOK_SECRET` |
|
package/SPEC.md
CHANGED
|
@@ -133,7 +133,7 @@ Notes:
|
|
|
133
133
|
canonical `readiness-ready` wait-gate message (ADR 0001 §2; correlated by the
|
|
134
134
|
poller when a fresh review lands)
|
|
135
135
|
against a `=reviewWaitTimeout` timer (seeded at submit from
|
|
136
|
-
`NANO_PR_REVIEW_WAIT_TIMEOUT`, default `
|
|
136
|
+
`NANO_PR_REVIEW_WAIT_TIMEOUT`, default `PT30M`). Whichever fires first
|
|
137
137
|
withdraws the other — the message arm advances `round`, the timer arm escalates
|
|
138
138
|
a **stalled review** (`blocked`) so a human decides rather than the instance
|
|
139
139
|
hanging forever. Because `persist-round` already recorded this `round` as
|
|
@@ -544,7 +544,7 @@ queries skip (`merging`), so a slow pass can't double-signal.
|
|
|
544
544
|
| `NANO_PR_AUTO_MERGE` | 1 | run the merge stage after convergence (`0` = review-only; per-submit `convergeOnly: true` override) |
|
|
545
545
|
| `NANO_PR_MERGE_METHOD` | squash | `squash` \| `merge` \| `rebase` |
|
|
546
546
|
| `NANO_PR_MERGE_ADMIN` | 0 | pass `--admin` on merge |
|
|
547
|
-
| `NANO_PR_REVIEW_WAIT_TIMEOUT` |
|
|
547
|
+
| `NANO_PR_REVIEW_WAIT_TIMEOUT` | PT30M | ISO-8601 wait before a stalled review escalates (timer arm of the `wait-review` event-based gateway); malformed → default |
|
|
548
548
|
| `NANO_PR_REVIEW_NUDGE_MINUTES` | 5 | cooldown between poller Copilot re-request nudges per PR (clamped 1–1440) |
|
|
549
549
|
|
|
550
550
|
## 13. Planning fan-out (`plan-fanout.bpmn`) — issue #14
|
package/app/contracts.ts
CHANGED
|
@@ -145,6 +145,7 @@ export const ENV_CONTRACTS = {
|
|
|
145
145
|
name: "NANO_PR_REVIEW_WAIT_TIMEOUT",
|
|
146
146
|
owner: "app/service.ts",
|
|
147
147
|
semantics: "How long to wait for a review before nudging/escalating (FEEL/ISO-8601 duration).",
|
|
148
|
+
default: "PT30M",
|
|
148
149
|
},
|
|
149
150
|
NANO_PR_REVIEW_NUDGE_MINUTES: {
|
|
150
151
|
category: "env",
|
|
@@ -190,7 +190,7 @@ test("persist-escalation heals from the prKey when repo/prNumber are absent", as
|
|
|
190
190
|
// never a dead wait with a null question (the #333 defect).
|
|
191
191
|
test("a control-flow arm with a concrete question opens an escalation gw-escalated can park", async () => {
|
|
192
192
|
const { app, inserts } = fakeApp();
|
|
193
|
-
const question = "No review arrived within the review-wait timeout (
|
|
193
|
+
const question = "No review arrived within the review-wait timeout (PT30M). A human must decide how to proceed.";
|
|
194
194
|
const job = { variables: { prKey: "o/r#5", round: 2, status: "blocked", question, recordRound: false } };
|
|
195
195
|
const out = await handler(job as any, app as any);
|
|
196
196
|
assertEquals((out as any).escalated, true, "a real control-flow escalation reports escalated:true");
|
package/app/reviewWait.test.ts
CHANGED
|
@@ -13,6 +13,13 @@ import {
|
|
|
13
13
|
reviewWaitTimeout,
|
|
14
14
|
} from "./reviewWait.ts";
|
|
15
15
|
|
|
16
|
+
test("DEFAULT_REVIEW_WAIT_TIMEOUT: pins the user-visible default to PT30M", () => {
|
|
17
|
+
// A direct regression guard on the literal default — the fallback-based assertions below compare
|
|
18
|
+
// against DEFAULT_REVIEW_WAIT_TIMEOUT itself, so they would still pass if it were accidentally
|
|
19
|
+
// reverted to PT20M. This anchors the intended value so that change is caught.
|
|
20
|
+
assertEquals(DEFAULT_REVIEW_WAIT_TIMEOUT, "PT30M");
|
|
21
|
+
});
|
|
22
|
+
|
|
16
23
|
test("reviewWaitTimeout: blank / absent / malformed → default", () => {
|
|
17
24
|
assertEquals(reviewWaitTimeout(undefined), DEFAULT_REVIEW_WAIT_TIMEOUT);
|
|
18
25
|
assertEquals(reviewWaitTimeout(""), DEFAULT_REVIEW_WAIT_TIMEOUT);
|
package/app/reviewWait.ts
CHANGED
|
@@ -12,7 +12,7 @@
|
|
|
12
12
|
|
|
13
13
|
/** Default review-wait timeout (ISO-8601 duration): how long the loop waits for a fresh review
|
|
14
14
|
* before the timer arm of the event-based gateway fires and it escalates to a human. */
|
|
15
|
-
export const DEFAULT_REVIEW_WAIT_TIMEOUT = "
|
|
15
|
+
export const DEFAULT_REVIEW_WAIT_TIMEOUT = "PT30M";
|
|
16
16
|
|
|
17
17
|
// A pragmatic ISO-8601 duration matcher: requires a leading `P`, at least one component, and a
|
|
18
18
|
// `T` before any time components (with at least one time component after it). Good enough to
|
package/docs/agent-guide.md
CHANGED
|
@@ -470,7 +470,7 @@ Work through this order:
|
|
|
470
470
|
3. **Check for an open escalation** (§3) — the process may simply be waiting for a
|
|
471
471
|
human answer. Answer it.
|
|
472
472
|
4. **A review that never arrives** escalates on its own after
|
|
473
|
-
`NANO_PR_REVIEW_WAIT_TIMEOUT` (default `
|
|
473
|
+
`NANO_PR_REVIEW_WAIT_TIMEOUT` (default `PT30M`); the poller also re-nudges the
|
|
474
474
|
reviewer periodically. If the reviewer bot is not provisioned on the repo, no
|
|
475
475
|
review will ever land — that is a repo-config problem, not an app bug.
|
|
476
476
|
5. **Cancel + resubmit** as a last resort. Cancel through the **app-owned** door —
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@nanobpm/nano-workforce",
|
|
3
|
-
"version": "0.187.
|
|
3
|
+
"version": "0.187.4",
|
|
4
4
|
"description": "Nano Workforce — an Agent Graph Orchestration application for Agentic SDLC: durable BPMN processes that coordinate a graph of AI agents across the software delivery lifecycle.",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"main": "main.ts",
|