agents: Dewey row 146 build packet, a message to a stopped role tells launch.by and the sender (#1640)
Candidate manifest 616f953fe09bfc198645886bc4c7228a0fdeafa8c89b1729f2be8a5222689607 on dda7e31b0.
Owner's gate 23:11:36Z-23:15:46Z exit 0; mutants 17 of 17 killed.
Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
@@ -0,0 +1,238 @@
|
||||
# Row 146 (#1640): a message to a stopped role tells the launcher and the sender
|
||||
|
||||
Builder: Dewey. Reviewer: Filbert. Gate owner: Sage.
|
||||
Brief: docs/plans/2026-10-15_q167-rows-r2.md, lines 32-110 (the preamble of
|
||||
2026-10-15_q167-north-star-rows.md applies). Calls agreed in sage-0404; priority and the
|
||||
chief-of-staff.md fix in sage-0407.
|
||||
|
||||
Base: dda7e31b0c0fbd3e85c143dafa864ef0a29883c9 (base.txt, origin/refactor after rows 144 and
|
||||
145). The candidate is build.patch on that base, and candidate-manifest.sha256 lists every
|
||||
changed path with its sha256. repro.sh applies the patch to a fresh detached worktree and checks
|
||||
the digests.
|
||||
|
||||
## The calls (sage-0404: agreed, written as stated)
|
||||
|
||||
1. **No bus autostart of launch.by.** talk prints a restart line instead. The launcher doesn't
|
||||
know whether the host was started with --pm, and a host without it means the operator chose
|
||||
no PM. An autostart spends tokens with no human command. A dedupe per waiting message would
|
||||
live only in host memory. It is also the smaller surface on the critical path. The autostart
|
||||
stays a follow-up. The line names the unit, `mosaic-bus@<business>`, because the live host
|
||||
runs as that unit installed with --pm. The README gives the hand-started form (`mosaic bus
|
||||
stop`, then `mosaic bus start <business> --pm`).
|
||||
|
||||
**Refined while building:** `bus start --pm` is the only path that launches launch.by
|
||||
(packages/cli/src/launcher.mjs:467-472, launchPm). A unit installed without --pm restarts
|
||||
with no PM, so the line now says the restart starts it "if the unit runs with --pm" and names
|
||||
the check, `scripts/bus-service.sh status <business>`, which prints `pm: on` or `pm: off`.
|
||||
2. **The notice's sender is from_role `_bus`, from_run `bus`.** ID_PATTERN is
|
||||
`/^[a-z0-9][a-z0-9._-]{0,63}$/`, so no role instance can be named `_bus`. Plain `bus` would
|
||||
pass requireId and could collide.
|
||||
3. **The notice's class is RESULT.** See "Why RESULT" below; the reason as first stated was
|
||||
wrong in one detail, corrected there.
|
||||
4. **No notice** for a message to launch.by, or in a thread to a thread instance (the brief's
|
||||
two), or from launch.by (added). launch.by is told through message.send's result, and
|
||||
otherwise chief's own auto-RESULT to an ended run would wake chief again.
|
||||
5. **The notice is sent only from message.send.** review.request, thread.send and
|
||||
decision-close messages to a stopped role still wait silently. Follow-up.
|
||||
|
||||
Two more calls made while building:
|
||||
|
||||
6. **A tester's message tells nobody.** A PM test (`--tester`) authorizes nothing, so it wakes no
|
||||
launcher. message.send's result still says the role isn't running, with `told: false`, and
|
||||
talk says "a tester's message tells nobody to launch it". A message to the tester, like one to
|
||||
the human, gets no `waiting` field: no run ever holds either.
|
||||
7. **Dedupe is structural, not a store lookup.** The brief says "deduplicated through the
|
||||
store". Only message.send calls `#notice`, once, for the message it has just stored, inside
|
||||
the verb's transaction (every message verb runs in `this.#store.transaction`). A re-route at
|
||||
claim (`#routeWaiting`), a release, a restart and a new claim never reach `#notice`, so a
|
||||
second notice for one message has no path. I wrote a store pre-check (`SELECT ... WHERE
|
||||
from_role='_bus' AND in_reply_to=?`) first and removed it: it could never find a row, so it
|
||||
was dead code no test could reach. The notice row itself is in the store, `in_reply_to` the
|
||||
waiting message, and test 3 checks the count across claim, release, restart and a new claim.
|
||||
|
||||
## The change
|
||||
|
||||
**packages/bus/src/broker.mjs**
|
||||
|
||||
- `NOTICE_ROLE = '_bus'`, `NOTICE_RUN = 'bus'`.
|
||||
- message.send ends with `#waiting(s, mid, a.to, thread)`. Its result is `{id, request}` as
|
||||
before when a run holds the target, and `{id, request, waiting}` when none does.
|
||||
- `#waiting` returns null for the human, the tester, a thread instance in a thread, or a target a
|
||||
run holds (`#recipient`). Otherwise it reads `launch.by`, decides `told` (a launcher exists, the
|
||||
target isn't it, the sender isn't it, the sender isn't the tester), sends the notice when told,
|
||||
and returns `{role, launcher, told, launcherRunning}`. `launcherRunning` is null with no
|
||||
launcher.
|
||||
- `#notice` inserts the message directly (it skips requireId, which `_bus` fails) and routes it
|
||||
to launch.by through `#route`, so a stopped chief gets it at claim like any waiting message.
|
||||
Body: `Message <id> from <sender> to <role> waits: <role> has no running session. Launch <role>
|
||||
within the launch block's limits, or tell <sender> why not with message.send in_reply_to <id>.`
|
||||
|
||||
**packages/cli/src/cli.mjs** — `waitingLines`, printed once after `sent`:
|
||||
|
||||
| Case | Line |
|
||||
|---|---|
|
||||
| no launch.by | `pm isn't running, and the business names no launch.by` |
|
||||
| target is launch.by | the restart line for it |
|
||||
| tester sender | `pm isn't running; a tester's message tells nobody to launch it` |
|
||||
| told, launcher running | `pm isn't running, chief has been told` |
|
||||
| told, launcher stopped | the told line, then the restart line with "either" |
|
||||
|
||||
Restart line: `<role> isn't running[ either]. systemctl --user restart mosaic-bus@<business>
|
||||
starts it if the unit runs with --pm (scripts/bus-service.sh status <business> shows pm: on).
|
||||
The restart stops running sessions.` The business is read only when a restart line prints.
|
||||
|
||||
**roles/chief-of-staff.md**
|
||||
|
||||
- A duty after the Launch bullet: a message from `_bus` names a waiting message, its sender and
|
||||
the role. Launch the role within the launch block's limits, or tell the sender why not with a
|
||||
message `in_reply_to` the waiting message. Don't reply to `_bus`.
|
||||
- sage-0407 item 3: "raise a `policy.change` decision until the broker gives you a verb for the
|
||||
organization file" is replaced. Row 132 gave that verb, the `change_organization` tool
|
||||
(packages/harness/src/tools.mjs:151-152), which changes limits, the model table and each
|
||||
instance's model. Hiring an instance or changing what one may do still takes a policy.change
|
||||
decision, and the sentence now says so.
|
||||
|
||||
**READMEs.** packages/bus/README.md: the message.send row and a "Launch notices" section.
|
||||
packages/cli/README.md: talk's lines, the restart command with its --pm condition, the
|
||||
hand-started form, and that no verb launches launch.by on a running host. docs/TOOLS.md has no
|
||||
talk output detail, so it is unchanged.
|
||||
|
||||
No schema step. messages.class has no CHECK constraint, and RESULT is an existing class.
|
||||
|
||||
## `_bus` stays internal (sage-0404)
|
||||
|
||||
`#notice` is private and has one caller, `#waiting`, inside message.send. No verb takes a sender.
|
||||
launch-notice test 7 checks:
|
||||
|
||||
- ID_PATTERN rejects `_bus`, so no business file can declare it.
|
||||
- For the human and a role (coder), message.send with `_bus` in each field a caller controls:
|
||||
`to` refuses unknown-role; `from_role` and `from_run` refuse invalid-request (unknown fields);
|
||||
`class` refuses invalid-class; `in_reply_to` and `corrects` refuse invalid-request; `decision`
|
||||
refuses decision-not-found.
|
||||
- chief replying to `_bus` with `in_reply_to` the notice refuses unknown-role. chief's answer to
|
||||
the sender stores from_role chief, and the notice count stays 1.
|
||||
|
||||
## Why RESULT, and where the test lives (sage-0404)
|
||||
|
||||
harness/src/runner.mjs:386-397: for a message whose class isn't RESULT the runner auto-replies
|
||||
with message.send to `m.from_role`, then calls message.read in the same try. If the reply throws,
|
||||
it logs `runner: reply to <id> failed` and skips the read.
|
||||
|
||||
**Correction to call 3 as first stated.** I said a non-RESULT notice would be "processed again: a
|
||||
turn loop". That is wrong. message.receive returns only messages with no `delivered` or `read`
|
||||
row, and the notice is `delivered` once it is received, so it is never received again. What a
|
||||
non-RESULT class would do: the auto-reply to `_bus` refuses unknown-role, the runner logs the
|
||||
failure and skips the read, and the notice stays unread for good. No loop, but an error per
|
||||
notice and an unread message in chief's inbox. With RESULT, chief takes one turn, sends no
|
||||
auto-reply, and reads it.
|
||||
|
||||
The test is at runner level, in **packages/harness/tests/runner.test.mjs**: "the bus's launch
|
||||
notice is one turn with no reply, and is not taken again". The runner runs as chief (the fixture
|
||||
sets `launch.by: chief`), the human sends to coder, and the test waits for the notice to be read.
|
||||
pm then sends chief a request, and its reply arrives, so the runner has taken another pass. It
|
||||
asserts: the turns dir is exactly `0001.stderr`, `0002.stderr` (one turn for the notice, one for
|
||||
pm); the notice has exactly one `delivered` and one `read` row; chief sent nothing in reply to the
|
||||
notice; stderr has no `reply to ... failed`. Mutant B10 (class INFO) is killed by this test.
|
||||
|
||||
## Readers of `_bus` (sage-0404)
|
||||
|
||||
Each renders `from_role` as text with no role lookup, so a `_bus` sender renders without an error.
|
||||
Lines checked on the candidate:
|
||||
|
||||
- `mosaic read`/`follow`: packages/cli/src/cli.mjs:212 (`formatMessage`) and
|
||||
packages/cli/src/format.mjs:78.
|
||||
- The Console: packages/webui/src/public/bus.js:174-176 and 181 (trail and grouping; a non-human
|
||||
sender becomes `actor: {role, run}`), 267 (a message's replies, so the notice shows under the
|
||||
waiting message, since it is `in_reply_to` it), 321 (a role's waiting list).
|
||||
- The runner: packages/harness/src/runner.mjs:65 (the turn's header line), 75 (the tester check,
|
||||
a string compare).
|
||||
|
||||
No change was needed in any of them.
|
||||
|
||||
## Tests
|
||||
|
||||
- **packages/bus/tests/launch-notice.test.mjs, new, 7 tests.** Fixture: chief, assistant (the
|
||||
shipped messaging lists, as threads.test.mjs does), pm, coder; `launch.by: chief`;
|
||||
`bus.tester: true`.
|
||||
1. A message to a stopped role: exactly one notice, every field and the full body checked, its
|
||||
delivery waits with no holder; chief receives it at claim; with chief running,
|
||||
`launcherRunning` is true; a role sender (coder) tells chief too.
|
||||
2. A message to a running role: no notice, result keys exactly `id`, `request`.
|
||||
3. A re-route at claim, a release, a broker restart and a new claim: still one notice, and the
|
||||
new run receives the waiting message.
|
||||
4. Launched but not claimed counts as no holder (brief: accepted, documented in the README).
|
||||
5. No notice to launch.by, from launch.by, from a tester, to the human, to the tester (a tester
|
||||
ping, then coder's reply `in_reply_to` it), or a thread reply to the assistant.
|
||||
6. No launch block: `{launcher: null, told: false, launcherRunning: null}`, no notice.
|
||||
7. `_bus` internal, above.
|
||||
- **packages/harness/tests/runner.test.mjs**, one new test, above. setup takes `launchBy`.
|
||||
- **packages/cli/tests/verbs.test.mjs**, "talk says when the role isn't running, whether
|
||||
launch.by was told, and how to start launch.by": the no-launch-block line; nothing for a running
|
||||
coder; with launch.by pm, cto gets the told line and pm's "either" restart line; pm gets its own
|
||||
restart line and the `_bus` count stays 1; once pm is claimed, cto gets the told line only.
|
||||
helpers.mjs `broker()` takes a businesses argument for it.
|
||||
- **packages/cli/tests/tester.test.mjs**, "talk --tester to a stopped role says nobody is told to
|
||||
launch it": the exact output and a `_bus` count of 0.
|
||||
|
||||
The brief's list: one notice (1), none for a running role (2), none at re-route and restart (3),
|
||||
both waiting lines and the restart line for launch.by (verbs).
|
||||
|
||||
## Row 142
|
||||
|
||||
Row 142 (Researcher) also changes talk in cli.mjs and verbs.test.mjs. It had not landed at
|
||||
dda7e31b0. Whichever row lands second rebases on the other. My cli.mjs change is one function
|
||||
before the talk comment and one line after the `sent` print.
|
||||
|
||||
## Follow-ups (not in this row)
|
||||
|
||||
- Notices from review.request, thread.send and decision close, which still wait silently (call 5).
|
||||
- The bus starting launch.by itself (call 1), through the launcher tick and launchPm.
|
||||
- roles/chief-of-staff.md's Protocol section still says "You have no write tool" and lists only
|
||||
the launch and message tools; row 132 added `change_organization`. Researcher's row 140 edits
|
||||
the same file, so I left it for 140.
|
||||
|
||||
## Receipts
|
||||
|
||||
- **repro.sh** into a fresh worktree: DIGESTS_OK.
|
||||
- **Every test file the candidate adds or changes** (sage-0413), on the candidate at 23:05:29Z,
|
||||
all 0 fail and 0 skipped: bus launch-notice 7, cli tester 7, cli verbs 7, harness runner 24.
|
||||
cli/tests/helpers.mjs is not a test file; every cli test imports it and the gate runs them all.
|
||||
- **Other singles** before that, 0 fail: bus messaging 13, threads 14, tester 11, broker 16;
|
||||
business chief-of-staff 10.
|
||||
- **Base check:** origin/refactor is dda7e31b0. No commit in dda7e31b0..HEAD touches a manifest
|
||||
path.
|
||||
|
||||
The slot was granted by Sage in sage-0417 at 23:06:21Z.
|
||||
|
||||
- **Mutants:** run from 2026-10-15T23:06:30Z to 23:11:24Z. 17 of 17 killed, and the source was
|
||||
restored; DIGESTS_OK afterwards. Details are in MUTANTS.md.
|
||||
- **Gate:** gate.sh run from ~/dewey-scratch/r146, 2026-10-15T23:11:36Z to 23:15:46Z, exit 0.
|
||||
The output is in gate-run.log and the logs are under gate/. It ran the touched packages and
|
||||
every package that imports the bus, then every scripts/test-*.sh:
|
||||
|
||||
| Step | Result |
|
||||
|---|---|
|
||||
| bus | 259 pass, 0 fail |
|
||||
| business | 106 pass, 0 fail |
|
||||
| cli | 209 pass, 0 fail |
|
||||
| harness | 101 pass, 0 fail |
|
||||
| plugins | 28 pass, 0 fail |
|
||||
| seat | 135 pass, 0 fail |
|
||||
| tasks | 97 pass, 0 fail |
|
||||
| webui | 113 pass, 0 fail |
|
||||
| test-auth | 15 passed, 0 failed |
|
||||
| test-conductor | 17 passed, 0 failed |
|
||||
| test-config | 24 passed, 0 failed |
|
||||
| test-discord | 78 passed, 0 failed |
|
||||
| test-extension-package | 18 passed, 0 failed |
|
||||
| test-foundation | 44 passed, 0 failed |
|
||||
| test-land-work | 84 passed, 0 failed |
|
||||
| test-queue | 28 passed, 0 failed |
|
||||
| test-release | 14 passed, 0 failed |
|
||||
| test-task | 98 passed, 0 failed |
|
||||
|
||||
Flakes #258, #261, #262 and #263 did not recur. The packages that don't import the bus
|
||||
(control-board, conversation, discord, ledger, mosaic, runs) are left to Sage's full gate.
|
||||
business runs here because its chief-of-staff test reads roles/chief-of-staff.md.
|
||||
- **Docker:** the gate left no network. The only `wt_default` network on the host was created
|
||||
at 17:42Z, before this gate started, so I left it in place.
|
||||
@@ -0,0 +1,59 @@
|
||||
# Row 146 (#1640) mutants
|
||||
|
||||
There is one mutant per new check: 12 in packages/bus/src/broker.mjs (`#waiting`, `#notice` and
|
||||
message.send's result) and 5 in packages/cli/src/cli.mjs (`waitingLines` and its print).
|
||||
mutants.py applies each one to ~/dewey-scratch/r146/wt, then runs these files, with each
|
||||
package as the working directory:
|
||||
|
||||
- bus: tests/launch-notice.test.mjs
|
||||
- harness: tests/runner.test.mjs
|
||||
- cli: tests/verbs.test.mjs and tests/tester.test.mjs
|
||||
|
||||
It restores the source after each mutant and again in `finally`. The run ended with
|
||||
`restored True`, and the candidate manifest checked DIGESTS_OK afterwards.
|
||||
|
||||
No control step runs inside the harness. The control is the single-file runs on the unmutated
|
||||
candidate at 23:05:29Z, all 0 fail: launch-notice 7, runner 24, verbs 7, tester 7.
|
||||
|
||||
The run went from 2026-10-15T23:06:30Z to 23:11:24Z, in the slot (sage-0417). The logs are in
|
||||
mutants/ and the console output is in mutants-run.log.
|
||||
|
||||
**Result: 17 of 17 killed.**
|
||||
|
||||
| Mutant | Fault | Killed by |
|
||||
|---|---|---|
|
||||
| B1-recipient | drop the holder check, so a running role gets a notice too | bus "a message to a running role sends no notice…", bus "no notice for a message to launch.by…", cli verbs |
|
||||
| B2-to-human | drop `to === 'human'` | bus "no notice for…" |
|
||||
| B3-to-tester | drop `to === 'tester'` | bus "no notice for…" |
|
||||
| B4-thread-instance | drop the thread-instance exception | bus "no notice for…" |
|
||||
| B5-to-launcher | drop `to !== by` | bus "no notice for…", cli verbs |
|
||||
| B6-from-launcher | drop `sender !== by` | bus "no notice for…"; 7 harness tests |
|
||||
| B7-from-tester | drop `sender !== 'tester'` | bus "no notice for…", cli tester |
|
||||
| B8-no-launcher | drop `by !== null` from `told` | bus "a business with no launch block…", cli verbs |
|
||||
| B9-notice-sent | never call `#notice` | bus tests 1, 3, 4 and 7; harness launch-notice test; cli verbs |
|
||||
| B10-class-result | notice class INFO, not RESULT | bus test 1 (class assert); harness "the bus's launch notice is one turn with no reply…" |
|
||||
| B11-launcher-running | `launcherRunning` always false | bus tests 1 and 5, cli verbs |
|
||||
| B12-result-waiting | message.send never returns `waiting` | bus tests 1, 4, 5 and 6; harness launch-notice test; cli verbs and tester |
|
||||
| C1-printed | talk never prints the waiting lines | cli verbs, cli tester |
|
||||
| C2-no-launch-by | drop the no-launch.by line | cli verbs |
|
||||
| C3-launcher-down-self | drop the line for a message to launch.by itself | cli verbs |
|
||||
| C4-tester-line | drop the tester line | cli tester |
|
||||
| C5-launcher-down-either | drop the "either" restart line when launch.by is stopped too | cli verbs |
|
||||
|
||||
## B6 and the harness tests
|
||||
|
||||
The harness fixture's launch block has `by: pm`. Under B6, pm's own message to a stopped coder
|
||||
sends pm a notice. The runner then takes that notice as a turn ahead of the message the test
|
||||
sent. For example, "a task closed on the tracker…" got the notice body where it expected its
|
||||
open-task block.
|
||||
|
||||
That is the self-wake that call 4 excludes. Without the exception, launch.by's own traffic
|
||||
wakes it.
|
||||
|
||||
## B10 in the runner
|
||||
|
||||
With class INFO, the runner's auto-reply to `_bus` is refused and the read is skipped. The
|
||||
harness test fails at its first wait, for the notice's `read` row: `Error: timed out waiting`
|
||||
(mutants/B10-class-result.log, line 76). The read never comes, so the notice stays unread. That
|
||||
is the outcome BUILD.md describes, and it is not a loop. The bus test fails on its class assert,
|
||||
`'INFO'` against `'RESULT'`.
|
||||
@@ -0,0 +1 @@
|
||||
dda7e31b0c0fbd3e85c143dafa864ef0a29883c9
|
||||
@@ -0,0 +1,580 @@
|
||||
diff --git a/packages/bus/README.md b/packages/bus/README.md
|
||||
index 26220494f..f31c699a4 100644
|
||||
--- a/packages/bus/README.md
|
||||
+++ b/packages/bus/README.md
|
||||
@@ -144,7 +144,7 @@ an operator inspect content and delivery evidence after an uncertain result.
|
||||
| `decision.resolve` | `{id,choice,note?}`; option must exist, resolver must be routed role or outside-agent human CLI. Sends the raising role a DECISION message (Decision close messages, below). |
|
||||
| `decision.seen` | `{id,note?}`; acknowledgement by resolver, not a resolution. |
|
||||
| `decision.withdraw` | `{id,note?}`; raiser or human. Never rewrites the decision. A human withdraw sends the raising role a DECISION message; the raising run's own withdraw sends none. |
|
||||
-| `message.send` | `{to,body,class?,in_reply_to?,corrects?,decision?}`; returns `{id,request}`. Human instruction's `request` is its `human.input` event ID. |
|
||||
+| `message.send` | `{to,body,class?,in_reply_to?,corrects?,decision?}`; returns `{id,request}`, plus `waiting` when no run holds the target (Launch notices, below). Human instruction's `request` is its `human.input` event ID. |
|
||||
| `message.receive` | No args; up to 100 undelivered messages for current holder, including originating `request` for human instructions. A human decision close's message carries the close's `human.input` answer event as its `request`; a role close's has `null`. |
|
||||
| `message.read` | `{id}`; recipient holder's acknowledgement; no new holder can acknowledge old holder's delivery. |
|
||||
| `review.request` | `{task_ref,commit,to,note?,decision?}`; action `review.request` (row 93, #1587). `commit` must be the task's latest pushed commit: an older one refuses `stale-commit`, any other `unknown-commit`. `to` must be another role holding `review.verdict` (`unknown-role`, `self-review`, `not-a-reviewer`). Writes a `review.requested` event `{task_ref,project,ref,commit,to,message,held}` and sends `to` a REVIEW-REQUEST message naming it. `held` is the run id holding the `to` role when the request is routed (row 105, #1599), or `null` when no run holds it: the message then waits for a claim, and the requester should tell whoever launches roles. Returns `{request,message,commit,ref,held}`. |
|
||||
@@ -354,6 +354,43 @@ message the close's `human.input` answer event as its `request`, so the role's
|
||||
turn cites it as it cites a human instruction; a role close's `request` is
|
||||
`null`. The message also appears in the decision's `trail`.
|
||||
|
||||
+### Launch notices (row 146, #1640)
|
||||
+
|
||||
+A `message.send` whose target no run holds tells the business's `launch.by`
|
||||
+instance, once, in the same transaction as the message. The notice is an
|
||||
+ordinary message: `from_role '_bus'`, `from_run 'bus'`, to `launch.by`, class
|
||||
+`RESULT`, `in_reply_to` the waiting message, no `decision`. It is routed like
|
||||
+any other, so a stopped `launch.by` gets it at its next claim. The body is
|
||||
+
|
||||
+```
|
||||
+Message <id> from <sender> to <role> waits: <role> has no running session. Launch <role> within the launch block's limits, or tell <sender> why not with message.send in_reply_to <id>.
|
||||
+```
|
||||
+
|
||||
+`_bus` can't be a role: an instance name matches the business `ID_PATTERN`,
|
||||
+which starts with `[a-z0-9]`. So `message.send` to `_bus` refuses
|
||||
+`unknown-role`, and a caller can't set `from_role` or `from_run` (unknown keys
|
||||
+are `invalid-request`). The class is `RESULT` because the runner sends an
|
||||
+automatic RESULT reply to every other class, and the bus would refuse a reply
|
||||
+to `_bus`; the runner would log it and skip the `message.read`. On a RESULT
|
||||
+the runner takes one turn, sends nothing and marks it read.
|
||||
+
|
||||
+The result's `waiting` is `{role,launcher,told,launcherRunning}`: the target,
|
||||
+`launch.by` (`null` with no launch block), whether the notice went out, and
|
||||
+whether a run holds `launch.by` (`null` with no launch block). No `waiting`
|
||||
+field means a run held the target, or the message went to the human, the
|
||||
+tester, or a thread instance inside its thread (row 121's thread launcher starts
|
||||
+that session). `told` is `false` and no notice goes out for a message to
|
||||
+`launch.by` itself, a message from `launch.by` (the result tells it), or a
|
||||
+tester's (a PM test authorizes nothing).
|
||||
+
|
||||
+Only `message.send` sends a notice, and only for the message it stores, so a
|
||||
+re-route at a later claim, a broker restart or a release and claim sends none.
|
||||
+A run that is launched but hasn't claimed counts as no holder, so the notice
|
||||
+can go out while it starts; the launcher's `instance-running` refusal stops a
|
||||
+second launch. The Console's replies under a human's sent message include the
|
||||
+notice, since it is `in_reply_to` that message. `review.request`,
|
||||
+`thread.send` and a decision close's message send no notice.
|
||||
+
|
||||
## Human and reader paths
|
||||
|
||||
`src/human-cli.mjs <socket>` is S4's transport shim, not another product CLI.
|
||||
diff --git a/packages/bus/src/broker.mjs b/packages/bus/src/broker.mjs
|
||||
index 703fb6373..61febf532 100644
|
||||
--- a/packages/bus/src/broker.mjs
|
||||
+++ b/packages/bus/src/broker.mjs
|
||||
@@ -111,6 +111,10 @@ const REVIEW_KINDS = ['review.requested', 'review.verdict'];
|
||||
// Row 121 (#1615): an instance of this definition talks with the user in threads (REQ-THREAD-1).
|
||||
// Its runs claim a thread, not the role, and every message to or from it names its thread (REQ-MSG-1).
|
||||
const THREAD_DEFINITION = 'assistant';
|
||||
+// Row 146 (#1640): the sender of the bus's notice to launch.by. A role instance name matches the
|
||||
+// business ID_PATTERN, which starts with [a-z0-9], so no instance can be named this.
|
||||
+const NOTICE_ROLE = '_bus';
|
||||
+const NOTICE_RUN = 'bus';
|
||||
// How many messages `thread.messages` returns by default and at most, oldest first.
|
||||
export const THREAD_PAGE = 50;
|
||||
export const THREAD_PAGE_MAX = 200;
|
||||
@@ -1313,7 +1317,8 @@ export class Broker {
|
||||
const request = s.human
|
||||
? this.#event(s, 'human.input', { kind: 'instruction', message: mid }, mid)
|
||||
: null;
|
||||
- return { id: mid, request };
|
||||
+ const waiting = this.#waiting(s, mid, a.to, thread);
|
||||
+ return waiting ? { id: mid, request, waiting } : { id: mid, request };
|
||||
}
|
||||
case 'message.receive': {
|
||||
keys(a, []);
|
||||
@@ -1823,6 +1828,43 @@ export class Broker {
|
||||
if (thread) this.#store.run('INSERT INTO message_threads(message,thread) VALUES(?,?)', mid, thread);
|
||||
this.#delivery(mid, 'routed', this.#recipient(business, to, thread));
|
||||
}
|
||||
+ // Row 146 (#1640): a message.send that nobody holds the target for waits for a claim. Null when
|
||||
+ // the message was routed to a holder, or is the human's, a tester's, or in a thread to a thread
|
||||
+ // instance (row 121's launcher starts that session). Otherwise it says whether launch.by was
|
||||
+ // told and whether launch.by itself has a holder. A run launched but not yet claimed counts as
|
||||
+ // no holder; the instance-running refusal stops a second launch. launch.by isn't told of a
|
||||
+ // message to it, of its own message (this result tells it) or of a tester's (a PM test
|
||||
+ // authorizes nothing).
|
||||
+ #waiting(s, mid, to, thread) {
|
||||
+ if (to === 'human' || to === 'tester' || (thread && this.#threaded(s.business, to))) return null;
|
||||
+ if (this.#recipient(s.business, to, thread)) return null;
|
||||
+ const by = this.#business(s.business).launch?.by ?? null;
|
||||
+ const sender = this.#sender(s);
|
||||
+ const told = by !== null && to !== by && sender !== by && sender !== 'tester';
|
||||
+ if (told) this.#notice(s.business, mid, by, to, sender);
|
||||
+ return { role: to, launcher: by, told, launcherRunning: by === null ? null : this.#recipient(s.business, by, null) !== null };
|
||||
+ }
|
||||
+ // One notice per waiting message: only message.send calls this, once for the message it stores, so
|
||||
+ // a re-route at a claim or a broker restart never sends another. Its class is RESULT: the runner
|
||||
+ // takes a turn on it and sends no automatic reply, which NOTICE_ROLE could not receive.
|
||||
+ #notice(business, mid, by, to, sender) {
|
||||
+ const nid = randomUUID();
|
||||
+ this.#store.run(
|
||||
+ 'INSERT INTO messages(id,at,business,from_role,from_run,to_role,class,in_reply_to,decision,corrects,body) VALUES(?,?,?,?,?,?,?,?,?,?,?)',
|
||||
+ nid,
|
||||
+ this.#now(),
|
||||
+ business,
|
||||
+ NOTICE_ROLE,
|
||||
+ NOTICE_RUN,
|
||||
+ by,
|
||||
+ 'RESULT',
|
||||
+ mid,
|
||||
+ null,
|
||||
+ null,
|
||||
+ `Message ${mid} from ${sender} to ${to} waits: ${to} has no running session. Launch ${to} within the launch block's limits, or tell ${sender} why not with message.send in_reply_to ${mid}.`,
|
||||
+ );
|
||||
+ this.#route(business, nid, by, null);
|
||||
+ }
|
||||
#delivery(mid, op, h, transport = null) {
|
||||
this.#store.run(
|
||||
'INSERT INTO deliveries(message,at,op,holder_run,transport,address) VALUES(?,?,?,?,?,?)',
|
||||
diff --git a/packages/bus/tests/launch-notice.test.mjs b/packages/bus/tests/launch-notice.test.mjs
|
||||
new file mode 100644
|
||||
index 000000000..3ac83e702
|
||||
--- /dev/null
|
||||
+++ b/packages/bus/tests/launch-notice.test.mjs
|
||||
@@ -0,0 +1,212 @@
|
||||
+import test from 'node:test';
|
||||
+import assert from 'node:assert/strict';
|
||||
+import { mkdtempSync, readFileSync, rmSync } from 'node:fs';
|
||||
+import { tmpdir } from 'node:os';
|
||||
+import { join } from 'node:path';
|
||||
+import { fileURLToPath } from 'node:url';
|
||||
+import { Store } from '../src/store.mjs';
|
||||
+import { Broker } from '../src/broker.mjs';
|
||||
+import { ID_PATTERN } from '../../business/src/vocabulary.mjs';
|
||||
+
|
||||
+// Row 146 (#1640): a message.send to a role nobody holds tells the business's launch.by
|
||||
+// instance once, and the result says so. The assistant's lists are the shipped ones, as in
|
||||
+// threads.test.mjs, so the thread case runs under the lists the stack runs.
|
||||
+const shipped = (name) =>
|
||||
+ JSON.parse(readFileSync(fileURLToPath(new URL(`../../../roles/${name}.json`, import.meta.url)), 'utf8'));
|
||||
+
|
||||
+const roles = {
|
||||
+ chief: { definition: 'chief-of-staff', authority: { withinRole: ['message.send'], crossRole: [] } },
|
||||
+ assistant: { definition: 'assistant', authority: { withinRole: ['message.send'], crossRole: [] } },
|
||||
+ pm: { definition: 'pm', authority: { withinRole: ['message.send'], crossRole: [] } },
|
||||
+ coder: { definition: 'coder', authority: { withinRole: ['message.send'], crossRole: [] } },
|
||||
+};
|
||||
+const definitions = { 'chief-of-staff': {}, assistant: { messaging: shipped('assistant').messaging }, pm: {}, coder: {} };
|
||||
+const demo = (extra = {}) => ({
|
||||
+ demo: {
|
||||
+ id: 'demo',
|
||||
+ human: 'jason',
|
||||
+ arbiters: { technical: 'pm', delivery: 'chief' },
|
||||
+ roles,
|
||||
+ definitions,
|
||||
+ projects: { stack: { root: '/nonexistent' } },
|
||||
+ launch: { by: 'chief', instances: ['pm', 'coder'], models: {}, limits: {} },
|
||||
+ vars: { 'bus.tester': true },
|
||||
+ ...extra,
|
||||
+ },
|
||||
+});
|
||||
+
|
||||
+function setup(t, businesses = demo()) {
|
||||
+ const root = mkdtempSync(join(tmpdir(), 'bus-notice-'));
|
||||
+ let store = new Store(root);
|
||||
+ t.after(() => {
|
||||
+ store.close();
|
||||
+ rmSync(root, { recursive: true, force: true });
|
||||
+ });
|
||||
+ const ctx = { root };
|
||||
+ const open = () => {
|
||||
+ ctx.b = new Broker({ store, businesses });
|
||||
+ ctx.caps = { human: ctx.b.bindHuman({ business: 'demo', human: 'jason', via: 'cli', outsideAgent: true }) };
|
||||
+ };
|
||||
+ open();
|
||||
+ ctx.store = () => store;
|
||||
+ // A broker restart: close the store and open it again under a new Broker.
|
||||
+ ctx.restart = () => {
|
||||
+ store.close();
|
||||
+ store = new Store(root);
|
||||
+ open();
|
||||
+ };
|
||||
+ ctx.call = (who, verb, args = {}) => ctx.b.request(ctx.caps[who], { verb, args });
|
||||
+ ctx.launch = (name, role, extra = {}) => {
|
||||
+ ctx.caps[name] = ctx.b.bindLaunch({ business: 'demo', role, run: `${name}-run`, harness: 'pi', ...extra });
|
||||
+ return ctx.caps[name];
|
||||
+ };
|
||||
+ ctx.claim = (name) => ctx.call(name, 'role.claim');
|
||||
+ ctx.notices = () => store.all("SELECT * FROM messages WHERE from_role='_bus' ORDER BY seq");
|
||||
+ return ctx;
|
||||
+}
|
||||
+
|
||||
+test('a message to a stopped role sends launch.by one notice, and the result says so', (t) => {
|
||||
+ const ctx = setup(t);
|
||||
+ const sent = ctx.call('human', 'message.send', { to: 'pm', body: 'is the plan current?', class: 'REQUEST' });
|
||||
+ assert.deepEqual(sent.waiting, { role: 'pm', launcher: 'chief', told: true, launcherRunning: false });
|
||||
+ const [n, ...more] = ctx.notices();
|
||||
+ assert.deepEqual(more, []);
|
||||
+ assert.equal(n.from_run, 'bus');
|
||||
+ assert.equal(n.to_role, 'chief');
|
||||
+ assert.equal(n.class, 'RESULT');
|
||||
+ assert.equal(n.in_reply_to, sent.id);
|
||||
+ assert.equal(n.decision, null);
|
||||
+ assert.equal(
|
||||
+ n.body,
|
||||
+ `Message ${sent.id} from human to pm waits: pm has no running session. Launch pm within the launch block's limits, or tell human why not with message.send in_reply_to ${sent.id}.`,
|
||||
+ );
|
||||
+ assert.equal(ctx.store().get("SELECT holder_run FROM deliveries WHERE message=? AND op='routed'", n.id).holder_run, null);
|
||||
+ // chief comes up and receives it; with chief running, the next result says so.
|
||||
+ ctx.launch('chief', 'chief');
|
||||
+ ctx.claim('chief');
|
||||
+ assert.deepEqual(ctx.call('chief', 'message.receive').map((m) => m.id), [n.id]);
|
||||
+ assert.deepEqual(ctx.call('human', 'message.send', { to: 'coder', body: 'and you?' }).waiting, {
|
||||
+ role: 'coder',
|
||||
+ launcher: 'chief',
|
||||
+ told: true,
|
||||
+ launcherRunning: true,
|
||||
+ });
|
||||
+ assert.equal(ctx.notices().length, 2);
|
||||
+ // A role's message to a stopped role tells launch.by too.
|
||||
+ ctx.launch('coder', 'coder');
|
||||
+ ctx.claim('coder');
|
||||
+ assert.equal(ctx.call('coder', 'message.send', { to: 'pm', body: 'blocked on you' }).waiting.told, true);
|
||||
+ assert.equal(ctx.notices().at(-1).body.startsWith('Message '), true);
|
||||
+ assert.match(ctx.notices().at(-1).body, / from coder to pm waits: /);
|
||||
+});
|
||||
+
|
||||
+test('a message to a running role sends no notice and its result is unchanged', (t) => {
|
||||
+ const ctx = setup(t);
|
||||
+ ctx.launch('pm', 'pm');
|
||||
+ ctx.claim('pm');
|
||||
+ const sent = ctx.call('human', 'message.send', { to: 'pm', body: 'hello' });
|
||||
+ assert.deepEqual(Object.keys(sent).sort(), ['id', 'request']);
|
||||
+ assert.deepEqual(ctx.notices(), []);
|
||||
+});
|
||||
+
|
||||
+test('a re-route at a claim, a release and claim, and a broker restart send no second notice', (t) => {
|
||||
+ const ctx = setup(t);
|
||||
+ const sent = ctx.call('human', 'message.send', { to: 'pm', body: 'waits' });
|
||||
+ assert.equal(ctx.notices().length, 1);
|
||||
+ ctx.launch('pm', 'pm');
|
||||
+ ctx.claim('pm');
|
||||
+ assert.equal(ctx.notices().length, 1, 'role.claim re-routes the waiting message only');
|
||||
+ assert.equal(
|
||||
+ ctx.store().get("SELECT holder_run FROM deliveries WHERE message=? AND op='routed' ORDER BY seq DESC LIMIT 1", sent.id).holder_run,
|
||||
+ 'pm-run',
|
||||
+ );
|
||||
+ ctx.call('pm', 'role.release');
|
||||
+ ctx.restart();
|
||||
+ ctx.launch('pm2', 'pm');
|
||||
+ ctx.claim('pm2');
|
||||
+ assert.deepEqual(ctx.call('pm2', 'message.receive').map((m) => m.id), [sent.id]);
|
||||
+ assert.equal(ctx.notices().length, 1, 'a restarted broker and a new claim send none');
|
||||
+});
|
||||
+
|
||||
+test('a run launched but not yet claimed counts as no holder', (t) => {
|
||||
+ const ctx = setup(t);
|
||||
+ ctx.launch('pm', 'pm');
|
||||
+ assert.equal(ctx.call('human', 'message.send', { to: 'pm', body: 'early' }).waiting.told, true);
|
||||
+ assert.equal(ctx.notices().length, 1);
|
||||
+});
|
||||
+
|
||||
+test('no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance', (t) => {
|
||||
+ const ctx = setup(t);
|
||||
+ // To launch.by while it is stopped: the result says so, and nobody is told.
|
||||
+ assert.deepEqual(ctx.call('human', 'message.send', { to: 'chief', body: 'are you there?' }).waiting, {
|
||||
+ role: 'chief',
|
||||
+ launcher: 'chief',
|
||||
+ told: false,
|
||||
+ launcherRunning: false,
|
||||
+ });
|
||||
+ // From launch.by: the result tells it.
|
||||
+ ctx.launch('chief', 'chief');
|
||||
+ ctx.claim('chief');
|
||||
+ assert.deepEqual(ctx.call('chief', 'message.send', { to: 'pm', body: 'start on it' }).waiting, {
|
||||
+ role: 'pm',
|
||||
+ launcher: 'chief',
|
||||
+ told: false,
|
||||
+ launcherRunning: true,
|
||||
+ });
|
||||
+ // From a tester: a PM test authorizes nothing, so it wakes no launcher.
|
||||
+ ctx.caps.tester = ctx.b.bindTester({ business: 'demo' });
|
||||
+ assert.equal(ctx.call('tester', 'message.send', { to: 'pm', body: '[mos test] ping' }).waiting.told, false);
|
||||
+ // To the human or the tester, which no run holds: no waiting field at all.
|
||||
+ ctx.launch('coder', 'coder');
|
||||
+ ctx.claim('coder');
|
||||
+ assert.equal(ctx.call('coder', 'message.send', { to: 'human', body: 'fyi' }).waiting, undefined);
|
||||
+ const ping = ctx.call('tester', 'message.send', { to: 'coder', body: '[mos test] are you up?' });
|
||||
+ assert.equal(ping.waiting, undefined);
|
||||
+ assert.equal(ctx.call('coder', 'message.send', { to: 'tester', body: 'up', in_reply_to: ping.id }).waiting, undefined);
|
||||
+ // In a thread to a thread instance: row 121's launcher starts that session.
|
||||
+ const project = ctx.call('human', 'project.create', { name: 'work', repo: 'stack' }).id;
|
||||
+ const A = ctx.call('human', 'thread.create', { project, name: 'alpha' }).id;
|
||||
+ const asked = ctx.call('human', 'thread.send', { thread: A, body: 'what is left?' });
|
||||
+ const answer = ctx.call('chief', 'message.send', { to: 'assistant', body: 'two rows', in_reply_to: asked.id });
|
||||
+ assert.equal(answer.waiting, undefined);
|
||||
+ assert.equal(ctx.store().get('SELECT thread FROM message_threads WHERE message=?', answer.id).thread, A);
|
||||
+ assert.deepEqual(ctx.notices(), []);
|
||||
+});
|
||||
+
|
||||
+test('a business with no launch block tells nobody and says there is no launcher', (t) => {
|
||||
+ const ctx = setup(t, demo({ launch: undefined }));
|
||||
+ assert.deepEqual(ctx.call('human', 'message.send', { to: 'pm', body: 'hello' }).waiting, {
|
||||
+ role: 'pm',
|
||||
+ launcher: null,
|
||||
+ told: false,
|
||||
+ launcherRunning: null,
|
||||
+ });
|
||||
+ assert.deepEqual(ctx.notices(), []);
|
||||
+});
|
||||
+
|
||||
+test('the notice sender stays internal: no role is named _bus and no caller can send as it or to it', (t) => {
|
||||
+ assert.equal(ID_PATTERN.test('_bus'), false, 'a business file cannot declare an instance named _bus');
|
||||
+ const ctx = setup(t);
|
||||
+ ctx.launch('coder', 'coder');
|
||||
+ ctx.claim('coder');
|
||||
+ ctx.call('human', 'message.send', { to: 'pm', body: 'waits' });
|
||||
+ const [n] = ctx.notices();
|
||||
+ const refused = (who, args, code) =>
|
||||
+ assert.throws(() => ctx.call(who, 'message.send', { body: 'x', ...args }), { code }, JSON.stringify(args));
|
||||
+ for (const who of ['human', 'coder']) {
|
||||
+ refused(who, { to: '_bus' }, 'unknown-role');
|
||||
+ refused(who, { to: 'pm', from_role: '_bus' }, 'invalid-request');
|
||||
+ refused(who, { to: 'pm', from_run: 'bus' }, 'invalid-request');
|
||||
+ refused(who, { to: 'pm', class: '_bus' }, 'invalid-class');
|
||||
+ refused(who, { to: 'pm', in_reply_to: '_bus' }, 'invalid-request');
|
||||
+ refused(who, { to: 'pm', corrects: '_bus' }, 'invalid-request');
|
||||
+ refused(who, { to: 'pm', decision: '_bus' }, 'decision-not-found');
|
||||
+ }
|
||||
+ // Answering the notice goes to the sender it names, never back to _bus.
|
||||
+ ctx.launch('chief', 'chief');
|
||||
+ ctx.claim('chief');
|
||||
+ refused('chief', { to: '_bus', in_reply_to: n.id }, 'unknown-role');
|
||||
+ const why = ctx.call('chief', 'message.send', { to: 'human', body: 'pm is over its limit', in_reply_to: n.in_reply_to });
|
||||
+ assert.equal(ctx.store().get('SELECT from_role FROM messages WHERE id=?', why.id).from_role, 'chief');
|
||||
+ assert.equal(ctx.notices().length, 1);
|
||||
+});
|
||||
diff --git a/packages/cli/README.md b/packages/cli/README.md
|
||||
index da6877607..6d9756872 100644
|
||||
--- a/packages/cli/README.md
|
||||
+++ b/packages/cli/README.md
|
||||
@@ -65,7 +65,18 @@ mosaic launches list [--json]
|
||||
inbox every 2 s for up to `--wait` seconds (default 900). It prints every
|
||||
message that arrives and marks it read, and stops at the reply to its
|
||||
REQUEST. No reply in time exits 1; the reply may still come, and the next
|
||||
- `mosaic talk` prints it. `--wait 0` only sends. `talk --follow` keeps
|
||||
+ `mosaic talk` prints it. When no run holds the role (row 146, #1640),
|
||||
+ a line after `sent` says so: `pm isn't running, chief has been told`
|
||||
+ when the bus told `launch.by`; `pm isn't running, and the business names
|
||||
+ no launch.by` with no launch block; `pm isn't running; a tester's message
|
||||
+ tells nobody to launch it` for `--tester`. When `launch.by` itself isn't
|
||||
+ running, talk prints `<launch.by> isn't running` (or `isn't running
|
||||
+ either` after the told line) and the command that starts it:
|
||||
+ `systemctl --user restart mosaic-bus@<business>`, which starts it only if
|
||||
+ the unit runs with `--pm` (`scripts/bus-service.sh status <business>`
|
||||
+ shows `pm: on`) and stops running sessions. A hand-started host takes
|
||||
+ `mosaic bus stop`, then `mosaic bus start <business> --pm`. No verb
|
||||
+ launches `launch.by` on a running host. `--wait 0` only sends. `talk --follow` keeps
|
||||
printing and marking messages read until Ctrl-C, including messages with
|
||||
no `in_reply_to`. `follow` runs that same loop without sending. `--wait`
|
||||
and `--follow` together refuse. These commands consume the same human
|
||||
diff --git a/packages/cli/src/cli.mjs b/packages/cli/src/cli.mjs
|
||||
index 60a0ba29b..8db1a8b3a 100644
|
||||
--- a/packages/cli/src/cli.mjs
|
||||
+++ b/packages/cli/src/cli.mjs
|
||||
@@ -212,6 +212,18 @@ function formatMessage(m) {
|
||||
return `${m.from_role} (${meta}) ${shortId(m.id)}:\n${m.body.trimEnd()}\n`;
|
||||
}
|
||||
|
||||
+// Row 146 (#1640): what the bus said about a message whose role has no running session. Only
|
||||
+// a restart of a unit with --pm starts launch.by; a human verb can't on a running host.
|
||||
+function waitingLines(w, business) {
|
||||
+ const restart = (role, either = "") =>
|
||||
+ `${role} isn't running${either}. systemctl --user restart mosaic-bus@${business()} starts it if the unit runs with --pm (scripts/bus-service.sh status ${business()} shows pm: on). The restart stops running sessions.\n`;
|
||||
+ if (w.launcher === null) return `${w.role} isn't running, and the business names no launch.by\n`;
|
||||
+ if (w.role === w.launcher) return restart(w.role);
|
||||
+ // A human's message to another role always tells launch.by; a tester's never does.
|
||||
+ if (!w.told) return `${w.role} isn't running; a tester's message tells nobody to launch it\n`;
|
||||
+ return `${w.role} isn't running, ${w.launcher} has been told\n` + (w.launcherRunning ? "" : restart(w.launcher, " either"));
|
||||
+}
|
||||
+
|
||||
// `mosaic talk <role> <text>`: a REQUEST to the role, then the human's inbox
|
||||
// until the reply arrives or --wait runs out. --follow keeps receiving after
|
||||
// that reply; follow starts the same receive loop without sending.
|
||||
@@ -231,6 +243,7 @@ async function talk(rest, io, deps, receiveOnly = false) {
|
||||
if (!receiveOnly) {
|
||||
sent = await call("message.send", { to, body, class: "REQUEST" });
|
||||
io.stdout.write(`sent ${shortId(sent.id)} to ${to}\n`);
|
||||
+ if (sent.waiting) io.stdout.write(waitingLines(sent.waiting, () => businessFor(parsed, (deps.system ?? loadSystem({ env: io.env })).dataRoot)));
|
||||
if (!follow && wait === 0) return;
|
||||
}
|
||||
const pollMs = deps.talkPollMs ?? TALK_POLL_MS;
|
||||
diff --git a/packages/cli/tests/helpers.mjs b/packages/cli/tests/helpers.mjs
|
||||
index f8026bdfd..79f653687 100644
|
||||
--- a/packages/cli/tests/helpers.mjs
|
||||
+++ b/packages/cli/tests/helpers.mjs
|
||||
@@ -77,11 +77,11 @@ export const BUSINESSES = {
|
||||
|
||||
// An in-process broker with a claimed coder and the human's capability.
|
||||
// transport(business) mirrors humanTransport: errors carry the bus code.
|
||||
-export function broker(t) {
|
||||
+export function broker(t, businesses = BUSINESSES) {
|
||||
const root = tmp(t, "mosaic-cli-bus-");
|
||||
const store = new Store(root);
|
||||
t.after(() => store.close());
|
||||
- const b = new Broker({ store, businesses: BUSINESSES });
|
||||
+ const b = new Broker({ store, businesses });
|
||||
const coder = b.bindLaunch({ business: "demo", role: "coder", run: "coder-run", harness: "pi", address: "coder-run" });
|
||||
b.request(coder, { verb: "role.claim" });
|
||||
const human = b.bindHuman({ business: "demo", human: "jason", via: "cli", outsideAgent: true });
|
||||
diff --git a/packages/cli/tests/tester.test.mjs b/packages/cli/tests/tester.test.mjs
|
||||
index 0994b12cf..5ccf7705c 100644
|
||||
--- a/packages/cli/tests/tester.test.mjs
|
||||
+++ b/packages/cli/tests/tester.test.mjs
|
||||
@@ -11,10 +11,10 @@ import { BUSINESSES, humanEnv, io, tmp } from "./helpers.mjs";
|
||||
// Row 110 (#1604): --tester binds as the business's tester instead of as the
|
||||
// human. The in-process broker here has bus.tester on; the real tester-cli.mjs
|
||||
// runs in packages/bus/tests/tester.test.mjs.
|
||||
-function setup(t) {
|
||||
+function setup(t, extra = {}) {
|
||||
const store = new Store(tmp(t, "mosaic-cli-tester-"));
|
||||
t.after(() => store.close());
|
||||
- const businesses = { demo: { ...BUSINESSES.demo, vars: { "bus.tester": true } } };
|
||||
+ const businesses = { demo: { ...BUSINESSES.demo, vars: { "bus.tester": true }, ...extra } };
|
||||
const b = new Broker({ store, businesses });
|
||||
const coder = b.bindLaunch({ business: "demo", role: "coder", run: "coder-run", harness: "pi", address: "coder-run" });
|
||||
b.request(coder, { verb: "role.claim" });
|
||||
@@ -126,3 +126,12 @@ test("with no stand-in transport, --tester runs tester-cli.mjs on the data root'
|
||||
await main(["agents", "--tester", "--business", "demo"], inAgent(), { system: { dataRoot }, testerSpawn });
|
||||
assert.deepEqual(seen, [{ argv: [TESTER_CLI, join(dataRoot, "bus", "broker.sock")], input: { business: "demo", verb: "agents", args: {} } }]);
|
||||
});
|
||||
+
|
||||
+// Row 146 (#1640): a tester's message to a stopped role tells launch.by nothing, and talk says so.
|
||||
+test("talk --tester to a stopped role says nobody is told to launch it", async (t) => {
|
||||
+ const s = setup(t, { launch: { by: "pm", instances: ["cto", "coder"], models: {}, limits: {} } });
|
||||
+ const x = inAgent();
|
||||
+ await main(["talk", "cto", "[mos test] hello", "--tester", "--wait", "0", "--business", "demo"], x, s.deps);
|
||||
+ assert.match(x.out.text, /^sent [0-9a-f-]{8} to cto\ncto isn't running; a tester's message tells nobody to launch it\n$/);
|
||||
+ assert.equal(s.store.get("SELECT count(*) n FROM messages WHERE from_role='_bus'").n, 0);
|
||||
+});
|
||||
diff --git a/packages/cli/tests/verbs.test.mjs b/packages/cli/tests/verbs.test.mjs
|
||||
index 6bdbc6793..cb4a295be 100644
|
||||
--- a/packages/cli/tests/verbs.test.mjs
|
||||
+++ b/packages/cli/tests/verbs.test.mjs
|
||||
@@ -9,10 +9,10 @@ import { main } from "../src/cli.mjs";
|
||||
import { CliError } from "../src/errors.mjs";
|
||||
import { startTimeOf } from "../src/host.mjs";
|
||||
import { Registry } from "../../seat/src/session.mjs";
|
||||
-import { broker, io, tmp } from "./helpers.mjs";
|
||||
+import { BUSINESSES, broker, io, tmp } from "./helpers.mjs";
|
||||
|
||||
-function setup(t, deps = {}) {
|
||||
- const bus = broker(t);
|
||||
+function setup(t, deps = {}, businesses) {
|
||||
+ const bus = broker(t, businesses);
|
||||
const dataRoot = tmp(t);
|
||||
const run = async (argv, x = io(), more = {}) => {
|
||||
try {
|
||||
@@ -81,6 +81,29 @@ test("a late reply the Console has listed still reaches the next talk", async (t
|
||||
assert.deepEqual(s.calls.filter((c) => c.verb === "message.read").map((c) => c.args.id), [answer.id]);
|
||||
});
|
||||
|
||||
+// Row 146 (#1640): the lines after "sent" when the role has no running session.
|
||||
+test("talk says when the role isn't running, whether launch.by was told, and how to start launch.by", async (t) => {
|
||||
+ const restart = (role, either = "") =>
|
||||
+ `${role} isn't running${either}. systemctl --user restart mosaic-bus@demo starts it if the unit runs with --pm (scripts/bus-service.sh status demo shows pm: on). The restart stops running sessions.\n`;
|
||||
+ const text = async (s, role) => {
|
||||
+ const r = await s.run(["talk", role, "hello", "--wait", "0", "--business", "demo"]);
|
||||
+ assert.equal(r.code, 0, r.error);
|
||||
+ return r.io.out.text.replace(/^sent [0-9a-f]{8} to \S+\n/, "");
|
||||
+ };
|
||||
+ // No launch block: nobody to tell.
|
||||
+ const plain = setup(t);
|
||||
+ assert.equal(await text(plain, "cto"), "cto isn't running, and the business names no launch.by\n");
|
||||
+ assert.equal(await text(plain, "coder"), "", "a running role gets the sent line only");
|
||||
+ // pm launches: told, and pm itself down too.
|
||||
+ const s = setup(t, {}, { demo: { ...BUSINESSES.demo, launch: { by: "pm", instances: ["cto", "coder"], models: {}, limits: {} } } });
|
||||
+ assert.equal(await text(s, "cto"), "cto isn't running, pm has been told\n" + restart("pm", " either"));
|
||||
+ assert.equal(await text(s, "pm"), restart("pm"));
|
||||
+ assert.equal(s.store.get("SELECT count(*) n FROM messages WHERE from_role='_bus'").n, 1, "a message to launch.by tells nobody");
|
||||
+ call(s.b, s.b.bindLaunch({ business: "demo", role: "pm", run: "pm-run", harness: "pi" }), "role.claim");
|
||||
+ assert.equal(await text(s, "cto"), "cto isn't running, pm has been told\n");
|
||||
+ assert.equal(await text(s, "coder"), "");
|
||||
+});
|
||||
+
|
||||
test("talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors", async (t) => {
|
||||
const s = setup(t);
|
||||
const agent = () => io({ ...io().env, CLAUDECODE: "1" });
|
||||
diff --git a/packages/harness/tests/runner.test.mjs b/packages/harness/tests/runner.test.mjs
|
||||
index 4e5da7f17..1361cf030 100644
|
||||
--- a/packages/harness/tests/runner.test.mjs
|
||||
+++ b/packages/harness/tests/runner.test.mjs
|
||||
@@ -6,7 +6,7 @@ import { test } from "node:test";
|
||||
import assert from "node:assert/strict";
|
||||
import { spawn, spawnSync } from "node:child_process";
|
||||
import { once } from "node:events";
|
||||
-import { existsSync, mkdirSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs";
|
||||
+import { existsSync, mkdirSync, readdirSync, readFileSync, rmSync, statSync, writeFileSync } from "node:fs";
|
||||
import { open } from "node:fs/promises";
|
||||
import { createServer } from "node:net";
|
||||
import { join } from "node:path";
|
||||
@@ -89,10 +89,11 @@ test("stateBlock names the launch state with its time and event, and the open ta
|
||||
assert.match(capped, /Open tasks: 9, the first 1 of cap 1\./);
|
||||
});
|
||||
|
||||
-async function setup(t, { session = {}, policy = {}, tools, as = "coder", organization = null } = {}) {
|
||||
+async function setup(t, { session = {}, policy = {}, tools, as = "coder", organization = null, launchBy } = {}) {
|
||||
const dir = scratch(t);
|
||||
const store = new Store(dir);
|
||||
- const broker = new Broker({ store, businesses, organization });
|
||||
+ const demo = launchBy ? { ...businesses.demo, launch: { ...businesses.demo.launch, by: launchBy } } : businesses.demo;
|
||||
+ const broker = new Broker({ store, businesses: { demo }, organization });
|
||||
const brokerSocket = join(dir, "bus.sock");
|
||||
const server = await serve({ broker, path: brokerSocket });
|
||||
t.after(async () => {
|
||||
@@ -433,6 +434,32 @@ test("a RESULT gets no automatic reply; failed turns reply with the reason", asy
|
||||
await until(() => ctx.store.get("SELECT 1 FROM deliveries WHERE message=? AND op='read'", res.id));
|
||||
});
|
||||
|
||||
+// Row 146 (#1640): the bus's notice to launch.by is a RESULT from _bus. The runner takes one turn
|
||||
+// on it, sends no automatic reply and marks it read. Any other class would send a reply to _bus,
|
||||
+// which the bus refuses; the runner would log the failure and skip the read, leaving the notice
|
||||
+// unread for good.
|
||||
+test("the bus's launch notice is one turn with no reply, and is not taken again", async (t) => {
|
||||
+ const ctx = await setup(t, { as: "chief", launchBy: "chief" });
|
||||
+ ctx.inbox = [];
|
||||
+ const r = startRunner(ctx.runDir, ctx.cap);
|
||||
+ t.after(() => r.child.kill("SIGKILL"));
|
||||
+ await until(() => ctx.store.get("SELECT 1 FROM role_claims WHERE role='chief' AND op='claim'"));
|
||||
+ const sent = ctx.call(ctx.human, "message.send", { to: "coder", body: "is the build green?" });
|
||||
+ assert.equal(sent.waiting.told, true);
|
||||
+ const notice = ctx.store.get("SELECT * FROM messages WHERE from_role='_bus' AND in_reply_to=?", sent.id);
|
||||
+ assert.equal(notice.to_role, "chief");
|
||||
+ await until(() => ctx.store.get("SELECT 1 FROM deliveries WHERE message=? AND op='read'", notice.id));
|
||||
+ // A later message is one more turn, so the notice wasn't taken again in between.
|
||||
+ const later = ctx.call(ctx.pm, "message.send", { to: "chief", body: "status?" });
|
||||
+ const [reply] = await until(replies(ctx));
|
||||
+ assert.equal(reply.in_reply_to, later.id);
|
||||
+ assert.deepEqual(readdirSync(join(ctx.runDir, "turns")).sort(), ["0001.stderr", "0002.stderr"]);
|
||||
+ assert.equal(ctx.store.get("SELECT count(*) n FROM deliveries WHERE message=? AND op='delivered'", notice.id).n, 1);
|
||||
+ assert.equal(ctx.store.get("SELECT count(*) n FROM deliveries WHERE message=? AND op='read'", notice.id).n, 1);
|
||||
+ assert.equal(ctx.store.get("SELECT count(*) n FROM messages WHERE in_reply_to=? AND from_run='chief-run'", notice.id).n, 0);
|
||||
+ assert.doesNotMatch(r.stderr(), /reply to .* failed/);
|
||||
+});
|
||||
+
|
||||
test("SIGTERM during a turn kills the turn's process group and still exits 0", async (t) => {
|
||||
// A long wall clock, so only the stop path can end the turn in time.
|
||||
const ctx = await setup(t, { session: { turnTimeout: 600 } });
|
||||
diff --git a/roles/chief-of-staff.md b/roles/chief-of-staff.md
|
||||
index 28ef82826..98794e7f8 100644
|
||||
--- a/roles/chief-of-staff.md
|
||||
+++ b/roles/chief-of-staff.md
|
||||
@@ -16,11 +16,17 @@ product's code, you don't review it and you don't create tasks yourself.
|
||||
- Launch role sessions with the `launch` tool, for the instances and
|
||||
within the limits the business file's launch block lists. A launch
|
||||
outside them is refused, not queued. Launch only role instances.
|
||||
+- A message from `_bus` is the bus telling you that a message waits for
|
||||
+ a role with no running session. It names the message, its sender and
|
||||
+ the role. Launch that role within the launch block's limits, or tell
|
||||
+ the sender why not with a message `in_reply_to` the waiting message.
|
||||
+ Don't reply to `_bus`; it receives nothing.
|
||||
- Keep the organization's structure: which role instances exist, who
|
||||
holds them and what they may do. To terminate a role instance, raise a
|
||||
- `role.revoke` decision, naming the instance and saying why. To hire one
|
||||
- or change the structure, raise a `policy.change` decision until the
|
||||
- broker gives you a verb for the organization file.
|
||||
+ `role.revoke` decision, naming the instance and saying why. Change the
|
||||
+ launch limits, the model table and the model each instance runs with
|
||||
+ the `change_organization` tool. To hire an instance or change what one
|
||||
+ may do, raise a `policy.change` decision.
|
||||
- Report to the assistant what the roles answer, and every refusal with
|
||||
its exact text.
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
5c5b14128b34c6199ae61e97561fe505cb9218f74f457ef686705edbd3993c39 packages/bus/README.md
|
||||
519050947587bbffcbc0b08f433451e7fa080133a5bc934a19aa8333e6e689a6 packages/bus/src/broker.mjs
|
||||
0b4a88311d02b28b224068311e8264151a6bab6251002ab358e5fbf6489bcf71 packages/bus/tests/launch-notice.test.mjs
|
||||
2cd0344827b4f643db1c63e7232229c5d2ca511d3b558bdeb7775639ee6e9ef8 packages/cli/README.md
|
||||
23d875b28c7512975343b8e54103c92e17f04e8531bce359caba3e37f6d56f65 packages/cli/src/cli.mjs
|
||||
b80eaad33728450b30a23853c0e2d65a6cac35f19315d11f7b47e7dada1cf2f0 packages/cli/tests/helpers.mjs
|
||||
3ca69043310e2d454650e19fd12213229235cfc74d42182559751c5572d8657e packages/cli/tests/tester.test.mjs
|
||||
812ba3c29c8f3bea5dc2412e36b09900913b299e1ff4f1cd2c6125bfae40f3aa packages/cli/tests/verbs.test.mjs
|
||||
47373ff7d69c46ad2eff50ffc9cdd85f3e1e4658cdbdc22e6873bfc85f439e31 packages/harness/tests/runner.test.mjs
|
||||
242ce530f3a15ad3d37b05f3222917dca5880d398df005875e1e923eac9d9f59 roles/chief-of-staff.md
|
||||
@@ -0,0 +1,18 @@
|
||||
pkg-bus start=2026-10-15T23:11:36Z end=2026-10-15T23:11:46Z rc=0 tests=259 pass=259 fail=0 skipped=0
|
||||
pkg-business start=2026-10-15T23:11:46Z end=2026-10-15T23:11:48Z rc=0 tests=106 pass=106 fail=0 skipped=0
|
||||
pkg-cli start=2026-10-15T23:11:48Z end=2026-10-15T23:12:08Z rc=0 tests=209 pass=209 fail=0 skipped=0
|
||||
pkg-harness start=2026-10-15T23:12:08Z end=2026-10-15T23:12:20Z rc=0 tests=101 pass=101 fail=0 skipped=0
|
||||
pkg-plugins start=2026-10-15T23:12:20Z end=2026-10-15T23:12:21Z rc=0 tests=28 pass=28 fail=0 skipped=0
|
||||
pkg-seat start=2026-10-15T23:12:21Z end=2026-10-15T23:12:26Z rc=0 tests=135 pass=135 fail=0 skipped=0
|
||||
pkg-tasks start=2026-10-15T23:12:26Z end=2026-10-15T23:12:31Z rc=0 tests=97 pass=97 fail=0 skipped=0
|
||||
pkg-webui start=2026-10-15T23:12:31Z end=2026-10-15T23:13:25Z rc=0 tests=113 pass=113 fail=0 skipped=0
|
||||
test-auth start=2026-10-15T23:13:25Z end=2026-10-15T23:13:26Z rc=0
|
||||
test-conductor start=2026-10-15T23:13:26Z end=2026-10-15T23:13:31Z rc=0
|
||||
test-config start=2026-10-15T23:13:31Z end=2026-10-15T23:13:32Z rc=0
|
||||
test-discord start=2026-10-15T23:13:32Z end=2026-10-15T23:13:39Z rc=0
|
||||
test-extension-package start=2026-10-15T23:13:39Z end=2026-10-15T23:13:40Z rc=0
|
||||
test-foundation start=2026-10-15T23:13:40Z end=2026-10-15T23:14:18Z rc=0
|
||||
test-land-work start=2026-10-15T23:14:18Z end=2026-10-15T23:14:29Z rc=0
|
||||
test-queue start=2026-10-15T23:14:29Z end=2026-10-15T23:15:01Z rc=0
|
||||
test-release start=2026-10-15T23:15:01Z end=2026-10-15T23:15:14Z rc=0
|
||||
test-task start=2026-10-15T23:15:14Z end=2026-10-15T23:15:46Z rc=0
|
||||
Executable
+26
@@ -0,0 +1,26 @@
|
||||
#!/usr/bin/env bash
|
||||
# Row 146 owner's gate (sage-0397): the touched packages, the packages that import the bus, and every
|
||||
# scripts/test-*.sh, on dda7e31b0 plus build.patch. One log per step under gate/.
|
||||
set -uo pipefail
|
||||
WT=${1:-$HOME/dewey-scratch/r146/wt}
|
||||
OUT=$(cd "$(dirname "$0")" && pwd)/gate
|
||||
mkdir -p "$OUT"
|
||||
export TMPDIR=$HOME/dewey-scratch/tmp
|
||||
status=0
|
||||
for p in bus business cli harness plugins seat tasks webui; do
|
||||
start=$(date -u +%FT%TZ)
|
||||
(cd "$WT/packages/$p" && node --test tests/*.test.mjs) >"$OUT/pkg-$p.log" 2>&1
|
||||
rc=$?
|
||||
counts=$(grep -E '^ℹ (tests|pass|fail|skipped) ' "$OUT/pkg-$p.log" | awk '{printf "%s=%s ", $2, $3}')
|
||||
echo "pkg-$p start=$start end=$(date -u +%FT%TZ) rc=$rc $counts"
|
||||
[ "$rc" -eq 0 ] || status=1
|
||||
done
|
||||
for s in "$WT"/scripts/test-*.sh; do
|
||||
n=$(basename "$s" .sh)
|
||||
start=$(date -u +%FT%TZ)
|
||||
(cd "$WT" && bash "scripts/$n.sh") >"$OUT/$n.log" 2>&1
|
||||
rc=$?
|
||||
echo "$n start=$start end=$(date -u +%FT%TZ) rc=$rc"
|
||||
[ "$rc" -eq 0 ] || status=1
|
||||
done
|
||||
exit $status
|
||||
@@ -0,0 +1,267 @@
|
||||
✔ agents: a held role with nothing on the bus is idle; a role session gets the claim rows unchanged (154.309038ms)
|
||||
✔ agents: working counts what the holder received and has not read; routed alone is not working (194.796912ms)
|
||||
✔ agents: input needed is the role's open decisions routed to the human, gated first, then oldest (342.566368ms)
|
||||
✔ agents: working wins over waiting, and Input needed still shows (170.128045ms)
|
||||
✔ agents: a new holder doesn't inherit what the last one left unread; decisions stay with the role (205.51664ms)
|
||||
✔ agents: state reads only its own business, even for a run name both use (185.317293ms)
|
||||
✔ agents: a message the holder released unread is stranded; the next holder gets nothing and cannot read it (196.846097ms)
|
||||
✔ agents: a message the holder read is not stranded; one the current holder has not read is not listed (201.349205ms)
|
||||
✔ agents: stranded is oldest first and capped at 50 for a role (903.110769ms)
|
||||
✔ agents: stranded is per role and per business (355.472422ms)
|
||||
✔ agents: a message routed to a held role and not yet received is not stranded (146.03124ms)
|
||||
✔ launch identity is stamped, payload identity is refused and stale holder cannot send (165.488163ms)
|
||||
✔ decision classes route from policy; gated resolution is human-only, choice and target must match (258.301737ms)
|
||||
✔ claim exclusion, holder release, gated revoke and rerouting to a new holder are atomic (286.41165ms)
|
||||
✔ launch events require a human CLI capability; generic emit cannot forge authority events (176.953147ms)
|
||||
✔ within-role decisions close atomically and invalid options or blocking omissions refuse (188.595974ms)
|
||||
✔ a recommendation that is not exactly one option key refuses invalid-recommendation after the options (252.156479ms)
|
||||
✔ observer capabilities read human inbox but cannot mutate or forge launch identity (178.798905ms)
|
||||
✔ task action subjects and linked decision trail are complete and ordered (190.939452ms)
|
||||
✔ launch binding is durable and reconnecting requires the identical trusted record (121.037324ms)
|
||||
✔ business isolation includes inherited object names and cross-business message references (213.650027ms)
|
||||
✔ authority never transfers between action, run, target, unresolved or replaced role holder (294.954135ms)
|
||||
✔ task projection uses schema current view, skipping earlier and equal-start polls (170.769395ms)
|
||||
✔ revocation permanently bars the old run from reclaiming first, including after broker restart (251.189649ms)
|
||||
✔ empty message references refuse before storage; refusal-evidence failure stays a typed error (158.660451ms)
|
||||
✔ both arbiters require human resolution when their cross-role route is themselves (264.493258ms)
|
||||
✔ the shipped coder role raises task.reassign as gated to the human; task.scope.change stays cross-role (203.209414ms)
|
||||
✔ S1 adapter takes resolved limits and refs, rejects mismatched instance, never mutates input (2.547027ms)
|
||||
✔ REQ-COS-1, REQ-ROLE-2: the chief of staff ends a run with a reason and no decision, and the reason is logged (238.633011ms)
|
||||
✔ REQ-ROLE-2: a role without role.end still needs a resolved decision to revoke (334.367889ms)
|
||||
✔ REQ-ROLE-2: storage accepts a revoke with a reason or a decision and aborts one with neither (223.921759ms)
|
||||
✔ REQ-ROLE-2: the chief of staff may still cite a decision, and a decision alone is the old path (243.666348ms)
|
||||
✔ REQ-ROLE-2: a role without role.end still ends a run through a resolved decision, which is recorded and has no reason (247.174069ms)
|
||||
✔ REQ-ROLE-2: a reason is required, bounded, and never sent with a decision (283.846624ms)
|
||||
✔ REQ-COS-1: the chief of staff cannot end its own run or the assistant's through role.end (267.783901ms)
|
||||
✔ REQ-LIMIT-1, REQ-COS-1: organization.set from the chief of staff reaches the shared writer, named as the actor (249.969946ms)
|
||||
✔ REQ-LIMIT-1, REQ-COS-1: a refused organization.set logs action.refused and no action.allowed, like a refused limits.set (322.877979ms)
|
||||
✔ REQ-LIMIT-1: organization.set is refused for every caller whose role file lacks organization.change (334.187497ms)
|
||||
✔ REQ-LIMIT-1: the chief of staff is logged as allowed, and organization.set takes only the human's keys (390.877334ms)
|
||||
✔ REQ-ROLE-3, REQ-LIMIT-1: a chief-of-staff change is validated, written and logged like a human's; an invalid one is refused (589.965223ms)
|
||||
✔ REQ-ROLE-2, REQ-COS-1: the 3c→3d migration lets the chief of staff end a held role with a reason; neither is still refused (830.047019ms)
|
||||
✔ comment cursors isolate businesses, move only forward and remain append-only (147.706357ms)
|
||||
✔ only trusted sync writes validated cursors; events and cursor share rollback (119.617146ms)
|
||||
✔ explicit 3b copy migration preserves evidence and opens as 3e; normal startup never migrates (845.709576ms)
|
||||
✔ migration refuses active writers and drifted legacy schemas, with no partial upgrade (1516.080499ms)
|
||||
✔ named migration registry chains 3b through 3e to a fixture-only future version in order (849.297393ms)
|
||||
✔ migration refuses mismatched source metadata without changing schema or evidence (816.314101ms)
|
||||
✔ offline command migrates only the supplied fixture root and reports usage errors (850.82785ms)
|
||||
✔ credentials gives human and reader sessions service, account, role, date and state, and nothing else (100.176513ms)
|
||||
✔ credentials refuses a role session and any argument (169.506472ms)
|
||||
✔ credentials reads the status on each request, and a broker without one lists none (243.562313ms)
|
||||
✔ the broker process answers credentials without a token, path or variable in its output, log or store (208.621157ms)
|
||||
✔ only validated broker references load; returned data and exceptions cannot expose a known token (4.103713ms)
|
||||
✔ bad file modes, symlinks, repository/data paths, malformed tokens and missing dates refuse (10.514873ms)
|
||||
✔ expiry refuses use and env references never become client data (0.730132ms)
|
||||
✔ S1 parsed service refs work, service mismatch refuses, Gitea rotation due is a warning state (1.486186ms)
|
||||
✔ opaque tokens shorter than 16 characters refuse before use (0.301204ms)
|
||||
✔ each C-suite role file carries the same two lists: human, chief-of-staff, pm, cto (2.448972ms)
|
||||
✔ chief-executive-officer: messages to and from the user, chief of staff, pm and cto pass (466.168083ms)
|
||||
✔ chief-executive-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (460.673302ms)
|
||||
✔ chief-executive-officer: another C-suite role isn't on the lists either (388.297411ms)
|
||||
✔ chief-financial-officer: messages to and from the user, chief of staff, pm and cto pass (466.039232ms)
|
||||
✔ chief-financial-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (457.09291ms)
|
||||
✔ chief-financial-officer: another C-suite role isn't on the lists either (434.057574ms)
|
||||
✔ chief-information-officer: messages to and from the user, chief of staff, pm and cto pass (492.547674ms)
|
||||
✔ chief-information-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (496.967359ms)
|
||||
✔ chief-information-officer: another C-suite role isn't on the lists either (393.526928ms)
|
||||
✔ chief-information-security-officer: messages to and from the user, chief of staff, pm and cto pass (439.283962ms)
|
||||
✔ chief-information-security-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (455.868065ms)
|
||||
✔ chief-information-security-officer: another C-suite role isn't on the lists either (308.892695ms)
|
||||
✔ chief-marketing-officer: messages to and from the user, chief of staff, pm and cto pass (412.358972ms)
|
||||
✔ chief-marketing-officer: a message to or from the coder, reviewer or assistant is refused and logged, and nothing is stored (354.981846ms)
|
||||
✔ chief-marketing-officer: another C-suite role isn't on the lists either (330.104807ms)
|
||||
✔ a human resolve sends the raising role one message from the human, and its request is the answer (221.1687ms)
|
||||
✔ a cross-role decision resolved by its arbiter comes from that role and run, with no request (241.982457ms)
|
||||
✔ a human withdraw sends one message with the note (252.032714ms)
|
||||
✔ a human seen before the close leaves the request on the close's answer, not the seen (285.314815ms)
|
||||
✔ the raising run's withdraw, a supersede, a within-role raise and seen send nothing (272.425996ms)
|
||||
✔ refused closes send nothing: invalid-choice, decision-closed, not-resolver (287.950553ms)
|
||||
✔ a raising role nobody holds at the close gets the message on the next claim (269.921663ms)
|
||||
✔ a human DECISION send keeps its own instruction as the request, not a close's answer (257.774431ms)
|
||||
✔ a cross-role raise whose arbiter the raiser does not hear from is refused and stores nothing (275.899771ms)
|
||||
✔ a gated raise by a role that does not hear from the human is refused and stores nothing (290.1464ms)
|
||||
✔ a route the raiser hears from is allowed, checked from the route to the raiser (328.653682ms)
|
||||
✔ a refused supersede withdraws nothing (293.12816ms)
|
||||
✔ the assistant's within-role and gated raises still work (279.602366ms)
|
||||
✔ roles lists open decisions routed to a role, and never the human inbox (209.306527ms)
|
||||
✔ recent lists closed decisions of every route, newest close first, with how each closed (303.984481ms)
|
||||
✔ recent gives the closing event as closed when the decision was seen first (291.625644ms)
|
||||
✔ recent stops at RECENT rows (788.34171ms)
|
||||
✔ every row is what trail already gives the same session for that id (272.599513ms)
|
||||
✔ a role session can't list decisions, so it can't read another role's open decisions (414.064406ms)
|
||||
✔ decisions is a read: one business, strict arguments, nothing written (431.436216ms)
|
||||
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (125.811001ms)
|
||||
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (129.402539ms)
|
||||
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (155.884459ms)
|
||||
✔ endLaunch leaves a claim another run took alone (183.968848ms)
|
||||
✔ refuse records action.refused against the caller with the code only (123.24852ms)
|
||||
✔ launches off refuses role.launch with launch-revoked until launches on (173.169157ms)
|
||||
✔ broker process: launch ops authorize role.launch, record refusals and end runs (307.154771ms)
|
||||
✔ human proof binds CLI entry, process start and nonce; agents and incomplete ancestry refuse (2.432203ms)
|
||||
✔ process reader gets own kernel identity without exposing environment values (0.706748ms)
|
||||
✔ EACCES ancestor environments skip only markers; commands and registered launches still refuse (1.096726ms)
|
||||
✔ real pid 1 remains inspectable when its environment is protected (0.390914ms)
|
||||
✔ a message to a stopped role sends launch.by one notice, and the result says so (174.053071ms)
|
||||
✔ a message to a running role sends no notice and its result is unchanged (146.627914ms)
|
||||
✔ a re-route at a claim, a release and claim, and a broker restart send no second notice (250.296044ms)
|
||||
✔ a run launched but not yet claimed counts as no holder (138.141167ms)
|
||||
✔ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (257.62164ms)
|
||||
✔ a business with no launch block tells nobody and says there is no launcher (116.885042ms)
|
||||
✔ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (342.260961ms)
|
||||
✔ limits binds actor from human proof and rejects role, reader, tester and forged actor (188.927591ms)
|
||||
✔ runtime wires verified human settings to the actual shared file writer and actor receipt (275.244261ms)
|
||||
✔ uncertain organization receipts leave bus startup and reads alone but refuse writes until reconciled (410.165805ms)
|
||||
✔ within-role sends cite an open gated launch decision without spending it or naming it in grants (201.056735ms)
|
||||
✔ missing and foreign-business citations refuse and roll back message and grant (181.407768ms)
|
||||
✔ cross-role sends still need a matching resolved decision and consume it once (256.573178ms)
|
||||
✔ messages pages all human messages newest first without writes; read state is history (2586.900667ms)
|
||||
✔ messages refuses role callers, invalid paging and cursors outside this human feed (262.050209ms)
|
||||
✔ views messages passes only its paging arguments through (0.287332ms)
|
||||
✔ messages isolates businesses even with a valid foreign cursor (180.533061ms)
|
||||
✔ the assistant sends to the user and to the chief of staff only (320.935441ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (366.349396ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (353.739692ms)
|
||||
✔ REQ-ASSIST-2 REQ-THREAD-1 thread.send to an instance that does not hear from the user is refused and stores nothing (307.245054ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (342.660771ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (366.916225ms)
|
||||
✔ the sender list is checked before the target list (320.458556ms)
|
||||
✔ roles without the field behave exactly as before (434.557463ms)
|
||||
✔ a business with no role definitions at all is unlimited (379.000582ms)
|
||||
✔ a malformed messaging field refuses at boot (130.754749ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (339.95302ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (351.167089ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (346.73429ms)
|
||||
✔ plugins and plugins.set refuse every non-human session and a forged actor, and pass only the patch with the verified actor (199.908484ms)
|
||||
✔ runtime: the switch changes the organization file, the receipt carries the actor, and a bad shape, an unknown module and a stale revision are refused with nothing written (465.107781ms)
|
||||
✔ vikunja:19/309 through the broker, a patch switches the kinds it names and keeps the rest; null removes one kind and is trailed (411.058315ms)
|
||||
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (210.04907ms)
|
||||
✔ startup token refusal returns safe code without value or partial listening broker (61.356235ms)
|
||||
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (204.331239ms)
|
||||
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (234.437337ms)
|
||||
✔ trusted host registers later launches; socket clients never have a registration verb (203.18482ms)
|
||||
✔ runtime excludes declared project roots even when host supplies no repoRoots (65.17521ms)
|
||||
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (201.114659ms)
|
||||
✔ a reply is listed for human and reader sessions, and its delivery rows are unchanged (232.912283ms)
|
||||
✔ the reply still reaches the human message.receive (mosaic talk) after the Console showed it (184.292201ms)
|
||||
✔ a message with no reply gives an empty list (167.01548ms)
|
||||
✔ replies come oldest first and stop at REPLIES (773.32855ms)
|
||||
✔ an id that names no message in the business refuses message-not-found, and the refusal is recorded (315.102574ms)
|
||||
✔ strict arguments; a role session gets human-required (377.903681ms)
|
||||
✔ views passes replies through as one call with the id (0.272817ms)
|
||||
✔ requirements returns the committed list to a holding role session, and no one else (204.602948ms)
|
||||
✔ the PM's prd.approve with no task, when no id fits, reaches the human's Inbox (146.317894ms)
|
||||
✔ the PM's non-blocking role.revoke with no task reaches the human's Inbox (176.980583ms)
|
||||
✔ a push is recorded as the action.allowed for git.push.working on the task, and only the host records one (229.636603ms)
|
||||
✔ review.request names the latest pushed commit and sends the reviewer a REVIEW-REQUEST (246.039477ms)
|
||||
✔ review.request says which run holds the reviewer role, or null, and a null request waits for a claim (284.848132ms)
|
||||
✔ review.request refuses a commit that isn't the latest push, a non-reviewer and a role without the action (397.617273ms)
|
||||
✔ reviewFetch answers only the addressed reviewer, for the request it cites (246.903155ms)
|
||||
✔ review.verdict answers one request once, to the role that asked (313.925593ms)
|
||||
✔ task.close on a pushed task needs an approve verdict for the latest push (420.886868ms)
|
||||
✔ a refusal the host decided is filed on the task it names, and only a task ref counts (253.342279ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1527.981862ms)
|
||||
✔ gated approval authorizes once, survives store reopen, and fresh approval works (268.520703ms)
|
||||
✔ another run cannot consume an approval; a failed check leaves it usable (220.221408ms)
|
||||
✔ two scheduled callers have exactly one grant and one consumed refusal (170.85467ms)
|
||||
✔ failed commit rolls consumption back; cross-role consumes and within-role stays reusable (344.949699ms)
|
||||
✔ class drift gated to cross-role refuses before consumption (219.898121ms)
|
||||
✔ class drift cross-role to gated refuses before consumption (275.778113ms)
|
||||
✔ class drift gated to within-role refuses before consumption (269.619555ms)
|
||||
✔ class drift cross-role to within-role refuses before consumption (255.984804ms)
|
||||
✔ class drift within-role to gated refuses before consumption (221.194956ms)
|
||||
✔ class drift within-role to cross-role refuses before consumption (193.172496ms)
|
||||
✔ message.send consumes approval and prevents a later send or authorize (223.247914ms)
|
||||
✔ role.revoke consumes approval and prevents a later revoke or authorize (295.965112ms)
|
||||
✔ a business that never switched launches reads allowed with no time and no event (132.840282ms)
|
||||
✔ launches revoked and then restored read allowed, with the restore time and event id (163.321372ms)
|
||||
✔ a task closed on the tracker leaves the open list, and total counts the open ones (158.914515ms)
|
||||
✔ a tombstone is not open (154.090535ms)
|
||||
✔ the open list stops at the cap and says so; total still counts every open task (143.339987ms)
|
||||
✔ a role and a reader session read state; arguments, and an unbound cap, refuse (143.905381ms)
|
||||
✔ a human session reads the same state, with the same cap (134.60033ms)
|
||||
✔ reading state writes nothing: every table keeps its row count (157.270072ms)
|
||||
✔ creates private WAL store and excludes a second writer until explicit close (146.32856ms)
|
||||
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (172.821604ms)
|
||||
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (205.440782ms)
|
||||
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (186.337647ms)
|
||||
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (117.157167ms)
|
||||
✔ async transactions refuse before invoking their function (89.104999ms)
|
||||
✔ the session default fits under the reply cap and pages to the end with next (291.224494ms)
|
||||
✔ the short form: no description, assignees by role, every listed key (255.865596ms)
|
||||
✔ each filter, alone and together, and total counts every match (329.262013ms)
|
||||
✔ task_ref reads one task in full, as the whole board has it (310.721142ms)
|
||||
✔ no arguments is the read the Console and mosaic make, unchanged (274.671657ms)
|
||||
✔ an unknown argument or a bad value refuses invalid-request (914.43375ms)
|
||||
✔ tasks rows carry priority and requirement for every session that reads tasks (313.867593ms)
|
||||
✔ the read model rebuilds from the ledger: a reopened bus and each trail give the same values (359.323574ms)
|
||||
✔ an empty business and one with snapshots but no task.created read cleanly (145.534742ms)
|
||||
✔ recordTask keeps sync reads and a role write apart (199.929475ms)
|
||||
✔ read_at must be one canonical UTC format, so the projection compares strings safely (113.401312ms)
|
||||
✔ a bad entry refuses the whole record (118.66264ms)
|
||||
✔ taskView reads the projection for one business (148.777416ms)
|
||||
✔ requestTask hands only a holder and a task verb to the handler, and records refusals (256.592687ms)
|
||||
✔ the server sends task verbs to the adapter with its own timeout; other verbs stay synchronous (405.863348ms)
|
||||
✔ without an adapter the server refuses every task verb (200.458368ms)
|
||||
✔ the runtime refuses an invalid adapter and closes a valid one (252.26502ms)
|
||||
✔ the process loads the S3 adapter from plain-data trackers (304.311771ms)
|
||||
✔ the tester binds only when the business sets bus.tester to exactly true (856.591833ms)
|
||||
✔ a business may not name a role tester, so the tester address is never a role (243.077199ms)
|
||||
✔ every verb outside the tester list refuses tester-refused and is recorded against the tester (582.446842ms)
|
||||
✔ a tester message is from tester, starts [mos test], and writes no human.input or authority (205.889383ms)
|
||||
✔ a role answers a tester only in reply to a tester message, and the answer never reaches the human (203.35972ms)
|
||||
✔ the tester reads the human views a reader reads (156.678636ms)
|
||||
✔ tester proof binds its own CLI, start time and nonce, refuses a managed run and allows an agent (1.060885ms)
|
||||
✔ neither CLI's nonce proves the other: each proof is bound to its own CLI and nonce variable (0.311245ms)
|
||||
✔ testerNonce reads only the tester's variable and gives null on any read error (0.215716ms)
|
||||
✔ an envelope carries exactly one of cap, human and tester; no tester authenticator refuses (105.825431ms)
|
||||
✔ tester-cli.mjs binds through the runtime when the switch is on, and refuses off or under a run marker (964.191172ms)
|
||||
✔ REQ-THREAD-1 REQ-ORG-2: the 3d→3e migration adds the thread tables and leaves messages from before threads as written (1025.50546ms)
|
||||
✔ REQ-THREAD-1: a 3d bus with a changed schema is refused and keeps its version and tables (814.680528ms)
|
||||
✔ REQ-THREAD-1: the offline command prints the kept-message counts before the ready line (714.055248ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (358.141038ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1158.465974ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (336.260694ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3368.158769ms)
|
||||
✔ REQ-MSG-1: a reply can't carry one thread instance's thread to another thread instance (90.762537ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (160.908026ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (152.400411ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1: threadIdle releases only a thread with nothing waiting, and only for its holder (188.278656ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1: a message delivered to a run that ended unread doesn't hold up the next holder (140.903418ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: an approved role.revoke never reaches a thread run, and the thread stays held (124.856106ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (142.536251ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (100.183602ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (137.61955ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (451.376424ms)
|
||||
✔ socket capability stamps launch identity; shared views use wire, no SQL client (178.320427ms)
|
||||
✔ two wire claims serialize; a lost reply never automatically retries (188.18906ms)
|
||||
✔ malformed, oversized and identity-forging envelopes refuse without echoing input (129.458202ms)
|
||||
✔ client preserves UTF-8 when a response divides a multibyte character (11.614833ms)
|
||||
✔ committed mutation followed by dropped reply reports unknown and is never retried (148.485743ms)
|
||||
✔ web.search: a granted role gets labelled results, and the call is trailed with role, run, verb and query (191.235018ms)
|
||||
✔ web.fetch: a granted role gets the page as labelled text, and the call is trailed with the url (176.022108ms)
|
||||
✔ a role without the grant is refused, the refusal is logged with the verb, and nothing is fetched (199.869237ms)
|
||||
✔ a broker with no web service refuses a granted role (145.845961ms)
|
||||
✔ bad requests are refused: unknown verb, extra or missing argument, not a string, a human or reader session (210.443237ms)
|
||||
✔ a session that is not the role holder is refused (121.326784ms)
|
||||
✔ web.mjs's fences hold on the broker side: refusals are normal results with the fixed reason (390.952664ms)
|
||||
✔ web.search with no search source configured is a refused result, not an error (168.410222ms)
|
||||
✔ a search source that fails with its own refusal, or that throws, is handled (162.550165ms)
|
||||
✔ a slow search source ends in a refusal at the deadline (159.849401ms)
|
||||
✔ a secret in the arguments is refused before anything is trailed or fetched (107.352714ms)
|
||||
✔ over the socket: the server routes web verbs to the service; other roles are refused; no service is web-not-configured (218.591953ms)
|
||||
✔ busBusiness: the web grant comes from "web" in the resolved tool limit (0.224276ms)
|
||||
✔ webServices: the business's search-source plug-in and web.searxng var make web.search work; without either it is refused as not configured (199.835874ms)
|
||||
✔ an ungranted call is refused at once: no admission, no wait, nothing touched (158.862375ms)
|
||||
✔ over the socket an ungranted caller is dropped by the server timeout and a granted one gets the longer wait (462.63401ms)
|
||||
✔ a search that never answers is aborted at the deadline, the module sees the signal, and the call is trailed as refused (timeout) (190.232845ms)
|
||||
✔ a fetch that stalls is cut off at the deadline: the request is destroyed, not left running (188.299127ms)
|
||||
✔ one query limit: over SEARCH_MAX_QUERY_CHARS or empty is refused with the same reason before any backend, and the tool schema carries the same number (148.621523ms)
|
||||
ℹ tests 259
|
||||
ℹ suites 0
|
||||
ℹ pass 259
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 10115.428473
|
||||
@@ -0,0 +1,114 @@
|
||||
✔ the role file loads and resolves through loadBusiness (7.112463ms)
|
||||
✔ the shipped file is exactly the approved list (0.923586ms)
|
||||
✔ the assistant's authority is message.send within role and nothing else (2.476423ms)
|
||||
✔ the assistant talks to the user and the chief of staff only, and no other shipped role is limited (0.850092ms)
|
||||
✔ a business grant through limits does not widen the role (1.958843ms)
|
||||
✔ a launch block whose by is the assistant is refused (1.991426ms)
|
||||
✔ the instance takes no credential references and no tracker (3.25552ms)
|
||||
✔ an arbiter whose role definition declares messaging lists is refused, for each kind (5.286341ms)
|
||||
✔ an arbiter without messaging lists is accepted beside the limited assistant (2.46178ms)
|
||||
✔ the contract passes work to the chief of staff and directs no one (0.689355ms)
|
||||
✔ REQ-HARN-2: the assistant holds the web grant, and no other role file does (4.510304ms)
|
||||
✔ config directory and file path follow MOSAIC_CONFIG (1.496185ms)
|
||||
✔ the fixture business validates and comes back frozen (5.701335ms)
|
||||
✔ two instances may share a definition (2.184858ms)
|
||||
✔ top-level refusals (5.674048ms)
|
||||
✔ arbiters and projects (8.87934ms)
|
||||
✔ role instances (4.341438ms)
|
||||
✔ Vikunja bots (7.809525ms)
|
||||
✔ a role without Vikunja takes no tracker block (2.385635ms)
|
||||
✔ credential references match the definition's services (2.282029ms)
|
||||
✔ launch (7.438251ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 launch.threadIdleSeconds: absent is the default, a positive integer is used, anything else refuses (3.698053ms)
|
||||
✔ loadBusiness: file checks (1.589867ms)
|
||||
✔ loadBusiness: not a regular file (34.854026ms)
|
||||
✔ loading writes nothing (0.981889ms)
|
||||
✔ names that are Object.prototype properties don't count as declared (2.679562ms)
|
||||
✔ the shipped example refuses as written and validates once filled in (0.767571ms)
|
||||
✔ the role file loads and resolves through loadBusiness (8.124958ms)
|
||||
✔ the shipped file is exactly the approved list (0.296718ms)
|
||||
✔ the resolved record matches the approved list, so a widened file fails (2.234519ms)
|
||||
✔ the chief of staff holds role.launch, message.send, role.end and organization.change; every other action is gated (1.91708ms)
|
||||
✔ the pm does not hold role.launch (2.045155ms)
|
||||
✔ a business grant of a gated action through limits does not widen the role (2.268958ms)
|
||||
✔ a limit that drops role.launch leaves the chief of staff with no launch block (1.562094ms)
|
||||
✔ a launch block whose by is the pm instance is refused (3.520015ms)
|
||||
✔ the contract names no duty to talk to the human and the pm contract no launch (0.481995ms)
|
||||
✔ the instance takes no credential references and no tracker (2.735568ms)
|
||||
✔ usage errors exit 4 (288.496847ms)
|
||||
✔ validate: a good business exits 0 and prints instance digests (63.885551ms)
|
||||
✔ validate: project files (300.86273ms)
|
||||
✔ validate: missing files and a broken system config (252.747608ms)
|
||||
✔ validate: credential reference problems exit 2 and name each one (82.642252ms)
|
||||
✔ validate: a token file inside the repository is refused (64.347499ms)
|
||||
✔ validate: role definitions come from MOSAIC_ROLES_DIR (220.440393ms)
|
||||
✔ resolve: prints one instance's record (285.290426ms)
|
||||
✔ resolve: refusals (421.672701ms)
|
||||
✔ parse: exactly one of file or env, plus the service's date (2.683774ms)
|
||||
✔ check: a good file has no problems (0.866523ms)
|
||||
✔ check never opens the file: a write-only token passes (0.416316ms)
|
||||
✔ check: file problems (0.986087ms)
|
||||
✔ check: token files can't live in the repository or dataRoot, even through a linked directory (1.011068ms)
|
||||
✔ check: dates and environment references (0.430983ms)
|
||||
✔ each definition loads, with a contract file, and is exactly the approved list (4.25855ms)
|
||||
✔ an organization file that declares them passes, and each resolves to least privilege (7.101191ms)
|
||||
✔ the chief of staff launches each one; no other role does (5.280575ms)
|
||||
✔ a C-suite role can't be made the launcher: launch.by must hold role.launch (2.417383ms)
|
||||
✔ limits can narrow a C-suite role but never widen it (1.701867ms)
|
||||
✔ any unknown key, tool, action or version in a role file is refused (0.563204ms)
|
||||
✔ REQ-LIMIT-1 schema: every scope unset or zero, adjustable above four, bad values and unknown models refuse (15.256679ms)
|
||||
✔ REQ-LIMIT-1 counts each exact scope at/over limit, unlimited and old tuple after model reassignment (0.884035ms)
|
||||
✔ REQ-ROLE-3 writer: atomic validated revision, immutable previous bytes and authenticated actor/old/new receipt (218.312226ms)
|
||||
✔ REQ-ROLE-3 writer: pre-rename fault leaves old file, post-rename recovery records commit, conflicting recovery refuses (238.170979ms)
|
||||
✔ REQ-LIMIT-1 / decision145 migration prints only, preserves values, rejects ambiguity, and is idempotent (3.136427ms)
|
||||
✔ REQ-LIMIT-1 shared settings validates the complete proposed selection and logs exact actor (192.346301ms)
|
||||
✔ REQ-LIMIT-1 provider is table data: another provider routes separately and aliases share exact counts (1.798603ms)
|
||||
✔ REQ-ROLE-3 refuses live writer locks, symlink targets and uncertain recovery without changing bytes (106.696829ms)
|
||||
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (11.088531ms)
|
||||
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (263.646378ms)
|
||||
✔ vikunja:19/309 a patch changes only the kinds it names; null removes one kind, explicitly and in the trail (343.799165ms)
|
||||
✔ vikunja:19/309 an unknown kind (set or removed), a bad module, an empty patch and null on the wrong shape are refused, nothing written (1.421093ms)
|
||||
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (34.170983ms)
|
||||
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.574999ms)
|
||||
✔ vikunja:19/305 with an exists check, the setter refuses a module no tree file answers to, before anything is written (96.814455ms)
|
||||
✔ path and load (3.259901ms)
|
||||
✔ refusals (1.537639ms)
|
||||
✔ systemVars flattens the validated config (2.159058ms)
|
||||
✔ precedence: system, business, project, project role, agent (5.664429ms)
|
||||
✔ limits narrow the definition and never widen it (2.518823ms)
|
||||
✔ role.launch stays within-role only for the instance the launch block names (5.815607ms)
|
||||
✔ limits.authority without role.launch leaves the launcher with no launch block (2.096901ms)
|
||||
✔ limits.authority narrows cross-role actions too (1.343879ms)
|
||||
✔ classify (1.112682ms)
|
||||
✔ the record carries what the broker and launcher need (1.100261ms)
|
||||
✔ digest: key order doesn't matter, any value change does (7.491835ms)
|
||||
✔ refusals (2.264671ms)
|
||||
✔ the four shipped version 2 roles load (4.074104ms)
|
||||
✔ shipped role scopes match addendum B section 2 and the SR runbook (1.421657ms)
|
||||
✔ shipped authority follows the note's table (1.015613ms)
|
||||
✔ every role file in roles/ loads through the validator, and a v2 contract exists (1.524478ms)
|
||||
✔ version 1 files keep loading with no authority (1.185063ms)
|
||||
✔ the conductor policy isn't a role (0.249953ms)
|
||||
✔ a missing role file is exit 4, a symbolic link too (0.489869ms)
|
||||
✔ version 2 refusals (1.862021ms)
|
||||
✔ authority: closed vocabulary, no gated-only action, no overlap (2.126065ms)
|
||||
✔ messaging: optional, role definitions and human, never the tester (1.816815ms)
|
||||
✔ credentials: Gitea scopes (0.803843ms)
|
||||
✔ credentials: Vikunja scopes are a group-to-verbs map from the grantable list (1.172392ms)
|
||||
✔ credentials: services (0.421517ms)
|
||||
✔ contract: a non-empty regular Markdown file beside the role file (0.535777ms)
|
||||
✔ every key names known layers and a merge rule (1.019305ms)
|
||||
✔ unknown keys and wrong layers refuse (0.853707ms)
|
||||
✔ types (2.408366ms)
|
||||
✔ merge: defaults, then the most specific layer wins (0.332127ms)
|
||||
✔ merge: limits only narrow, and provenance lists each source (0.423336ms)
|
||||
✔ merge doesn't change its inputs (0.166323ms)
|
||||
✔ web.searxng takes https anywhere and http on loopback, so Jason's 127.0.0.1:8888 passes (0.236619ms)
|
||||
ℹ tests 106
|
||||
ℹ suites 0
|
||||
ℹ pass 106
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 2049.316873
|
||||
@@ -0,0 +1,219 @@
|
||||
✔ every screen and overlay fits 120x36, 80x24 and the narrow layout, row for row (1936.832362ms)
|
||||
✔ width counts terminal cells: wide CJK and emoji 2, U+FE0F after a one-cell base 1, marks 0 (79.354816ms)
|
||||
✔ broker text is shown, never interpreted: no raw control character or bidi override reaches the terminal (165.186651ms)
|
||||
✔ NO_COLOR: no escape codes, except reverse video on the selected row (220.081349ms)
|
||||
✔ 1-9 shows the decide flow's own lines and question; only y resolves (179.826703ms)
|
||||
✔ the app shows the same decide text as mosaic decide (189.731023ms)
|
||||
✔ any key but y or Y at the question answers No; nothing is sent (1416.413671ms)
|
||||
✔ below 40x10 the question is hidden, so every key answers it No, y included (Filbert R3) (729.41496ms)
|
||||
✔ under 40 columns a tall terminal shows the too-small screen even where the decide box would fit; y sends nothing (Filbert N10) (1604.022297ms)
|
||||
✔ a hidden decide box names the way out, and the status line under it does not promise y (Filbert N12) (579.268622ms)
|
||||
✔ a throw while answering the question goes to crash, sends nothing and leaves no job pending (339.438088ms)
|
||||
✔ type-ahead never answers the question: a paste, keys typed before it is drawn, keys inside askMs (1087.281051ms)
|
||||
✔ quitting at the question answers No and sends nothing, armed or not (252.439839ms)
|
||||
✔ a timer tick reads nothing under an overlay, never answers the question, and keeps a resolved status (215.306834ms)
|
||||
✔ a long question is cut inside the question; the action, target, choice and prompt stay (Dewey B1) (151.405486ms)
|
||||
✔ a decide box too big for the terminal says so, and every key answers it No, y included (Dewey B1, round 3) (1234.617047ms)
|
||||
✔ at every size the decide box shows each line y depends on, or says it is hidden (8391.386018ms)
|
||||
✔ outcome unknown: the CLI's sentence, no retry, then the trail or a re-read (158.147051ms)
|
||||
✔ refused and failed reads keep the last list, marked stale; a refused decide says refused (111.843992ms)
|
||||
✔ help or a detail box cut to fit keeps its last line, Esc included (Dewey) (57.20465ms)
|
||||
✔ keys: views, moving, trail of a selection, the command line, help and quit (244.886224ms)
|
||||
✔ one option: the status line says Press 1, not 1-1 (96.960922ms)
|
||||
✔ no business: the app says so and :business picks one (51.16527ms)
|
||||
✔ mosaic with no argument: exit 3 in an agent run, exit 4 with the usage off a terminal, the app on one (1.703798ms)
|
||||
✔ scripts/mosaic with no argument reaches the app entry; the seat usage it printed before has not drifted (168.151588ms)
|
||||
✔ strings to keep exactly live once, in the decide flow and the transport; the app does not restate them (0.47057ms)
|
||||
✔ decide with --note still asks; a No sends nothing (63.854ms)
|
||||
✔ the app's business comes from a live bus host only (0.938473ms)
|
||||
✔ runApp leaves the terminal as it found it on q, end of input, SIGTERM, SIGINT, SIGHUP and an error, the first frame's included (6.821748ms)
|
||||
✔ draw is pure: same state, same frame (0.721865ms)
|
||||
✔ recordBootRefused keeps the last good load across refusals; recordBootOk clears the refusal (5.199192ms)
|
||||
✔ an unknown key and a JSON syntax error each leave the bus down with the reason and path in the status (965.720066ms)
|
||||
✔ a missing file is recorded too, and a valid file clears the status on the next start (547.471885ms)
|
||||
✔ inbox lists only decisions routed to the human, with what approving authorizes and how to decide (203.064619ms)
|
||||
✔ decide resolves by id prefix with --yes, and the trail shows it in broker order with the task to follow (169.596323ms)
|
||||
✔ decide refuses without a terminal or --yes, on an unknown option and on a short reference (138.03057ms)
|
||||
✔ decide prints a declining choice as declining (136.508109ms)
|
||||
✔ an unknown outcome is reported once and never resent (170.460767ms)
|
||||
✔ a decision closed before the answer arrives exits 2 and points at its trail (120.91669ms)
|
||||
✔ a prefix that matches two open decisions exits 2 and resolves neither (107.035707ms)
|
||||
✔ without --business a command uses the live host's business, and a stale host.json is not a host (95.442107ms)
|
||||
✔ every human command refuses inside an agent run before it touches the bus (153.899301ms)
|
||||
✔ usage errors exit 4; no business and no host is a usage error (123.611124ms)
|
||||
✔ agents and tasks print through the broker (117.206457ms)
|
||||
✔ notify.json: missing, loose, malformed and extra keys refuse; a binding or null passes (1.607286ms)
|
||||
✔ bootConfig builds the broker's boot message for one business, with no trackers key when no project names one (99.170027ms)
|
||||
✔ trackers come from the tracker.* variables of the one project that names a tracker project (94.31936ms)
|
||||
✔ with two projects, the one that sets tracker.project supplies the tracker and the other is no conflict (70.353405ms)
|
||||
✔ two projects that each name a tracker project refuse, since the boot shape holds one (54.761181ms)
|
||||
✔ a business without tracker.baseUrl gets no trackers entry (53.327109ms)
|
||||
✔ an unknown business and a broken system config refuse with exit 3 (103.720237ms)
|
||||
✔ follow prints an unsolicited message after plain talk returned (277.623814ms)
|
||||
✔ talk --follow continues after reply and prints a later unsolicited message (206.241202ms)
|
||||
✔ inbox lists all unread human messages under decisions, does not deliver or read them (2673.800842ms)
|
||||
✔ follow refuses agent context and bad arguments (109.634682ms)
|
||||
✔ follow Ctrl-C wakes the poll sleep and removes its handler; transport errors also clean up (132.866244ms)
|
||||
✔ plain talk leaves the process SIGINT handlers unchanged (193.774232ms)
|
||||
✔ empty views say so (1.21932ms)
|
||||
✔ the trail keeps the broker's order and names a decision's task without its rows (1.525171ms)
|
||||
✔ tasks print the tracker fields the snapshot carries (0.274609ms)
|
||||
✔ the review loop: the coder pushes and asks, the reviewer fetches and approves, and the task's trail holds each step (999.061525ms)
|
||||
✔ refusals: no action, non-fast-forward, an unknown commit or request, and a push for another task moves only that task's ref (830.885361ms)
|
||||
✔ the size cap refuses a push before any byte (444.117223ms)
|
||||
✔ a fetch over the cap refuses before any byte reaches the reviewer (611.811967ms)
|
||||
✔ the socket refuses a request with no capability, an unknown one, and a bad request line (412.633641ms)
|
||||
✔ a rigged clone runs nothing: hooks, fsmonitor, a filter, a gitlink and a symlinked .git/config leave no marker (747.213911ms)
|
||||
✔ an identity with no role, or of another business, refuses not-a-role and moves no ref (625.430434ms)
|
||||
✔ a review of a project the business no longer has refuses unknown-project (426.658883ms)
|
||||
✔ past maxActive connections the socket refuses git-busy, and a hung-up connection frees its slot (314.681531ms)
|
||||
✔ close() answers host-closing to a connection still sending its request line (362.697486ms)
|
||||
✔ a bundle that trickles in refuses body-timeout at its deadline and frees its slot (850.670609ms)
|
||||
✔ a reviewer gone before its bundle was sent is filed fetch-aborted, not as the host's fault (1457.624255ms)
|
||||
✔ a reviewer that hangs up the moment it has the whole bundle was served, not aborted (702.088186ms)
|
||||
✔ send: a close after every byte left is served; one that fails a queued write is fetch-aborted (42.620044ms)
|
||||
✔ a bundle with no bytes for bodyIdle refuses body-timeout long before its deadline (701.740923ms)
|
||||
✔ send: a close once the loop is past its last chunk is served, and a failed write there is fetch-aborted (24.093833ms)
|
||||
✔ letGo waits for an answer to leave for at most its cap, then destroys the socket (302.007775ms)
|
||||
✔ a record that fails and can't be undone refuses rollback-failed, which the host logs (661.338669ms)
|
||||
✔ the host boots the broker, binds a launch in process, and the notifier DMs a blocking decision exactly once (1102.315793ms)
|
||||
✔ a notifier that dies takes the host down with exit 1, so the unit restarts the pair (380.936488ms)
|
||||
✔ a second host for the same data root refuses with exit 3 while the first runs (242.811854ms)
|
||||
✔ two bus starts racing for one data root leave one host running; the other refuses that a host already runs (677.169092ms)
|
||||
✔ a host takes over a host.lock its dead host left, and puts back a live claim that replaced it meanwhile (1.617386ms)
|
||||
✔ a host.lock that goes between the check and the read is tried again; one that can't be parsed still refuses as unreadable (0.691879ms)
|
||||
✔ a live host's lock stays, however old the file is (0.495422ms)
|
||||
✔ a host.lock left by a host killed with SIGKILL doesn't stop the next bus start (856.567664ms)
|
||||
✔ while a host boots, a reader sees no host: the human commands still ask for --business, stop and status find none (211.96318ms)
|
||||
✔ a host started before host.lock existed, holding only host.json, still refuses a second start, which leaves no lock (30.205285ms)
|
||||
✔ a broker fork that throws leaves no host.lock and no host.json (31.479301ms)
|
||||
✔ a broker send that throws leaves no host.lock and no host.json (32.681729ms)
|
||||
✔ a broker that misses its boot wait leaves no host.lock and no host.json (32.090643ms)
|
||||
✔ a notifier fork that throws stops the broker and leaves no host.lock and no host.json (331.419449ms)
|
||||
✔ a notifier send that throws stops the broker and leaves no host.lock and no host.json (168.704329ms)
|
||||
✔ a boot reply with no reader for the business refuses with exit 3 naming it, before the notifier starts, and leaves no host.lock and no live broker (384.584523ms)
|
||||
✔ a boot reply with no reader for the business refuses with exit 3 naming it, with no notifier, and leaves no host.lock and no live broker (202.61085ms)
|
||||
✔ a host.json that can't be written stops both children and leaves no host.lock (311.620152ms)
|
||||
✔ an error event on the broker before it replies fails the start at once, and leaves no host.lock and no live child (29.737118ms)
|
||||
✔ an error event on the notifier before it replies fails the start at once, and leaves no host.lock and no live child (175.033022ms)
|
||||
✔ an error event on the broker while the notifier starts fails the start once the notifier replies (331.153803ms)
|
||||
✔ an error event on the broker once the host is up stops the host with exit 1, and leaves no host.lock and no host.json (315.509738ms)
|
||||
✔ an error event on the notifier once the host is up stops the host with exit 1, and leaves no host.lock and no host.json (295.00495ms)
|
||||
✔ a broker reply that misses the wait breaks the channel: the late reply answers nothing, later requests refuse, the host exits 1 (1640.695089ms)
|
||||
✔ a broker reply with another request's id, or none, breaks the channel and the host exits 1 (461.496826ms)
|
||||
✔ a broker reply with no request waiting breaks the channel and the host exits 1 (183.631544ms)
|
||||
✔ a notifier that refuses stops the broker and the host refuses with exit 3 (266.048904ms)
|
||||
✔ a notifier that refuses after the broker died still refuses with exit 3, without a send to the dead broker (244.108906ms)
|
||||
✔ a notifier that dies before it replies, after the broker died, still refuses, without a send to the dead broker (160.525385ms)
|
||||
✔ a close send that fails with EPIPE after the notifier refuses still gives the notifier's refusal, exit 3 (245.01465ms)
|
||||
✔ a close send that fails with EPIPE after the notifier dies unanswered still gives the notifier's error (213.727911ms)
|
||||
✔ close() whose stop and close sends fail with EPIPE still finishes, with exit 1 (232.533515ms)
|
||||
✔ watchChildren reports a child that died before it was called, and one that dies later (22.452344ms)
|
||||
✔ bus stop refuses to signal a live pid that is not a bus host (202.760388ms)
|
||||
✔ bus start refuses with exit 3 and the code when the broker refuses to boot; bus status names the lock (267.586312ms)
|
||||
✔ bus start refuses with exit 3 without a notifier config (104.182612ms)
|
||||
✔ bus start runs until bus stop; status reports it while it runs (751.50983ms)
|
||||
✔ bus-service.sh renders the unit and installs it into a given directory (53.247767ms)
|
||||
✔ bus-service.sh pins the claude binary, refuses one the unit can't carry, and renders without one (62.137047ms)
|
||||
✔ bus-service.sh refuses a directory pin and keeps a symlink default unresolved (12.593165ms)
|
||||
✔ bus-service.sh refuses a default claude without the execute bit, or in a PATH dir with a space (8.133173ms)
|
||||
✔ each launch rereads limits and model selections; lowered limits keep sessions and log exact hit (66.981662ms)
|
||||
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1517.695282ms)
|
||||
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (974.713812ms)
|
||||
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (1999.231296ms)
|
||||
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (289.341296ms)
|
||||
✔ a runner that stops at once ends its launch with the runner's reason (363.505189ms)
|
||||
✔ a Claude Code launch with no session credential refuses before it starts (244.563534ms)
|
||||
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (345.282711ms)
|
||||
✔ a runner killed from the host ends its launch as killed, not failed (380.738749ms)
|
||||
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (908.864929ms)
|
||||
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (2248.546952ms)
|
||||
✔ a host that died hard leaves its sessions to the next host, which kills them and ends their runs so the role can be launched again (1009.401528ms)
|
||||
✔ a host that died hard leaves its sessions to the next host, which finds one already exited (23) and ends their runs so the role can be launched again (3805.975471ms)
|
||||
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (203.132411ms)
|
||||
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (175.670986ms)
|
||||
✔ a launch client that never closes its side doesn't hold the host's close (157.197917ms)
|
||||
✔ a runner that ignores SIGTERM is killed when the host closes (1307.178897ms)
|
||||
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.594149ms)
|
||||
✔ migration needs no bus/config, prints whole converted document, is idempotent and never writes (24.943841ms)
|
||||
✔ limits view/set use the human bus transport and pass only the explicit patch (2.4391ms)
|
||||
✔ post-119 example and Jason fixture migrate with checked inherited models; wrong or absent config refuses (311.58724ms)
|
||||
✔ plugins view/set use the human bus transport and pass only the explicit patch (vikunja:19/305) (3.099743ms)
|
||||
✔ zoned uses the IANA zone across DST (25.328516ms)
|
||||
✔ each open blocking decision is DM'd once, across polls and a restart; non-blocking ones are not (193.974304ms)
|
||||
✔ two blocking decisions get two DMs with different nonces (169.788621ms)
|
||||
✔ the digest nonce differs per business and per day and fits Discord's 25 characters (1.044859ms)
|
||||
✔ a failed DM is journaled, backs off, and is retried until it lands (138.739657ms)
|
||||
✔ five definite refusals stop a DM: one gave-up line, one log line, and a restart keeps the count (112.062194ms)
|
||||
✔ 429s, 5xx-style unknowns and refusals without a status never count toward the limit (180.478848ms)
|
||||
✔ a crash between the fifth refusal and its gave-up line: the next poll appends it and sends nothing (123.482097ms)
|
||||
✔ polled every POLL_MS against a permanent 403, a DM is sent at 0, 30, 60, 90 and 120 min and gives up only then (237.875721ms)
|
||||
✔ a restart after the second refusal does not send before that refusal's 30 min are up (227.27561ms)
|
||||
✔ the digest goes at 08:00 Chicago once a day, with blocking ones marked as DM'd (129.489143ms)
|
||||
✔ a late start with no digest for the day sends one at once; an empty inbox gets one line (109.472038ms)
|
||||
✔ an inbox read failure is logged and the next poll retries (1.186137ms)
|
||||
✔ no Discord id reaches the journal or the log (110.242492ms)
|
||||
✔ the journal: a torn tail is copied out and truncated, so an append after it reopens cleanly (31.177105ms)
|
||||
✔ the journal: a crash between the copy and the truncate leaves a tail the next open repairs (62.16209ms)
|
||||
✔ the journal: a whole file that is one torn line truncates to empty (66.908385ms)
|
||||
✔ the journal: a malformed complete line refuses and leaves the file and any torn tail alone (4.040258ms)
|
||||
✔ the journal: a loose file mode, a loose directory or a symlinked journal refuses (1.20731ms)
|
||||
✔ the journal: a line with a wrong type refuses with exit 3 and names the field (5.812382ms)
|
||||
✔ the journal: a symlinked directory refuses and says it is a link (0.586596ms)
|
||||
✔ the journal: a dangling directory link, a parent that is a file and a journal that is a directory each refuse with exit 3 (0.816954ms)
|
||||
✔ the journal: an append after the file was swapped for a symlink refuses and writes nothing through it (0.538829ms)
|
||||
✔ the journal: a directory it cannot write or create refuses with exit 3 and names the path (0.833163ms)
|
||||
✔ digest content stays within Discord's 2000 characters (0.448263ms)
|
||||
✔ runLoop never overlaps ticks and stops after the one in flight (111.368806ms)
|
||||
✔ a human command refused with human-required prints the other-tree line and exits 3 (2.945898ms)
|
||||
✔ a --tester command refused with tester-required prints the other-tree line and exits 3 (1.370962ms)
|
||||
✔ other exit-3 refusals print no other-tree line (1.45594ms)
|
||||
✔ the line names no path (0.11461ms)
|
||||
✔ shared copy: npm ci, pushed reachability, readonly/existing copy, webui delegation (690.944161ms)
|
||||
✔ wrapper preserves Q81 lease and marker, rejects foreign/symlink; check uses effective roots (558.929894ms)
|
||||
✔ bus unit copy/pm pins, install refuses all busy states and failed reads, drop-in refusal (595.071893ms)
|
||||
✔ missing package manifest refuses before npm; npm failure removes the unpublished temp copy (357.009157ms)
|
||||
✔ real pinned install loads bus and Console; same-copy mosaic talk passes proof, other trees refuse (6735.143854ms)
|
||||
✔ bus status reads effective copy/pm/drop-ins without writes; check refuses an overridden ExecStart (475.756544ms)
|
||||
✔ drop-ins in either override field and malformed metadata refuse; uninstall also checks --no-reload (208.309191ms)
|
||||
✔ install never shows a template name on systemd 261; template drop-ins still refuse (193.722415ms)
|
||||
✔ unlisted instance drop-in is found in another unit lookup directory; path discovery errors refuse (189.522058ms)
|
||||
✔ inherited mosaic-.service.d override refuses without changing the unit (215.810176ms)
|
||||
✔ inherited service.d override refuses without changing the unit (196.458842ms)
|
||||
✔ inherited drop-in unreadable directory or file refuses before writing (191.442966ms)
|
||||
✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (228.139847ms)
|
||||
✔ talk --tester refuses text without the [mos test] prefix before any call (122.48938ms)
|
||||
✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (134.554181ms)
|
||||
✔ decide, stop and launches take no --tester (122.974234ms)
|
||||
✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.416291ms)
|
||||
✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.608451ms)
|
||||
✔ talk --tester to a stopped role says nobody is told to launch it (166.328847ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 REQ-MSG-1 a thread message starts the thread's session, which stops when idle; its history survives the stop and a restart and no other thread sees it (5801.37853ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (2223.240314ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (4460.865036ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a message sent after the idle snapshot keeps the session, which answers it (2892.87269ms)
|
||||
✔ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (199.528371ms)
|
||||
✔ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (212.986223ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a thread id that isn't a safe segment, or a thread of a non-thread instance, launches nothing (245.745322ms)
|
||||
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (90.146563ms)
|
||||
task.close {} answered: invalid-request; fake saw 18 requests, first GET /info 200, GET /projects/1 200, GET /projects/1/views 200
|
||||
task.close on a missing task answered: task-not-found; it made GET /tasks/999 404
|
||||
✔ bootConfig trackers reach the S3 adapter in the real broker child, which goes ready against a fake Vikunja (547.573203ms)
|
||||
✔ the transport writes {business, verb, args} to the child and reads its JSON (51.061174ms)
|
||||
✔ a bus code on stderr becomes the exit code; garbage and timeouts are outcome problems (2240.994498ms)
|
||||
✔ busExit and refuseInsideAgent (0.557904ms)
|
||||
✔ talk sends a REQUEST, prints and reads everything that arrives, and stops at the reply (272.796812ms)
|
||||
✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1132.457905ms)
|
||||
✔ a late reply the Console has listed still reaches the next talk (2169.24688ms)
|
||||
✔ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (522.79731ms)
|
||||
✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (128.980933ms)
|
||||
✔ launches off and on go to the broker and change the business's launch state (136.512223ms)
|
||||
✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (119.761247ms)
|
||||
ℹ tests 209
|
||||
ℹ suites 0
|
||||
ℹ pass 209
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 19924.846001
|
||||
@@ -0,0 +1,109 @@
|
||||
✔ sessionModel: agent vars win, then the system's execution settings (12.024945ms)
|
||||
✔ a pi bundle: prompt, policy, tools and manifest, 0600 in a 0700 directory (4.631749ms)
|
||||
✔ a chief-of-staff bundle lists launch among the bus tools and the manifest's typed tools (2.142244ms)
|
||||
✔ a chief-of-staff bundle lists end_run and change_organization as typed and nothing untyped, for either harness (5.621667ms)
|
||||
✔ the stop line names end_run for a role.end holder, and every other role keeps today's text (6.67833ms)
|
||||
✔ a claude-code bundle adds the wrapped gate hook and the MCP config (1.874832ms)
|
||||
✔ the prompt's built-in tools line is the harness's own names, as the manifest lists them (8.224164ms)
|
||||
✔ the prompt names the project clones in the workspace, and none when there are none (5.539894ms)
|
||||
✔ the prompt explains the review loop to a role with push_working, and reviews to one with fetch_review (7.060424ms)
|
||||
✔ a bundle is written once: an existing file refuses (1.288212ms)
|
||||
✔ a path with a single quote can't go into the hook command (1.710189ms)
|
||||
✔ web grant on pi: the bundle has web_search and web_fetch, and no built-in web tool (2.382003ms)
|
||||
✔ no web grant on pi: no web tool in the bundle, and the gate blocks a web call (1.790314ms)
|
||||
✔ web grant on claude-code: the bundle has web_search and web_fetch, and no built-in web tool (2.393333ms)
|
||||
✔ no web grant on claude-code: no web tool in the bundle, and the gate blocks a web call (1.946547ms)
|
||||
✔ a granted session's gate lets the typed web tools through and still blocks the built-ins (2.19697ms)
|
||||
✔ search-source searxng-url: a granted role gets the typed broker tools and no harness web tool; an ungranted role gets nothing (3.906543ms)
|
||||
✔ search-source searxng-bundled: a granted role gets the typed broker tools and no harness web tool; an ungranted role gets nothing (3.731021ms)
|
||||
✔ search-source harness-builtin: claude-code gets WebSearch and WebFetch and no typed web tool, only when granted (6.328019ms)
|
||||
✔ search-source harness-builtin is refused for a granted pi role, which has no built-in web tool (1.768969ms)
|
||||
✔ allow exits 0, a deny exits 2 with the reason on stderr (124.164703ms)
|
||||
✔ a missing or wrong policy, or a bad event, exits 2 (83.767902ms)
|
||||
✔ the bundle's wrapped command: a missing gate or node still blocks (1085.16975ms)
|
||||
✔ claude: typed tools through MCP, the hook blocks, builtins outside --tools don't exist (734.07543ms)
|
||||
✔ claude: the hook alone blocks a path outside the workspace (511.459755ms)
|
||||
✔ claude: a second turn resumes the first turn's session (764.201917ms)
|
||||
✔ claude adapter: --restricted is always passed (5.207261ms)
|
||||
✔ claude adapter: MOSAIC_CLAUDE_BIN wins over PATH and must be an absolute executable (16.401666ms)
|
||||
✔ claude adapter: a directory pin exits 2 before it runs; a pin with a space runs (5.911408ms)
|
||||
✔ claude: CLAUDE.md files and auto-memory don't reach the model; without --restricted they do (742.642036ms)
|
||||
✔ claude: a missing hook or MCP file refuses before claude starts (7.417089ms)
|
||||
✔ pi: policy tools and typed tools pass, anything else is blocked (2.950872ms)
|
||||
✔ claude: builtins map from pi names, typed tools need the mcp prefix (0.704953ms)
|
||||
✔ file tool paths must resolve inside the workspace (1.12105ms)
|
||||
✔ pi's own path normalisation can't be used to step out (0.937677ms)
|
||||
✔ a symlink inside the workspace that points out is outside (0.83528ms)
|
||||
✔ a dangling symlink is refused at any depth, in both harnesses (3.504414ms)
|
||||
✔ read is checked under every spelling pi's read would open, in both harnesses (21.929963ms)
|
||||
✔ other spellings cover directories, dangling links and pi's cwd (1.528923ms)
|
||||
✔ a relative path climbs from the workspace's real path, in both harnesses (5.008239ms)
|
||||
✔ claude path fields per tool (0.939615ms)
|
||||
✔ glob patterns stay inside the workspace (0.938786ms)
|
||||
✔ a path that can't be checked is blocked (0.516534ms)
|
||||
✔ fetch_review's have lists the working refs before origin's, and no more than HAVE_MAX (214.012448ms)
|
||||
✔ fetch_review's have orders the working refs newest first within each clone, one clone after another (120.77238ms)
|
||||
✔ a runner git past its time: SIGTERM reaches its process group, and SIGKILL follows after the grace period (1805.503066ms)
|
||||
✔ once a signalled runner git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too (304.045306ms)
|
||||
✔ initialize, ping and tools/list (45.954339ms)
|
||||
✔ tools/call goes through the tool socket; a refusal is an isError result (36.951715ms)
|
||||
✔ replies are compact JSON; over the cap a tool error names the size and the cap (36.162225ms)
|
||||
✔ unknown tools and methods are JSON-RPC errors and never reach the socket (32.138418ms)
|
||||
✔ a missing argument is a usage error (28.312474ms)
|
||||
✔ pi: typed tools reach the socket, the gate blocks, agent_end writes the marker (362.559037ms)
|
||||
✔ pi: a reply over the cap is a tool error naming the size and the cap; list_tasks asks for open tasks (315.051088ms)
|
||||
✔ pi: a write through a dangling symlink is blocked, and nothing appears outside (355.647201ms)
|
||||
✔ pi: a read is refused when pi would open another spelling outside (362.960148ms)
|
||||
✔ pi: a relative path climbs from the real path of a workspace behind a symlink (324.758584ms)
|
||||
✔ pi: a relative path climbs from the real path of a dataRoot behind a symlink (300.654974ms)
|
||||
✔ pi: a missing extension refuses before any model call (5.634793ms)
|
||||
✔ pi: an extension without its configuration fails pi's start (254.723128ms)
|
||||
✔ founderCheck: founder variables, then a needed service without a usable token (1.019746ms)
|
||||
✔ turnRequest names the sender, class, reply and decision (0.254245ms)
|
||||
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.232449ms)
|
||||
✔ turnRequest shows the message's own sent time, a day old as well as new (0.145251ms)
|
||||
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.21098ms)
|
||||
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (257.975956ms)
|
||||
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (265.839568ms)
|
||||
✔ a task closed on the tracker is missing from the next turn's open list (233.440834ms)
|
||||
✔ a message read a day after it was sent shows the time it was sent (174.175295ms)
|
||||
✔ a decision the human resolves becomes a turn citing the decision and the answer (180.304495ms)
|
||||
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (148.331562ms)
|
||||
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (105.136993ms)
|
||||
✔ typed tools carry the runner's capability; launch goes to the host's launch socket (429.501014ms)
|
||||
✔ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (424.019026ms)
|
||||
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1319.830773ms)
|
||||
✔ the bus's launch notice is one turn with no reply, and is not taken again (306.490743ms)
|
||||
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (151.95878ms)
|
||||
✔ founder credentials stop before the claim (20) (166.788034ms)
|
||||
✔ a refused claim exits 21; an ended run's capability exits 22 (193.571729ms)
|
||||
✔ the launch ending under a running session exits 22 (142.606392ms)
|
||||
✔ a broker that stays unreachable exits 23 after brokerRetries polls (246.842523ms)
|
||||
✔ a broker that is down at the claim exits 23, not 21 (91.080107ms)
|
||||
✔ no capability, or a malformed one, on stdin exits 2 (191.25947ms)
|
||||
✔ a missing or malformed policy exits 2 before the claim (124.31863ms)
|
||||
✔ the PM gets its task verbs and the reads, and no launch (10.148378ms)
|
||||
✔ the chief of staff gets launch, send_message, end_run and change_organization, and no task verbs (2.436336ms)
|
||||
✔ end_run sends role and reason, no decision; change_organization sends revision and the organization keys (2.705063ms)
|
||||
✔ the organization keys change_organization takes are the broker's ORGANIZATION_KEYS (0.171775ms)
|
||||
✔ a role without role.end or organization.change gets neither tool, and each tool follows its own grant (9.202439ms)
|
||||
✔ the assistant gets send_message, the reads and the web tools (it holds the web grant), no launch (2.559048ms)
|
||||
✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (3.732564ms)
|
||||
✔ a coder gets no launch, no resolve_decision, and no task tools without a tracker (1.690735ms)
|
||||
✔ a coder with a tracker gets its own task tools and no task_reassign (1.495285ms)
|
||||
✔ launch only when the business's launch block names the instance as launcher (2.378713ms)
|
||||
✔ an action outside the instance's authority has no tool (1.762047ms)
|
||||
✔ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (5.154138ms)
|
||||
✔ callTool: one JSON line out, the result back, a refusal rejects (9.657511ms)
|
||||
✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (2.398156ms)
|
||||
✔ callTool sends list_tasks done false unless the session names done; other tools as given (2.420346ms)
|
||||
✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.778744ms)
|
||||
✔ web_search's query maxLength is the web layer's SEARCH_MAX_QUERY_CHARS (2.430289ms)
|
||||
ℹ tests 101
|
||||
ℹ suites 0
|
||||
ℹ pass 101
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 12128.599003
|
||||
@@ -0,0 +1,36 @@
|
||||
✔ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source and limit-check at interface version 1, each a list (1.137193ms)
|
||||
✔ REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included (0.250556ms)
|
||||
✔ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (4.190479ms)
|
||||
✔ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.16426ms)
|
||||
✔ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.14983ms)
|
||||
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (7.910403ms)
|
||||
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.547107ms)
|
||||
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.384532ms)
|
||||
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.463766ms)
|
||||
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.19829ms)
|
||||
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (25.743112ms)
|
||||
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.639448ms)
|
||||
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.765577ms)
|
||||
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.870686ms)
|
||||
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.555841ms)
|
||||
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.217322ms)
|
||||
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.425296ms)
|
||||
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.710185ms)
|
||||
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.954102ms)
|
||||
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.177091ms)
|
||||
✔ REQ-PLUG-1 the loader needs a log callback (1.070591ms)
|
||||
✔ REQ-PLUG-2 the real tree's searxng-url module switches on as the search-source and answers (2.747191ms)
|
||||
✔ REQ-PLUG-2 a SearXNG that refuses JSON (403) is search-down, a bad settings url throws (0.716448ms)
|
||||
✔ REQ-PLUG-2 search-source takes one name, not a list (0.694633ms)
|
||||
✔ REQ-PLUG-2 searxng-bundled queries the fixed loopback address and ignores web.searxng (0.740835ms)
|
||||
✔ REQ-PLUG-2 harness-builtin switches on, serves no broker search, and refuses if called (0.57101ms)
|
||||
✔ the searxng modules end the request when the broker's AbortSignal fires (41.547039ms)
|
||||
✔ hasModule: true for a shipped module, false for a missing one, an unknown kind or a bad name (0.472744ms)
|
||||
ℹ tests 28
|
||||
ℹ suites 0
|
||||
ℹ pass 28
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 227.177131
|
||||
@@ -0,0 +1,148 @@
|
||||
✔ a first launch clones the root at its branch, with the root's path as origin (33.309836ms)
|
||||
✔ the clone is not at its place until git clone has finished (25.834584ms)
|
||||
✔ a later launch fast-forwards a clean clone after a commit to the root, then finds it current (63.145278ms)
|
||||
✔ a clone ahead of the root keeps its commits and counts as current (40.454055ms)
|
||||
▶ a dirty clone and one on another branch are fetched, and nothing but refs/remotes moves
|
||||
✔ a modified file (47.890265ms)
|
||||
✔ an untracked file (43.978384ms)
|
||||
✔ a staged file (56.524335ms)
|
||||
✔ another branch (57.637711ms)
|
||||
✔ a detached HEAD (54.025007ms)
|
||||
✔ a dirty clone and one on another branch are fetched, and nothing but refs/remotes moves (261.334562ms)
|
||||
✔ a diverged clone gets the fetch into refs/remotes and is kept, not-fast-forward (54.531458ms)
|
||||
▶ a clone kept before the branch check, or for a failed status, gets no fetch
|
||||
✔ not-a-clone (24.533436ms)
|
||||
✔ hooks-present (25.832652ms)
|
||||
✔ submodule (35.973411ms)
|
||||
✔ config-changed (30.693346ms)
|
||||
✔ root-unreadable (31.783403ms)
|
||||
✔ root-detached (33.046153ms)
|
||||
✔ status-failed, on the root's branch and clean (38.606273ms)
|
||||
✔ status-failed, dirty (37.312414ms)
|
||||
✔ a clone kept before the branch check, or for a failed status, gets no fetch (259.05679ms)
|
||||
✔ a dirty clone whose fetch fails is kept, fetch-failed, exactly as it was (37.494052ms)
|
||||
✔ every git call the host makes, for a new clone and an existing one, carries maintenance.auto=false and gc.auto=0 (44.413577ms)
|
||||
✔ a clone with loose objects enough for gc --auto gets no maintenance or gc from the fetch and the merge (74.439363ms)
|
||||
▶ a clone with user.name or user.email in its config is kept, and git runs nothing in it
|
||||
✔ user.name (25.481017ms)
|
||||
✔ user.email (24.92061ms)
|
||||
✔ a clone with user.name or user.email in its config is kept, and git runs nothing in it (50.881678ms)
|
||||
✔ a commit git can't read after the fast-forward is null (46.915923ms)
|
||||
✔ a new clone whose commit can't be read refuses the launch and leaves nothing behind (19.556271ms)
|
||||
▶ a clone the session rigged is kept, and git runs nothing and writes nothing outside it
|
||||
✔ core.fsmonitor (34.261129ms)
|
||||
✔ core.hooksPath (36.54373ms)
|
||||
✔ a hook file (31.284667ms)
|
||||
✔ include.path (32.073405ms)
|
||||
✔ includeIf (34.282326ms)
|
||||
✔ a filter driver (34.889495ms)
|
||||
✔ origin moved (33.70674ms)
|
||||
✔ a second origin url (34.787575ms)
|
||||
✔ the origin url twice, both the root (34.237548ms)
|
||||
✔ an ext:: origin (33.866035ms)
|
||||
✔ a branch tracking another remote (32.39055ms)
|
||||
✔ a branch merging a tag (32.706561ms)
|
||||
✔ a fetch line onto local branches (34.015949ms)
|
||||
✔ no origin (36.751991ms)
|
||||
✔ a config file over the size cap (35.73913ms)
|
||||
✔ config a symlink to /dev/zero (37.024112ms)
|
||||
✔ the clone a symlink to the bait (31.667459ms)
|
||||
✔ the clone a file (29.394995ms)
|
||||
✔ the clone a plain directory (30.662237ms)
|
||||
✔ .git a gitdir: file (36.130463ms)
|
||||
✔ .git a symlink (30.961108ms)
|
||||
✔ .git/logs a symlink (31.199264ms)
|
||||
✔ .git/refs/heads a symlink (32.593838ms)
|
||||
✔ .git/objects a symlink (34.025049ms)
|
||||
✔ a reflog hard-linked to a file outside (32.546013ms)
|
||||
✔ HEAD a fifo (31.861027ms)
|
||||
✔ a commondir file (31.088577ms)
|
||||
✔ an alternates file (31.722216ms)
|
||||
✔ a gitlink staged, no .gitmodules (42.146696ms)
|
||||
✔ a gitlink and .gitmodules staged (44.263465ms)
|
||||
✔ a gitlink to a repository with its own gitlink (57.150284ms)
|
||||
✔ a gitlink and .gitmodules committed (47.220053ms)
|
||||
✔ a gitlink and submodule.active in config (47.669818ms)
|
||||
✔ a .git/modules with no gitlink (32.663793ms)
|
||||
✔ a clone the session rigged is kept, and git runs nothing and writes nothing outside it (1207.851606ms)
|
||||
▶ a root that can't be cloned refuses with the project id and leaves nothing behind
|
||||
✔ missing (10.890624ms)
|
||||
✔ not a repository (11.230947ms)
|
||||
✔ a plain directory inside another repository (14.340369ms)
|
||||
✔ unreadable (9.77826ms)
|
||||
✔ on no branch (11.62703ms)
|
||||
✔ missing an object (16.847245ms)
|
||||
✔ a root that can't be cloned refuses with the project id and leaves nothing behind (75.566889ms)
|
||||
✔ a clone whose root is on no branch, or gone, is kept and named (30.493616ms)
|
||||
✔ no credential or forge remote of the root reaches a clone (48.355742ms)
|
||||
✔ every project in the business file gets its own clone at its own branch (33.416879ms)
|
||||
✔ a clone past its time gets SIGTERM and refuses the launch, with nothing left in the workspace (513.305304ms)
|
||||
✔ a clone that ignores SIGTERM gets SIGKILL once the grace period is over (1018.027787ms)
|
||||
✔ a timeout signals git's process group, so a process git started dies with it (516.059542ms)
|
||||
✔ once a signalled git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too (515.324367ms)
|
||||
✔ RUNNER_FILES is exactly what the runner and the harness sources it starts import (1.675831ms)
|
||||
✔ sandboxProblem names a missing bwrap and a bwrap that fails (8.795533ms)
|
||||
✔ every bind says why; the bundle and session file stay read-only over the run directory (1.71545ms)
|
||||
✔ REQ-THREAD-2 a thread store binds its session directory and Claude transcripts, and nothing more (1.971744ms)
|
||||
✔ the host's git socket is bound only when given, read-only and before the writable binds (0.688641ms)
|
||||
✔ the git identity is the instance's, at <instance>@<business>.mosaic.invalid, and sandboxArgv refuses without it (1.400528ms)
|
||||
✔ a confined session's shell reaches its own workspace and run directory and nothing of the founder's or another session's (1724.197782ms)
|
||||
✔ a bind that exposes a stand-in, or a missing workspace bind, fails the matching check (2412.847186ms)
|
||||
✔ a confined session that runs tester-cli.mjs is refused as tester, and the same shim outside the sandbox binds (274.624721ms)
|
||||
✔ resolveSeat: by name under --repo resolves the repo layout (1.242382ms)
|
||||
✔ resolveSeat: by path resolves the fleet layout (0.309248ms)
|
||||
✔ resolveSeat: refusals for missing dir, missing launch.sh, non-executable launch.sh, invalid name, and unknown layout (0.707484ms)
|
||||
✔ tmuxContext: outside tmux, default socket, custom socket, and exec failure (0.64344ms)
|
||||
✔ makeRegistration produces a record that validates; each shape violation throws SeatError (0.792304ms)
|
||||
✔ writeRegistration/readRegistration: round trip, permissions, absence, and malformed records (1.26048ms)
|
||||
✔ updateTask: changes task, taskSetBy and updatedAt only, and refuses appropriately (1.079085ms)
|
||||
✔ CLI launch: registers, execs the fake launch script, and passes args through (29.110286ms)
|
||||
✔ CLI launch: --harness lands in the record (29.439985ms)
|
||||
✔ CLI launch: the launch script's own exit code passes through (29.308153ms)
|
||||
✔ CLI launch: relaunching a seat rewrites the one registration record (55.010843ms)
|
||||
✔ CLI launch: omitting --task records an empty string, not null (26.577701ms)
|
||||
✔ CLI seat task: updates only the task after a launch, and refuses on an unlaunched seat (77.180585ms)
|
||||
✔ CLI refusals: no args, unknown flag, missing config, already-registered env, and exec failure (150.351735ms)
|
||||
✔ samePath: equal paths, symlinked dirs, distinct dirs, and non-strings (0.470638ms)
|
||||
✔ resolveSetBy: explicit --by wins over the environment; absent or empty environment gives unknown; invalid explicit or environment values refuse with exit 4 (0.855664ms)
|
||||
✔ validateRegistration/readRegistration: taskSetBy is optional; a record without it (written before #1511) still loads unchanged; an invalid one is refused; the version does not change (0.748086ms)
|
||||
✔ updateTask: records setBy, preserves startedAt and every unrelated field, upgrades an old record in place only when the task is set, and replaces a previous attribution (2.202329ms)
|
||||
✔ CLI seat task: --by beats MOSAIC_AGENT_NAME, the environment beats nothing, empty environment is unknown, invalid --by or environment refuses with exit 4 and leaves the record byte for byte (269.653742ms)
|
||||
✔ REQ-LIMIT-1: family substring matching is no longer exported (0.774649ms)
|
||||
✔ sessionEnv passes only the allowlist, the repo's bin on PATH, and the run id (0.682024ms)
|
||||
✔ sessionExit gives a runner's signal death back as the signal; a session credential is one whole set of nonempty variables (0.26914ms)
|
||||
✔ newRun: short ids, 0700 directories, and a refusal when the socket path won't fit (1.515837ms)
|
||||
✔ session file and launch log: 0600, the session file written once (1.042745ms)
|
||||
✔ endReason maps the runner's exit codes; a signal is killed (0.127092ms)
|
||||
✔ Registry mirrors to sessions.json; readSessions marks live entries; bad files refuse (1.193996ms)
|
||||
✔ REQ-THREAD-1 Registry.running keys a thread run by business, instance and thread (0.696693ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.90759ms)
|
||||
✔ stopSession refuses an unknown run, reports a stale one, and won't signal a pid that isn't a runner (1.596298ms)
|
||||
✔ a session runs in its sandbox as pid 1 of its namespace, claims, answers, and stops on mosaic stop (352.269881ms)
|
||||
✔ workRef and validBranch take only what a ref name can hold (1.097655ms)
|
||||
✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (149.940313ms)
|
||||
✔ a rewritten branch refuses non-fast-forward and the work ref stays (130.829848ms)
|
||||
✔ a branch with no history in common with main refuses unrelated-history (74.755442ms)
|
||||
✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (49.397922ms)
|
||||
✔ main is fetched from the root again before each push, so a clone of a newer root pushes (158.892474ms)
|
||||
✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (84.435434ms)
|
||||
✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (79.001402ms)
|
||||
✔ only a v2 bundle with the named branch is read (45.977471ms)
|
||||
✔ a branch named main, or named for another task, moves only this task's work ref (94.042173ms)
|
||||
✔ a record that throws moves the work ref back, or removes a new one (151.760713ms)
|
||||
✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (403.238032ms)
|
||||
✔ a root that can't be read refuses root-unreadable (27.917657ms)
|
||||
✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2162.256403ms)
|
||||
✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1027.24913ms)
|
||||
✔ a working repository path that isn't a directory refuses (31.514038ms)
|
||||
✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (120.723946ms)
|
||||
✔ review of a project with no working repository refuses unknown-commit (13.069916ms)
|
||||
✔ the runner's git tools hold the host's limits and branch rule (1.204479ms)
|
||||
ℹ tests 135
|
||||
ℹ suites 0
|
||||
ℹ pass 135
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 5023.321131
|
||||
@@ -0,0 +1,105 @@
|
||||
✔ the boot config is checked before anything starts (94.806294ms)
|
||||
✔ a business with no tracker entry refuses task verbs (125.438587ms)
|
||||
✔ credential.expiring and .expired are recorded once per instance (226.47674ms)
|
||||
✔ a token file that changes on disk records credential.changed (106.805687ms)
|
||||
✔ autostart polls, reconciles and retries a startup the tracker was down for (126.217775ms)
|
||||
✔ a refusal a restart must clear is not retried by the poll (102.627146ms)
|
||||
✔ a poll that fires while two are queued is dropped (92.786562ms)
|
||||
✔ close waits for a running verb and refuses one that has not started (213.095044ms)
|
||||
✔ stopped bus resumes an empty task cursor after a long outage, exactly once (183.267333ms)
|
||||
✔ persisted IDs avoid replay, exclude bots and bound rows to observed new comments (208.342055ms)
|
||||
✔ commit followed by crash before cache advance neither loses nor duplicates a comment (147.512714ms)
|
||||
✔ failed event insert rolls back cursor and a retry still emits the comment once (141.990538ms)
|
||||
✔ initial cursor accepts a comment within the stated one-minute clock skew margin (102.894723ms)
|
||||
✔ the bundled Vikunja is the pinned upstream image the runbook names (1.067841ms)
|
||||
✔ every published port is on 127.0.0.1, and no secret is in the file (0.399812ms)
|
||||
✔ the committed table loads frozen; its verbs are the broker task verbs (1.405065ms)
|
||||
✔ a write names a verb the table has as its own key, not one it inherits (0.520244ms)
|
||||
✔ the schema refuses any other shape (2.15158ms)
|
||||
✔ the Field table in the slice 1 plan names the verbs each field is written by (0.617506ms)
|
||||
✔ each verb refuses, asks for a decision and writes as the table and the role files say (1178.181775ms)
|
||||
✔ the list holds the PRD's requirement ids, in its order, at its version (1.314661ms)
|
||||
✔ the committed list loads frozen (0.556909ms)
|
||||
✔ the schema refuses any other shape (3.361592ms)
|
||||
✔ the fake answers each route with the statuses and shapes Vikunja v2.7.0 sent (365.446703ms)
|
||||
✔ the project list holds recorded project objects in the recorded list envelope (105.008122ms)
|
||||
✔ the recorded task bodies pass the checks S3 applies to every read (0.467235ms)
|
||||
✔ the client works against the fake over real HTTP with the platform fetch (237.993509ms)
|
||||
✔ a correct install starts, and the first reconcile records tasks that already exist (111.306572ms)
|
||||
✔ verbs refuse while a business is starting and after startup refused it (139.656855ms)
|
||||
✔ startup refuses a token that can do more than its role needs (407.425218ms)
|
||||
✔ startup refuses an unsupported version and flags an untested one (281.371116ms)
|
||||
✔ startup refuses a board that the runbook did not install (346.065046ms)
|
||||
✔ startup refuses a project the sync bot cannot read (83.268951ms)
|
||||
✔ startup refuses a configured label the pm bot cannot see (81.638198ms)
|
||||
✔ startup refuses an expired credential and a missing sync credential (148.657897ms)
|
||||
✔ an unreachable tracker refuses with tracker-unavailable (82.794114ms)
|
||||
✔ an edit in the UI is recorded once, with the fields that changed (207.577421ms)
|
||||
✔ a move between open buckets is seen on the board, though updated does not change (165.481188ms)
|
||||
✔ a person's comment is counted and a bot's is not (282.445091ms)
|
||||
✔ the hourly reconcile catches a comment through comment_count (223.703197ms)
|
||||
✔ a task closed in the UI leaves the open view with its done bucket (393.601811ms)
|
||||
✔ a task that leaves the board is recorded as deleted, moved or out of reach (242.356923ms)
|
||||
✔ a poll that read before a verb wrote does not overwrite the verb (168.748499ms)
|
||||
✔ a tracker fault during a tick is reported and the next tick catches up (149.335366ms)
|
||||
✔ a malformed answer refuses the tick with tracker-shape (136.705591ms)
|
||||
✔ no token value reaches the database, the log or a refusal (284.94927ms)
|
||||
✔ the first look at a task counts only comments inside the window (152.556079ms)
|
||||
✔ with descendants off the adapter reads no project list and no child, as in v0 (126.934455ms)
|
||||
✔ a three-level tree is read per project, and a project outside it is not (118.729999ms)
|
||||
✔ a watch-only child keeps the business ready, and a failed child read refuses as transient (217.289676ms)
|
||||
✔ a root without the installed buckets refuses with descendants on (93.543284ms)
|
||||
✔ the project list refuses without read_all, and skips archived projects and saved filters (194.013725ms)
|
||||
✔ descendants must be true or false (93.811212ms)
|
||||
✔ a move inside the tree is a moved tombstone plus a snapshot under the new ref (164.045113ms)
|
||||
✔ a child made after startup joins the tree at the next reconcile (149.191554ms)
|
||||
✔ a child that leaves the tree has its tasks recorded missing, and the ledger keeps their history (172.242727ms)
|
||||
✔ a child deleted or hidden between reconciles drops out at the next tick, and the root still refuses (195.260333ms)
|
||||
✔ a reconcile that fails keeps the previous tree (132.431631ms)
|
||||
✔ a closed task the cursor missed takes its own project's done bucket (115.055411ms)
|
||||
✔ closed tasks read at startup take their own project's done bucket (87.434968ms)
|
||||
✔ a closed task the cursor returns takes its own project's done bucket (121.600339ms)
|
||||
✔ a task moved out of a child that leaves the tree at the same time is moved, not no-access (127.879921ms)
|
||||
✔ a task in a bucket outside the five keeps its raw bucket id (99.958675ms)
|
||||
✔ bucket 0 on a watch-only task never becomes a bucket or a state (200.50014ms)
|
||||
✔ a child whose kanban view is deleted still refuses the tick, and the reconcile reads it watch-only (140.304343ms)
|
||||
✔ a child dropped at a tick comes back at the next reconcile once the bot reads it again (134.100903ms)
|
||||
✔ task.create needs a recorded human request and a requirement id (205.820766ms)
|
||||
✔ task.create takes only an approved requirement id (202.253694ms)
|
||||
✔ task.create cites the request a received message carries, not the message's id (176.71623ms)
|
||||
✔ only labels named in the business file can be written (233.424736ms)
|
||||
✔ task.schedule sets and clears a due date and relations (267.580629ms)
|
||||
✔ assign and reassign move the role bots and record task.assigned (311.330334ms)
|
||||
✔ task.update.assigned is for the assignee and records task.state (265.206106ms)
|
||||
✔ a wrong expected digest records task.conflict and writes nothing (168.623928ms)
|
||||
✔ a cross-role verb needs a resolved decision, used once (233.483479ms)
|
||||
✔ task.close needs a verdict; after it every verb refuses with task-done (209.963895ms)
|
||||
✔ a task with pushed work closes only citing an approve verdict for its latest push, and a refusal writes nothing (280.953176ms)
|
||||
✔ a lost answer is settled by a re-read and never retried (190.521298ms)
|
||||
✔ a create whose answer is lost is reported uncertain, and the poll finds the task (186.873192ms)
|
||||
✔ a task the sync bot cannot read refuses and records nothing (96.219336ms)
|
||||
✔ verbs and polls for one business run one at a time (177.004816ms)
|
||||
✔ a due date with milliseconds is written to the second (163.822131ms)
|
||||
✔ every write landed and the final read failed: the verb succeeds and records what it wrote (115.906341ms)
|
||||
✔ some writes landed and the final read failed: write-uncertain, and nothing is recorded (80.02397ms)
|
||||
✔ a create whose final read fails succeeds and records task.created (91.96649ms)
|
||||
✔ an edit between the last write and the final read shows as external on the next poll (107.34342ms)
|
||||
✔ task.created is recorded when a later label write fails (72.851146ms)
|
||||
✔ every verb acts in an installed child, on the child's own board (259.360384ms)
|
||||
✔ task.create refuses a project outside the tree, a watch-only one and one that is not an id (167.069217ms)
|
||||
✔ with descendants off, task.create takes only the root project (86.428011ms)
|
||||
✔ a verb on a watch-only task, or a relation to one, refuses with project-not-installed (118.623726ms)
|
||||
✔ a related task is read before authority: in another project than its ref names, task-moved; missing, task-not-found (149.433606ms)
|
||||
✔ a task moved to another project of the tree refuses its old ref with task-moved and takes its new one (99.228074ms)
|
||||
✔ a verb and a create in the child record the final read of the child's board (93.672053ms)
|
||||
✔ a create in the child whose final read fails records the child's todo bucket (94.572609ms)
|
||||
✔ a lost answer in the child is settled by a re-read of the child's board (114.033894ms)
|
||||
✔ every related task is read before authority, not only the first (103.481498ms)
|
||||
ℹ tests 97
|
||||
ℹ suites 0
|
||||
ℹ pass 97
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 5231.298268
|
||||
@@ -0,0 +1,123 @@
|
||||
✔ the Board: held roles with no machine sessions, a claim with no address, the toggle kept across a reload, and Message addressed to the role (7956.520706ms)
|
||||
✔ a redirect answer on a Board read, a bus read, a conversation read, a board POST, a module read and a send signs the page out: one line, nothing stale, no further reads (6954.047428ms)
|
||||
✔ browser edge states: loading, empty, malformed, stale, hostile/long values, in-flight reply and appearance fallback (5120.024909ms)
|
||||
Rendered contrast: {"failures":[],"count":330,"lowest":4.504658476260286}
|
||||
✔ served Console browser: real board fixtures, keyboard, drafts, receipts, themes, 320px and failures (5302.83706ms)
|
||||
✔ the README says a refused field table names the file or the key at fault, never a path (1.287838ms)
|
||||
✔ S5 pages in a browser: real broker rows, inert text, Copy, routes, failures, layout and no writes (9411.996229ms)
|
||||
✔ bus routes serve the four reads from the reader view, unescaped JSON for the page to escape (705.175381ms)
|
||||
✔ decisions route serves the roles and recent lists from the reader view (435.10392ms)
|
||||
✔ credentials route serves the broker credential status from the reader view (1364.479852ms)
|
||||
✔ replies route serves the replies to one message from the reader view (2742.614962ms)
|
||||
✔ bus routes are GET-only, have no write verb, and keep the same-origin checks (88.040054ms)
|
||||
✔ bus refusals map to statuses and never carry a path or a stack (41.046414ms)
|
||||
✔ humanCall speaks the human transport protocol without blocking the server (1815.214737ms)
|
||||
✔ busReader takes --business, else the live bus host, else refuses (236.184119ms)
|
||||
✔ humanCall kills a transport that runs past its timeout (528.906657ms)
|
||||
✔ serve refuses a --business value that is not a business id (454.601104ms)
|
||||
✔ conversation view: full history, collapsed tools, hidden thinking, inert hostile content, malformed and reconcile markers (4969.850332ms)
|
||||
✔ conversation view: a fork keeps the open branch, says so, and opens the new one on request (4404.938741ms)
|
||||
✔ conversation view: a newer session with no readable history keeps the marker (3155.834671ms)
|
||||
✔ conversation view: seats without history say so and offer no reply (2578.08076ms)
|
||||
✔ Discord row through real board/WebUI: independent brake/liveness, no Reply, literal content (5103.70048ms)
|
||||
✔ return flow through the conversation view: send, tool call, delayed result, peer message, exact long answers, relaunch (53883.803938ms)
|
||||
✔ messages HTTP read pages and preserves metadata; bad arguments refuse before a read; other reads unchanged (767.643535ms)
|
||||
✔ Console Messages lists late unsolicited messages on polling with sender class time read state and trail; nav count includes beyond the page; reads never deliver (14320.360892ms)
|
||||
✔ Messages nav count polls on Tasks and Board and clears on a Board refusal; messages 403 refuses local pages (2192.305613ms)
|
||||
✔ copy writes the Console paths at the full id, read-only, and leaves an existing copy alone (2502.242089ms)
|
||||
✔ copy refuses a commit off refactor, an unknown one, a worktree and a bad copies directory (3183.785171ms)
|
||||
✔ copy writes nothing when an archived path is missing at the commit (3770.186169ms)
|
||||
✔ a copy that loses the rename race leaves no read-only temp directory behind (1025.503856ms)
|
||||
✔ a copy whose rename fails with no target refuses, writes no copy and leaves no temp directory (871.84159ms)
|
||||
✔ a copy that meets a target holding files says exists: and moves nothing into it (1423.561401ms)
|
||||
✔ a copy that meets an empty target directory replaces it by rename, not by moving into it (529.845489ms)
|
||||
✔ serve runs from a copy: /healthz 200, the config check, roles and RELEASE from the copy, the queue from --checkout (1233.680477ms)
|
||||
✔ serve refuses a --checkout that is not an absolute directory path (232.983654ms)
|
||||
✔ consoleReads runs the queue read under queueRoot and reads RELEASE under root (46.867988ms)
|
||||
✔ preview options are all three or none, and each is checked (10.572384ms)
|
||||
✔ the CLI refuses a partial or invalid preview flag set at start (1817.413507ms)
|
||||
✔ the CLI with all three flags serves the preview mode (401.103567ms)
|
||||
✔ a request for the public name needs the header equal to the user id, else 401 and nothing read (20.107391ms)
|
||||
✔ the header name matches without regard to case, and the value compare is exact (3.388133ms)
|
||||
✔ the public name with the header reads the bus views, and the Host and Origin are checked first (37.963383ms)
|
||||
✔ in preview mode every write answers 403 read-only, from the public name and loopback, and reaches nothing (18.620006ms)
|
||||
✔ loopback requests are unchanged in preview mode, and the bus views work with the board down (5.293998ms)
|
||||
✔ a proxy that rewrites Host to the loopback port gets 403 on its first request, whatever the user (15.281586ms)
|
||||
✔ a repeated Host is 400 before any other check, in preview mode and without it (6.249131ms)
|
||||
✔ without the preview flags the public name is refused and writes still reach the board (3.901963ms)
|
||||
✔ redactor: config, dataRoot, any absolute path, Discord ids and the JSON parser quote (2.134602ms)
|
||||
✔ credential state from the date alone, as the bus states it (0.266995ms)
|
||||
✔ queue: rows, one row, ids and methods, notes; no path or id from a row (1570.152307ms)
|
||||
✔ queue: a refused read fails closed with the store's text, redacted (3187.564801ms)
|
||||
✔ queue: a store that fails to load, or a child that dies, gives a fixed message with no path or stack (3800.97294ms)
|
||||
✔ business: names, vars on the allowlist, authority, credential metadata only (11.21446ms)
|
||||
✔ business: missing or invalid file refuses with the module's text, redacted (55.434522ms)
|
||||
✔ business without --business: the live bus host, else no-bus-host; no system config: not-configured (8.572199ms)
|
||||
✔ settings: release, board, loopback address, notifier binding name only (841.501521ms)
|
||||
✔ task fields: the committed table with no reads configured, GET only; a bad table refuses with no path (38.473494ms)
|
||||
✔ bus-status: a refused boot shows reason, file and last good load; a live host or an ok boot clears it (39.48795ms)
|
||||
✔ both presentations replace old activity with relaunch notice, label retained history, then resume after new activity (5068.064113ms)
|
||||
✔ reported return flow and relative Age: reply sent from the inspector, then the new answer appears there without manual refresh (22564.838761ms)
|
||||
✔ the send box: held roles, the draft and caret across a refresh, each receipt, one POST per Send, and the trail link; the board Reply on a 4xx and a 5xx (7962.279284ms)
|
||||
✔ a sent receipt lists its replies as the page refreshes, oldest first and capped, and marks none delivered or read (14926.671565ms)
|
||||
✔ startServer takes send only as a function and only with the preview mode (9.23668ms)
|
||||
✔ the CLI refuses --send without the preview flags, and without a configured bus (399.471435ms)
|
||||
✔ the CLI with --send and a configured bus sends through the human transport and logs one line (117.871698ms)
|
||||
✔ without --send the route is read-only like every other write, and config says no send (5.885069ms)
|
||||
✔ with --send every other write is still 403 read-only, and nothing reaches the board or bus (4.794244ms)
|
||||
✔ config says send only on the public name with --send on (1.592122ms)
|
||||
✔ a send without the signed-in user is 401 and is neither sent nor logged, loopback included (3.117053ms)
|
||||
✔ each request check refuses before anything is sent, and logs the refusal without the body (11.19231ms)
|
||||
✔ a send passes exactly to, body and in_reply_to, answers the id, and logs it (2.254045ms)
|
||||
✔ a crafted role name cannot forge a log line (1.56211ms)
|
||||
✔ a bus refusal is not sent, with its status; an outcome the bus could not confirm is unknown and never retried (5.328299ms)
|
||||
✔ through the human transport the request is exactly the business, message.send and the keys (93.420952ms)
|
||||
✔ against a real broker: the message is written once as a human send, and its refusals map (2133.288609ms)
|
||||
✔ loopback host and board origin fail closed (9.160737ms)
|
||||
✔ real board fixture passes through WebUI; assets and isolated seen/reply work (349.009314ms)
|
||||
✔ proxy preserves exact request bytes, status and receipt, rejects forms and malformed JSON, never follows redirect (72.003928ms)
|
||||
✔ unreachable board reports URL; CLI rejects unsupported options (633.781884ms)
|
||||
✔ render prints the unit without the preview flags (54.480481ms)
|
||||
✔ render carries every serve flag, the preview set included (9.854854ms)
|
||||
✔ a partial preview set is refused (45.396869ms)
|
||||
✔ a value the unit cannot carry is refused, for every flag (562.743522ms)
|
||||
✔ the rendered unit names none of the human proof agent markers and sets no agent variable (113.609437ms)
|
||||
✔ install into --dir with --no-reload writes the file whole, then reports unchanged (300.495815ms)
|
||||
✔ install without --no-reload runs daemon-reload and nothing that starts the unit (80.777664ms)
|
||||
✔ uninstall refuses while the unit is running, with or without --no-reload, and removes it once it is not (199.818944ms)
|
||||
✔ status prints the unit state and GET /healthz on the installed port (293.912794ms)
|
||||
✔ usage: an unknown verb or flag, and start or enable, exit 4 (60.819976ms)
|
||||
✔ without --send, render is the template with its placeholders filled, byte for byte (27.899994ms)
|
||||
✔ render --send with the preview set ends ExecStart with --send and changes nothing else (43.245871ms)
|
||||
✔ --send without the whole preview set is refused and writes nothing (207.243857ms)
|
||||
✔ install --send into --dir with --no-reload writes the sending unit, and status says whether it sends (431.352815ms)
|
||||
✔ uninstall and status take no --send (56.946589ms)
|
||||
✔ install refuses while the unit is running, in any state but inactive or failed, and changes nothing (735.2579ms)
|
||||
✔ when the state read fails, install and uninstall refuse with one line and change nothing (71.570151ms)
|
||||
✔ install needs --copy naming a copy that exists, and refuses outside the canonical checkout without --allow-worktree (69.786679ms)
|
||||
✔ install refuses unless the bus unit runs from the same copy, naming both paths, and changes nothing (499.758476ms)
|
||||
✔ render --copy runs the copy and reads the queue in the checkout; without --copy the unit is unchanged (31.639771ms)
|
||||
✔ the uid header takes only an Authentik uid; the username header still takes a username (419.951848ms)
|
||||
✔ a preview value cannot start with - or . (66.016475ms)
|
||||
✔ status names the copy and whether refactor has moved past it, and says when the unit runs from no copy (871.830594ms)
|
||||
✔ Settings form shows every scope and held role; gated save, exact payload, retained draft and no automatic retry (4132.721223ms)
|
||||
2026-10-15T23:12:37.024Z settings user="jason" changed
|
||||
✔ REQ-WEB-1 signed-in same-origin Settings write reaches exactly one human operation (26.123718ms)
|
||||
✔ REQ-WEB-1 Settings writes require enabled send, named Host, identity, exact Origin and same-origin Fetch Metadata (12.280366ms)
|
||||
✔ REQ-WEB-1 Settings validates JSON, size, revision and strict writable keys before broker call (9.678396ms)
|
||||
✔ tokens.css and icons.svg are byte copies of docs/design (1.327351ms)
|
||||
✔ JetBrains Mono files match the digests in their sources file, with the OFL text (2.329625ms)
|
||||
✔ shipped strings are unchanged, and the web keeps its write boundary (2.736251ms)
|
||||
✔ shell in a browser: System default, seeded states, 400px, focus and the Ctrl+K palette (8351.878736ms)
|
||||
✔ five states on Board, Inbox, Tasks, Agents and Trail (3200.307648ms)
|
||||
✔ Queue, Business and Settings in their five states, with no move button (6138.343777ms)
|
||||
✔ seeded secrets, Discord ids and paths reach no response and no page; business refusals in the module's words (3220.183852ms)
|
||||
✔ the server log names no config path when the system config refuses (263.242141ms)
|
||||
ℹ tests 113
|
||||
ℹ suites 0
|
||||
ℹ pass 113
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 54268.734906
|
||||
@@ -0,0 +1,17 @@
|
||||
OK status with missing harness credential exits 3 and still lists accounts
|
||||
OK status reports harness credential (read-only) + mosaic accounts
|
||||
OK api key material never reaches output
|
||||
OK oauth token material never reaches output
|
||||
OK unparseable credential file exits 2
|
||||
OK symlinked credential file exits 4
|
||||
OK env-side credential names reported
|
||||
OK env var values never reach output
|
||||
OK accounts without an accounts dir reports none and creates nothing
|
||||
OK accounts lists files and marks the active one
|
||||
OK loose account perms flagged in listing
|
||||
OK agent --auth with missing account file refuses (exit 4)
|
||||
OK agent --auth with non-0600 account file refuses
|
||||
OK agent --auth with invalid account name refuses
|
||||
OK auth.sh without valid config refuses
|
||||
|
||||
selftest: 15 passed, 0 failed
|
||||
@@ -0,0 +1,55 @@
|
||||
Note: switching to 'dda7e31b0c0fbd3e85c143dafa864ef0a29883c9'.
|
||||
|
||||
You are in 'detached HEAD' state. You can look around, make experimental
|
||||
changes and commit them, and you can discard any commits you make in this
|
||||
state without impacting any branches by switching back to a branch.
|
||||
|
||||
If you want to create a new branch to retain commits you create, you may
|
||||
do so (now or later) by using -c with the switch command. Example:
|
||||
|
||||
git switch -c <new-branch-name>
|
||||
|
||||
Or undo this operation with:
|
||||
|
||||
git switch -
|
||||
|
||||
Turn off this advice by setting config variable advice.detachedHead to false
|
||||
|
||||
Not currently on any branch.
|
||||
nothing to commit, working tree clean
|
||||
Note: switching to 'dda7e31b0c0fbd3e85c143dafa864ef0a29883c9'.
|
||||
|
||||
You are in 'detached HEAD' state. You can look around, make experimental
|
||||
changes and commit them, and you can discard any commits you make in this
|
||||
state without impacting any branches by switching back to a branch.
|
||||
|
||||
If you want to create a new branch to retain commits you create, you may
|
||||
do so (now or later) by using -c with the switch command. Example:
|
||||
|
||||
git switch -c <new-branch-name>
|
||||
|
||||
Or undo this operation with:
|
||||
|
||||
git switch -
|
||||
|
||||
Turn off this advice by setting config variable advice.detachedHead to false
|
||||
|
||||
OK dry-run: allowed change, exit 0, nothing committed (exit 0)
|
||||
OK dry-run committed nothing
|
||||
OK apply: allowed change exits 0 (exit 0)
|
||||
OK apply: attribution in commit subject
|
||||
OK apply: target tree clean after commit
|
||||
OK disallowed path refused (exit 1)
|
||||
OK disallowed path: target untouched
|
||||
OK syntax gate refused broken .mjs (exit 1)
|
||||
OK syntax gate: target untouched
|
||||
OK suite failure refused (exit 1)
|
||||
OK suite failure: target reverted to clean
|
||||
OK disabled policy refused (exit 2)
|
||||
OK disabled policy: target untouched
|
||||
OK failed run refused (exit 1)
|
||||
OK failed run: target untouched
|
||||
OK missing run exits 4 (exit 4)
|
||||
OK invalid policy exits 2 (exit 2)
|
||||
|
||||
selftest: 17 passed, 0 failed
|
||||
@@ -0,0 +1,26 @@
|
||||
OK absent adapter defaults to pi
|
||||
OK adapter mock validates (exit 0)
|
||||
OK unsupported adapter exits 2 (exit 2)
|
||||
OK env exports adapter
|
||||
OK bootstrap creates default when absent (exit 0)
|
||||
OK bootstrap wrote config file
|
||||
OK bootstrap is idempotent on existing config (exit 0)
|
||||
OK bootstrap did not rewrite existing config
|
||||
OK validate missing config exits 3 (exit 3)
|
||||
OK malformed JSON exits 2 (exit 2)
|
||||
OK unsupported configVersion exits 2 (exit 2)
|
||||
OK unknown top-level key exits 2 (exit 2)
|
||||
OK unknown execution key exits 2 (exit 2)
|
||||
OK unsupported backend exits 2 (exit 2)
|
||||
OK unsupported environment exits 2 (exit 2)
|
||||
OK relative dataRoot exits 2 (exit 2)
|
||||
OK non-canonical dataRoot exits 2 (exit 2)
|
||||
OK filesystem root dataRoot exits 2 (exit 2)
|
||||
OK home directory dataRoot exits 2 (exit 2)
|
||||
OK dataRoot containing config dir exits 2 (exit 2)
|
||||
OK control character in provider exits 2 (exit 2)
|
||||
OK symlinked config file exits 2 (exit 2)
|
||||
OK env exports resolve correctly
|
||||
OK failed validation modified nothing
|
||||
|
||||
selftest: 24 passed, 0 failed
|
||||
@@ -0,0 +1,82 @@
|
||||
toolchain: node v26.8.1
|
||||
|
||||
OK syntax: packages/discord/src/approvals.mjs
|
||||
OK syntax: packages/discord/src/authorize.mjs
|
||||
OK syntax: packages/discord/src/binding.mjs
|
||||
OK syntax: packages/discord/src/cli.mjs
|
||||
OK syntax: packages/discord/src/connector.mjs
|
||||
OK syntax: packages/discord/src/context.mjs
|
||||
OK syntax: packages/discord/src/engine-pi.mjs
|
||||
OK syntax: packages/discord/src/errors.mjs
|
||||
OK syntax: packages/discord/src/gateway.mjs
|
||||
OK syntax: packages/discord/src/git.mjs
|
||||
OK syntax: packages/discord/src/journal.mjs
|
||||
OK syntax: packages/discord/src/notify.mjs
|
||||
OK syntax: packages/discord/src/rest.mjs
|
||||
OK syntax: packages/discord/src/setspark.mjs
|
||||
OK syntax: packages/discord/src/tools.mjs
|
||||
OK syntax: packages/discord/src/web.mjs
|
||||
OK syntax: packages/discord/bin/git-credential.mjs
|
||||
OK syntax: packages/discord/extension/tools.mjs
|
||||
OK syntax: packages/discord/tests/approvals.test.mjs
|
||||
OK syntax: packages/discord/tests/authorize.test.mjs
|
||||
OK syntax: packages/discord/tests/binding.test.mjs
|
||||
OK syntax: packages/discord/tests/connector.test.mjs
|
||||
OK syntax: packages/discord/tests/context.test.mjs
|
||||
OK syntax: packages/discord/tests/copy-service.test.mjs
|
||||
OK syntax: packages/discord/tests/engine.test.mjs
|
||||
OK syntax: packages/discord/tests/fake-pi.mjs
|
||||
OK syntax: packages/discord/tests/gateway.test.mjs
|
||||
OK syntax: packages/discord/tests/git.test.mjs
|
||||
OK syntax: packages/discord/tests/helpers.mjs
|
||||
OK syntax: packages/discord/tests/journal.test.mjs
|
||||
OK syntax: packages/discord/tests/notify.test.mjs
|
||||
OK syntax: packages/discord/tests/offline-check.test.mjs
|
||||
OK syntax: packages/discord/tests/recover.test.mjs
|
||||
OK syntax: packages/discord/tests/rest.test.mjs
|
||||
OK syntax: packages/discord/tests/setspark.test.mjs
|
||||
OK syntax: packages/discord/tests/tools.test.mjs
|
||||
OK syntax: packages/discord/tests/web.test.mjs
|
||||
OK syntax: packages/discord/fixtures/claim-worker.mjs
|
||||
OK syntax: packages/discord/fixtures/legacy-owner-worker.mjs
|
||||
OK syntax: scripts/discord.sh
|
||||
OK syntax: scripts/discord-service.sh
|
||||
OK packages/discord declares no dependencies
|
||||
OK no bot-token-shaped string in packages/discord
|
||||
OK fixture binding uses placeholder ids only
|
||||
OK fixture binding validates
|
||||
OK real pi with the extension exposes exactly list_dir, read_file, search and no built-in tool
|
||||
OK real pi with a writable root exposes exactly the three reads plus write_file and edit_file, and writes nothing at start
|
||||
OK real pi with a web key exposes the three reads plus web_fetch and web_search, and no write tool without a writable root
|
||||
OK real pi with a git root exposes the reads, writes and the four git verbs, commits nothing at start, and never shows the token
|
||||
OK real pi with protocol vault adds reserve_id to the git verbs
|
||||
OK real pi with a setspark key exposes the reads and the eight record verbs, no counters, and never shows the key
|
||||
OK real pi refuses a git key on a read-only root (fail closed)
|
||||
OK real pi with the pilot flags (--no-tools) exposes no tool at all
|
||||
OK real pi exits non-zero without MOSAIC_DISCORD_TOOLS: no session, no tools (fail closed)
|
||||
OK a failing nested test fails the run under a parent runner's NODE_TEST_CONTEXT
|
||||
OK node --test packages/discord/tests/ (ℹ pass 183)
|
||||
OK scripts/discord.sh --help exits 0
|
||||
OK scripts/discord.sh check without a binding exits 4
|
||||
OK scripts/discord.sh recover without a binding exits 4
|
||||
OK scripts/discord.sh reload without a binding exits 4
|
||||
OK scripts/discord-service.sh without a command exits 4
|
||||
OK service unit renders with the repository path, a supervised run as the main process, exit 3 never retried, and reload as SIGHUP
|
||||
OK service install writes the rendered unit (0644) and leaves no temp file
|
||||
OK service install a second time reports unchanged
|
||||
OK systemd-analyze verify accepts the rendered unit
|
||||
OK service uninstall removes the unit file
|
||||
OK service install with an unknown flag exits 4
|
||||
OK service install with USER unset finishes and names the account for lingering
|
||||
OK pinned render runs copy CLI with copy cwd/repo and no checkout executable
|
||||
OK pinned install writes the rendered unit in a temporary unit directory
|
||||
OK pinned install refuses short prerequisite and writes no unit
|
||||
OK pinned install refuses missing prerequisite and writes no unit
|
||||
OK pinned install refuses cli prerequisite and writes no unit
|
||||
OK pinned install refuses pi prerequisite and writes no unit
|
||||
OK status names the copy from fake systemctl effective cwd
|
||||
OK checkout install explicitly recommends --copy
|
||||
OK wrapper check --offline passes local fixture and makes no network call
|
||||
OK wrapper run --offline refuses usage
|
||||
|
||||
discord suite: 78 passed, 0 failed
|
||||
@@ -0,0 +1,21 @@
|
||||
OK initial ordinary-file install
|
||||
OK installed tree matches canonical source
|
||||
OK installed tree has no symlinks
|
||||
OK check detects installation drift
|
||||
OK sync refuses to overwrite installation drift
|
||||
OK check detects an extra destination file
|
||||
OK check detects an extra destination directory
|
||||
OK check rejects a destination symlink
|
||||
OK sync accepts a canonical source update
|
||||
OK updated installation matches canonical source
|
||||
scripts/test-extension-package.sh: line 14: 1730300 Killed "$@" > /dev/null 2>&1
|
||||
OK forced interruption kills the replacing process
|
||||
OK next invocation recovers old consistent installation
|
||||
OK interrupted replacement rolled back
|
||||
OK sync succeeds after interruption recovery
|
||||
OK unlocked stale lock file does not block
|
||||
OK active lock refuses a concurrent sync
|
||||
OK source symlink fails closed
|
||||
OK nested second entrypoint fails closed
|
||||
|
||||
extension package selftest: 18 passed, 0 failed
|
||||
@@ -0,0 +1,53 @@
|
||||
toolchain: node v26.8.1, python 3.12.8, jsonschema 4.26.0
|
||||
|
||||
OK syntax: scripts/foundation-inspect.mjs
|
||||
OK syntax: scripts/foundation/strict-json.mjs
|
||||
OK syntax: scripts/foundation/canonical.mjs
|
||||
OK syntax: scripts/foundation/resolve.mjs
|
||||
OK syntax: scripts/foundation/validate-record.mjs
|
||||
OK syntax: scripts/foundation/fixtures/build-fixtures.mjs
|
||||
OK syntax: scripts/foundation/canonical.test.mjs
|
||||
OK syntax: scripts/foundation/cli.test.mjs
|
||||
OK syntax: scripts/foundation/fixtures.test.mjs
|
||||
OK syntax: scripts/foundation/resolve.test.mjs
|
||||
OK syntax: scripts/foundation/strict-json.test.mjs
|
||||
OK syntax: scripts/foundation/verify-schema.py (ast only; no bytecode written)
|
||||
OK fixture generator runs
|
||||
OK checked-in fixtures/bundles equal a fresh generation
|
||||
OK checked-in fixtures/raw equal a fresh generation
|
||||
OK checked-in fixtures/index.json equal a fresh generation
|
||||
OK checked-in demo bundles equal a fresh generation
|
||||
OK a failing nested test fails the run under a parent runner's NODE_TEST_CONTEXT
|
||||
OK node --test scripts/foundation/ (ℹ pass 80)
|
||||
OK differential schema oracle: PASS: differential schema oracle (finite corpus; compatibility evidence, not equivalence proof)
|
||||
platform witness: strftime('%Y') for year 999 -> '999' (pinned checker refuses years 0001..0999)
|
||||
node v26.8.1; corpus 1568 records (38 pinned fixtures, 478 unique bundle records, 1052 typeCase/mutation/lexical cases)
|
||||
schema column: agree-valid 540, agree-invalid 991, DISAGREEMENTS 0; strict-only (parser-bound) cases: 27; unsupported-kind records not schema-assessed by the inspector: 10
|
||||
profile column (schema-valid records only): profile-valid 510, profile-invalid 30
|
||||
profile refusals asserted: 30 schema-agreed-valid records refused only by the strict typed-string profile (rule profile-pattern-mismatch), 12 declared by name; 73 named probes verified against declared schema/profile columns
|
||||
OK oracle: zero schema-column disagreements with the pinned checker
|
||||
OK oracle: strict-only profile refusals are counted and asserted
|
||||
OK demo: permitted read preview exits 0 (exit 0)
|
||||
OK demo: permitted file.change preview exits 0 (exit 0)
|
||||
OK demo: assignment.change proposal is unresolved (exit 3) (exit 3)
|
||||
OK demo: revoked registration is refused (exit 3) (exit 3)
|
||||
OK demo: message is not authority (exit 3) (exit 3)
|
||||
OK usage: no arguments exits 2 (exit 2)
|
||||
OK io: missing file exits 4 (exit 4)
|
||||
OK io: directory exits 4 (exit 4)
|
||||
OK io: symlink exits 4 (O_NOFOLLOW) (exit 4)
|
||||
OK bound: oversize fixture exits 2 (exit 2)
|
||||
OK profile: one final LF in a typed selection id is refused before admission (exit 2) (exit 2)
|
||||
OK profile: two final LFs fail the schema pattern itself (exit 2) (exit 2)
|
||||
OK profile: escaped newlines in free-form text stay allowed (exit 0) (exit 0)
|
||||
OK profile refusal is invalid-request/profile-pattern-mismatch with selection and operation withheld, value not echoed
|
||||
OK text output starts with the disclaimer
|
||||
OK json output is valid JSON with result allowed and exactly the charter §7 fields
|
||||
OK json golden matches byte-for-byte
|
||||
OK sandboxed bundle run (env -i, PATH=/nonexistent) produced the unresolved proposal
|
||||
OK sandbox inventory (path/type/size/mode/uid/gid/inode/mtime/sha256) unchanged by runs
|
||||
OK canary never printed (bundle run and credential-file run)
|
||||
OK a non-bundle JSON file is refused at the shape gate, not read into output
|
||||
OK no field of the non-bundle file is echoed
|
||||
|
||||
selftest: 44 passed, 0 failed
|
||||
@@ -0,0 +1,86 @@
|
||||
OK args: exit 2, target-branch
|
||||
OK args: exit 2, target-branch
|
||||
OK args: exit 4
|
||||
OK args: exit 4
|
||||
OK args: exit 4
|
||||
OK --base next refuses before the config is read (got 2)
|
||||
OK a missing system config exits 3 (got 3)
|
||||
OK nobus: exit 3
|
||||
OK schema-table: exit 2, bus-schema
|
||||
OK schema-meta: exit 2, bus-schema
|
||||
OK openBus opens the database read-only
|
||||
OK other-business: exit 2, decision-not-found
|
||||
OK no-raise: exit 2, decision-not-found
|
||||
OK not-a-merge: exit 2, not-a-merge
|
||||
OK open: exit 2, not-resolved
|
||||
OK withdrawn: exit 2, not-resolved
|
||||
OK by-agent: exit 2, not-human
|
||||
OK via-webui: exit 2, not-human
|
||||
OK no-answer: exit 2, not-human
|
||||
OK answer-role: exit 2, not-human
|
||||
OK answer-run: exit 2, not-human
|
||||
OK answer-choice: exit 2, not-human
|
||||
OK two-answers: exit 2, not-human
|
||||
OK chose-no: exit 2, not-merge-option
|
||||
OK two-refs: exit 2, work-ref
|
||||
OK bad-ref: exit 2, work-ref
|
||||
OK task-ref-disagrees: exit 2, work-ref
|
||||
OK raise-task-disagrees: exit 2, work-ref
|
||||
OK target-main: exit 2, target-branch
|
||||
OK superseded-question: exit 2, superseded
|
||||
OK superseded-task: exit 2, superseded
|
||||
OK superseded-by: exit 2, superseded
|
||||
OK no-verdict: exit 2, no-verdict
|
||||
OK changes-later: exit 2, not-approved
|
||||
OK short-commit: exit 2, not-approved
|
||||
OK wrong-task-body: exit 2, not-approved
|
||||
OK args: exit 2, decision-not-found
|
||||
OK earlier-merge: exit 0
|
||||
OK ref-moved: exit 2, ref-moved
|
||||
OK root-top: exit 2, root-file
|
||||
OK root-newdir: exit 2, root-file
|
||||
OK root-src: exit 2, root-file
|
||||
OK unrelated: exit 2, base-conflict
|
||||
OK empty: exit 2, base-conflict
|
||||
OK an empty reviewed diff says so
|
||||
OK dirty-changed: exit 2, checkout-dirty
|
||||
OK dirty-staged: exit 2, checkout-dirty
|
||||
OK dirty-untracked: exit 2, checkout-dirty
|
||||
OK conflict: exit 2, base-conflict
|
||||
OK a refusal after the worktree is added leaves no worktree or scratch
|
||||
OK cleanup looks for the worktree's Docker network
|
||||
OK dirty-during: exit 2, checkout-dirty
|
||||
OK a reviewed path dirtied during the gate moves no ref
|
||||
OK drift: exit 2, patch-drift
|
||||
OK patch-drift leaves no worktree or scratch
|
||||
OK gate-pkg: exit 2, gate-failed
|
||||
OK gate-failed names the failing step's log, and it exists
|
||||
OK gate-failed leaves no worktree or scratch
|
||||
OK gate-script: exit 2, gate-failed
|
||||
OK a failing scripts/test-*.sh fails the gate
|
||||
OK a failed gate moves no ref
|
||||
OK nomods: exit 4
|
||||
OK a target without node_modules leaves no worktree or scratch
|
||||
OK moved: exit 2, base-moved
|
||||
OK base-moved keeps the base where it moved to
|
||||
OK dry: exit 0
|
||||
OK --dry-run writes no ref
|
||||
OK --dry-run prints the commit with --subject and --attribution
|
||||
OK --dry-run runs the gate
|
||||
OK --dry-run leaves no worktree or scratch
|
||||
OK land: exit 0
|
||||
OK the landing is one commit on the old base
|
||||
OK its diff is the reviewed diff by patch-id
|
||||
OK its tree is the dry run's
|
||||
OK the message has the option's subject, the citations and the attribution last
|
||||
OK it prints the line for the PM
|
||||
OK the checked-out base has the reviewed paths and keeps the unrelated edit
|
||||
OK only refs/heads/refactor exists in the target
|
||||
OK the work ref is unchanged
|
||||
OK the bus database is unchanged
|
||||
OK the gate ran each package suite but queue, and each scripts/test-*.sh
|
||||
OK the landing leaves no worktree or scratch
|
||||
OK the target's node_modules is still there, with its contents
|
||||
OK the worktree's Docker network is removed
|
||||
---
|
||||
land-work selftests: 84 passed, 0 failed
|
||||
@@ -0,0 +1,36 @@
|
||||
toolchain: node v26.8.1, git version 2.55.0
|
||||
|
||||
OK syntax: packages/queue/src/cli.mjs
|
||||
OK syntax: packages/queue/src/errors.mjs
|
||||
OK syntax: packages/queue/src/io.mjs
|
||||
OK syntax: packages/queue/src/lock.mjs
|
||||
OK syntax: packages/queue/src/queue.mjs
|
||||
OK syntax: packages/queue/src/review.mjs
|
||||
OK syntax: packages/queue/src/store.mjs
|
||||
OK syntax: packages/queue/tests/commit.test.mjs
|
||||
OK syntax: packages/queue/tests/data.test.mjs
|
||||
OK syntax: packages/queue/tests/dispatch.test.mjs
|
||||
OK syntax: packages/queue/tests/gate-owner.test.mjs
|
||||
OK syntax: packages/queue/tests/helpers.mjs
|
||||
OK syntax: packages/queue/tests/lock.test.mjs
|
||||
OK syntax: packages/queue/tests/migration.test.mjs
|
||||
OK syntax: packages/queue/tests/review.test.mjs
|
||||
OK syntax: packages/queue/tests/store.test.mjs
|
||||
OK syntax: packages/queue/tests/write.test.mjs
|
||||
OK syntax: packages/queue/tests/fixtures/fake-gitea.mjs
|
||||
OK syntax: packages/queue/tests/fixtures/kill-at.mjs
|
||||
OK syntax: packages/queue/tests/fixtures/lock-child.mjs
|
||||
OK syntax: packages/queue/tests/fixtures/mosaic-pre-a2.sh
|
||||
OK syntax: scripts/queue-commit.sh
|
||||
OK syntax: scripts/git-hooks/pre-commit
|
||||
OK syntax: scripts/mosaic
|
||||
OK queue-commit.sh, the guard and scripts/mosaic are executable
|
||||
OK packages/queue declares no dependencies
|
||||
ℹ tests 156
|
||||
ℹ pass 156
|
||||
ℹ fail 0
|
||||
OK node --test packages/queue/tests/
|
||||
OK scripts/mosaic queue help
|
||||
skip queue verify and render --check: this checkout (/home/jwoltje/dewey-scratch/r146/wt) is not the queue's canonical root (/mnt/storage/src/mosaic-stack)
|
||||
|
||||
queue suite: 28 passed, 0 failed
|
||||
@@ -0,0 +1,16 @@
|
||||
OK valid RELEASE resolves (exit 0)
|
||||
OK invalid RELEASE exits 1 (exit 1)
|
||||
OK missing RELEASE exits 1 (exit 1)
|
||||
OK valid RELEASE leaves image tag consistent with version
|
||||
OK status safe on empty state (exit 0)
|
||||
OK status created no pointer
|
||||
OK fault-injected activation refuses (exit 1)
|
||||
OK refused activation wrote no pointer
|
||||
OK refusal logged exactly once with valid fields
|
||||
OK healthy activation succeeds (exit 0)
|
||||
OK pointer written with valid fields
|
||||
OK repeat activation succeeds (log grows) (exit 0)
|
||||
OK log is append-only across activations
|
||||
OK rollback without previous refuses (exit 1)
|
||||
|
||||
selftest: 14 passed, 0 failed
|
||||
@@ -0,0 +1,101 @@
|
||||
OK valid task validates (exit 0)
|
||||
OK unknown task key exits 2 (exit 2)
|
||||
OK unsupported taskVersion exits 2 (exit 2)
|
||||
OK invalid task id exits 2 (exit 2)
|
||||
OK empty prompt exits 2 (exit 2)
|
||||
OK NUL in expectExact exits 2 (exit 2)
|
||||
OK out-of-range timeout exits 2 (exit 2)
|
||||
OK missing mission file exits 4 (exit 4)
|
||||
OK task with valid mission validates (exit 0)
|
||||
OK invalid mission exits 2 (exit 2)
|
||||
OK validate missing task exits 4 (exit 4)
|
||||
OK validation does not modify the task file
|
||||
OK prune dry-run exits 0 (exit 0)
|
||||
OK dry-run deleted nothing
|
||||
OK prune --keep=2 --yes removes oldest (exit 0)
|
||||
OK kept exactly 2 newest runs
|
||||
OK newest run kept, oldest pruned
|
||||
OK append-only receipt written (3 entries)
|
||||
OK sessions/workspaces untouched by prune
|
||||
OK prune with invalid keep exits 4 (exit 4)
|
||||
OK mock adapter: gate passes on matching mock response (exit 0)
|
||||
OK mock adapter: expect-mismatch recorded (exit 1)
|
||||
OK mismatch reason recorded
|
||||
OK unknown adapter fails closed (exit 1)
|
||||
OK mission task runs via mock adapter (exit 0)
|
||||
OK mission section injected into generated prompt
|
||||
OK retry of mission run succeeds (exit 0)
|
||||
OK retriedFrom lineage recorded
|
||||
OK mission section present after retry (relative path resolved)
|
||||
OK retry of missing run exits 4 (exit 4)
|
||||
OK skill install bundled ms-tools (exit 0)
|
||||
OK installed to skills-available
|
||||
OK double install refuses (exit 1)
|
||||
OK activate enables skill (exit 0)
|
||||
OK enabled dir populated
|
||||
OK uninstall while enabled refuses (exit 1)
|
||||
OK deactivate moves back to available (exit 0)
|
||||
OK uninstall removes from available (exit 0)
|
||||
OK seat with enabled skill launches
|
||||
OK skill path delivered to adapter
|
||||
OK shipped researcher contract resolves (ceiling + network)
|
||||
OK resolve-role refuses a non-role document (conductor policy) (exit 2)
|
||||
OK resolve-role refuses name/filename mismatch (exit 2)
|
||||
OK resolve-role refuses unknown network declaration (exit 2)
|
||||
OK resolve-role refuses duplicate role tool (exit 2)
|
||||
OK resolve-role refuses unsupported tool (exit 2)
|
||||
OK resolve-role refuses missing contract file (exit 4)
|
||||
OK version 1 role prints no contract line
|
||||
OK shipped version 2 roles resolve with their contracts (pm, cto, coder, reviewer)
|
||||
OK resolve-role accepts a minimal version 2 role (exit 0)
|
||||
OK resolve-role refuses an action outside the vocabulary (exit 2)
|
||||
OK resolve-role refuses a gated-only action in a role file (exit 2)
|
||||
OK resolve-role refuses a Vikunja verb no role may hold (exit 2)
|
||||
OK resolve-role refuses a version 2 role whose contract is missing (exit 2)
|
||||
OK resolve-role refuses a contract that is a symbolic link (exit 2)
|
||||
OK seat launches under role ceiling
|
||||
OK role ceiling narrows seat tools (read,write,bash -> read,bash)
|
||||
OK narrowing recorded loudly
|
||||
OK missing role contract refuses launch (exit 2)
|
||||
OK missing-contract refusal names the role
|
||||
OK empty ceiling intersection -> tool-free seat
|
||||
OK tool-free outcome recorded loudly
|
||||
OK overridden agents dir without seat definition refuses (exit 4)
|
||||
OK seat-resolution refusal names the seat
|
||||
OK policy: mission only -> mission tools
|
||||
OK policy: task only -> task tools
|
||||
OK policy: both -> intersection (task narrowed)
|
||||
OK policy: empty intersection -> tool-free
|
||||
OK invalid mission capabilities rejected (exit 2)
|
||||
mosaic-task: unsupported mission tool: "sudo" (supported: read, write, edit, bash, grep, find, ls)
|
||||
OK task run with user layer present (exit 0)
|
||||
OK user context dispatched into generated prompt
|
||||
OK workspace+tools task runs via mock (exit 0)
|
||||
OK workspace path + tools delivered to adapter
|
||||
OK persistent workspace created on host
|
||||
OK plain task still runs (no workspace/tools) (exit 0)
|
||||
OK workspace var present but empty when absent
|
||||
OK tools empty when absent
|
||||
OK unknown tool exits 2 (exit 2)
|
||||
OK workspace traversal exits 2 (exit 2)
|
||||
OK live hello task succeeds with exact marker
|
||||
OK result.json written in run dir
|
||||
OK result.json contents are correct
|
||||
OK wrong expectExact fails with exit 1 (reason: expect-mismatch)
|
||||
OK each run gets a distinct run dir (no clobber)
|
||||
OK list shows both runs
|
||||
OK fork base: teach succeeds (exit 0)
|
||||
OK fork child recalls ancestor context (exit 0)
|
||||
OK forked child recalled ancestor code word
|
||||
OK ancestor session untouched by fork
|
||||
OK child session dir has its own branch file
|
||||
OK onboard without name exits 4 (non-interactive) (exit 4)
|
||||
OK onboard --name renders profile (exit 0)
|
||||
OK profile written
|
||||
OK canon structure: required filled, optional placeholdered
|
||||
OK canon sections present
|
||||
OK user recall run succeeds
|
||||
OK recalled user name (response: Jason)
|
||||
OK no agent identity on headless run
|
||||
|
||||
selftest: 98 passed, 0 failed
|
||||
@@ -0,0 +1,21 @@
|
||||
2026-10-15T23:06:30Z
|
||||
B1-recipient KILLED | bus: a message to a running role sends no notice and its result is unchanged; no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance | cli: talk says when the role isn't running, whether launch.by was told, and how to start launch.by
|
||||
B2-to-human KILLED | bus: no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance
|
||||
B3-to-tester KILLED | bus: no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance
|
||||
B4-thread-instance KILLED | bus: no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance
|
||||
B5-to-launcher KILLED | bus: no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance | cli: talk says when the role isn't running, whether launch.by was told, and how to start launch.by
|
||||
B6-from-launcher KILLED | bus: no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance | harness: a RESULT gets no automatic reply; failed turns reply with the reason; a failed state read fails the turn: no adapter runs, the sender hears why, the message is read; a message read a day after it was sent shows the time it was sent; a task closed on the tracker is missing from the next turn's open list; end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes; launches revoked and then restored: the turn's block reads a
|
||||
B7-from-tester KILLED | bus: no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance | cli: talk --tester to a stopped role says nobody is told to launch it
|
||||
B8-no-launcher KILLED | bus: a business with no launch block tells nobody and says there is no launcher | cli: talk says when the role isn't running, whether launch.by was told, and how to start launch.by
|
||||
B9-notice-sent KILLED | bus: a message to a stopped role sends launch.by one notice, and the result says so; a re-route at a claim, a release and claim, and a broker restart send no second notice; a run launched but not yet claimed counts as no holder; the notice sender stays internal: no role is named _bus and no caller can send as it or to it | harness: the bus's launch notice is one turn with no reply, and is not taken again | cli: talk says when the role isn't running, whether launch.by was told, and how to start launch.by
|
||||
B10-class-result KILLED | bus: a message to a stopped role sends launch.by one notice, and the result says so | harness: the bus's launch notice is one turn with no reply, and is not taken again
|
||||
B11-launcher-running KILLED | bus: a message to a stopped role sends launch.by one notice, and the result says so; no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance | cli: talk says when the role isn't running, whether launch.by was told, and how to start launch.by
|
||||
B12-result-waiting KILLED | bus: a business with no launch block tells nobody and says there is no launcher; a message to a stopped role sends launch.by one notice, and the result says so; a run launched but not yet claimed counts as no holder; no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance | harness: the bus's launch notice is one turn with no reply, and is not taken again | cli: talk --tester to a stopped role says nobody is told to launch it; talk says when the role isn't running, whether launch.by was told, and how to start launch.by
|
||||
C1-printed KILLED | cli: talk --tester to a stopped role says nobody is told to launch it; talk says when the role isn't running, whether launch.by was told, and how to start launch.by
|
||||
C2-no-launch-by KILLED | cli: talk says when the role isn't running, whether launch.by was told, and how to start launch.by
|
||||
C3-launcher-down-self KILLED | cli: talk says when the role isn't running, whether launch.by was told, and how to start launch.by
|
||||
C4-tester-line KILLED | cli: talk --tester to a stopped role says nobody is told to launch it
|
||||
C5-launcher-down-either KILLED | cli: talk says when the role isn't running, whether launch.by was told, and how to start launch.by
|
||||
restored True
|
||||
rc=0
|
||||
2026-10-15T23:11:24Z
|
||||
@@ -0,0 +1,50 @@
|
||||
# Row 146 (#1640) mutants: one per new check. Each is applied to the worktree's source, the test
|
||||
# files that cover row 146 run per package, and the source is restored afterwards.
|
||||
import subprocess, os
|
||||
W = os.path.expanduser('~/dewey-scratch/r146/wt')
|
||||
OUT = os.path.expanduser('~/dewey-scratch/r146/mut')
|
||||
os.makedirs(OUT, exist_ok=True)
|
||||
BROKER = 'packages/bus/src/broker.mjs'
|
||||
CLI = 'packages/cli/src/cli.mjs'
|
||||
M = {
|
||||
'B1-recipient': (BROKER, " if (this.#recipient(s.business, to, thread)) return null;\n", ""),
|
||||
'B2-to-human': (BROKER, "if (to === 'human' || to === 'tester' ||", "if (to === 'tester' ||"),
|
||||
'B3-to-tester': (BROKER, "if (to === 'human' || to === 'tester' ||", "if (to === 'human' ||"),
|
||||
'B4-thread-instance': (BROKER, " || (thread && this.#threaded(s.business, to))) return null;", ") return null;"),
|
||||
'B5-to-launcher': (BROKER, "by !== null && to !== by && sender", "by !== null && sender"),
|
||||
'B6-from-launcher': (BROKER, " && sender !== by && sender !== 'tester';", " && sender !== 'tester';"),
|
||||
'B7-from-tester': (BROKER, " && sender !== 'tester';", ";"),
|
||||
'B8-no-launcher': (BROKER, "const told = by !== null && ", "const told = "),
|
||||
'B9-notice-sent': (BROKER, "if (told) this.#notice(", "if (false) this.#notice("),
|
||||
'B10-class-result': (BROKER, " 'RESULT',\n mid,\n", " 'INFO',\n mid,\n"),
|
||||
'B11-launcher-running': (BROKER, "launcherRunning: by === null ? null : this.#recipient(s.business, by, null) !== null", "launcherRunning: by === null ? null : false"),
|
||||
'B12-result-waiting': (BROKER, "return waiting ? { id: mid, request, waiting } : { id: mid, request };", "return { id: mid, request };"),
|
||||
'C1-printed': (CLI, " if (sent.waiting) io.stdout.write(", " if (false) io.stdout.write("),
|
||||
'C2-no-launch-by': (CLI, " if (w.launcher === null) return", " if (false) return"),
|
||||
'C3-launcher-down-self': (CLI, " if (w.role === w.launcher) return restart(w.role);\n", ""),
|
||||
'C4-tester-line': (CLI, " if (!w.told) return", " if (false) return"),
|
||||
'C5-launcher-down-either': (CLI, '(w.launcherRunning ? "" : restart(w.launcher, " either"))', '""'),
|
||||
}
|
||||
FILES = [
|
||||
('packages/bus', ['tests/launch-notice.test.mjs']),
|
||||
('packages/harness', ['tests/runner.test.mjs']),
|
||||
('packages/cli', ['tests/verbs.test.mjs', 'tests/tester.test.mjs']),
|
||||
]
|
||||
env = dict(os.environ, TMPDIR=os.path.expanduser('~/dewey-scratch/tmp'))
|
||||
origs = {f: open(os.path.join(W, f)).read() for f in (BROKER, CLI)}
|
||||
try:
|
||||
for name, (f, a, b) in M.items():
|
||||
assert origs[f].count(a) == 1, name
|
||||
open(os.path.join(W, f), 'w').write(origs[f].replace(a, b))
|
||||
killed, log = [], ''
|
||||
for pkg, tests in FILES:
|
||||
r = subprocess.run(['node', '--test', *tests], cwd=os.path.join(W, pkg), env=env, capture_output=True, text=True, timeout=300)
|
||||
log += f'== {pkg} rc={r.returncode}\n' + r.stdout + r.stderr
|
||||
fails = sorted({l[2:].split(' (')[0] for l in r.stdout.splitlines() if l.startswith('✖ ') and 'failing tests' not in l})
|
||||
if r.returncode != 0: killed.append(f'{pkg.split("/")[1]}: ' + '; '.join(fails))
|
||||
open(os.path.join(W, f), 'w').write(origs[f])
|
||||
open(os.path.join(OUT, f'{name}.log'), 'w').write(log)
|
||||
print(name, 'KILLED' if killed else 'SURVIVED', '|', ' | '.join(killed)[:600], flush=True)
|
||||
finally:
|
||||
for f, s in origs.items(): open(os.path.join(W, f), 'w').write(s)
|
||||
print('restored', all(open(os.path.join(W, f)).read() == s for f, s in origs.items()))
|
||||
@@ -0,0 +1,149 @@
|
||||
== packages/bus rc=1
|
||||
✔ a message to a stopped role sends launch.by one notice, and the result says so (87.937463ms)
|
||||
✖ a message to a running role sends no notice and its result is unchanged (57.253313ms)
|
||||
✔ a re-route at a claim, a release and claim, and a broker restart send no second notice (98.429033ms)
|
||||
✔ a run launched but not yet claimed counts as no holder (52.078447ms)
|
||||
✖ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (93.995646ms)
|
||||
✔ a business with no launch block tells nobody and says there is no launcher (44.336781ms)
|
||||
✔ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (149.681268ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 5
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 640.168
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/launch-notice.test.mjs:103:1
|
||||
✖ a message to a running role sends no notice and its result is unchanged (57.253313ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
'id',
|
||||
'request',
|
||||
+ 'waiting'
|
||||
]
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/bus/tests/launch-notice.test.mjs:108:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ 'id', 'request', 'waiting' ],
|
||||
expected: [ 'id', 'request' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at tests/launch-notice.test.mjs:138:1
|
||||
✖ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (93.995646ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ {
|
||||
+ launcher: 'chief',
|
||||
+ launcherRunning: true,
|
||||
+ role: 'coder',
|
||||
+ told: false
|
||||
+ }
|
||||
- undefined
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/bus/tests/launch-notice.test.mjs:164:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: { role: 'coder', launcher: 'chief', told: false, launcherRunning: true },
|
||||
expected: undefined,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
== packages/harness rc=0
|
||||
✔ founderCheck: founder variables, then a needed service without a usable token (0.914346ms)
|
||||
✔ turnRequest names the sender, class, reply and decision (0.147756ms)
|
||||
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.181053ms)
|
||||
✔ turnRequest shows the message's own sent time, a day old as well as new (0.115898ms)
|
||||
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.191227ms)
|
||||
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (271.038166ms)
|
||||
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (238.171192ms)
|
||||
✔ a task closed on the tracker is missing from the next turn's open list (216.487718ms)
|
||||
✔ a message read a day after it was sent shows the time it was sent (147.556683ms)
|
||||
✔ a decision the human resolves becomes a turn citing the decision and the answer (199.444092ms)
|
||||
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (116.938456ms)
|
||||
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (93.139706ms)
|
||||
✔ typed tools carry the runner's capability; launch goes to the host's launch socket (396.714156ms)
|
||||
✔ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (433.262086ms)
|
||||
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1327.358099ms)
|
||||
✔ the bus's launch notice is one turn with no reply, and is not taken again (312.351107ms)
|
||||
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (157.959335ms)
|
||||
✔ founder credentials stop before the claim (20) (181.870976ms)
|
||||
✔ a refused claim exits 21; an ended run's capability exits 22 (214.622824ms)
|
||||
✔ the launch ending under a running session exits 22 (147.316256ms)
|
||||
✔ a broker that stays unreachable exits 23 after brokerRetries polls (249.378707ms)
|
||||
✔ a broker that is down at the claim exits 23, not 21 (88.473176ms)
|
||||
✔ no capability, or a malformed one, on stdin exits 2 (190.80727ms)
|
||||
✔ a missing or malformed policy exits 2 before the claim (121.319733ms)
|
||||
ℹ tests 24
|
||||
ℹ suites 0
|
||||
ℹ pass 24
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 12012.008887
|
||||
== packages/cli rc=1
|
||||
✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (141.68363ms)
|
||||
✔ talk --tester refuses text without the [mos test] prefix before any call (77.05425ms)
|
||||
✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (82.162205ms)
|
||||
✔ decide, stop and launches take no --tester (44.141759ms)
|
||||
✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.336624ms)
|
||||
✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.47045ms)
|
||||
✔ talk --tester to a stopped role says nobody is told to launch it (49.103223ms)
|
||||
✔ talk sends a REQUEST, prints and reads everything that arrives, and stops at the reply (192.044768ms)
|
||||
✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1099.942843ms)
|
||||
✔ a late reply the Console has listed still reaches the next talk (2097.328344ms)
|
||||
✖ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (62.395911ms)
|
||||
✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (44.755141ms)
|
||||
✔ launches off and on go to the broker and change the business's launch state (53.426973ms)
|
||||
✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (44.653888ms)
|
||||
ℹ tests 14
|
||||
ℹ suites 0
|
||||
ℹ pass 13
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 3711.250155
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/verbs.test.mjs:85:1
|
||||
✖ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (62.395911ms)
|
||||
AssertionError [ERR_ASSERTION]: a running role gets the sent line only
|
||||
+ actual - expected
|
||||
|
||||
+ "coder isn't running, and the business names no launch.by\n"
|
||||
- ''
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/cli/tests/verbs.test.mjs:96:10)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: "coder isn't running, and the business names no launch.by\n",
|
||||
expected: '',
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,103 @@
|
||||
== packages/bus rc=1
|
||||
✖ a message to a stopped role sends launch.by one notice, and the result says so (48.963688ms)
|
||||
✔ a message to a running role sends no notice and its result is unchanged (55.354556ms)
|
||||
✔ a re-route at a claim, a release and claim, and a broker restart send no second notice (95.637075ms)
|
||||
✔ a run launched but not yet claimed counts as no holder (47.758799ms)
|
||||
✔ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (111.442339ms)
|
||||
✔ a business with no launch block tells nobody and says there is no launcher (43.008023ms)
|
||||
✔ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (148.132026ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 6
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 609.829226
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/launch-notice.test.mjs:68:1
|
||||
✖ a message to a stopped role sends launch.by one notice, and the result says so (48.963688ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
|
||||
'INFO' !== 'RESULT'
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/bus/tests/launch-notice.test.mjs:76:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.start (node:internal/test_runner/test:1262:17)
|
||||
at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: 'INFO',
|
||||
expected: 'RESULT',
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
== packages/harness rc=1
|
||||
✔ founderCheck: founder variables, then a needed service without a usable token (0.852496ms)
|
||||
✔ turnRequest names the sender, class, reply and decision (0.140984ms)
|
||||
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.169138ms)
|
||||
✔ turnRequest shows the message's own sent time, a day old as well as new (0.106028ms)
|
||||
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.200533ms)
|
||||
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (231.594548ms)
|
||||
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (214.480566ms)
|
||||
✔ a task closed on the tracker is missing from the next turn's open list (205.09303ms)
|
||||
✔ a message read a day after it was sent shows the time it was sent (177.302622ms)
|
||||
✔ a decision the human resolves becomes a turn citing the decision and the answer (205.327677ms)
|
||||
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (154.348389ms)
|
||||
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (101.337465ms)
|
||||
✔ typed tools carry the runner's capability; launch goes to the host's launch socket (397.563385ms)
|
||||
✔ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (439.442896ms)
|
||||
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1300.794926ms)
|
||||
✖ the bus's launch notice is one turn with no reply, and is not taken again (15127.556207ms)
|
||||
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (153.225122ms)
|
||||
✔ founder credentials stop before the claim (20) (176.49536ms)
|
||||
✔ a refused claim exits 21; an ended run's capability exits 22 (194.266265ms)
|
||||
✔ the launch ending under a running session exits 22 (145.14594ms)
|
||||
✔ a broker that stays unreachable exits 23 after brokerRetries polls (252.043493ms)
|
||||
✔ a broker that is down at the claim exits 23, not 21 (104.53598ms)
|
||||
✔ no capability, or a malformed one, on stdin exits 2 (184.611583ms)
|
||||
✔ a missing or malformed policy exits 2 before the claim (130.192101ms)
|
||||
ℹ tests 24
|
||||
ℹ suites 0
|
||||
ℹ pass 23
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 26801.088407
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/runner.test.mjs:441:1
|
||||
✖ the bus's launch notice is one turn with no reply, and is not taken again (15127.556207ms)
|
||||
Error: timed out waiting
|
||||
at until (file:///home/jwoltje/dewey-scratch/r146/wt/packages/harness/tests/runner.test.mjs:178:33)
|
||||
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/harness/tests/runner.test.mjs:451:3)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
== packages/cli rc=0
|
||||
✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (144.009585ms)
|
||||
✔ talk --tester refuses text without the [mos test] prefix before any call (77.080527ms)
|
||||
✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (93.469688ms)
|
||||
✔ decide, stop and launches take no --tester (46.711602ms)
|
||||
✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.325421ms)
|
||||
✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.479816ms)
|
||||
✔ talk --tester to a stopped role says nobody is told to launch it (54.868288ms)
|
||||
✔ talk sends a REQUEST, prints and reads everything that arrives, and stops at the reply (205.973556ms)
|
||||
✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1104.184674ms)
|
||||
✔ a late reply the Console has listed still reaches the next talk (2108.66906ms)
|
||||
✔ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (140.919283ms)
|
||||
✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (56.225782ms)
|
||||
✔ launches off and on go to the broker and change the business's launch state (81.595961ms)
|
||||
✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (50.500215ms)
|
||||
ℹ tests 14
|
||||
ℹ suites 0
|
||||
ℹ pass 14
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 3842.251818
|
||||
@@ -0,0 +1,150 @@
|
||||
== packages/bus rc=1
|
||||
✖ a message to a stopped role sends launch.by one notice, and the result says so (73.473197ms)
|
||||
✔ a message to a running role sends no notice and its result is unchanged (54.415642ms)
|
||||
✔ a re-route at a claim, a release and claim, and a broker restart send no second notice (93.375288ms)
|
||||
✔ a run launched but not yet claimed counts as no holder (43.639632ms)
|
||||
✖ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (55.734311ms)
|
||||
✔ a business with no launch block tells nobody and says there is no launcher (48.644211ms)
|
||||
✔ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (158.667494ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 5
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 585.72499
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/launch-notice.test.mjs:68:1
|
||||
✖ a message to a stopped role sends launch.by one notice, and the result says so (73.473197ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
{
|
||||
launcher: 'chief',
|
||||
+ launcherRunning: false,
|
||||
- launcherRunning: true,
|
||||
role: 'coder',
|
||||
told: true
|
||||
}
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/bus/tests/launch-notice.test.mjs:88:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.start (node:internal/test_runner/test:1262:17)
|
||||
at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: { role: 'coder', launcher: 'chief', told: true, launcherRunning: false },
|
||||
expected: { role: 'coder', launcher: 'chief', told: true, launcherRunning: true },
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at tests/launch-notice.test.mjs:138:1
|
||||
✖ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (55.734311ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
{
|
||||
launcher: 'chief',
|
||||
+ launcherRunning: false,
|
||||
- launcherRunning: true,
|
||||
role: 'pm',
|
||||
told: false
|
||||
}
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/bus/tests/launch-notice.test.mjs:150:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: { role: 'pm', launcher: 'chief', told: false, launcherRunning: false },
|
||||
expected: { role: 'pm', launcher: 'chief', told: false, launcherRunning: true },
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
== packages/harness rc=0
|
||||
✔ founderCheck: founder variables, then a needed service without a usable token (0.8481ms)
|
||||
✔ turnRequest names the sender, class, reply and decision (0.138301ms)
|
||||
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.155396ms)
|
||||
✔ turnRequest shows the message's own sent time, a day old as well as new (0.09815ms)
|
||||
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.161345ms)
|
||||
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (228.293605ms)
|
||||
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (244.340103ms)
|
||||
✔ a task closed on the tracker is missing from the next turn's open list (260.445593ms)
|
||||
✔ a message read a day after it was sent shows the time it was sent (162.540155ms)
|
||||
✔ a decision the human resolves becomes a turn citing the decision and the answer (216.877419ms)
|
||||
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (130.579533ms)
|
||||
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (98.777228ms)
|
||||
✔ typed tools carry the runner's capability; launch goes to the host's launch socket (381.526946ms)
|
||||
✔ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (430.90438ms)
|
||||
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1300.134713ms)
|
||||
✔ the bus's launch notice is one turn with no reply, and is not taken again (308.107503ms)
|
||||
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (151.841341ms)
|
||||
✔ founder credentials stop before the claim (20) (179.096318ms)
|
||||
✔ a refused claim exits 21; an ended run's capability exits 22 (212.454658ms)
|
||||
✔ the launch ending under a running session exits 22 (160.206975ms)
|
||||
✔ a broker that stays unreachable exits 23 after brokerRetries polls (260.96305ms)
|
||||
✔ a broker that is down at the claim exits 23, not 21 (90.939737ms)
|
||||
✔ no capability, or a malformed one, on stdin exits 2 (216.704754ms)
|
||||
✔ a missing or malformed policy exits 2 before the claim (142.266462ms)
|
||||
ℹ tests 24
|
||||
ℹ suites 0
|
||||
ℹ pass 24
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 12012.51652
|
||||
== packages/cli rc=1
|
||||
✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (124.390192ms)
|
||||
✔ talk --tester refuses text without the [mos test] prefix before any call (74.393779ms)
|
||||
✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (83.713955ms)
|
||||
✔ decide, stop and launches take no --tester (40.930073ms)
|
||||
✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.314553ms)
|
||||
✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.440598ms)
|
||||
✔ talk --tester to a stopped role says nobody is told to launch it (42.214865ms)
|
||||
✔ talk sends a REQUEST, prints and reads everything that arrives, and stops at the reply (183.716639ms)
|
||||
✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1089.178479ms)
|
||||
✔ a late reply the Console has listed still reaches the next talk (2820.583689ms)
|
||||
✖ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (141.807507ms)
|
||||
✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (49.273092ms)
|
||||
✔ launches off and on go to the broker and change the business's launch state (54.374902ms)
|
||||
✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (44.562204ms)
|
||||
ℹ tests 14
|
||||
ℹ suites 0
|
||||
ℹ pass 13
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 4477.695513
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/verbs.test.mjs:85:1
|
||||
✖ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (141.807507ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ "cto isn't running, pm has been told\n" +
|
||||
+ "pm isn't running either. systemctl --user restart mosaic-bus@demo starts it if the unit runs with --pm (scripts/bus-service.sh status demo shows pm: on). The restart stops running sessions.\n"
|
||||
- "cto isn't running, pm has been told\n"
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/cli/tests/verbs.test.mjs:103:10)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: "cto isn't running, pm has been told\npm isn't running either. systemctl --user restart mosaic-bus@demo starts it if the unit runs with --pm (scripts/bus-service.sh status demo shows pm: on). The restart stops running sessions.\n",
|
||||
expected: "cto isn't running, pm has been told\n",
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,214 @@
|
||||
== packages/bus rc=1
|
||||
✖ a message to a stopped role sends launch.by one notice, and the result says so (49.173239ms)
|
||||
✔ a message to a running role sends no notice and its result is unchanged (56.120802ms)
|
||||
✔ a re-route at a claim, a release and claim, and a broker restart send no second notice (95.436986ms)
|
||||
✖ a run launched but not yet claimed counts as no holder (50.366686ms)
|
||||
✖ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (48.654473ms)
|
||||
✖ a business with no launch block tells nobody and says there is no launcher (47.85114ms)
|
||||
✔ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (153.76022ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 3
|
||||
ℹ fail 4
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 560.882884
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/launch-notice.test.mjs:68:1
|
||||
✖ a message to a stopped role sends launch.by one notice, and the result says so (49.173239ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
+ undefined
|
||||
- {
|
||||
- launcher: 'chief',
|
||||
- launcherRunning: false,
|
||||
- role: 'pm',
|
||||
- told: true
|
||||
- }
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/bus/tests/launch-notice.test.mjs:71:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.start (node:internal/test_runner/test:1262:17)
|
||||
at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: { role: 'pm', launcher: 'chief', told: true, launcherRunning: false },
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at tests/launch-notice.test.mjs:131:1
|
||||
✖ a run launched but not yet claimed counts as no holder (50.366686ms)
|
||||
TypeError: Cannot read properties of undefined (reading 'told')
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/bus/tests/launch-notice.test.mjs:134:86)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
|
||||
test at tests/launch-notice.test.mjs:138:1
|
||||
✖ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (48.654473ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
+ undefined
|
||||
- {
|
||||
- launcher: 'chief',
|
||||
- launcherRunning: false,
|
||||
- role: 'chief',
|
||||
- told: false
|
||||
- }
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/bus/tests/launch-notice.test.mjs:141:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: { role: 'chief', launcher: 'chief', told: false, launcherRunning: false },
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at tests/launch-notice.test.mjs:176:1
|
||||
✖ a business with no launch block tells nobody and says there is no launcher (47.85114ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
+ undefined
|
||||
- {
|
||||
- launcher: null,
|
||||
- launcherRunning: null,
|
||||
- role: 'pm',
|
||||
- told: false
|
||||
- }
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/bus/tests/launch-notice.test.mjs:178:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: { role: 'pm', launcher: null, told: false, launcherRunning: null },
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
== packages/harness rc=1
|
||||
✔ founderCheck: founder variables, then a needed service without a usable token (0.83658ms)
|
||||
✔ turnRequest names the sender, class, reply and decision (0.128797ms)
|
||||
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.148822ms)
|
||||
✔ turnRequest shows the message's own sent time, a day old as well as new (0.097812ms)
|
||||
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.16061ms)
|
||||
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (264.234623ms)
|
||||
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (241.462286ms)
|
||||
✔ a task closed on the tracker is missing from the next turn's open list (221.642527ms)
|
||||
✔ a message read a day after it was sent shows the time it was sent (177.698126ms)
|
||||
✔ a decision the human resolves becomes a turn citing the decision and the answer (226.102997ms)
|
||||
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (122.086627ms)
|
||||
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (87.641752ms)
|
||||
✔ typed tools carry the runner's capability; launch goes to the host's launch socket (360.577414ms)
|
||||
✔ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (410.009639ms)
|
||||
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1276.795649ms)
|
||||
✖ the bus's launch notice is one turn with no reply, and is not taken again (111.676514ms)
|
||||
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (153.120246ms)
|
||||
✔ founder credentials stop before the claim (20) (185.657396ms)
|
||||
✔ a refused claim exits 21; an ended run's capability exits 22 (215.709734ms)
|
||||
✔ the launch ending under a running session exits 22 (155.753011ms)
|
||||
✔ a broker that stays unreachable exits 23 after brokerRetries polls (250.681527ms)
|
||||
✔ a broker that is down at the claim exits 23, not 21 (106.563244ms)
|
||||
✔ no capability, or a malformed one, on stdin exits 2 (188.638118ms)
|
||||
✔ a missing or malformed policy exits 2 before the claim (127.356463ms)
|
||||
ℹ tests 24
|
||||
ℹ suites 0
|
||||
ℹ pass 23
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 11753.958354
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/runner.test.mjs:441:1
|
||||
✖ the bus's launch notice is one turn with no reply, and is not taken again (111.676514ms)
|
||||
TypeError: Cannot read properties of undefined (reading 'told')
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/harness/tests/runner.test.mjs:448:29)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
== packages/cli rc=1
|
||||
✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (115.825223ms)
|
||||
✔ talk --tester refuses text without the [mos test] prefix before any call (71.726862ms)
|
||||
✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (85.319147ms)
|
||||
✔ decide, stop and launches take no --tester (43.970363ms)
|
||||
✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.309434ms)
|
||||
✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.419733ms)
|
||||
✖ talk --tester to a stopped role says nobody is told to launch it (47.782113ms)
|
||||
✔ talk sends a REQUEST, prints and reads everything that arrives, and stops at the reply (158.993422ms)
|
||||
✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1096.997167ms)
|
||||
✔ a late reply the Console has listed still reaches the next talk (2090.357922ms)
|
||||
✖ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (69.075696ms)
|
||||
✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (66.223929ms)
|
||||
✔ launches off and on go to the broker and change the business's launch state (75.993562ms)
|
||||
✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (46.274899ms)
|
||||
ℹ tests 14
|
||||
ℹ suites 0
|
||||
ℹ pass 12
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 3700.123775
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/tester.test.mjs:131:1
|
||||
✖ talk --tester to a stopped role says nobody is told to launch it (47.782113ms)
|
||||
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /^sent [0-9a-f-]{8} to cto\ncto isn't running; a tester's message tells nobody to launch it\n$/. Input:
|
||||
|
||||
'sent 1ac28e5b to cto\n'
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/cli/tests/tester.test.mjs:135:10)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: 'sent 1ac28e5b to cto\n',
|
||||
expected: /^sent [0-9a-f-]{8} to cto\ncto isn't running; a tester's message tells nobody to launch it\n$/,
|
||||
operator: 'match',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at tests/verbs.test.mjs:85:1
|
||||
✖ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (69.075696ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ ''
|
||||
- "cto isn't running, and the business names no launch.by\n"
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/cli/tests/verbs.test.mjs:95:10)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: '',
|
||||
expected: "cto isn't running, and the business names no launch.by\n",
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,102 @@
|
||||
== packages/bus rc=1
|
||||
✔ a message to a stopped role sends launch.by one notice, and the result says so (84.519436ms)
|
||||
✔ a message to a running role sends no notice and its result is unchanged (53.375802ms)
|
||||
✔ a re-route at a claim, a release and claim, and a broker restart send no second notice (95.47882ms)
|
||||
✔ a run launched but not yet claimed counts as no holder (49.656332ms)
|
||||
✖ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (83.08079ms)
|
||||
✔ a business with no launch block tells nobody and says there is no launcher (42.542849ms)
|
||||
✔ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (148.92667ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 6
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 614.549324
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/launch-notice.test.mjs:138:1
|
||||
✖ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (83.08079ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ {
|
||||
+ launcher: 'chief',
|
||||
+ launcherRunning: true,
|
||||
+ role: 'human',
|
||||
+ told: true
|
||||
+ }
|
||||
- undefined
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/bus/tests/launch-notice.test.mjs:162:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: { role: 'human', launcher: 'chief', told: true, launcherRunning: true },
|
||||
expected: undefined,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
== packages/harness rc=0
|
||||
✔ founderCheck: founder variables, then a needed service without a usable token (0.862941ms)
|
||||
✔ turnRequest names the sender, class, reply and decision (0.136384ms)
|
||||
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.161296ms)
|
||||
✔ turnRequest shows the message's own sent time, a day old as well as new (0.107547ms)
|
||||
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.163125ms)
|
||||
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (258.17981ms)
|
||||
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (237.625311ms)
|
||||
✔ a task closed on the tracker is missing from the next turn's open list (215.294435ms)
|
||||
✔ a message read a day after it was sent shows the time it was sent (147.36004ms)
|
||||
✔ a decision the human resolves becomes a turn citing the decision and the answer (210.418994ms)
|
||||
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (162.635201ms)
|
||||
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (96.781029ms)
|
||||
✔ typed tools carry the runner's capability; launch goes to the host's launch socket (398.539191ms)
|
||||
✔ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (416.215358ms)
|
||||
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1310.057017ms)
|
||||
✔ the bus's launch notice is one turn with no reply, and is not taken again (259.003168ms)
|
||||
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (156.383446ms)
|
||||
✔ founder credentials stop before the claim (20) (170.539891ms)
|
||||
✔ a refused claim exits 21; an ended run's capability exits 22 (215.280567ms)
|
||||
✔ the launch ending under a running session exits 22 (152.510371ms)
|
||||
✔ a broker that stays unreachable exits 23 after brokerRetries polls (252.342072ms)
|
||||
✔ a broker that is down at the claim exits 23, not 21 (99.332916ms)
|
||||
✔ no capability, or a malformed one, on stdin exits 2 (205.422786ms)
|
||||
✔ a missing or malformed policy exits 2 before the claim (146.006605ms)
|
||||
ℹ tests 24
|
||||
ℹ suites 0
|
||||
ℹ pass 24
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 11968.771414
|
||||
== packages/cli rc=0
|
||||
✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (119.100433ms)
|
||||
✔ talk --tester refuses text without the [mos test] prefix before any call (62.30026ms)
|
||||
✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (90.720631ms)
|
||||
✔ decide, stop and launches take no --tester (45.805617ms)
|
||||
✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.336289ms)
|
||||
✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.496574ms)
|
||||
✔ talk --tester to a stopped role says nobody is told to launch it (50.412274ms)
|
||||
✔ talk sends a REQUEST, prints and reads everything that arrives, and stops at the reply (186.477225ms)
|
||||
✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1089.95133ms)
|
||||
✔ a late reply the Console has listed still reaches the next talk (2100.890696ms)
|
||||
✔ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (139.095791ms)
|
||||
✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (51.220277ms)
|
||||
✔ launches off and on go to the broker and change the business's launch state (58.823872ms)
|
||||
✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (45.301294ms)
|
||||
ℹ tests 14
|
||||
ℹ suites 0
|
||||
ℹ pass 14
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 3773.800502
|
||||
@@ -0,0 +1,102 @@
|
||||
== packages/bus rc=1
|
||||
✔ a message to a stopped role sends launch.by one notice, and the result says so (88.739343ms)
|
||||
✔ a message to a running role sends no notice and its result is unchanged (72.598291ms)
|
||||
✔ a re-route at a claim, a release and claim, and a broker restart send no second notice (92.200482ms)
|
||||
✔ a run launched but not yet claimed counts as no holder (48.443009ms)
|
||||
✖ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (96.39105ms)
|
||||
✔ a business with no launch block tells nobody and says there is no launcher (51.520817ms)
|
||||
✔ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (153.925585ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 6
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 665.254906
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/launch-notice.test.mjs:138:1
|
||||
✖ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (96.39105ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ {
|
||||
+ launcher: 'chief',
|
||||
+ launcherRunning: true,
|
||||
+ role: 'tester',
|
||||
+ told: true
|
||||
+ }
|
||||
- undefined
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/bus/tests/launch-notice.test.mjs:165:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: { role: 'tester', launcher: 'chief', told: true, launcherRunning: true },
|
||||
expected: undefined,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
== packages/harness rc=0
|
||||
✔ founderCheck: founder variables, then a needed service without a usable token (0.889729ms)
|
||||
✔ turnRequest names the sender, class, reply and decision (0.148579ms)
|
||||
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.168761ms)
|
||||
✔ turnRequest shows the message's own sent time, a day old as well as new (0.105123ms)
|
||||
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.173494ms)
|
||||
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (262.528601ms)
|
||||
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (236.989957ms)
|
||||
✔ a task closed on the tracker is missing from the next turn's open list (214.188553ms)
|
||||
✔ a message read a day after it was sent shows the time it was sent (146.432615ms)
|
||||
✔ a decision the human resolves becomes a turn citing the decision and the answer (199.864057ms)
|
||||
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (124.555827ms)
|
||||
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (96.136497ms)
|
||||
✔ typed tools carry the runner's capability; launch goes to the host's launch socket (396.35578ms)
|
||||
✔ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (387.525123ms)
|
||||
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1275.81729ms)
|
||||
✔ the bus's launch notice is one turn with no reply, and is not taken again (297.787337ms)
|
||||
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (142.746434ms)
|
||||
✔ founder credentials stop before the claim (20) (168.448146ms)
|
||||
✔ a refused claim exits 21; an ended run's capability exits 22 (196.912478ms)
|
||||
✔ the launch ending under a running session exits 22 (155.966165ms)
|
||||
✔ a broker that stays unreachable exits 23 after brokerRetries polls (258.263481ms)
|
||||
✔ a broker that is down at the claim exits 23, not 21 (231.370086ms)
|
||||
✔ no capability, or a malformed one, on stdin exits 2 (233.531548ms)
|
||||
✔ a missing or malformed policy exits 2 before the claim (155.745736ms)
|
||||
ℹ tests 24
|
||||
ℹ suites 0
|
||||
ℹ pass 24
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 11879.62386
|
||||
== packages/cli rc=0
|
||||
✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (123.204066ms)
|
||||
✔ talk --tester refuses text without the [mos test] prefix before any call (65.853296ms)
|
||||
✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (78.458909ms)
|
||||
✔ decide, stop and launches take no --tester (48.663078ms)
|
||||
✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.328996ms)
|
||||
✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.494256ms)
|
||||
✔ talk --tester to a stopped role says nobody is told to launch it (49.634225ms)
|
||||
✔ talk sends a REQUEST, prints and reads everything that arrives, and stops at the reply (187.931027ms)
|
||||
✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1081.867942ms)
|
||||
✔ a late reply the Console has listed still reaches the next talk (2098.281141ms)
|
||||
✔ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (144.02509ms)
|
||||
✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (48.08665ms)
|
||||
✔ launches off and on go to the broker and change the business's launch state (56.282943ms)
|
||||
✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (46.307088ms)
|
||||
ℹ tests 14
|
||||
ℹ suites 0
|
||||
ℹ pass 14
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 3761.093678
|
||||
@@ -0,0 +1,102 @@
|
||||
== packages/bus rc=1
|
||||
✔ a message to a stopped role sends launch.by one notice, and the result says so (85.478315ms)
|
||||
✔ a message to a running role sends no notice and its result is unchanged (53.923594ms)
|
||||
✔ a re-route at a claim, a release and claim, and a broker restart send no second notice (96.942161ms)
|
||||
✔ a run launched but not yet claimed counts as no holder (50.698667ms)
|
||||
✖ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (119.249188ms)
|
||||
✔ a business with no launch block tells nobody and says there is no launcher (43.997078ms)
|
||||
✔ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (152.561875ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 6
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 668.397625
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/launch-notice.test.mjs:138:1
|
||||
✖ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (119.249188ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ {
|
||||
+ launcher: 'chief',
|
||||
+ launcherRunning: true,
|
||||
+ role: 'assistant',
|
||||
+ told: false
|
||||
+ }
|
||||
- undefined
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/bus/tests/launch-notice.test.mjs:171:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: { role: 'assistant', launcher: 'chief', told: false, launcherRunning: true },
|
||||
expected: undefined,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
== packages/harness rc=0
|
||||
✔ founderCheck: founder variables, then a needed service without a usable token (1.004861ms)
|
||||
✔ turnRequest names the sender, class, reply and decision (0.168334ms)
|
||||
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.192874ms)
|
||||
✔ turnRequest shows the message's own sent time, a day old as well as new (0.121176ms)
|
||||
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.2081ms)
|
||||
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (242.730086ms)
|
||||
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (241.773892ms)
|
||||
✔ a task closed on the tracker is missing from the next turn's open list (217.117558ms)
|
||||
✔ a message read a day after it was sent shows the time it was sent (170.278252ms)
|
||||
✔ a decision the human resolves becomes a turn citing the decision and the answer (204.155116ms)
|
||||
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (124.234904ms)
|
||||
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (96.918204ms)
|
||||
✔ typed tools carry the runner's capability; launch goes to the host's launch socket (374.558462ms)
|
||||
✔ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (425.888152ms)
|
||||
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1289.035203ms)
|
||||
✔ the bus's launch notice is one turn with no reply, and is not taken again (265.503308ms)
|
||||
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (157.249132ms)
|
||||
✔ founder credentials stop before the claim (20) (177.402008ms)
|
||||
✔ a refused claim exits 21; an ended run's capability exits 22 (197.939016ms)
|
||||
✔ the launch ending under a running session exits 22 (145.082933ms)
|
||||
✔ a broker that stays unreachable exits 23 after brokerRetries polls (242.377704ms)
|
||||
✔ a broker that is down at the claim exits 23, not 21 (83.62478ms)
|
||||
✔ no capability, or a malformed one, on stdin exits 2 (194.319575ms)
|
||||
✔ a missing or malformed policy exits 2 before the claim (117.361844ms)
|
||||
ℹ tests 24
|
||||
ℹ suites 0
|
||||
ℹ pass 24
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 11910.200536
|
||||
== packages/cli rc=0
|
||||
✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (118.082492ms)
|
||||
✔ talk --tester refuses text without the [mos test] prefix before any call (74.691296ms)
|
||||
✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (90.362525ms)
|
||||
✔ decide, stop and launches take no --tester (46.239353ms)
|
||||
✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.34521ms)
|
||||
✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.494311ms)
|
||||
✔ talk --tester to a stopped role says nobody is told to launch it (50.661193ms)
|
||||
✔ talk sends a REQUEST, prints and reads everything that arrives, and stops at the reply (173.570849ms)
|
||||
✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1103.411325ms)
|
||||
✔ a late reply the Console has listed still reaches the next talk (2100.941226ms)
|
||||
✔ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (141.381914ms)
|
||||
✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (51.319825ms)
|
||||
✔ launches off and on go to the broker and change the business's launch state (55.041952ms)
|
||||
✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (50.279213ms)
|
||||
ℹ tests 14
|
||||
ℹ suites 0
|
||||
ℹ pass 14
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 3782.72333
|
||||
@@ -0,0 +1,121 @@
|
||||
== packages/bus rc=1
|
||||
✔ a message to a stopped role sends launch.by one notice, and the result says so (97.52255ms)
|
||||
✔ a message to a running role sends no notice and its result is unchanged (59.597823ms)
|
||||
✔ a re-route at a claim, a release and claim, and a broker restart send no second notice (98.449019ms)
|
||||
✔ a run launched but not yet claimed counts as no holder (48.436599ms)
|
||||
✖ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (53.309081ms)
|
||||
✔ a business with no launch block tells nobody and says there is no launcher (49.917106ms)
|
||||
✔ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (153.245284ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 6
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 625.842797
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/launch-notice.test.mjs:138:1
|
||||
✖ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (53.309081ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
{
|
||||
launcher: 'chief',
|
||||
launcherRunning: false,
|
||||
role: 'chief',
|
||||
+ told: true
|
||||
- told: false
|
||||
}
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/bus/tests/launch-notice.test.mjs:141:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: { role: 'chief', launcher: 'chief', told: true, launcherRunning: false },
|
||||
expected: { role: 'chief', launcher: 'chief', told: false, launcherRunning: false },
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
== packages/harness rc=0
|
||||
✔ founderCheck: founder variables, then a needed service without a usable token (1.13865ms)
|
||||
✔ turnRequest names the sender, class, reply and decision (0.177453ms)
|
||||
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.230812ms)
|
||||
✔ turnRequest shows the message's own sent time, a day old as well as new (0.186296ms)
|
||||
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.219405ms)
|
||||
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (221.228065ms)
|
||||
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (266.773693ms)
|
||||
✔ a task closed on the tracker is missing from the next turn's open list (281.235792ms)
|
||||
✔ a message read a day after it was sent shows the time it was sent (178.876003ms)
|
||||
✔ a decision the human resolves becomes a turn citing the decision and the answer (211.470141ms)
|
||||
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (147.87593ms)
|
||||
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (109.243572ms)
|
||||
✔ typed tools carry the runner's capability; launch goes to the host's launch socket (429.459088ms)
|
||||
✔ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (417.098972ms)
|
||||
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1275.514619ms)
|
||||
✔ the bus's launch notice is one turn with no reply, and is not taken again (275.252546ms)
|
||||
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (148.862979ms)
|
||||
✔ founder credentials stop before the claim (20) (178.179423ms)
|
||||
✔ a refused claim exits 21; an ended run's capability exits 22 (199.71327ms)
|
||||
✔ the launch ending under a running session exits 22 (148.911648ms)
|
||||
✔ a broker that stays unreachable exits 23 after brokerRetries polls (250.417973ms)
|
||||
✔ a broker that is down at the claim exits 23, not 21 (86.157459ms)
|
||||
✔ no capability, or a malformed one, on stdin exits 2 (195.731834ms)
|
||||
✔ a missing or malformed policy exits 2 before the claim (126.23864ms)
|
||||
ℹ tests 24
|
||||
ℹ suites 0
|
||||
ℹ pass 24
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 12074.148754
|
||||
== packages/cli rc=1
|
||||
✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (107.288699ms)
|
||||
✔ talk --tester refuses text without the [mos test] prefix before any call (68.361698ms)
|
||||
✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (83.689903ms)
|
||||
✔ decide, stop and launches take no --tester (48.121255ms)
|
||||
✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.335618ms)
|
||||
✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.455641ms)
|
||||
✔ talk --tester to a stopped role says nobody is told to launch it (48.341116ms)
|
||||
✔ talk sends a REQUEST, prints and reads everything that arrives, and stops at the reply (166.345476ms)
|
||||
✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1097.173377ms)
|
||||
✔ a late reply the Console has listed still reaches the next talk (2123.537764ms)
|
||||
✖ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (121.122253ms)
|
||||
✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (45.520559ms)
|
||||
✔ launches off and on go to the broker and change the business's launch state (53.898331ms)
|
||||
✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (44.325056ms)
|
||||
ℹ tests 14
|
||||
ℹ suites 0
|
||||
ℹ pass 13
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 3750.375245
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/verbs.test.mjs:85:1
|
||||
✖ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (121.122253ms)
|
||||
AssertionError [ERR_ASSERTION]: a message to launch.by tells nobody
|
||||
|
||||
2 !== 1
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/cli/tests/verbs.test.mjs:101:10)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: 2,
|
||||
expected: 1,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,256 @@
|
||||
== packages/bus rc=1
|
||||
✔ a message to a stopped role sends launch.by one notice, and the result says so (85.63045ms)
|
||||
✔ a message to a running role sends no notice and its result is unchanged (54.453327ms)
|
||||
✔ a re-route at a claim, a release and claim, and a broker restart send no second notice (93.914476ms)
|
||||
✔ a run launched but not yet claimed counts as no holder (49.834638ms)
|
||||
✖ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (64.725087ms)
|
||||
✔ a business with no launch block tells nobody and says there is no launcher (43.047102ms)
|
||||
✔ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (148.175734ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 6
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 595.600034
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/launch-notice.test.mjs:138:1
|
||||
✖ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (64.725087ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
{
|
||||
launcher: 'chief',
|
||||
launcherRunning: true,
|
||||
role: 'pm',
|
||||
+ told: true
|
||||
- told: false
|
||||
}
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/bus/tests/launch-notice.test.mjs:150:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: { role: 'pm', launcher: 'chief', told: true, launcherRunning: true },
|
||||
expected: { role: 'pm', launcher: 'chief', told: false, launcherRunning: true },
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
== packages/harness rc=1
|
||||
✔ founderCheck: founder variables, then a needed service without a usable token (0.880791ms)
|
||||
✔ turnRequest names the sender, class, reply and decision (0.141685ms)
|
||||
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.186088ms)
|
||||
✔ turnRequest shows the message's own sent time, a day old as well as new (0.111061ms)
|
||||
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.170715ms)
|
||||
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (245.288835ms)
|
||||
✖ launches revoked and then restored: the turn's block reads allowed and gives the restore time (68.731789ms)
|
||||
✖ a task closed on the tracker is missing from the next turn's open list (68.68343ms)
|
||||
✖ a message read a day after it was sent shows the time it was sent (65.059615ms)
|
||||
✔ a decision the human resolves becomes a turn citing the decision and the answer (196.680094ms)
|
||||
✖ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (66.943966ms)
|
||||
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (85.049067ms)
|
||||
✖ typed tools carry the runner's capability; launch goes to the host's launch socket (153.519053ms)
|
||||
✖ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (106.686277ms)
|
||||
✖ a RESULT gets no automatic reply; failed turns reply with the reason (86.841794ms)
|
||||
✔ the bus's launch notice is one turn with no reply, and is not taken again (252.448635ms)
|
||||
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (152.176536ms)
|
||||
✔ founder credentials stop before the claim (20) (179.038874ms)
|
||||
✔ a refused claim exits 21; an ended run's capability exits 22 (201.556149ms)
|
||||
✔ the launch ending under a running session exits 22 (144.928786ms)
|
||||
✔ a broker that stays unreachable exits 23 after brokerRetries polls (249.078023ms)
|
||||
✔ a broker that is down at the claim exits 23, not 21 (95.278185ms)
|
||||
✔ no capability, or a malformed one, on stdin exits 2 (191.568442ms)
|
||||
✔ a missing or malformed policy exits 2 before the claim (127.864717ms)
|
||||
ℹ tests 24
|
||||
ℹ suites 0
|
||||
ℹ pass 17
|
||||
ℹ fail 7
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 9636.47147
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/runner.test.mjs:232:1
|
||||
✖ launches revoked and then restored: the turn's block reads allowed and gives the restore time (68.731789ms)
|
||||
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /\nLaunches: revoked since \S+ \(event \S+\)\.\n/. Input:
|
||||
|
||||
"Message 90927b50-b50b-4389-8aa8-009783ddc6d5 from pm to coder waits: coder has no running session. Launch coder within the launch block's limits, or tell pm why not with message.send in_reply_to 90927b50-b50b-4389-8aa8-009783ddc6d5."
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/harness/tests/runner.test.mjs:238:10)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: "Message 90927b50-b50b-4389-8aa8-009783ddc6d5 from pm to coder waits: coder has no running session. Launch coder within the launch block's limits, or tell pm why not with message.send in_reply_to 90927b50-b50b-4389-8aa8-009783ddc6d5.",
|
||||
expected: /\nLaunches: revoked since \S+ \(event \S+\)\.\n/,
|
||||
operator: 'match',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at tests/runner.test.mjs:244:1
|
||||
✖ a task closed on the tracker is missing from the next turn's open list (68.68343ms)
|
||||
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /\nOpen tasks: 2\.\n- vikunja:3\/1 Task 1\n- vikunja:3\/2 Task 2\n/. Input:
|
||||
|
||||
"Message 9a80e277-fcd4-4c42-8376-2af2c0b3235d from pm to coder waits: coder has no running session. Launch coder within the launch block's limits, or tell pm why not with message.send in_reply_to 9a80e277-fcd4-4c42-8376-2af2c0b3235d."
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/harness/tests/runner.test.mjs:251:10)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: "Message 9a80e277-fcd4-4c42-8376-2af2c0b3235d from pm to coder waits: coder has no running session. Launch coder within the launch block's limits, or tell pm why not with message.send in_reply_to 9a80e277-fcd4-4c42-8376-2af2c0b3235d.",
|
||||
expected: /\nOpen tasks: 2\.\n- vikunja:3\/1 Task 1\n- vikunja:3\/2 Task 2\n/,
|
||||
operator: 'match',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at tests/runner.test.mjs:258:1
|
||||
✖ a message read a day after it was sent shows the time it was sent (65.059615ms)
|
||||
AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value:
|
||||
|
||||
assert.ok(reply.body.includes(`Message ${sent.id} from pm, sent ${sentAt}, class REQUEST:`))
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/harness/tests/runner.test.mjs:270:10)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: false,
|
||||
expected: true,
|
||||
operator: '==',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at tests/runner.test.mjs:310:1
|
||||
✖ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (66.943966ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ "Message c309f748-fd69-44f7-88e7-469f47ec8c9e from pm to coder waits: coder has no running session. Launch coder within the launch block's limits, or tell pm why not with message.send in_reply_to c309f748-fd69-44f7-88e7-469f47ec8c9e."
|
||||
- 'The turn failed: could not read the current state: state-unavailable'
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/harness/tests/runner.test.mjs:324:10)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: "Message c309f748-fd69-44f7-88e7-469f47ec8c9e from pm to coder waits: coder has no running session. Launch coder within the launch block's limits, or tell pm why not with message.send in_reply_to c309f748-fd69-44f7-88e7-469f47ec8c9e.",
|
||||
expected: 'The turn failed: could not read the current state: state-unavailable',
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at tests/runner.test.mjs:354:1
|
||||
✖ typed tools carry the runner's capability; launch goes to the host's launch socket (153.519053ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
|
||||
'RESULT' !== 'INFO'
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/harness/tests/runner.test.mjs:362:10)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: 'RESULT',
|
||||
expected: 'INFO',
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at tests/runner.test.mjs:378:1
|
||||
✖ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (106.686277ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
+ "Message f6d061e5-e534-47ea-8903-11405facb448 from pm to chief waits: chief has no running session. Launch chief within the launch block's limits, or tell pm why not with message.send in_reply_to f6d061e5-e534-47ea-8903-11405facb448.",
|
||||
+ "Message 4285c204-8a96-4058-abef-8ddffcc683d4 from pm to chief waits: chief has no running session. Launch chief within the launch block's limits, or tell pm why not with message.send in_reply_to 4285c204-8a96-4058-abef-8ddffcc683d4.",
|
||||
+ "Message c0a6ac44-a3d1-44e9-b2f7-b0c60c64135d from pm to chief waits: chief has no running session. Launch chief within the launch block's limits, or tell pm why not with message.send in_reply_to c0a6ac44-a3d1-44e9-b2f7-b0c60c64135d.",
|
||||
+ "Message 152ebb6c-3d66-479f-bf0c-b209450fd40a from pm to chief waits: chief has no running session. Launch chief within the launch block's limits, or tell pm why not with message.send in_reply_to 152ebb6c-3d66-479f-bf0c-b209450fd40a.",
|
||||
+ "Message ab79ce64-6387-4c92-a421-2ec093902bcd from pm to chief waits: chief has no running session. Launch chief within the launch block's limits, or tell pm why not with message.send in_reply_to ab79ce64-6387-4c92-a421-2ec093902bcd.",
|
||||
+ "Message 97f68234-5dce-4dda-a7ca-b2a5defd2599 from pm to chief waits: chief has no running session. Launch chief within the launch block's limits, or tell pm why not with message.send in_reply_to 97f68234-5dce-4dda-a7ca-b2a5defd2599."
|
||||
- '{"revoked":true}',
|
||||
- 'refused: role-end-refused',
|
||||
- 'refused: role-end-refused',
|
||||
- '{"revision":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"}',
|
||||
- 'refused: invalid-request',
|
||||
- 'refused: revision-conflict'
|
||||
]
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/harness/tests/runner.test.mjs:401:10)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ "Message f6d061e5-e534-47ea-8903-11405facb448 from pm to chief waits: chief has no running session. Launch chief within the launch block's limits, or tell pm why not with message.send in_reply_to f6d061e5-e534-47ea-8903-11405facb448.", "Message 4285c204-8a96-4058-abef-8ddffcc683d4 from pm to chief waits: chief has no running session. Launch chief within the launch block's limits, or tell pm why not with message.send in_reply_to 4285c204-8a96-4058-abef-8ddffcc683d4.", "Message c0a6ac44-a3d1-44e9-b2f7-b0c60c64135d from pm to chief waits: chief has no running session. Launch chief within the launch block's limits, or tell pm why not with message.send in_reply_to c0a6ac44-a3d1-44e9-b2f7-b0c60c64135d.", "Message 152ebb6c-3d66-479f-bf0c-b209450fd40a from pm to chief waits: chief has no running session. Launch chief within the launch block's limits, or tell pm why not with message.send in_reply_to 152ebb6c-3d66-479f-bf0c-b209450fd40a.", "Message ab79ce64-6387-4c92-a421-2ec093902bcd from pm to chief waits: chief has no running session. Launch chief within the launch block's limits, or tell pm why not with message.send in_reply_to ab79ce64-6387-4c92-a421-2ec093902bcd.", "Message 97f68234-5dce-4dda-a7ca-b2a5defd2599 from pm to chief waits: chief has no running session. Launch chief within the launch block's limits, or tell pm why not with message.send in_reply_to 97f68234-5dce-4dda-a7ca-b2a5defd2599." ],
|
||||
expected: [ '{"revoked":true}', 'refused: role-end-refused', 'refused: role-end-refused', '{"revision":"bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb"}', 'refused: invalid-request', 'refused: revision-conflict' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at tests/runner.test.mjs:417:1
|
||||
✖ a RESULT gets no automatic reply; failed turns reply with the reason (86.841794ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
+ "Message 13a34491-26fd-45c7-977f-878917371b3a from pm to coder waits: coder has no running session. Launch coder within the launch block's limits, or tell pm why not with message.send in_reply_to 13a34491-26fd-45c7-977f-878917371b3a.",
|
||||
+ "Message 57b6f92e-9214-464d-825f-68953e54e775 from pm to coder waits: coder has no running session. Launch coder within the launch block's limits, or tell pm why not with message.send in_reply_to 57b6f92e-9214-464d-825f-68953e54e775.",
|
||||
+ "Message 6cfa6aad-4699-4a60-8abf-6fcc6975023f from pm to coder waits: coder has no running session. Launch coder within the launch block's limits, or tell pm why not with message.send in_reply_to 6cfa6aad-4699-4a60-8abf-6fcc6975023f.",
|
||||
+ "Message 17083c8a-3066-4ddd-93d9-7209814c1d0e from pm to coder waits: coder has no running session. Launch coder within the launch block's limits, or tell pm why not with message.send in_reply_to 17083c8a-3066-4ddd-93d9-7209814c1d0e.",
|
||||
+ "Message 469c1248-fe48-4eff-bc1a-ece75efc741e from pm to coder waits: coder has no running session. Launch coder within the launch block's limits, or tell pm why not with message.send in_reply_to 469c1248-fe48-4eff-bc1a-ece75efc741e."
|
||||
- 'echo',
|
||||
- 'The turn failed: adapter exited 3',
|
||||
- 'The turn failed: pi exited before the turn ended (no agent_end)',
|
||||
- 'The turn failed: turn passed its 1 s wall clock'
|
||||
]
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/harness/tests/runner.test.mjs:428:10)
|
||||
at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: [ "Message 13a34491-26fd-45c7-977f-878917371b3a from pm to coder waits: coder has no running session. Launch coder within the launch block's limits, or tell pm why not with message.send in_reply_to 13a34491-26fd-45c7-977f-878917371b3a.", "Message 57b6f92e-9214-464d-825f-68953e54e775 from pm to coder waits: coder has no running session. Launch coder within the launch block's limits, or tell pm why not with message.send in_reply_to 57b6f92e-9214-464d-825f-68953e54e775.", "Message 6cfa6aad-4699-4a60-8abf-6fcc6975023f from pm to coder waits: coder has no running session. Launch coder within the launch block's limits, or tell pm why not with message.send in_reply_to 6cfa6aad-4699-4a60-8abf-6fcc6975023f.", "Message 17083c8a-3066-4ddd-93d9-7209814c1d0e from pm to coder waits: coder has no running session. Launch coder within the launch block's limits, or tell pm why not with message.send in_reply_to 17083c8a-3066-4ddd-93d9-7209814c1d0e.", "Message 469c1248-fe48-4eff-bc1a-ece75efc741e from pm to coder waits: coder has no running session. Launch coder within the launch block's limits, or tell pm why not with message.send in_reply_to 469c1248-fe48-4eff-bc1a-ece75efc741e." ],
|
||||
expected: [ 'echo', 'The turn failed: adapter exited 3', 'The turn failed: pi exited before the turn ended (no agent_end)', 'The turn failed: turn passed its 1 s wall clock' ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
== packages/cli rc=0
|
||||
✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (115.055393ms)
|
||||
✔ talk --tester refuses text without the [mos test] prefix before any call (66.486027ms)
|
||||
✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (77.504089ms)
|
||||
✔ decide, stop and launches take no --tester (47.795719ms)
|
||||
✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.303416ms)
|
||||
✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.438997ms)
|
||||
✔ talk --tester to a stopped role says nobody is told to launch it (44.177113ms)
|
||||
✔ talk sends a REQUEST, prints and reads everything that arrives, and stops at the reply (166.857459ms)
|
||||
✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1085.215738ms)
|
||||
✔ a late reply the Console has listed still reaches the next talk (2096.463696ms)
|
||||
✔ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (138.974111ms)
|
||||
✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (46.150955ms)
|
||||
✔ launches off and on go to the broker and change the business's launch state (53.454274ms)
|
||||
✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (44.636709ms)
|
||||
ℹ tests 14
|
||||
ℹ suites 0
|
||||
ℹ pass 14
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 3728.867877
|
||||
@@ -0,0 +1,116 @@
|
||||
== packages/bus rc=1
|
||||
✔ a message to a stopped role sends launch.by one notice, and the result says so (86.102011ms)
|
||||
✔ a message to a running role sends no notice and its result is unchanged (54.774317ms)
|
||||
✔ a re-route at a claim, a release and claim, and a broker restart send no second notice (98.645787ms)
|
||||
✔ a run launched but not yet claimed counts as no holder (53.684915ms)
|
||||
✖ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (65.723905ms)
|
||||
✔ a business with no launch block tells nobody and says there is no launcher (43.04798ms)
|
||||
✔ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (153.073354ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 6
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 610.204335
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/launch-notice.test.mjs:138:1
|
||||
✖ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (65.723905ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
|
||||
true !== false
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/bus/tests/launch-notice.test.mjs:158:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: true,
|
||||
expected: false,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
== packages/harness rc=0
|
||||
✔ founderCheck: founder variables, then a needed service without a usable token (0.897689ms)
|
||||
✔ turnRequest names the sender, class, reply and decision (0.143765ms)
|
||||
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.168861ms)
|
||||
✔ turnRequest shows the message's own sent time, a day old as well as new (0.103565ms)
|
||||
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.182912ms)
|
||||
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (230.683575ms)
|
||||
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (236.952518ms)
|
||||
✔ a task closed on the tracker is missing from the next turn's open list (215.605012ms)
|
||||
✔ a message read a day after it was sent shows the time it was sent (155.101904ms)
|
||||
✔ a decision the human resolves becomes a turn citing the decision and the answer (197.053383ms)
|
||||
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (117.66254ms)
|
||||
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (95.228458ms)
|
||||
✔ typed tools carry the runner's capability; launch goes to the host's launch socket (394.660462ms)
|
||||
✔ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (415.612519ms)
|
||||
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1335.873991ms)
|
||||
✔ the bus's launch notice is one turn with no reply, and is not taken again (249.786605ms)
|
||||
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (146.133783ms)
|
||||
✔ founder credentials stop before the claim (20) (158.399801ms)
|
||||
✔ a refused claim exits 21; an ended run's capability exits 22 (182.200702ms)
|
||||
✔ the launch ending under a running session exits 22 (140.836536ms)
|
||||
✔ a broker that stays unreachable exits 23 after brokerRetries polls (242.364563ms)
|
||||
✔ a broker that is down at the claim exits 23, not 21 (95.563265ms)
|
||||
✔ no capability, or a malformed one, on stdin exits 2 (186.617476ms)
|
||||
✔ a missing or malformed policy exits 2 before the claim (124.815146ms)
|
||||
ℹ tests 24
|
||||
ℹ suites 0
|
||||
ℹ pass 24
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 11885.925556
|
||||
== packages/cli rc=1
|
||||
✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (114.118762ms)
|
||||
✔ talk --tester refuses text without the [mos test] prefix before any call (73.927391ms)
|
||||
✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (84.326083ms)
|
||||
✔ decide, stop and launches take no --tester (47.079239ms)
|
||||
✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.285558ms)
|
||||
✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.449389ms)
|
||||
✖ talk --tester to a stopped role says nobody is told to launch it (52.755944ms)
|
||||
✔ talk sends a REQUEST, prints and reads everything that arrives, and stops at the reply (167.819293ms)
|
||||
✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1085.32038ms)
|
||||
✔ a late reply the Console has listed still reaches the next talk (2090.930193ms)
|
||||
✔ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (145.055969ms)
|
||||
✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (47.040802ms)
|
||||
✔ launches off and on go to the broker and change the business's launch state (55.743673ms)
|
||||
✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (46.233819ms)
|
||||
ℹ tests 14
|
||||
ℹ suites 0
|
||||
ℹ pass 13
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 3736.230913
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/tester.test.mjs:131:1
|
||||
✖ talk --tester to a stopped role says nobody is told to launch it (52.755944ms)
|
||||
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /^sent [0-9a-f-]{8} to cto\ncto isn't running; a tester's message tells nobody to launch it\n$/. Input:
|
||||
|
||||
'sent 24a48e52 to cto\n' +
|
||||
"cto isn't running, pm has been told\n" +
|
||||
"pm isn't running either. systemctl --user restart mosaic-bus@demo starts it if the unit runs with --pm (scripts/bus-service.sh status demo shows pm: on). The restart stops running sessions.\n"
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/cli/tests/tester.test.mjs:135:10)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: "sent 24a48e52 to cto\ncto isn't running, pm has been told\npm isn't running either. systemctl --user restart mosaic-bus@demo starts it if the unit runs with --pm (scripts/bus-service.sh status demo shows pm: on). The restart stops running sessions.\n",
|
||||
expected: /^sent [0-9a-f-]{8} to cto\ncto isn't running; a tester's message tells nobody to launch it\n$/,
|
||||
operator: 'match',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
== packages/bus rc=1
|
||||
✔ a message to a stopped role sends launch.by one notice, and the result says so (86.785338ms)
|
||||
✔ a message to a running role sends no notice and its result is unchanged (64.124616ms)
|
||||
✔ a re-route at a claim, a release and claim, and a broker restart send no second notice (98.610764ms)
|
||||
✔ a run launched but not yet claimed counts as no holder (54.194678ms)
|
||||
✔ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (131.963701ms)
|
||||
✖ a business with no launch block tells nobody and says there is no launcher (56.982118ms)
|
||||
✔ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (250.600137ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 6
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 806.068605
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/launch-notice.test.mjs:176:1
|
||||
✖ a business with no launch block tells nobody and says there is no launcher (56.982118ms)
|
||||
Error: storage-refused
|
||||
at #refused (file:///home/jwoltje/dewey-scratch/r146/wt/packages/bus/src/broker.mjs:834:47)
|
||||
at Broker.request (file:///home/jwoltje/dewey-scratch/r146/wt/packages/bus/src/broker.mjs:907:26)
|
||||
at ctx.call (file:///home/jwoltje/dewey-scratch/r146/wt/packages/bus/tests/launch-notice.test.mjs:58:46)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/bus/tests/launch-notice.test.mjs:178:24)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
code: 'storage-refused'
|
||||
}
|
||||
== packages/harness rc=0
|
||||
✔ founderCheck: founder variables, then a needed service without a usable token (1.567929ms)
|
||||
✔ turnRequest names the sender, class, reply and decision (0.284649ms)
|
||||
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.284394ms)
|
||||
✔ turnRequest shows the message's own sent time, a day old as well as new (0.185161ms)
|
||||
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.312617ms)
|
||||
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (240.259293ms)
|
||||
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (237.365329ms)
|
||||
✔ a task closed on the tracker is missing from the next turn's open list (210.692908ms)
|
||||
✔ a message read a day after it was sent shows the time it was sent (168.605273ms)
|
||||
✔ a decision the human resolves becomes a turn citing the decision and the answer (220.910735ms)
|
||||
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (128.692223ms)
|
||||
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (92.41158ms)
|
||||
✔ typed tools carry the runner's capability; launch goes to the host's launch socket (356.048091ms)
|
||||
✔ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (429.039214ms)
|
||||
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1294.868429ms)
|
||||
✔ the bus's launch notice is one turn with no reply, and is not taken again (282.221726ms)
|
||||
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (153.257964ms)
|
||||
✔ founder credentials stop before the claim (20) (195.414274ms)
|
||||
✔ a refused claim exits 21; an ended run's capability exits 22 (207.792809ms)
|
||||
✔ the launch ending under a running session exits 22 (153.871968ms)
|
||||
✔ a broker that stays unreachable exits 23 after brokerRetries polls (262.232013ms)
|
||||
✔ a broker that is down at the claim exits 23, not 21 (90.211778ms)
|
||||
✔ no capability, or a malformed one, on stdin exits 2 (213.227535ms)
|
||||
✔ a missing or malformed policy exits 2 before the claim (123.507612ms)
|
||||
ℹ tests 24
|
||||
ℹ suites 0
|
||||
ℹ pass 24
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 11934.888509
|
||||
== packages/cli rc=1
|
||||
✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (116.178086ms)
|
||||
✔ talk --tester refuses text without the [mos test] prefix before any call (59.211452ms)
|
||||
✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (91.151752ms)
|
||||
✔ decide, stop and launches take no --tester (60.592638ms)
|
||||
✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.289899ms)
|
||||
✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.428497ms)
|
||||
✔ talk --tester to a stopped role says nobody is told to launch it (51.052392ms)
|
||||
✔ talk sends a REQUEST, prints and reads everything that arrives, and stops at the reply (190.133924ms)
|
||||
✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1093.18197ms)
|
||||
✔ a late reply the Console has listed still reaches the next talk (2105.060772ms)
|
||||
✖ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (54.698717ms)
|
||||
✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (48.579856ms)
|
||||
✔ launches off and on go to the broker and change the business's launch state (57.150642ms)
|
||||
✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (47.708095ms)
|
||||
ℹ tests 14
|
||||
ℹ suites 0
|
||||
ℹ pass 13
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 3696.731541
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/verbs.test.mjs:85:1
|
||||
✖ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (54.698717ms)
|
||||
Error: storage-refused
|
||||
at file:///home/jwoltje/dewey-scratch/r146/wt/packages/cli/tests/helpers.mjs:96:21
|
||||
at talk (file:///home/jwoltje/dewey-scratch/r146/wt/packages/cli/src/cli.mjs:244:18)
|
||||
at main (file:///home/jwoltje/dewey-scratch/r146/wt/packages/cli/src/cli.mjs:415:31)
|
||||
at Object.run (file:///home/jwoltje/dewey-scratch/r146/wt/packages/cli/tests/verbs.test.mjs:19:13)
|
||||
at text (file:///home/jwoltje/dewey-scratch/r146/wt/packages/cli/tests/verbs.test.mjs:89:23)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/cli/tests/verbs.test.mjs:95:22)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19) {
|
||||
code: 'storage-refused'
|
||||
}
|
||||
@@ -0,0 +1,164 @@
|
||||
== packages/bus rc=1
|
||||
✖ a message to a stopped role sends launch.by one notice, and the result says so (54.568324ms)
|
||||
✔ a message to a running role sends no notice and its result is unchanged (61.529017ms)
|
||||
✖ a re-route at a claim, a release and claim, and a broker restart send no second notice (48.866129ms)
|
||||
✖ a run launched but not yet claimed counts as no holder (50.806052ms)
|
||||
✔ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (133.407544ms)
|
||||
✔ a business with no launch block tells nobody and says there is no launcher (47.3962ms)
|
||||
✖ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (153.625715ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 3
|
||||
ℹ fail 4
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 616.7353
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/launch-notice.test.mjs:68:1
|
||||
✖ a message to a stopped role sends launch.by one notice, and the result says so (54.568324ms)
|
||||
TypeError: Cannot read properties of undefined (reading 'from_run')
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/bus/tests/launch-notice.test.mjs:74:18)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.start (node:internal/test_runner/test:1262:17)
|
||||
at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17)
|
||||
|
||||
test at tests/launch-notice.test.mjs:112:1
|
||||
✖ a re-route at a claim, a release and claim, and a broker restart send no second notice (48.866129ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
|
||||
0 !== 1
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/bus/tests/launch-notice.test.mjs:115:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: 0,
|
||||
expected: 1,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at tests/launch-notice.test.mjs:131:1
|
||||
✖ a run launched but not yet claimed counts as no holder (50.806052ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
|
||||
0 !== 1
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/bus/tests/launch-notice.test.mjs:135:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: 0,
|
||||
expected: 1,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at tests/launch-notice.test.mjs:187:1
|
||||
✖ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (153.625715ms)
|
||||
TypeError: Cannot read properties of undefined (reading 'id')
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/bus/tests/launch-notice.test.mjs:208:49)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25)
|
||||
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
|
||||
at Test.postRun (node:internal/test_runner/test:1542:19)
|
||||
at Test.run (node:internal/test_runner/test:1467:12)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
== packages/harness rc=1
|
||||
✔ founderCheck: founder variables, then a needed service without a usable token (0.957107ms)
|
||||
✔ turnRequest names the sender, class, reply and decision (0.164269ms)
|
||||
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.190173ms)
|
||||
✔ turnRequest shows the message's own sent time, a day old as well as new (0.128216ms)
|
||||
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.193798ms)
|
||||
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (242.341572ms)
|
||||
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (255.502087ms)
|
||||
✔ a task closed on the tracker is missing from the next turn's open list (242.249983ms)
|
||||
✔ a message read a day after it was sent shows the time it was sent (177.104008ms)
|
||||
✔ a decision the human resolves becomes a turn citing the decision and the answer (244.257024ms)
|
||||
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (156.649814ms)
|
||||
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (95.565286ms)
|
||||
✔ typed tools carry the runner's capability; launch goes to the host's launch socket (382.355102ms)
|
||||
✔ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (421.592999ms)
|
||||
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1288.816406ms)
|
||||
✖ the bus's launch notice is one turn with no reply, and is not taken again (115.418184ms)
|
||||
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (146.508252ms)
|
||||
✔ founder credentials stop before the claim (20) (162.745939ms)
|
||||
✔ a refused claim exits 21; an ended run's capability exits 22 (194.343189ms)
|
||||
✔ the launch ending under a running session exits 22 (145.79034ms)
|
||||
✔ a broker that stays unreachable exits 23 after brokerRetries polls (244.818111ms)
|
||||
✔ a broker that is down at the claim exits 23, not 21 (93.852362ms)
|
||||
✔ no capability, or a malformed one, on stdin exits 2 (188.050803ms)
|
||||
✔ a missing or malformed policy exits 2 before the claim (133.295925ms)
|
||||
ℹ tests 24
|
||||
ℹ suites 0
|
||||
ℹ pass 23
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 11871.394933
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/runner.test.mjs:441:1
|
||||
✖ the bus's launch notice is one turn with no reply, and is not taken again (115.418184ms)
|
||||
TypeError: Cannot read properties of undefined (reading 'to_role')
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/harness/tests/runner.test.mjs:450:23)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
== packages/cli rc=1
|
||||
✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (105.054367ms)
|
||||
✔ talk --tester refuses text without the [mos test] prefix before any call (68.47375ms)
|
||||
✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (69.82939ms)
|
||||
✔ decide, stop and launches take no --tester (48.138766ms)
|
||||
✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.320715ms)
|
||||
✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.511394ms)
|
||||
✔ talk --tester to a stopped role says nobody is told to launch it (49.511448ms)
|
||||
✔ talk sends a REQUEST, prints and reads everything that arrives, and stops at the reply (164.436035ms)
|
||||
✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1084.078216ms)
|
||||
✔ a late reply the Console has listed still reaches the next talk (2098.134698ms)
|
||||
✖ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (118.335692ms)
|
||||
✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (62.236725ms)
|
||||
✔ launches off and on go to the broker and change the business's launch state (55.122575ms)
|
||||
✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (51.639093ms)
|
||||
ℹ tests 14
|
||||
ℹ suites 0
|
||||
ℹ pass 13
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 3735.980687
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/verbs.test.mjs:85:1
|
||||
✖ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (118.335692ms)
|
||||
AssertionError [ERR_ASSERTION]: a message to launch.by tells nobody
|
||||
|
||||
0 !== 1
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/cli/tests/verbs.test.mjs:101:10)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: 0,
|
||||
expected: 1,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,110 @@
|
||||
== packages/bus rc=0
|
||||
✔ a message to a stopped role sends launch.by one notice, and the result says so (85.019154ms)
|
||||
✔ a message to a running role sends no notice and its result is unchanged (53.652176ms)
|
||||
✔ a re-route at a claim, a release and claim, and a broker restart send no second notice (91.238968ms)
|
||||
✔ a run launched but not yet claimed counts as no holder (49.068687ms)
|
||||
✔ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (112.054098ms)
|
||||
✔ a business with no launch block tells nobody and says there is no launcher (56.150055ms)
|
||||
✔ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (199.473338ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 7
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 699.752637
|
||||
== packages/harness rc=0
|
||||
✔ founderCheck: founder variables, then a needed service without a usable token (0.832945ms)
|
||||
✔ turnRequest names the sender, class, reply and decision (0.141147ms)
|
||||
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.178008ms)
|
||||
✔ turnRequest shows the message's own sent time, a day old as well as new (0.111041ms)
|
||||
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.166782ms)
|
||||
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (260.065259ms)
|
||||
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (237.384155ms)
|
||||
✔ a task closed on the tracker is missing from the next turn's open list (220.981641ms)
|
||||
✔ a message read a day after it was sent shows the time it was sent (143.032991ms)
|
||||
✔ a decision the human resolves becomes a turn citing the decision and the answer (198.813691ms)
|
||||
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (118.794967ms)
|
||||
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (94.336157ms)
|
||||
✔ typed tools carry the runner's capability; launch goes to the host's launch socket (340.749903ms)
|
||||
✔ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (427.372447ms)
|
||||
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1312.808059ms)
|
||||
✔ the bus's launch notice is one turn with no reply, and is not taken again (277.073366ms)
|
||||
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (147.202607ms)
|
||||
✔ founder credentials stop before the claim (20) (168.115141ms)
|
||||
✔ a refused claim exits 21; an ended run's capability exits 22 (202.771398ms)
|
||||
✔ the launch ending under a running session exits 22 (147.201178ms)
|
||||
✔ a broker that stays unreachable exits 23 after brokerRetries polls (244.490639ms)
|
||||
✔ a broker that is down at the claim exits 23, not 21 (101.697216ms)
|
||||
✔ no capability, or a malformed one, on stdin exits 2 (190.060616ms)
|
||||
✔ a missing or malformed policy exits 2 before the claim (131.402519ms)
|
||||
ℹ tests 24
|
||||
ℹ suites 0
|
||||
ℹ pass 24
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 11879.955013
|
||||
== packages/cli rc=1
|
||||
✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (114.474372ms)
|
||||
✔ talk --tester refuses text without the [mos test] prefix before any call (78.710447ms)
|
||||
✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (94.040212ms)
|
||||
✔ decide, stop and launches take no --tester (55.126081ms)
|
||||
✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.308868ms)
|
||||
✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.45966ms)
|
||||
✖ talk --tester to a stopped role says nobody is told to launch it (52.52864ms)
|
||||
✔ talk sends a REQUEST, prints and reads everything that arrives, and stops at the reply (200.169667ms)
|
||||
✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1095.765272ms)
|
||||
✔ a late reply the Console has listed still reaches the next talk (2110.419381ms)
|
||||
✖ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (50.796608ms)
|
||||
✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (46.347336ms)
|
||||
✔ launches off and on go to the broker and change the business's launch state (59.344723ms)
|
||||
✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (42.020372ms)
|
||||
ℹ tests 14
|
||||
ℹ suites 0
|
||||
ℹ pass 12
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 3707.067541
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/tester.test.mjs:131:1
|
||||
✖ talk --tester to a stopped role says nobody is told to launch it (52.52864ms)
|
||||
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /^sent [0-9a-f-]{8} to cto\ncto isn't running; a tester's message tells nobody to launch it\n$/. Input:
|
||||
|
||||
'sent fd2a758d to cto\n'
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/cli/tests/tester.test.mjs:135:10)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: 'sent fd2a758d to cto\n',
|
||||
expected: /^sent [0-9a-f-]{8} to cto\ncto isn't running; a tester's message tells nobody to launch it\n$/,
|
||||
operator: 'match',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at tests/verbs.test.mjs:85:1
|
||||
✖ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (50.796608ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ ''
|
||||
- "cto isn't running, and the business names no launch.by\n"
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/cli/tests/verbs.test.mjs:95:10)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: '',
|
||||
expected: "cto isn't running, and the business names no launch.by\n",
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
== packages/bus rc=0
|
||||
✔ a message to a stopped role sends launch.by one notice, and the result says so (91.082069ms)
|
||||
✔ a message to a running role sends no notice and its result is unchanged (55.531708ms)
|
||||
✔ a re-route at a claim, a release and claim, and a broker restart send no second notice (94.607271ms)
|
||||
✔ a run launched but not yet claimed counts as no holder (50.270744ms)
|
||||
✔ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (110.763882ms)
|
||||
✔ a business with no launch block tells nobody and says there is no launcher (50.112897ms)
|
||||
✔ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (158.631533ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 7
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 666.110764
|
||||
== packages/harness rc=0
|
||||
✔ founderCheck: founder variables, then a needed service without a usable token (0.895542ms)
|
||||
✔ turnRequest names the sender, class, reply and decision (0.148597ms)
|
||||
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.177637ms)
|
||||
✔ turnRequest shows the message's own sent time, a day old as well as new (0.112273ms)
|
||||
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.173573ms)
|
||||
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (272.41772ms)
|
||||
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (251.047791ms)
|
||||
✔ a task closed on the tracker is missing from the next turn's open list (266.669421ms)
|
||||
✔ a message read a day after it was sent shows the time it was sent (148.180627ms)
|
||||
✔ a decision the human resolves becomes a turn citing the decision and the answer (207.513424ms)
|
||||
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (128.992752ms)
|
||||
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (96.040363ms)
|
||||
✔ typed tools carry the runner's capability; launch goes to the host's launch socket (384.905991ms)
|
||||
✔ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (431.773282ms)
|
||||
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1301.015153ms)
|
||||
✔ the bus's launch notice is one turn with no reply, and is not taken again (283.820134ms)
|
||||
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (151.544463ms)
|
||||
✔ founder credentials stop before the claim (20) (184.917344ms)
|
||||
✔ a refused claim exits 21; an ended run's capability exits 22 (214.475237ms)
|
||||
✔ the launch ending under a running session exits 22 (152.538813ms)
|
||||
✔ a broker that stays unreachable exits 23 after brokerRetries polls (249.721454ms)
|
||||
✔ a broker that is down at the claim exits 23, not 21 (99.45206ms)
|
||||
✔ no capability, or a malformed one, on stdin exits 2 (192.226473ms)
|
||||
✔ a missing or malformed policy exits 2 before the claim (145.648919ms)
|
||||
ℹ tests 24
|
||||
ℹ suites 0
|
||||
ℹ pass 24
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 12019.728527
|
||||
== packages/cli rc=1
|
||||
✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (113.140442ms)
|
||||
✔ talk --tester refuses text without the [mos test] prefix before any call (66.693979ms)
|
||||
✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (97.911683ms)
|
||||
✔ decide, stop and launches take no --tester (46.847894ms)
|
||||
✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.368528ms)
|
||||
✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.548931ms)
|
||||
✔ talk --tester to a stopped role says nobody is told to launch it (49.736351ms)
|
||||
✔ talk sends a REQUEST, prints and reads everything that arrives, and stops at the reply (172.738565ms)
|
||||
✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1110.642819ms)
|
||||
✔ a late reply the Console has listed still reaches the next talk (2088.009987ms)
|
||||
✖ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (61.711743ms)
|
||||
✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (52.194768ms)
|
||||
✔ launches off and on go to the broker and change the business's launch state (57.29802ms)
|
||||
✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (46.842643ms)
|
||||
ℹ tests 14
|
||||
ℹ suites 0
|
||||
ℹ pass 13
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 3685.087378
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/verbs.test.mjs:85:1
|
||||
✖ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (61.711743ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ "cto isn't running; a tester's message tells nobody to launch it\n"
|
||||
- "cto isn't running, and the business names no launch.by\n"
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/cli/tests/verbs.test.mjs:95:10)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: "cto isn't running; a tester's message tells nobody to launch it\n",
|
||||
expected: "cto isn't running, and the business names no launch.by\n",
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
== packages/bus rc=0
|
||||
✔ a message to a stopped role sends launch.by one notice, and the result says so (114.730498ms)
|
||||
✔ a message to a running role sends no notice and its result is unchanged (62.784121ms)
|
||||
✔ a re-route at a claim, a release and claim, and a broker restart send no second notice (132.616203ms)
|
||||
✔ a run launched but not yet claimed counts as no holder (55.379543ms)
|
||||
✔ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (451.020126ms)
|
||||
✔ a business with no launch block tells nobody and says there is no launcher (44.005935ms)
|
||||
✔ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (158.98496ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 7
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 1088.018348
|
||||
== packages/harness rc=0
|
||||
✔ founderCheck: founder variables, then a needed service without a usable token (0.932505ms)
|
||||
✔ turnRequest names the sender, class, reply and decision (0.153556ms)
|
||||
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.197238ms)
|
||||
✔ turnRequest shows the message's own sent time, a day old as well as new (0.100666ms)
|
||||
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.189281ms)
|
||||
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (240.547091ms)
|
||||
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (242.660217ms)
|
||||
✔ a task closed on the tracker is missing from the next turn's open list (221.674655ms)
|
||||
✔ a message read a day after it was sent shows the time it was sent (145.225684ms)
|
||||
✔ a decision the human resolves becomes a turn citing the decision and the answer (204.595799ms)
|
||||
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (121.967525ms)
|
||||
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (94.182535ms)
|
||||
✔ typed tools carry the runner's capability; launch goes to the host's launch socket (460.893452ms)
|
||||
✔ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (433.726104ms)
|
||||
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1309.428142ms)
|
||||
✔ the bus's launch notice is one turn with no reply, and is not taken again (303.616803ms)
|
||||
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (152.039224ms)
|
||||
✔ founder credentials stop before the claim (20) (177.569739ms)
|
||||
✔ a refused claim exits 21; an ended run's capability exits 22 (199.319331ms)
|
||||
✔ the launch ending under a running session exits 22 (150.79646ms)
|
||||
✔ a broker that stays unreachable exits 23 after brokerRetries polls (245.764608ms)
|
||||
✔ a broker that is down at the claim exits 23, not 21 (97.845636ms)
|
||||
✔ no capability, or a malformed one, on stdin exits 2 (201.257542ms)
|
||||
✔ a missing or malformed policy exits 2 before the claim (124.057435ms)
|
||||
ℹ tests 24
|
||||
ℹ suites 0
|
||||
ℹ pass 24
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 12028.552025
|
||||
== packages/cli rc=1
|
||||
✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (253.22931ms)
|
||||
✔ talk --tester refuses text without the [mos test] prefix before any call (159.906224ms)
|
||||
✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (167.124314ms)
|
||||
✔ decide, stop and launches take no --tester (98.989409ms)
|
||||
✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.336729ms)
|
||||
✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.485802ms)
|
||||
✔ talk --tester to a stopped role says nobody is told to launch it (108.70449ms)
|
||||
✔ talk sends a REQUEST, prints and reads everything that arrives, and stops at the reply (326.981103ms)
|
||||
✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1209.561918ms)
|
||||
✔ a late reply the Console has listed still reaches the next talk (2139.762423ms)
|
||||
✖ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (204.382352ms)
|
||||
✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (86.794344ms)
|
||||
✔ launches off and on go to the broker and change the business's launch state (99.468282ms)
|
||||
✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (89.896109ms)
|
||||
ℹ tests 14
|
||||
ℹ suites 0
|
||||
ℹ pass 13
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 4258.973929
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/verbs.test.mjs:85:1
|
||||
✖ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (204.382352ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ "pm isn't running; a tester's message tells nobody to launch it\n"
|
||||
- "pm isn't running. systemctl --user restart mosaic-bus@demo starts it if the unit runs with --pm (scripts/bus-service.sh status demo shows pm: on). The restart stops running sessions.\n"
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/cli/tests/verbs.test.mjs:100:10)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: "pm isn't running; a tester's message tells nobody to launch it\n",
|
||||
expected: "pm isn't running. systemctl --user restart mosaic-bus@demo starts it if the unit runs with --pm (scripts/bus-service.sh status demo shows pm: on). The restart stops running sessions.\n",
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,93 @@
|
||||
== packages/bus rc=0
|
||||
✔ a message to a stopped role sends launch.by one notice, and the result says so (153.538274ms)
|
||||
✔ a message to a running role sends no notice and its result is unchanged (104.002722ms)
|
||||
✔ a re-route at a claim, a release and claim, and a broker restart send no second notice (173.971427ms)
|
||||
✔ a run launched but not yet claimed counts as no holder (96.590608ms)
|
||||
✔ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (229.647283ms)
|
||||
✔ a business with no launch block tells nobody and says there is no launcher (82.389255ms)
|
||||
✔ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (294.886843ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 7
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 1188.194702
|
||||
== packages/harness rc=0
|
||||
✔ founderCheck: founder variables, then a needed service without a usable token (0.925728ms)
|
||||
✔ turnRequest names the sender, class, reply and decision (0.161147ms)
|
||||
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.171205ms)
|
||||
✔ turnRequest shows the message's own sent time, a day old as well as new (0.109039ms)
|
||||
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.192792ms)
|
||||
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (335.743529ms)
|
||||
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (316.095877ms)
|
||||
✔ a task closed on the tracker is missing from the next turn's open list (375.329536ms)
|
||||
✔ a message read a day after it was sent shows the time it was sent (226.31284ms)
|
||||
✔ a decision the human resolves becomes a turn citing the decision and the answer (285.314428ms)
|
||||
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (187.105883ms)
|
||||
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (129.344818ms)
|
||||
✔ typed tools carry the runner's capability; launch goes to the host's launch socket (469.236895ms)
|
||||
✔ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (558.481953ms)
|
||||
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1397.260072ms)
|
||||
✔ the bus's launch notice is one turn with no reply, and is not taken again (314.77568ms)
|
||||
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (162.836716ms)
|
||||
✔ founder credentials stop before the claim (20) (174.30152ms)
|
||||
✔ a refused claim exits 21; an ended run's capability exits 22 (214.503278ms)
|
||||
✔ the launch ending under a running session exits 22 (158.375578ms)
|
||||
✔ a broker that stays unreachable exits 23 after brokerRetries polls (273.510529ms)
|
||||
✔ a broker that is down at the claim exits 23, not 21 (106.998528ms)
|
||||
✔ no capability, or a malformed one, on stdin exits 2 (216.211206ms)
|
||||
✔ a missing or malformed policy exits 2 before the claim (174.521869ms)
|
||||
ℹ tests 24
|
||||
ℹ suites 0
|
||||
ℹ pass 24
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 12840.230599
|
||||
== packages/cli rc=1
|
||||
✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (103.374826ms)
|
||||
✔ talk --tester refuses text without the [mos test] prefix before any call (76.689127ms)
|
||||
✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (92.992621ms)
|
||||
✔ decide, stop and launches take no --tester (46.926883ms)
|
||||
✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.281041ms)
|
||||
✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.43707ms)
|
||||
✖ talk --tester to a stopped role says nobody is told to launch it (51.955856ms)
|
||||
✔ talk sends a REQUEST, prints and reads everything that arrives, and stops at the reply (162.350698ms)
|
||||
✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1105.492438ms)
|
||||
✔ a late reply the Console has listed still reaches the next talk (2114.974129ms)
|
||||
✔ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (150.814191ms)
|
||||
✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (47.577976ms)
|
||||
✔ launches off and on go to the broker and change the business's launch state (56.44438ms)
|
||||
✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (49.887264ms)
|
||||
ℹ tests 14
|
||||
ℹ suites 0
|
||||
ℹ pass 13
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 3783.866522
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/tester.test.mjs:131:1
|
||||
✖ talk --tester to a stopped role says nobody is told to launch it (51.955856ms)
|
||||
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /^sent [0-9a-f-]{8} to cto\ncto isn't running; a tester's message tells nobody to launch it\n$/. Input:
|
||||
|
||||
'sent d70fee2f to cto\n' +
|
||||
"cto isn't running, pm has been told\n" +
|
||||
"pm isn't running either. systemctl --user restart mosaic-bus@demo starts it if the unit runs with --pm (scripts/bus-service.sh status demo shows pm: on). The restart stops running sessions.\n"
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/cli/tests/tester.test.mjs:135:10)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: "sent d70fee2f to cto\ncto isn't running, pm has been told\npm isn't running either. systemctl --user restart mosaic-bus@demo starts it if the unit runs with --pm (scripts/bus-service.sh status demo shows pm: on). The restart stops running sessions.\n",
|
||||
expected: /^sent [0-9a-f-]{8} to cto\ncto isn't running; a tester's message tells nobody to launch it\n$/,
|
||||
operator: 'match',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,94 @@
|
||||
== packages/bus rc=0
|
||||
✔ a message to a stopped role sends launch.by one notice, and the result says so (88.888317ms)
|
||||
✔ a message to a running role sends no notice and its result is unchanged (58.149279ms)
|
||||
✔ a re-route at a claim, a release and claim, and a broker restart send no second notice (101.888299ms)
|
||||
✔ a run launched but not yet claimed counts as no holder (77.910886ms)
|
||||
✔ no notice for a message to launch.by, from it, from a tester, to the human, or in a thread to a thread instance (114.323105ms)
|
||||
✔ a business with no launch block tells nobody and says there is no launcher (53.283802ms)
|
||||
✔ the notice sender stays internal: no role is named _bus and no caller can send as it or to it (153.822958ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 7
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 704.216324
|
||||
== packages/harness rc=0
|
||||
✔ founderCheck: founder variables, then a needed service without a usable token (0.898339ms)
|
||||
✔ turnRequest names the sender, class, reply and decision (0.147005ms)
|
||||
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.173742ms)
|
||||
✔ turnRequest shows the message's own sent time, a day old as well as new (0.106502ms)
|
||||
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.177325ms)
|
||||
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (240.412729ms)
|
||||
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (231.790107ms)
|
||||
✔ a task closed on the tracker is missing from the next turn's open list (224.442212ms)
|
||||
✔ a message read a day after it was sent shows the time it was sent (168.661231ms)
|
||||
✔ a decision the human resolves becomes a turn citing the decision and the answer (215.274774ms)
|
||||
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (132.574051ms)
|
||||
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (96.303682ms)
|
||||
✔ typed tools carry the runner's capability; launch goes to the host's launch socket (381.077472ms)
|
||||
✔ end_run and change_organization reach the broker with the tool's arguments, and refusals keep their codes (450.218228ms)
|
||||
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1262.214136ms)
|
||||
✔ the bus's launch notice is one turn with no reply, and is not taken again (282.820706ms)
|
||||
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (156.157527ms)
|
||||
✔ founder credentials stop before the claim (20) (175.029985ms)
|
||||
✔ a refused claim exits 21; an ended run's capability exits 22 (196.303613ms)
|
||||
✔ the launch ending under a running session exits 22 (149.293549ms)
|
||||
✔ a broker that stays unreachable exits 23 after brokerRetries polls (249.385612ms)
|
||||
✔ a broker that is down at the claim exits 23, not 21 (117.248962ms)
|
||||
✔ no capability, or a malformed one, on stdin exits 2 (192.500042ms)
|
||||
✔ a missing or malformed policy exits 2 before the claim (121.050514ms)
|
||||
ℹ tests 24
|
||||
ℹ suites 0
|
||||
ℹ pass 24
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 11940.909357
|
||||
== packages/cli rc=1
|
||||
✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (106.341424ms)
|
||||
✔ talk --tester refuses text without the [mos test] prefix before any call (73.647424ms)
|
||||
✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (89.639574ms)
|
||||
✔ decide, stop and launches take no --tester (43.444363ms)
|
||||
✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.307664ms)
|
||||
✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.443378ms)
|
||||
✔ talk --tester to a stopped role says nobody is told to launch it (48.650275ms)
|
||||
✔ talk sends a REQUEST, prints and reads everything that arrives, and stops at the reply (159.718301ms)
|
||||
✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1090.187468ms)
|
||||
✔ a late reply the Console has listed still reaches the next talk (2088.105822ms)
|
||||
✖ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (104.405444ms)
|
||||
✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (45.096701ms)
|
||||
✔ launches off and on go to the broker and change the business's launch state (51.332839ms)
|
||||
✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (44.633525ms)
|
||||
ℹ tests 14
|
||||
ℹ suites 0
|
||||
ℹ pass 13
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 3680.483451
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/verbs.test.mjs:85:1
|
||||
✖ talk says when the role isn't running, whether launch.by was told, and how to start launch.by (104.405444ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ "cto isn't running, pm has been told\n"
|
||||
- "cto isn't running, pm has been told\n" +
|
||||
- "pm isn't running either. systemctl --user restart mosaic-bus@demo starts it if the unit runs with --pm (scripts/bus-service.sh status demo shows pm: on). The restart stops running sessions.\n"
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r146/wt/packages/cli/tests/verbs.test.mjs:99:10)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: "cto isn't running, pm has been told\n",
|
||||
expected: "cto isn't running, pm has been told\npm isn't running either. systemctl --user restart mosaic-bus@demo starts it if the unit runs with --pm (scripts/bus-service.sh status demo shows pm: on). The restart stops running sessions.\n",
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
cc165b2ccf7c7cbb483801a5a57c5ed79dd6df1af7c380ccce49a3c90c81f25f ./base.txt
|
||||
a10ee697924370980f863bb92360078e70d3ea9a880cc3b6a40df3ac2b7d2396 ./BUILD.md
|
||||
972ab5859dd776a5593aee50287487694453166fb3a6c1ccd1fe15e53f71e289 ./build.patch
|
||||
616f953fe09bfc198645886bc4c7228a0fdeafa8c89b1729f2be8a5222689607 ./candidate-manifest.sha256
|
||||
66fb3debb8bc77f8f9e42476de4959d45b6508b08e5ce4fc91240f80d312eb3e ./gate/pkg-business.log
|
||||
2701d4bffce260fdd91f6ea77cba21d48a0e6cca8a507be6679931c3fb03c224 ./gate/pkg-bus.log
|
||||
f544bf59b30ff6d347f136b6b9300d2829a9e113a8aa61a89c9c54c23d5f0b45 ./gate/pkg-cli.log
|
||||
abf5293f4ce865617b10438cc85cc8ba79d4db1d4bc839e33b3e6c06156bfaab ./gate/pkg-harness.log
|
||||
63e21be77cb239f20175b1365a7d2ef4ee06b4b08d3c510bc62961a819139eb0 ./gate/pkg-plugins.log
|
||||
f0cbc111f9cb24f10b80de347d7f1f639ede6afb1f742581c13fd84de0950ef4 ./gate/pkg-seat.log
|
||||
cc9d7e149760f7c71e8d8195c9a0c34e0a3451aa50c697b9a996fb3c8bafbbde ./gate/pkg-tasks.log
|
||||
35caad6c40bca996a087d752123c63f17ffac5eed2af07a47a7750c1bc987a67 ./gate/pkg-webui.log
|
||||
72fedca4f60f62d6ddbc723fdf6919aeb6a9a83c4429b24917d340f853f1fb5c ./gate-run.log
|
||||
80a009215c395d8ee430a8f0dd37cad38a15791cfef3429b648d66e28e228907 ./gate.sh
|
||||
f91fc95a173339137f981e24fbf630acfde957e32c3cd71e28304532083c6a77 ./gate/test-auth.log
|
||||
f4b2417a7360d0c348b94b4849ed28bf7e299dff7f1ada1f0552dde6fadf6f5b ./gate/test-conductor.log
|
||||
52d211444489ea729dafc3c9745d4474d9dfd50f41055cbad792424197f04073 ./gate/test-config.log
|
||||
87d2e24ce0be7586e31ea1f2c9ce5618b3127515b3c3cd3893f2a0ed899d5822 ./gate/test-discord.log
|
||||
099bd424ec382e3a06e4d791726534ecc43ae47386f72d98b514e756ee5e45bf ./gate/test-extension-package.log
|
||||
83dfaa21c4e4ad941088efab3f69e87ebd2f6bd3cc72ede938e21dc06da8a34f ./gate/test-foundation.log
|
||||
8e2254aa3e1bb9b205ab72c68273d447c0328c9f156ccba2a46f3a0476468b58 ./gate/test-land-work.log
|
||||
1c3364ffe496577e17f3ec4c259ae37da992288034de8b661e747580790cbd0e ./gate/test-queue.log
|
||||
fa832794ee35025fb4559d58d01a270f6bff2eb65e863e9075b797f47fa68545 ./gate/test-release.log
|
||||
ccea37f4ffde1f160dcd1a1864988083a645d974e892065c956b338d0f8c853a ./gate/test-task.log
|
||||
d66909127c14e3991698c1fb4b29f57c1e6a25ca1b7096244fa571060aa00734 ./mutants/B10-class-result.log
|
||||
9bf21d8cfaaa40ce7fee8430d20a67d2a9c6202497d3430e7ed83080c4c89059 ./mutants/B11-launcher-running.log
|
||||
4f8088f709451dd178013d3e36d26d89f34c8bb8163dc920de24e37e381b4bc5 ./mutants/B12-result-waiting.log
|
||||
b2fe4d13ba3fe249953bd2038189d4b8a5a1c1bc87adcbc1f709298439579798 ./mutants/B1-recipient.log
|
||||
fef1026618ae532b2c62263af0858f696796ece462e127c7b0d554180bbbb2bb ./mutants/B2-to-human.log
|
||||
1991da3355a1b8c2a97d8369f95be3ca9b7546f53e9f875c91c1e69edd757c0a ./mutants/B3-to-tester.log
|
||||
a5e0a6e4a9a6fc010d0681e8a042865d0538075591965d9fe2966c84febad227 ./mutants/B4-thread-instance.log
|
||||
adc103aa40d47e75b293722be482494aa423d43d79e39139b638f7f249c9fc52 ./mutants/B5-to-launcher.log
|
||||
c917672332698c41d83af28f92b6fd57fbdf421dc695af8134a816ac497f0220 ./mutants/B6-from-launcher.log
|
||||
a073cb936e9f6b86136b95cd5d7ad1094b3b38fc5a79c357797d986aec546085 ./mutants/B7-from-tester.log
|
||||
ca8158fb0570c7e09a503d3ff5d52e064e8519c3e934d4f74dd471cb60c9e6f3 ./mutants/B8-no-launcher.log
|
||||
1851ceb994beef2b8bc9f290f60cbb294828f0dfbdc579b045a54d7efe9ce2a2 ./mutants/B9-notice-sent.log
|
||||
b554e1c7d9096c6bf8e4ab000ddb13d1335d9229d02599ece1f427a868708a0c ./mutants/C1-printed.log
|
||||
2386a5319803d9158b899136b47fa5edfa5146319a858a78e1ee931ba1796d24 ./mutants/C2-no-launch-by.log
|
||||
7decc335ee211612710af4158c63f9e2565ba80c5e473a039293e06c04746e99 ./mutants/C3-launcher-down-self.log
|
||||
c455639347453fa3c49bfb4cf614bb0d43ff553bf6263847a3bcb72e67fcf730 ./mutants/C4-tester-line.log
|
||||
0a175d86ea81105d225f04451081eaa423828157163bd85ca659bcaa7cb370b6 ./mutants/C5-launcher-down-either.log
|
||||
3910a952f64d9bcacff54b05404604d11a73e13f5b172d89d1d72ec7a4399793 ./MUTANTS.md
|
||||
da21e1f22508a4f00b355a0627f87a97ebdbf4ffcc651448c449a7d87b717228 ./mutants.py
|
||||
8e99f7da4dc00dfee0de87cfba158f165716ba0da1136a94534cbcc802d292b8 ./mutants-run.log
|
||||
88ea5e7d927ecadfe8e43e643f9b75329ba73568eeba4e05f481891440502b0f ./repro.sh
|
||||
Executable
+9
@@ -0,0 +1,9 @@
|
||||
#!/usr/bin/env bash
|
||||
# Row 146: apply build.patch to a detached worktree at base.txt and check the candidate manifest.
|
||||
# Usage: repro.sh <canonical checkout> <new worktree path>
|
||||
set -euo pipefail
|
||||
HERE=$(cd "$(dirname "$0")" && pwd)
|
||||
REPO=$1 WT=$2
|
||||
git -C "$REPO" worktree add -q --detach "$WT" "$(cat "$HERE/base.txt")"
|
||||
git -C "$WT" apply "$HERE/build.patch"
|
||||
(cd "$WT" && sha256sum -c --quiet "$HERE/candidate-manifest.sha256") && echo DIGESTS_OK
|
||||
Reference in New Issue
Block a user