agents: Darkwing row 121 round 1 packet (candidate manifest, gate, 62 mutants)
Round 1 is a code and test review and won't land. land-work fails at BASE on the read.mjs 3b pin, which row 49 removes. Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
1 parent
ebbbf62dac
commit
ef8c3fe713
97 files changed
+8541
No files matched your search
@@ -0,0 +1,275 @@
|
||||
# Row 121 (#1615) round 1: projects and threads in the bus
|
||||
|
||||
Brief: docs/plans/2026-10-14_prd-1.2-build.md, section "Projects and threads in the bus" (blob 333adea85 at HEAD). Design: comment 28555. Sage approved it with changes in comment 28556 and sage-0308. Sage granted the slot in sage-0331 and sage-0332.
|
||||
|
||||
Requirements: REQ-ORG-2, REQ-THREAD-1, REQ-THREAD-2, REQ-USER-2, REQ-ROLE-2, REQ-MSG-1, REQ-LAUNCH-1. Test names carry the ids.
|
||||
|
||||
BASE: eaeb5ebf2 (row 131's landing). The candidate is build.patch against BASE, and candidate-manifest.sha256 lists its 23 files. `repro.sh` exports BASE with `git archive`, applies build.patch and checks every manifest digest: DIGESTS_OK at 2026-10-15T17:30:24Z (repro-run.log).
|
||||
|
||||
**Round 1 is a code and test review, and it won't land.** The last section lists what round 2 adds.
|
||||
|
||||
**This round has no migration.** The approved order is 3b→3c (row 49), 3c→3d (row 123), then 3d→3e here. Rows 49 and 123 haven't landed, so the 3d→3e migration, its test on a copy of a schema-current database and its mutants come in round 2, after I rebase onto them. Until then `SCHEMA_VERSION = '3e'` in store.mjs is provisional, and a fresh database gets 3e directly. Dewey can review everything else now. The brief's first acceptance item stays open until round 2.
|
||||
|
||||
| File | Change |
|
||||
|---|---|
|
||||
| packages/bus/schema.sql | the 3e block: 5 tables and 24 triggers |
|
||||
| packages/bus/src/store.mjs | SCHEMA_SHA256, `SCHEMA_VERSION` in place of the two hardcoded `'3b'`, 4 timed tables |
|
||||
| packages/bus/src/broker.mjs | thread claims, routing and receive, 7 human verbs, `threadsState`, the `thread` key on `bindLaunch` |
|
||||
| packages/bus/src/process.mjs | the `threadsState` launch op |
|
||||
| packages/bus/src/runtime.mjs | `threadsState` passthrough |
|
||||
| packages/seat/src/session.mjs | `threadStore()`, the thread key in `Registry.running` |
|
||||
| packages/seat/src/sandbox.mjs | the thread store's two binds, the projects mount point in `prepareRun` |
|
||||
| packages/cli/src/launcher.mjs | the thread check, the thread store as sessionDir, the start and idle-stop tick |
|
||||
| packages/business/src/business.mjs | `THREAD_IDLE_SECONDS`, the optional `launch.threadIdleSeconds` |
|
||||
| packages/bus/README.md, packages/cli/README.md, packages/seat/README.md, packages/business/README.md | the new tables, verbs, store and setting |
|
||||
| packages/bus/tests/threads.test.mjs | new, 11 tests |
|
||||
| packages/cli/tests/thread-launch.test.mjs, packages/cli/tests/fixtures/thread-adapter.mjs | new, 7 tests and their stub adapter, which has a slow turn |
|
||||
| packages/bus/tests/messaging.test.mjs, schema.test.mjs, end-launch.test.mjs | adjusted, see "Existing tests" |
|
||||
| packages/seat/tests/session.test.mjs, sandbox.test.mjs | 3 new tests |
|
||||
| packages/business/tests/business.test.mjs, chief-of-staff.test.mjs | test 10, and the default in two deepEquals |
|
||||
|
||||
The ownership note in the claim lists the business README but not the bus, cli and seat READMEs. I edited those three to document the new tables, verbs, tick and store. Say if you want them split out.
|
||||
|
||||
## The 28556 changes
|
||||
|
||||
| # | Change | Where | Tested by |
|
||||
|---|---|---|---|
|
||||
| 1 | `delivery_same_thread` applies only when `m.to_role = t.instance`, so the assistant's messages to the chief route normally | schema.sql, the trigger's WHEN | threads.test.mjs "the chief of staff's reply comes back": the assistant's message reaches the chief through the broker. Test 5 keeps its direct insert. Mutant s-delivery-unscoped |
|
||||
| 2 | `thread.create` refuses `thread-instance-missing` with no thread instance and `thread-instance-ambiguous` with more than one | broker.mjs `thread.create` | "thread.create refuses when the business has no thread instance or more than one". Mutants b-thread-instance-missing and b-thread-instance-ambiguous |
|
||||
| 3 | both segments are checked against `ID_PATTERN` with no `..` before the join, then each directory gets the safe() checks | session.mjs `threadStore()` | session.test.mjs threadStore, and thread-launch.test.mjs test 3 with a hand-made id. Mutants seat-segment-dotdot, seat-segment-pattern, seat-store-dir-check, seat-store-mode-check |
|
||||
| 4 | the refusal is `thread-required-reply-to-thread-message`, and the chain walk stops on a `seen` set with no depth constant | broker.mjs `#threadFor` | "the chief of staff's reply comes back", with a long chain that never loops. Mutants b-chain-one-step and b-chain-depth-constant |
|
||||
| 5 | the Claude resume smoke is in the 3e window plan with Mos | nothing in this row | none. No seat runs it |
|
||||
|
||||
On 3: `ID_PATTERN` is `/^[a-z0-9][a-z0-9._-]{0,63}$/`, so it already excludes `/` and a leading `.`. The extra `..` check catches `a..b`, which the pattern allows.
|
||||
|
||||
On 4: a code is the whole message a run sees, because runner.mjs forwards codes only. So the code itself says what to do. A human `message.send` to the assistant gets its own code, `thread-required-use-thread-send`.
|
||||
|
||||
## The answers in 28556
|
||||
|
||||
1. Order: 3d→3e after rows 49 and 123, with row 49's version scheme. Nothing in this round depends on it except the provisional `SCHEMA_VERSION`.
|
||||
2. `launch.threadIdleSeconds` is optional. Absent means `THREAD_IDLE_SECONDS`, 900, exported once from business.mjs. A present value goes through `requirePositiveInt` with no upper bound, and the key is accepted when no thread instance is declared. No org file changed.
|
||||
3. The projects→repos rename is Sage's P19 follow-up. `project.create` still takes `repo`, checked against the business file's `projects`, and refuses `unknown-repo`.
|
||||
|
||||
## The code
|
||||
|
||||
### Schema (3e)
|
||||
|
||||
Five tables: `projects`, `threads`, `thread_claims`, `message_threads` and `thread_opens`. Side tables, not a `thread` column on messages and deliveries, as the design said, so the migration adds tables and rewrites none.
|
||||
|
||||
Nine behavior triggers:
|
||||
|
||||
| Trigger | Refuses |
|
||||
|---|---|
|
||||
| threads_project_business | a thread whose project is in another business |
|
||||
| thread_one_holder | a claim on a thread someone holds |
|
||||
| thread_one_per_run | a claim by a run that holds another thread |
|
||||
| thread_release_by_holder | a release or revoke of a thread nobody holds, or a release by a run that isn't the holder |
|
||||
| thread_release_same_run | a release or revoke that names a different run than the holder |
|
||||
| thread_revoke_needs_decision | a revoke with no decision |
|
||||
| thread_claims_business | a claim in a business other than the thread's |
|
||||
| message_threads_match | a thread on a message that isn't to or from the thread's instance |
|
||||
| delivery_same_thread | a delivery of a thread message to the instance by anyone but that thread's holder |
|
||||
|
||||
Fifteen append-only triggers: `no_update`, `no_delete` and `no_replace` on each of the five tables. In all the schema has 13 tables and 59 triggers, up from 8 and 35.
|
||||
|
||||
### Broker
|
||||
|
||||
- A role whose definition is `assistant` is the thread instance (`THREAD_DEFINITION`). Its runs bind with a `thread`, claim that thread instead of the role, and receive only that thread's messages. `bindLaunch` refuses `thread-required` for a thread instance with no thread, `thread-not-found` for a thread of another instance or business, and `thread-not-allowed` for any other role that names one. The `session.launched` body gets `thread` only when one is set, so an existing run's body is unchanged and a rebind still matches.
|
||||
- `role.claim` for a thread run writes `thread_claims`, refuses `run-revoked` and `thread-already-held`, and routes the thread's waiting messages to the new holder. `#claimEnd`, `endLaunch`, `delivered` and `read` use the thread claim through `#own`.
|
||||
- Every message is placed in a thread or not by `#threadFor`. A thread run's message is in its thread. A message to the instance from anyone else follows `in_reply_to` up to the nearest message that has a thread, and refuses `thread-instance-mismatch` if that thread belongs to another instance. A decision close to the assistant goes to the thread the raising run held.
|
||||
- Seven human verbs: `project.create`, `project.list`, `thread.create`, `thread.list`, `thread.open`, `thread.send` and `thread.messages`. `#thread` refuses `thread-not-found` and `thread-not-owned`, which is REQ-USER-2 with the one user there is today. Agents get none of these verbs.
|
||||
- `thread.messages` pages oldest first, 50 by default. `THREAD_PAGE_MAX` is 200. That is a page size, so a call returns at most 200 rows and the caller pages on with `after`. It isn't a cap on threads or messages, which is what Q150 rules out, but if Dewey reads it as a ceiling it can go.
|
||||
- `threadsState(business)` is a trusted launcher API, like `bindLaunch`, reached through the process op `threadsState`. Per thread it returns pending (waiting for delivery), unread (delivered, not read, so a turn in progress), and the latest message, open and claim times. I named it after the launch ops' camelCase. The design called it `threads.state`.
|
||||
|
||||
### Seat
|
||||
|
||||
`threadStore(dataRoot, business, thread)` makes `threads/<business>/<thread>/` with `session/` and `claude-projects/`. It checks both segments first. Then for every directory from `threads/` down it refuses one that is a symlink, isn't a directory, isn't ours, or has any group or other bit. The symlink check is redundant on Linux, where a symlink's lstat mode is 0777 and the mode check catches it, but it states the intent and costs nothing. A failure throws SeatError.
|
||||
|
||||
`binds()` adds the store's `session/` read-write, and `claude-projects/` read-write at the run's `home/.claude/projects`. That bind is the only new host path, which is why decision 130 gives the review to Dewey. `Registry.running` takes `thread` as part of its key.
|
||||
|
||||
### Launcher
|
||||
|
||||
- `check()` refuses `thread-required` and `thread-not-allowed` the same way the broker does, so a session or `--pm` launch of the assistant fails before a run directory exists.
|
||||
- `start()` calls `threadStore()` first and refuses `thread-store-refused` on any error. A thread run's sessionDir is the store's `session/`.
|
||||
- `tick()` runs every `THREAD_TICK_MS`, 2 s. It's a poll period. The tests set `threadTickMs`. Each tick reads `threadsState` and:
|
||||
- stops a thread session whose thread has nothing pending, nothing unread, and no message or open for `threadIdleSeconds`, measured from the latest of the run's start, the last message and the last open. The stop is SIGTERM to the runner after a start-time check, the same way `close()` stops a run.
|
||||
- starts a session for a thread with no holder that has a pending message or an open newer than its last claim. The start goes through `check()`, so it refuses like any launch.
|
||||
- Two guards stop a loop. `startedFor` keeps a signature per thread, `lastMessage|lastOpen`, and a thread doesn't start twice for the same one. A session that died before claiming waits for the next message or open instead of restarting every 2 s. `refusedThreads` logs a refusal once per code per thread.
|
||||
- host.mjs is unchanged. The launcher polls the broker rather than the broker pushing to it.
|
||||
|
||||
`THREAD_DEFINITION` appears in both broker.mjs and launcher.mjs. The launcher doesn't import from packages/bus/src, so I copied the constant with a comment naming the other one rather than add that import.
|
||||
|
||||
## Tests
|
||||
|
||||
The brief's test list, and where each item is:
|
||||
|
||||
| Brief item | Test |
|
||||
|---|---|
|
||||
| one holder per thread | threads.test.mjs "one holder per thread, through the broker and the trigger" |
|
||||
| a message names its thread | threads.test.mjs "a message to or from the assistant names its thread, or is refused" |
|
||||
| the chief's reply comes back to the thread that sent the work | threads.test.mjs "the chief of staff's reply comes back to the thread that sent the work" |
|
||||
| history survives an idle stop and a restart (stub harness) | thread-launch.test.mjs test 1, and test 3 for a turn longer than the idle time |
|
||||
| one thread's messages never reach another | threads.test.mjs "one thread's messages never reach another thread's holder", and thread-launch.test.mjs test 1 for the stores |
|
||||
| an idle thread holds no session and counts against no limit | thread-launch.test.mjs tests 1 and 2 |
|
||||
|
||||
threads.test.mjs, 11 tests, bus only:
|
||||
|
||||
1. "one holder per thread, through the broker and the trigger": a second claim on a held thread refuses `thread-already-held` and, inserted by hand, hits the trigger. One run can't hold two threads. A released thread takes a new run, and `endLaunch` releases.
|
||||
2. "the 3e triggers refuse writes that skip the broker": a bare database built from schema.sql, so only the triggers are in the way. One case per behavior trigger, and UPDATE, DELETE and INSERT OR REPLACE on each 3e table.
|
||||
3. "a message to or from the assistant names its thread, or is refused": the chief's unthreaded send, the user's `message.send`, a bind with no thread and a bind of another role with one all refuse with their codes. Accepted messages name their thread, including a decision close.
|
||||
4. "the chief of staff's reply comes back to the thread that sent the work": two threads each ask the chief, the work goes through the coder, and each reply lands in its own thread. It also covers the assistant's message reaching the chief through the broker (change 1), a 400-step chain with no loop (change 4), and the refusal for a chain with no thread in it.
|
||||
5. "a reply can't carry one thread instance's thread to another thread instance": a business with a second thread instance, its thread made by hand because `thread.create` refuses two. The chief's reply to the assistant's thread message, sent to the other instance, refuses `thread-instance-mismatch` and writes no message. Added after the first mutant run, see "Mutants".
|
||||
6. "one thread's messages never reach another thread's holder": B's holder gets none of A's messages, a delivery inserted by hand is refused by the trigger, and B can't read A's message.
|
||||
7. "a message to a thread with no holder waits, and the next holder gets it", and `thread.open` records an open with no message.
|
||||
8. "the human verbs refuse another owner's thread": REQ-USER-2 on every thread verb, and no agent gets a thread verb.
|
||||
9. "thread.create refuses when the business has no thread instance or more than one" (change 2).
|
||||
10. "projects and threads are named once, and the repo names a business project".
|
||||
11. "thread.messages returns the thread's history in pages and writes nothing".
|
||||
|
||||
thread-launch.test.mjs, 7 tests, real runners in the bwrap sandbox with a stub adapter (fixtures/thread-adapter.mjs) that keeps a history file in its session directory and answers with what it found there:
|
||||
|
||||
1. A message starts the thread's session, and the session stops when the thread goes idle. A second message starts a new run that finds the first run's history. A new host and launcher on the same data root find it too. Thread B's store is empty and has none of A's messages. An open with nothing pending starts a session that idles out.
|
||||
2. A running thread counts against its model's limit, and an idle-stopped one doesn't. With a limit of 1, B starts only after A's run ends, and B's refusal is logged once.
|
||||
3. A turn longer than the idle time isn't stopped: the stub's "slow" turn takes 3 s against an idle time of 1 s, the reply comes back, and then the thread idles out.
|
||||
4. A thread held by a run the launcher didn't start, bound by hand as after a restart before recovery, gets no session when a message comes in.
|
||||
5. A run that ends without taking the message it was started for isn't started again for that message. The test claims the thread by hand between the start and the run's own claim, so the run's claim refuses and it exits 21. Once the hand claim is released, three ticks start nothing.
|
||||
6. A thread with a hand-made id that isn't a safe segment, and a thread of a non-thread instance, launch nothing. More ticks log nothing more.
|
||||
7. The chief can't launch the assistant outside a thread.
|
||||
|
||||
Tests 3 to 5 were added after the first mutant run. Test 5 depends on ordering: `tick()` returns once the run is bound and its capability is queued on its stdin, and the test's claim is a synchronous broker call, so it lands before the run can read its capability. That test runs with the interval tick off (`tickMs` of an hour). I ran tests 3 to 5 five more times on their own, and all passed.
|
||||
|
||||
The seven skip only when the sandbox can't run (`sandboxProblem()`). They didn't skip in any run below.
|
||||
|
||||
seat: "Registry.running keys a thread run by business, instance and thread", "threadStore checks both segments before the join and refuses an unsafe directory" (`..`, `a/b`, `.x`, `a..b`, a business of `..`, `""`, `Th`, `7` and undefined, then a directory at mode 755 and a symlink), and "a thread store binds its session directory and Claude transcripts, and nothing more".
|
||||
|
||||
business: "launch.threadIdleSeconds: absent is the default, a positive integer is used, anything else refuses". This is test 10 from the design, with 0, -1, 1.5, "900" and null refused and `Number.MAX_SAFE_INTEGER` accepted.
|
||||
|
||||
### Existing tests
|
||||
|
||||
- schema.test.mjs: the counts go to 13 tables and 59 triggers.
|
||||
- messaging.test.mjs: the assistant binds with a thread, and the user writes to it with `thread.send`. The chief's and the pm's sends to the assistant now answer a message in the thread. These follow from REQ-MSG-1. Every message to the assistant must name its thread.
|
||||
- end-launch.test.mjs: the process test asks the child for `threadsState` on a hand-made thread.
|
||||
- business.test.mjs and chief-of-staff.test.mjs: a checked launch now carries `threadIdleSeconds: 900`.
|
||||
|
||||
## Mutants
|
||||
|
||||
mutants.py runs every set on the unmutated source first and stops unless each run has rc 0, 0 failures and 0 skipped. Each mutant checks that its pattern occurs exactly once (`--check`: 62 patterns) and that every test file its set names exists, so a missing file can't count as a kill. The 24 trigger mutants replace the trigger's `RAISE(ABORT, ...)` with `NULL` and rewrite `SCHEMA_SHA256` to match, so a kill is the test and not the store's digest check. A run that prints `schema-source-mismatch` counts as LOAD-FAIL, not killed.
|
||||
|
||||
62 mutants. The first batch killed 57. Five survived: b-instance-mismatch, b-state-holder-null, l-idle-ignores-pending, l-start-while-held and l-no-signature-guard. Each showed a check with no test, so I added the tests rather than drop the mutants: threads.test.mjs test 5 and thread-launch.test.mjs tests 3 to 5. A rerun of those five, after a fresh control run on the unmutated source (bus 44/0, cli 25/0), killed all five. Every source file was restored after each batch (`restored: True` in mutants-run.log). The table shows each mutant's final result and the first test that fails on it. mutants/ has every run's log.
|
||||
|
||||
| Mutant | Set | Result | First failing test |
|
||||
|---|---|---|---|
|
||||
| t-threads_project_business | SCHEMA | killed | REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker |
|
||||
| t-thread_one_holder | SCHEMA | killed | REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger |
|
||||
| t-thread_one_per_run | SCHEMA | killed | REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger |
|
||||
| t-thread_release_by_holder | SCHEMA | killed | REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker |
|
||||
| t-thread_release_same_run | SCHEMA | killed | REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker |
|
||||
| t-thread_revoke_needs_decision | SCHEMA | killed | REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker |
|
||||
| t-thread_claims_business | SCHEMA | killed | REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker |
|
||||
| t-message_threads_match | SCHEMA | killed | REQ-MSG-1: a message to or from the assistant names its thread, or is refused |
|
||||
| t-delivery_same_thread | SCHEMA | killed | REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder |
|
||||
| t-projects_no_update | SCHEMA | killed | REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker |
|
||||
| t-projects_no_delete | SCHEMA | killed | REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker |
|
||||
| t-projects_no_replace | SCHEMA | killed | REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker |
|
||||
| t-threads_no_update | SCHEMA | killed | REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker |
|
||||
| t-threads_no_delete | SCHEMA | killed | REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker |
|
||||
| t-threads_no_replace | SCHEMA | killed | REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker |
|
||||
| t-thread_claims_no_update | SCHEMA | killed | REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker |
|
||||
| t-thread_claims_no_delete | SCHEMA | killed | REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker |
|
||||
| t-thread_claims_no_replace | SCHEMA | killed | REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker |
|
||||
| t-message_threads_no_update | SCHEMA | killed | REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker |
|
||||
| t-message_threads_no_delete | SCHEMA | killed | REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker |
|
||||
| t-message_threads_no_replace | SCHEMA | killed | REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker |
|
||||
| t-thread_opens_no_update | SCHEMA | killed | REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker |
|
||||
| t-thread_opens_no_delete | SCHEMA | killed | REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker |
|
||||
| t-thread_opens_no_replace | SCHEMA | killed | REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker |
|
||||
| b-human-must-use-thread-send | BUS | killed | REQ-MSG-1: a message to or from the assistant names its thread, or is refused |
|
||||
| b-instance-mismatch | BUS | killed (rerun) | REQ-MSG-1: a reply can't carry one thread instance's thread to another thread instance |
|
||||
| b-chain-one-step | BUS | killed | REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work |
|
||||
| b-chain-depth-constant | BUS | killed | REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work |
|
||||
| b-no-thread-returns-null | BUS | killed | REQ-MSG-1: a message to or from the assistant names its thread, or is refused |
|
||||
| b-thread-not-owned | BUS | killed | REQ-USER-2: the human verbs refuse another owner's thread |
|
||||
| b-bind-thread-required | BUS | killed | REQ-MSG-1: a message to or from the assistant names its thread, or is refused |
|
||||
| b-bind-thread-not-found | BUS | killed | REQ-MSG-1: a message to or from the assistant names its thread, or is refused |
|
||||
| b-bind-thread-not-allowed | BUS | killed | REQ-MSG-1: a message to or from the assistant names its thread, or is refused |
|
||||
| b-thread-already-held | BUS | killed | REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger |
|
||||
| b-receive-any-thread | BUS | killed | REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work |
|
||||
| b-thread-instance-missing | BUS | killed | REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one |
|
||||
| b-thread-instance-ambiguous | BUS | killed | REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one |
|
||||
| b-state-pending-zero | CLI | killed | REQ-THREAD-2 REQ-LAUNCH-1 REQ-MSG-1 a thread message starts the thread's session, which stops when idle; it... |
|
||||
| b-state-last-open-null | BUS | killed | REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it |
|
||||
| b-state-holder-null | CLI | killed (rerun) | REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session |
|
||||
| p-threads-state-op | BUS | killed | broker process: launch ops authorize role.launch, record refusals and end runs |
|
||||
| s-delivery-unscoped | SCHEMA | killed | REQ-MSG-1: a message to or from the assistant names its thread, or is refused |
|
||||
| seat-segment-dotdot | SEAT | killed | REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory |
|
||||
| seat-segment-pattern | SEAT | killed | REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory |
|
||||
| seat-store-dir-check | SEAT | killed | REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory |
|
||||
| seat-store-mode-check | SEAT | killed | REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory |
|
||||
| seat-registry-thread-key | SEAT | killed | REQ-THREAD-1 Registry.running keys a thread run by business, instance and thread |
|
||||
| seat-no-thread-binds | SEAT | killed | REQ-THREAD-2 a thread store binds its session directory and Claude transcripts, and nothing more |
|
||||
| l-check-thread-required | CLI | killed | REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread |
|
||||
| l-check-thread-not-allowed | CLI | killed | REQ-THREAD-2 REQ-LAUNCH-1 a thread id that isn't a safe segment, or a thread of a non-thread instance, laun... |
|
||||
| l-no-thread-store | CLI | killed | REQ-THREAD-2 REQ-LAUNCH-1 REQ-MSG-1 a thread message starts the thread's session, which stops when idle; it... |
|
||||
| l-session-in-run-dir | CLI | killed | REQ-THREAD-2 REQ-LAUNCH-1 REQ-MSG-1 a thread message starts the thread's session, which stops when idle; it... |
|
||||
| l-never-idle-stop | CLI | killed | REQ-THREAD-2 REQ-LAUNCH-1 REQ-MSG-1 a thread message starts the thread's session, which stops when idle; it... |
|
||||
| l-idle-ignores-pending | CLI | killed (rerun) | REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it |
|
||||
| l-idle-fixed-900 | CLI | killed | REQ-THREAD-2 REQ-LAUNCH-1 REQ-MSG-1 a thread message starts the thread's session, which stops when idle; it... |
|
||||
| l-open-never-starts | CLI | killed | REQ-THREAD-2 REQ-LAUNCH-1 REQ-MSG-1 a thread message starts the thread's session, which stops when idle; it... |
|
||||
| l-never-start | CLI | killed | REQ-THREAD-2 REQ-LAUNCH-1 REQ-MSG-1 a thread message starts the thread's session, which stops when idle; it... |
|
||||
| l-start-while-held | CLI | killed (rerun) | REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session |
|
||||
| l-no-signature-guard | CLI | killed (rerun) | REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message |
|
||||
| l-refusal-every-tick | CLI | killed | REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't |
|
||||
| biz-idle-not-checked | BUSINESS | killed | REQ-THREAD-2 REQ-LAUNCH-1 launch.threadIdleSeconds: absent is the default, a positive integer is used, anyt... |
|
||||
| biz-idle-default | BUSINESS | killed | REQ-THREAD-2 REQ-LAUNCH-1 launch.threadIdleSeconds: absent is the default, a positive integer is used, anyt... |
|
||||
|
||||
## Gate
|
||||
|
||||
A targeted builder gate under decision 136 (gate.sh, logs in gate/). Sage's landing gate stays full. The four owned packages run in full, plus every package and script whose code or tests import a changed module.
|
||||
|
||||
| Step | Result |
|
||||
|---|---|
|
||||
| bus | 182 pass, 0 fail, 0 skip |
|
||||
| seat | 135 pass, 0 fail, 0 skip |
|
||||
| cli | 202 pass, 0 fail, 0 skip |
|
||||
| business | 93 pass, 0 fail, 0 skip |
|
||||
| harness | 84 pass, 0 fail, 0 skip |
|
||||
| plugins | 21 pass, 0 fail, 0 skip |
|
||||
| tasks | 92 pass, 0 fail, 0 skip |
|
||||
| webui | 112 pass, 0 fail, 0 skip |
|
||||
| scripts/test-land-work.sh | **26 pass, 58 fail at BASE.** Not a pass. See below |
|
||||
|
||||
**land-work fails at BASE because of the read.mjs pin.** `scripts/land-work/read.mjs` has its own `const SCHEMA_VERSION = '3b'`, and its schema check refuses any bus whose meta version isn't that literal. This candidate's store writes `3e`, so every selftest that opens a bus refuses `bus-schema` ("meta says version 3e"). gate/land-work.log has the run. read.mjs isn't in this row, and row 49 replaces the literal with an import of the Store's `SCHEMA_VERSION`. To check that the pin is the only cause, I applied row 49's read.mjs hunk (logs/row49-read.patch, taken from agents/rocko/work/queue-49/r1/build.patch) for one run: 84 pass, 0 fail (gate/land-work-with-row49-read.log). Then I restored read.mjs and checked its sha256 (550b746de4e3d7778cd18a37b566034a8bc64e41e57c002fc0578a7a6ae26d9b). That run shows the cause. It isn't a pass for this candidate, and land-work goes green in round 2, from the rebase onto row 49.
|
||||
|
||||
The gate stopped at land-work, so no step after it ran in this gate.
|
||||
|
||||
## How the round went
|
||||
|
||||
Two things Sage asked me to record.
|
||||
|
||||
**The three new files went missing after the rebase.** I rebased onto eaeb5ebf2. The untracked files, threads.test.mjs, thread-launch.test.mjs and its fixture, didn't come through. My first run after the rebase gave 151 pass, 0 fail, and I almost took it as green. node --test skips a file path that doesn't exist without a word. I restored the three files from my backup tar and reran: 164 pass, 0 fail. gate.sh and mutants.py now check that each named test file exists before they run.
|
||||
|
||||
**business.mjs conflicted on TOP_KEYS.** Row 131 added `plugins` to `TOP_KEYS`. My commit had added the `THREAD_IDLE_SECONDS` constant on the lines just above it, so the two hunks touched. I kept both: the constant, then row 131's `TOP_KEYS` with `plugins`, unchanged. `threadIdleSeconds` is a `launch` key, and it goes in `checkLaunch`'s key list, which didn't conflict. My slot message to Sage said I "added the threadIdleSeconds key" to TOP_KEYS. That was wrong. I added the constant next to it, and TOP_KEYS is exactly row 131's.
|
||||
|
||||
**Leftovers.** sweep.log, at 2026-10-15T17:29:40Z after the mutants, the repeat runs and the gate: 0 processes had a cwd under my TMPDIR. The test runs had left 1385 `mosaic-business-*`, 72 `mosaic-launch-*` and 28 `mosaic-thread-*` directories under my TMPDIR; I removed them and 0 remained. No Docker network exists for this worktree, and no `*.orig` file is left.
|
||||
|
||||
## What round 1 is, and what round 2 adds
|
||||
|
||||
Round 1 is a code and test review. It won't land (sage-0343). Round 2 adds:
|
||||
|
||||
1. A rebase onto rows 49 and 123 once they land.
|
||||
2. The 3d→3e migration step in `packages/bus/src/migrations/`, written against 3d, with its test on a copy of a schema-current 3d database that the bus then loads, and a mutant per check.
|
||||
3. The version pins in comment-migration.test.mjs moved on for 3e, the same kind of edit row 123 makes for 3d (Sage's note 28559).
|
||||
4. land-work green from the rebase, not from a borrowed hunk.
|
||||
5. A rerun of the targeted gate and the migration mutants, with the slot.
|
||||
|
||||
Round 2 is a delta review: Dewey checks the rebase, the migration and the gate.
|
||||
|
||||
## Going live
|
||||
|
||||
This round can't go live: it has no migration, and the live bus is at 3b.
|
||||
|
||||
When it does, it changes behavior for the assistant. The broker refuses a launch of the assistant without a thread, and a human `message.send` to the assistant refuses `thread-required-use-thread-send`. The user then needs `thread.create` and `thread.send`, and the CLI for them is row 128, the WebUI chat row 11. A tester send to the assistant refuses the same way until those land. I didn't read Jason's org file. I assumed the assistant role there uses the `assistant` definition, the way roles/assistant.json is shipped.
|
||||
|
||||
A thread run gets its own session store, but it shares the instance's workspace with the business's other thread runs. Two threads open at once write into one workspace. The design chose this to keep the repos checked out once. A per-thread workspace is a later change if it matters.
|
||||
|
||||
The Claude resume smoke runs in the 3e window plan with Mos. Going live is a re-pin on Mos's go (decision 109), with bus downtime for the migration.
|
||||
File diff suppressed because it is too large.
Load diff
@@ -0,0 +1,23 @@
|
||||
18043cfe47826e0fd2c101a79f63e653fb7269bd90d73fd11fc1b297d6909422 packages/bus/README.md
|
||||
7f0d07248f47ffdc4737161e7b76db98ddcb40fb1ae9b3f24851219a428ec14f packages/bus/schema.sql
|
||||
07a3d748e8b044178ef923f0b2ba6522ca09f9470eb148ecd78a8e57d645705b packages/bus/src/broker.mjs
|
||||
e4427055df705916554a7a7e3ca4e1418fdb7b9406df9f8eff1f9c07402c53bf packages/bus/src/process.mjs
|
||||
86b343595710fd3dc26d5891ce9e78d42492ab65128614580ac042b009906bb0 packages/bus/src/runtime.mjs
|
||||
54efd332781fa5c64eb1d22f452d4a28bf0f21439feee66d25649b4415d16e4d packages/bus/src/store.mjs
|
||||
01adbe5ce1698dca800fc94954b03d1795611f5efde8554f3ca8f7837d567376 packages/bus/tests/end-launch.test.mjs
|
||||
59e856e880ba8b379dadff7d5236fb3d3636f464104c31f8e691a1962b1ffc65 packages/bus/tests/messaging.test.mjs
|
||||
c969092cd94919f4d9d305fb4d308044a0979ad435fb0c6c0c490a3a7f4551cd packages/bus/tests/schema.test.mjs
|
||||
bd839397fd6247167900f08c2b350e41fe0540a06f0b705f7eee8556a50227c7 packages/bus/tests/threads.test.mjs
|
||||
18f06d5eeea035bb69321535cc3ec345894ee220deb2b85cbcfb6c1405ce01fb packages/business/README.md
|
||||
05aaf216a01cf37170d9736050cc7d391e1e4d039e2ef5a563a395042558858b packages/business/src/business.mjs
|
||||
d9d3b8f285a48cca44538cef4b7d33c002400549d8ba96468708b214751f1a33 packages/business/tests/business.test.mjs
|
||||
624fe1f77e757622e34a49588dc557b85cc05bbce5b111506fd890636d8ca665 packages/business/tests/chief-of-staff.test.mjs
|
||||
a5587de01d2ae29f81b47fd77d6253e2b11031a3bf0f453c41e0f6a5e1a12f0f packages/cli/README.md
|
||||
07ad6118efd7838a0102616e9f2cfd3cdcaa72f20a7c793bdf8c6b09be14019c packages/cli/src/launcher.mjs
|
||||
dc857a55ea53a87505073dac428282b66ab9d9e0bb3a1bca5632769682a9da43 packages/cli/tests/fixtures/thread-adapter.mjs
|
||||
599b5baa265b13bf04320270abaded0a7f3ae1e665379790e78d9b14e017d195 packages/cli/tests/thread-launch.test.mjs
|
||||
a22a84a967e061c687afbc3bbe85bbd0a285132cd87e6de3a101e71f2b40bedb packages/seat/README.md
|
||||
7c5158c95517c244ff5e41ec5cdb431734ae77b7f90add6d21302d10277c3656 packages/seat/src/sandbox.mjs
|
||||
46349aa3be84f5ab4123ed81718fb729eeff084f8579cdf1ab4a23cf7f99a3ee packages/seat/src/session.mjs
|
||||
c9659c0e1512d832126f76058bb9023b4acf79d7fb21b18223d37497325c0fdc packages/seat/tests/sandbox.test.mjs
|
||||
1fdfee178adebc3e83ed6de638d338f27e1afbce8831e89108d70cb5d7584b25 packages/seat/tests/session.test.mjs
|
||||
@@ -0,0 +1,11 @@
|
||||
base eaeb5ebf2 start 17:26:42
|
||||
pkg-bus rc=0 ℹ pass 182 ℹ fail 0 ℹ skipped 0
|
||||
pkg-seat rc=0 ℹ pass 135 ℹ fail 0 ℹ skipped 0
|
||||
pkg-cli rc=0 ℹ pass 202 ℹ fail 0 ℹ skipped 0
|
||||
pkg-business rc=0 ℹ pass 93 ℹ fail 0 ℹ skipped 0
|
||||
pkg-harness rc=0 ℹ pass 84 ℹ fail 0 ℹ skipped 0
|
||||
pkg-plugins rc=0 ℹ pass 21 ℹ fail 0 ℹ skipped 0
|
||||
pkg-tasks rc=0 ℹ pass 92 ℹ fail 0 ℹ skipped 0
|
||||
pkg-webui rc=0 ℹ pass 112 ℹ fail 0 ℹ skipped 0
|
||||
land-work rc=1
|
||||
STOP land-work
|
||||
@@ -0,0 +1,30 @@
|
||||
#!/bin/bash
|
||||
# Row 121 (#1615) targeted builder gate (decision 136). The four owned
|
||||
# packages in full, plus every package and script whose source or tests
|
||||
# import a changed module: harness (runner, tools, gate), plugins (loader
|
||||
# test), tasks, webui (bus, cli, reads) and scripts/land-work (read.mjs opens
|
||||
# the bus schema). cli/tests/stack-copy.test.mjs covers scripts/stack-copy.sh.
|
||||
set -o pipefail
|
||||
G=~/darkwing-scratch/r121/wt
|
||||
OUT=~/darkwing-scratch/r121/pkt/gate
|
||||
mkdir -p "$OUT"
|
||||
cd "$G" || exit 9
|
||||
[ -d "$G/node_modules" ] || { echo "STOP no node_modules in $G"; exit 8; }
|
||||
for f in packages/bus/tests/threads.test.mjs packages/cli/tests/thread-launch.test.mjs packages/cli/tests/fixtures/thread-adapter.mjs scripts/test-land-work.sh; do
|
||||
[ -f "$f" ] || { echo "STOP missing $f"; exit 7; }
|
||||
done
|
||||
echo "base $(git rev-parse --short HEAD) start $(date -u +%H:%M:%S)"
|
||||
run() { local name="$1" dir="$2" cmd="$3"
|
||||
(cd "$G/$dir" && TMPDIR=~/darkwing-scratch/r121/tmp bash -c "$cmd") > "$OUT/$name.log" 2>&1; local rc=$?
|
||||
echo "$name rc=$rc $(grep -E '^ℹ (pass|fail|skipped) [0-9]+' "$OUT/$name.log" | tr '\n' ' ')"
|
||||
[ $rc -eq 0 ] || { echo "STOP $name"; exit $rc; }; }
|
||||
run pkg-bus packages/bus 'node --test tests/*.test.mjs'
|
||||
run pkg-seat packages/seat 'node --test tests/'
|
||||
run pkg-cli packages/cli 'node --test tests/*.test.mjs'
|
||||
run pkg-business packages/business 'node --test tests/'
|
||||
run pkg-harness packages/harness 'node --test tests/*.test.mjs'
|
||||
run pkg-plugins packages/plugins 'node --test tests/'
|
||||
run pkg-tasks packages/tasks 'node --test tests/*.test.mjs'
|
||||
run pkg-webui packages/webui 'node --test tests/'
|
||||
run land-work . 'bash scripts/test-land-work.sh'
|
||||
echo "GATE_PASSED $(date -u +%H:%M:%S)"
|
||||
@@ -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,106 @@
|
||||
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
|
||||
file:///home/jwoltje/darkwing-scratch/r121/wt/scripts/land-work/read.mjs:37
|
||||
throw new Refusal(reason, detail);
|
||||
^
|
||||
|
||||
Refusal [Error]: meta says version 3e, digest b0820308fada
|
||||
at refuse (file:///home/jwoltje/darkwing-scratch/r121/wt/scripts/land-work/read.mjs:37:9)
|
||||
at checkSchema (file:///home/jwoltje/darkwing-scratch/r121/wt/scripts/land-work/read.mjs:86:5)
|
||||
at openBus (file:///home/jwoltje/darkwing-scratch/r121/wt/scripts/land-work/read.mjs:59:5)
|
||||
at file:///home/jwoltje/darkwing-scratch/r121/wt/[eval1]:3:12
|
||||
at ModuleJob.run (node:internal/modules/esm/module_job:569:25)
|
||||
at async node:internal/modules/esm/loader:226:26
|
||||
at async ModuleLoader.executeModuleJob (node:internal/modules/esm/loader:223:20)
|
||||
at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:101:5) {
|
||||
reason: 'bus-schema'
|
||||
}
|
||||
|
||||
Node.js v26.8.1
|
||||
FAIL openBus opens the database read-only
|
||||
FAIL other-business: exit 2, wanted 2 decision-not-found: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL no-raise: exit 2, wanted 2 decision-not-found: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL not-a-merge: exit 2, wanted 2 not-a-merge: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL open: exit 2, wanted 2 not-resolved: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL withdrawn: exit 2, wanted 2 not-resolved: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL by-agent: exit 2, wanted 2 not-human: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL via-webui: exit 2, wanted 2 not-human: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL no-answer: exit 2, wanted 2 not-human: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL answer-role: exit 2, wanted 2 not-human: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL answer-run: exit 2, wanted 2 not-human: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL answer-choice: exit 2, wanted 2 not-human: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL two-answers: exit 2, wanted 2 not-human: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL chose-no: exit 2, wanted 2 not-merge-option: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL two-refs: exit 2, wanted 2 work-ref: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL bad-ref: exit 2, wanted 2 work-ref: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL task-ref-disagrees: exit 2, wanted 2 work-ref: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL raise-task-disagrees: exit 2, wanted 2 work-ref: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL target-main: exit 2, wanted 2 target-branch: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL superseded-question: exit 2, wanted 2 superseded: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL superseded-task: exit 2, wanted 2 superseded: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL superseded-by: exit 2, wanted 2 superseded: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL no-verdict: exit 2, wanted 2 no-verdict: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL changes-later: exit 2, wanted 2 not-approved: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL short-commit: exit 2, wanted 2 not-approved: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL wrong-task-body: exit 2, wanted 2 not-approved: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL args: exit 2, wanted 2 decision-not-found: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL earlier-merge: exit 2, wanted 0: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL ref-moved: exit 2, wanted 2 ref-moved: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL root-top: exit 2, wanted 2 root-file: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL root-newdir: exit 2, wanted 2 root-file: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL root-src: exit 2, wanted 2 root-file: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL unrelated: exit 2, wanted 2 base-conflict: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL empty: exit 2, wanted 2 base-conflict: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL an empty reviewed diff says so
|
||||
FAIL dirty-changed: exit 2, wanted 2 checkout-dirty: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL dirty-staged: exit 2, wanted 2 checkout-dirty: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL dirty-untracked: exit 2, wanted 2 checkout-dirty: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL conflict: exit 2, wanted 2 base-conflict: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
OK a refusal after the worktree is added leaves no worktree or scratch
|
||||
OK cleanup looks for the worktree's Docker network
|
||||
FAIL dirty-during: exit 2, wanted 2 checkout-dirty: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
OK a reviewed path dirtied during the gate moves no ref
|
||||
FAIL drift: exit 2, wanted 2 patch-drift: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
OK patch-drift leaves no worktree or scratch
|
||||
FAIL gate-pkg: exit 2, wanted 2 gate-failed: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL gate-failed names the failing step's log, and it exists
|
||||
OK gate-failed leaves no worktree or scratch
|
||||
FAIL gate-script: exit 2, wanted 2 gate-failed: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL a failing scripts/test-*.sh fails the gate
|
||||
OK a failed gate moves no ref
|
||||
FAIL nomods: exit 2, wanted 4: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
OK a target without node_modules leaves no worktree or scratch
|
||||
FAIL moved: exit 2, wanted 2 base-moved: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL base-moved keeps the base where it moved to
|
||||
FAIL dry: exit 2, wanted 0: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
OK --dry-run writes no ref
|
||||
FAIL --dry-run prints the commit with --subject and --attribution
|
||||
FAIL --dry-run runs the gate
|
||||
OK --dry-run leaves no worktree or scratch
|
||||
FAIL land: exit 2, wanted 0: land-work: refused: bus-schema meta says version 3e, digest b0820308fada: bus-schema meta says version 3e, digest b0820308fada
|
||||
FAIL the landing is one commit on the old base
|
||||
fatal: bad object 1dc78580029407cdbdf5f741ff5d2feb350498e6
|
||||
OK its diff is the reviewed diff by patch-id
|
||||
FAIL its tree is the dry run's
|
||||
fatal: bad object 1dc78580029407cdbdf5f741ff5d2feb350498e6
|
||||
FAIL the message has the option's subject, the citations and the attribution last
|
||||
FAIL it prints the line for the PM
|
||||
FAIL 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
|
||||
grep: /gate.log: No such file or directory
|
||||
FAIL 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: 26 passed, 58 failed
|
||||
@@ -0,0 +1,190 @@
|
||||
✔ agents: a held role with nothing on the bus is idle; a role session gets the claim rows unchanged (144.106297ms)
|
||||
✔ agents: working counts what the holder received and has not read; routed alone is not working (212.221938ms)
|
||||
✔ agents: input needed is the role's open decisions routed to the human, gated first, then oldest (332.366729ms)
|
||||
✔ agents: working wins over waiting, and Input needed still shows (156.095595ms)
|
||||
✔ agents: a new holder doesn't inherit what the last one left unread; decisions stay with the role (198.808461ms)
|
||||
✔ agents: state reads only its own business, even for a run name both use (204.552233ms)
|
||||
✔ agents: a message the holder released unread is stranded; the next holder gets nothing and cannot read it (204.584477ms)
|
||||
✔ agents: a message the holder read is not stranded; one the current holder has not read is not listed (212.560799ms)
|
||||
✔ agents: stranded is oldest first and capped at 50 for a role (874.206871ms)
|
||||
✔ agents: stranded is per role and per business (313.892126ms)
|
||||
✔ agents: a message routed to a held role and not yet received is not stranded (127.968109ms)
|
||||
✔ launch identity is stamped, payload identity is refused and stale holder cannot send (151.790589ms)
|
||||
✔ decision classes route from policy; gated resolution is human-only, choice and target must match (277.651835ms)
|
||||
✔ claim exclusion, holder release, gated revoke and rerouting to a new holder are atomic (278.398214ms)
|
||||
✔ launch events require a human CLI capability; generic emit cannot forge authority events (185.846538ms)
|
||||
✔ within-role decisions close atomically and invalid options or blocking omissions refuse (178.296743ms)
|
||||
✔ a recommendation that is not exactly one option key refuses invalid-recommendation after the options (260.94375ms)
|
||||
✔ observer capabilities read human inbox but cannot mutate or forge launch identity (184.970843ms)
|
||||
✔ task action subjects and linked decision trail are complete and ordered (201.252393ms)
|
||||
✔ launch binding is durable and reconnecting requires the identical trusted record (127.790773ms)
|
||||
✔ business isolation includes inherited object names and cross-business message references (201.293737ms)
|
||||
✔ authority never transfers between action, run, target, unresolved or replaced role holder (288.482139ms)
|
||||
✔ task projection uses schema current view, skipping earlier and equal-start polls (144.075901ms)
|
||||
✔ revocation permanently bars the old run from reclaiming first, including after broker restart (210.46445ms)
|
||||
✔ empty message references refuse before storage; refusal-evidence failure stays a typed error (142.583864ms)
|
||||
✔ both arbiters require human resolution when their cross-role route is themselves (229.480173ms)
|
||||
✔ the shipped coder role raises task.reassign as gated to the human; task.scope.change stays cross-role (152.123808ms)
|
||||
✔ S1 adapter takes resolved limits and refs, rejects mismatched instance, never mutates input (1.605707ms)
|
||||
✔ credentials gives human and reader sessions service, account, role, date and state, and nothing else (83.988712ms)
|
||||
✔ credentials refuses a role session and any argument (186.964672ms)
|
||||
✔ credentials reads the status on each request, and a broker without one lists none (219.66908ms)
|
||||
✔ the broker process answers credentials without a token, path or variable in its output, log or store (190.726256ms)
|
||||
✔ only validated broker references load; returned data and exceptions cannot expose a known token (3.887712ms)
|
||||
✔ bad file modes, symlinks, repository/data paths, malformed tokens and missing dates refuse (4.930422ms)
|
||||
✔ expiry refuses use and env references never become client data (1.091048ms)
|
||||
✔ S1 parsed service refs work, service mismatch refuses, Gitea rotation due is a warning state (1.860635ms)
|
||||
✔ opaque tokens shorter than 16 characters refuse before use (0.414018ms)
|
||||
✔ a human resolve sends the raising role one message from the human, and its request is the answer (226.511959ms)
|
||||
✔ a cross-role decision resolved by its arbiter comes from that role and run, with no request (256.11502ms)
|
||||
✔ a human withdraw sends one message with the note (241.726273ms)
|
||||
✔ a human seen before the close leaves the request on the close's answer, not the seen (277.449182ms)
|
||||
✔ the raising run's withdraw, a supersede, a within-role raise and seen send nothing (290.13872ms)
|
||||
✔ refused closes send nothing: invalid-choice, decision-closed, not-resolver (297.054195ms)
|
||||
✔ a raising role nobody holds at the close gets the message on the next claim (274.695033ms)
|
||||
✔ a human DECISION send keeps its own instruction as the request, not a close's answer (244.219284ms)
|
||||
✔ roles lists open decisions routed to a role, and never the human inbox (203.459774ms)
|
||||
✔ recent lists closed decisions of every route, newest close first, with how each closed (305.428208ms)
|
||||
✔ recent gives the closing event as closed when the decision was seen first (291.028168ms)
|
||||
✔ recent stops at RECENT rows (817.852695ms)
|
||||
✔ every row is what trail already gives the same session for that id (270.149792ms)
|
||||
✔ a role session can't list decisions, so it can't read another role's open decisions (404.370479ms)
|
||||
✔ decisions is a read: one business, strict arguments, nothing written (383.484323ms)
|
||||
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (126.612467ms)
|
||||
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (147.135425ms)
|
||||
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (157.311946ms)
|
||||
✔ endLaunch leaves a claim another run took alone (175.075342ms)
|
||||
✔ refuse records action.refused against the caller with the code only (130.515399ms)
|
||||
✔ launches off refuses role.launch with launch-revoked until launches on (186.34531ms)
|
||||
✔ broker process: launch ops authorize role.launch, record refusals and end runs (310.743054ms)
|
||||
✔ human proof binds CLI entry, process start and nonce; agents and incomplete ancestry refuse (2.283406ms)
|
||||
✔ process reader gets own kernel identity without exposing environment values (0.555472ms)
|
||||
✔ EACCES ancestor environments skip only markers; commands and registered launches still refuse (0.987124ms)
|
||||
✔ real pid 1 remains inspectable when its environment is protected (0.485029ms)
|
||||
✔ limits binds actor from human proof and rejects role, reader, tester and forged actor (191.686035ms)
|
||||
✔ runtime wires verified human settings to the actual shared file writer and actor receipt (294.224755ms)
|
||||
✔ uncertain organization receipts leave bus startup and reads alone but refuse writes until reconciled (407.13035ms)
|
||||
✔ within-role sends cite an open gated launch decision without spending it or naming it in grants (187.237364ms)
|
||||
✔ missing and foreign-business citations refuse and roll back message and grant (198.09076ms)
|
||||
✔ cross-role sends still need a matching resolved decision and consume it once (262.047564ms)
|
||||
✔ messages pages all human messages newest first without writes; read state is history (2589.879382ms)
|
||||
✔ messages refuses role callers, invalid paging and cursors outside this human feed (245.088949ms)
|
||||
✔ views messages passes only its paging arguments through (0.307946ms)
|
||||
✔ messages isolates businesses even with a valid foreign cursor (157.218306ms)
|
||||
✔ the assistant sends to the user and to the chief of staff only (332.186593ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (370.367095ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (364.168818ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (320.759526ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (348.341203ms)
|
||||
✔ the sender list is checked before the target list (302.342187ms)
|
||||
✔ roles without the field behave exactly as before (428.512574ms)
|
||||
✔ a business with no role definitions at all is unlimited (306.108045ms)
|
||||
✔ a malformed messaging field refuses at boot (93.721602ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (321.937581ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (321.962777ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (235.205352ms)
|
||||
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (191.579272ms)
|
||||
✔ startup token refusal returns safe code without value or partial listening broker (42.463673ms)
|
||||
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (176.188663ms)
|
||||
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (195.297685ms)
|
||||
✔ trusted host registers later launches; socket clients never have a registration verb (174.359739ms)
|
||||
✔ runtime excludes declared project roots even when host supplies no repoRoots (44.582952ms)
|
||||
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (180.648335ms)
|
||||
✔ a reply is listed for human and reader sessions, and its delivery rows are unchanged (240.521528ms)
|
||||
✔ the reply still reaches the human message.receive (mosaic talk) after the Console showed it (222.597345ms)
|
||||
✔ a message with no reply gives an empty list (161.181572ms)
|
||||
✔ replies come oldest first and stop at REPLIES (756.113475ms)
|
||||
✔ an id that names no message in the business refuses message-not-found, and the refusal is recorded (308.561338ms)
|
||||
✔ strict arguments; a role session gets human-required (377.503076ms)
|
||||
✔ views passes replies through as one call with the id (0.234964ms)
|
||||
✔ requirements returns the committed list to a holding role session, and no one else (243.860041ms)
|
||||
✔ the PM's prd.approve with no task, when no id fits, reaches the human's Inbox (153.643696ms)
|
||||
✔ the PM's non-blocking role.revoke with no task reaches the human's Inbox (190.345696ms)
|
||||
✔ a push is recorded as the action.allowed for git.push.working on the task, and only the host records one (255.264425ms)
|
||||
✔ review.request names the latest pushed commit and sends the reviewer a REVIEW-REQUEST (250.606904ms)
|
||||
✔ review.request says which run holds the reviewer role, or null, and a null request waits for a claim (299.987466ms)
|
||||
✔ review.request refuses a commit that isn't the latest push, a non-reviewer and a role without the action (373.816028ms)
|
||||
✔ reviewFetch answers only the addressed reviewer, for the request it cites (245.32091ms)
|
||||
✔ review.verdict answers one request once, to the role that asked (323.185677ms)
|
||||
✔ task.close on a pushed task needs an approve verdict for the latest push (367.460325ms)
|
||||
✔ a refusal the host decided is filed on the task it names, and only a task ref counts (260.999371ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1443.951342ms)
|
||||
✔ gated approval authorizes once, survives store reopen, and fresh approval works (256.775933ms)
|
||||
✔ another run cannot consume an approval; a failed check leaves it usable (224.573338ms)
|
||||
✔ two scheduled callers have exactly one grant and one consumed refusal (158.575429ms)
|
||||
✔ failed commit rolls consumption back; cross-role consumes and within-role stays reusable (329.461087ms)
|
||||
✔ class drift gated to cross-role refuses before consumption (237.157184ms)
|
||||
✔ class drift cross-role to gated refuses before consumption (246.319354ms)
|
||||
✔ class drift gated to within-role refuses before consumption (230.76648ms)
|
||||
✔ class drift cross-role to within-role refuses before consumption (249.744102ms)
|
||||
✔ class drift within-role to gated refuses before consumption (188.575788ms)
|
||||
✔ class drift within-role to cross-role refuses before consumption (194.111241ms)
|
||||
✔ message.send consumes approval and prevents a later send or authorize (212.87613ms)
|
||||
✔ role.revoke consumes approval and prevents a later revoke or authorize (226.015969ms)
|
||||
✔ a business that never switched launches reads allowed with no time and no event (140.411764ms)
|
||||
✔ launches revoked and then restored read allowed, with the restore time and event id (145.90977ms)
|
||||
✔ a task closed on the tracker leaves the open list, and total counts the open ones (149.277021ms)
|
||||
✔ a tombstone is not open (149.281574ms)
|
||||
✔ the open list stops at the cap and says so; total still counts every open task (138.836315ms)
|
||||
✔ a role and a reader session read state; arguments, and an unbound cap, refuse (137.568781ms)
|
||||
✔ a human session reads the same state, with the same cap (154.442168ms)
|
||||
✔ reading state writes nothing: every table keeps its row count (165.173848ms)
|
||||
✔ creates private WAL store and excludes a second writer until explicit close (138.926326ms)
|
||||
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (178.206283ms)
|
||||
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (190.258456ms)
|
||||
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (172.572461ms)
|
||||
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (108.075384ms)
|
||||
✔ async transactions refuse before invoking their function (104.911114ms)
|
||||
✔ the session default fits under the reply cap and pages to the end with next (292.156918ms)
|
||||
✔ the short form: no description, assignees by role, every listed key (239.634855ms)
|
||||
✔ each filter, alone and together, and total counts every match (328.125258ms)
|
||||
✔ task_ref reads one task in full, as the whole board has it (286.331155ms)
|
||||
✔ no arguments is the read the Console and mosaic make, unchanged (258.084957ms)
|
||||
✔ an unknown argument or a bad value refuses invalid-request (911.33054ms)
|
||||
✔ tasks rows carry priority and requirement for every session that reads tasks (298.469081ms)
|
||||
✔ the read model rebuilds from the ledger: a reopened bus and each trail give the same values (342.126176ms)
|
||||
✔ an empty business and one with snapshots but no task.created read cleanly (130.487503ms)
|
||||
✔ recordTask keeps sync reads and a role write apart (179.868396ms)
|
||||
✔ read_at must be one canonical UTC format, so the projection compares strings safely (104.172719ms)
|
||||
✔ a bad entry refuses the whole record (108.660687ms)
|
||||
✔ taskView reads the projection for one business (137.276954ms)
|
||||
✔ requestTask hands only a holder and a task verb to the handler, and records refusals (238.605613ms)
|
||||
✔ the server sends task verbs to the adapter with its own timeout; other verbs stay synchronous (411.381055ms)
|
||||
✔ without an adapter the server refuses every task verb (209.709622ms)
|
||||
✔ the runtime refuses an invalid adapter and closes a valid one (216.568231ms)
|
||||
✔ the process loads the S3 adapter from plain-data trackers (298.183332ms)
|
||||
✔ the tester binds only when the business sets bus.tester to exactly true (813.886759ms)
|
||||
✔ a business may not name a role tester, so the tester address is never a role (244.22888ms)
|
||||
✔ every verb outside the tester list refuses tester-refused and is recorded against the tester (522.592589ms)
|
||||
✔ a tester message is from tester, starts [mos test], and writes no human.input or authority (203.609637ms)
|
||||
✔ a role answers a tester only in reply to a tester message, and the answer never reaches the human (216.547593ms)
|
||||
✔ the tester reads the human views a reader reads (128.617857ms)
|
||||
✔ tester proof binds its own CLI, start time and nonce, refuses a managed run and allows an agent (1.775012ms)
|
||||
✔ neither CLI's nonce proves the other: each proof is bound to its own CLI and nonce variable (0.482801ms)
|
||||
✔ testerNonce reads only the tester's variable and gives null on any read error (0.244644ms)
|
||||
✔ an envelope carries exactly one of cap, human and tester; no tester authenticator refuses (87.945597ms)
|
||||
✔ tester-cli.mjs binds through the runtime when the switch is on, and refuses off or under a run marker (891.089175ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (334.747587ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1039.350596ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (310.440802ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (2829.896629ms)
|
||||
✔ REQ-MSG-1: a reply can't carry one thread instance's thread to another thread instance (100.161658ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (150.273716ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (150.290169ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (147.182849ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (102.228668ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (140.873501ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (448.299207ms)
|
||||
✔ socket capability stamps launch identity; shared views use wire, no SQL client (146.816814ms)
|
||||
✔ two wire claims serialize; a lost reply never automatically retries (174.244183ms)
|
||||
✔ malformed, oversized and identity-forging envelopes refuse without echoing input (109.303811ms)
|
||||
✔ client preserves UTF-8 when a response divides a multibyte character (11.862239ms)
|
||||
✔ committed mutation followed by dropped reply reports unknown and is never retried (151.547928ms)
|
||||
ℹ tests 182
|
||||
ℹ suites 0
|
||||
ℹ pass 182
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 7495.22001
|
||||
@@ -0,0 +1,101 @@
|
||||
✔ the role file loads and resolves through loadBusiness (6.673029ms)
|
||||
✔ the shipped file is exactly the approved list (0.688073ms)
|
||||
✔ the assistant's authority is message.send within role and nothing else (2.031439ms)
|
||||
✔ the assistant talks to the user and the chief of staff only, and no other shipped role is limited (0.688006ms)
|
||||
✔ a business grant through limits does not widen the role (1.506233ms)
|
||||
✔ a launch block whose by is the assistant is refused (1.819531ms)
|
||||
✔ the instance takes no credential references and no tracker (3.011239ms)
|
||||
✔ the contract passes work to the chief of staff and directs no one (0.724342ms)
|
||||
✔ config directory and file path follow MOSAIC_CONFIG (1.274673ms)
|
||||
✔ the fixture business validates and comes back frozen (5.245567ms)
|
||||
✔ two instances may share a definition (2.043073ms)
|
||||
✔ top-level refusals (6.670278ms)
|
||||
✔ arbiters and projects (5.957781ms)
|
||||
✔ role instances (2.903789ms)
|
||||
✔ Vikunja bots (6.528239ms)
|
||||
✔ a role without Vikunja takes no tracker block (2.222608ms)
|
||||
✔ credential references match the definition's services (2.472293ms)
|
||||
✔ launch (7.613731ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 launch.threadIdleSeconds: absent is the default, a positive integer is used, anything else refuses (3.624921ms)
|
||||
✔ loadBusiness: file checks (1.662276ms)
|
||||
✔ loadBusiness: not a regular file (36.523896ms)
|
||||
✔ loading writes nothing (1.009122ms)
|
||||
✔ names that are Object.prototype properties don't count as declared (2.54482ms)
|
||||
✔ the shipped example refuses as written and validates once filled in (0.730821ms)
|
||||
✔ the role file loads and resolves through loadBusiness (7.885377ms)
|
||||
✔ the shipped file is exactly the approved list (0.219996ms)
|
||||
✔ the resolved record matches the approved list, so a widened file fails (1.599447ms)
|
||||
✔ the chief of staff holds role.launch and message.send; every other action is gated (1.224409ms)
|
||||
✔ the pm does not hold role.launch (1.382469ms)
|
||||
✔ a business grant of a gated action through limits does not widen the role (1.917161ms)
|
||||
✔ a limit that drops role.launch leaves the chief of staff with no launch block (1.444097ms)
|
||||
✔ a launch block whose by is the pm instance is refused (1.638991ms)
|
||||
✔ the contract names no duty to talk to the human and the pm contract no launch (0.391063ms)
|
||||
✔ the instance takes no credential references and no tracker (3.013584ms)
|
||||
✔ usage errors exit 4 (270.409462ms)
|
||||
✔ validate: a good business exits 0 and prints instance digests (63.802571ms)
|
||||
✔ validate: project files (309.748502ms)
|
||||
✔ validate: missing files and a broken system config (227.099012ms)
|
||||
✔ validate: credential reference problems exit 2 and name each one (62.326815ms)
|
||||
✔ validate: a token file inside the repository is refused (65.898812ms)
|
||||
✔ validate: role definitions come from MOSAIC_ROLES_DIR (187.635669ms)
|
||||
✔ resolve: prints one instance's record (251.868186ms)
|
||||
✔ resolve: refusals (370.674644ms)
|
||||
✔ parse: exactly one of file or env, plus the service's date (3.167577ms)
|
||||
✔ check: a good file has no problems (0.989851ms)
|
||||
✔ check never opens the file: a write-only token passes (0.435111ms)
|
||||
✔ check: file problems (1.232498ms)
|
||||
✔ check: token files can't live in the repository or dataRoot, even through a linked directory (1.144794ms)
|
||||
✔ check: dates and environment references (0.51359ms)
|
||||
✔ REQ-LIMIT-1 schema: every scope unset or zero, adjustable above four, bad values and unknown models refuse (12.451233ms)
|
||||
✔ REQ-LIMIT-1 counts each exact scope at/over limit, unlimited and old tuple after model reassignment (0.959915ms)
|
||||
✔ REQ-ROLE-3 writer: atomic validated revision, immutable previous bytes and authenticated actor/old/new receipt (186.963513ms)
|
||||
✔ REQ-ROLE-3 writer: pre-rename fault leaves old file, post-rename recovery records commit, conflicting recovery refuses (160.38777ms)
|
||||
✔ REQ-LIMIT-1 / decision145 migration prints only, preserves values, rejects ambiguity, and is idempotent (2.90625ms)
|
||||
✔ REQ-LIMIT-1 shared settings validates the complete proposed selection and logs exact actor (97.624346ms)
|
||||
✔ REQ-LIMIT-1 provider is table data: another provider routes separately and aliases share exact counts (1.716956ms)
|
||||
✔ REQ-ROLE-3 refuses live writer locks, symlink targets and uncertain recovery without changing bytes (61.993291ms)
|
||||
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (11.991817ms)
|
||||
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (239.384302ms)
|
||||
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (38.730269ms)
|
||||
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.259554ms)
|
||||
✔ path and load (2.718913ms)
|
||||
✔ refusals (1.4032ms)
|
||||
✔ systemVars flattens the validated config (2.613091ms)
|
||||
✔ precedence: system, business, project, project role, agent (6.636188ms)
|
||||
✔ limits narrow the definition and never widen it (2.205217ms)
|
||||
✔ role.launch stays within-role only for the instance the launch block names (5.129856ms)
|
||||
✔ limits.authority without role.launch leaves the launcher with no launch block (1.789277ms)
|
||||
✔ limits.authority narrows cross-role actions too (1.002774ms)
|
||||
✔ classify (1.033514ms)
|
||||
✔ the record carries what the broker and launcher need (0.990748ms)
|
||||
✔ digest: key order doesn't matter, any value change does (5.382373ms)
|
||||
✔ refusals (1.768506ms)
|
||||
✔ the four shipped version 2 roles load (3.343741ms)
|
||||
✔ shipped role scopes match addendum B section 2 and the SR runbook (1.070552ms)
|
||||
✔ shipped authority follows the note's table (0.895586ms)
|
||||
✔ every role file in roles/ loads through the validator, and a v2 contract exists (0.713023ms)
|
||||
✔ version 1 files keep loading with no authority (1.004413ms)
|
||||
✔ the conductor policy isn't a role (0.245265ms)
|
||||
✔ a missing role file is exit 4, a symbolic link too (0.438429ms)
|
||||
✔ version 2 refusals (1.772883ms)
|
||||
✔ authority: closed vocabulary, no gated-only action, no overlap (2.286027ms)
|
||||
✔ messaging: optional, role definitions and human, never the tester (1.636209ms)
|
||||
✔ credentials: Gitea scopes (1.554171ms)
|
||||
✔ credentials: Vikunja scopes are a group-to-verbs map from the grantable list (0.916954ms)
|
||||
✔ credentials: services (0.477401ms)
|
||||
✔ contract: a non-empty regular Markdown file beside the role file (0.618837ms)
|
||||
✔ every key names known layers and a merge rule (1.083951ms)
|
||||
✔ unknown keys and wrong layers refuse (0.953603ms)
|
||||
✔ types (2.490186ms)
|
||||
✔ merge: defaults, then the most specific layer wins (0.377813ms)
|
||||
✔ merge: limits only narrow, and provenance lists each source (0.455691ms)
|
||||
✔ merge doesn't change its inputs (0.195409ms)
|
||||
ℹ tests 93
|
||||
ℹ suites 0
|
||||
ℹ pass 93
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 1881.461029
|
||||
@@ -0,0 +1,212 @@
|
||||
✔ every screen and overlay fits 120x36, 80x24 and the narrow layout, row for row (1246.873903ms)
|
||||
✔ width counts terminal cells: wide CJK and emoji 2, U+FE0F after a one-cell base 1, marks 0 (61.567672ms)
|
||||
✔ broker text is shown, never interpreted: no raw control character or bidi override reaches the terminal (150.156535ms)
|
||||
✔ NO_COLOR: no escape codes, except reverse video on the selected row (216.934693ms)
|
||||
✔ 1-9 shows the decide flow's own lines and question; only y resolves (430.867165ms)
|
||||
✔ the app shows the same decide text as mosaic decide (476.311017ms)
|
||||
✔ any key but y or Y at the question answers No; nothing is sent (2953.266487ms)
|
||||
✔ below 40x10 the question is hidden, so every key answers it No, y included (Filbert R3) (617.527463ms)
|
||||
✔ under 40 columns a tall terminal shows the too-small screen even where the decide box would fit; y sends nothing (Filbert N10) (1599.888439ms)
|
||||
✔ a hidden decide box names the way out, and the status line under it does not promise y (Filbert N12) (103.362486ms)
|
||||
✔ a throw while answering the question goes to crash, sends nothing and leaves no job pending (115.205025ms)
|
||||
✔ type-ahead never answers the question: a paste, keys typed before it is drawn, keys inside askMs (841.841387ms)
|
||||
✔ quitting at the question answers No and sends nothing, armed or not (295.833505ms)
|
||||
✔ a timer tick reads nothing under an overlay, never answers the question, and keeps a resolved status (202.282524ms)
|
||||
✔ a long question is cut inside the question; the action, target, choice and prompt stay (Dewey B1) (157.522528ms)
|
||||
✔ a decide box too big for the terminal says so, and every key answers it No, y included (Dewey B1, round 3) (1067.837647ms)
|
||||
✔ at every size the decide box shows each line y depends on, or says it is hidden (7992.253745ms)
|
||||
✔ outcome unknown: the CLI's sentence, no retry, then the trail or a re-read (157.438938ms)
|
||||
✔ refused and failed reads keep the last list, marked stale; a refused decide says refused (120.188453ms)
|
||||
✔ help or a detail box cut to fit keeps its last line, Esc included (Dewey) (81.125784ms)
|
||||
✔ keys: views, moving, trail of a selection, the command line, help and quit (257.555738ms)
|
||||
✔ one option: the status line says Press 1, not 1-1 (125.280449ms)
|
||||
✔ no business: the app says so and :business picks one (63.824846ms)
|
||||
✔ mosaic with no argument: exit 3 in an agent run, exit 4 with the usage off a terminal, the app on one (1.936579ms)
|
||||
✔ scripts/mosaic with no argument reaches the app entry; the seat usage it printed before has not drifted (169.969962ms)
|
||||
✔ strings to keep exactly live once, in the decide flow and the transport; the app does not restate them (0.415076ms)
|
||||
✔ decide with --note still asks; a No sends nothing (65.803746ms)
|
||||
✔ the app's business comes from a live bus host only (1.09917ms)
|
||||
✔ runApp leaves the terminal as it found it on q, end of input, SIGTERM, SIGINT, SIGHUP and an error, the first frame's included (7.085826ms)
|
||||
✔ draw is pure: same state, same frame (0.718226ms)
|
||||
✔ inbox lists only decisions routed to the human, with what approving authorizes and how to decide (173.131372ms)
|
||||
✔ decide resolves by id prefix with --yes, and the trail shows it in broker order with the task to follow (134.224267ms)
|
||||
✔ decide refuses without a terminal or --yes, on an unknown option and on a short reference (102.89139ms)
|
||||
✔ decide prints a declining choice as declining (136.486447ms)
|
||||
✔ an unknown outcome is reported once and never resent (165.513514ms)
|
||||
✔ a decision closed before the answer arrives exits 2 and points at its trail (318.896952ms)
|
||||
✔ a prefix that matches two open decisions exits 2 and resolves neither (308.156029ms)
|
||||
✔ without --business a command uses the live host's business, and a stale host.json is not a host (116.030648ms)
|
||||
✔ every human command refuses inside an agent run before it touches the bus (269.723462ms)
|
||||
✔ usage errors exit 4; no business and no host is a usage error (127.144777ms)
|
||||
✔ agents and tasks print through the broker (653.340666ms)
|
||||
✔ notify.json: missing, loose, malformed and extra keys refuse; a binding or null passes (1.125765ms)
|
||||
✔ bootConfig builds the broker's boot message for one business, with no trackers key when no project names one (65.672954ms)
|
||||
✔ trackers come from the tracker.* variables of the one project that names a tracker project (81.672462ms)
|
||||
✔ with two projects, the one that sets tracker.project supplies the tracker and the other is no conflict (38.236156ms)
|
||||
✔ two projects that each name a tracker project refuse, since the boot shape holds one (36.768001ms)
|
||||
✔ a business without tracker.baseUrl gets no trackers entry (33.921232ms)
|
||||
✔ an unknown business and a broken system config refuse with exit 3 (75.421272ms)
|
||||
✔ follow prints an unsolicited message after plain talk returned (240.876411ms)
|
||||
✔ talk --follow continues after reply and prints a later unsolicited message (194.284352ms)
|
||||
✔ inbox lists all unread human messages under decisions, does not deliver or read them (5305.188984ms)
|
||||
✔ follow refuses agent context and bad arguments (91.697139ms)
|
||||
✔ follow Ctrl-C wakes the poll sleep and removes its handler; transport errors also clean up (214.330779ms)
|
||||
✔ plain talk leaves the process SIGINT handlers unchanged (364.901336ms)
|
||||
✔ empty views say so (0.966656ms)
|
||||
✔ the trail keeps the broker's order and names a decision's task without its rows (1.271022ms)
|
||||
✔ tasks print the tracker fields the snapshot carries (0.223654ms)
|
||||
✔ the review loop: the coder pushes and asks, the reviewer fetches and approves, and the task's trail holds each step (767.558591ms)
|
||||
✔ refusals: no action, non-fast-forward, an unknown commit or request, and a push for another task moves only that task's ref (1117.075608ms)
|
||||
✔ the size cap refuses a push before any byte (833.525324ms)
|
||||
✔ a fetch over the cap refuses before any byte reaches the reviewer (1599.884544ms)
|
||||
✔ the socket refuses a request with no capability, an unknown one, and a bad request line (833.103381ms)
|
||||
✔ a rigged clone runs nothing: hooks, fsmonitor, a filter, a gitlink and a symlinked .git/config leave no marker (517.264392ms)
|
||||
✔ an identity with no role, or of another business, refuses not-a-role and moves no ref (597.448422ms)
|
||||
✔ a review of a project the business no longer has refuses unknown-project (431.131109ms)
|
||||
✔ past maxActive connections the socket refuses git-busy, and a hung-up connection frees its slot (371.049212ms)
|
||||
✔ close() answers host-closing to a connection still sending its request line (415.770501ms)
|
||||
✔ a bundle that trickles in refuses body-timeout at its deadline and frees its slot (764.473583ms)
|
||||
✔ a reviewer gone before its bundle was sent is filed fetch-aborted, not as the host's fault (644.848377ms)
|
||||
✔ a reviewer that hangs up the moment it has the whole bundle was served, not aborted (872.396488ms)
|
||||
✔ send: a close after every byte left is served; one that fails a queued write is fetch-aborted (42.871419ms)
|
||||
✔ a bundle with no bytes for bodyIdle refuses body-timeout long before its deadline (592.428681ms)
|
||||
✔ send: a close once the loop is past its last chunk is served, and a failed write there is fetch-aborted (22.80935ms)
|
||||
✔ letGo waits for an answer to leave for at most its cap, then destroys the socket (301.365142ms)
|
||||
✔ a record that fails and can't be undone refuses rollback-failed, which the host logs (433.665065ms)
|
||||
✔ the host boots the broker, binds a launch in process, and the notifier DMs a blocking decision exactly once (1025.043174ms)
|
||||
✔ a notifier that dies takes the host down with exit 1, so the unit restarts the pair (414.123172ms)
|
||||
✔ a second host for the same data root refuses with exit 3 while the first runs (360.717194ms)
|
||||
✔ two bus starts racing for one data root leave one host running; the other refuses that a host already runs (1060.496664ms)
|
||||
✔ a host takes over a host.lock its dead host left, and puts back a live claim that replaced it meanwhile (3.462709ms)
|
||||
✔ 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.714239ms)
|
||||
✔ a live host's lock stays, however old the file is (0.504318ms)
|
||||
✔ a host.lock left by a host killed with SIGKILL doesn't stop the next bus start (1178.959042ms)
|
||||
✔ while a host boots, a reader sees no host: the human commands still ask for --business, stop and status find none (193.964907ms)
|
||||
✔ a host started before host.lock existed, holding only host.json, still refuses a second start, which leaves no lock (27.461289ms)
|
||||
✔ a broker fork that throws leaves no host.lock and no host.json (31.595911ms)
|
||||
✔ a broker send that throws leaves no host.lock and no host.json (28.148254ms)
|
||||
✔ a broker that misses its boot wait leaves no host.lock and no host.json (31.303892ms)
|
||||
✔ a notifier fork that throws stops the broker and leaves no host.lock and no host.json (559.908529ms)
|
||||
✔ a notifier send that throws stops the broker and leaves no host.lock and no host.json (221.829803ms)
|
||||
✔ 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 (166.079213ms)
|
||||
✔ 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 (166.500506ms)
|
||||
✔ a host.json that can't be written stops both children and leaves no host.lock (256.471328ms)
|
||||
✔ an error event on the broker before it replies fails the start at once, and leaves no host.lock and no live child (27.919966ms)
|
||||
✔ an error event on the notifier before it replies fails the start at once, and leaves no host.lock and no live child (182.011245ms)
|
||||
✔ an error event on the broker while the notifier starts fails the start once the notifier replies (477.744278ms)
|
||||
✔ 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 (271.74172ms)
|
||||
✔ 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 (327.51071ms)
|
||||
✔ a broker reply that misses the wait breaks the channel: the late reply answers nothing, later requests refuse, the host exits 1 (1236.199992ms)
|
||||
✔ a broker reply with another request's id, or none, breaks the channel and the host exits 1 (323.027726ms)
|
||||
✔ a broker reply with no request waiting breaks the channel and the host exits 1 (192.543777ms)
|
||||
✔ a notifier that refuses stops the broker and the host refuses with exit 3 (264.258998ms)
|
||||
✔ a notifier that refuses after the broker died still refuses with exit 3, without a send to the dead broker (259.879471ms)
|
||||
✔ a notifier that dies before it replies, after the broker died, still refuses, without a send to the dead broker (148.36981ms)
|
||||
✔ a close send that fails with EPIPE after the notifier refuses still gives the notifier's refusal, exit 3 (358.058858ms)
|
||||
✔ a close send that fails with EPIPE after the notifier dies unanswered still gives the notifier's error (159.359333ms)
|
||||
✔ close() whose stop and close sends fail with EPIPE still finishes, with exit 1 (285.165031ms)
|
||||
✔ watchChildren reports a child that died before it was called, and one that dies later (24.667631ms)
|
||||
✔ bus stop refuses to signal a live pid that is not a bus host (202.464624ms)
|
||||
✔ bus start refuses with exit 3 and the code when the broker refuses to boot; bus status names the lock (241.147388ms)
|
||||
✔ bus start refuses with exit 3 without a notifier config (108.03354ms)
|
||||
✔ bus start runs until bus stop; status reports it while it runs (734.043677ms)
|
||||
✔ bus-service.sh renders the unit and installs it into a given directory (59.018083ms)
|
||||
✔ bus-service.sh pins the claude binary, refuses one the unit can't carry, and renders without one (73.607124ms)
|
||||
✔ bus-service.sh refuses a directory pin and keeps a symlink default unresolved (15.305668ms)
|
||||
✔ bus-service.sh refuses a default claude without the execute bit, or in a PATH dir with a space (9.366479ms)
|
||||
✔ each launch rereads limits and model selections; lowered limits keep sessions and log exact hit (39.929563ms)
|
||||
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1382.230645ms)
|
||||
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (1474.483313ms)
|
||||
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (3211.869566ms)
|
||||
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (391.915527ms)
|
||||
✔ a runner that stops at once ends its launch with the runner's reason (314.029667ms)
|
||||
✔ a Claude Code launch with no session credential refuses before it starts (246.549486ms)
|
||||
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (352.143383ms)
|
||||
✔ a runner killed from the host ends its launch as killed, not failed (375.727248ms)
|
||||
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (181.858822ms)
|
||||
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1337.891855ms)
|
||||
✔ 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 (934.503737ms)
|
||||
✔ 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 (3683.866557ms)
|
||||
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (121.45517ms)
|
||||
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (133.69423ms)
|
||||
✔ a launch client that never closes its side doesn't hold the host's close (160.13703ms)
|
||||
✔ a runner that ignores SIGTERM is killed when the host closes (1269.234627ms)
|
||||
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.574685ms)
|
||||
✔ migration needs no bus/config, prints whole converted document, is idempotent and never writes (16.27937ms)
|
||||
✔ limits view/set use the human bus transport and pass only the explicit patch (1.991507ms)
|
||||
✔ post-119 example and Jason fixture migrate with checked inherited models; wrong or absent config refuses (218.233916ms)
|
||||
✔ zoned uses the IANA zone across DST (27.810269ms)
|
||||
✔ each open blocking decision is DM'd once, across polls and a restart; non-blocking ones are not (169.563121ms)
|
||||
✔ two blocking decisions get two DMs with different nonces (132.346816ms)
|
||||
✔ the digest nonce differs per business and per day and fits Discord's 25 characters (0.217437ms)
|
||||
✔ a failed DM is journaled, backs off, and is retried until it lands (119.642304ms)
|
||||
✔ five definite refusals stop a DM: one gave-up line, one log line, and a restart keeps the count (117.890737ms)
|
||||
✔ 429s, 5xx-style unknowns and refusals without a status never count toward the limit (126.44429ms)
|
||||
✔ a crash between the fifth refusal and its gave-up line: the next poll appends it and sends nothing (257.644051ms)
|
||||
✔ 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 (461.221036ms)
|
||||
✔ a restart after the second refusal does not send before that refusal's 30 min are up (159.589714ms)
|
||||
✔ the digest goes at 08:00 Chicago once a day, with blocking ones marked as DM'd (320.623762ms)
|
||||
✔ a late start with no digest for the day sends one at once; an empty inbox gets one line (664.552485ms)
|
||||
✔ an inbox read failure is logged and the next poll retries (0.647429ms)
|
||||
✔ no Discord id reaches the journal or the log (129.641948ms)
|
||||
✔ the journal: a torn tail is copied out and truncated, so an append after it reopens cleanly (27.588756ms)
|
||||
✔ the journal: a crash between the copy and the truncate leaves a tail the next open repairs (49.994378ms)
|
||||
✔ the journal: a whole file that is one torn line truncates to empty (142.169616ms)
|
||||
✔ the journal: a malformed complete line refuses and leaves the file and any torn tail alone (3.372543ms)
|
||||
✔ the journal: a loose file mode, a loose directory or a symlinked journal refuses (0.697003ms)
|
||||
✔ the journal: a line with a wrong type refuses with exit 3 and names the field (1.954025ms)
|
||||
✔ the journal: a symlinked directory refuses and says it is a link (0.35151ms)
|
||||
✔ 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.479238ms)
|
||||
✔ the journal: an append after the file was swapped for a symlink refuses and writes nothing through it (0.381549ms)
|
||||
✔ the journal: a directory it cannot write or create refuses with exit 3 and names the path (0.463313ms)
|
||||
✔ digest content stays within Discord's 2000 characters (0.289345ms)
|
||||
✔ runLoop never overlaps ticks and stops after the one in flight (111.117534ms)
|
||||
✔ a human command refused with human-required prints the other-tree line and exits 3 (3.116017ms)
|
||||
✔ a --tester command refused with tester-required prints the other-tree line and exits 3 (1.142411ms)
|
||||
✔ other exit-3 refusals print no other-tree line (1.782719ms)
|
||||
✔ the line names no path (0.152442ms)
|
||||
✔ shared copy: npm ci, pushed reachability, readonly/existing copy, webui delegation (694.273143ms)
|
||||
✔ wrapper preserves Q81 lease and marker, rejects foreign/symlink; check uses effective roots (422.534369ms)
|
||||
✔ bus unit copy/pm pins, install refuses all busy states and failed reads, drop-in refusal (444.066689ms)
|
||||
✔ missing package manifest refuses before npm; npm failure removes the unpublished temp copy (468.351034ms)
|
||||
✔ real pinned install loads bus and Console; same-copy mosaic talk passes proof, other trees refuse (4297.092998ms)
|
||||
✔ bus status reads effective copy/pm/drop-ins without writes; check refuses an overridden ExecStart (468.628151ms)
|
||||
✔ drop-ins in either override field and malformed metadata refuse; uninstall also checks --no-reload (176.863223ms)
|
||||
✔ install never shows a template name on systemd 261; template drop-ins still refuse (185.393773ms)
|
||||
✔ unlisted instance drop-in is found in another unit lookup directory; path discovery errors refuse (180.483924ms)
|
||||
✔ inherited mosaic-.service.d override refuses without changing the unit (202.637478ms)
|
||||
✔ inherited service.d override refuses without changing the unit (200.29824ms)
|
||||
✔ inherited drop-in unreadable directory or file refuses before writing (180.761978ms)
|
||||
✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (201.418004ms)
|
||||
✔ talk --tester refuses text without the [mos test] prefix before any call (117.611347ms)
|
||||
✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (110.369197ms)
|
||||
✔ decide, stop and launches take no --tester (110.073823ms)
|
||||
✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.330523ms)
|
||||
✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.483489ms)
|
||||
✔ 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 (6326.186122ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (1713.564818ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (4460.372926ms)
|
||||
✔ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (105.949885ms)
|
||||
✔ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (221.845555ms)
|
||||
✔ 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 (242.594246ms)
|
||||
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (93.243847ms)
|
||||
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 (434.102376ms)
|
||||
✔ the transport writes {business, verb, args} to the child and reads its JSON (40.450745ms)
|
||||
✔ a bus code on stderr becomes the exit code; garbage and timeouts are outcome problems (2152.665894ms)
|
||||
✔ busExit and refuseInsideAgent (0.493953ms)
|
||||
✔ talk sends a REQUEST, prints and reads everything that arrives, and stops at the reply (231.87768ms)
|
||||
✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1132.788723ms)
|
||||
✔ a late reply the Console has listed still reaches the next talk (2365.850751ms)
|
||||
✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (709.708671ms)
|
||||
✔ launches off and on go to the broker and change the business's launch state (355.944307ms)
|
||||
✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (147.387257ms)
|
||||
ℹ tests 202
|
||||
ℹ suites 0
|
||||
ℹ pass 202
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 19734.834486
|
||||
@@ -0,0 +1,92 @@
|
||||
✔ sessionModel: agent vars win, then the system's execution settings (12.889085ms)
|
||||
✔ a pi bundle: prompt, policy, tools and manifest, 0600 in a 0700 directory (5.085926ms)
|
||||
✔ a chief-of-staff bundle lists launch among the bus tools and the manifest's typed tools (2.223859ms)
|
||||
✔ a claude-code bundle adds the wrapped gate hook and the MCP config (2.257ms)
|
||||
✔ the prompt's built-in tools line is the harness's own names, as the manifest lists them (8.745906ms)
|
||||
✔ the prompt names the project clones in the workspace, and none when there are none (6.689266ms)
|
||||
✔ the prompt explains the review loop to a role with push_working, and reviews to one with fetch_review (7.586157ms)
|
||||
✔ a bundle is written once: an existing file refuses (1.436797ms)
|
||||
✔ a path with a single quote can't go into the hook command (2.026647ms)
|
||||
✔ allow exits 0, a deny exits 2 with the reason on stderr (127.564329ms)
|
||||
✔ a missing or wrong policy, or a bad event, exits 2 (90.199177ms)
|
||||
✔ the bundle's wrapped command: a missing gate or node still blocks (1080.268615ms)
|
||||
✔ claude: typed tools through MCP, the hook blocks, builtins outside --tools don't exist (746.417629ms)
|
||||
✔ claude: the hook alone blocks a path outside the workspace (429.797634ms)
|
||||
✔ claude: a second turn resumes the first turn's session (739.201231ms)
|
||||
✔ claude adapter: --restricted is always passed (5.31313ms)
|
||||
✔ claude adapter: MOSAIC_CLAUDE_BIN wins over PATH and must be an absolute executable (16.640679ms)
|
||||
✔ claude adapter: a directory pin exits 2 before it runs; a pin with a space runs (5.833519ms)
|
||||
✔ claude: CLAUDE.md files and auto-memory don't reach the model; without --restricted they do (703.469709ms)
|
||||
✔ claude: a missing hook or MCP file refuses before claude starts (7.232319ms)
|
||||
✔ pi: policy tools and typed tools pass, anything else is blocked (2.894013ms)
|
||||
✔ claude: builtins map from pi names, typed tools need the mcp prefix (0.601348ms)
|
||||
✔ file tool paths must resolve inside the workspace (1.174216ms)
|
||||
✔ pi's own path normalisation can't be used to step out (0.940164ms)
|
||||
✔ a symlink inside the workspace that points out is outside (0.84133ms)
|
||||
✔ a dangling symlink is refused at any depth, in both harnesses (3.299988ms)
|
||||
✔ read is checked under every spelling pi's read would open, in both harnesses (16.749325ms)
|
||||
✔ other spellings cover directories, dangling links and pi's cwd (1.473866ms)
|
||||
✔ a relative path climbs from the workspace's real path, in both harnesses (4.689979ms)
|
||||
✔ claude path fields per tool (0.920298ms)
|
||||
✔ glob patterns stay inside the workspace (0.905666ms)
|
||||
✔ a path that can't be checked is blocked (0.370846ms)
|
||||
✔ fetch_review's have lists the working refs before origin's, and no more than HAVE_MAX (214.936069ms)
|
||||
✔ fetch_review's have orders the working refs newest first within each clone, one clone after another (127.758917ms)
|
||||
✔ a runner git past its time: SIGTERM reaches its process group, and SIGKILL follows after the grace period (1809.740168ms)
|
||||
✔ once a signalled runner git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too (303.908478ms)
|
||||
✔ initialize, ping and tools/list (40.728252ms)
|
||||
✔ tools/call goes through the tool socket; a refusal is an isError result (34.156428ms)
|
||||
✔ replies are compact JSON; over the cap a tool error names the size and the cap (40.960811ms)
|
||||
✔ unknown tools and methods are JSON-RPC errors and never reach the socket (29.155409ms)
|
||||
✔ a missing argument is a usage error (26.566392ms)
|
||||
✔ pi: typed tools reach the socket, the gate blocks, agent_end writes the marker (365.298149ms)
|
||||
✔ pi: a reply over the cap is a tool error naming the size and the cap; list_tasks asks for open tasks (316.991495ms)
|
||||
✔ pi: a write through a dangling symlink is blocked, and nothing appears outside (306.660399ms)
|
||||
✔ pi: a read is refused when pi would open another spelling outside (311.979704ms)
|
||||
✔ pi: a relative path climbs from the real path of a workspace behind a symlink (313.416635ms)
|
||||
✔ pi: a relative path climbs from the real path of a dataRoot behind a symlink (314.089216ms)
|
||||
✔ pi: a missing extension refuses before any model call (5.77622ms)
|
||||
✔ pi: an extension without its configuration fails pi's start (256.662603ms)
|
||||
✔ founderCheck: founder variables, then a needed service without a usable token (1.387046ms)
|
||||
✔ turnRequest names the sender, class, reply and decision (0.253092ms)
|
||||
✔ turnRequest says a tester's message is a test and never Jason's instruction (0.211573ms)
|
||||
✔ turnRequest shows the message's own sent time, a day old as well as new (0.164465ms)
|
||||
✔ stateBlock names the launch state with its time and event, and the open tasks with the cap (0.258464ms)
|
||||
✔ a message becomes a turn, the answer goes back as a RESULT, SIGTERM releases and exits 0 (252.24083ms)
|
||||
✔ launches revoked and then restored: the turn's block reads allowed and gives the restore time (258.899685ms)
|
||||
✔ a task closed on the tracker is missing from the next turn's open list (217.793193ms)
|
||||
✔ a message read a day after it was sent shows the time it was sent (165.764663ms)
|
||||
✔ a decision the human resolves becomes a turn citing the decision and the answer (203.540823ms)
|
||||
✔ a failed state read fails the turn: no adapter runs, the sender hears why, the message is read (126.659738ms)
|
||||
✔ a SIGTERM before the claim stops the runner with exit 0 and no claim (105.248413ms)
|
||||
✔ typed tools carry the runner's capability; launch goes to the host's launch socket (400.893449ms)
|
||||
✔ a RESULT gets no automatic reply; failed turns reply with the reason (1293.861118ms)
|
||||
✔ SIGTERM during a turn kills the turn's process group and still exits 0 (152.987087ms)
|
||||
✔ founder credentials stop before the claim (20) (170.957294ms)
|
||||
✔ a refused claim exits 21; an ended run's capability exits 22 (190.611433ms)
|
||||
✔ the launch ending under a running session exits 22 (144.926994ms)
|
||||
✔ a broker that stays unreachable exits 23 after brokerRetries polls (242.343432ms)
|
||||
✔ a broker that is down at the claim exits 23, not 21 (89.137101ms)
|
||||
✔ no capability, or a malformed one, on stdin exits 2 (179.299653ms)
|
||||
✔ a missing or malformed policy exits 2 before the claim (122.386806ms)
|
||||
✔ the PM gets its task verbs and the reads, and no launch (8.104718ms)
|
||||
✔ the chief of staff gets launch and send_message, and no task verbs (2.239896ms)
|
||||
✔ the assistant gets send_message and the reads, no launch (2.696098ms)
|
||||
✔ list_requirements reads the requirement ids, for a task.create holder with a tracker (3.171359ms)
|
||||
✔ a coder gets no launch, no resolve_decision, and no task tools without a tracker (1.355345ms)
|
||||
✔ a coder with a tracker gets its own task tools and no task_reassign (1.308194ms)
|
||||
✔ launch only when the business's launch block names the instance as launcher (2.770474ms)
|
||||
✔ an action outside the instance's authority has no tool (1.507608ms)
|
||||
✔ the review loop: push_working and request_review for the coder, fetch_review and review_verdict for the reviewer, none for the PM (4.043643ms)
|
||||
✔ callTool: one JSON line out, the result back, a refusal rejects (8.020255ms)
|
||||
✔ list_tasks takes the broker's filters and pages; get_task takes a task_ref (2.461054ms)
|
||||
✔ callTool sends list_tasks done false unless the session names done; other tools as given (2.653016ms)
|
||||
✔ replyText: compact JSON up to the cap, an error naming the size and the cap over it (0.798163ms)
|
||||
ℹ tests 84
|
||||
ℹ suites 0
|
||||
ℹ pass 84
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 11299.273443
|
||||
@@ -0,0 +1,29 @@
|
||||
✔ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source and limit-check at interface version 1, each a list (0.960301ms)
|
||||
✔ REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included (0.211505ms)
|
||||
✔ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (3.83536ms)
|
||||
✔ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.152534ms)
|
||||
✔ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.136426ms)
|
||||
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (7.325662ms)
|
||||
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.486252ms)
|
||||
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.425357ms)
|
||||
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.445469ms)
|
||||
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.145048ms)
|
||||
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (24.569517ms)
|
||||
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.646182ms)
|
||||
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.207908ms)
|
||||
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.888699ms)
|
||||
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.584758ms)
|
||||
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.219599ms)
|
||||
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.268649ms)
|
||||
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.640856ms)
|
||||
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (3.249069ms)
|
||||
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (103.580165ms)
|
||||
✔ REQ-PLUG-1 the loader needs a log callback (1.001438ms)
|
||||
ℹ tests 21
|
||||
ℹ suites 0
|
||||
ℹ pass 21
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 222.948477
|
||||
@@ -0,0 +1,148 @@
|
||||
✔ a first launch clones the root at its branch, with the root's path as origin (30.882428ms)
|
||||
✔ the clone is not at its place until git clone has finished (21.143824ms)
|
||||
✔ a later launch fast-forwards a clean clone after a commit to the root, then finds it current (62.324213ms)
|
||||
✔ a clone ahead of the root keeps its commits and counts as current (39.316765ms)
|
||||
▶ a dirty clone and one on another branch are fetched, and nothing but refs/remotes moves
|
||||
✔ a modified file (45.877528ms)
|
||||
✔ an untracked file (48.187542ms)
|
||||
✔ a staged file (45.198784ms)
|
||||
✔ another branch (44.80994ms)
|
||||
✔ a detached HEAD (47.873495ms)
|
||||
✔ a dirty clone and one on another branch are fetched, and nothing but refs/remotes moves (233.048451ms)
|
||||
✔ a diverged clone gets the fetch into refs/remotes and is kept, not-fast-forward (44.171508ms)
|
||||
▶ a clone kept before the branch check, or for a failed status, gets no fetch
|
||||
✔ not-a-clone (26.065515ms)
|
||||
✔ hooks-present (24.116424ms)
|
||||
✔ submodule (34.046659ms)
|
||||
✔ config-changed (32.115255ms)
|
||||
✔ root-unreadable (27.699913ms)
|
||||
✔ root-detached (34.277448ms)
|
||||
✔ status-failed, on the root's branch and clean (35.796984ms)
|
||||
✔ status-failed, dirty (35.401848ms)
|
||||
✔ a clone kept before the branch check, or for a failed status, gets no fetch (250.820069ms)
|
||||
✔ a dirty clone whose fetch fails is kept, fetch-failed, exactly as it was (40.487961ms)
|
||||
✔ every git call the host makes, for a new clone and an existing one, carries maintenance.auto=false and gc.auto=0 (43.988603ms)
|
||||
✔ a clone with loose objects enough for gc --auto gets no maintenance or gc from the fetch and the merge (74.230785ms)
|
||||
▶ a clone with user.name or user.email in its config is kept, and git runs nothing in it
|
||||
✔ user.name (29.032061ms)
|
||||
✔ user.email (27.095828ms)
|
||||
✔ a clone with user.name or user.email in its config is kept, and git runs nothing in it (56.613252ms)
|
||||
✔ a commit git can't read after the fast-forward is null (44.983755ms)
|
||||
✔ a new clone whose commit can't be read refuses the launch and leaves nothing behind (21.708565ms)
|
||||
▶ a clone the session rigged is kept, and git runs nothing and writes nothing outside it
|
||||
✔ core.fsmonitor (33.058928ms)
|
||||
✔ core.hooksPath (32.103393ms)
|
||||
✔ a hook file (31.118958ms)
|
||||
✔ include.path (33.911924ms)
|
||||
✔ includeIf (32.686813ms)
|
||||
✔ a filter driver (35.201392ms)
|
||||
✔ origin moved (38.81637ms)
|
||||
✔ a second origin url (33.000799ms)
|
||||
✔ the origin url twice, both the root (36.637305ms)
|
||||
✔ an ext:: origin (33.899859ms)
|
||||
✔ a branch tracking another remote (35.79611ms)
|
||||
✔ a branch merging a tag (37.030704ms)
|
||||
✔ a fetch line onto local branches (34.292395ms)
|
||||
✔ no origin (33.725545ms)
|
||||
✔ a config file over the size cap (33.021366ms)
|
||||
✔ config a symlink to /dev/zero (35.91555ms)
|
||||
✔ the clone a symlink to the bait (30.567749ms)
|
||||
✔ the clone a file (29.925478ms)
|
||||
✔ the clone a plain directory (31.587932ms)
|
||||
✔ .git a gitdir: file (30.667739ms)
|
||||
✔ .git a symlink (30.509638ms)
|
||||
✔ .git/logs a symlink (31.708356ms)
|
||||
✔ .git/refs/heads a symlink (32.702733ms)
|
||||
✔ .git/objects a symlink (33.655231ms)
|
||||
✔ a reflog hard-linked to a file outside (31.059925ms)
|
||||
✔ HEAD a fifo (33.997828ms)
|
||||
✔ a commondir file (30.049092ms)
|
||||
✔ an alternates file (31.808456ms)
|
||||
✔ a gitlink staged, no .gitmodules (45.098478ms)
|
||||
✔ a gitlink and .gitmodules staged (52.333342ms)
|
||||
✔ a gitlink to a repository with its own gitlink (54.650569ms)
|
||||
✔ a gitlink and .gitmodules committed (55.113778ms)
|
||||
✔ a gitlink and submodule.active in config (47.988634ms)
|
||||
✔ a .git/modules with no gitlink (34.053894ms)
|
||||
✔ a clone the session rigged is kept, and git runs nothing and writes nothing outside it (1221.865203ms)
|
||||
▶ a root that can't be cloned refuses with the project id and leaves nothing behind
|
||||
✔ missing (10.292896ms)
|
||||
✔ not a repository (9.975171ms)
|
||||
✔ a plain directory inside another repository (17.069887ms)
|
||||
✔ unreadable (11.737091ms)
|
||||
✔ on no branch (11.740168ms)
|
||||
✔ missing an object (17.457788ms)
|
||||
✔ a root that can't be cloned refuses with the project id and leaves nothing behind (79.059463ms)
|
||||
✔ a clone whose root is on no branch, or gone, is kept and named (29.306771ms)
|
||||
✔ no credential or forge remote of the root reaches a clone (49.389312ms)
|
||||
✔ every project in the business file gets its own clone at its own branch (36.043052ms)
|
||||
✔ a clone past its time gets SIGTERM and refuses the launch, with nothing left in the workspace (514.90991ms)
|
||||
✔ a clone that ignores SIGTERM gets SIGKILL once the grace period is over (1016.491457ms)
|
||||
✔ a timeout signals git's process group, so a process git started dies with it (513.447888ms)
|
||||
✔ once a signalled git has closed, its group gets SIGKILL, so a process that ignored SIGTERM dies too (514.201948ms)
|
||||
✔ RUNNER_FILES is exactly what the runner and the harness sources it starts import (1.609323ms)
|
||||
✔ sandboxProblem names a missing bwrap and a bwrap that fails (8.273159ms)
|
||||
✔ every bind says why; the bundle and session file stay read-only over the run directory (1.273045ms)
|
||||
✔ REQ-THREAD-2 a thread store binds its session directory and Claude transcripts, and nothing more (0.838041ms)
|
||||
✔ the host's git socket is bound only when given, read-only and before the writable binds (1.286299ms)
|
||||
✔ the git identity is the instance's, at <instance>@<business>.mosaic.invalid, and sandboxArgv refuses without it (1.186726ms)
|
||||
✔ a confined session's shell reaches its own workspace and run directory and nothing of the founder's or another session's (1896.626925ms)
|
||||
✔ a bind that exposes a stand-in, or a missing workspace bind, fails the matching check (2416.781539ms)
|
||||
✔ a confined session that runs tester-cli.mjs is refused as tester, and the same shim outside the sandbox binds (265.175399ms)
|
||||
✔ resolveSeat: by name under --repo resolves the repo layout (1.252144ms)
|
||||
✔ resolveSeat: by path resolves the fleet layout (0.316385ms)
|
||||
✔ resolveSeat: refusals for missing dir, missing launch.sh, non-executable launch.sh, invalid name, and unknown layout (0.740773ms)
|
||||
✔ tmuxContext: outside tmux, default socket, custom socket, and exec failure (0.638661ms)
|
||||
✔ makeRegistration produces a record that validates; each shape violation throws SeatError (0.789865ms)
|
||||
✔ writeRegistration/readRegistration: round trip, permissions, absence, and malformed records (1.271361ms)
|
||||
✔ updateTask: changes task, taskSetBy and updatedAt only, and refuses appropriately (1.089279ms)
|
||||
✔ CLI launch: registers, execs the fake launch script, and passes args through (31.609963ms)
|
||||
✔ CLI launch: --harness lands in the record (27.49608ms)
|
||||
✔ CLI launch: the launch script's own exit code passes through (27.83012ms)
|
||||
✔ CLI launch: relaunching a seat rewrites the one registration record (55.260978ms)
|
||||
✔ CLI launch: omitting --task records an empty string, not null (26.294612ms)
|
||||
✔ CLI seat task: updates only the task after a launch, and refuses on an unlaunched seat (80.231818ms)
|
||||
✔ CLI refusals: no args, unknown flag, missing config, already-registered env, and exec failure (133.578393ms)
|
||||
✔ samePath: equal paths, symlinked dirs, distinct dirs, and non-strings (0.479176ms)
|
||||
✔ resolveSetBy: explicit --by wins over the environment; absent or empty environment gives unknown; invalid explicit or environment values refuse with exit 4 (0.569008ms)
|
||||
✔ 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.718166ms)
|
||||
✔ 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 (1.163936ms)
|
||||
✔ 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 (258.81439ms)
|
||||
✔ REQ-LIMIT-1: family substring matching is no longer exported (0.724623ms)
|
||||
✔ sessionEnv passes only the allowlist, the repo's bin on PATH, and the run id (0.654899ms)
|
||||
✔ sessionExit gives a runner's signal death back as the signal; a session credential is one whole set of nonempty variables (0.36955ms)
|
||||
✔ newRun: short ids, 0700 directories, and a refusal when the socket path won't fit (1.444588ms)
|
||||
✔ session file and launch log: 0600, the session file written once (0.982313ms)
|
||||
✔ endReason maps the runner's exit codes; a signal is killed (0.118607ms)
|
||||
✔ Registry mirrors to sessions.json; readSessions marks live entries; bad files refuse (1.213753ms)
|
||||
✔ REQ-THREAD-1 Registry.running keys a thread run by business, instance and thread (0.540018ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.359876ms)
|
||||
✔ stopSession refuses an unknown run, reports a stale one, and won't signal a pid that isn't a runner (0.925497ms)
|
||||
✔ a session runs in its sandbox as pid 1 of its namespace, claims, answers, and stops on mosaic stop (356.123149ms)
|
||||
✔ workRef and validBranch take only what a ref name can hold (1.103007ms)
|
||||
✔ a push lands as the task's work ref, a fast-forward lands after it, and main is the root's (148.093395ms)
|
||||
✔ a rewritten branch refuses non-fast-forward and the work ref stays (130.582352ms)
|
||||
✔ a branch with no history in common with main refuses unrelated-history (68.709548ms)
|
||||
✔ a bundle that needs commits the working repository lacks refuses missing-prerequisite (45.932642ms)
|
||||
✔ main is fetched from the root again before each push, so a clone of a newer root pushes (145.304028ms)
|
||||
✔ a root moved back after the clone leaves the push's base unknown: missing-prerequisite (80.116589ms)
|
||||
✔ a commit with a broken object refuses invalid-bundle, and only because fsck is on (79.959372ms)
|
||||
✔ only a v2 bundle with the named branch is read (44.37364ms)
|
||||
✔ a branch named main, or named for another task, moves only this task's work ref (101.601145ms)
|
||||
✔ a record that throws moves the work ref back, or removes a new one (138.764525ms)
|
||||
✔ a work ref that can't go back refuses rollback-failed, naming the ref and the commit (408.461332ms)
|
||||
✔ a root that can't be read refuses root-unreadable (28.609884ms)
|
||||
✔ a git past its time gets SIGTERM, leaves no ref lock, and the next push lands (2170.149109ms)
|
||||
✔ a git that ignores SIGTERM gets SIGKILL once the grace period is over (1028.303602ms)
|
||||
✔ a working repository path that isn't a directory refuses (23.804257ms)
|
||||
✔ review bundles a pushed commit as refs/mosaic/review, leaving out what the reviewer has (113.232041ms)
|
||||
✔ review of a project with no working repository refuses unknown-commit (13.09366ms)
|
||||
✔ the runner's git tools hold the host's limits and branch rule (1.11111ms)
|
||||
ℹ tests 135
|
||||
ℹ suites 0
|
||||
ℹ pass 135
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 4997.755563
|
||||
@@ -0,0 +1,100 @@
|
||||
✔ the boot config is checked before anything starts (89.841909ms)
|
||||
✔ a business with no tracker entry refuses task verbs (113.850893ms)
|
||||
✔ credential.expiring and .expired are recorded once per instance (223.779549ms)
|
||||
✔ a token file that changes on disk records credential.changed (167.851872ms)
|
||||
✔ autostart polls, reconciles and retries a startup the tracker was down for (138.090293ms)
|
||||
✔ a refusal a restart must clear is not retried by the poll (90.259289ms)
|
||||
✔ a poll that fires while two are queued is dropped (108.580993ms)
|
||||
✔ close waits for a running verb and refuses one that has not started (198.85579ms)
|
||||
✔ the bundled Vikunja is the pinned upstream image the runbook names (0.764242ms)
|
||||
✔ every published port is on 127.0.0.1, and no secret is in the file (0.284722ms)
|
||||
✔ the committed table loads frozen; its verbs are the broker task verbs (1.449057ms)
|
||||
✔ a write names a verb the table has as its own key, not one it inherits (0.496489ms)
|
||||
✔ the schema refuses any other shape (2.985595ms)
|
||||
✔ the Field table in the slice 1 plan names the verbs each field is written by (0.830138ms)
|
||||
✔ each verb refuses, asks for a decision and writes as the table and the role files say (1180.677689ms)
|
||||
✔ the list holds the PRD's requirement ids, in its order, at its version (2.312835ms)
|
||||
✔ the committed list loads frozen (0.586766ms)
|
||||
✔ the schema refuses any other shape (3.099993ms)
|
||||
✔ the fake answers each route with the statuses and shapes Vikunja v2.7.0 sent (331.225354ms)
|
||||
✔ the project list holds recorded project objects in the recorded list envelope (97.145345ms)
|
||||
✔ the recorded task bodies pass the checks S3 applies to every read (0.495184ms)
|
||||
✔ the client works against the fake over real HTTP with the platform fetch (300.816546ms)
|
||||
✔ a correct install starts, and the first reconcile records tasks that already exist (107.48888ms)
|
||||
✔ verbs refuse while a business is starting and after startup refused it (125.269232ms)
|
||||
✔ startup refuses a token that can do more than its role needs (416.781045ms)
|
||||
✔ startup refuses an unsupported version and flags an untested one (291.662193ms)
|
||||
✔ startup refuses a board that the runbook did not install (338.424661ms)
|
||||
✔ startup refuses a project the sync bot cannot read (84.877028ms)
|
||||
✔ startup refuses a configured label the pm bot cannot see (80.213167ms)
|
||||
✔ startup refuses an expired credential and a missing sync credential (151.878539ms)
|
||||
✔ an unreachable tracker refuses with tracker-unavailable (80.09013ms)
|
||||
✔ an edit in the UI is recorded once, with the fields that changed (200.973309ms)
|
||||
✔ a move between open buckets is seen on the board, though updated does not change (162.833441ms)
|
||||
✔ a person's comment is counted and a bot's is not (300.258052ms)
|
||||
✔ the hourly reconcile catches a comment through comment_count (219.171186ms)
|
||||
✔ a task closed in the UI leaves the open view with its done bucket (391.71461ms)
|
||||
✔ a task that leaves the board is recorded as deleted, moved or out of reach (249.068898ms)
|
||||
✔ a poll that read before a verb wrote does not overwrite the verb (152.972722ms)
|
||||
✔ a tracker fault during a tick is reported and the next tick catches up (146.455407ms)
|
||||
✔ a malformed answer refuses the tick with tracker-shape (119.277286ms)
|
||||
✔ no token value reaches the database, the log or a refusal (254.077194ms)
|
||||
✔ the first look at a task counts only comments inside the window (147.500284ms)
|
||||
✔ with descendants off the adapter reads no project list and no child, as in v0 (124.311377ms)
|
||||
✔ a three-level tree is read per project, and a project outside it is not (104.510415ms)
|
||||
✔ a watch-only child keeps the business ready, and a failed child read refuses as transient (203.149971ms)
|
||||
✔ a root without the installed buckets refuses with descendants on (124.743318ms)
|
||||
✔ the project list refuses without read_all, and skips archived projects and saved filters (213.893358ms)
|
||||
✔ descendants must be true or false (96.72902ms)
|
||||
✔ a move inside the tree is a moved tombstone plus a snapshot under the new ref (172.260459ms)
|
||||
✔ a child made after startup joins the tree at the next reconcile (140.105119ms)
|
||||
✔ a child that leaves the tree has its tasks recorded missing, and the ledger keeps their history (159.650367ms)
|
||||
✔ a child deleted or hidden between reconciles drops out at the next tick, and the root still refuses (181.92732ms)
|
||||
✔ a reconcile that fails keeps the previous tree (117.625275ms)
|
||||
✔ a closed task the cursor missed takes its own project's done bucket (118.42503ms)
|
||||
✔ closed tasks read at startup take their own project's done bucket (92.567547ms)
|
||||
✔ a closed task the cursor returns takes its own project's done bucket (131.149602ms)
|
||||
✔ a task moved out of a child that leaves the tree at the same time is moved, not no-access (125.529779ms)
|
||||
✔ a task in a bucket outside the five keeps its raw bucket id (105.015729ms)
|
||||
✔ bucket 0 on a watch-only task never becomes a bucket or a state (188.833299ms)
|
||||
✔ a child whose kanban view is deleted still refuses the tick, and the reconcile reads it watch-only (130.470063ms)
|
||||
✔ a child dropped at a tick comes back at the next reconcile once the bot reads it again (141.329062ms)
|
||||
✔ task.create needs a recorded human request and a requirement id (189.577352ms)
|
||||
✔ task.create takes only an approved requirement id (205.393686ms)
|
||||
✔ task.create cites the request a received message carries, not the message's id (214.545136ms)
|
||||
✔ only labels named in the business file can be written (229.705266ms)
|
||||
✔ task.schedule sets and clears a due date and relations (267.749433ms)
|
||||
✔ assign and reassign move the role bots and record task.assigned (307.293556ms)
|
||||
✔ task.update.assigned is for the assignee and records task.state (270.176273ms)
|
||||
✔ a wrong expected digest records task.conflict and writes nothing (173.230328ms)
|
||||
✔ a cross-role verb needs a resolved decision, used once (211.515307ms)
|
||||
✔ task.close needs a verdict; after it every verb refuses with task-done (230.349011ms)
|
||||
✔ a task with pushed work closes only citing an approve verdict for its latest push, and a refusal writes nothing (244.190327ms)
|
||||
✔ a lost answer is settled by a re-read and never retried (197.120334ms)
|
||||
✔ a create whose answer is lost is reported uncertain, and the poll finds the task (120.845144ms)
|
||||
✔ a task the sync bot cannot read refuses and records nothing (91.799887ms)
|
||||
✔ verbs and polls for one business run one at a time (161.650028ms)
|
||||
✔ a due date with milliseconds is written to the second (156.152542ms)
|
||||
✔ every write landed and the final read failed: the verb succeeds and records what it wrote (104.916623ms)
|
||||
✔ some writes landed and the final read failed: write-uncertain, and nothing is recorded (77.5837ms)
|
||||
✔ a create whose final read fails succeeds and records task.created (87.081881ms)
|
||||
✔ an edit between the last write and the final read shows as external on the next poll (102.13767ms)
|
||||
✔ task.created is recorded when a later label write fails (71.494941ms)
|
||||
✔ every verb acts in an installed child, on the child's own board (267.030116ms)
|
||||
✔ task.create refuses a project outside the tree, a watch-only one and one that is not an id (144.825327ms)
|
||||
✔ with descendants off, task.create takes only the root project (69.949628ms)
|
||||
✔ a verb on a watch-only task, or a relation to one, refuses with project-not-installed (108.316857ms)
|
||||
✔ a related task is read before authority: in another project than its ref names, task-moved; missing, task-not-found (141.92691ms)
|
||||
✔ a task moved to another project of the tree refuses its old ref with task-moved and takes its new one (90.813508ms)
|
||||
✔ a verb and a create in the child record the final read of the child's board (80.145302ms)
|
||||
✔ a create in the child whose final read fails records the child's todo bucket (94.2684ms)
|
||||
✔ a lost answer in the child is settled by a re-read of the child's board (117.402236ms)
|
||||
✔ every related task is read before authority, not only the first (94.357419ms)
|
||||
ℹ tests 92
|
||||
ℹ suites 0
|
||||
ℹ pass 92
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 5021.479062
|
||||
@@ -0,0 +1,122 @@
|
||||
✔ 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 (6839.98343ms)
|
||||
✔ 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 (7195.94386ms)
|
||||
✔ browser edge states: loading, empty, malformed, stale, hostile/long values, in-flight reply and appearance fallback (4740.641961ms)
|
||||
Rendered contrast: {"failures":[],"count":330,"lowest":4.504658476260286}
|
||||
✔ served Console browser: real board fixtures, keyboard, drafts, receipts, themes, 320px and failures (4942.553693ms)
|
||||
✔ the README says a refused field table names the file or the key at fault, never a path (1.017636ms)
|
||||
✔ S5 pages in a browser: real broker rows, inert text, Copy, routes, failures, layout and no writes (7287.567908ms)
|
||||
✔ bus routes serve the four reads from the reader view, unescaped JSON for the page to escape (394.335044ms)
|
||||
✔ decisions route serves the roles and recent lists from the reader view (865.611132ms)
|
||||
✔ credentials route serves the broker credential status from the reader view (755.558937ms)
|
||||
✔ replies route serves the replies to one message from the reader view (1598.736489ms)
|
||||
✔ bus routes are GET-only, have no write verb, and keep the same-origin checks (62.841907ms)
|
||||
✔ bus refusals map to statuses and never carry a path or a stack (26.80356ms)
|
||||
✔ humanCall speaks the human transport protocol without blocking the server (1682.626474ms)
|
||||
✔ busReader takes --business, else the live bus host, else refuses (300.176464ms)
|
||||
✔ humanCall kills a transport that runs past its timeout (546.03176ms)
|
||||
✔ serve refuses a --business value that is not a business id (352.625928ms)
|
||||
✔ conversation view: full history, collapsed tools, hidden thinking, inert hostile content, malformed and reconcile markers (4664.49456ms)
|
||||
✔ conversation view: a fork keeps the open branch, says so, and opens the new one on request (3204.955748ms)
|
||||
✔ conversation view: a newer session with no readable history keeps the marker (2716.92945ms)
|
||||
✔ conversation view: seats without history say so and offer no reply (2474.147151ms)
|
||||
✔ Discord row through real board/WebUI: independent brake/liveness, no Reply, literal content (5183.119564ms)
|
||||
✔ return flow through the conversation view: send, tool call, delayed result, peer message, exact long answers, relaunch (54736.41052ms)
|
||||
✔ messages HTTP read pages and preserves metadata; bad arguments refuse before a read; other reads unchanged (598.028694ms)
|
||||
✔ 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 (11103.006372ms)
|
||||
✔ Messages nav count polls on Tasks and Board and clears on a Board refusal; messages 403 refuses local pages (3137.113753ms)
|
||||
✔ copy writes the Console paths at the full id, read-only, and leaves an existing copy alone (2690.29997ms)
|
||||
✔ copy refuses a commit off refactor, an unknown one, a worktree and a bad copies directory (7424.076008ms)
|
||||
✔ copy writes nothing when an archived path is missing at the commit (481.454804ms)
|
||||
✔ a copy that loses the rename race leaves no read-only temp directory behind (613.757637ms)
|
||||
✔ a copy whose rename fails with no target refuses, writes no copy and leaves no temp directory (1149.469729ms)
|
||||
✔ a copy that meets a target holding files says exists: and moves nothing into it (576.311857ms)
|
||||
✔ a copy that meets an empty target directory replaces it by rename, not by moving into it (737.591327ms)
|
||||
✔ serve runs from a copy: /healthz 200, the config check, roles and RELEASE from the copy, the queue from --checkout (834.392225ms)
|
||||
✔ serve refuses a --checkout that is not an absolute directory path (285.226446ms)
|
||||
✔ consoleReads runs the queue read under queueRoot and reads RELEASE under root (61.664606ms)
|
||||
✔ preview options are all three or none, and each is checked (10.056265ms)
|
||||
✔ the CLI refuses a partial or invalid preview flag set at start (2204.439749ms)
|
||||
✔ the CLI with all three flags serves the preview mode (280.823829ms)
|
||||
✔ a request for the public name needs the header equal to the user id, else 401 and nothing read (23.969946ms)
|
||||
✔ the header name matches without regard to case, and the value compare is exact (5.077007ms)
|
||||
✔ the public name with the header reads the bus views, and the Host and Origin are checked first (32.491867ms)
|
||||
✔ in preview mode every write answers 403 read-only, from the public name and loopback, and reaches nothing (11.706906ms)
|
||||
✔ loopback requests are unchanged in preview mode, and the bus views work with the board down (7.149829ms)
|
||||
✔ a proxy that rewrites Host to the loopback port gets 403 on its first request, whatever the user (24.615926ms)
|
||||
✔ a repeated Host is 400 before any other check, in preview mode and without it (9.812332ms)
|
||||
✔ without the preview flags the public name is refused and writes still reach the board (7.261442ms)
|
||||
✔ redactor: config, dataRoot, any absolute path, Discord ids and the JSON parser quote (1.978947ms)
|
||||
✔ credential state from the date alone, as the bus states it (0.255625ms)
|
||||
✔ queue: rows, one row, ids and methods, notes; no path or id from a row (1897.703779ms)
|
||||
✔ queue: a refused read fails closed with the store's text, redacted (1636.252167ms)
|
||||
✔ queue: a store that fails to load, or a child that dies, gives a fixed message with no path or stack (3522.022984ms)
|
||||
✔ business: names, vars on the allowlist, authority, credential metadata only (13.213118ms)
|
||||
✔ business: missing or invalid file refuses with the module's text, redacted (23.192996ms)
|
||||
✔ business without --business: the live bus host, else no-bus-host; no system config: not-configured (12.232254ms)
|
||||
✔ settings: release, board, loopback address, notifier binding name only (736.400211ms)
|
||||
✔ task fields: the committed table with no reads configured, GET only; a bad table refuses with no path (71.099118ms)
|
||||
✔ both presentations replace old activity with relaunch notice, label retained history, then resume after new activity (5426.971173ms)
|
||||
✔ reported return flow and relative Age: reply sent from the inspector, then the new answer appears there without manual refresh (22027.203267ms)
|
||||
✔ 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 (6823.546404ms)
|
||||
✔ a sent receipt lists its replies as the page refreshes, oldest first and capped, and marks none delivered or read (13630.341467ms)
|
||||
✔ startServer takes send only as a function and only with the preview mode (5.595816ms)
|
||||
✔ the CLI refuses --send without the preview flags, and without a configured bus (456.536704ms)
|
||||
✔ the CLI with --send and a configured bus sends through the human transport and logs one line (167.047126ms)
|
||||
✔ without --send the route is read-only like every other write, and config says no send (10.87242ms)
|
||||
✔ with --send every other write is still 403 read-only, and nothing reaches the board or bus (7.580489ms)
|
||||
✔ config says send only on the public name with --send on (2.288462ms)
|
||||
✔ a send without the signed-in user is 401 and is neither sent nor logged, loopback included (5.138193ms)
|
||||
✔ each request check refuses before anything is sent, and logs the refusal without the body (20.248171ms)
|
||||
✔ a send passes exactly to, body and in_reply_to, answers the id, and logs it (4.667845ms)
|
||||
✔ a crafted role name cannot forge a log line (3.52385ms)
|
||||
✔ a bus refusal is not sent, with its status; an outcome the bus could not confirm is unknown and never retried (11.933458ms)
|
||||
✔ through the human transport the request is exactly the business, message.send and the keys (130.288709ms)
|
||||
✔ against a real broker: the message is written once as a human send, and its refusals map (1557.043609ms)
|
||||
✔ loopback host and board origin fail closed (5.950887ms)
|
||||
✔ real board fixture passes through WebUI; assets and isolated seen/reply work (339.644315ms)
|
||||
✔ proxy preserves exact request bytes, status and receipt, rejects forms and malformed JSON, never follows redirect (47.322266ms)
|
||||
✔ unreachable board reports URL; CLI rejects unsupported options (520.402932ms)
|
||||
✔ render prints the unit without the preview flags (21.932211ms)
|
||||
✔ render carries every serve flag, the preview set included (7.581852ms)
|
||||
✔ a partial preview set is refused (37.083419ms)
|
||||
✔ a value the unit cannot carry is refused, for every flag (313.452029ms)
|
||||
✔ the rendered unit names none of the human proof agent markers and sets no agent variable (27.324647ms)
|
||||
✔ install into --dir with --no-reload writes the file whole, then reports unchanged (95.103138ms)
|
||||
✔ install without --no-reload runs daemon-reload and nothing that starts the unit (63.208269ms)
|
||||
✔ uninstall refuses while the unit is running, with or without --no-reload, and removes it once it is not (333.453661ms)
|
||||
✔ status prints the unit state and GET /healthz on the installed port (434.234565ms)
|
||||
✔ usage: an unknown verb or flag, and start or enable, exit 4 (114.41685ms)
|
||||
✔ without --send, render is the template with its placeholders filled, byte for byte (39.758376ms)
|
||||
✔ render --send with the preview set ends ExecStart with --send and changes nothing else (64.278758ms)
|
||||
✔ --send without the whole preview set is refused and writes nothing (171.245184ms)
|
||||
✔ install --send into --dir with --no-reload writes the sending unit, and status says whether it sends (358.913796ms)
|
||||
✔ uninstall and status take no --send (46.731305ms)
|
||||
✔ install refuses while the unit is running, in any state but inactive or failed, and changes nothing (460.282253ms)
|
||||
✔ when the state read fails, install and uninstall refuse with one line and change nothing (67.845816ms)
|
||||
✔ install needs --copy naming a copy that exists, and refuses outside the canonical checkout without --allow-worktree (76.818997ms)
|
||||
✔ install refuses unless the bus unit runs from the same copy, naming both paths, and changes nothing (489.153058ms)
|
||||
✔ render --copy runs the copy and reads the queue in the checkout; without --copy the unit is unchanged (74.738479ms)
|
||||
✔ the uid header takes only an Authentik uid; the username header still takes a username (365.305332ms)
|
||||
✔ a preview value cannot start with - or . (26.470592ms)
|
||||
✔ status names the copy and whether refactor has moved past it, and says when the unit runs from no copy (526.357742ms)
|
||||
✔ Settings form shows every scope and held role; gated save, exact payload, retained draft and no automatic retry (3263.790422ms)
|
||||
2026-10-15T17:27:38.506Z settings user="jason" changed
|
||||
✔ REQ-WEB-1 signed-in same-origin Settings write reaches exactly one human operation (20.138577ms)
|
||||
✔ REQ-WEB-1 Settings writes require enabled send, named Host, identity, exact Origin and same-origin Fetch Metadata (7.391017ms)
|
||||
✔ REQ-WEB-1 Settings validates JSON, size, revision and strict writable keys before broker call (6.407942ms)
|
||||
✔ tokens.css and icons.svg are byte copies of docs/design (12.871832ms)
|
||||
✔ JetBrains Mono files match the digests in their sources file, with the OFL text (2.616685ms)
|
||||
✔ shipped strings are unchanged, and the web keeps its write boundary (2.966589ms)
|
||||
✔ shell in a browser: System default, seeded states, 400px, focus and the Ctrl+K palette (6831.383473ms)
|
||||
✔ five states on Board, Inbox, Tasks, Agents and Trail (3189.406797ms)
|
||||
✔ Queue, Business and Settings in their five states, with no move button (4668.62161ms)
|
||||
✔ seeded secrets, Discord ids and paths reach no response and no page; business refusals in the module's words (3092.84169ms)
|
||||
✔ the server log names no config path when the system config refuses (315.219456ms)
|
||||
ℹ tests 112
|
||||
ℹ suites 0
|
||||
ℹ pass 112
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 55172.938328
|
||||
@@ -0,0 +1,11 @@
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (4377.811281ms)
|
||||
✔ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (97.731305ms)
|
||||
✔ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (206.117153ms)
|
||||
ℹ tests 3
|
||||
ℹ suites 0
|
||||
ℹ pass 3
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 4749.277001
|
||||
@@ -0,0 +1,11 @@
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (4456.605112ms)
|
||||
✔ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (96.35145ms)
|
||||
✔ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (200.766168ms)
|
||||
ℹ tests 3
|
||||
ℹ suites 0
|
||||
ℹ pass 3
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 4821.209036
|
||||
@@ -0,0 +1,11 @@
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (4445.44142ms)
|
||||
✔ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (192.896858ms)
|
||||
✔ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (306.833123ms)
|
||||
ℹ tests 3
|
||||
ℹ suites 0
|
||||
ℹ pass 3
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 5012.590157
|
||||
@@ -0,0 +1,11 @@
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (4480.918896ms)
|
||||
✔ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (94.669685ms)
|
||||
✔ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (196.585973ms)
|
||||
ℹ tests 3
|
||||
ℹ suites 0
|
||||
ℹ pass 3
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 4838.459796
|
||||
@@ -0,0 +1,11 @@
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (4403.004193ms)
|
||||
✔ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (153.043258ms)
|
||||
✔ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (272.56921ms)
|
||||
ℹ tests 3
|
||||
ℹ suites 0
|
||||
ℹ pass 3
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 4894.898674
|
||||
@@ -0,0 +1,14 @@
|
||||
== control 17:24:19 base eaeb5ebf2
|
||||
control BUS: rc 0 {'tests': '44', 'pass': '44', 'fail': '0', 'cancelled': '0', 'skipped': '0'}
|
||||
control CLI: rc 0 {'tests': '25', 'pass': '25', 'fail': '0', 'cancelled': '0', 'skipped': '0'}
|
||||
b-instance-mismatch [BUS]: killed (rc 1, pass 43, fail 1)
|
||||
fail: REQ-MSG-1: a reply can't carry one thread instance's thread to another thread instance (89.906687ms)
|
||||
b-state-holder-null [CLI]: killed (rc 1, pass 24, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (217.752748ms)
|
||||
l-idle-ignores-pending [CLI]: killed (rc 1, pass 24, fail 1)
|
||||
fail: REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (1317.298085ms)
|
||||
l-start-while-held [CLI]: killed (rc 1, pass 24, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (185.433393ms)
|
||||
l-no-signature-guard [CLI]: killed (rc 1, pass 24, fail 1)
|
||||
fail: REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (318.008312ms)
|
||||
restored: True 17:25:39
|
||||
@@ -0,0 +1,144 @@
|
||||
== control 17:09:53 base eaeb5ebf2
|
||||
control BUS: rc 0 {'tests': '43', 'pass': '43', 'fail': '0', 'cancelled': '0', 'skipped': '0'}
|
||||
control BUSINESS: rc 0 {'tests': '26', 'pass': '26', 'fail': '0', 'cancelled': '0', 'skipped': '0'}
|
||||
control CLI: rc 0 {'tests': '22', 'pass': '22', 'fail': '0', 'cancelled': '0', 'skipped': '0'}
|
||||
control SCHEMA: rc 0 {'tests': '23', 'pass': '23', 'fail': '0', 'cancelled': '0', 'skipped': '0'}
|
||||
control SEAT: rc 0 {'tests': '20', 'pass': '20', 'fail': '0', 'cancelled': '0', 'skipped': '0'}
|
||||
t-threads_project_business [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (975.939816ms)
|
||||
t-thread_one_holder [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (246.774932ms)
|
||||
t-thread_one_per_run [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (246.634063ms)
|
||||
t-thread_release_by_holder [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (981.611975ms)
|
||||
t-thread_release_same_run [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1002.244514ms)
|
||||
t-thread_revoke_needs_decision [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1011.130075ms)
|
||||
t-thread_claims_business [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (956.763999ms)
|
||||
t-message_threads_match [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-MSG-1: a message to or from the assistant names its thread, or is refused (296.066737ms)
|
||||
t-delivery_same_thread [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (145.964133ms)
|
||||
t-projects_no_update [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1016.524311ms)
|
||||
t-projects_no_delete [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1021.885114ms)
|
||||
t-projects_no_replace [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1014.259539ms)
|
||||
t-threads_no_update [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (948.37075ms)
|
||||
t-threads_no_delete [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (960.071281ms)
|
||||
t-threads_no_replace [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1046.666603ms)
|
||||
t-thread_claims_no_update [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (940.964502ms)
|
||||
t-thread_claims_no_delete [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (968.237678ms)
|
||||
t-thread_claims_no_replace [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1010.750909ms)
|
||||
t-message_threads_no_update [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (950.060943ms)
|
||||
t-message_threads_no_delete [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1575.242188ms)
|
||||
t-message_threads_no_replace [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1435.993036ms)
|
||||
t-thread_opens_no_update [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (985.539049ms)
|
||||
t-thread_opens_no_delete [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (985.472493ms)
|
||||
t-thread_opens_no_replace [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1022.302633ms)
|
||||
b-human-must-use-thread-send [BUS]: killed (rc 1, pass 42, fail 1)
|
||||
fail: REQ-MSG-1: a message to or from the assistant names its thread, or is refused (223.429539ms)
|
||||
b-instance-mismatch [BUS]: SURVIVED (rc 0, pass 43, fail 0)
|
||||
b-chain-one-step [BUS]: killed (rc 1, pass 42, fail 1)
|
||||
fail: REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (274.279902ms)
|
||||
b-chain-depth-constant [BUS]: killed (rc 1, pass 42, fail 1)
|
||||
fail: REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3389.240603ms)
|
||||
b-no-thread-returns-null [BUS]: killed (rc 1, pass 41, fail 2)
|
||||
fail: REQ-MSG-1: a message to or from the assistant names its thread, or is refused (216.462552ms)
|
||||
fail: REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3481.921468ms)
|
||||
b-thread-not-owned [BUS]: killed (rc 1, pass 42, fail 1)
|
||||
fail: REQ-USER-2: the human verbs refuse another owner's thread (126.090954ms)
|
||||
b-bind-thread-required [BUS]: killed (rc 1, pass 42, fail 1)
|
||||
fail: REQ-MSG-1: a message to or from the assistant names its thread, or is refused (234.330737ms)
|
||||
b-bind-thread-not-found [BUS]: killed (rc 1, pass 42, fail 1)
|
||||
fail: REQ-MSG-1: a message to or from the assistant names its thread, or is refused (234.859751ms)
|
||||
b-bind-thread-not-allowed [BUS]: killed (rc 1, pass 42, fail 1)
|
||||
fail: REQ-MSG-1: a message to or from the assistant names its thread, or is refused (235.413101ms)
|
||||
b-thread-already-held [BUS]: killed (rc 1, pass 42, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (273.39761ms)
|
||||
b-receive-any-thread [BUS]: killed (rc 1, pass 41, fail 2)
|
||||
fail: REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (312.207647ms)
|
||||
fail: REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (239.184545ms)
|
||||
b-thread-instance-missing [BUS]: killed (rc 1, pass 42, fail 1)
|
||||
fail: REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (56.937749ms)
|
||||
b-thread-instance-ambiguous [BUS]: killed (rc 1, pass 42, fail 1)
|
||||
fail: REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (108.077801ms)
|
||||
b-state-pending-zero [CLI]: killed (rc 1, pass 20, fail 2)
|
||||
fail: 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 (20113.849235ms)
|
||||
fail: REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (20155.818023ms)
|
||||
b-state-last-open-null [BUS]: killed (rc 1, pass 41, fail 2)
|
||||
fail: REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (156.461429ms)
|
||||
fail: broker process: launch ops authorize role.launch, record refusals and end runs (216.869509ms)
|
||||
b-state-holder-null [CLI]: SURVIVED (rc 0, pass 22, fail 0)
|
||||
p-threads-state-op [BUS]: killed (rc 1, pass 42, fail 1)
|
||||
fail: broker process: launch ops authorize role.launch, record refusals and end runs (221.303267ms)
|
||||
s-delivery-unscoped [SCHEMA]: killed (rc 1, pass 17, fail 6)
|
||||
fail: REQ-MSG-1: a message to or from the assistant names its thread, or is refused (249.909591ms)
|
||||
fail: REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (217.815198ms)
|
||||
fail: a business with no role definitions at all is unlimited (248.764439ms)
|
||||
fail: a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (287.168883ms)
|
||||
fail: only the user and the chief of staff may send to the assistant; the tester is refused by default (269.270964ms)
|
||||
fail: the assistant sends to the user and to the chief of staff only (252.278786ms)
|
||||
seat-segment-dotdot [SEAT]: killed (rc 1, pass 19, fail 1)
|
||||
fail: REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.143998ms)
|
||||
seat-segment-pattern [SEAT]: killed (rc 1, pass 19, fail 1)
|
||||
fail: REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.058787ms)
|
||||
seat-store-dir-check [SEAT]: killed (rc 1, pass 19, fail 1)
|
||||
fail: REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.525675ms)
|
||||
seat-store-mode-check [SEAT]: killed (rc 1, pass 19, fail 1)
|
||||
fail: REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.575787ms)
|
||||
seat-registry-thread-key [SEAT]: killed (rc 1, pass 19, fail 1)
|
||||
fail: REQ-THREAD-1 Registry.running keys a thread run by business, instance and thread (1.351633ms)
|
||||
seat-no-thread-binds [SEAT]: killed (rc 1, pass 19, fail 1)
|
||||
fail: REQ-THREAD-2 a thread store binds its session directory and Claude transcripts, and nothing more (1.411438ms)
|
||||
l-check-thread-required [CLI]: killed (rc 1, pass 21, fail 1)
|
||||
fail: REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (144.122136ms)
|
||||
l-check-thread-not-allowed [CLI]: killed (rc 1, pass 21, fail 1)
|
||||
fail: 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 (291.643127ms)
|
||||
l-no-thread-store [CLI]: killed (rc 1, pass 20, fail 2)
|
||||
fail: 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 (349.259881ms)
|
||||
fail: 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 (312.080472ms)
|
||||
l-session-in-run-dir [CLI]: killed (rc 1, pass 21, fail 1)
|
||||
fail: 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 (356.290929ms)
|
||||
l-never-idle-stop [CLI]: killed (rc 1, pass 20, fail 2)
|
||||
fail: 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 (20374.022466ms)
|
||||
fail: REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (30410.632282ms)
|
||||
l-idle-ignores-pending [CLI]: SURVIVED (rc 0, pass 22, fail 0)
|
||||
l-idle-fixed-900 [CLI]: killed (rc 1, pass 20, fail 2)
|
||||
fail: 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 (20405.601838ms)
|
||||
fail: REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (30299.497649ms)
|
||||
l-open-never-starts [CLI]: killed (rc 1, pass 20, fail 2)
|
||||
fail: 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 (24329.114224ms)
|
||||
fail: 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 (20118.61511ms)
|
||||
l-never-start [CLI]: killed (rc 1, pass 19, fail 3)
|
||||
fail: 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 (20181.370648ms)
|
||||
fail: REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (20152.386328ms)
|
||||
fail: 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 (20128.448381ms)
|
||||
l-start-while-held [CLI]: SURVIVED (rc 0, pass 22, fail 0)
|
||||
l-no-signature-guard [CLI]: SURVIVED (rc 0, pass 22, fail 0)
|
||||
l-refusal-every-tick [CLI]: killed (rc 1, pass 20, fail 2)
|
||||
fail: REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (1662.475473ms)
|
||||
fail: 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 (253.099836ms)
|
||||
biz-idle-not-checked [BUSINESS]: killed (rc 1, pass 25, fail 1)
|
||||
fail: REQ-THREAD-2 REQ-LAUNCH-1 launch.threadIdleSeconds: absent is the default, a positive integer is used, anything else refuses (1.873155ms)
|
||||
biz-idle-default [BUSINESS]: killed (rc 1, pass 23, fail 3)
|
||||
fail: REQ-THREAD-2 REQ-LAUNCH-1 launch.threadIdleSeconds: absent is the default, a positive integer is used, anything else refuses (0.688754ms)
|
||||
fail: the fixture business validates and comes back frozen (4.352459ms)
|
||||
fail: the role file loads and resolves through loadBusiness (5.797221ms)
|
||||
restored: True 17:21:12
|
||||
@@ -0,0 +1,25 @@
|
||||
diff --git a/scripts/land-work/read.mjs b/scripts/land-work/read.mjs
|
||||
index 495a069eb..2402ed440 100644
|
||||
--- a/scripts/land-work/read.mjs
|
||||
+++ b/scripts/land-work/read.mjs
|
||||
@@ -10,18 +10,14 @@
|
||||
// "refuse<TAB>reason<TAB>detail" line and exit 2. A missing or unsafe
|
||||
// database or business file exits 3.
|
||||
//
|
||||
-// Kept in step with packages/bus/src/store.mjs, which this imports from:
|
||||
-// the schema_version literal '3b' below is a copy of the Store's. A schema
|
||||
-// bump changes it there, and until it changes here every read refuses
|
||||
-// bus-schema.
|
||||
+// Schema version and digest follow the Store exports; a schema bump has one authority.
|
||||
import { DatabaseSync } from 'node:sqlite';
|
||||
import { readFileSync, lstatSync } from 'node:fs';
|
||||
import { join } from 'node:path';
|
||||
import { pathToFileURL } from 'node:url';
|
||||
import { createHash } from 'node:crypto';
|
||||
-import { schemaDigest, SCHEMA_SHA256 } from '../../packages/bus/src/store.mjs';
|
||||
+import { schemaDigest, SCHEMA_SHA256, SCHEMA_VERSION } from '../../packages/bus/src/store.mjs';
|
||||
|
||||
-const SCHEMA_VERSION = '3b';
|
||||
const MERGE = 'git.merge.protected';
|
||||
const WORK_REF = /^work\/vikunja-([1-9][0-9]*)-([1-9][0-9]*)$/;
|
||||
const ANY_WORK_REF = /\bwork\/[A-Za-z0-9._/-]*[A-Za-z0-9_]/g;
|
||||
@@ -0,0 +1,15 @@
|
||||
✔ 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 (5535.290481ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (1549.898352ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (4345.608462ms)
|
||||
✔ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (101.586448ms)
|
||||
✔ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (203.548929ms)
|
||||
✔ 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 (232.123207ms)
|
||||
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (94.639078ms)
|
||||
ℹ tests 7
|
||||
ℹ suites 0
|
||||
ℹ pass 7
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 12129.905023
|
||||
@@ -0,0 +1,19 @@
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (164.921634ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (439.378654ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (155.28393ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (2442.284468ms)
|
||||
✔ REQ-MSG-1: a reply can't carry one thread instance's thread to another thread instance (95.442674ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (152.169186ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (161.167641ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (139.019628ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (94.120579ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (127.985416ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (401.950981ms)
|
||||
ℹ tests 11
|
||||
ℹ suites 0
|
||||
ℹ pass 11
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 4424.828901
|
||||
@@ -0,0 +1,159 @@
|
||||
== control 17:09:53 base eaeb5ebf2
|
||||
control BUS: rc 0 {'tests': '43', 'pass': '43', 'fail': '0', 'cancelled': '0', 'skipped': '0'}
|
||||
control BUSINESS: rc 0 {'tests': '26', 'pass': '26', 'fail': '0', 'cancelled': '0', 'skipped': '0'}
|
||||
control CLI: rc 0 {'tests': '22', 'pass': '22', 'fail': '0', 'cancelled': '0', 'skipped': '0'}
|
||||
control SCHEMA: rc 0 {'tests': '23', 'pass': '23', 'fail': '0', 'cancelled': '0', 'skipped': '0'}
|
||||
control SEAT: rc 0 {'tests': '20', 'pass': '20', 'fail': '0', 'cancelled': '0', 'skipped': '0'}
|
||||
t-threads_project_business [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (975.939816ms)
|
||||
t-thread_one_holder [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (246.774932ms)
|
||||
t-thread_one_per_run [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (246.634063ms)
|
||||
t-thread_release_by_holder [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (981.611975ms)
|
||||
t-thread_release_same_run [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1002.244514ms)
|
||||
t-thread_revoke_needs_decision [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1011.130075ms)
|
||||
t-thread_claims_business [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (956.763999ms)
|
||||
t-message_threads_match [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-MSG-1: a message to or from the assistant names its thread, or is refused (296.066737ms)
|
||||
t-delivery_same_thread [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (145.964133ms)
|
||||
t-projects_no_update [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1016.524311ms)
|
||||
t-projects_no_delete [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1021.885114ms)
|
||||
t-projects_no_replace [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1014.259539ms)
|
||||
t-threads_no_update [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (948.37075ms)
|
||||
t-threads_no_delete [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (960.071281ms)
|
||||
t-threads_no_replace [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1046.666603ms)
|
||||
t-thread_claims_no_update [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (940.964502ms)
|
||||
t-thread_claims_no_delete [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (968.237678ms)
|
||||
t-thread_claims_no_replace [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1010.750909ms)
|
||||
t-message_threads_no_update [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (950.060943ms)
|
||||
t-message_threads_no_delete [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1575.242188ms)
|
||||
t-message_threads_no_replace [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1435.993036ms)
|
||||
t-thread_opens_no_update [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (985.539049ms)
|
||||
t-thread_opens_no_delete [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (985.472493ms)
|
||||
t-thread_opens_no_replace [SCHEMA]: killed (rc 1, pass 22, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1022.302633ms)
|
||||
b-human-must-use-thread-send [BUS]: killed (rc 1, pass 42, fail 1)
|
||||
fail: REQ-MSG-1: a message to or from the assistant names its thread, or is refused (223.429539ms)
|
||||
b-instance-mismatch [BUS]: SURVIVED (rc 0, pass 43, fail 0)
|
||||
b-chain-one-step [BUS]: killed (rc 1, pass 42, fail 1)
|
||||
fail: REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (274.279902ms)
|
||||
b-chain-depth-constant [BUS]: killed (rc 1, pass 42, fail 1)
|
||||
fail: REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3389.240603ms)
|
||||
b-no-thread-returns-null [BUS]: killed (rc 1, pass 41, fail 2)
|
||||
fail: REQ-MSG-1: a message to or from the assistant names its thread, or is refused (216.462552ms)
|
||||
fail: REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3481.921468ms)
|
||||
b-thread-not-owned [BUS]: killed (rc 1, pass 42, fail 1)
|
||||
fail: REQ-USER-2: the human verbs refuse another owner's thread (126.090954ms)
|
||||
b-bind-thread-required [BUS]: killed (rc 1, pass 42, fail 1)
|
||||
fail: REQ-MSG-1: a message to or from the assistant names its thread, or is refused (234.330737ms)
|
||||
b-bind-thread-not-found [BUS]: killed (rc 1, pass 42, fail 1)
|
||||
fail: REQ-MSG-1: a message to or from the assistant names its thread, or is refused (234.859751ms)
|
||||
b-bind-thread-not-allowed [BUS]: killed (rc 1, pass 42, fail 1)
|
||||
fail: REQ-MSG-1: a message to or from the assistant names its thread, or is refused (235.413101ms)
|
||||
b-thread-already-held [BUS]: killed (rc 1, pass 42, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (273.39761ms)
|
||||
b-receive-any-thread [BUS]: killed (rc 1, pass 41, fail 2)
|
||||
fail: REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (312.207647ms)
|
||||
fail: REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (239.184545ms)
|
||||
b-thread-instance-missing [BUS]: killed (rc 1, pass 42, fail 1)
|
||||
fail: REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (56.937749ms)
|
||||
b-thread-instance-ambiguous [BUS]: killed (rc 1, pass 42, fail 1)
|
||||
fail: REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (108.077801ms)
|
||||
b-state-pending-zero [CLI]: killed (rc 1, pass 20, fail 2)
|
||||
fail: 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 (20113.849235ms)
|
||||
fail: REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (20155.818023ms)
|
||||
b-state-last-open-null [BUS]: killed (rc 1, pass 41, fail 2)
|
||||
fail: REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (156.461429ms)
|
||||
fail: broker process: launch ops authorize role.launch, record refusals and end runs (216.869509ms)
|
||||
b-state-holder-null [CLI]: SURVIVED (rc 0, pass 22, fail 0)
|
||||
p-threads-state-op [BUS]: killed (rc 1, pass 42, fail 1)
|
||||
fail: broker process: launch ops authorize role.launch, record refusals and end runs (221.303267ms)
|
||||
s-delivery-unscoped [SCHEMA]: killed (rc 1, pass 17, fail 6)
|
||||
fail: REQ-MSG-1: a message to or from the assistant names its thread, or is refused (249.909591ms)
|
||||
fail: REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (217.815198ms)
|
||||
fail: a business with no role definitions at all is unlimited (248.764439ms)
|
||||
fail: a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (287.168883ms)
|
||||
fail: only the user and the chief of staff may send to the assistant; the tester is refused by default (269.270964ms)
|
||||
fail: the assistant sends to the user and to the chief of staff only (252.278786ms)
|
||||
seat-segment-dotdot [SEAT]: killed (rc 1, pass 19, fail 1)
|
||||
fail: REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.143998ms)
|
||||
seat-segment-pattern [SEAT]: killed (rc 1, pass 19, fail 1)
|
||||
fail: REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.058787ms)
|
||||
seat-store-dir-check [SEAT]: killed (rc 1, pass 19, fail 1)
|
||||
fail: REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.525675ms)
|
||||
seat-store-mode-check [SEAT]: killed (rc 1, pass 19, fail 1)
|
||||
fail: REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.575787ms)
|
||||
seat-registry-thread-key [SEAT]: killed (rc 1, pass 19, fail 1)
|
||||
fail: REQ-THREAD-1 Registry.running keys a thread run by business, instance and thread (1.351633ms)
|
||||
seat-no-thread-binds [SEAT]: killed (rc 1, pass 19, fail 1)
|
||||
fail: REQ-THREAD-2 a thread store binds its session directory and Claude transcripts, and nothing more (1.411438ms)
|
||||
l-check-thread-required [CLI]: killed (rc 1, pass 21, fail 1)
|
||||
fail: REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (144.122136ms)
|
||||
l-check-thread-not-allowed [CLI]: killed (rc 1, pass 21, fail 1)
|
||||
fail: 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 (291.643127ms)
|
||||
l-no-thread-store [CLI]: killed (rc 1, pass 20, fail 2)
|
||||
fail: 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 (349.259881ms)
|
||||
fail: 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 (312.080472ms)
|
||||
l-session-in-run-dir [CLI]: killed (rc 1, pass 21, fail 1)
|
||||
fail: 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 (356.290929ms)
|
||||
l-never-idle-stop [CLI]: killed (rc 1, pass 20, fail 2)
|
||||
fail: 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 (20374.022466ms)
|
||||
fail: REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (30410.632282ms)
|
||||
l-idle-ignores-pending [CLI]: SURVIVED (rc 0, pass 22, fail 0)
|
||||
l-idle-fixed-900 [CLI]: killed (rc 1, pass 20, fail 2)
|
||||
fail: 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 (20405.601838ms)
|
||||
fail: REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (30299.497649ms)
|
||||
l-open-never-starts [CLI]: killed (rc 1, pass 20, fail 2)
|
||||
fail: 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 (24329.114224ms)
|
||||
fail: 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 (20118.61511ms)
|
||||
l-never-start [CLI]: killed (rc 1, pass 19, fail 3)
|
||||
fail: 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 (20181.370648ms)
|
||||
fail: REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (20152.386328ms)
|
||||
fail: 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 (20128.448381ms)
|
||||
l-start-while-held [CLI]: SURVIVED (rc 0, pass 22, fail 0)
|
||||
l-no-signature-guard [CLI]: SURVIVED (rc 0, pass 22, fail 0)
|
||||
l-refusal-every-tick [CLI]: killed (rc 1, pass 20, fail 2)
|
||||
fail: REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (1662.475473ms)
|
||||
fail: 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 (253.099836ms)
|
||||
biz-idle-not-checked [BUSINESS]: killed (rc 1, pass 25, fail 1)
|
||||
fail: REQ-THREAD-2 REQ-LAUNCH-1 launch.threadIdleSeconds: absent is the default, a positive integer is used, anything else refuses (1.873155ms)
|
||||
biz-idle-default [BUSINESS]: killed (rc 1, pass 23, fail 3)
|
||||
fail: REQ-THREAD-2 REQ-LAUNCH-1 launch.threadIdleSeconds: absent is the default, a positive integer is used, anything else refuses (0.688754ms)
|
||||
fail: the fixture business validates and comes back frozen (4.352459ms)
|
||||
fail: the role file loads and resolves through loadBusiness (5.797221ms)
|
||||
restored: True 17:21:12
|
||||
== rerun after the new tests 17:24:18Z
|
||||
== control 17:24:19 base eaeb5ebf2
|
||||
control BUS: rc 0 {'tests': '44', 'pass': '44', 'fail': '0', 'cancelled': '0', 'skipped': '0'}
|
||||
control CLI: rc 0 {'tests': '25', 'pass': '25', 'fail': '0', 'cancelled': '0', 'skipped': '0'}
|
||||
b-instance-mismatch [BUS]: killed (rc 1, pass 43, fail 1)
|
||||
fail: REQ-MSG-1: a reply can't carry one thread instance's thread to another thread instance (89.906687ms)
|
||||
b-state-holder-null [CLI]: killed (rc 1, pass 24, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (217.752748ms)
|
||||
l-idle-ignores-pending [CLI]: killed (rc 1, pass 24, fail 1)
|
||||
fail: REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (1317.298085ms)
|
||||
l-start-while-held [CLI]: killed (rc 1, pass 24, fail 1)
|
||||
fail: REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (185.433393ms)
|
||||
l-no-signature-guard [CLI]: killed (rc 1, pass 24, fail 1)
|
||||
fail: REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (318.008312ms)
|
||||
restored: True 17:25:39
|
||||
@@ -0,0 +1,197 @@
|
||||
#!/usr/bin/env python3
|
||||
"""Row 121 (#1615) mutants. Each mutant edits one or more source files, runs
|
||||
the named test set, and restores every file from .orig with a sha256 check.
|
||||
|
||||
Rules (Sage, sage-0332):
|
||||
- every test file a set names must exist, or the run stops before mutating:
|
||||
node --test skips a missing path without failing;
|
||||
- a control run of each set on the unmutated source must pass with 0 skipped
|
||||
before any mutant runs, so a kill can't be a test that already failed;
|
||||
- each edit's pattern must occur exactly once;
|
||||
- a schema.sql mutant also rewrites SCHEMA_SHA256 in store.mjs to the mutated
|
||||
file's digest, so the store loads and the kill is a test, not the load check.
|
||||
"""
|
||||
import hashlib, os, re, shutil, signal, subprocess, sys
|
||||
|
||||
WT = os.path.expanduser('~/darkwing-scratch/r121/wt')
|
||||
PKT = os.path.expanduser('~/darkwing-scratch/r121/pkt')
|
||||
TMP = os.path.expanduser('~/darkwing-scratch/r121/tmp')
|
||||
|
||||
SETS = {
|
||||
'SCHEMA': ('packages/bus', ['tests/threads.test.mjs', 'tests/schema.test.mjs', 'tests/messaging.test.mjs']),
|
||||
'BUS': ('packages/bus', ['tests/threads.test.mjs', 'tests/messaging.test.mjs', 'tests/end-launch.test.mjs',
|
||||
'tests/schema.test.mjs', 'tests/store.test.mjs', 'tests/process.test.mjs']),
|
||||
'SEAT': ('packages/seat', ['tests/session.test.mjs', 'tests/sandbox.test.mjs']),
|
||||
'CLI': ('packages/cli', ['tests/thread-launch.test.mjs', 'tests/launcher.test.mjs', 'tests/launch-limits.test.mjs']),
|
||||
'BUSINESS': ('packages/business', ['tests/business.test.mjs', 'tests/chief-of-staff.test.mjs']),
|
||||
}
|
||||
|
||||
SCHEMA = 'packages/bus/schema.sql'
|
||||
STORE = 'packages/bus/src/store.mjs'
|
||||
BROKER = 'packages/bus/src/broker.mjs'
|
||||
PROCESS = 'packages/bus/src/process.mjs'
|
||||
SESSION = 'packages/seat/src/session.mjs'
|
||||
SANDBOX = 'packages/seat/src/sandbox.mjs'
|
||||
LAUNCHER = 'packages/cli/src/launcher.mjs'
|
||||
BUSINESS = 'packages/business/src/business.mjs'
|
||||
|
||||
TRIGGERS = [
|
||||
'threads_project_business', 'thread_one_holder', 'thread_one_per_run', 'thread_release_by_holder',
|
||||
'thread_release_same_run', 'thread_revoke_needs_decision', 'thread_claims_business',
|
||||
'message_threads_match', 'delivery_same_thread',
|
||||
] + [f'{t}_no_{op}' for t in ('projects', 'threads', 'thread_claims', 'message_threads', 'thread_opens')
|
||||
for op in ('update', 'delete', 'replace')]
|
||||
|
||||
# (name, set, [(file, old, new), ...])
|
||||
CODE = [
|
||||
# broker.mjs: #threadFor, #thread, bindLaunch, role.claim, receive, thread.create, threadsState
|
||||
('b-human-must-use-thread-send', 'BUS', [(BROKER, " if (s.human) fail('thread-required-use-thread-send');\n", '')]),
|
||||
('b-instance-mismatch', 'BUS', [(BROKER, ".instance !== to) fail('thread-instance-mismatch');", ".instance !== to && false) fail('thread-instance-mismatch');")]),
|
||||
('b-chain-one-step', 'BUS', [(BROKER, ' at = m?.in_reply_to ?? null;\n', ' at = null;\n')]),
|
||||
('b-chain-depth-constant', 'BUS', [(BROKER, 'at !== null && !seen.has(at); )', 'at !== null && !seen.has(at) && seen.size < 3; )')]),
|
||||
('b-no-thread-returns-null', 'BUS', [(BROKER, " fail('thread-required-reply-to-thread-message');\n", ' return null;\n')]),
|
||||
('b-thread-not-owned', 'BUS', [(BROKER, " if (t.owner !== s.human) fail('thread-not-owned');\n", '')]),
|
||||
('b-bind-thread-required', 'BUS', [(BROKER, " if (record.thread === undefined) fail('thread-required');\n", '')]),
|
||||
('b-bind-thread-not-found', 'BUS', [(BROKER, " fail('thread-not-found');\n } else if (record.thread", " ;\n } else if (record.thread")]),
|
||||
('b-bind-thread-not-allowed', 'BUS', [(BROKER, " } else if (record.thread !== undefined) fail('thread-not-allowed');\n", ' }\n')]),
|
||||
('b-thread-already-held', 'BUS', [(BROKER, " if (this.#threadHolder(s.thread)?.op === 'claim') fail('thread-already-held');\n", '')]),
|
||||
('b-receive-any-thread', 'BUS', [
|
||||
(BROKER, " (s.thread ? ' AND EXISTS(SELECT 1 FROM message_threads mt WHERE mt.message=m.id AND mt.thread=?)' : '') +\n", ''),
|
||||
(BROKER, ' ...(s.thread ? [s.thread] : []),\n', ''),
|
||||
]),
|
||||
('b-thread-instance-missing', 'BUS', [(BROKER, " if (!instances.length) fail('thread-instance-missing');\n", '')]),
|
||||
('b-thread-instance-ambiguous', 'BUS', [(BROKER, " if (instances.length > 1) fail('thread-instance-ambiguous');\n", '')]),
|
||||
('b-state-pending-zero', 'CLI', [(BROKER, ' pending: r.pending,\n', ' pending: 0,\n')]),
|
||||
('b-state-last-open-null', 'BUS', [(BROKER, ' lastOpen: r.last_open,\n', ' lastOpen: null,\n')]),
|
||||
('b-state-holder-null', 'CLI', [(BROKER, " holder: r.claim_op === 'claim' ? r.holder_run : null,\n", ' holder: null,\n')]),
|
||||
('p-threads-state-op', 'BUS', [(PROCESS, " if (m.op === 'threadsState') return runtime.threadsState(m.business);\n", '')]),
|
||||
# schema.sql: delivery_same_thread scoped to messages to the thread's instance (28556 change 1)
|
||||
('s-delivery-unscoped', 'SCHEMA', [(SCHEMA, ' WHERE mt.message = NEW.message AND m.to_role = t.instance\n', ' WHERE mt.message = NEW.message\n')]),
|
||||
# seat
|
||||
('seat-segment-dotdot', 'SEAT', [(SESSION, ' && ID_PATTERN.test(x) && !x.includes("..");', ' && ID_PATTERN.test(x);')]),
|
||||
('seat-segment-pattern', 'SEAT', [(SESSION, ' && ID_PATTERN.test(x) && !x.includes("..");', ' && !x.includes("..");')]),
|
||||
('seat-store-dir-check', 'SEAT', [(SESSION, ' if (st.isSymbolicLink() || !st.isDirectory() || st.uid !== process.getuid() || st.mode & 0o077) throw', ' if (false) throw')]),
|
||||
('seat-store-mode-check', 'SEAT', [(SESSION, ' || st.uid !== process.getuid() || st.mode & 0o077) throw', ' || st.uid !== process.getuid()) throw')]),
|
||||
('seat-registry-thread-key', 'SEAT', [(SESSION, ' && s.instance === instance && (s.thread ?? null) === thread) ?? null;', ' && s.instance === instance) ?? null;')]),
|
||||
('seat-no-thread-binds', 'SEAT', [(SANDBOX, ' if (threadStore) {\n', ' if (false) {\n')]),
|
||||
# launcher
|
||||
('l-check-thread-required', 'CLI', [(LAUNCHER, ' if (threaded && !thread) throw new Refusal("thread-required", `${instance} runs only for a thread`);\n', '')]),
|
||||
('l-check-thread-not-allowed', 'CLI', [(LAUNCHER, ' if (!threaded && thread) throw new Refusal("thread-not-allowed", `${instance} isn\'t a thread instance`);\n', '')]),
|
||||
('l-no-thread-store', 'CLI', [(LAUNCHER, ' store = threadStore(dataRoot, b.id, thread);\n', ' store = null;\n')]),
|
||||
('l-session-in-run-dir', 'CLI', [(LAUNCHER, ' const sessionDir = store ? store.session : join(runDir, "session");\n if (!store) mkdirSync',
|
||||
' const sessionDir = join(runDir, "session");\n if (true) mkdirSync')]),
|
||||
('l-never-idle-stop', 'CLI', [(LAUNCHER, ' if (t.pending === 0 && t.unread === 0 && !stopping.has(s.run) && now - last', ' if (false && now - last')]),
|
||||
('l-idle-ignores-pending', 'CLI', [(LAUNCHER, ' if (t.pending === 0 && t.unread === 0 && !stopping.has(s.run)', ' if (!stopping.has(s.run)')]),
|
||||
('l-idle-fixed-900', 'CLI', [(LAUNCHER, ' >= b.launch.threadIdleSeconds * 1000', ' >= 900 * 1000')]),
|
||||
('l-open-never-starts', 'CLI', [(LAUNCHER, ' const opened = ms(t.lastOpen) > ms(t.lastClaim);\n', ' const opened = false;\n')]),
|
||||
('l-never-start', 'CLI', [(LAUNCHER, ' if (t.holder || !(t.pending > 0 || opened)) continue;\n', ' continue;\n')]),
|
||||
('l-start-while-held', 'CLI', [(LAUNCHER, ' if (t.holder || !(t.pending > 0 || opened)) continue;\n', ' if (!(t.pending > 0 || opened)) continue;\n')]),
|
||||
('l-no-signature-guard', 'CLI', [(LAUNCHER, ' if (startedFor.get(t.thread) === signature) continue;\n', '')]),
|
||||
('l-refusal-every-tick', 'CLI', [(LAUNCHER, ' if (refusedThreads.get(t.thread) === code) return;\n', '')]),
|
||||
# business
|
||||
('biz-idle-not-checked', 'BUSINESS', [(BUSINESS, ': requirePositiveInt(launch.threadIdleSeconds, `${where}.threadIdleSeconds`);', ': launch.threadIdleSeconds;')]),
|
||||
('biz-idle-default', 'BUSINESS', [(BUSINESS, 'launch.threadIdleSeconds === undefined ? THREAD_IDLE_SECONDS :', 'launch.threadIdleSeconds === undefined ? 60 :')]),
|
||||
]
|
||||
|
||||
def sha(p):
|
||||
return hashlib.sha256(open(p, 'rb').read()).hexdigest()
|
||||
|
||||
def sweep():
|
||||
left = []
|
||||
for pid in filter(str.isdigit, os.listdir('/proc')):
|
||||
try:
|
||||
if os.readlink(f'/proc/{pid}/cwd').startswith(TMP + '/') or os.readlink(f'/proc/{pid}/cwd') == TMP:
|
||||
left.append(int(pid)); os.kill(int(pid), signal.SIGKILL)
|
||||
except OSError:
|
||||
pass
|
||||
return left
|
||||
|
||||
def run_set(key):
|
||||
cwd, files = SETS[key]
|
||||
missing = [f for f in files if not os.path.isfile(os.path.join(WT, cwd, f))]
|
||||
if missing:
|
||||
raise SystemExit(f'STOP {key}: missing test files {missing}')
|
||||
p = subprocess.Popen(['node', '--test', *files], cwd=os.path.join(WT, cwd), stdout=subprocess.PIPE,
|
||||
stderr=subprocess.STDOUT, env=env, start_new_session=True, text=True)
|
||||
try:
|
||||
out, _ = p.communicate(timeout=900)
|
||||
except subprocess.TimeoutExpired:
|
||||
os.killpg(p.pid, signal.SIGKILL); out, _ = p.communicate(); out += '\nTIMEOUT\n'
|
||||
tally = dict(re.findall(r'^ℹ (tests|pass|fail|skipped|cancelled) (\d+)$', out, re.M))
|
||||
fails = sorted({l.strip()[2:] for l in out.splitlines() if l.strip().startswith('✖ ') and l.strip() != '✖ failing tests:'})
|
||||
return p.returncode, tally, fails, out
|
||||
|
||||
def schema_edit(name):
|
||||
src = open(SCHEMA).read()
|
||||
m = re.search(r'CREATE TRIGGER ' + re.escape(name) + r' .*?END;', src, re.S)
|
||||
assert m and src.count(f'CREATE TRIGGER {name} ') == 1, name
|
||||
body = m.group(0)
|
||||
raises = re.findall(r"SELECT RAISE\(ABORT, '(?:[^']|'')*'\)", body)
|
||||
assert len(raises) == 1, (name, raises)
|
||||
return [(SCHEMA, body, body.replace(raises[0], 'SELECT NULL'))]
|
||||
|
||||
os.chdir(WT)
|
||||
env = dict(os.environ, TMPDIR=TMP, NO_COLOR='1')
|
||||
os.makedirs(os.path.join(PKT, 'mutants'), exist_ok=True)
|
||||
log = open(os.path.join(PKT, 'mutants-run.log'), 'a')
|
||||
def say(*a):
|
||||
print(*a, file=log, flush=True); print(*a, flush=True)
|
||||
|
||||
check = '--check' in sys.argv
|
||||
only = set(a for a in sys.argv[1:] if a != '--check')
|
||||
mutants = [(f't-{t}', 'SCHEMA', schema_edit(t)) for t in TRIGGERS] + CODE
|
||||
if only:
|
||||
mutants = [m for m in mutants if m[0] in only]
|
||||
assert len(mutants) == len(only), 'unknown mutant name'
|
||||
|
||||
# Patterns first, all of them, before anything runs.
|
||||
for name, _, edits in mutants:
|
||||
for f, old, _ in edits:
|
||||
n = open(f).read().count(old)
|
||||
if n != 1:
|
||||
raise SystemExit(f'STOP {name}: pattern occurs {n} times in {f}')
|
||||
|
||||
if check:
|
||||
raise SystemExit(f'patterns ok: {len(mutants)} mutants')
|
||||
|
||||
base = {f: sha(f) for _, _, edits in mutants for f, _, _ in edits}
|
||||
base[STORE] = sha(STORE)
|
||||
|
||||
say(f'== control {os.popen("date -u +%H:%M:%S").read().strip()} base {os.popen("git rev-parse --short HEAD").read().strip()}')
|
||||
for key in sorted({s for _, s, _ in mutants}):
|
||||
rc, tally, fails, out = run_set(key)
|
||||
open(os.path.join(PKT, 'mutants', f'control-{key}.log'), 'w').write(out)
|
||||
say(f'control {key}: rc {rc} {tally}')
|
||||
if rc != 0 or tally.get('skipped', '0') != '0' or tally.get('fail') != '0':
|
||||
raise SystemExit(f'STOP control {key} not clean')
|
||||
|
||||
for name, key, edits in mutants:
|
||||
files = sorted({f for f, _, _ in edits})
|
||||
if SCHEMA in files:
|
||||
files.append(STORE)
|
||||
for f in files:
|
||||
shutil.copy2(f, f + '.orig')
|
||||
try:
|
||||
for f, old, new in edits:
|
||||
src = open(f).read()
|
||||
open(f, 'w').write(src.replace(old, new))
|
||||
if SCHEMA in files:
|
||||
st = open(STORE).read()
|
||||
old = re.search(r"export const SCHEMA_SHA256 = '[0-9a-f]{64}';", st).group(0)
|
||||
assert st.count(old) == 1
|
||||
open(STORE, 'w').write(st.replace(old, f"export const SCHEMA_SHA256 = '{sha(SCHEMA)}';"))
|
||||
rc, tally, fails, out = run_set(key)
|
||||
open(os.path.join(PKT, 'mutants', f'mutant-{name}.log'), 'w').write(out)
|
||||
load = 'schema-source-mismatch' in out
|
||||
verdict = 'SURVIVED' if rc == 0 else ('LOAD-FAIL' if load else 'killed')
|
||||
say(f'{name} [{key}]: {verdict} (rc {rc}, pass {tally.get("pass", "?")}, fail {tally.get("fail", "?")})')
|
||||
for l in fails:
|
||||
say(f' fail: {l}')
|
||||
left = sweep()
|
||||
if left:
|
||||
say(f' swept {len(left)} leftover process(es) under TMPDIR: {left}')
|
||||
finally:
|
||||
for f in files:
|
||||
shutil.move(f + '.orig', f)
|
||||
assert sha(f) == base[f], f'{f} not restored'
|
||||
say('restored:', all(sha(f) == h for f, h in base.items()), os.popen('date -u +%H:%M:%S').read().strip())
|
||||
@@ -0,0 +1,52 @@
|
||||
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (116.820543ms)
|
||||
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (106.313067ms)
|
||||
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (134.125448ms)
|
||||
✔ endLaunch leaves a claim another run took alone (146.095879ms)
|
||||
✔ refuse records action.refused against the caller with the code only (114.064776ms)
|
||||
✔ launches off refuses role.launch with launch-revoked until launches on (168.986153ms)
|
||||
✔ broker process: launch ops authorize role.launch, record refusals and end runs (269.960458ms)
|
||||
✔ the assistant sends to the user and to the chief of staff only (276.858888ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (313.314432ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (311.644478ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (276.393225ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (274.726456ms)
|
||||
✔ the sender list is checked before the target list (229.789093ms)
|
||||
✔ roles without the field behave exactly as before (402.898766ms)
|
||||
✔ a business with no role definitions at all is unlimited (278.747402ms)
|
||||
✔ a malformed messaging field refuses at boot (79.964597ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (279.431402ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (294.423672ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (266.899761ms)
|
||||
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (165.356272ms)
|
||||
✔ startup token refusal returns safe code without value or partial listening broker (42.438152ms)
|
||||
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (168.84641ms)
|
||||
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (166.422238ms)
|
||||
✔ trusted host registers later launches; socket clients never have a registration verb (166.817965ms)
|
||||
✔ runtime excludes declared project roots even when host supplies no repoRoots (40.218477ms)
|
||||
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (162.256468ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1223.432568ms)
|
||||
✔ creates private WAL store and excludes a second writer until explicit close (97.939498ms)
|
||||
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (141.737864ms)
|
||||
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (160.606388ms)
|
||||
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (155.031272ms)
|
||||
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (102.736277ms)
|
||||
✔ async transactions refuse before invoking their function (75.310192ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (277.332437ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (947.005085ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (270.539533ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (4569.96198ms)
|
||||
✔ REQ-MSG-1: a reply can't carry one thread instance's thread to another thread instance (218.940203ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (321.405903ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (289.364267ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (299.930299ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (211.945987ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (278.148169ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (653.047545ms)
|
||||
ℹ tests 44
|
||||
ℹ suites 0
|
||||
ℹ pass 44
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 8401.819178
|
||||
@@ -0,0 +1,34 @@
|
||||
✔ config directory and file path follow MOSAIC_CONFIG (1.118115ms)
|
||||
✔ the fixture business validates and comes back frozen (3.490826ms)
|
||||
✔ two instances may share a definition (1.105921ms)
|
||||
✔ top-level refusals (3.04972ms)
|
||||
✔ arbiters and projects (4.277296ms)
|
||||
✔ role instances (2.214697ms)
|
||||
✔ Vikunja bots (4.928959ms)
|
||||
✔ a role without Vikunja takes no tracker block (1.830375ms)
|
||||
✔ credential references match the definition's services (2.069359ms)
|
||||
✔ launch (6.757242ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 launch.threadIdleSeconds: absent is the default, a positive integer is used, anything else refuses (5.090011ms)
|
||||
✔ loadBusiness: file checks (1.69079ms)
|
||||
✔ loadBusiness: not a regular file (38.061691ms)
|
||||
✔ loading writes nothing (0.959118ms)
|
||||
✔ names that are Object.prototype properties don't count as declared (2.486673ms)
|
||||
✔ the shipped example refuses as written and validates once filled in (0.707758ms)
|
||||
✔ the role file loads and resolves through loadBusiness (4.78133ms)
|
||||
✔ the shipped file is exactly the approved list (0.190746ms)
|
||||
✔ the resolved record matches the approved list, so a widened file fails (1.228216ms)
|
||||
✔ the chief of staff holds role.launch and message.send; every other action is gated (1.025378ms)
|
||||
✔ the pm does not hold role.launch (1.093876ms)
|
||||
✔ a business grant of a gated action through limits does not widen the role (1.403851ms)
|
||||
✔ a limit that drops role.launch leaves the chief of staff with no launch block (0.860837ms)
|
||||
✔ a launch block whose by is the pm instance is refused (0.988567ms)
|
||||
✔ the contract names no duty to talk to the human and the pm contract no launch (0.253144ms)
|
||||
✔ the instance takes no credential references and no tracker (1.543512ms)
|
||||
ℹ tests 26
|
||||
ℹ suites 0
|
||||
ℹ pass 26
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 134.504269
|
||||
@@ -0,0 +1,33 @@
|
||||
✔ each launch rereads limits and model selections; lowered limits keep sessions and log exact hit (18.951067ms)
|
||||
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1253.39032ms)
|
||||
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (543.305699ms)
|
||||
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (2653.400546ms)
|
||||
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (172.282288ms)
|
||||
✔ a runner that stops at once ends its launch with the runner's reason (245.652869ms)
|
||||
✔ a Claude Code launch with no session credential refuses before it starts (145.572625ms)
|
||||
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (210.312752ms)
|
||||
✔ a runner killed from the host ends its launch as killed, not failed (272.354998ms)
|
||||
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (151.059359ms)
|
||||
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1098.737448ms)
|
||||
✔ 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 (696.859301ms)
|
||||
✔ 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 (3751.398823ms)
|
||||
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (201.26838ms)
|
||||
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (200.065539ms)
|
||||
✔ a launch client that never closes its side doesn't hold the host's close (203.56985ms)
|
||||
✔ a runner that ignores SIGTERM is killed when the host closes (1352.437757ms)
|
||||
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (5.04285ms)
|
||||
✔ 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 (5534.815259ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (1699.207679ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (4305.731577ms)
|
||||
✔ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (193.39129ms)
|
||||
✔ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (303.787756ms)
|
||||
✔ 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 (304.951271ms)
|
||||
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (145.709169ms)
|
||||
ℹ tests 25
|
||||
ℹ suites 0
|
||||
ℹ pass 25
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 13242.699895
|
||||
@@ -0,0 +1,31 @@
|
||||
✔ the assistant sends to the user and to the chief of staff only (246.761739ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (298.034739ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (309.945044ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (276.527264ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (259.580703ms)
|
||||
✔ the sender list is checked before the target list (236.917762ms)
|
||||
✔ roles without the field behave exactly as before (350.160526ms)
|
||||
✔ a business with no role definitions at all is unlimited (252.659435ms)
|
||||
✔ a malformed messaging field refuses at boot (68.762642ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (281.121514ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (294.094547ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (245.8309ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1177.467372ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (260.891372ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (917.863987ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (264.927968ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3387.531199ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (145.347745ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (210.488374ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (151.08154ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (116.077732ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (133.81252ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (471.383383ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 23
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6170.479001
|
||||
@@ -0,0 +1,28 @@
|
||||
✔ RUNNER_FILES is exactly what the runner and the harness sources it starts import (1.554063ms)
|
||||
✔ sandboxProblem names a missing bwrap and a bwrap that fails (7.557019ms)
|
||||
✔ every bind says why; the bundle and session file stay read-only over the run directory (1.242513ms)
|
||||
✔ REQ-THREAD-2 a thread store binds its session directory and Claude transcripts, and nothing more (0.822531ms)
|
||||
✔ the host's git socket is bound only when given, read-only and before the writable binds (0.957947ms)
|
||||
✔ the git identity is the instance's, at <instance>@<business>.mosaic.invalid, and sandboxArgv refuses without it (0.991616ms)
|
||||
✔ a confined session's shell reaches its own workspace and run directory and nothing of the founder's or another session's (1795.318464ms)
|
||||
✔ a bind that exposes a stand-in, or a missing workspace bind, fails the matching check (2528.097039ms)
|
||||
✔ a confined session that runs tester-cli.mjs is refused as tester, and the same shim outside the sandbox binds (262.490096ms)
|
||||
✔ REQ-LIMIT-1: family substring matching is no longer exported (0.716416ms)
|
||||
✔ sessionEnv passes only the allowlist, the repo's bin on PATH, and the run id (0.651347ms)
|
||||
✔ sessionExit gives a runner's signal death back as the signal; a session credential is one whole set of nonempty variables (0.269759ms)
|
||||
✔ newRun: short ids, 0700 directories, and a refusal when the socket path won't fit (1.42158ms)
|
||||
✔ session file and launch log: 0600, the session file written once (0.970005ms)
|
||||
✔ endReason maps the runner's exit codes; a signal is killed (0.13223ms)
|
||||
✔ Registry mirrors to sessions.json; readSessions marks live entries; bad files refuse (1.301997ms)
|
||||
✔ REQ-THREAD-1 Registry.running keys a thread run by business, instance and thread (0.555996ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.341167ms)
|
||||
✔ stopSession refuses an unknown run, reports a stale one, and won't signal a pid that isn't a runner (0.923034ms)
|
||||
✔ a session runs in its sandbox as pid 1 of its namespace, claims, answers, and stops on mosaic stop (283.124483ms)
|
||||
ℹ tests 20
|
||||
ℹ suites 0
|
||||
ℹ pass 20
|
||||
ℹ fail 0
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 4662.112586
|
||||
@@ -0,0 +1,71 @@
|
||||
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (168.179296ms)
|
||||
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (125.383905ms)
|
||||
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (152.776755ms)
|
||||
✔ endLaunch leaves a claim another run took alone (164.998904ms)
|
||||
✔ refuse records action.refused against the caller with the code only (115.386869ms)
|
||||
✔ launches off refuses role.launch with launch-revoked until launches on (180.863442ms)
|
||||
✔ broker process: launch ops authorize role.launch, record refusals and end runs (285.810715ms)
|
||||
✔ the assistant sends to the user and to the chief of staff only (337.098009ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (355.822461ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (339.722336ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (293.429427ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (299.641538ms)
|
||||
✔ the sender list is checked before the target list (250.103197ms)
|
||||
✔ roles without the field behave exactly as before (373.966467ms)
|
||||
✔ a business with no role definitions at all is unlimited (283.924862ms)
|
||||
✔ a malformed messaging field refuses at boot (71.12383ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (285.556669ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (305.918909ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (269.699865ms)
|
||||
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (212.807706ms)
|
||||
✔ startup token refusal returns safe code without value or partial listening broker (38.128496ms)
|
||||
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (179.093459ms)
|
||||
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (172.406057ms)
|
||||
✔ trusted host registers later launches; socket clients never have a registration verb (168.761405ms)
|
||||
✔ runtime excludes declared project roots even when host supplies no repoRoots (40.309974ms)
|
||||
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (157.811381ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1358.147773ms)
|
||||
✔ creates private WAL store and excludes a second writer until explicit close (139.572483ms)
|
||||
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (175.02186ms)
|
||||
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (171.044451ms)
|
||||
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (166.334053ms)
|
||||
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (99.637998ms)
|
||||
✔ async transactions refuse before invoking their function (94.730906ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (356.777289ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1036.516069ms)
|
||||
✖ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (235.413101ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3562.743809ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (148.504237ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (158.904ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (147.24095ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (110.281146ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (141.377575ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (431.319422ms)
|
||||
ℹ tests 43
|
||||
ℹ suites 0
|
||||
ℹ pass 42
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6392.739534
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:180:1
|
||||
✖ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (235.413101ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:195: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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: { code: 'thread-not-allowed' },
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (127.164653ms)
|
||||
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (152.696692ms)
|
||||
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (147.663805ms)
|
||||
✔ endLaunch leaves a claim another run took alone (167.293648ms)
|
||||
✔ refuse records action.refused against the caller with the code only (116.511601ms)
|
||||
✔ launches off refuses role.launch with launch-revoked until launches on (167.098666ms)
|
||||
✔ broker process: launch ops authorize role.launch, record refusals and end runs (284.684177ms)
|
||||
✔ the assistant sends to the user and to the chief of staff only (322.425222ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (341.634022ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (316.671977ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (287.540577ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (292.459268ms)
|
||||
✔ the sender list is checked before the target list (250.739734ms)
|
||||
✔ roles without the field behave exactly as before (359.992ms)
|
||||
✔ a business with no role definitions at all is unlimited (270.325859ms)
|
||||
✔ a malformed messaging field refuses at boot (71.009492ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (268.552912ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (324.490833ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (273.612137ms)
|
||||
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (200.692518ms)
|
||||
✔ startup token refusal returns safe code without value or partial listening broker (45.446183ms)
|
||||
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (188.7655ms)
|
||||
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (172.90216ms)
|
||||
✔ trusted host registers later launches; socket clients never have a registration verb (171.809765ms)
|
||||
✔ runtime excludes declared project roots even when host supplies no repoRoots (39.318269ms)
|
||||
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (151.882699ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1327.963236ms)
|
||||
✔ creates private WAL store and excludes a second writer until explicit close (121.200103ms)
|
||||
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (192.925567ms)
|
||||
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (186.414232ms)
|
||||
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (155.471573ms)
|
||||
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (86.288713ms)
|
||||
✔ async transactions refuse before invoking their function (74.947973ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (353.431904ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (988.418864ms)
|
||||
✖ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (234.859751ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3524.725871ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (149.252695ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (152.335162ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (159.843739ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (98.410815ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (163.842964ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (465.269662ms)
|
||||
ℹ tests 43
|
||||
ℹ suites 0
|
||||
ℹ pass 42
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6362.476873
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:180:1
|
||||
✖ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (234.859751ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:194: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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: { code: 'thread-not-found' },
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (130.344755ms)
|
||||
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (120.939051ms)
|
||||
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (144.483425ms)
|
||||
✔ endLaunch leaves a claim another run took alone (149.01197ms)
|
||||
✔ refuse records action.refused against the caller with the code only (108.435268ms)
|
||||
✔ launches off refuses role.launch with launch-revoked until launches on (172.028952ms)
|
||||
✔ broker process: launch ops authorize role.launch, record refusals and end runs (270.452034ms)
|
||||
✔ the assistant sends to the user and to the chief of staff only (299.911195ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (311.80017ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (330.035658ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (284.121348ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (290.578715ms)
|
||||
✔ the sender list is checked before the target list (253.146702ms)
|
||||
✔ roles without the field behave exactly as before (364.609417ms)
|
||||
✔ a business with no role definitions at all is unlimited (265.13916ms)
|
||||
✔ a malformed messaging field refuses at boot (62.709165ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (271.863364ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (311.157242ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (257.228065ms)
|
||||
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (175.567465ms)
|
||||
✔ startup token refusal returns safe code without value or partial listening broker (41.738403ms)
|
||||
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (160.994545ms)
|
||||
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (158.335654ms)
|
||||
✔ trusted host registers later launches; socket clients never have a registration verb (166.788569ms)
|
||||
✔ runtime excludes declared project roots even when host supplies no repoRoots (44.505966ms)
|
||||
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (167.06474ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1263.805204ms)
|
||||
✔ creates private WAL store and excludes a second writer until explicit close (119.90919ms)
|
||||
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (151.429248ms)
|
||||
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (164.459616ms)
|
||||
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (149.063212ms)
|
||||
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (91.455708ms)
|
||||
✔ async transactions refuse before invoking their function (87.568836ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (298.230613ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (962.448795ms)
|
||||
✖ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (234.330737ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3439.796806ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (146.415992ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (150.172382ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (131.210994ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (106.527574ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (132.67991ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (469.261035ms)
|
||||
ℹ tests 43
|
||||
ℹ suites 0
|
||||
ℹ pass 42
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6138.276181
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:180:1
|
||||
✖ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (234.330737ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
Comparison {
|
||||
+ code: 'invalid-request'
|
||||
- code: 'thread-required'
|
||||
}
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:193: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: Error: invalid-request
|
||||
at fail (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:76:9)
|
||||
at identifier (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:90:15)
|
||||
at Broker.bindLaunch (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:309:94)
|
||||
at launch (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:52:20)
|
||||
at assert.throws.code (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:193:23)
|
||||
at getActual (node:assert:580:5)
|
||||
at strict.throws (node:assert:728:24)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:193:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25),
|
||||
expected: { code: 'thread-required' },
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (114.692903ms)
|
||||
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (129.42285ms)
|
||||
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (141.548438ms)
|
||||
✔ endLaunch leaves a claim another run took alone (164.393699ms)
|
||||
✔ refuse records action.refused against the caller with the code only (118.340882ms)
|
||||
✔ launches off refuses role.launch with launch-revoked until launches on (178.015996ms)
|
||||
✔ broker process: launch ops authorize role.launch, record refusals and end runs (283.165209ms)
|
||||
✔ the assistant sends to the user and to the chief of staff only (290.094028ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (347.216674ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (348.683946ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (293.731044ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (290.044362ms)
|
||||
✔ the sender list is checked before the target list (248.697636ms)
|
||||
✔ roles without the field behave exactly as before (373.813864ms)
|
||||
✔ a business with no role definitions at all is unlimited (257.493817ms)
|
||||
✔ a malformed messaging field refuses at boot (72.825407ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (282.223721ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (315.774166ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (274.871827ms)
|
||||
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (171.953847ms)
|
||||
✔ startup token refusal returns safe code without value or partial listening broker (40.406544ms)
|
||||
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (181.55642ms)
|
||||
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (160.634303ms)
|
||||
✔ trusted host registers later launches; socket clients never have a registration verb (177.985619ms)
|
||||
✔ runtime excludes declared project roots even when host supplies no repoRoots (40.960826ms)
|
||||
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (160.862585ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1325.661934ms)
|
||||
✔ creates private WAL store and excludes a second writer until explicit close (132.150202ms)
|
||||
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (166.437746ms)
|
||||
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (186.860236ms)
|
||||
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (153.83701ms)
|
||||
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (102.873241ms)
|
||||
✔ async transactions refuse before invoking their function (94.130478ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (315.72153ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1019.835983ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (284.903231ms)
|
||||
✖ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3389.240603ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (143.444656ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (154.978348ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (153.680234ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (99.984685ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (140.33561ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (487.633775ms)
|
||||
ℹ tests 43
|
||||
ℹ suites 0
|
||||
ℹ pass 42
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6254.506773
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:234:1
|
||||
✖ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3389.240603ms)
|
||||
Error: thread-required-reply-to-thread-message
|
||||
at fail (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:76:9)
|
||||
at #threadFor (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:237:5)
|
||||
at #dispatch (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:1144:39)
|
||||
at file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:825:38
|
||||
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/store.mjs:162:22)
|
||||
at Broker.request (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:819:26)
|
||||
at call (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:50:44)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:264:15)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25) {
|
||||
code: 'thread-required-reply-to-thread-message'
|
||||
}
|
||||
@@ -0,0 +1,69 @@
|
||||
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (113.946463ms)
|
||||
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (112.070976ms)
|
||||
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (139.186461ms)
|
||||
✔ endLaunch leaves a claim another run took alone (160.340294ms)
|
||||
✔ refuse records action.refused against the caller with the code only (111.346932ms)
|
||||
✔ launches off refuses role.launch with launch-revoked until launches on (165.908457ms)
|
||||
✔ broker process: launch ops authorize role.launch, record refusals and end runs (272.934858ms)
|
||||
✔ the assistant sends to the user and to the chief of staff only (286.938665ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (331.186732ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (324.552949ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (291.2776ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (299.506928ms)
|
||||
✔ the sender list is checked before the target list (248.249424ms)
|
||||
✔ roles without the field behave exactly as before (316.790449ms)
|
||||
✔ a business with no role definitions at all is unlimited (259.944528ms)
|
||||
✔ a malformed messaging field refuses at boot (71.18213ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (287.208625ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (305.882734ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (254.939397ms)
|
||||
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (204.040094ms)
|
||||
✔ startup token refusal returns safe code without value or partial listening broker (62.44115ms)
|
||||
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (178.728577ms)
|
||||
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (161.778408ms)
|
||||
✔ trusted host registers later launches; socket clients never have a registration verb (162.642117ms)
|
||||
✔ runtime excludes declared project roots even when host supplies no repoRoots (41.209559ms)
|
||||
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (167.480757ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1274.08646ms)
|
||||
✔ creates private WAL store and excludes a second writer until explicit close (114.757616ms)
|
||||
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (155.242028ms)
|
||||
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (183.560273ms)
|
||||
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (146.232438ms)
|
||||
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (93.268154ms)
|
||||
✔ async transactions refuse before invoking their function (76.408634ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (298.304683ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (993.836886ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (286.704526ms)
|
||||
✖ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (274.279902ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (247.101856ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (270.358099ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (266.462358ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (185.319418ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (254.614693ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (536.874726ms)
|
||||
ℹ tests 43
|
||||
ℹ suites 0
|
||||
ℹ pass 42
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 3719.870898
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:234:1
|
||||
✖ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (274.279902ms)
|
||||
Error: thread-required-reply-to-thread-message
|
||||
at fail (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:76:9)
|
||||
at #threadFor (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:237:5)
|
||||
at #dispatch (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:1144:39)
|
||||
at file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:825:38
|
||||
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/store.mjs:162:22)
|
||||
at Broker.request (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:819:26)
|
||||
at call (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:50:44)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:250:18)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25) {
|
||||
code: 'thread-required-reply-to-thread-message'
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (128.784355ms)
|
||||
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (112.104544ms)
|
||||
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (147.652656ms)
|
||||
✔ endLaunch leaves a claim another run took alone (154.281148ms)
|
||||
✔ refuse records action.refused against the caller with the code only (124.387743ms)
|
||||
✔ launches off refuses role.launch with launch-revoked until launches on (171.898384ms)
|
||||
✔ broker process: launch ops authorize role.launch, record refusals and end runs (272.874673ms)
|
||||
✔ the assistant sends to the user and to the chief of staff only (267.348349ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (344.351205ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (336.184261ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (271.864141ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (303.012341ms)
|
||||
✔ the sender list is checked before the target list (229.099469ms)
|
||||
✔ roles without the field behave exactly as before (365.459471ms)
|
||||
✔ a business with no role definitions at all is unlimited (269.863838ms)
|
||||
✔ a malformed messaging field refuses at boot (73.649686ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (285.011954ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (321.170821ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (268.139504ms)
|
||||
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (176.585324ms)
|
||||
✔ startup token refusal returns safe code without value or partial listening broker (44.693487ms)
|
||||
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (188.475275ms)
|
||||
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (187.031948ms)
|
||||
✔ trusted host registers later launches; socket clients never have a registration verb (185.229936ms)
|
||||
✔ runtime excludes declared project roots even when host supplies no repoRoots (46.933838ms)
|
||||
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (168.646285ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1280.018051ms)
|
||||
✔ creates private WAL store and excludes a second writer until explicit close (122.849837ms)
|
||||
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (154.525422ms)
|
||||
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (174.353669ms)
|
||||
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (159.73866ms)
|
||||
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (94.332922ms)
|
||||
✔ async transactions refuse before invoking their function (88.794499ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (300.418787ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (994.690328ms)
|
||||
✖ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (223.429539ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3462.443772ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (170.132164ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (179.818245ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (143.050384ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (101.827486ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (132.982751ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (452.948157ms)
|
||||
ℹ tests 43
|
||||
ℹ suites 0
|
||||
ℹ pass 42
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6238.882466
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:180:1
|
||||
✖ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (223.429539ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
Comparison {
|
||||
+ code: 'thread-required-reply-to-thread-message'
|
||||
- code: 'thread-required-use-thread-send'
|
||||
}
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:188: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: Error: thread-required-reply-to-thread-message
|
||||
at fail (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:76:9)
|
||||
at #threadFor (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:236:5)
|
||||
at #dispatch (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:1143:39)
|
||||
at file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:824:38
|
||||
at Store.transaction (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/store.mjs:162:22)
|
||||
at Broker.request (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:818:26)
|
||||
at call (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:50:44)
|
||||
at assert.throws.code (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:188:23)
|
||||
at getActual (node:assert:580:5)
|
||||
at strict.throws (node:assert:728:24),
|
||||
expected: { code: 'thread-required-use-thread-send' },
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (122.084671ms)
|
||||
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (112.051551ms)
|
||||
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (136.831451ms)
|
||||
✔ endLaunch leaves a claim another run took alone (252.773633ms)
|
||||
✔ refuse records action.refused against the caller with the code only (128.587577ms)
|
||||
✔ launches off refuses role.launch with launch-revoked until launches on (176.350805ms)
|
||||
✔ broker process: launch ops authorize role.launch, record refusals and end runs (254.552152ms)
|
||||
✔ the assistant sends to the user and to the chief of staff only (271.35833ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (417.216255ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (328.048137ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (263.643531ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (307.295829ms)
|
||||
✔ the sender list is checked before the target list (271.174166ms)
|
||||
✔ roles without the field behave exactly as before (351.194693ms)
|
||||
✔ a business with no role definitions at all is unlimited (247.779467ms)
|
||||
✔ a malformed messaging field refuses at boot (67.673747ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (273.21797ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (313.178873ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (254.194897ms)
|
||||
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (184.814764ms)
|
||||
✔ startup token refusal returns safe code without value or partial listening broker (49.841362ms)
|
||||
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (183.053815ms)
|
||||
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (265.001212ms)
|
||||
✔ trusted host registers later launches; socket clients never have a registration verb (200.258927ms)
|
||||
✔ runtime excludes declared project roots even when host supplies no repoRoots (64.80112ms)
|
||||
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (162.331291ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1342.983165ms)
|
||||
✔ creates private WAL store and excludes a second writer until explicit close (99.992052ms)
|
||||
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (158.215905ms)
|
||||
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (169.658182ms)
|
||||
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (256.763932ms)
|
||||
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (109.04449ms)
|
||||
✔ async transactions refuse before invoking their function (97.67816ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (288.743243ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1042.588843ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (302.260253ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3263.063506ms)
|
||||
✖ REQ-MSG-1: a reply can't carry one thread instance's thread to another thread instance (89.906687ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (140.316151ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (152.044024ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (143.981815ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (109.32451ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (148.882865ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (464.079913ms)
|
||||
ℹ tests 44
|
||||
ℹ suites 0
|
||||
ℹ pass 43
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6223.414433
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:273:1
|
||||
✖ REQ-MSG-1: a reply can't carry one thread instance's thread to another thread instance (89.906687ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
Comparison {
|
||||
+ code: 'storage-refused'
|
||||
- code: 'thread-instance-mismatch'
|
||||
}
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:288: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: Error: storage-refused
|
||||
at #refused (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:772:47)
|
||||
at Broker.request (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:830:26)
|
||||
at call (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:50:44)
|
||||
at assert.throws.code (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:288:23)
|
||||
at getActual (node:assert:580:5)
|
||||
at strict.throws (node:assert:728:24)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:288: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),
|
||||
expected: { code: 'thread-instance-mismatch' },
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,89 @@
|
||||
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (123.27955ms)
|
||||
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (120.735126ms)
|
||||
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (148.233448ms)
|
||||
✔ endLaunch leaves a claim another run took alone (153.544624ms)
|
||||
✔ refuse records action.refused against the caller with the code only (107.249256ms)
|
||||
✔ launches off refuses role.launch with launch-revoked until launches on (187.339822ms)
|
||||
✔ broker process: launch ops authorize role.launch, record refusals and end runs (289.080755ms)
|
||||
✔ the assistant sends to the user and to the chief of staff only (286.848979ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (321.629063ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (358.689617ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (292.19625ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (295.111167ms)
|
||||
✔ the sender list is checked before the target list (227.21533ms)
|
||||
✔ roles without the field behave exactly as before (358.579135ms)
|
||||
✔ a business with no role definitions at all is unlimited (265.499006ms)
|
||||
✔ a malformed messaging field refuses at boot (75.790419ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (319.877563ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (318.095978ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (273.091221ms)
|
||||
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (186.76856ms)
|
||||
✔ startup token refusal returns safe code without value or partial listening broker (43.342203ms)
|
||||
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (176.642333ms)
|
||||
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (157.522736ms)
|
||||
✔ trusted host registers later launches; socket clients never have a registration verb (184.833365ms)
|
||||
✔ runtime excludes declared project roots even when host supplies no repoRoots (40.998404ms)
|
||||
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (155.900409ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1303.448283ms)
|
||||
✔ creates private WAL store and excludes a second writer until explicit close (109.571717ms)
|
||||
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (153.088631ms)
|
||||
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (165.755008ms)
|
||||
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (152.00156ms)
|
||||
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (113.266621ms)
|
||||
✔ async transactions refuse before invoking their function (94.395976ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (292.919186ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1014.416987ms)
|
||||
✖ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (216.462552ms)
|
||||
✖ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3481.921468ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (140.552428ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (156.591643ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (157.877511ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (108.910828ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (154.892767ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (474.102887ms)
|
||||
ℹ tests 43
|
||||
ℹ suites 0
|
||||
ℹ pass 41
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6268.130088
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:180:1
|
||||
✖ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (216.462552ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:184: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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: { code: 'thread-required-reply-to-thread-message' },
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at tests/threads.test.mjs:234:1
|
||||
✖ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3481.921468ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:268: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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: { code: 'thread-required-reply-to-thread-message' },
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,85 @@
|
||||
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (115.618999ms)
|
||||
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (119.837623ms)
|
||||
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (131.884901ms)
|
||||
✔ endLaunch leaves a claim another run took alone (161.443298ms)
|
||||
✔ refuse records action.refused against the caller with the code only (121.954057ms)
|
||||
✔ launches off refuses role.launch with launch-revoked until launches on (176.399632ms)
|
||||
✔ broker process: launch ops authorize role.launch, record refusals and end runs (269.837762ms)
|
||||
✔ the assistant sends to the user and to the chief of staff only (284.736031ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (335.440294ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (326.378831ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (279.221094ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (301.102681ms)
|
||||
✔ the sender list is checked before the target list (251.67503ms)
|
||||
✔ roles without the field behave exactly as before (352.524979ms)
|
||||
✔ a business with no role definitions at all is unlimited (256.862084ms)
|
||||
✔ a malformed messaging field refuses at boot (66.961525ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (293.225755ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (324.824933ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (283.361075ms)
|
||||
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (175.153731ms)
|
||||
✔ startup token refusal returns safe code without value or partial listening broker (47.21938ms)
|
||||
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (169.765531ms)
|
||||
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (170.227619ms)
|
||||
✔ trusted host registers later launches; socket clients never have a registration verb (170.678644ms)
|
||||
✔ runtime excludes declared project roots even when host supplies no repoRoots (43.791735ms)
|
||||
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (159.058409ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1284.260238ms)
|
||||
✔ creates private WAL store and excludes a second writer until explicit close (102.523593ms)
|
||||
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (157.887194ms)
|
||||
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (168.755634ms)
|
||||
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (167.338612ms)
|
||||
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (97.343671ms)
|
||||
✔ async transactions refuse before invoking their function (80.438556ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (295.305587ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (993.602676ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (288.966767ms)
|
||||
✖ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (312.207647ms)
|
||||
✖ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (239.184545ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (265.66219ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (268.159262ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (226.88068ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (267.690502ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (538.413547ms)
|
||||
ℹ tests 43
|
||||
ℹ suites 0
|
||||
ℹ pass 41
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 3759.355798
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:234:1
|
||||
✖ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (312.207647ms)
|
||||
Error: storage-refused
|
||||
at #refused (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:772:47)
|
||||
at Broker.request (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:830:26)
|
||||
at call (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:50:44)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:254:20)
|
||||
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'
|
||||
}
|
||||
|
||||
test at tests/threads.test.mjs:273:1
|
||||
✖ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (239.184545ms)
|
||||
Error: storage-refused
|
||||
at #refused (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:772:47)
|
||||
at Broker.request (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:830:26)
|
||||
at call (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:50:44)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:277:20)
|
||||
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'
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
✔ each launch rereads limits and model selections; lowered limits keep sessions and log exact hit (19.77914ms)
|
||||
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1261.161389ms)
|
||||
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (623.533644ms)
|
||||
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (2644.37886ms)
|
||||
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (181.294395ms)
|
||||
✔ a runner that stops at once ends its launch with the runner's reason (247.797812ms)
|
||||
✔ a Claude Code launch with no session credential refuses before it starts (129.1036ms)
|
||||
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (216.228949ms)
|
||||
✔ a runner killed from the host ends its launch as killed, not failed (276.188163ms)
|
||||
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (152.409786ms)
|
||||
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1089.878562ms)
|
||||
✔ 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 (710.666533ms)
|
||||
✔ 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 (3778.789382ms)
|
||||
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (204.351369ms)
|
||||
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (224.381228ms)
|
||||
✔ a launch client that never closes its side doesn't hold the host's close (238.536105ms)
|
||||
✔ a runner that ignores SIGTERM is killed when the host closes (1378.450674ms)
|
||||
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.129277ms)
|
||||
✔ 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 (5504.595451ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (1664.735114ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (4373.510293ms)
|
||||
✖ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (217.752748ms)
|
||||
✔ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (341.102483ms)
|
||||
✔ 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 (408.34278ms)
|
||||
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (163.899872ms)
|
||||
ℹ tests 25
|
||||
ℹ suites 0
|
||||
ℹ pass 24
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 13444.547741
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/thread-launch.test.mjs:244:1
|
||||
✖ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (217.752748ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ null
|
||||
- 'held-by-hand'
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:252: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: null,
|
||||
expected: 'held-by-hand',
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,105 @@
|
||||
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (120.62577ms)
|
||||
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (96.609372ms)
|
||||
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (129.915393ms)
|
||||
✔ endLaunch leaves a claim another run took alone (147.11021ms)
|
||||
✔ refuse records action.refused against the caller with the code only (111.686569ms)
|
||||
✔ launches off refuses role.launch with launch-revoked until launches on (167.193544ms)
|
||||
✖ broker process: launch ops authorize role.launch, record refusals and end runs (216.869509ms)
|
||||
✔ the assistant sends to the user and to the chief of staff only (268.373918ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (314.644853ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (313.966411ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (270.872582ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (261.942092ms)
|
||||
✔ the sender list is checked before the target list (233.656785ms)
|
||||
✔ roles without the field behave exactly as before (345.419651ms)
|
||||
✔ a business with no role definitions at all is unlimited (255.390363ms)
|
||||
✔ a malformed messaging field refuses at boot (64.071975ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (259.582981ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (294.429833ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (265.578345ms)
|
||||
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (169.340918ms)
|
||||
✔ startup token refusal returns safe code without value or partial listening broker (44.453931ms)
|
||||
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (163.069442ms)
|
||||
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (169.952472ms)
|
||||
✔ trusted host registers later launches; socket clients never have a registration verb (157.364983ms)
|
||||
✔ runtime excludes declared project roots even when host supplies no repoRoots (38.954037ms)
|
||||
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (154.000341ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1204.998204ms)
|
||||
✔ creates private WAL store and excludes a second writer until explicit close (113.640765ms)
|
||||
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (132.093581ms)
|
||||
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (160.652294ms)
|
||||
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (153.253348ms)
|
||||
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (91.949167ms)
|
||||
✔ async transactions refuse before invoking their function (80.262931ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (274.475829ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (928.194921ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (277.144657ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3329.436073ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (131.388693ms)
|
||||
✖ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (156.461429ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (147.596379ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (96.674586ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (133.354944ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (450.666568ms)
|
||||
ℹ tests 43
|
||||
ℹ suites 0
|
||||
ℹ pass 41
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 5990.726557
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/end-launch.test.mjs:135:1
|
||||
✖ broker process: launch ops authorize role.launch, record refusals and end runs (216.869509ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
{
|
||||
holder: null,
|
||||
instance: 'coder',
|
||||
lastClaim: null,
|
||||
lastMessage: null,
|
||||
+ lastOpen: null,
|
||||
- lastOpen: '2026-10-15T00:00:01.000Z',
|
||||
pending: 0,
|
||||
thread: 'th-1',
|
||||
unread: 0
|
||||
}
|
||||
]
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/end-launch.test.mjs:184: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: [ { thread: 'th-1', instance: 'coder', pending: 0, unread: 0, lastMessage: null, lastOpen: null, lastClaim: null, holder: null } ],
|
||||
expected: [ { thread: 'th-1', instance: 'coder', pending: 0, unread: 0, lastMessage: null, lastOpen: '2026-10-15T00:00:01.000Z', lastClaim: null, holder: null } ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at tests/threads.test.mjs:301:1
|
||||
✖ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (156.461429ms)
|
||||
AssertionError [ERR_ASSERTION]: The expression evaluated to a falsy value:
|
||||
|
||||
assert.ok(state()[B].lastOpen)
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:321: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: null,
|
||||
expected: true,
|
||||
operator: '==',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
✔ each launch rereads limits and model selections; lowered limits keep sessions and log exact hit (19.619066ms)
|
||||
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1312.250331ms)
|
||||
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (677.021323ms)
|
||||
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (2656.234931ms)
|
||||
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (177.061863ms)
|
||||
✔ a runner that stops at once ends its launch with the runner's reason (242.343698ms)
|
||||
✔ a Claude Code launch with no session credential refuses before it starts (127.643484ms)
|
||||
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (206.492352ms)
|
||||
✔ a runner killed from the host ends its launch as killed, not failed (276.923058ms)
|
||||
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (146.76998ms)
|
||||
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1082.306394ms)
|
||||
✔ 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 (715.658362ms)
|
||||
✔ 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 (3662.800026ms)
|
||||
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (112.069875ms)
|
||||
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (124.776225ms)
|
||||
✔ a launch client that never closes its side doesn't hold the host's close (132.329991ms)
|
||||
✔ a runner that ignores SIGTERM is killed when the host closes (1258.775495ms)
|
||||
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.390329ms)
|
||||
✖ 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 (20113.849235ms)
|
||||
✖ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (20155.818023ms)
|
||||
✔ 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 (243.411954ms)
|
||||
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (84.903565ms)
|
||||
ℹ tests 22
|
||||
ℹ suites 0
|
||||
ℹ pass 20
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 40672.164551
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/thread-launch.test.mjs:154:1
|
||||
✖ 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 (20113.849235ms)
|
||||
Error: timed out waiting
|
||||
at until (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
|
||||
at async ask (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:140:17)
|
||||
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:166:17)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
|
||||
|
||||
test at tests/thread-launch.test.mjs:202:1
|
||||
✖ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (20155.818023ms)
|
||||
Error: timed out waiting
|
||||
at until (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
|
||||
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:212:19)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
@@ -0,0 +1,86 @@
|
||||
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (123.911553ms)
|
||||
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (120.288329ms)
|
||||
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (143.054623ms)
|
||||
✔ endLaunch leaves a claim another run took alone (164.236222ms)
|
||||
✔ refuse records action.refused against the caller with the code only (118.912341ms)
|
||||
✔ launches off refuses role.launch with launch-revoked until launches on (177.230509ms)
|
||||
✔ broker process: launch ops authorize role.launch, record refusals and end runs (1008.358015ms)
|
||||
✔ the assistant sends to the user and to the chief of staff only (306.211864ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (352.312124ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (1077.564845ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (294.707537ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (293.351831ms)
|
||||
✔ the sender list is checked before the target list (237.259234ms)
|
||||
✔ roles without the field behave exactly as before (346.954269ms)
|
||||
✔ a business with no role definitions at all is unlimited (258.837576ms)
|
||||
✔ a malformed messaging field refuses at boot (76.588526ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (301.965641ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (306.849578ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (265.317095ms)
|
||||
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (188.223537ms)
|
||||
✔ startup token refusal returns safe code without value or partial listening broker (41.475018ms)
|
||||
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (173.701752ms)
|
||||
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (163.984137ms)
|
||||
✔ trusted host registers later launches; socket clients never have a registration verb (182.978199ms)
|
||||
✔ runtime excludes declared project roots even when host supplies no repoRoots (45.876433ms)
|
||||
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (627.12201ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (2066.084277ms)
|
||||
✔ creates private WAL store and excludes a second writer until explicit close (118.145099ms)
|
||||
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (154.150842ms)
|
||||
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (161.352351ms)
|
||||
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (152.660507ms)
|
||||
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (98.811753ms)
|
||||
✔ async transactions refuse before invoking their function (95.608319ms)
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (273.39761ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1767.888867ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (294.242131ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3555.864163ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (151.665863ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (159.339285ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (143.138679ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (116.406469ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (136.413886ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (408.006711ms)
|
||||
ℹ tests 43
|
||||
ℹ suites 0
|
||||
ℹ pass 42
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 7074.178618
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:80:1
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (273.39761ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
Comparison {
|
||||
+ code: 'storage-refused'
|
||||
- code: 'thread-already-held'
|
||||
}
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:83: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: Error: storage-refused
|
||||
at #refused (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:772:47)
|
||||
at Broker.request (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:830:26)
|
||||
at call (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:50:44)
|
||||
at claim (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:55:27)
|
||||
at assert.throws.code (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:83:23)
|
||||
at getActual (node:assert:580:5)
|
||||
at strict.throws (node:assert:728:24)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:83:10)
|
||||
at Test.runInAsyncScope (node:async_hooks:226:14)
|
||||
at Test.run (node:internal/test_runner/test:1402:25),
|
||||
expected: { code: 'thread-already-held' },
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (145.406568ms)
|
||||
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (117.601069ms)
|
||||
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (139.235531ms)
|
||||
✔ endLaunch leaves a claim another run took alone (171.66052ms)
|
||||
✔ refuse records action.refused against the caller with the code only (121.982183ms)
|
||||
✔ launches off refuses role.launch with launch-revoked until launches on (196.136142ms)
|
||||
✔ broker process: launch ops authorize role.launch, record refusals and end runs (296.733465ms)
|
||||
✔ the assistant sends to the user and to the chief of staff only (305.32306ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (365.496016ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (356.202067ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (302.185241ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (304.210897ms)
|
||||
✔ the sender list is checked before the target list (262.959687ms)
|
||||
✔ roles without the field behave exactly as before (357.946327ms)
|
||||
✔ a business with no role definitions at all is unlimited (270.329546ms)
|
||||
✔ a malformed messaging field refuses at boot (79.179871ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (314.402548ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (339.579526ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (277.968025ms)
|
||||
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (192.020502ms)
|
||||
✔ startup token refusal returns safe code without value or partial listening broker (46.165872ms)
|
||||
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (186.143795ms)
|
||||
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (182.489396ms)
|
||||
✔ trusted host registers later launches; socket clients never have a registration verb (219.530188ms)
|
||||
✔ runtime excludes declared project roots even when host supplies no repoRoots (44.061064ms)
|
||||
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (178.662781ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1372.170419ms)
|
||||
✔ creates private WAL store and excludes a second writer until explicit close (117.122746ms)
|
||||
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (156.813928ms)
|
||||
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (170.791464ms)
|
||||
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (161.259321ms)
|
||||
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (112.73876ms)
|
||||
✔ async transactions refuse before invoking their function (105.97457ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (310.828122ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1061.959753ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (305.893881ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3580.540009ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (148.625393ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (185.646066ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (183.441263ms)
|
||||
✖ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (108.077801ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (142.059079ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (419.955299ms)
|
||||
ℹ tests 43
|
||||
ℹ suites 0
|
||||
ℹ pass 42
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6513.668479
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:353:1
|
||||
✖ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (108.077801ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:361: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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: { code: 'thread-instance-ambiguous' },
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,88 @@
|
||||
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (126.028619ms)
|
||||
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (132.045322ms)
|
||||
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (147.635499ms)
|
||||
✔ endLaunch leaves a claim another run took alone (166.837128ms)
|
||||
✔ refuse records action.refused against the caller with the code only (126.710436ms)
|
||||
✔ launches off refuses role.launch with launch-revoked until launches on (184.105944ms)
|
||||
✔ broker process: launch ops authorize role.launch, record refusals and end runs (294.474649ms)
|
||||
✔ the assistant sends to the user and to the chief of staff only (305.867387ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (354.522714ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (367.641499ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (287.465137ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (288.890986ms)
|
||||
✔ the sender list is checked before the target list (270.763984ms)
|
||||
✔ roles without the field behave exactly as before (385.320249ms)
|
||||
✔ a business with no role definitions at all is unlimited (261.629879ms)
|
||||
✔ a malformed messaging field refuses at boot (78.115061ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (292.553951ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (322.594574ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (294.752782ms)
|
||||
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (180.983094ms)
|
||||
✔ startup token refusal returns safe code without value or partial listening broker (40.168927ms)
|
||||
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (176.03865ms)
|
||||
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (168.345334ms)
|
||||
✔ trusted host registers later launches; socket clients never have a registration verb (181.949486ms)
|
||||
✔ runtime excludes declared project roots even when host supplies no repoRoots (41.410421ms)
|
||||
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (163.212815ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1341.108006ms)
|
||||
✔ creates private WAL store and excludes a second writer until explicit close (118.321656ms)
|
||||
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (166.01987ms)
|
||||
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (167.586083ms)
|
||||
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (159.948505ms)
|
||||
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (116.739725ms)
|
||||
✔ async transactions refuse before invoking their function (95.325614ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (303.483743ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1045.982073ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (302.89183ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3586.113619ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (171.797322ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (161.543146ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (154.269492ms)
|
||||
✖ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (56.937749ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (153.6245ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (779.558714ms)
|
||||
ℹ tests 43
|
||||
ℹ suites 0
|
||||
ℹ pass 42
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6779.471949
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:353:1
|
||||
✖ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (56.937749ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
Comparison {
|
||||
+ code: 'storage-refused'
|
||||
- code: 'thread-instance-missing'
|
||||
}
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:357: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: Error: storage-refused
|
||||
at #refused (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:772:47)
|
||||
at Broker.request (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:830:26)
|
||||
at Object.call (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:50:44)
|
||||
at assert.throws.code (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:357:25)
|
||||
at getActual (node:assert:580:5)
|
||||
at strict.throws (node:assert:728:24)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:357: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),
|
||||
expected: { code: 'thread-instance-missing' },
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,71 @@
|
||||
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (108.238571ms)
|
||||
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (123.346962ms)
|
||||
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (147.796829ms)
|
||||
✔ endLaunch leaves a claim another run took alone (163.163197ms)
|
||||
✔ refuse records action.refused against the caller with the code only (121.901952ms)
|
||||
✔ launches off refuses role.launch with launch-revoked until launches on (174.806721ms)
|
||||
✔ broker process: launch ops authorize role.launch, record refusals and end runs (296.841073ms)
|
||||
✔ the assistant sends to the user and to the chief of staff only (282.234052ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (345.236206ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (354.639287ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (305.875259ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (318.216349ms)
|
||||
✔ the sender list is checked before the target list (253.46183ms)
|
||||
✔ roles without the field behave exactly as before (370.19234ms)
|
||||
✔ a business with no role definitions at all is unlimited (269.142049ms)
|
||||
✔ a malformed messaging field refuses at boot (74.464185ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (294.869903ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (312.293329ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (261.511495ms)
|
||||
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (172.81671ms)
|
||||
✔ startup token refusal returns safe code without value or partial listening broker (40.865368ms)
|
||||
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (181.935572ms)
|
||||
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (166.771957ms)
|
||||
✔ trusted host registers later launches; socket clients never have a registration verb (176.193794ms)
|
||||
✔ runtime excludes declared project roots even when host supplies no repoRoots (40.820723ms)
|
||||
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (174.788ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1351.789872ms)
|
||||
✔ creates private WAL store and excludes a second writer until explicit close (116.703305ms)
|
||||
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (169.2727ms)
|
||||
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (171.236367ms)
|
||||
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (140.955881ms)
|
||||
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (99.642255ms)
|
||||
✔ async transactions refuse before invoking their function (88.759009ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (314.634039ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1043.726888ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (309.445801ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3488.436732ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (133.447682ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (142.889873ms)
|
||||
✖ REQ-USER-2: the human verbs refuse another owner's thread (126.090954ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (111.365272ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (140.864683ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (467.705669ms)
|
||||
ℹ tests 43
|
||||
ℹ suites 0
|
||||
ℹ pass 42
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6340.445799
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:324:1
|
||||
✖ REQ-USER-2: the human verbs refuse another owner's thread (126.090954ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception: thread.open
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:342:12)
|
||||
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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: { code: 'thread-not-owned' },
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,119 @@
|
||||
✔ config directory and file path follow MOSAIC_CONFIG (1.023121ms)
|
||||
✖ the fixture business validates and comes back frozen (4.352459ms)
|
||||
✔ two instances may share a definition (1.19708ms)
|
||||
✔ top-level refusals (3.224862ms)
|
||||
✔ arbiters and projects (4.198864ms)
|
||||
✔ role instances (2.192712ms)
|
||||
✔ Vikunja bots (4.864968ms)
|
||||
✔ a role without Vikunja takes no tracker block (1.809098ms)
|
||||
✔ credential references match the definition's services (2.199718ms)
|
||||
✔ launch (6.770855ms)
|
||||
✖ REQ-THREAD-2 REQ-LAUNCH-1 launch.threadIdleSeconds: absent is the default, a positive integer is used, anything else refuses (0.688754ms)
|
||||
✔ loadBusiness: file checks (1.629029ms)
|
||||
✔ loadBusiness: not a regular file (33.611656ms)
|
||||
✔ loading writes nothing (0.987025ms)
|
||||
✔ names that are Object.prototype properties don't count as declared (2.908262ms)
|
||||
✔ the shipped example refuses as written and validates once filled in (0.702491ms)
|
||||
✖ the role file loads and resolves through loadBusiness (5.797221ms)
|
||||
✔ the shipped file is exactly the approved list (0.247891ms)
|
||||
✔ the resolved record matches the approved list, so a widened file fails (1.317966ms)
|
||||
✔ the chief of staff holds role.launch and message.send; every other action is gated (1.081874ms)
|
||||
✔ the pm does not hold role.launch (1.096708ms)
|
||||
✔ a business grant of a gated action through limits does not widen the role (1.343573ms)
|
||||
✔ a limit that drops role.launch leaves the chief of staff with no launch block (0.850778ms)
|
||||
✔ a launch block whose by is the pm instance is refused (1.035348ms)
|
||||
✔ the contract names no duty to talk to the human and the pm contract no launch (0.242349ms)
|
||||
✔ the instance takes no credential references and no tracker (1.522945ms)
|
||||
ℹ tests 26
|
||||
ℹ suites 0
|
||||
ℹ pass 23
|
||||
ℹ fail 3
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 123.988719
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/business.test.mjs:35:1
|
||||
✖ the fixture business validates and comes back frozen (4.352459ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
... Skipped lines
|
||||
|
||||
{
|
||||
by: 'chief',
|
||||
instances: [
|
||||
'coder',
|
||||
'reviewer'
|
||||
...
|
||||
},
|
||||
+ threadIdleSeconds: 60
|
||||
- threadIdleSeconds: 900
|
||||
}
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/business/tests/business.test.mjs:43: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: { by: 'chief', instances: [ 'coder', 'reviewer' ], models: { 'claude-opus-5-5': [Object], 'claude-sonnet-5-5': [Object], 'glm-5.3-flash': [Object] }, limits: { models: [Object] }, threadIdleSeconds: 60 },
|
||||
expected: { by: 'chief', instances: [ 'coder', 'reviewer' ], models: { 'claude-opus-5-5': [Object], 'claude-sonnet-5-5': [Object], 'glm-5.3-flash': [Object] }, limits: { models: [Object] }, threadIdleSeconds: 900 },
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at tests/business.test.mjs:141:1
|
||||
✖ REQ-THREAD-2 REQ-LAUNCH-1 launch.threadIdleSeconds: absent is the default, a positive integer is used, anything else refuses (0.688754ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
|
||||
60 !== 900
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/business/tests/business.test.mjs:143: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: 60,
|
||||
expected: 900,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at tests/chief-of-staff.test.mjs:50:1
|
||||
✖ the role file loads and resolves through loadBusiness (5.797221ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
... Skipped lines
|
||||
|
||||
{
|
||||
by: 'chief',
|
||||
instances: [
|
||||
'coder',
|
||||
'reviewer'
|
||||
...
|
||||
},
|
||||
+ threadIdleSeconds: 60
|
||||
- threadIdleSeconds: 900
|
||||
}
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/business/tests/chief-of-staff.test.mjs:62: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: { by: 'chief', instances: [ 'coder', 'reviewer' ], models: { 'claude-opus-5-5': [Object], 'claude-sonnet-5-5': [Object], 'glm-5.3-flash': [Object] }, limits: { models: [Object] }, threadIdleSeconds: 60 },
|
||||
expected: { by: 'chief', instances: [ 'coder', 'reviewer' ], models: { 'claude-opus-5-5': [Object], 'claude-sonnet-5-5': [Object], 'glm-5.3-flash': [Object] }, limits: { models: [Object] }, threadIdleSeconds: 900 },
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,54 @@
|
||||
✔ config directory and file path follow MOSAIC_CONFIG (1.066162ms)
|
||||
✔ the fixture business validates and comes back frozen (3.36071ms)
|
||||
✔ two instances may share a definition (1.135303ms)
|
||||
✔ top-level refusals (3.064445ms)
|
||||
✔ arbiters and projects (4.156264ms)
|
||||
✔ role instances (2.17729ms)
|
||||
✔ Vikunja bots (4.859036ms)
|
||||
✔ a role without Vikunja takes no tracker block (1.794665ms)
|
||||
✔ credential references match the definition's services (2.085982ms)
|
||||
✔ launch (7.086473ms)
|
||||
✖ REQ-THREAD-2 REQ-LAUNCH-1 launch.threadIdleSeconds: absent is the default, a positive integer is used, anything else refuses (1.873155ms)
|
||||
✔ loadBusiness: file checks (1.836006ms)
|
||||
✔ loadBusiness: not a regular file (33.126148ms)
|
||||
✔ loading writes nothing (0.991228ms)
|
||||
✔ names that are Object.prototype properties don't count as declared (2.665916ms)
|
||||
✔ the shipped example refuses as written and validates once filled in (0.725874ms)
|
||||
✔ the role file loads and resolves through loadBusiness (4.79078ms)
|
||||
✔ the shipped file is exactly the approved list (0.158921ms)
|
||||
✔ the resolved record matches the approved list, so a widened file fails (1.244414ms)
|
||||
✔ the chief of staff holds role.launch and message.send; every other action is gated (1.044887ms)
|
||||
✔ the pm does not hold role.launch (1.110278ms)
|
||||
✔ a business grant of a gated action through limits does not widen the role (1.319799ms)
|
||||
✔ a limit that drops role.launch leaves the chief of staff with no launch block (0.850052ms)
|
||||
✔ a launch block whose by is the pm instance is refused (1.015666ms)
|
||||
✔ the contract names no duty to talk to the human and the pm contract no launch (0.259506ms)
|
||||
✔ the instance takes no credential references and no tracker (1.476247ms)
|
||||
ℹ tests 26
|
||||
ℹ suites 0
|
||||
ℹ pass 25
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 124.980325
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/business.test.mjs:141:1
|
||||
✖ REQ-THREAD-2 REQ-LAUNCH-1 launch.threadIdleSeconds: absent is the default, a positive integer is used, anything else refuses (1.873155ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at refuses (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/business/tests/business.test.mjs:12:10)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/business/tests/business.test.mjs:146:5)
|
||||
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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
✔ each launch rereads limits and model selections; lowered limits keep sessions and log exact hit (19.915043ms)
|
||||
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1242.541116ms)
|
||||
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (667.784987ms)
|
||||
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (2659.538962ms)
|
||||
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (165.164734ms)
|
||||
✔ a runner that stops at once ends its launch with the runner's reason (244.530348ms)
|
||||
✔ a Claude Code launch with no session credential refuses before it starts (122.183664ms)
|
||||
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (207.419548ms)
|
||||
✔ a runner killed from the host ends its launch as killed, not failed (272.077701ms)
|
||||
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (139.11971ms)
|
||||
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1205.319805ms)
|
||||
✔ 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 (705.884959ms)
|
||||
✔ 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 (3793.14788ms)
|
||||
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (127.192117ms)
|
||||
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (131.34889ms)
|
||||
✔ a launch client that never closes its side doesn't hold the host's close (149.466618ms)
|
||||
✔ a runner that ignores SIGTERM is killed when the host closes (1270.179402ms)
|
||||
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.428705ms)
|
||||
✔ 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 (5534.447461ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (1651.32796ms)
|
||||
✖ 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 (291.643127ms)
|
||||
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (95.163821ms)
|
||||
ℹ tests 22
|
||||
ℹ suites 0
|
||||
ℹ pass 21
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 13195.787591
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/thread-launch.test.mjs:229:1
|
||||
✖ 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 (291.643127ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
... Skipped lines
|
||||
|
||||
[
|
||||
[
|
||||
'../evil',
|
||||
'assistant',
|
||||
'thread-store-refused'
|
||||
...
|
||||
'coder',
|
||||
+ 'launch-failed'
|
||||
- 'thread-not-allowed'
|
||||
]
|
||||
]
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:246: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: [ [ '../evil', 'assistant', 'thread-store-refused' ], [ 'coder-thread', 'coder', 'launch-failed' ] ],
|
||||
expected: [ [ '../evil', 'assistant', 'thread-store-refused' ], [ 'coder-thread', 'coder', 'thread-not-allowed' ] ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
✔ each launch rereads limits and model selections; lowered limits keep sessions and log exact hit (20.377018ms)
|
||||
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1249.068872ms)
|
||||
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (536.588096ms)
|
||||
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (2677.844983ms)
|
||||
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (168.812066ms)
|
||||
✔ a runner that stops at once ends its launch with the runner's reason (244.096828ms)
|
||||
✔ a Claude Code launch with no session credential refuses before it starts (122.391413ms)
|
||||
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (215.228769ms)
|
||||
✔ a runner killed from the host ends its launch as killed, not failed (285.364796ms)
|
||||
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (170.932582ms)
|
||||
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1094.364064ms)
|
||||
✔ 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 (694.336627ms)
|
||||
✔ 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 (3684.186737ms)
|
||||
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (118.440214ms)
|
||||
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (130.686099ms)
|
||||
✔ a launch client that never closes its side doesn't hold the host's close (132.045934ms)
|
||||
✔ a runner that ignores SIGTERM is killed when the host closes (1266.759434ms)
|
||||
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.27209ms)
|
||||
✔ 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 (5530.730938ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (1732.9147ms)
|
||||
✔ 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 (255.324556ms)
|
||||
✖ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (144.122136ms)
|
||||
ℹ tests 22
|
||||
ℹ suites 0
|
||||
ℹ pass 21
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 12887.33538
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/thread-launch.test.mjs:258:1
|
||||
✖ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (144.122136ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
{
|
||||
+ error: 'launch-failed',
|
||||
- error: 'thread-required',
|
||||
ok: false
|
||||
}
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:264: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: { ok: false, error: 'launch-failed' },
|
||||
expected: { ok: false, error: 'thread-required' },
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
✔ each launch rereads limits and model selections; lowered limits keep sessions and log exact hit (18.406958ms)
|
||||
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1252.747781ms)
|
||||
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (518.970849ms)
|
||||
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (2665.673401ms)
|
||||
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (168.569845ms)
|
||||
✔ a runner that stops at once ends its launch with the runner's reason (248.529489ms)
|
||||
✔ a Claude Code launch with no session credential refuses before it starts (127.013677ms)
|
||||
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (209.320522ms)
|
||||
✔ a runner killed from the host ends its launch as killed, not failed (271.245636ms)
|
||||
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (131.428678ms)
|
||||
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1072.140335ms)
|
||||
✔ 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 (694.622404ms)
|
||||
✔ 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 (3663.256913ms)
|
||||
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (115.1559ms)
|
||||
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (122.668416ms)
|
||||
✔ a launch client that never closes its side doesn't hold the host's close (133.241795ms)
|
||||
✔ a runner that ignores SIGTERM is killed when the host closes (1265.436841ms)
|
||||
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.219458ms)
|
||||
✖ 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 (20405.601838ms)
|
||||
✖ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (30299.497649ms)
|
||||
✔ 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 (298.026494ms)
|
||||
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (93.070066ms)
|
||||
ℹ tests 22
|
||||
ℹ suites 0
|
||||
ℹ pass 20
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 51169.333442
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/thread-launch.test.mjs:154:1
|
||||
✖ 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 (20405.601838ms)
|
||||
Error: timed out waiting
|
||||
at until (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
|
||||
at async idleStop (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:148:3)
|
||||
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:174:3)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
|
||||
|
||||
test at tests/thread-launch.test.mjs:202:1
|
||||
✖ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (30299.497649ms)
|
||||
Error: timed out waiting
|
||||
at until (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
|
||||
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:215:18)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
@@ -0,0 +1,49 @@
|
||||
✔ each launch rereads limits and model selections; lowered limits keep sessions and log exact hit (19.562663ms)
|
||||
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1255.174493ms)
|
||||
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (540.087627ms)
|
||||
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (2632.982763ms)
|
||||
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (163.399889ms)
|
||||
✔ a runner that stops at once ends its launch with the runner's reason (242.93155ms)
|
||||
✔ a Claude Code launch with no session credential refuses before it starts (124.419034ms)
|
||||
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (209.139434ms)
|
||||
✔ a runner killed from the host ends its launch as killed, not failed (278.571445ms)
|
||||
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (146.531692ms)
|
||||
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1090.007851ms)
|
||||
✔ 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 (722.63013ms)
|
||||
✔ 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 (3721.306324ms)
|
||||
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (130.480289ms)
|
||||
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (150.617356ms)
|
||||
✔ a launch client that never closes its side doesn't hold the host's close (162.1329ms)
|
||||
✔ a runner that ignores SIGTERM is killed when the host closes (1294.493915ms)
|
||||
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.574501ms)
|
||||
✔ 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 (5522.053981ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (1682.9124ms)
|
||||
✖ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (1317.298085ms)
|
||||
✔ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (166.268519ms)
|
||||
✔ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (290.188981ms)
|
||||
✔ 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 (291.118611ms)
|
||||
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (142.091929ms)
|
||||
ℹ tests 25
|
||||
ℹ suites 0
|
||||
ℹ pass 24
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 12956.072198
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/thread-launch.test.mjs:227:1
|
||||
✖ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (1317.298085ms)
|
||||
AssertionError [ERR_ASSERTION]: [{"at":"2026-10-15T17:25:08.603Z","event":"launch","instance":"assistant","thread":"2a68c78a-61b7-4d08-aeb7-7408a9a51037","run":"r15771ddd5607","launchedBy":"jason","harness":"pi","model":"claude-sonnet-5-5","provider":"zai","modelKey":"claude-sonnet-5-5","pid":709332,"runnerPid":709333,"manifest":"/home/jwoltje/darkwing-scratch/r121/tmp/mosaic-thread-dBkQtE/data/launches/acme/r15771ddd5607/bundle/manifest.json"},{"at":"2026-10-15T17:25:09.655Z","event":"thread-idle","instance":"assistant","thread":"2a68c78a-61b7-4d08-aeb7-7408a9a51037","run":"r15771ddd5607"},{"at":"2026-10-15T17:25:09.676Z","event":"end","instance":"assistant","thread":"2a68c78a-61b7-4d08-aeb7-7408a9a51037","run":"r15771ddd5607","reason":"stopped","exitCode":0,"signal":null}]
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:238: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: undefined,
|
||||
expected: true,
|
||||
operator: '==',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
✔ each launch rereads limits and model selections; lowered limits keep sessions and log exact hit (19.267331ms)
|
||||
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1243.563027ms)
|
||||
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (517.703923ms)
|
||||
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (2656.268226ms)
|
||||
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (167.627416ms)
|
||||
✔ a runner that stops at once ends its launch with the runner's reason (243.533795ms)
|
||||
✔ a Claude Code launch with no session credential refuses before it starts (135.095646ms)
|
||||
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (202.415084ms)
|
||||
✔ a runner killed from the host ends its launch as killed, not failed (280.190147ms)
|
||||
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (143.192526ms)
|
||||
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1088.312875ms)
|
||||
✔ 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 (711.264026ms)
|
||||
✔ 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 (3673.949445ms)
|
||||
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (121.412801ms)
|
||||
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (124.293912ms)
|
||||
✔ a launch client that never closes its side doesn't hold the host's close (132.264191ms)
|
||||
✔ a runner that ignores SIGTERM is killed when the host closes (1257.251623ms)
|
||||
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.531299ms)
|
||||
✖ 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 (20374.022466ms)
|
||||
✖ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (30410.632282ms)
|
||||
✔ 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 (244.731086ms)
|
||||
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (123.218463ms)
|
||||
ℹ tests 22
|
||||
ℹ suites 0
|
||||
ℹ pass 20
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 51226.325585
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/thread-launch.test.mjs:154:1
|
||||
✖ 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 (20374.022466ms)
|
||||
Error: timed out waiting
|
||||
at until (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
|
||||
at async idleStop (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:148:3)
|
||||
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:174:3)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
|
||||
|
||||
test at tests/thread-launch.test.mjs:202:1
|
||||
✖ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (30410.632282ms)
|
||||
Error: timed out waiting
|
||||
at until (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
|
||||
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:215:18)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
@@ -0,0 +1,57 @@
|
||||
✔ each launch rereads limits and model selections; lowered limits keep sessions and log exact hit (19.871029ms)
|
||||
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1305.532006ms)
|
||||
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (627.826261ms)
|
||||
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (2647.583306ms)
|
||||
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (179.372848ms)
|
||||
✔ a runner that stops at once ends its launch with the runner's reason (275.970026ms)
|
||||
✔ a Claude Code launch with no session credential refuses before it starts (142.555831ms)
|
||||
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (220.272646ms)
|
||||
✔ a runner killed from the host ends its launch as killed, not failed (282.778895ms)
|
||||
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (139.10517ms)
|
||||
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1273.620283ms)
|
||||
✔ 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 (698.529945ms)
|
||||
✔ 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 (3650.543681ms)
|
||||
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (115.043312ms)
|
||||
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (146.567173ms)
|
||||
✔ a launch client that never closes its side doesn't hold the host's close (131.502678ms)
|
||||
✔ a runner that ignores SIGTERM is killed when the host closes (1257.591297ms)
|
||||
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.385381ms)
|
||||
✖ 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 (20181.370648ms)
|
||||
✖ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (20152.386328ms)
|
||||
✖ 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 (20128.448381ms)
|
||||
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (117.099471ms)
|
||||
ℹ tests 22
|
||||
ℹ suites 0
|
||||
ℹ pass 19
|
||||
ℹ fail 3
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 60652.094703
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/thread-launch.test.mjs:154:1
|
||||
✖ 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 (20181.370648ms)
|
||||
Error: timed out waiting
|
||||
at until (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
|
||||
at async ask (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:140:17)
|
||||
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:166:17)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
|
||||
|
||||
test at tests/thread-launch.test.mjs:202:1
|
||||
✖ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (20152.386328ms)
|
||||
Error: timed out waiting
|
||||
at until (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
|
||||
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:212:19)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
|
||||
test at tests/thread-launch.test.mjs:229:1
|
||||
✖ 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 (20128.448381ms)
|
||||
Error: timed out waiting
|
||||
at until (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
|
||||
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:242:20)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
@@ -0,0 +1,52 @@
|
||||
✔ each launch rereads limits and model selections; lowered limits keep sessions and log exact hit (19.070581ms)
|
||||
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1267.369702ms)
|
||||
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (526.052411ms)
|
||||
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (2721.1826ms)
|
||||
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (171.868574ms)
|
||||
✔ a runner that stops at once ends its launch with the runner's reason (236.528519ms)
|
||||
✔ a Claude Code launch with no session credential refuses before it starts (127.11747ms)
|
||||
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (203.989167ms)
|
||||
✔ a runner killed from the host ends its launch as killed, not failed (277.700637ms)
|
||||
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (152.928072ms)
|
||||
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1192.90218ms)
|
||||
✔ 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 (703.227997ms)
|
||||
✔ 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 (3639.002284ms)
|
||||
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (117.510182ms)
|
||||
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (125.257603ms)
|
||||
✔ a launch client that never closes its side doesn't hold the host's close (151.971851ms)
|
||||
✔ a runner that ignores SIGTERM is killed when the host closes (1273.492437ms)
|
||||
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.24438ms)
|
||||
✔ 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 (5541.915046ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (1638.801171ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (4300.026052ms)
|
||||
✔ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (107.415827ms)
|
||||
✖ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (318.008312ms)
|
||||
✔ 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 (232.428284ms)
|
||||
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (87.857069ms)
|
||||
ℹ tests 25
|
||||
ℹ suites 0
|
||||
ℹ pass 24
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 12981.339564
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/thread-launch.test.mjs:262:1
|
||||
✖ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (318.008312ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
|
||||
2 !== 1
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:282: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: 2,
|
||||
expected: 1,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,83 @@
|
||||
✔ each launch rereads limits and model selections; lowered limits keep sessions and log exact hit (18.755296ms)
|
||||
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1246.350834ms)
|
||||
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (627.838053ms)
|
||||
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (2671.481992ms)
|
||||
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (155.052823ms)
|
||||
✔ a runner that stops at once ends its launch with the runner's reason (246.980209ms)
|
||||
✔ a Claude Code launch with no session credential refuses before it starts (135.998141ms)
|
||||
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (207.156602ms)
|
||||
✔ a runner killed from the host ends its launch as killed, not failed (279.400991ms)
|
||||
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (140.461373ms)
|
||||
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1245.154065ms)
|
||||
✔ 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 (731.908217ms)
|
||||
✔ 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 (3642.816254ms)
|
||||
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (113.254215ms)
|
||||
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (130.69387ms)
|
||||
✔ a launch client that never closes its side doesn't hold the host's close (134.367402ms)
|
||||
✔ a runner that ignores SIGTERM is killed when the host closes (1257.057321ms)
|
||||
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.390485ms)
|
||||
✖ 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 (349.259881ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (1650.7345ms)
|
||||
✖ 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 (312.080472ms)
|
||||
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (86.470271ms)
|
||||
ℹ tests 22
|
||||
ℹ suites 0
|
||||
ℹ pass 20
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 13059.257874
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/thread-launch.test.mjs:154:1
|
||||
✖ 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 (349.259881ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
{
|
||||
before: [],
|
||||
body: 'first for A',
|
||||
+ transcripts: null
|
||||
- transcripts: []
|
||||
}
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:167:10)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
|
||||
generatedMessage: true,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: { body: 'first for A', before: [], transcripts: null },
|
||||
expected: { body: 'first for A', before: [], transcripts: [] },
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at tests/thread-launch.test.mjs:229:1
|
||||
✖ 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 (312.080472ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
[
|
||||
[
|
||||
'../evil',
|
||||
'assistant',
|
||||
+ 'launch-failed'
|
||||
- 'thread-store-refused'
|
||||
],
|
||||
[
|
||||
'coder-thread',
|
||||
'coder',
|
||||
'thread-not-allowed'
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:246: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: [ [ '../evil', 'assistant', 'launch-failed' ], [ 'coder-thread', 'coder', 'thread-not-allowed' ] ],
|
||||
expected: [ [ '../evil', 'assistant', 'thread-store-refused' ], [ 'coder-thread', 'coder', 'thread-not-allowed' ] ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,48 @@
|
||||
✔ each launch rereads limits and model selections; lowered limits keep sessions and log exact hit (18.583252ms)
|
||||
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1244.297288ms)
|
||||
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (583.140953ms)
|
||||
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (2679.722016ms)
|
||||
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (166.011588ms)
|
||||
✔ a runner that stops at once ends its launch with the runner's reason (241.35567ms)
|
||||
✔ a Claude Code launch with no session credential refuses before it starts (133.904949ms)
|
||||
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (220.933554ms)
|
||||
✔ a runner killed from the host ends its launch as killed, not failed (278.032941ms)
|
||||
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (143.596781ms)
|
||||
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1077.492282ms)
|
||||
✔ 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 (719.477999ms)
|
||||
✔ 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 (3760.099043ms)
|
||||
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (170.167411ms)
|
||||
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (207.640724ms)
|
||||
✔ a launch client that never closes its side doesn't hold the host's close (324.142807ms)
|
||||
✔ a runner that ignores SIGTERM is killed when the host closes (1686.362458ms)
|
||||
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.844053ms)
|
||||
✖ 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 (24329.114224ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (1951.682436ms)
|
||||
✖ 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 (20118.61511ms)
|
||||
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (96.879594ms)
|
||||
ℹ tests 22
|
||||
ℹ suites 0
|
||||
ℹ pass 20
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 46568.560479
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/thread-launch.test.mjs:154:1
|
||||
✖ 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 (24329.114224ms)
|
||||
Error: timed out waiting
|
||||
at until (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
|
||||
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:198:18)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3)
|
||||
|
||||
test at tests/thread-launch.test.mjs:229:1
|
||||
✖ 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 (20118.61511ms)
|
||||
Error: timed out waiting
|
||||
at until (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:41:9)
|
||||
at async TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:242:20)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
|
||||
@@ -0,0 +1,66 @@
|
||||
✔ each launch rereads limits and model selections; lowered limits keep sessions and log exact hit (20.788363ms)
|
||||
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1242.283962ms)
|
||||
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (538.115328ms)
|
||||
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (2643.544762ms)
|
||||
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (166.47704ms)
|
||||
✔ a runner that stops at once ends its launch with the runner's reason (242.845309ms)
|
||||
✔ a Claude Code launch with no session credential refuses before it starts (131.777294ms)
|
||||
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (208.939321ms)
|
||||
✔ a runner killed from the host ends its launch as killed, not failed (276.456112ms)
|
||||
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (162.783611ms)
|
||||
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1151.513539ms)
|
||||
✔ 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 (732.858642ms)
|
||||
✔ 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 (3650.221567ms)
|
||||
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (120.387591ms)
|
||||
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (129.096165ms)
|
||||
✔ a launch client that never closes its side doesn't hold the host's close (130.627289ms)
|
||||
✔ a runner that ignores SIGTERM is killed when the host closes (1276.786984ms)
|
||||
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.302235ms)
|
||||
✔ 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 (5542.097249ms)
|
||||
✖ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (1662.475473ms)
|
||||
✖ 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 (253.099836ms)
|
||||
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (104.580019ms)
|
||||
ℹ tests 22
|
||||
ℹ suites 0
|
||||
ℹ pass 20
|
||||
ℹ fail 2
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 12898.579572
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/thread-launch.test.mjs:202:1
|
||||
✖ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (1662.475473ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
|
||||
13 !== 1
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:223: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: 13,
|
||||
expected: 1,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
|
||||
test at tests/thread-launch.test.mjs:229:1
|
||||
✖ 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 (253.099836ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
|
||||
8 !== 2
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:250: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: 8,
|
||||
expected: 2,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,45 @@
|
||||
✔ each launch rereads limits and model selections; lowered limits keep sessions and log exact hit (19.981075ms)
|
||||
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1254.857619ms)
|
||||
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (610.003171ms)
|
||||
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (2679.348353ms)
|
||||
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (182.409634ms)
|
||||
✔ a runner that stops at once ends its launch with the runner's reason (249.239874ms)
|
||||
✔ a Claude Code launch with no session credential refuses before it starts (127.557908ms)
|
||||
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (204.772843ms)
|
||||
✔ a runner killed from the host ends its launch as killed, not failed (309.561813ms)
|
||||
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (133.905612ms)
|
||||
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1093.195878ms)
|
||||
✔ 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 (703.078268ms)
|
||||
✔ 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 (3649.847271ms)
|
||||
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (118.494893ms)
|
||||
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (125.770965ms)
|
||||
✔ a launch client that never closes its side doesn't hold the host's close (136.250001ms)
|
||||
✔ a runner that ignores SIGTERM is killed when the host closes (1259.057547ms)
|
||||
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.29769ms)
|
||||
✖ 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 (356.290929ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (1645.519711ms)
|
||||
✔ 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 (261.791227ms)
|
||||
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (103.27997ms)
|
||||
ℹ tests 22
|
||||
ℹ suites 0
|
||||
ℹ pass 21
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 12932.373421
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/thread-launch.test.mjs:154:1
|
||||
✖ 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 (356.290929ms)
|
||||
Error: ENOENT: no such file or directory, open '/home/jwoltje/darkwing-scratch/r121/tmp/mosaic-thread-OruI5d/data/threads/acme/a994390d-61ba-4df5-a8ae-12a9ccbb390d/session/history'
|
||||
at readFileSync (node:fs:621:20)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:171:16)
|
||||
at async Test.run (node:internal/test_runner/test:1409:7)
|
||||
at async startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
|
||||
errno: -2,
|
||||
code: 'ENOENT',
|
||||
syscall: 'open',
|
||||
path: '/home/jwoltje/darkwing-scratch/r121/tmp/mosaic-thread-OruI5d/data/threads/acme/a994390d-61ba-4df5-a8ae-12a9ccbb390d/session/history'
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
✔ each launch rereads limits and model selections; lowered limits keep sessions and log exact hit (20.577918ms)
|
||||
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1347.408805ms)
|
||||
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (856.969853ms)
|
||||
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (1844.886193ms)
|
||||
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (185.890201ms)
|
||||
✔ a runner that stops at once ends its launch with the runner's reason (258.258332ms)
|
||||
✔ a Claude Code launch with no session credential refuses before it starts (132.904763ms)
|
||||
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (212.205458ms)
|
||||
✔ a runner killed from the host ends its launch as killed, not failed (277.293558ms)
|
||||
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (141.176528ms)
|
||||
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1094.205324ms)
|
||||
✔ 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 (690.609494ms)
|
||||
✔ 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 (3661.319895ms)
|
||||
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (117.112549ms)
|
||||
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (123.104828ms)
|
||||
✔ a launch client that never closes its side doesn't hold the host's close (130.251104ms)
|
||||
✔ a runner that ignores SIGTERM is killed when the host closes (1254.409993ms)
|
||||
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.243923ms)
|
||||
✔ 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 (5601.66897ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a running thread counts against its model's limit and an idle-stopped one doesn't (1656.084334ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 a turn longer than the idle time isn't stopped, and the thread idles out after it (4355.1345ms)
|
||||
✖ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (185.433393ms)
|
||||
✔ REQ-LAUNCH-1 a run that ends without taking its thread's message isn't started again for that message (201.597265ms)
|
||||
✔ 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 (230.986849ms)
|
||||
✔ REQ-THREAD-1 REQ-LAUNCH-1 the chief can't launch the assistant outside a thread (90.022082ms)
|
||||
ℹ tests 25
|
||||
ℹ suites 0
|
||||
ℹ pass 24
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 12420.125857
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/thread-launch.test.mjs:244:1
|
||||
✖ REQ-ROLE-2 REQ-LAUNCH-1 a thread held by a run the launcher didn't start gets no second session (185.433393ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
+ [
|
||||
+ {
|
||||
+ business: 'acme',
|
||||
+ harness: 'pi',
|
||||
+ instance: 'assistant',
|
||||
+ launchedBy: 'jason',
|
||||
+ live: true,
|
||||
+ model: 'claude-sonnet-5-5',
|
||||
+ modelKey: 'claude-sonnet-5-5',
|
||||
+ pid: 712625,
|
||||
+ provider: 'zai',
|
||||
+ run: 'r1deeb0269405',
|
||||
+ runDir: '/home/jwoltje/darkwing-scratch/r121/tmp/mosaic-thread-MNBTg0/data/launches/acme/r1deeb0269405',
|
||||
+ runnerPid: 712626,
|
||||
+ runnerStartTime: '18631611',
|
||||
+ startTime: '18631611',
|
||||
+ startedAt: '2026-10-15T17:25:25.923Z',
|
||||
+ thread: '1d9e29d7-bae5-42ca-aefa-6f2295676840'
|
||||
+ }
|
||||
+ ]
|
||||
- []
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/cli/tests/thread-launch.test.mjs:255: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: [ { business: 'acme', instance: 'assistant', thread: '1d9e29d7-bae5-42ca-aefa-6f2295676840', run: 'r1deeb0269405', launchedBy: 'jason', harness: 'pi', model: 'claude-sonnet-5-5', provider: 'zai', modelKey: 'claude-sonnet-5-5', pid: 712625, startTime: '18631611', runnerPid: 712626, runnerStartTime: '18631611', runDir: '/home/jwoltje/darkwing-scratch/r121/tmp/mosaic-thread-MNBTg0/data/launches/acme/r1deeb0269405', startedAt: '2026-10-15T17:25:25.923Z', live: true } ],
|
||||
expected: [],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,84 @@
|
||||
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (121.414934ms)
|
||||
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (109.398976ms)
|
||||
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (126.363151ms)
|
||||
✔ endLaunch leaves a claim another run took alone (146.430088ms)
|
||||
✔ refuse records action.refused against the caller with the code only (109.348081ms)
|
||||
✔ launches off refuses role.launch with launch-revoked until launches on (152.105299ms)
|
||||
✖ broker process: launch ops authorize role.launch, record refusals and end runs (221.303267ms)
|
||||
✔ the assistant sends to the user and to the chief of staff only (272.366465ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (310.530015ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (306.891559ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (286.753267ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (280.245798ms)
|
||||
✔ the sender list is checked before the target list (225.293115ms)
|
||||
✔ roles without the field behave exactly as before (358.637006ms)
|
||||
✔ a business with no role definitions at all is unlimited (277.742367ms)
|
||||
✔ a malformed messaging field refuses at boot (84.912235ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (275.749008ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (306.36266ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (285.316753ms)
|
||||
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (191.34923ms)
|
||||
✔ startup token refusal returns safe code without value or partial listening broker (49.161224ms)
|
||||
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (171.929515ms)
|
||||
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (159.456573ms)
|
||||
✔ trusted host registers later launches; socket clients never have a registration verb (165.830955ms)
|
||||
✔ runtime excludes declared project roots even when host supplies no repoRoots (40.488001ms)
|
||||
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (156.646134ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1214.642014ms)
|
||||
✔ creates private WAL store and excludes a second writer until explicit close (106.501176ms)
|
||||
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (141.021481ms)
|
||||
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (158.092261ms)
|
||||
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (144.893139ms)
|
||||
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (84.470036ms)
|
||||
✔ async transactions refuse before invoking their function (80.353732ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (283.219535ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (935.576642ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (267.038481ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3335.224702ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (140.563046ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (149.178513ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (145.487934ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (105.474471ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (137.515022ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (433.549887ms)
|
||||
ℹ tests 43
|
||||
ℹ suites 0
|
||||
ℹ pass 42
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6024.05312
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/end-launch.test.mjs:135:1
|
||||
✖ broker process: launch ops authorize role.launch, record refusals and end runs (221.303267ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
+ []
|
||||
- [
|
||||
- {
|
||||
- holder: null,
|
||||
- instance: 'coder',
|
||||
- lastClaim: null,
|
||||
- lastMessage: null,
|
||||
- lastOpen: '2026-10-15T00:00:01.000Z',
|
||||
- pending: 0,
|
||||
- thread: 'th-1',
|
||||
- unread: 0
|
||||
- }
|
||||
- ]
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/end-launch.test.mjs:184: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: [],
|
||||
expected: [ { thread: 'th-1', instance: 'coder', pending: 0, unread: 0, lastMessage: null, lastOpen: '2026-10-15T00:00:01.000Z', lastClaim: null, holder: null } ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
✖ the assistant sends to the user and to the chief of staff only (252.278786ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (306.390861ms)
|
||||
✖ only the user and the chief of staff may send to the assistant; the tester is refused by default (269.270964ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (277.173542ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (286.408242ms)
|
||||
✔ the sender list is checked before the target list (241.424171ms)
|
||||
✔ roles without the field behave exactly as before (339.665966ms)
|
||||
✖ a business with no role definitions at all is unlimited (248.764439ms)
|
||||
✔ a malformed messaging field refuses at boot (76.288852ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (321.900992ms)
|
||||
✖ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (287.168883ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (264.615405ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1189.921083ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (268.182001ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (947.581255ms)
|
||||
✖ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (249.909591ms)
|
||||
✖ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (217.815198ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (251.115065ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (268.825632ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (250.967418ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (228.963176ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (254.575366ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (551.390093ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 17
|
||||
ℹ fail 6
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 3549.756591
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/messaging.test.mjs:92:1
|
||||
✖ the assistant sends to the user and to the chief of staff only (252.278786ms)
|
||||
Error: storage-refused
|
||||
at #refused (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:772:47)
|
||||
at Broker.request (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:830:26)
|
||||
at call (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/messaging.test.mjs:76:44)
|
||||
at send (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/messaging.test.mjs:80:9)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/messaging.test.mjs:96: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) {
|
||||
code: 'storage-refused'
|
||||
}
|
||||
|
||||
test at tests/messaging.test.mjs:124:1
|
||||
✖ only the user and the chief of staff may send to the assistant; the tester is refused by default (269.270964ms)
|
||||
Error: storage-refused
|
||||
at #refused (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:772:47)
|
||||
at Broker.request (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:830:26)
|
||||
at call (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/messaging.test.mjs:76:44)
|
||||
at send (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/messaging.test.mjs:80:9)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/messaging.test.mjs:127:18)
|
||||
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) {
|
||||
code: 'storage-refused'
|
||||
}
|
||||
|
||||
test at tests/messaging.test.mjs:188:1
|
||||
✖ a business with no role definitions at all is unlimited (248.764439ms)
|
||||
Error: storage-refused
|
||||
at #refused (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:772:47)
|
||||
at Broker.request (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:830:26)
|
||||
at call (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/messaging.test.mjs:76:44)
|
||||
at send (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/messaging.test.mjs:80:9)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/messaging.test.mjs:193:18)
|
||||
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) {
|
||||
code: 'storage-refused'
|
||||
}
|
||||
|
||||
test at tests/messaging.test.mjs:265:1
|
||||
✖ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (287.168883ms)
|
||||
Error: storage-refused
|
||||
at #refused (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:772:47)
|
||||
at Broker.request (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:830:26)
|
||||
at Object.call (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/messaging.test.mjs:76:44)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/messaging.test.mjs:270:23)
|
||||
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'
|
||||
}
|
||||
|
||||
test at tests/threads.test.mjs:180:1
|
||||
✖ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (249.909591ms)
|
||||
Error: storage-refused
|
||||
at #refused (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:772:47)
|
||||
at Broker.request (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:830:26)
|
||||
at call (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:50:44)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:199:19)
|
||||
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'
|
||||
}
|
||||
|
||||
test at tests/threads.test.mjs:234:1
|
||||
✖ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (217.815198ms)
|
||||
Error: storage-refused
|
||||
at #refused (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:772:47)
|
||||
at Broker.request (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/src/broker.mjs:830:26)
|
||||
at call (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:50:44)
|
||||
at run (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:238:17)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:241:16)
|
||||
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) {
|
||||
code: 'storage-refused'
|
||||
}
|
||||
@@ -0,0 +1,64 @@
|
||||
✔ RUNNER_FILES is exactly what the runner and the harness sources it starts import (1.592818ms)
|
||||
✔ sandboxProblem names a missing bwrap and a bwrap that fails (7.393797ms)
|
||||
✔ every bind says why; the bundle and session file stay read-only over the run directory (1.225407ms)
|
||||
✖ REQ-THREAD-2 a thread store binds its session directory and Claude transcripts, and nothing more (1.411438ms)
|
||||
✔ the host's git socket is bound only when given, read-only and before the writable binds (1.028013ms)
|
||||
✔ the git identity is the instance's, at <instance>@<business>.mosaic.invalid, and sandboxArgv refuses without it (1.031616ms)
|
||||
✔ a confined session's shell reaches its own workspace and run directory and nothing of the founder's or another session's (1738.913555ms)
|
||||
✔ a bind that exposes a stand-in, or a missing workspace bind, fails the matching check (2474.751539ms)
|
||||
✔ a confined session that runs tester-cli.mjs is refused as tester, and the same shim outside the sandbox binds (260.220194ms)
|
||||
✔ REQ-LIMIT-1: family substring matching is no longer exported (0.71083ms)
|
||||
✔ sessionEnv passes only the allowlist, the repo's bin on PATH, and the run id (0.641023ms)
|
||||
✔ sessionExit gives a runner's signal death back as the signal; a session credential is one whole set of nonempty variables (0.250223ms)
|
||||
✔ newRun: short ids, 0700 directories, and a refusal when the socket path won't fit (1.388863ms)
|
||||
✔ session file and launch log: 0600, the session file written once (1.009776ms)
|
||||
✔ endReason maps the runner's exit codes; a signal is killed (0.121947ms)
|
||||
✔ Registry mirrors to sessions.json; readSessions marks live entries; bad files refuse (1.212105ms)
|
||||
✔ REQ-THREAD-1 Registry.running keys a thread run by business, instance and thread (0.568468ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.38061ms)
|
||||
✔ stopSession refuses an unknown run, reports a stale one, and won't signal a pid that isn't a runner (0.912565ms)
|
||||
✔ a session runs in its sandbox as pid 1 of its namespace, claims, answers, and stops on mosaic stop (318.291562ms)
|
||||
ℹ tests 20
|
||||
ℹ suites 0
|
||||
ℹ pass 19
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 4548.908881
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/sandbox.test.mjs:75:1
|
||||
✖ REQ-THREAD-2 a thread store binds its session directory and Claude transcripts, and nothing more (1.411438ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
|
||||
+ actual - expected
|
||||
|
||||
+ []
|
||||
- [
|
||||
- {
|
||||
- dest: undefined,
|
||||
- kind: 'rw',
|
||||
- src: '/home/jwoltje/darkwing-scratch/r121/tmp/mosaic-sandbox-IPBFD4/threads/acme/th/session'
|
||||
- },
|
||||
- {
|
||||
- dest: '/home/jwoltje/darkwing-scratch/r121/tmp/mosaic-sandbox-IPBFD4/run/home/.claude/projects',
|
||||
- kind: 'rw',
|
||||
- src: '/home/jwoltje/darkwing-scratch/r121/tmp/mosaic-sandbox-IPBFD4/threads/acme/th/claude-projects'
|
||||
- }
|
||||
- ]
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/seat/tests/sandbox.test.mjs:83: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: [],
|
||||
expected: [ { kind: 'rw', src: '/home/jwoltje/darkwing-scratch/r121/tmp/mosaic-sandbox-IPBFD4/threads/acme/th/session', dest: undefined }, { kind: 'rw', src: '/home/jwoltje/darkwing-scratch/r121/tmp/mosaic-sandbox-IPBFD4/threads/acme/th/claude-projects', dest: '/home/jwoltje/darkwing-scratch/r121/tmp/mosaic-sandbox-IPBFD4/run/home/.claude/projects' } ],
|
||||
operator: 'deepStrictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,62 @@
|
||||
✔ RUNNER_FILES is exactly what the runner and the harness sources it starts import (1.612453ms)
|
||||
✔ sandboxProblem names a missing bwrap and a bwrap that fails (7.32882ms)
|
||||
✔ every bind says why; the bundle and session file stay read-only over the run directory (1.237538ms)
|
||||
✔ REQ-THREAD-2 a thread store binds its session directory and Claude transcripts, and nothing more (0.804654ms)
|
||||
✔ the host's git socket is bound only when given, read-only and before the writable binds (0.961467ms)
|
||||
✔ the git identity is the instance's, at <instance>@<business>.mosaic.invalid, and sandboxArgv refuses without it (1.004655ms)
|
||||
✔ a confined session's shell reaches its own workspace and run directory and nothing of the founder's or another session's (1686.29487ms)
|
||||
✔ a bind that exposes a stand-in, or a missing workspace bind, fails the matching check (2441.153151ms)
|
||||
✔ a confined session that runs tester-cli.mjs is refused as tester, and the same shim outside the sandbox binds (263.703141ms)
|
||||
✔ REQ-LIMIT-1: family substring matching is no longer exported (0.722938ms)
|
||||
✔ sessionEnv passes only the allowlist, the repo's bin on PATH, and the run id (0.647424ms)
|
||||
✔ sessionExit gives a runner's signal death back as the signal; a session credential is one whole set of nonempty variables (0.238441ms)
|
||||
✔ newRun: short ids, 0700 directories, and a refusal when the socket path won't fit (1.426709ms)
|
||||
✔ session file and launch log: 0600, the session file written once (0.975357ms)
|
||||
✔ endReason maps the runner's exit codes; a signal is killed (0.118514ms)
|
||||
✔ Registry mirrors to sessions.json; readSessions marks live entries; bad files refuse (1.299378ms)
|
||||
✖ REQ-THREAD-1 Registry.running keys a thread run by business, instance and thread (1.351633ms)
|
||||
✔ REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.337573ms)
|
||||
✔ stopSession refuses an unknown run, reports a stale one, and won't signal a pid that isn't a runner (0.896593ms)
|
||||
✔ a session runs in its sandbox as pid 1 of its namespace, claims, answers, and stops on mosaic stop (268.416115ms)
|
||||
ℹ tests 20
|
||||
ℹ suites 0
|
||||
ℹ pass 19
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 4462.289681
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/session.test.mjs:138:1
|
||||
✖ REQ-THREAD-1 Registry.running keys a thread run by business, instance and thread (1.351633ms)
|
||||
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
|
||||
+ actual - expected
|
||||
|
||||
+ {
|
||||
+ business: 'acme',
|
||||
+ instance: 'assistant',
|
||||
+ model: 'm',
|
||||
+ provider: 'zai',
|
||||
+ run: 'r1',
|
||||
+ runnerPid: 574178,
|
||||
+ runnerStartTime: '18573832',
|
||||
+ thread: 'th-a'
|
||||
+ }
|
||||
- null
|
||||
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/seat/tests/session.test.mjs:143: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: { business: 'acme', instance: 'assistant', provider: 'zai', model: 'm', runnerPid: 574178, runnerStartTime: '18573832', run: 'r1', thread: 'th-a' },
|
||||
expected: null,
|
||||
operator: 'strictEqual',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
✔ RUNNER_FILES is exactly what the runner and the harness sources it starts import (1.674638ms)
|
||||
✔ sandboxProblem names a missing bwrap and a bwrap that fails (8.463851ms)
|
||||
✔ every bind says why; the bundle and session file stay read-only over the run directory (1.310559ms)
|
||||
✔ REQ-THREAD-2 a thread store binds its session directory and Claude transcripts, and nothing more (0.791714ms)
|
||||
✔ the host's git socket is bound only when given, read-only and before the writable binds (0.96631ms)
|
||||
✔ the git identity is the instance's, at <instance>@<business>.mosaic.invalid, and sandboxArgv refuses without it (1.014128ms)
|
||||
✔ a confined session's shell reaches its own workspace and run directory and nothing of the founder's or another session's (1802.783962ms)
|
||||
✔ a bind that exposes a stand-in, or a missing workspace bind, fails the matching check (2524.619472ms)
|
||||
✔ a confined session that runs tester-cli.mjs is refused as tester, and the same shim outside the sandbox binds (276.177237ms)
|
||||
✔ REQ-LIMIT-1: family substring matching is no longer exported (0.760169ms)
|
||||
✔ sessionEnv passes only the allowlist, the repo's bin on PATH, and the run id (0.685018ms)
|
||||
✔ sessionExit gives a runner's signal death back as the signal; a session credential is one whole set of nonempty variables (0.241827ms)
|
||||
✔ newRun: short ids, 0700 directories, and a refusal when the socket path won't fit (1.502181ms)
|
||||
✔ session file and launch log: 0600, the session file written once (0.963777ms)
|
||||
✔ endReason maps the runner's exit codes; a signal is killed (0.113679ms)
|
||||
✔ Registry mirrors to sessions.json; readSessions marks live entries; bad files refuse (1.274221ms)
|
||||
✔ REQ-THREAD-1 Registry.running keys a thread run by business, instance and thread (0.550259ms)
|
||||
✖ REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.143998ms)
|
||||
✔ stopSession refuses an unknown run, reports a stale one, and won't signal a pid that isn't a runner (0.94175ms)
|
||||
✔ a session runs in its sandbox as pid 1 of its namespace, claims, answers, and stops on mosaic stop (261.712104ms)
|
||||
ℹ tests 20
|
||||
ℹ suites 0
|
||||
ℹ pass 19
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 4681.473585
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/session.test.mjs:152:1
|
||||
✖ REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.143998ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception: acme/a..b
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/seat/tests/session.test.mjs:155:12)
|
||||
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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,57 @@
|
||||
✔ RUNNER_FILES is exactly what the runner and the harness sources it starts import (1.649808ms)
|
||||
✔ sandboxProblem names a missing bwrap and a bwrap that fails (9.109237ms)
|
||||
✔ every bind says why; the bundle and session file stay read-only over the run directory (1.276767ms)
|
||||
✔ REQ-THREAD-2 a thread store binds its session directory and Claude transcripts, and nothing more (0.83921ms)
|
||||
✔ the host's git socket is bound only when given, read-only and before the writable binds (0.957313ms)
|
||||
✔ the git identity is the instance's, at <instance>@<business>.mosaic.invalid, and sandboxArgv refuses without it (1.052691ms)
|
||||
✔ a confined session's shell reaches its own workspace and run directory and nothing of the founder's or another session's (1779.076208ms)
|
||||
✔ a bind that exposes a stand-in, or a missing workspace bind, fails the matching check (2471.309021ms)
|
||||
✔ a confined session that runs tester-cli.mjs is refused as tester, and the same shim outside the sandbox binds (263.360015ms)
|
||||
✔ REQ-LIMIT-1: family substring matching is no longer exported (0.829636ms)
|
||||
✔ sessionEnv passes only the allowlist, the repo's bin on PATH, and the run id (0.734876ms)
|
||||
✔ sessionExit gives a runner's signal death back as the signal; a session credential is one whole set of nonempty variables (0.251836ms)
|
||||
✔ newRun: short ids, 0700 directories, and a refusal when the socket path won't fit (1.53428ms)
|
||||
✔ session file and launch log: 0600, the session file written once (1.059188ms)
|
||||
✔ endReason maps the runner's exit codes; a signal is killed (0.127106ms)
|
||||
✔ Registry mirrors to sessions.json; readSessions marks live entries; bad files refuse (1.399323ms)
|
||||
✔ REQ-THREAD-1 Registry.running keys a thread run by business, instance and thread (0.58752ms)
|
||||
✖ REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.058787ms)
|
||||
✔ stopSession refuses an unknown run, reports a stale one, and won't signal a pid that isn't a runner (0.942998ms)
|
||||
✔ a session runs in its sandbox as pid 1 of its namespace, claims, answers, and stops on mosaic stop (293.283411ms)
|
||||
ℹ tests 20
|
||||
ℹ suites 0
|
||||
ℹ pass 19
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 4589.866136
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/session.test.mjs:152:1
|
||||
✖ REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.058787ms)
|
||||
AssertionError [ERR_ASSERTION]: acme/a/b
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/seat/tests/session.test.mjs:155:12)
|
||||
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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: Error: ENOENT: no such file or directory, mkdir '/home/jwoltje/darkwing-scratch/r121/tmp/mosaic-session-BW0w8B/threads/acme/a/b'
|
||||
at mkdirSync (node:fs:1734:26)
|
||||
at threadStore (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/seat/src/session.mjs:71:7)
|
||||
at file:///home/jwoltje/darkwing-scratch/r121/wt/packages/seat/tests/session.test.mjs:155:25
|
||||
at getActual (node:assert:580:5)
|
||||
at strict.throws (node:assert:728:24)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/seat/tests/session.test.mjs:155:12)
|
||||
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),
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
✔ RUNNER_FILES is exactly what the runner and the harness sources it starts import (1.613424ms)
|
||||
✔ sandboxProblem names a missing bwrap and a bwrap that fails (8.085417ms)
|
||||
✔ every bind says why; the bundle and session file stay read-only over the run directory (1.354209ms)
|
||||
✔ REQ-THREAD-2 a thread store binds its session directory and Claude transcripts, and nothing more (0.83788ms)
|
||||
✔ the host's git socket is bound only when given, read-only and before the writable binds (0.993575ms)
|
||||
✔ the git identity is the instance's, at <instance>@<business>.mosaic.invalid, and sandboxArgv refuses without it (1.025275ms)
|
||||
✔ a confined session's shell reaches its own workspace and run directory and nothing of the founder's or another session's (1717.853391ms)
|
||||
✔ a bind that exposes a stand-in, or a missing workspace bind, fails the matching check (2395.986842ms)
|
||||
✔ a confined session that runs tester-cli.mjs is refused as tester, and the same shim outside the sandbox binds (263.864725ms)
|
||||
✔ REQ-LIMIT-1: family substring matching is no longer exported (0.722806ms)
|
||||
✔ sessionEnv passes only the allowlist, the repo's bin on PATH, and the run id (0.657243ms)
|
||||
✔ sessionExit gives a runner's signal death back as the signal; a session credential is one whole set of nonempty variables (0.226953ms)
|
||||
✔ newRun: short ids, 0700 directories, and a refusal when the socket path won't fit (1.4467ms)
|
||||
✔ session file and launch log: 0600, the session file written once (0.975097ms)
|
||||
✔ endReason maps the runner's exit codes; a signal is killed (0.117437ms)
|
||||
✔ Registry mirrors to sessions.json; readSessions marks live entries; bad files refuse (1.250087ms)
|
||||
✔ REQ-THREAD-1 Registry.running keys a thread run by business, instance and thread (0.595811ms)
|
||||
✖ REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.525675ms)
|
||||
✔ stopSession refuses an unknown run, reports a stale one, and won't signal a pid that isn't a runner (0.932334ms)
|
||||
✔ a session runs in its sandbox as pid 1 of its namespace, claims, answers, and stops on mosaic stop (274.629654ms)
|
||||
ℹ tests 20
|
||||
ℹ suites 0
|
||||
ℹ pass 19
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 4456.416476
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/session.test.mjs:152:1
|
||||
✖ REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.525675ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/seat/tests/session.test.mjs:167: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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,47 @@
|
||||
✔ RUNNER_FILES is exactly what the runner and the harness sources it starts import (1.563118ms)
|
||||
✔ sandboxProblem names a missing bwrap and a bwrap that fails (7.73629ms)
|
||||
✔ every bind says why; the bundle and session file stay read-only over the run directory (1.42641ms)
|
||||
✔ REQ-THREAD-2 a thread store binds its session directory and Claude transcripts, and nothing more (0.807001ms)
|
||||
✔ the host's git socket is bound only when given, read-only and before the writable binds (0.993228ms)
|
||||
✔ the git identity is the instance's, at <instance>@<business>.mosaic.invalid, and sandboxArgv refuses without it (1.01145ms)
|
||||
✔ a confined session's shell reaches its own workspace and run directory and nothing of the founder's or another session's (1776.58533ms)
|
||||
✔ a bind that exposes a stand-in, or a missing workspace bind, fails the matching check (2614.733159ms)
|
||||
✔ a confined session that runs tester-cli.mjs is refused as tester, and the same shim outside the sandbox binds (259.903981ms)
|
||||
✔ REQ-LIMIT-1: family substring matching is no longer exported (0.676154ms)
|
||||
✔ sessionEnv passes only the allowlist, the repo's bin on PATH, and the run id (0.609979ms)
|
||||
✔ sessionExit gives a runner's signal death back as the signal; a session credential is one whole set of nonempty variables (0.280335ms)
|
||||
✔ newRun: short ids, 0700 directories, and a refusal when the socket path won't fit (1.451133ms)
|
||||
✔ session file and launch log: 0600, the session file written once (1.112882ms)
|
||||
✔ endReason maps the runner's exit codes; a signal is killed (0.118546ms)
|
||||
✔ Registry mirrors to sessions.json; readSessions marks live entries; bad files refuse (1.440303ms)
|
||||
✔ REQ-THREAD-1 Registry.running keys a thread run by business, instance and thread (0.57442ms)
|
||||
✖ REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.575787ms)
|
||||
✔ stopSession refuses an unknown run, reports a stale one, and won't signal a pid that isn't a runner (1.026615ms)
|
||||
✔ a session runs in its sandbox as pid 1 of its namespace, claims, answers, and stops on mosaic stop (298.506894ms)
|
||||
ℹ tests 20
|
||||
ℹ suites 0
|
||||
ℹ pass 19
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 4725.159301
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/session.test.mjs:152:1
|
||||
✖ REQ-THREAD-2 REQ-LAUNCH-1 threadStore checks both segments before the join and refuses an unsafe directory (1.575787ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/seat/tests/session.test.mjs:167: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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
✔ the assistant sends to the user and to the chief of staff only (280.039931ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (308.734668ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (324.613526ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (277.769323ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (294.977034ms)
|
||||
✔ the sender list is checked before the target list (250.69239ms)
|
||||
✔ roles without the field behave exactly as before (366.823249ms)
|
||||
✔ a business with no role definitions at all is unlimited (283.001512ms)
|
||||
✔ a malformed messaging field refuses at boot (68.511159ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (298.794158ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (307.451483ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (266.324186ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1253.970606ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (294.549528ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (957.321074ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (293.561636ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3474.041945ms)
|
||||
✖ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (145.964133ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (161.068164ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (157.446253ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (114.934473ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (148.881313ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (470.179678ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6277.19873
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:273:1
|
||||
✖ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (145.964133ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception: routed
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:283:12)
|
||||
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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /only to its thread's holder/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
✔ the assistant sends to the user and to the chief of staff only (264.345979ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (286.015063ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (319.730447ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (280.316949ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (302.823667ms)
|
||||
✔ the sender list is checked before the target list (250.800076ms)
|
||||
✔ roles without the field behave exactly as before (374.567471ms)
|
||||
✔ a business with no role definitions at all is unlimited (277.147042ms)
|
||||
✔ a malformed messaging field refuses at boot (72.273264ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (275.924078ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (323.82613ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (273.34327ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1222.720026ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (268.446122ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (954.054123ms)
|
||||
✖ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (296.066737ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3377.707776ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (143.597058ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (163.708251ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (177.194782ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (99.495081ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (126.349967ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (462.437086ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6129.794819
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:180:1
|
||||
✖ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (296.066737ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:227: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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /to or from the thread's instance/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
✔ the assistant sends to the user and to the chief of staff only (454.480125ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (523.225035ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (490.043806ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (465.289579ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (563.785617ms)
|
||||
✔ the sender list is checked before the target list (311.62094ms)
|
||||
✔ roles without the field behave exactly as before (568.56703ms)
|
||||
✔ a business with no role definitions at all is unlimited (401.495919ms)
|
||||
✔ a malformed messaging field refuses at boot (92.864899ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (322.297265ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (488.565236ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (348.407934ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1994.176523ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (465.82871ms)
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1575.242188ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (521.223165ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (4834.937753ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (239.885976ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (243.408964ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (257.170931ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (165.365951ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (170.127893ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (735.568012ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 9273.045308
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:120:1
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1575.242188ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception: message_threads DELETE
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:175:12)
|
||||
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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /message_threads is append-only/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
✔ the assistant sends to the user and to the chief of staff only (369.701845ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (465.539126ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (483.290993ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (393.587599ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (457.813123ms)
|
||||
✔ the sender list is checked before the target list (338.010935ms)
|
||||
✔ roles without the field behave exactly as before (486.56163ms)
|
||||
✔ a business with no role definitions at all is unlimited (402.313007ms)
|
||||
✔ a malformed messaging field refuses at boot (127.301027ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (466.157386ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (366.068166ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (250.981586ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1798.900531ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (377.651943ms)
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1435.993036ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (445.412471ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (4102.589117ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (164.881551ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (157.213636ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (149.436777ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (108.161704ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (141.340566ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (477.185575ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 7616.380023
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:120:1
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1435.993036ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception: message_threads INSERT OR REPLACE
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:176:12)
|
||||
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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /message_threads is append-only/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
✔ the assistant sends to the user and to the chief of staff only (283.159403ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (303.044471ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (306.630226ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (287.973839ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (286.616503ms)
|
||||
✔ the sender list is checked before the target list (228.372571ms)
|
||||
✔ roles without the field behave exactly as before (332.967616ms)
|
||||
✔ a business with no role definitions at all is unlimited (256.864159ms)
|
||||
✔ a malformed messaging field refuses at boot (71.87034ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (281.061733ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (320.215271ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (251.040808ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1216.692008ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (280.715994ms)
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (950.060943ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (289.949115ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3459.882374ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (237.851243ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (268.060456ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (261.206356ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (192.78611ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (256.990957ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (841.276644ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 7106.279378
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:120:1
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (950.060943ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception: message_threads UPDATE
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:174:12)
|
||||
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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /message_threads is append-only/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
✔ the assistant sends to the user and to the chief of staff only (260.6843ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (337.941454ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (352.135834ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (298.356639ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (299.730465ms)
|
||||
✔ the sender list is checked before the target list (247.703844ms)
|
||||
✔ roles without the field behave exactly as before (388.348235ms)
|
||||
✔ a business with no role definitions at all is unlimited (274.882714ms)
|
||||
✔ a malformed messaging field refuses at boot (74.079397ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (318.657804ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (332.873725ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (271.071599ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1277.484394ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (271.333432ms)
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1021.885114ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (292.561065ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3456.457429ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (150.922641ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (161.458479ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (147.5973ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (105.22006ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (149.109121ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (477.992957ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6289.810284
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:120:1
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1021.885114ms)
|
||||
AssertionError [ERR_ASSERTION]: projects DELETE
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:175:12)
|
||||
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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: Error: FOREIGN KEY constraint failed
|
||||
at file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:175:28
|
||||
at getActual (node:assert:580:5)
|
||||
at strict.throws (node:assert:728:24)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:175:12)
|
||||
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),
|
||||
expected: /projects is append-only/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
✔ the assistant sends to the user and to the chief of staff only (306.601841ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (324.37944ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (324.424004ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (307.512135ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (299.35063ms)
|
||||
✔ the sender list is checked before the target list (249.90091ms)
|
||||
✔ roles without the field behave exactly as before (348.950155ms)
|
||||
✔ a business with no role definitions at all is unlimited (264.570925ms)
|
||||
✔ a malformed messaging field refuses at boot (71.98321ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (278.889989ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (310.185999ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (275.267232ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1313.849365ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (316.031721ms)
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1014.259539ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (294.739636ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3286.396799ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (135.121941ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (146.15622ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (138.390065ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (105.026708ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (143.479709ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (443.17016ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6083.918623
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:120:1
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1014.259539ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception: projects INSERT OR REPLACE
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:176:12)
|
||||
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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /projects is append-only/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
✔ the assistant sends to the user and to the chief of staff only (272.682854ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (323.224077ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (327.376407ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (294.267169ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (298.056577ms)
|
||||
✔ the sender list is checked before the target list (454.10739ms)
|
||||
✔ roles without the field behave exactly as before (375.761904ms)
|
||||
✔ a business with no role definitions at all is unlimited (278.507481ms)
|
||||
✔ a malformed messaging field refuses at boot (79.275379ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (303.966306ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (328.684197ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (270.924513ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1243.621779ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (254.419094ms)
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1016.524311ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (293.208039ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (4013.924261ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (179.076235ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (162.082905ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (155.237868ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (104.611519ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (210.545493ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (483.804776ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6936.000789
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:120:1
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1016.524311ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception: projects UPDATE
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:174:12)
|
||||
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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /projects is append-only/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
✔ the assistant sends to the user and to the chief of staff only (240.921572ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (305.243726ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (308.424159ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (287.075287ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (295.946036ms)
|
||||
✔ the sender list is checked before the target list (241.082651ms)
|
||||
✔ roles without the field behave exactly as before (344.62222ms)
|
||||
✔ a business with no role definitions at all is unlimited (284.744224ms)
|
||||
✔ a malformed messaging field refuses at boot (76.242919ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (299.680664ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (305.639522ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (254.072527ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1201.097571ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (262.75625ms)
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (956.763999ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (289.42704ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3389.208376ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (153.957245ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (202.613989ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (614.021154ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (110.268314ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (140.489138ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (440.946206ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6615.498191
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:120:1
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (956.763999ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:155: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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /a thread claim names the thread's business/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
✔ the assistant sends to the user and to the chief of staff only (262.430997ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (329.546293ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (314.89264ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (278.720709ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (282.310859ms)
|
||||
✔ the sender list is checked before the target list (258.872954ms)
|
||||
✔ roles without the field behave exactly as before (367.754024ms)
|
||||
✔ a business with no role definitions at all is unlimited (280.713228ms)
|
||||
✔ a malformed messaging field refuses at boot (74.887688ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (278.031874ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (310.957345ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (275.779553ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1222.984557ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (273.440242ms)
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (968.237678ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (288.437568ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3545.183638ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (153.909374ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (161.131176ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (169.955468ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (109.217079ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (155.595061ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (464.000612ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6351.640951
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:120:1
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (968.237678ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception: thread_claims DELETE
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:175:12)
|
||||
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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /thread_claims is append-only/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
✔ the assistant sends to the user and to the chief of staff only (235.576938ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (322.725858ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (331.484537ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (301.053646ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (283.355113ms)
|
||||
✔ the sender list is checked before the target list (245.972185ms)
|
||||
✔ roles without the field behave exactly as before (365.188938ms)
|
||||
✔ a business with no role definitions at all is unlimited (262.812997ms)
|
||||
✔ a malformed messaging field refuses at boot (71.143417ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (300.022139ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (310.445071ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (244.325343ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1231.663188ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (241.11496ms)
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1010.750909ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (278.751207ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3362.437458ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (141.348769ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (152.110511ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (141.96297ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (106.235756ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (147.682885ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (495.245975ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6137.365085
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:120:1
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1010.750909ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception: thread_claims INSERT OR REPLACE
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:176:12)
|
||||
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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /thread_claims is append-only/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
✔ the assistant sends to the user and to the chief of staff only (258.632376ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (304.082831ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (302.592641ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (276.372429ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (296.223305ms)
|
||||
✔ the sender list is checked before the target list (244.720855ms)
|
||||
✔ roles without the field behave exactly as before (356.421878ms)
|
||||
✔ a business with no role definitions at all is unlimited (237.064864ms)
|
||||
✔ a malformed messaging field refuses at boot (69.208225ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (271.308081ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (322.195103ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (270.870018ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1200.435869ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (263.684408ms)
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (940.964502ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (291.291727ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3367.577905ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (151.445417ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (153.255033ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (152.79632ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (104.115967ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (137.995254ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (439.664404ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6060.194978
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:120:1
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (940.964502ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception: thread_claims UPDATE
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:174:12)
|
||||
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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /thread_claims is append-only/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
✔ the assistant sends to the user and to the chief of staff only (276.743349ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (331.486338ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (320.944093ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (279.7441ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (329.212469ms)
|
||||
✔ the sender list is checked before the target list (242.551235ms)
|
||||
✔ roles without the field behave exactly as before (338.457289ms)
|
||||
✔ a business with no role definitions at all is unlimited (254.953122ms)
|
||||
✔ a malformed messaging field refuses at boot (68.125733ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (265.681709ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (311.776801ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (257.250974ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1257.917627ms)
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (246.774932ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (976.252843ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (328.86234ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3382.29727ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (149.712851ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (142.249555ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (167.586027ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (145.040833ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (166.437538ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (498.6645ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6263.961915
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:80:1
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (246.774932ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:95: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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /thread already held/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,49 @@
|
||||
✔ the assistant sends to the user and to the chief of staff only (260.696191ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (307.835825ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (328.961655ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (286.427899ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (306.222082ms)
|
||||
✔ the sender list is checked before the target list (250.625801ms)
|
||||
✔ roles without the field behave exactly as before (367.137867ms)
|
||||
✔ a business with no role definitions at all is unlimited (255.117677ms)
|
||||
✔ a malformed messaging field refuses at boot (74.428529ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (284.174459ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (312.953636ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (272.981298ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1222.63012ms)
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (246.634063ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (969.780742ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (293.508794ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3836.014299ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (168.379646ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (144.020657ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (144.349561ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (97.28627ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (137.382259ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (471.804499ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6571.681375
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:80:1
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (246.634063ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:98: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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /run already holds a thread/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
✔ the assistant sends to the user and to the chief of staff only (275.809837ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (286.576917ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (346.19812ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (285.452814ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (303.265133ms)
|
||||
✔ the sender list is checked before the target list (240.188716ms)
|
||||
✔ roles without the field behave exactly as before (350.017147ms)
|
||||
✔ a business with no role definitions at all is unlimited (265.346562ms)
|
||||
✔ a malformed messaging field refuses at boot (69.209825ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (295.910435ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (322.482471ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (271.321408ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1256.600625ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (287.788833ms)
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (985.472493ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (290.791877ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3414.08872ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (159.834444ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (144.557491ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (140.484149ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (100.480989ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (141.154706ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (445.227751ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6169.794867
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:120:1
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (985.472493ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception: thread_opens DELETE
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:175:12)
|
||||
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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /thread_opens is append-only/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
✔ the assistant sends to the user and to the chief of staff only (264.138026ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (316.556135ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (343.333999ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (294.929494ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (290.708993ms)
|
||||
✔ the sender list is checked before the target list (238.564666ms)
|
||||
✔ roles without the field behave exactly as before (330.235895ms)
|
||||
✔ a business with no role definitions at all is unlimited (253.812089ms)
|
||||
✔ a malformed messaging field refuses at boot (66.656319ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (280.336223ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (316.570699ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (269.332623ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1282.077775ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (288.845815ms)
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1022.302633ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (276.97ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3291.686373ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (153.958168ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (144.047721ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (143.984085ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (105.362573ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (134.102846ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (438.28375ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6057.548047
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:120:1
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1022.302633ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception: thread_opens INSERT OR REPLACE
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:176:12)
|
||||
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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /thread_opens is append-only/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
✔ the assistant sends to the user and to the chief of staff only (273.909245ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (313.689625ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (328.798162ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (294.645643ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (285.102637ms)
|
||||
✔ the sender list is checked before the target list (239.762024ms)
|
||||
✔ roles without the field behave exactly as before (360.660605ms)
|
||||
✔ a business with no role definitions at all is unlimited (306.906036ms)
|
||||
✔ a malformed messaging field refuses at boot (78.662193ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (296.940231ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (335.547612ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (249.604615ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1265.158222ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (293.73433ms)
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (985.539049ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (271.566193ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3482.667601ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (142.078391ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (152.110929ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (161.262803ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (109.61245ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (143.069087ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (484.384726ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6283.962854
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:120:1
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (985.539049ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception: thread_opens UPDATE
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:174:12)
|
||||
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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /thread_opens is append-only/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
✔ the assistant sends to the user and to the chief of staff only (294.428081ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (346.245927ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (316.18133ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (290.769786ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (274.481462ms)
|
||||
✔ the sender list is checked before the target list (256.379181ms)
|
||||
✔ roles without the field behave exactly as before (375.260444ms)
|
||||
✔ a business with no role definitions at all is unlimited (269.534092ms)
|
||||
✔ a malformed messaging field refuses at boot (78.822868ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (296.948339ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (309.499624ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (261.685811ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1271.763212ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (303.130894ms)
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (981.611975ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (294.139013ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3564.20345ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (156.958639ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (152.852775ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (144.407759ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (107.098079ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (136.39148ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (451.393839ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6347.492229
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:120:1
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (981.611975ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:157: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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /thread is not held/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
✔ the assistant sends to the user and to the chief of staff only (290.195018ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (338.740204ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (324.941168ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (279.965112ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (336.976885ms)
|
||||
✔ the sender list is checked before the target list (269.071417ms)
|
||||
✔ roles without the field behave exactly as before (374.859009ms)
|
||||
✔ a business with no role definitions at all is unlimited (275.271133ms)
|
||||
✔ a malformed messaging field refuses at boot (68.804558ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (279.069386ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (308.848151ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (254.81357ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1287.093334ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (309.16295ms)
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1002.244514ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (341.234876ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3470.099825ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (154.226794ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (166.38072ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (153.332838ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (158.373371ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (148.707439ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (474.632229ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6435.665078
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:120:1
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1002.244514ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:161: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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /only the holder releases; others revoke/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
✔ the assistant sends to the user and to the chief of staff only (286.27716ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (330.11278ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (331.755243ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (295.84034ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (315.838642ms)
|
||||
✔ the sender list is checked before the target list (256.196874ms)
|
||||
✔ roles without the field behave exactly as before (380.25076ms)
|
||||
✔ a business with no role definitions at all is unlimited (282.093912ms)
|
||||
✔ a malformed messaging field refuses at boot (77.675371ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (302.410341ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (349.126409ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (266.254746ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1325.999417ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (308.374026ms)
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1011.130075ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (286.659011ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3528.896314ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (145.913689ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (145.072123ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (143.78755ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (109.178544ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (140.827044ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (455.137385ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6339.864042
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:120:1
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1011.130075ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.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 startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
|
||||
generatedMessage: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /revoke needs a resolved decision or a reason/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,61 @@
|
||||
✔ the assistant sends to the user and to the chief of staff only (265.538711ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (312.862396ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (325.51645ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (271.965976ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (283.271031ms)
|
||||
✔ the sender list is checked before the target list (235.933844ms)
|
||||
✔ roles without the field behave exactly as before (361.371908ms)
|
||||
✔ a business with no role definitions at all is unlimited (269.965577ms)
|
||||
✔ a malformed messaging field refuses at boot (74.792599ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (285.141191ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (299.599908ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (262.930413ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1251.200975ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (279.344096ms)
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (960.071281ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (270.733209ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3397.454311ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (194.851275ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (155.37308ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (142.638739ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (100.611414ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (136.119197ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (427.989349ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6121.836505
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:120:1
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (960.071281ms)
|
||||
AssertionError [ERR_ASSERTION]: threads DELETE
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:175:12)
|
||||
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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: Error: FOREIGN KEY constraint failed
|
||||
at file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:175:28
|
||||
at getActual (node:assert:580:5)
|
||||
at strict.throws (node:assert:728:24)
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:175:12)
|
||||
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),
|
||||
expected: /threads is append-only/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
✔ the assistant sends to the user and to the chief of staff only (274.934546ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (308.791663ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (336.266491ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (335.185154ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (298.476234ms)
|
||||
✔ the sender list is checked before the target list (228.068007ms)
|
||||
✔ roles without the field behave exactly as before (360.634627ms)
|
||||
✔ a business with no role definitions at all is unlimited (279.314638ms)
|
||||
✔ a malformed messaging field refuses at boot (76.31049ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (289.811009ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (310.541634ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (262.883316ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1308.714454ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (277.872102ms)
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1046.666603ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (283.531897ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3459.982014ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (141.731973ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (139.429694ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (144.469022ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (102.623249ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (136.228539ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (453.906715ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6247.203867
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:120:1
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (1046.666603ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception: threads INSERT OR REPLACE
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:176:12)
|
||||
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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /threads is append-only/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
✔ the assistant sends to the user and to the chief of staff only (261.96715ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (317.479673ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (304.734559ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (266.340616ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (290.853501ms)
|
||||
✔ the sender list is checked before the target list (230.939241ms)
|
||||
✔ roles without the field behave exactly as before (341.99987ms)
|
||||
✔ a business with no role definitions at all is unlimited (250.454249ms)
|
||||
✔ a malformed messaging field refuses at boot (68.797487ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (269.970255ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (306.97018ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (257.303542ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1188.789564ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (270.136083ms)
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (948.37075ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (274.912969ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3271.418089ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (178.872479ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (154.834043ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (149.108968ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (104.544072ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (138.978976ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (448.490757ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 5997.853575
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:120:1
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (948.37075ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception: threads UPDATE
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.test.mjs:174:12)
|
||||
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: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /threads is append-only/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,51 @@
|
||||
✔ the assistant sends to the user and to the chief of staff only (290.468333ms)
|
||||
✔ an assistant send to any other role, or to the tester, is refused and logged (326.775675ms)
|
||||
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (322.026089ms)
|
||||
✔ a sender-side list alone refuses a send to a role that has no list (305.300842ms)
|
||||
✔ a target-side list alone refuses a send from a role that has no list (308.090178ms)
|
||||
✔ the sender list is checked before the target list (226.136885ms)
|
||||
✔ roles without the field behave exactly as before (375.654186ms)
|
||||
✔ a business with no role definitions at all is unlimited (267.664251ms)
|
||||
✔ a malformed messaging field refuses at boot (75.3964ms)
|
||||
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (292.12391ms)
|
||||
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (329.545558ms)
|
||||
✔ review requests and verdicts between roles without the field are unchanged (269.26168ms)
|
||||
✔ v3b prototype refusals, views and append-only mutations (1282.74949ms)
|
||||
✔ REQ-ROLE-2 REQ-THREAD-1: one holder per thread, through the broker and the trigger (294.646711ms)
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (975.939816ms)
|
||||
✔ REQ-MSG-1: a message to or from the assistant names its thread, or is refused (299.104924ms)
|
||||
✔ REQ-MSG-1: the chief of staff's reply comes back to the thread that sent the work (3991.421849ms)
|
||||
✔ REQ-THREAD-1 REQ-USER-2: one thread's messages never reach another thread's holder (154.41724ms)
|
||||
✔ REQ-LAUNCH-1: a message to a thread with no holder waits, and the next holder gets it (155.950128ms)
|
||||
✔ REQ-USER-2: the human verbs refuse another owner's thread (152.234388ms)
|
||||
✔ REQ-THREAD-1: thread.create refuses when the business has no thread instance or more than one (124.782496ms)
|
||||
✔ REQ-ORG-2: projects and threads are named once, and the repo names a business project (154.010263ms)
|
||||
✔ REQ-THREAD-2: thread.messages returns the thread's history in pages and writes nothing (443.666864ms)
|
||||
ℹ tests 23
|
||||
ℹ suites 0
|
||||
ℹ pass 22
|
||||
ℹ fail 1
|
||||
ℹ cancelled 0
|
||||
ℹ skipped 0
|
||||
ℹ todo 0
|
||||
ℹ duration_ms 6805.040336
|
||||
|
||||
✖ failing tests:
|
||||
|
||||
test at tests/threads.test.mjs:120:1
|
||||
✖ REQ-ROLE-2 REQ-THREAD-1: the 3e triggers refuse writes that skip the broker (975.939816ms)
|
||||
AssertionError [ERR_ASSERTION]: Missing expected exception.
|
||||
at TestContext.<anonymous> (file:///home/jwoltje/darkwing-scratch/r121/wt/packages/bus/tests/threads.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 startSubtestAfterBootstrap (node:internal/test_runner/harness:387:3) {
|
||||
generatedMessage: false,
|
||||
code: 'ERR_ASSERTION',
|
||||
actual: undefined,
|
||||
expected: /a thread belongs to its project's business/,
|
||||
operator: 'throws',
|
||||
diff: 'simple'
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
repro 2026-10-15T17:30:24Z
|
||||
DIGESTS_OK
|
||||
rc=0
|
||||
Executable
+12
@@ -0,0 +1,12 @@
|
||||
#!/bin/bash
|
||||
# Rebuild row 121's candidate: export BASE, apply build.patch, check every
|
||||
# digest in candidate-manifest.sha256. Run from the packet directory.
|
||||
set -euo pipefail
|
||||
BASE=eaeb5ebf2b4bf3d4ba379523595fb529e3e5a789
|
||||
HERE=$(cd "$(dirname "$0")" && pwd)
|
||||
X=$(mktemp -d)
|
||||
trap 'rm -rf "$X"' EXIT
|
||||
git -C /mnt/storage/src/mosaic-stack archive "$BASE" | tar -x -C "$X"
|
||||
cd "$X"
|
||||
git apply "$HERE/build.patch"
|
||||
sha256sum -c --quiet "$HERE/candidate-manifest.sha256" && echo DIGESTS_OK
|
||||
@@ -0,0 +1,8 @@
|
||||
sweep 2026-10-15T17:29:40Z TMPDIR /home/jwoltje/darkwing-scratch/r121/tmp, after the mutant runs, the repeat runs and the gate
|
||||
entries by prefix:
|
||||
1385 mosaic-business
|
||||
72 mosaic-launch
|
||||
28 mosaic-thread
|
||||
processes with cwd under TMPDIR:
|
||||
0 found
|
||||
removed; left in TMPDIR: 0 2026-10-15T17:29:46Z
|
||||
Reference in new issue
Block a user