docs: add Dewey row 131 r2 packet (plug-in loader and setter fixes)

Round 2 for #1626 per sage-0314: F1a setter refuses a non-plain prototype,
F1b organization writer validates and logs JSON.parse(bytes), F2 loader
refuses unreadable paths, README top-level-code limit, control run.
Gate 591/0, 0 skipped; controls pass; mutants 47/47 killed (slot sage-0316).
Candidate manifest sha256 466c835f7dce79d20c7ab74c197a52b70e7fdeb0efae0456222dc6d0a633f219,
14 paths on base 0bdd573ff; no commit in base..1376caab9 touches them.

Co-Authored-By: Claude Opus 5.5 <[email protected]>
This commit is contained in:
2026-10-15 11:44:04 -05:00
co-authored by Claude Opus 5.5
parent 1376caab95
commit 80797a5398
70 changed files with 6485 additions and 0 deletions
+160
View File
@@ -0,0 +1,160 @@
# Row 131 / #1626: the plug-in layer, kind registry and loader (round 2)
Builder: Dewey. Brief: `docs/plans/2026-10-14_prd-1.2-build.md`, step 6b.
Requirements: REQ-PLUG-1 (the plug-in layer), REQ-LIMIT-4 (the first two kinds,
usage-source and limit-check). The `plugins` write goes through step 5's write
path (REQ-ROLE-3). Base: see `base.txt`. Source is in a detached worktree; nothing
here is pushed, wired into a host process or written to Jason's organization file.
Governing rulings: lead decision 143 (in-repo modules only until Jason rules on
Vikunja #286; no path from config) and sage-0301 (choices 1, 3, 4 and 5 as
proposed; choice 2 changed).
## Round 2 (sage-0314)
Round 1: Darkwing approved (28561, N1 and N2); Filbert asked for changes
(28560, F1 and F2). Sage ruled on both in sage-0314. Each item below is a change
on top of round 1 (`agents/dewey/work/queue-131/r1/`, committed 09447eb67).
| Item | Change | Test | Mutant |
| --- | --- | --- | --- |
| F1a | `plugin-settings.mjs` `set()` refuses with `invalid-plugins` unless `plugins` has prototype `Object.prototype` or `null`. A `Date` or a `Map` has no own keys and passed `checkPlugins`. | refusal list gains `new Date(0)` and a `Map`, still checking unchanged bytes and an empty log; the success test writes a null-prototype object | 46 |
| F1b | `organization.mjs` `write()` (row 122's writer, extended for this one change by sage-0314): after building the bytes it runs `validateBusinessDocument` on `JSON.parse(bytes)`, and `changes()` logs that parsed value. | "the writer checks the bytes it writes": a `Date` in `plugins` sent straight to `writer.write`, past the setter, throws `BusinessError`; bytes unchanged, log empty | 47 |
| F2 (Darkwing N1) | `loader.mjs`: one helper, `fsCall`, wraps the `lstat` in `component()` and both `realpath` calls. ENOENT and ENOTDIR stay `missing`; any other error refuses as `unreadable`, so `load()` logs it and keeps the kind's old modules instead of rejecting. | chmod 000 on the module directory (lstat of `index.mjs`); after the `checked` barrier, chmod 000 on the module directory (realpath of `index.mjs`) and on `<root>/packages` (realpath of `packages/plugins`). Skipped as root. | 43, 44, 45 |
| N2 (doc-only) | `packages/plugins/README.md`, limits: a module's top-level code runs at import, before the export and interface-version checks; a refused module has still run and Node's cache keeps it. The check list names `unreadable`. | none (doc) | none |
| Control | `mutants.py` first runs each distinct test set on the unmutated source and stops if any fails. | `MUTANTS.md`, control table | |
Two choices, recorded:
- **The in-memory validate stays.** `write()` still runs `validateBusinessDocument(document)`
before `JSON.stringify`, then validates the parsed bytes. Without the first,
a `BigInt` or a circular value would throw a raw `TypeError` from
`JSON.stringify` instead of a coded refusal. Sage's wording was "build bytes
first, then validate the parse"; this does that and keeps the earlier check.
- **`changes(old, written)` has no mutant of its own.** For any document that
passes both validations, `written` and `document` give the same
`changes()` result, so no test can tell `changes(old, document)` apart. Mutant
47 covers the validation, which is what refuses.
The `<root>/packages` case loads usage-source only: a locked `packages`
directory would refuse limit-check too, so the test names one kind and checks
limit-check switched off by its absent key.
`organization.mjs` is now in the candidate (14 paths). Rows 121 and 123 don't
list it. `packages/business/README.md` gains one sentence on the writer
checking its bytes (row 123 also edits that file).
## What ships
| Path | Change |
| --- | --- |
| `packages/plugins/package.json` | new package `@mosaic/plugins` |
| `packages/plugins/src/kinds.mjs` | kind registry: usage-source and limit-check, interface version 1, each switched on by a list; `checkPlugins` for the organization file's `plugins` key |
| `packages/plugins/src/loader.mjs` | `createLoader({log})` → `{load, loaded, modules}` |
| `packages/plugins/README.md` | kinds, export contract, adding a module, the key, the loader and its limits |
| `packages/plugins/tests/{helpers,kinds.test,loader.test}.mjs` | 21 tests |
| `packages/business/src/business.mjs` | `plugins` in TOP_KEYS; checked with `checkPlugins`; returned frozen (`{}` when absent) |
| `packages/business/src/plugin-settings.mjs` | the host setter: the only writer of `plugins`, through `organizationWriter` |
| `packages/business/tests/plugin-settings.test.mjs` | 4 tests: schema, setter success and log, setter refusals, writer refuses what JSON can't carry |
| `packages/business/README.md` | the `plugins` key and its writer; the writer checks the bytes it writes |
| `packages/business/src/organization.mjs` | `write()` validates and logs `JSON.parse(bytes)` (F1b) |
| `scripts/stack-copy.sh` | whole `packages/plugins` in COPY_PATHS (approved, sage-0301) |
| `packages/cli/tests/stack-copy.test.mjs` | the copied-path list includes the plug-in sources |
No module of either kind ships. No core module imports a plug-in module by
name: `business.mjs` and `plugin-settings.mjs` import only `kinds.mjs`, and
nothing imports `loader.mjs` outside its tests.
No limit ceiling is in code (Q150).
## sage-0301 rulings, as built
1. **One writer.** `pluginSettings({dir, rolesDir}).set(id, {revision, plugins}, actor)`
is the only writer. No broker verb, mosaic command, Settings form or
chief-of-staff write was added.
2. **A refused write throws a code and logs nothing.** `set` checks the request
shape (`invalid-request`: anything but `revision` and `plugins`, or a revision
that isn't 64 hex) and the value (`invalid-plugins`, from `checkPlugins`)
before the writer runs. The writer validates the whole document before its
`prepared` entry, so nothing reaches `changes.jsonl`. The test checks the
file bytes are unchanged and the log is empty after thirteen refusals (a `Date` and a `Map` added in round 2). A
committed write logs actor, transaction and old and new names per kind, the
same way a limit change does (`plugins` with old null when the key was
absent; `plugins.<kind>` with whole old and new lists after that).
Load-time refusals go through the loader's `log` callback.
3. **Last good modules per kind.** A loader instance holds, per kind, the
modules from its last good load. Any refusal for a kind keeps them. A kind
refused on its first load has nothing on. The test loads `["meter","absent"]`
so a half-loaded list would show. `load()` and `loaded()` report what each
kind actually has on. Every refusal calls `log` once with
`{event: "plugin-refused", kind, name, code, message, kept}`; the first-load
test checks kind and name. The loader is not wired into any host process.
4. **Export contract.** Every module exports `interfaceVersion`; usage-source
exports `readTurn`; limit-check exports `mayLaunch` and `mustStop`; both kinds
switch on a list. The README carries the contract. These names bind row 124.
Argument and return shapes are left to the calling rows.
5. **What is checked.** `packages/plugins`, `<kind>`, `<name>` (each an lstat:
exists, a directory, not a symlink) and `index.mjs` (exists, a regular file,
not a symlink); not the ancestors of `packages/plugins`. Just before
`import`, `realpath(index.mjs)` must equal
`realpath(packages/plugins)/<kind>/<name>/index.mjs`, and the import uses that
expected path. An error other than ENOENT or ENOTDIR from those reads (EACCES, ELOOP) refuses as
`unreadable` (round 2, F2).
## The check-then-import gap
For Darkwing, in those words: there is a check-then-import gap. The lstat
checks and the realpath comparison run, then `import()` opens the file by path.
Someone who can write `packages/plugins` as the host's user can swap
`index.mjs` (or a directory above it) between the realpath check and the open
inside `import()`. Node has no import-from-descriptor, so the loader cannot
close the gap. The checks catch mistakes, stale links and a link planted
before load; they do not stop a writer racing the host as the same user, and
such a writer could edit any core file anyway. The test with the `checked`
barrier swaps `index.mjs` for a symlink after the lstat checks and shows the
realpath check refusing it; it cannot show the narrower window after realpath.
The README states the same limit. Two related limits: a module runs with the
host's authority once imported (the loader does not sandbox it), and Node
caches modules by URL, so a changed `index.mjs` is not re-read until restart.
The `packages/plugins` symlink case is only reachable when Node keeps symlinked
paths (`--preserve-symlinks`); otherwise `import.meta.url` is already the real
path. The test runs that case in a child `node --preserve-symlinks`.
## Acceptance, mapped
| Acceptance item | Where |
| --- | --- |
| a test for each refusal, old setting kept | `loader.test.mjs`: bad name, missing (absent dir, empty dir, dir as index), symlink (name dir, index, kind dir, packages/plugins, realpath swap), load-failed (syntax error, top-level throw), missing export (absent, non-function, half of limit-check, no interfaceVersion), interface version (2, string "1"), unreadable (lstat, realpath of index.mjs, realpath of packages/plugins); each through `refusesKeepingOld`, which checks the kept setting, the one refusal entry and the one log call |
| fixture module of each kind switched on from a test organization file, no core file changed | `loader.test.mjs` first test: a business document built with business test helpers, validated by `validateBusinessDocument`, its `plugins` passed to the loader; fixture modules written into a temp copy of the package |
| one mutant per check, each failing a test | `MUTANTS.md`, `mutants.py`, `mutants/results.json` |
| `plugins` key in the schema, written through step 5's write path and logged like a limit change | `plugin-settings.test.mjs` |
REQ ids are in each test name.
## Gate (decision 136, targeted)
Approved list (sage-0301): plugins, business, bus, webui, cli, each
`node --test tests/*.test.mjs` (the command land-work.sh runs), via `gate.sh`.
Round 2 run 2026-10-15T16:41:04Z to 16:42:25Z in the slot Sage gave in sage-0316,
on the candidate as shipped in `build.patch`. Logs: `gate/`, summary `gate-run.log`.
| Package | Tests | Pass | Fail | Skipped |
| --- | --- | --- | --- | --- |
| plugins | 21 | 21 | 0 | 0 |
| business | 92 | 92 | 0 | 0 |
| bus | 171 | 171 | 0 | 0 |
| webui (includes pinned-copy.test.mjs) | 112 | 112 | 0 | 0 |
| cli (includes stack-copy.test.mjs) | 195 | 195 | 0 | 0 |
591 tests, 0 failed, 0 skipped: the chmod tests ran (not as root).
Not run: the other packages and the shell suites; Sage's full gate at the
landing target covers them (decision 136). BASE..refactor HEAD touches none of
the candidate's 14 paths (checked at packet time; see the commit message).
Mutants: control runs all pass; 47 of 47 killed (`MUTANTS.md`).
## Overlap
Row 123 (Researcher) also edits `packages/business/README.md`. Sage orders the
landings; the second row rebases.
+88
View File
@@ -0,0 +1,88 @@
# Row 131 mutants (round 2)
One fault per check. `mutants.py` makes each edit to the candidate, runs only the
listed test files with `node --test` in its own process group (whole-group kill at
300 s), records the result and restores the file. `mutants.py --dry` checks that each
mutation site matches. Per-mutant output is in `mutants/<id>.log`;
`mutants/results.json` holds every result. Run: 2026-10-15T16:42:28Z to 16:42:52Z, in
the slot Sage gave in sage-0316.
## Control
Before any mutant, each distinct test set runs on the unmutated candidate; one
failure stops the run (round 2, sage-0314). Logs: `mutants/control-*.log`,
`mutants/control.json`.
| Control | Test files | Exit | Tests | Pass | Fail | Skipped |
| --- | --- | --- | --- | --- | --- | --- |
| control-01 | plugins/tests/kinds.test.mjs, plugins/tests/loader.test.mjs | 0 | 21 | 21 | 0 | 0 |
| control-02 | plugins/tests/kinds.test.mjs | 0 | 5 | 5 | 0 | 0 |
| control-03 | plugins/tests/loader.test.mjs | 0 | 16 | 16 | 0 | 0 |
| control-04 | business/tests/plugin-settings.test.mjs, plugins/tests/loader.test.mjs | 0 | 20 | 20 | 0 | 0 |
| control-05 | business/tests/plugin-settings.test.mjs | 0 | 4 | 4 | 0 | 0 |
| control-06 | cli/tests/stack-copy.test.mjs | 0 | 12 | 12 | 0 | 0 |
All pass with 0 skipped, so the chmod tests (run as a normal user) ran.
## Mutants
Result: 47 of 47 cases run; 47 KILLED, 0 SURVIVED, 0 TIMEOUT.
| Mutant | Check | Result | Test files | First failing test |
| --- | --- | --- | --- | --- |
| 01-name-pattern | kinds: names must match ^[a-z][a-z0-9-]*$ | KILLED (exit 1) | plugins/tests/kinds.test.mjs, plugins/tests/loader.test.mjs | REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates |
| 02-list-cardinality | kinds: a list kind refuses a non-list | KILLED (exit 1) | plugins/tests/kinds.test.mjs, plugins/tests/loader.test.mjs | REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything |
| 03-one-cardinality | kinds: a one-module kind refuses a non-string | KILLED (exit 1) | plugins/tests/kinds.test.mjs | REQ-PLUG-1 a kind that switches on one module takes one name, not a list |
| 04-no-duplicates | kinds: a name twice refuses | KILLED (exit 1) | plugins/tests/kinds.test.mjs, plugins/tests/loader.test.mjs | REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates |
| 05-known-kind | kinds: an unknown kind refuses | KILLED (exit 1) | plugins/tests/kinds.test.mjs | REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates |
| 06-plugins-object | kinds: plugins must be a non-array object | KILLED (exit 1) | plugins/tests/kinds.test.mjs | REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates |
| 07-registry-exports | registry: limit-check exports mayLaunch and mustStop | KILLED (exit 1) | plugins/tests/kinds.test.mjs, plugins/tests/loader.test.mjs | REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source and limit-check at interface version 1, each a list |
| 08-registry-version | registry: usage-source is interface version 1 | KILLED (exit 1) | plugins/tests/kinds.test.mjs, plugins/tests/loader.test.mjs | REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source and limit-check at interface version 1, each a list |
| 09-missing-directory | loader: an absent path refuses as missing | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting |
| 10-component-type | loader: a component of the wrong type refuses | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting |
| 11-symlink-test | loader: a symlinked component refuses | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting |
| 12-plugins-dir-checked | loader: packages/plugins is checked | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) |
| 13-kind-dir-checked | loader: <kind> is checked | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting |
| 14-name-dir-checked | loader: <name> is checked | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting |
| 15-index-checked | loader: index.mjs is checked | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting |
| 16-realpath-before-import | loader: realpath(index.mjs) equals the expected path just before import | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check |
| 17-load-failure | loader: a module that fails to load refuses | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 a module that fails to load refuses and keeps the old setting |
| 18-export-present | loader: every export is present | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 a missing export refuses and keeps the old setting |
| 19-export-function | loader: the kind's exports are functions | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 a missing export refuses and keeps the old setting |
| 20-interface-version | loader: interfaceVersion must equal the kind's | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 a different interface version refuses and keeps the old setting |
| 21-version-strict | loader: the version comparison is strict (string "1" refuses) | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 a different interface version refuses and keeps the old setting |
| 22-keep-old-setting | loader: a refusal keeps the last good modules | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting |
| 23-first-load-nothing-on | loader: a kind refused on first load has nothing on | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name |
| 24-refusal-logged | loader: every refusal calls log | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting |
| 25-log-names-module | loader: the log names the refused module | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting |
| 26-log-kept | loader: the log says what stays on | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting |
| 27-whole-setting-object | loader: an array setting refuses every kind | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything |
| 28-unknown-kind-logged | loader: an unknown kind refuses and is logged | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything |
| 29-absent-key-off | loader: an absent key switches the kind off | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath |
| 30-loads-serialized | loader: loads run one at a time | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 loads run one at a time, so the last requested setting wins |
| 31-log-required | loader: createLoader needs a log callback | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 the loader needs a log callback |
| 32-schema-key | schema: plugins is an allowed top-level key | KILLED (exit 1) | business/tests/plugin-settings.test.mjs, plugins/tests/loader.test.mjs | REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names |
| 33-schema-check | schema: plugins is checked with checkPlugins | KILLED (exit 1) | business/tests/plugin-settings.test.mjs | REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names |
| 34-schema-returned | schema: plugins is returned | KILLED (exit 1) | business/tests/plugin-settings.test.mjs, plugins/tests/loader.test.mjs | REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names |
| 35-schema-copy | schema: the returned value is a frozen copy, the document stays mutable | KILLED (exit 1) | business/tests/plugin-settings.test.mjs | REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names |
| 36-setter-strict-keys | setter: only revision and plugins are accepted | KILLED (exit 1) | business/tests/plugin-settings.test.mjs | REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing |
| 37-setter-revision-format | setter: revision must be 64 hex | KILLED (exit 1) | business/tests/plugin-settings.test.mjs | REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing |
| 38-setter-checks-names | setter: plugins is checked before the writer runs | KILLED (exit 1) | business/tests/plugin-settings.test.mjs | REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing |
| 39-setter-actor-logged | setter: the actor is logged | KILLED (exit 1) | business/tests/plugin-settings.test.mjs | REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names |
| 40-setter-writes-plugins | setter: plugins is written | KILLED (exit 1) | business/tests/plugin-settings.test.mjs | REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names |
| 41-copy-ships-plugins | stack-copy: packages/plugins ships in the pinned copy | KILLED (exit 1) | cli/tests/stack-copy.test.mjs | shared copy: npm ci, pushed reachability, readonly/existing copy, webui delegation |
| 42-modules-known-kind | loader: modules() refuses an unknown kind | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything |
| 43-unreadable-refused | loader: a read error other than ENOENT/ENOTDIR refuses as unreadable | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting |
| 44-realpath-index-mapped | loader: realpath(index.mjs) errors become refusals | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath |
| 45-realpath-root-mapped | loader: realpath(packages/plugins) errors become refusals | KILLED (exit 1) | plugins/tests/loader.test.mjs | REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath |
| 46-setter-plain-prototype | setter: plugins must have prototype Object.prototype or null | KILLED (exit 1) | business/tests/plugin-settings.test.mjs | REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing |
| 47-writer-checks-bytes | writer: validates JSON.parse of the bytes it writes | KILLED (exit 1) | business/tests/plugin-settings.test.mjs | REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too |
New in round 2: 43, 44 and 45 (F2), 46 (F1a), 47 (F1b). 43 to 45 fail because
`load()` rejects on the raw EACCES instead of logging a refusal; 46 lets a `Date`
through the setter, written as a date string; 47 lets the writer take a `Date`
without a `BusinessError`. Mutant 09 now sits in the shared `fsCall` helper:
without the ENOENT mapping a missing path refuses as `unreadable`, not
`missing`. Mutant 17's log shows a SyntaxError: it is the fixture module's
deliberate syntax error, which the mutant rethrows instead of refusing.
`changes(old, written)` has no mutant; see BUILD.md, round 2.
+1
View File
@@ -0,0 +1 @@
0bdd573ffff11bd563113f0077e88e9075b5de58
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,14 @@
8f808be570152b19d7628f0d4cde663f43f7b9edce88eac98ff20e8343bc6f95 packages/business/README.md
46f0e977d78e579362b57415996041670e36c04017136359ec11b69ecd18e112 packages/business/src/business.mjs
1bb824b5def474074cc657e85f4a0efc086cdc4b2ccceb58c56725dcd4104958 packages/business/src/organization.mjs
638f208603e2b90467bef05b2a781cf04b3f80ce8cd9797b809fef15f880dc46 packages/business/src/plugin-settings.mjs
30ae39241217d29bbaf8f2eb9218c6f4fa515a7a8173f70f1aeb641322def7bb packages/business/tests/plugin-settings.test.mjs
924df6c3844708306f379bc88c47387a3ed648ef176b56fa38f9f2ae73c0f46a packages/cli/tests/stack-copy.test.mjs
ee1e75a16b349654fd98185c7407a9784e56d2dd7977ce10e067834bf233eb04 packages/plugins/README.md
90a9ac59a9ea2287e9a3d4b2f4286d025e727f2a6ce149464f8d0420fd9a8ef1 packages/plugins/package.json
ed9cba47f892554b78f4ae9803552e38005c2e11b608efebf9b9cf252b38e408 packages/plugins/src/kinds.mjs
a8491556216eea9b51f2d56a04183f01fdddeacf724f2bba84d69e544cc28378 packages/plugins/src/loader.mjs
af18df7dacc775b28cc2c67c5755017e4850f5200b9b4eace6f23f8638109a7a packages/plugins/tests/helpers.mjs
da606e8948ad26238084605c8d77042a64cf8f8ea1ca88247aa3931894c69bce packages/plugins/tests/kinds.test.mjs
be3e8f9c4cc2a765b0a74dbd7f74f2c54173281fbdccccc3a2c5aa909cb90bf3 packages/plugins/tests/loader.test.mjs
0b6becaa237500d69a4977cb79a2c0da67f728be4cd0b930dd506d445698f43a scripts/stack-copy.sh
@@ -0,0 +1,7 @@
gate start 2026-10-15T16:41:04Z
pkg-plugins start=2026-10-15T16:41:04Z end=2026-10-15T16:41:05Z rc=0 tests=21 pass=21 fail=0 skipped=0
pkg-business start=2026-10-15T16:41:05Z end=2026-10-15T16:41:07Z rc=0 tests=92 pass=92 fail=0 skipped=0
pkg-bus start=2026-10-15T16:41:07Z end=2026-10-15T16:41:11Z rc=0 tests=171 pass=171 fail=0 skipped=0
pkg-webui start=2026-10-15T16:41:11Z end=2026-10-15T16:42:06Z rc=0 tests=112 pass=112 fail=0 skipped=0
pkg-cli start=2026-10-15T16:42:06Z end=2026-10-15T16:42:25Z rc=0 tests=195 pass=195 fail=0 skipped=0
gate end 2026-10-15T16:42:25Z rc=0
+18
View File
@@ -0,0 +1,18 @@
#!/usr/bin/env bash
# Row 131 targeted builder gate (decision 136; list approved in sage-0301).
# Same command land-work.sh runs per package. One log per package under gate/.
set -uo pipefail
WT=${1:-$HOME/dewey-scratch/r131/wt}
OUT=$(cd "$(dirname "$0")" && pwd)/gate
mkdir -p "$OUT"
export TMPDIR=$HOME/dewey-scratch/tmp
status=0
for p in plugins business bus webui cli; do
start=$(date -u +%FT%TZ)
(cd "$WT/packages/$p" && node --test tests/*.test.mjs) >"$OUT/pkg-$p.log" 2>&1
rc=$?
counts=$(grep -E '^ℹ (tests|pass|fail|skipped) ' "$OUT/pkg-$p.log" | awk '{printf "%s=%s ", $2, $3}')
echo "pkg-$p start=$start end=$(date -u +%FT%TZ) rc=$rc $counts"
[ "$rc" -eq 0 ] || status=1
done
exit $status
@@ -0,0 +1,179 @@
✔ agents: a held role with nothing on the bus is idle; a role session gets the claim rows unchanged (150.890306ms)
✔ agents: working counts what the holder received and has not read; routed alone is not working (199.350773ms)
✔ agents: input needed is the role's open decisions routed to the human, gated first, then oldest (335.868521ms)
✔ agents: working wins over waiting, and Input needed still shows (158.368518ms)
✔ agents: a new holder doesn't inherit what the last one left unread; decisions stay with the role (206.929609ms)
✔ agents: state reads only its own business, even for a run name both use (186.357302ms)
✔ agents: a message the holder released unread is stranded; the next holder gets nothing and cannot read it (234.522298ms)
✔ agents: a message the holder read is not stranded; one the current holder has not read is not listed (213.56268ms)
✔ agents: stranded is oldest first and capped at 50 for a role (903.373985ms)
✔ agents: stranded is per role and per business (310.073427ms)
✔ agents: a message routed to a held role and not yet received is not stranded (118.590516ms)
✔ launch identity is stamped, payload identity is refused and stale holder cannot send (166.06202ms)
✔ decision classes route from policy; gated resolution is human-only, choice and target must match (249.015609ms)
✔ claim exclusion, holder release, gated revoke and rerouting to a new holder are atomic (279.298037ms)
✔ launch events require a human CLI capability; generic emit cannot forge authority events (177.154788ms)
✔ within-role decisions close atomically and invalid options or blocking omissions refuse (185.635754ms)
✔ a recommendation that is not exactly one option key refuses invalid-recommendation after the options (282.826811ms)
✔ observer capabilities read human inbox but cannot mutate or forge launch identity (191.502299ms)
✔ task action subjects and linked decision trail are complete and ordered (208.68307ms)
✔ launch binding is durable and reconnecting requires the identical trusted record (130.310089ms)
✔ business isolation includes inherited object names and cross-business message references (204.436747ms)
✔ authority never transfers between action, run, target, unresolved or replaced role holder (267.80783ms)
✔ task projection uses schema current view, skipping earlier and equal-start polls (174.459332ms)
✔ revocation permanently bars the old run from reclaiming first, including after broker restart (208.010738ms)
✔ empty message references refuse before storage; refusal-evidence failure stays a typed error (137.136622ms)
✔ both arbiters require human resolution when their cross-role route is themselves (218.59623ms)
✔ the shipped coder role raises task.reassign as gated to the human; task.scope.change stays cross-role (143.477456ms)
✔ S1 adapter takes resolved limits and refs, rejects mismatched instance, never mutates input (3.651253ms)
✔ credentials gives human and reader sessions service, account, role, date and state, and nothing else (94.500249ms)
✔ credentials refuses a role session and any argument (172.62452ms)
✔ credentials reads the status on each request, and a broker without one lists none (222.412115ms)
✔ the broker process answers credentials without a token, path or variable in its output, log or store (182.874762ms)
✔ only validated broker references load; returned data and exceptions cannot expose a known token (3.999869ms)
✔ bad file modes, symlinks, repository/data paths, malformed tokens and missing dates refuse (4.511286ms)
✔ expiry refuses use and env references never become client data (0.867036ms)
✔ S1 parsed service refs work, service mismatch refuses, Gitea rotation due is a warning state (1.755848ms)
✔ opaque tokens shorter than 16 characters refuse before use (0.403383ms)
✔ a human resolve sends the raising role one message from the human, and its request is the answer (236.134124ms)
✔ a cross-role decision resolved by its arbiter comes from that role and run, with no request (239.841582ms)
✔ a human withdraw sends one message with the note (231.647799ms)
✔ a human seen before the close leaves the request on the close's answer, not the seen (289.297444ms)
✔ the raising run's withdraw, a supersede, a within-role raise and seen send nothing (295.057823ms)
✔ refused closes send nothing: invalid-choice, decision-closed, not-resolver (311.133535ms)
✔ a raising role nobody holds at the close gets the message on the next claim (277.161096ms)
✔ a human DECISION send keeps its own instruction as the request, not a close's answer (249.548326ms)
✔ roles lists open decisions routed to a role, and never the human inbox (210.962475ms)
✔ recent lists closed decisions of every route, newest close first, with how each closed (281.008836ms)
✔ recent gives the closing event as closed when the decision was seen first (274.654702ms)
✔ recent stops at RECENT rows (840.584832ms)
✔ every row is what trail already gives the same session for that id (277.019431ms)
✔ a role session can't list decisions, so it can't read another role's open decisions (395.005795ms)
✔ decisions is a read: one business, strict arguments, nothing written (398.919889ms)
✔ endLaunch writes session.ended, releases the run claim and kills its capabilities (139.794073ms)
✔ endLaunch refuses an unknown run, a second end and a rebind of the ended run (131.033345ms)
✔ a restarted broker refuses to rebind an ended run; a refused rebind leaves the run unbound (161.199958ms)
✔ endLaunch leaves a claim another run took alone (181.486296ms)
✔ refuse records action.refused against the caller with the code only (126.237302ms)
✔ launches off refuses role.launch with launch-revoked until launches on (189.983039ms)
✔ broker process: launch ops authorize role.launch, record refusals and end runs (270.268004ms)
✔ human proof binds CLI entry, process start and nonce; agents and incomplete ancestry refuse (2.629338ms)
✔ process reader gets own kernel identity without exposing environment values (0.472131ms)
✔ EACCES ancestor environments skip only markers; commands and registered launches still refuse (0.736096ms)
✔ real pid 1 remains inspectable when its environment is protected (0.348474ms)
✔ limits binds actor from human proof and rejects role, reader, tester and forged actor (197.634111ms)
✔ runtime wires verified human settings to the actual shared file writer and actor receipt (273.978023ms)
✔ uncertain organization receipts leave bus startup and reads alone but refuse writes until reconciled (416.217589ms)
✔ within-role sends cite an open gated launch decision without spending it or naming it in grants (182.780519ms)
✔ missing and foreign-business citations refuse and roll back message and grant (188.292209ms)
✔ cross-role sends still need a matching resolved decision and consume it once (250.559613ms)
✔ messages pages all human messages newest first without writes; read state is history (2599.479529ms)
✔ messages refuses role callers, invalid paging and cursors outside this human feed (245.593106ms)
✔ views messages passes only its paging arguments through (0.257316ms)
✔ messages isolates businesses even with a valid foreign cursor (153.734385ms)
✔ the assistant sends to the user and to the chief of staff only (283.983721ms)
✔ an assistant send to any other role, or to the tester, is refused and logged (343.919038ms)
✔ only the user and the chief of staff may send to the assistant; the tester is refused by default (330.560929ms)
✔ a sender-side list alone refuses a send to a role that has no list (321.22946ms)
✔ a target-side list alone refuses a send from a role that has no list (341.371828ms)
✔ the sender list is checked before the target list (283.998629ms)
✔ roles without the field behave exactly as before (399.661498ms)
✔ a business with no role definitions at all is unlimited (303.760646ms)
✔ a malformed messaging field refuses at boot (109.99098ms)
✔ the assistant's review.request to a reviewer is refused and logged, even with an approved decision (276.744006ms)
✔ a review.verdict to the assistant from a role outside its receiveFrom is refused and logged (303.452841ms)
✔ review requests and verdicts between roles without the field are unchanged (221.374285ms)
✔ broker process binds trusted launches, offers reader capabilities, refuses human mutation, closes cleanly (197.611624ms)
✔ startup token refusal returns safe code without value or partial listening broker (42.387018ms)
✔ loaded fixture token is absent from socket replies and SQLite, including refusal evidence (193.511503ms)
✔ killed broker leaves an explicit stale lock; another process cannot silently reclaim it (162.185531ms)
✔ trusted host registers later launches; socket clients never have a registration verb (192.614352ms)
✔ runtime excludes declared project roots even when host supplies no repoRoots (37.937261ms)
✔ a refused launch binding leaves the broker and existing capabilities alive; bad protocol stops it (176.034327ms)
✔ a reply is listed for human and reader sessions, and its delivery rows are unchanged (222.11192ms)
✔ the reply still reaches the human message.receive (mosaic talk) after the Console showed it (196.102393ms)
✔ a message with no reply gives an empty list (163.240241ms)
✔ replies come oldest first and stop at REPLIES (770.260935ms)
✔ an id that names no message in the business refuses message-not-found, and the refusal is recorded (319.063668ms)
✔ strict arguments; a role session gets human-required (391.375947ms)
✔ views passes replies through as one call with the id (0.244539ms)
✔ requirements returns the committed list to a holding role session, and no one else (218.300253ms)
✔ the PM's prd.approve with no task, when no id fits, reaches the human's Inbox (149.685628ms)
✔ the PM's non-blocking role.revoke with no task reaches the human's Inbox (189.997471ms)
✔ a push is recorded as the action.allowed for git.push.working on the task, and only the host records one (252.429621ms)
✔ review.request names the latest pushed commit and sends the reviewer a REVIEW-REQUEST (249.22826ms)
✔ review.request says which run holds the reviewer role, or null, and a null request waits for a claim (289.683998ms)
✔ review.request refuses a commit that isn't the latest push, a non-reviewer and a role without the action (381.422917ms)
✔ reviewFetch answers only the addressed reviewer, for the request it cites (267.39716ms)
✔ review.verdict answers one request once, to the role that asked (308.590312ms)
✔ task.close on a pushed task needs an approve verdict for the latest push (383.096375ms)
✔ a refusal the host decided is filed on the task it names, and only a task ref counts (274.82629ms)
✔ v3b prototype refusals, views and append-only mutations (1068.880573ms)
✔ gated approval authorizes once, survives store reopen, and fresh approval works (246.062459ms)
✔ another run cannot consume an approval; a failed check leaves it usable (228.719767ms)
✔ two scheduled callers have exactly one grant and one consumed refusal (170.561974ms)
✔ failed commit rolls consumption back; cross-role consumes and within-role stays reusable (341.408034ms)
✔ class drift gated to cross-role refuses before consumption (234.750422ms)
✔ class drift cross-role to gated refuses before consumption (263.028265ms)
✔ class drift gated to within-role refuses before consumption (214.426149ms)
✔ class drift cross-role to within-role refuses before consumption (250.466151ms)
✔ class drift within-role to gated refuses before consumption (192.990811ms)
✔ class drift within-role to cross-role refuses before consumption (180.089348ms)
✔ message.send consumes approval and prevents a later send or authorize (188.926664ms)
✔ role.revoke consumes approval and prevents a later revoke or authorize (219.226923ms)
✔ a business that never switched launches reads allowed with no time and no event (127.700116ms)
✔ launches revoked and then restored read allowed, with the restore time and event id (157.874498ms)
✔ a task closed on the tracker leaves the open list, and total counts the open ones (149.650991ms)
✔ a tombstone is not open (151.681582ms)
✔ the open list stops at the cap and says so; total still counts every open task (145.685247ms)
✔ a role and a reader session read state; arguments, and an unbound cap, refuse (150.721556ms)
✔ a human session reads the same state, with the same cap (147.791064ms)
✔ reading state writes nothing: every table keeps its row count (176.705427ms)
✔ creates private WAL store and excludes a second writer until explicit close (129.919352ms)
✔ rollback is atomic and schema metadata is checked against trusted DDL, not just itself (168.796796ms)
✔ existing empty database and symlink runtime directory refuse, never initialize over damage (194.121255ms)
✔ crash during a transaction recovers no partial event after explicit fixture-only lock removal (182.056651ms)
✔ writer refuses mixed at/read_at forms atomically, even through trusted SQL helpers (119.550918ms)
✔ async transactions refuse before invoking their function (98.651849ms)
✔ the session default fits under the reply cap and pages to the end with next (323.400573ms)
✔ the short form: no description, assignees by role, every listed key (272.767493ms)
✔ each filter, alone and together, and total counts every match (325.587523ms)
✔ task_ref reads one task in full, as the whole board has it (282.085733ms)
✔ no arguments is the read the Console and mosaic make, unchanged (279.46167ms)
✔ an unknown argument or a bad value refuses invalid-request (869.805341ms)
✔ tasks rows carry priority and requirement for every session that reads tasks (312.259177ms)
✔ the read model rebuilds from the ledger: a reopened bus and each trail give the same values (361.32517ms)
✔ an empty business and one with snapshots but no task.created read cleanly (113.17458ms)
✔ recordTask keeps sync reads and a role write apart (178.424057ms)
✔ read_at must be one canonical UTC format, so the projection compares strings safely (120.119324ms)
✔ a bad entry refuses the whole record (111.866512ms)
✔ taskView reads the projection for one business (134.631728ms)
✔ requestTask hands only a holder and a task verb to the handler, and records refusals (256.611762ms)
✔ the server sends task verbs to the adapter with its own timeout; other verbs stay synchronous (455.033537ms)
✔ without an adapter the server refuses every task verb (190.831846ms)
✔ the runtime refuses an invalid adapter and closes a valid one (205.331132ms)
✔ the process loads the S3 adapter from plain-data trackers (258.959628ms)
✔ the tester binds only when the business sets bus.tester to exactly true (803.483144ms)
✔ a business may not name a role tester, so the tester address is never a role (255.367266ms)
✔ every verb outside the tester list refuses tester-refused and is recorded against the tester (542.091434ms)
✔ a tester message is from tester, starts [mos test], and writes no human.input or authority (192.989227ms)
✔ a role answers a tester only in reply to a tester message, and the answer never reaches the human (216.091204ms)
✔ the tester reads the human views a reader reads (137.580699ms)
✔ tester proof binds its own CLI, start time and nonce, refuses a managed run and allows an agent (1.179739ms)
✔ neither CLI's nonce proves the other: each proof is bound to its own CLI and nonce variable (0.366462ms)
✔ testerNonce reads only the tester's variable and gives null on any read error (0.208682ms)
✔ an envelope carries exactly one of cap, human and tester; no tester authenticator refuses (78.341489ms)
✔ tester-cli.mjs binds through the runtime when the switch is on, and refuses off or under a run marker (762.128143ms)
✔ socket capability stamps launch identity; shared views use wire, no SQL client (153.413917ms)
✔ two wire claims serialize; a lost reply never automatically retries (188.01779ms)
✔ malformed, oversized and identity-forging envelopes refuse without echoing input (119.131735ms)
✔ client preserves UTF-8 when a response divides a multibyte character (10.558342ms)
✔ committed mutation followed by dropped reply reports unknown and is never retried (126.485799ms)
ℹ tests 171
ℹ suites 0
ℹ pass 171
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 4322.236069
@@ -0,0 +1,100 @@
✔ the role file loads and resolves through loadBusiness (7.617066ms)
✔ the shipped file is exactly the approved list (0.910397ms)
✔ the assistant's authority is message.send within role and nothing else (2.533906ms)
✔ the assistant talks to the user and the chief of staff only, and no other shipped role is limited (0.870664ms)
✔ a business grant through limits does not widen the role (1.954138ms)
✔ a launch block whose by is the assistant is refused (1.663232ms)
✔ the instance takes no credential references and no tracker (2.915018ms)
✔ the contract passes work to the chief of staff and directs no one (0.687642ms)
✔ config directory and file path follow MOSAIC_CONFIG (1.695799ms)
✔ the fixture business validates and comes back frozen (5.497001ms)
✔ two instances may share a definition (1.936393ms)
✔ top-level refusals (11.645505ms)
✔ arbiters and projects (4.635666ms)
✔ role instances (2.478348ms)
✔ Vikunja bots (5.069482ms)
✔ a role without Vikunja takes no tracker block (1.839627ms)
✔ credential references match the definition's services (2.142816ms)
✔ launch (7.272023ms)
✔ loadBusiness: file checks (1.605259ms)
✔ loadBusiness: not a regular file (37.763448ms)
✔ loading writes nothing (1.017299ms)
✔ names that are Object.prototype properties don't count as declared (2.637388ms)
✔ the shipped example refuses as written and validates once filled in (1.185492ms)
✔ the role file loads and resolves through loadBusiness (8.225501ms)
✔ the shipped file is exactly the approved list (0.303985ms)
✔ the resolved record matches the approved list, so a widened file fails (2.375744ms)
✔ the chief of staff holds role.launch and message.send; every other action is gated (1.754834ms)
✔ the pm does not hold role.launch (1.725377ms)
✔ a business grant of a gated action through limits does not widen the role (2.311423ms)
✔ a limit that drops role.launch leaves the chief of staff with no launch block (1.569789ms)
✔ a launch block whose by is the pm instance is refused (1.853649ms)
✔ the contract names no duty to talk to the human and the pm contract no launch (0.317957ms)
✔ the instance takes no credential references and no tracker (9.375289ms)
✔ usage errors exit 4 (262.489252ms)
✔ validate: a good business exits 0 and prints instance digests (62.22649ms)
✔ validate: project files (309.558305ms)
✔ validate: missing files and a broken system config (247.144215ms)
✔ validate: credential reference problems exit 2 and name each one (64.346125ms)
✔ validate: a token file inside the repository is refused (63.930099ms)
✔ validate: role definitions come from MOSAIC_ROLES_DIR (188.194923ms)
✔ resolve: prints one instance's record (248.440099ms)
✔ resolve: refusals (357.900853ms)
✔ parse: exactly one of file or env, plus the service's date (2.854173ms)
✔ check: a good file has no problems (0.990828ms)
✔ check never opens the file: a write-only token passes (0.39899ms)
✔ check: file problems (1.032209ms)
✔ check: token files can't live in the repository or dataRoot, even through a linked directory (0.938368ms)
✔ check: dates and environment references (0.368081ms)
✔ REQ-LIMIT-1 schema: every scope unset or zero, adjustable above four, bad values and unknown models refuse (14.820777ms)
✔ REQ-LIMIT-1 counts each exact scope at/over limit, unlimited and old tuple after model reassignment (1.073927ms)
✔ REQ-ROLE-3 writer: atomic validated revision, immutable previous bytes and authenticated actor/old/new receipt (235.92167ms)
✔ REQ-ROLE-3 writer: pre-rename fault leaves old file, post-rename recovery records commit, conflicting recovery refuses (148.744189ms)
✔ REQ-LIMIT-1 / decision145 migration prints only, preserves values, rejects ambiguity, and is idempotent (2.885396ms)
✔ REQ-LIMIT-1 shared settings validates the complete proposed selection and logs exact actor (110.176329ms)
✔ REQ-LIMIT-1 provider is table data: another provider routes separately and aliases share exact counts (1.746015ms)
✔ REQ-ROLE-3 refuses live writer locks, symlink targets and uncertain recovery without changing bytes (82.471111ms)
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (11.591901ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (265.039627ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (37.060593ms)
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.456269ms)
✔ path and load (2.780539ms)
✔ refusals (1.278067ms)
✔ systemVars flattens the validated config (1.921552ms)
✔ precedence: system, business, project, project role, agent (8.769238ms)
✔ limits narrow the definition and never widen it (1.896825ms)
✔ role.launch stays within-role only for the instance the launch block names (4.637215ms)
✔ limits.authority without role.launch leaves the launcher with no launch block (1.626019ms)
✔ limits.authority narrows cross-role actions too (0.907829ms)
✔ classify (1.00448ms)
✔ the record carries what the broker and launcher need (0.997607ms)
✔ digest: key order doesn't matter, any value change does (7.783023ms)
✔ refusals (1.800184ms)
✔ the four shipped version 2 roles load (3.722796ms)
✔ shipped role scopes match addendum B section 2 and the SR runbook (1.277313ms)
✔ shipped authority follows the note's table (0.805041ms)
✔ every role file in roles/ loads through the validator, and a v2 contract exists (0.911638ms)
✔ version 1 files keep loading with no authority (2.698255ms)
✔ the conductor policy isn't a role (0.19722ms)
✔ a missing role file is exit 4, a symbolic link too (0.31163ms)
✔ version 2 refusals (1.201847ms)
✔ authority: closed vocabulary, no gated-only action, no overlap (2.095823ms)
✔ messaging: optional, role definitions and human, never the tester (1.713243ms)
✔ credentials: Gitea scopes (0.932951ms)
✔ credentials: Vikunja scopes are a group-to-verbs map from the grantable list (1.261786ms)
✔ credentials: services (0.420616ms)
✔ contract: a non-empty regular Markdown file beside the role file (0.563621ms)
✔ every key names known layers and a merge rule (1.224599ms)
✔ unknown keys and wrong layers refuse (1.087174ms)
✔ types (2.571371ms)
✔ merge: defaults, then the most specific layer wins (0.366522ms)
✔ merge: limits only narrow, and provenance lists each source (0.472818ms)
✔ merge doesn't change its inputs (0.194075ms)
ℹ tests 92
ℹ suites 0
ℹ pass 92
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 1874.577995
@@ -0,0 +1,205 @@
✔ every screen and overlay fits 120x36, 80x24 and the narrow layout, row for row (1290.972373ms)
✔ width counts terminal cells: wide CJK and emoji 2, U+FE0F after a one-cell base 1, marks 0 (62.484389ms)
✔ broker text is shown, never interpreted: no raw control character or bidi override reaches the terminal (158.239591ms)
✔ NO_COLOR: no escape codes, except reverse video on the selected row (251.888881ms)
✔ 1-9 shows the decide flow's own lines and question; only y resolves (146.104998ms)
✔ the app shows the same decide text as mosaic decide (104.226296ms)
✔ any key but y or Y at the question answers No; nothing is sent (2503.316631ms)
✔ below 40x10 the question is hidden, so every key answers it No, y included (Filbert R3) (420.892425ms)
✔ under 40 columns a tall terminal shows the too-small screen even where the decide box would fit; y sends nothing (Filbert N10) (1620.612281ms)
✔ a hidden decide box names the way out, and the status line under it does not promise y (Filbert N12) (173.225506ms)
✔ a throw while answering the question goes to crash, sends nothing and leaves no job pending (342.812523ms)
✔ type-ahead never answers the question: a paste, keys typed before it is drawn, keys inside askMs (1174.927744ms)
✔ quitting at the question answers No and sends nothing, armed or not (207.026832ms)
✔ a timer tick reads nothing under an overlay, never answers the question, and keeps a resolved status (140.545504ms)
✔ a long question is cut inside the question; the action, target, choice and prompt stay (Dewey B1) (122.06618ms)
✔ a decide box too big for the terminal says so, and every key answers it No, y included (Dewey B1, round 3) (835.856561ms)
✔ at every size the decide box shows each line y depends on, or says it is hidden (8140.277471ms)
✔ outcome unknown: the CLI's sentence, no retry, then the trail or a re-read (159.4791ms)
✔ refused and failed reads keep the last list, marked stale; a refused decide says refused (116.716312ms)
✔ help or a detail box cut to fit keeps its last line, Esc included (Dewey) (57.699471ms)
✔ keys: views, moving, trail of a selection, the command line, help and quit (237.901712ms)
✔ one option: the status line says Press 1, not 1-1 (95.18464ms)
✔ no business: the app says so and :business picks one (49.444128ms)
✔ mosaic with no argument: exit 3 in an agent run, exit 4 with the usage off a terminal, the app on one (1.672674ms)
✔ scripts/mosaic with no argument reaches the app entry; the seat usage it printed before has not drifted (168.76072ms)
✔ strings to keep exactly live once, in the decide flow and the transport; the app does not restate them (0.412312ms)
✔ decide with --note still asks; a No sends nothing (56.199581ms)
✔ the app's business comes from a live bus host only (0.968334ms)
✔ runApp leaves the terminal as it found it on q, end of input, SIGTERM, SIGINT, SIGHUP and an error, the first frame's included (6.752899ms)
✔ draw is pure: same state, same frame (0.769811ms)
✔ inbox lists only decisions routed to the human, with what approving authorizes and how to decide (138.548659ms)
✔ decide resolves by id prefix with --yes, and the trail shows it in broker order with the task to follow (132.130997ms)
✔ decide refuses without a terminal or --yes, on an unknown option and on a short reference (108.045715ms)
✔ decide prints a declining choice as declining (143.484841ms)
✔ an unknown outcome is reported once and never resent (112.30833ms)
✔ a decision closed before the answer arrives exits 2 and points at its trail (85.046382ms)
✔ a prefix that matches two open decisions exits 2 and resolves neither (96.506068ms)
✔ without --business a command uses the live host's business, and a stale host.json is not a host (117.601135ms)
✔ every human command refuses inside an agent run before it touches the bus (94.506345ms)
✔ usage errors exit 4; no business and no host is a usage error (85.945382ms)
✔ agents and tasks print through the broker (90.017188ms)
✔ notify.json: missing, loose, malformed and extra keys refuse; a binding or null passes (1.292305ms)
✔ bootConfig builds the broker's boot message for one business, with no trackers key when no project names one (68.919867ms)
✔ trackers come from the tracker.* variables of the one project that names a tracker project (93.779035ms)
✔ with two projects, the one that sets tracker.project supplies the tracker and the other is no conflict (39.207954ms)
✔ two projects that each name a tracker project refuse, since the boot shape holds one (29.428089ms)
✔ a business without tracker.baseUrl gets no trackers entry (35.267949ms)
✔ an unknown business and a broken system config refuse with exit 3 (67.347116ms)
✔ follow prints an unsolicited message after plain talk returned (207.526467ms)
✔ talk --follow continues after reply and prints a later unsolicited message (177.339419ms)
✔ inbox lists all unread human messages under decisions, does not deliver or read them (2329.609477ms)
✔ follow refuses agent context and bad arguments (142.535709ms)
✔ follow Ctrl-C wakes the poll sleep and removes its handler; transport errors also clean up (114.607878ms)
✔ plain talk leaves the process SIGINT handlers unchanged (233.141535ms)
✔ empty views say so (1.081655ms)
✔ the trail keeps the broker's order and names a decision's task without its rows (1.322922ms)
✔ tasks print the tracker fields the snapshot carries (0.20523ms)
✔ the review loop: the coder pushes and asks, the reviewer fetches and approves, and the task's trail holds each step (714.062629ms)
✔ refusals: no action, non-fast-forward, an unknown commit or request, and a push for another task moves only that task's ref (626.477632ms)
✔ the size cap refuses a push before any byte (325.728219ms)
✔ a fetch over the cap refuses before any byte reaches the reviewer (533.740358ms)
✔ the socket refuses a request with no capability, an unknown one, and a bad request line (357.554869ms)
✔ a rigged clone runs nothing: hooks, fsmonitor, a filter, a gitlink and a symlinked .git/config leave no marker (1451.693655ms)
✔ an identity with no role, or of another business, refuses not-a-role and moves no ref (727.37697ms)
✔ a review of a project the business no longer has refuses unknown-project (361.333749ms)
✔ past maxActive connections the socket refuses git-busy, and a hung-up connection frees its slot (334.792947ms)
✔ close() answers host-closing to a connection still sending its request line (425.653793ms)
✔ a bundle that trickles in refuses body-timeout at its deadline and frees its slot (763.041935ms)
✔ a reviewer gone before its bundle was sent is filed fetch-aborted, not as the host's fault (1109.247006ms)
✔ a reviewer that hangs up the moment it has the whole bundle was served, not aborted (636.720008ms)
✔ send: a close after every byte left is served; one that fails a queued write is fetch-aborted (42.597423ms)
✔ a bundle with no bytes for bodyIdle refuses body-timeout long before its deadline (604.121876ms)
✔ send: a close once the loop is past its last chunk is served, and a failed write there is fetch-aborted (23.819331ms)
✔ letGo waits for an answer to leave for at most its cap, then destroys the socket (301.257762ms)
✔ a record that fails and can't be undone refuses rollback-failed, which the host logs (529.105453ms)
✔ the host boots the broker, binds a launch in process, and the notifier DMs a blocking decision exactly once (969.44847ms)
✔ a notifier that dies takes the host down with exit 1, so the unit restarts the pair (259.41252ms)
✔ a second host for the same data root refuses with exit 3 while the first runs (199.863778ms)
✔ two bus starts racing for one data root leave one host running; the other refuses that a host already runs (572.915289ms)
✔ a host takes over a host.lock its dead host left, and puts back a live claim that replaced it meanwhile (2.921049ms)
✔ 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.795114ms)
✔ a live host's lock stays, however old the file is (0.501519ms)
✔ a host.lock left by a host killed with SIGKILL doesn't stop the next bus start (818.91542ms)
✔ while a host boots, a reader sees no host: the human commands still ask for --business, stop and status find none (202.978138ms)
✔ a host started before host.lock existed, holding only host.json, still refuses a second start, which leaves no lock (34.361086ms)
✔ a broker fork that throws leaves no host.lock and no host.json (28.16722ms)
✔ a broker send that throws leaves no host.lock and no host.json (35.750434ms)
✔ a broker that misses its boot wait leaves no host.lock and no host.json (28.742431ms)
✔ a notifier fork that throws stops the broker and leaves no host.lock and no host.json (1152.975553ms)
✔ a notifier send that throws stops the broker and leaves no host.lock and no host.json (205.116295ms)
✔ 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 (156.45877ms)
✔ 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 (162.417477ms)
✔ a host.json that can't be written stops both children and leaves no host.lock (250.628496ms)
✔ an error event on the broker before it replies fails the start at once, and leaves no host.lock and no live child (30.261453ms)
✔ an error event on the notifier before it replies fails the start at once, and leaves no host.lock and no live child (185.894662ms)
✔ an error event on the broker while the notifier starts fails the start once the notifier replies (455.569507ms)
✔ 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 (274.768035ms)
✔ 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 (376.905066ms)
✔ a broker reply that misses the wait breaks the channel: the late reply answers nothing, later requests refuse, the host exits 1 (1222.376853ms)
✔ a broker reply with another request's id, or none, breaks the channel and the host exits 1 (330.686243ms)
✔ a broker reply with no request waiting breaks the channel and the host exits 1 (156.558593ms)
✔ a notifier that refuses stops the broker and the host refuses with exit 3 (185.731687ms)
✔ a notifier that refuses after the broker died still refuses with exit 3, without a send to the dead broker (190.091729ms)
✔ a notifier that dies before it replies, after the broker died, still refuses, without a send to the dead broker (139.393296ms)
✔ a close send that fails with EPIPE after the notifier refuses still gives the notifier's refusal, exit 3 (164.928471ms)
✔ a close send that fails with EPIPE after the notifier dies unanswered still gives the notifier's error (134.763216ms)
✔ close() whose stop and close sends fail with EPIPE still finishes, with exit 1 (177.931212ms)
✔ watchChildren reports a child that died before it was called, and one that dies later (22.158424ms)
✔ bus stop refuses to signal a live pid that is not a bus host (202.723469ms)
✔ bus start refuses with exit 3 and the code when the broker refuses to boot; bus status names the lock (229.496705ms)
✔ bus start refuses with exit 3 without a notifier config (99.75502ms)
✔ bus start runs until bus stop; status reports it while it runs (740.299026ms)
✔ bus-service.sh renders the unit and installs it into a given directory (53.744175ms)
✔ bus-service.sh pins the claude binary, refuses one the unit can't carry, and renders without one (66.681241ms)
✔ bus-service.sh refuses a directory pin and keeps a symlink default unresolved (13.57894ms)
✔ bus-service.sh refuses a default claude without the execute bit, or in a PATH dir with a space (8.469798ms)
✔ each launch rereads limits and model selections; lowered limits keep sessions and log exact hit (48.941322ms)
✔ bus start --pm: the launcher instance (the chief of staff) runs under its own PID namespace, registered, with a manifest (1390.114685ms)
✔ the chief of staff launches a coder through its launch tool; the coder answers; refusals name their code (755.487576ms)
✔ each launch makes sure the workspace has a clone of the project: cloned, fast-forwarded, or fetched and logged (992.07075ms)
✔ a project clone that can't be made refuses checkout-failed, from --chief and from a session, with no run and no clone left (1320.2256ms)
✔ a runner that stops at once ends its launch with the runner's reason (300.695327ms)
✔ a Claude Code launch with no session credential refuses before it starts (163.567463ms)
✔ a pi launch needs no session credential: pi logs in through its own ENV_ALLOW variables (258.361467ms)
✔ a runner killed from the host ends its launch as killed, not failed (559.751103ms)
✔ a missing or failing bwrap refuses sandbox-unavailable before anything starts; there is no unconfined fallback (192.967252ms)
✔ a real Claude Code coder's shell can't read a stand-in secret or anything else its sandbox doesn't hold (1898.060536ms)
✔ 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 (800.718308ms)
✔ 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 (3842.068234ms)
✔ a malformed sessions.json refuses the host start with exit 3 and stays as it was (132.13491ms)
✔ an over-long launch request is refused at once, not at the 10 s idle timeout (135.620747ms)
✔ a launch client that never closes its side doesn't hold the host's close (150.365028ms)
✔ a runner that ignores SIGTERM is killed when the host closes (1275.785443ms)
✔ claudeVersion asks MOSAIC_CLAUDE_BIN when set, else claude on PATH (4.750685ms)
✔ migration needs no bus/config, prints whole converted document, is idempotent and never writes (15.799176ms)
✔ limits view/set use the human bus transport and pass only the explicit patch (1.900225ms)
✔ post-119 example and Jason fixture migrate with checked inherited models; wrong or absent config refuses (226.332186ms)
✔ zoned uses the IANA zone across DST (23.471711ms)
✔ each open blocking decision is DM'd once, across polls and a restart; non-blocking ones are not (136.166079ms)
✔ two blocking decisions get two DMs with different nonces (130.628531ms)
✔ the digest nonce differs per business and per day and fits Discord's 25 characters (0.368265ms)
✔ a failed DM is journaled, backs off, and is retried until it lands (108.614985ms)
✔ five definite refusals stop a DM: one gave-up line, one log line, and a restart keeps the count (116.775157ms)
✔ 429s, 5xx-style unknowns and refusals without a status never count toward the limit (126.426253ms)
✔ a crash between the fifth refusal and its gave-up line: the next poll appends it and sends nothing (112.055352ms)
✔ 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 (157.015482ms)
✔ a restart after the second refusal does not send before that refusal's 30 min are up (185.751665ms)
✔ the digest goes at 08:00 Chicago once a day, with blocking ones marked as DM'd (116.130471ms)
✔ a late start with no digest for the day sends one at once; an empty inbox gets one line (105.052173ms)
✔ an inbox read failure is logged and the next poll retries (0.638423ms)
✔ no Discord id reaches the journal or the log (159.149672ms)
✔ the journal: a torn tail is copied out and truncated, so an append after it reopens cleanly (24.072223ms)
✔ the journal: a crash between the copy and the truncate leaves a tail the next open repairs (38.694802ms)
✔ the journal: a whole file that is one torn line truncates to empty (29.299798ms)
✔ the journal: a malformed complete line refuses and leaves the file and any torn tail alone (1.910581ms)
✔ the journal: a loose file mode, a loose directory or a symlinked journal refuses (0.715335ms)
✔ the journal: a line with a wrong type refuses with exit 3 and names the field (4.870734ms)
✔ the journal: a symlinked directory refuses and says it is a link (2.793492ms)
✔ 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.630656ms)
✔ the journal: an append after the file was swapped for a symlink refuses and writes nothing through it (0.444723ms)
✔ the journal: a directory it cannot write or create refuses with exit 3 and names the path (0.602187ms)
✔ digest content stays within Discord's 2000 characters (0.313459ms)
✔ runLoop never overlaps ticks and stops after the one in flight (111.3061ms)
✔ a human command refused with human-required prints the other-tree line and exits 3 (3.338148ms)
✔ a --tester command refused with tester-required prints the other-tree line and exits 3 (1.223245ms)
✔ other exit-3 refusals print no other-tree line (1.733779ms)
✔ the line names no path (0.145859ms)
✔ shared copy: npm ci, pushed reachability, readonly/existing copy, webui delegation (492.724829ms)
✔ wrapper preserves Q81 lease and marker, rejects foreign/symlink; check uses effective roots (407.131426ms)
✔ bus unit copy/pm pins, install refuses all busy states and failed reads, drop-in refusal (425.757114ms)
✔ missing package manifest refuses before npm; npm failure removes the unpublished temp copy (317.713504ms)
✔ real pinned install loads bus and Console; same-copy mosaic talk passes proof, other trees refuse (3975.800205ms)
✔ bus status reads effective copy/pm/drop-ins without writes; check refuses an overridden ExecStart (520.250368ms)
✔ drop-ins in either override field and malformed metadata refuse; uninstall also checks --no-reload (172.207499ms)
✔ install never shows a template name on systemd 261; template drop-ins still refuse (200.064755ms)
✔ unlisted instance drop-in is found in another unit lookup directory; path discovery errors refuse (185.59466ms)
✔ inherited mosaic-.service.d override refuses without changing the unit (271.771359ms)
✔ inherited service.d override refuses without changing the unit (261.639236ms)
✔ inherited drop-in unreadable directory or file refuses before writing (256.05343ms)
✔ talk --tester sends a [mos test] message as tester from inside an agent and prints the role's reply (144.595984ms)
✔ talk --tester refuses text without the [mos test] prefix before any call (100.087304ms)
✔ the read verbs take --tester inside an agent, and the trail shows the tester as the sender (102.310759ms)
✔ decide, stop and launches take no --tester (123.583145ms)
✔ the tester transport runs tester-cli.mjs, and the tester's refusals exit 3 (0.34492ms)
✔ with no stand-in transport, --tester runs tester-cli.mjs on the data root's socket (0.533931ms)
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 (429.285454ms)
✔ the transport writes {business, verb, args} to the child and reads its JSON (47.104871ms)
✔ a bus code on stderr becomes the exit code; garbage and timeouts are outcome problems (2157.641094ms)
✔ busExit and refuseInsideAgent (0.440323ms)
✔ talk sends a REQUEST, prints and reads everything that arrives, and stops at the reply (211.665975ms)
✔ talk --wait 0 only sends; no reply within --wait exits 1 and says where it will show (1119.583585ms)
✔ a late reply the Console has listed still reaches the next talk (2248.345781ms)
✔ talk, stop and launches off/on refuse inside an agent run; bad arguments are usage errors (673.702469ms)
✔ launches off and on go to the broker and change the business's launch state (166.367657ms)
✔ launches list reads sessions.json and marks a stale entry; stop reports it and refuses a non-runner (100.718277ms)
ℹ tests 195
ℹ suites 0
ℹ pass 195
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 18801.41566
@@ -0,0 +1,29 @@
✔ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source and limit-check at interface version 1, each a list (1.519835ms)
✔ REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included (0.312859ms)
✔ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (4.405097ms)
✔ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.26075ms)
✔ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.239001ms)
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (7.80311ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.474177ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.453804ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.427051ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.124953ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (25.904122ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.725925ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.214987ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.324706ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (3.104356ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.161849ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.390447ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.662307ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.894555ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.194588ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.048454ms)
ℹ tests 21
ℹ suites 0
ℹ pass 21
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 232.038966
@@ -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 (7942.965599ms)
✔ 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 (7746.050296ms)
✔ browser edge states: loading, empty, malformed, stale, hostile/long values, in-flight reply and appearance fallback (4500.352277ms)
Rendered contrast: {"failures":[],"count":330,"lowest":4.504658476260286}
✔ served Console browser: real board fixtures, keyboard, drafts, receipts, themes, 320px and failures (5508.250669ms)
✔ the README says a refused field table names the file or the key at fault, never a path (1.388352ms)
✔ S5 pages in a browser: real broker rows, inert text, Copy, routes, failures, layout and no writes (8404.77832ms)
✔ bus routes serve the four reads from the reader view, unescaped JSON for the page to escape (295.498509ms)
✔ decisions route serves the roles and recent lists from the reader view (477.648988ms)
✔ credentials route serves the broker credential status from the reader view (891.432644ms)
✔ replies route serves the replies to one message from the reader view (910.230228ms)
✔ bus routes are GET-only, have no write verb, and keep the same-origin checks (120.711458ms)
✔ bus refusals map to statuses and never carry a path or a stack (90.334703ms)
✔ humanCall speaks the human transport protocol without blocking the server (1730.035116ms)
✔ busReader takes --business, else the live bus host, else refuses (246.51594ms)
✔ humanCall kills a transport that runs past its timeout (529.162429ms)
✔ serve refuses a --business value that is not a business id (485.310705ms)
✔ conversation view: full history, collapsed tools, hidden thinking, inert hostile content, malformed and reconcile markers (4599.87137ms)
✔ conversation view: a fork keeps the open branch, says so, and opens the new one on request (3800.30614ms)
✔ conversation view: a newer session with no readable history keeps the marker (2866.737023ms)
✔ conversation view: seats without history say so and offer no reply (2481.370319ms)
✔ Discord row through real board/WebUI: independent brake/liveness, no Reply, literal content (3971.429151ms)
✔ return flow through the conversation view: send, tool call, delayed result, peer message, exact long answers, relaunch (54863.55735ms)
✔ messages HTTP read pages and preserves metadata; bad arguments refuse before a read; other reads unchanged (334.047502ms)
✔ 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 (11584.252103ms)
✔ Messages nav count polls on Tasks and Board and clears on a Board refusal; messages 403 refuses local pages (3735.628443ms)
✔ copy writes the Console paths at the full id, read-only, and leaves an existing copy alone (3061.924121ms)
✔ copy refuses a commit off refactor, an unknown one, a worktree and a bad copies directory (6393.966559ms)
✔ copy writes nothing when an archived path is missing at the commit (1146.209616ms)
✔ a copy that loses the rename race leaves no read-only temp directory behind (1028.341037ms)
✔ a copy whose rename fails with no target refuses, writes no copy and leaves no temp directory (625.596336ms)
✔ a copy that meets a target holding files says exists: and moves nothing into it (898.781656ms)
✔ a copy that meets an empty target directory replaces it by rename, not by moving into it (1091.400749ms)
✔ serve runs from a copy: /healthz 200, the config check, roles and RELEASE from the copy, the queue from --checkout (1295.483707ms)
✔ serve refuses a --checkout that is not an absolute directory path (249.422514ms)
✔ consoleReads runs the queue read under queueRoot and reads RELEASE under root (53.853871ms)
✔ preview options are all three or none, and each is checked (8.237836ms)
✔ the CLI refuses a partial or invalid preview flag set at start (2557.275788ms)
✔ the CLI with all three flags serves the preview mode (260.468434ms)
✔ a request for the public name needs the header equal to the user id, else 401 and nothing read (19.009086ms)
✔ the header name matches without regard to case, and the value compare is exact (3.780845ms)
✔ the public name with the header reads the bus views, and the Host and Origin are checked first (27.317071ms)
✔ in preview mode every write answers 403 read-only, from the public name and loopback, and reaches nothing (9.803308ms)
✔ loopback requests are unchanged in preview mode, and the bus views work with the board down (4.288695ms)
✔ a proxy that rewrites Host to the loopback port gets 403 on its first request, whatever the user (25.987231ms)
✔ a repeated Host is 400 before any other check, in preview mode and without it (15.273519ms)
✔ without the preview flags the public name is refused and writes still reach the board (8.899179ms)
✔ redactor: config, dataRoot, any absolute path, Discord ids and the JSON parser quote (2.30297ms)
✔ credential state from the date alone, as the bus states it (0.24532ms)
✔ queue: rows, one row, ids and methods, notes; no path or id from a row (2280.516847ms)
✔ queue: a refused read fails closed with the store's text, redacted (1568.318158ms)
✔ queue: a store that fails to load, or a child that dies, gives a fixed message with no path or stack (4492.212226ms)
✔ business: names, vars on the allowlist, authority, credential metadata only (12.06245ms)
✔ business: missing or invalid file refuses with the module's text, redacted (15.075015ms)
✔ business without --business: the live bus host, else no-bus-host; no system config: not-configured (9.133741ms)
✔ settings: release, board, loopback address, notifier binding name only (267.113662ms)
✔ task fields: the committed table with no reads configured, GET only; a bad table refuses with no path (38.970378ms)
✔ both presentations replace old activity with relaunch notice, label retained history, then resume after new activity (4010.822418ms)
✔ reported return flow and relative Age: reply sent from the inspector, then the new answer appears there without manual refresh (22221.994573ms)
✔ 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 (8081.648718ms)
✔ a sent receipt lists its replies as the page refreshes, oldest first and capped, and marks none delivered or read (13711.227584ms)
✔ startServer takes send only as a function and only with the preview mode (5.052148ms)
✔ the CLI refuses --send without the preview flags, and without a configured bus (354.382149ms)
✔ the CLI with --send and a configured bus sends through the human transport and logs one line (137.641123ms)
✔ without --send the route is read-only like every other write, and config says no send (10.276614ms)
✔ with --send every other write is still 403 read-only, and nothing reaches the board or bus (7.128778ms)
✔ config says send only on the public name with --send on (2.082906ms)
✔ a send without the signed-in user is 401 and is neither sent nor logged, loopback included (4.07333ms)
✔ each request check refuses before anything is sent, and logs the refusal without the body (22.5853ms)
✔ a send passes exactly to, body and in_reply_to, answers the id, and logs it (4.781224ms)
✔ a crafted role name cannot forge a log line (3.533773ms)
✔ a bus refusal is not sent, with its status; an outcome the bus could not confirm is unknown and never retried (9.671513ms)
✔ through the human transport the request is exactly the business, message.send and the keys (128.179973ms)
✔ against a real broker: the message is written once as a human send, and its refusals map (1497.534738ms)
✔ loopback host and board origin fail closed (10.154222ms)
✔ real board fixture passes through WebUI; assets and isolated seen/reply work (257.117547ms)
✔ proxy preserves exact request bytes, status and receipt, rejects forms and malformed JSON, never follows redirect (50.320211ms)
✔ unreachable board reports URL; CLI rejects unsupported options (410.423891ms)
✔ render prints the unit without the preview flags (13.667534ms)
✔ render carries every serve flag, the preview set included (10.4346ms)
✔ a partial preview set is refused (21.211612ms)
✔ a value the unit cannot carry is refused, for every flag (282.358199ms)
✔ the rendered unit names none of the human proof agent markers and sets no agent variable (27.865147ms)
✔ install into --dir with --no-reload writes the file whole, then reports unchanged (234.916066ms)
✔ install without --no-reload runs daemon-reload and nothing that starts the unit (92.43398ms)
✔ uninstall refuses while the unit is running, with or without --no-reload, and removes it once it is not (423.057168ms)
✔ status prints the unit state and GET /healthz on the installed port (429.639978ms)
✔ usage: an unknown verb or flag, and start or enable, exit 4 (176.775537ms)
✔ without --send, render is the template with its placeholders filled, byte for byte (46.787329ms)
✔ render --send with the preview set ends ExecStart with --send and changes nothing else (172.22401ms)
✔ --send without the whole preview set is refused and writes nothing (346.964039ms)
✔ install --send into --dir with --no-reload writes the sending unit, and status says whether it sends (456.077168ms)
✔ uninstall and status take no --send (255.261662ms)
✔ install refuses while the unit is running, in any state but inactive or failed, and changes nothing (544.414947ms)
✔ when the state read fails, install and uninstall refuse with one line and change nothing (220.516751ms)
✔ install needs --copy naming a copy that exists, and refuses outside the canonical checkout without --allow-worktree (132.099821ms)
✔ install refuses unless the bus unit runs from the same copy, naming both paths, and changes nothing (262.08309ms)
✔ render --copy runs the copy and reads the queue in the checkout; without --copy the unit is unchanged (16.335408ms)
✔ the uid header takes only an Authentik uid; the username header still takes a username (348.565996ms)
✔ a preview value cannot start with - or . (93.310577ms)
✔ status names the copy and whether refactor has moved past it, and says when the unit runs from no copy (799.635715ms)
✔ Settings form shows every scope and held role; gated save, exact payload, retained draft and no automatic retry (3918.411461ms)
2026-10-15T16:41:16.536Z settings user="jason" changed
✔ REQ-WEB-1 signed-in same-origin Settings write reaches exactly one human operation (31.356962ms)
✔ REQ-WEB-1 Settings writes require enabled send, named Host, identity, exact Origin and same-origin Fetch Metadata (15.995428ms)
✔ REQ-WEB-1 Settings validates JSON, size, revision and strict writable keys before broker call (13.55705ms)
✔ tokens.css and icons.svg are byte copies of docs/design (54.639408ms)
✔ JetBrains Mono files match the digests in their sources file, with the OFL text (2.75091ms)
✔ shipped strings are unchanged, and the web keeps its write boundary (2.967657ms)
✔ shell in a browser: System default, seeded states, 400px, focus and the Ctrl+K palette (8096.625082ms)
✔ five states on Board, Inbox, Tasks, Agents and Trail (3653.993879ms)
✔ Queue, Business and Settings in their five states, with no move button (5697.085451ms)
✔ seeded secrets, Discord ids and paths reach no response and no page; business refusals in the module's words (3684.620318ms)
✔ the server log names no config path when the system config refuses (315.668101ms)
ℹ tests 112
ℹ suites 0
ℹ pass 112
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 55232.174557
@@ -0,0 +1,55 @@
mutants start 2026-10-15T16:42:28Z
control-01 packages/plugins/tests/kinds.test.mjs packages/plugins/tests/loader.test.mjs PASS 0
control-02 packages/plugins/tests/kinds.test.mjs PASS 0
control-03 packages/plugins/tests/loader.test.mjs PASS 0
control-04 packages/business/tests/plugin-settings.test.mjs packages/plugins/tests/loader.test.mjs PASS 0
control-05 packages/business/tests/plugin-settings.test.mjs PASS 0
control-06 packages/cli/tests/stack-copy.test.mjs PASS 0
01-name-pattern KILLED 1
02-list-cardinality KILLED 1
03-one-cardinality KILLED 1
04-no-duplicates KILLED 1
05-known-kind KILLED 1
06-plugins-object KILLED 1
07-registry-exports KILLED 1
08-registry-version KILLED 1
09-missing-directory KILLED 1
10-component-type KILLED 1
11-symlink-test KILLED 1
12-plugins-dir-checked KILLED 1
13-kind-dir-checked KILLED 1
14-name-dir-checked KILLED 1
15-index-checked KILLED 1
16-realpath-before-import KILLED 1
17-load-failure KILLED 1
18-export-present KILLED 1
19-export-function KILLED 1
20-interface-version KILLED 1
21-version-strict KILLED 1
22-keep-old-setting KILLED 1
23-first-load-nothing-on KILLED 1
24-refusal-logged KILLED 1
25-log-names-module KILLED 1
26-log-kept KILLED 1
27-whole-setting-object KILLED 1
28-unknown-kind-logged KILLED 1
29-absent-key-off KILLED 1
30-loads-serialized KILLED 1
31-log-required KILLED 1
42-modules-known-kind KILLED 1
43-unreadable-refused KILLED 1
44-realpath-index-mapped KILLED 1
45-realpath-root-mapped KILLED 1
32-schema-key KILLED 1
33-schema-check KILLED 1
34-schema-returned KILLED 1
35-schema-copy KILLED 1
36-setter-strict-keys KILLED 1
37-setter-revision-format KILLED 1
38-setter-checks-names KILLED 1
39-setter-actor-logged KILLED 1
40-setter-writes-plugins KILLED 1
46-setter-plain-prototype KILLED 1
47-writer-checks-bytes KILLED 1
41-copy-ships-plugins KILLED 1
mutants end 2026-10-15T16:42:52Z rc=0
+91
View File
@@ -0,0 +1,91 @@
#!/usr/bin/env python3
"""Row 131: one fault per check. Sequential process groups; whole-group timeout cleanup.
--dry checks every mutation site matches and changes source, and runs nothing.
A control run first runs each distinct test set on the unmutated source; any failure stops the run."""
import json,os,pathlib,signal,subprocess,sys
args=[a for a in sys.argv[1:] if a!='--dry'];DRY='--dry' in sys.argv
ROOT=pathlib.Path(args[0] if args else os.path.expanduser('~/dewey-scratch/r131/wt'))
OUT=pathlib.Path(__file__).resolve().parent/'mutants'
LT='packages/plugins/tests/loader.test.mjs';KT='packages/plugins/tests/kinds.test.mjs';PT=[KT,LT]
ST='packages/business/tests/plugin-settings.test.mjs';CT='packages/cli/tests/stack-copy.test.mjs'
cases=[]
def add(id,path,old,new,test):cases.append(dict(id=id,path=path,old=old,new=new,test=test if isinstance(test,list) else [test]))
p='packages/plugins/src/kinds.mjs'
add('01-name-pattern',p,'if (typeof name !== "string" || !NAME.test(name)) {','if (typeof name !== "string") {',PT)
add('02-list-cardinality',p,'} else if (!Array.isArray(setting)) {','} else if (false) {',PT)
add('03-one-cardinality',p,'if (typeof setting !== "string") fail(','if (false) fail(',KT)
add('04-no-duplicates',p,'if (seen.has(name)) fail(','if (false) fail(',PT)
add('05-known-kind',p,'if (!Object.hasOwn(kinds, kind)) {','if (false) {',KT)
add('06-plugins-object',p,'if (value === null || typeof value !== "object" || Array.isArray(value)) {','if (value === null) {',KT)
add('07-registry-exports',p,'exports: Object.freeze(["mayLaunch", "mustStop"])','exports: Object.freeze(["mayLaunch"])',PT)
add('08-registry-version',p,'kind: "usage-source", interfaceVersion: 1,','kind: "usage-source", interfaceVersion: 2,',PT)
p='packages/plugins/src/loader.mjs'
add('09-missing-directory',p,'if (e.code === "ENOENT" || e.code === "ENOTDIR") refuse("missing", `${path} is missing`);','/* missing not mapped */',LT)
add('10-component-type',p,'if (directory ? !st.isDirectory() : !st.isFile()) {','if (false) {',LT)
add('11-symlink-test',p,'if (st.isSymbolicLink()) refuse("symlink", `${path} is a symlink`);','/* symlinks allowed */',LT)
add('12-plugins-dir-checked',p,' component(ROOT, true);\n','',LT)
add('13-kind-dir-checked',p,' component(kindDir, true);\n','',LT)
add('14-name-dir-checked',p,' component(nameDir, true);\n','',LT)
add('15-index-checked',p,' component(index, false);\n','',LT)
add('16-realpath-before-import',p,'if (real !== expected) refuse(','if (false) refuse(',LT)
add('17-load-failure',p,'refuse("load-failed", `${spec.kind} ${name} failed to load: ${e.message}`);','throw e;',LT)
add('18-export-present',p,'if (!Object.hasOwn(module, key)) refuse(','if (false) refuse(',LT)
add('19-export-function',p,'if (typeof module[key] !== "function") refuse(','if (false) refuse(',LT)
add('20-interface-version',p,'if (module.interfaceVersion !== spec.interfaceVersion) {','if (false) {',LT)
add('21-version-strict',p,'if (module.interfaceVersion !== spec.interfaceVersion) {','if (module.interfaceVersion != spec.interfaceVersion) {',LT)
add('22-keep-old-setting',p,'if (ok) current.set(kind, Object.freeze(next));','current.set(kind, Object.freeze(next));',LT)
add('23-first-load-nothing-on',p,'if (ok) current.set(kind, Object.freeze(next));','if (ok || current.get(kind).length === 0) current.set(kind, Object.freeze(next));',LT)
add('24-refusal-logged',p,' log(entry);\n','',LT)
add('25-log-names-module',p,'name: e.plugin ?? name, code','name, code',LT)
add('26-log-kept',p,'kept: kind === null ? loaded() : current.has(kind) ? current.get(kind).map(m => m.name) : [],','kept: [],',LT)
add('27-whole-setting-object',p,'if (plugins === null || typeof plugins !== "object" || Array.isArray(plugins)) {','if (plugins === null || typeof plugins !== "object") {',LT)
add('28-unknown-kind-logged',p,'refused(kind, null, new PluginError("unknown-kind"','void (kind, null, new PluginError("unknown-kind"',LT)
add('29-absent-key-off',p,'if (Object.hasOwn(plugins, kind)) names = namesFor(','if (!Object.hasOwn(plugins, kind)) continue; names = namesFor(',LT)
add('30-loads-serialized',p,'const run = queue.then(() => apply(plugins));','const run = apply(plugins);',LT)
add('31-log-required',p,'if (typeof log !== "function") throw','if (false) throw',LT)
add('42-modules-known-kind',p,'if (!current.has(kind)) refuse("unknown-kind"','if (false) refuse("unknown-kind"',LT)
add('43-unreadable-refused',p,'refuse("unreadable", `${path} can\'t be read (${e.code ?? e.message})`);','throw e;',LT)
add('44-realpath-index-mapped',p,'const real = fsCall(index, realpathSync);','const real = realpathSync(index);',LT)
add('45-realpath-root-mapped',p,'join(fsCall(ROOT, realpathSync),','join(realpathSync(ROOT),',LT)
p='packages/business/src/business.mjs'
add('32-schema-key',p,'"roles", "launch", "plugins"];','"roles", "launch"];',[ST,LT])
add('33-schema-check',p,'structuredClone(checkPlugins(document.plugins, `${file} plugins`, { fail: (_code, message) => refuse(message) }))','structuredClone(document.plugins)',ST)
add('34-schema-returned',p,'launch, plugins, definitions,','launch, definitions,',[ST,LT])
add('35-schema-copy',p,' : structuredClone(checkPlugins(',' : (checkPlugins(',ST)
p='packages/business/src/plugin-settings.mjs'
add('36-setter-strict-keys',p,'Object.keys(args).some(key => key !== "revision" && key !== "plugins")','false',ST)
add('37-setter-revision-format',p,'if (typeof args.revision !== "string" || !/^[a-f0-9]{64}$/.test(args.revision)) {','if (false) {',ST)
add('38-setter-checks-names',p,' checkPlugins(args.plugins, "plugins");\n','',ST)
add('39-setter-actor-logged',p,'{ revision: args.revision, actor }','{ revision: args.revision, actor: "host" }',ST)
add('40-setter-writes-plugins',p,' next.plugins = structuredClone(args.plugins);\n','',ST)
add('46-setter-plain-prototype',p,'if (proto !== Object.prototype && proto !== null) {','if (false) {',ST)
p='packages/business/src/organization.mjs'
add('47-writer-checks-bytes',p,' validateBusinessDocument(written, file, { rolesDir });\n','',ST)
add('41-copy-ships-plugins','scripts/stack-copy.sh',' packages/plugins\n','',CT)
def run(name,test):
env={**os.environ,'DOCKER_HOST':'unix:///nonexistent.sock'}
with (OUT/(name+'.log')).open('w') as log:
p=subprocess.Popen(['node','--test',*test],cwd=ROOT,env=env,stdout=log,stderr=subprocess.STDOUT,start_new_session=True)
try:return p.wait(timeout=300)
except subprocess.TimeoutExpired:os.killpg(p.pid,signal.SIGKILL);p.wait();return 'timeout'
results=[];control=[]
if not DRY:
OUT.mkdir(exist_ok=True)
sets=[];[sets.append(c['test']) for c in cases if c['test'] not in sets]
for i,t in enumerate(sets):
rc=run('control-%02d'%(i+1),t);control.append(dict(id='control-%02d'%(i+1),test=t,exit=rc));print('control-%02d'%(i+1),' '.join(t),'PASS' if rc==0 else 'FAIL',rc,flush=True)
if rc!=0:(OUT/'control.json').write_text(json.dumps(control,indent=2)+'\n');sys.exit('control failed: unmutated source fails '+' '.join(t))
(OUT/'control.json').write_text(json.dumps(control,indent=2)+'\n')
for c in cases:
file=ROOT/c['path'];before=file.read_text();matches=before.count(c['old'])
if not matches:raise RuntimeError('missing mutation site '+c['id'])
after=before.replace(c['old'],c['new'])
if after==before:raise RuntimeError('no change '+c['id'])
if DRY:print(c['id'],'sites',matches,flush=True);continue
file.write_text(after)
try:
rc=run(c['id'],c['test'])
verdict='KILLED' if isinstance(rc,int) and rc!=0 else 'SURVIVED' if rc==0 else 'TIMEOUT'
row={k:c[k] for k in ['id','path','test']};row.update(result=verdict,exit=rc,sites=matches);results.append(row);print(c['id'],verdict,rc,flush=True)
finally:file.write_text(before)
if not DRY:(OUT/'results.json').write_text(json.dumps(results,indent=2)+'\n')
@@ -0,0 +1,85 @@
✔ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source and limit-check at interface version 1, each a list (0.996001ms)
✔ REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included (0.182864ms)
✖ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (4.001549ms)
✖ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.199326ms)
✔ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.151957ms)
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (7.403267ms)
✖ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.164675ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (2.964415ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.879038ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.089231ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (27.743931ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.73052ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.250644ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.482361ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.991154ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.185904ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.332246ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.668266ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.689325ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.247682ms)
✔ REQ-PLUG-1 the loader needs a log callback (0.939442ms)
ℹ tests 21
ℹ suites 0
ℹ pass 18
ℹ fail 3
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 220.340526
✖ failing tests:
test at packages/plugins/tests/kinds.test.mjs:24:1
✖ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (4.001549ms)
AssertionError [ERR_ASSERTION]: Missing expected exception: Meter
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/kinds.test.mjs:30: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'
}
test at packages/plugins/tests/kinds.test.mjs:35:1
✖ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.199326ms)
AssertionError [ERR_ASSERTION]: Missing expected exception.
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/kinds.test.mjs:39: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'
}
test at packages/plugins/tests/loader.test.mjs:64:1
✖ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.164675ms)
AssertionError [ERR_ASSERTION]: Meter: /home/jwoltje/dewey-scratch/tmp/mosaic-plugins-O1VMSX/packages/plugins/usage-source/Meter is missing
+ actual - expected
+ 'missing'
- 'bad-name'
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:35:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:67:5)
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: 'missing',
expected: 'bad-name',
operator: 'strictEqual',
diff: 'simple'
}
@@ -0,0 +1,49 @@
✔ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source and limit-check at interface version 1, each a list (1.023771ms)
✔ REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included (0.228057ms)
✔ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (4.150508ms)
✔ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.156655ms)
✔ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.155201ms)
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (7.30515ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.34785ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.274529ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.43153ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.026469ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (27.388898ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (3.042863ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.284637ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.376742ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.943525ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.349485ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.552245ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.949225ms)
✖ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (3.628666ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (101.958279ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.120707ms)
ℹ tests 21
ℹ suites 0
ℹ pass 20
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 225.789513
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:225:1
✖ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (3.628666ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
'e' !== 'meter'
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:37:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:239:3)
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: 'e',
expected: 'meter',
operator: 'strictEqual',
diff: 'simple'
}
@@ -0,0 +1,46 @@
✔ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source and limit-check at interface version 1, each a list (0.94563ms)
✔ REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included (0.236289ms)
✔ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (3.814064ms)
✖ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.435522ms)
✔ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.137653ms)
ℹ tests 5
ℹ suites 0
ℹ pass 4
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 49.269106
✖ failing tests:
test at packages/plugins/tests/kinds.test.mjs:35:1
✖ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.435522ms)
AssertionError [ERR_ASSERTION]: The validation function is expected to return "true". Received false
Caught error:
PluginError: plugins.single names ["only"], which doesn't match /^[a-z][a-z0-9-]*$/
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/kinds.test.mjs:38: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: PluginError: plugins.single names ["only"], which doesn't match /^[a-z][a-z0-9-]*$/
at raise (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/src/kinds.mjs:30:9)
at namesFor (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/src/kinds.mjs:45:7)
at checkPlugins (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/src/kinds.mjs:63:5)
at file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/kinds.test.mjs:38:23
at getActual (node:assert:580:5)
at strict.throws (node:assert:728:24)
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/kinds.test.mjs:38: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),
operator: 'throws',
diff: 'simple'
}
@@ -0,0 +1,75 @@
✔ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source and limit-check at interface version 1, each a list (1.032167ms)
✔ REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included (0.21157ms)
✖ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (4.50107ms)
✔ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.178734ms)
✔ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.144174ms)
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (7.504522ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.396357ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.414915ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.442613ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.027418ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (29.329875ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.731592ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.276032ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.480902ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (3.041434ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.261027ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.427943ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.73597ms)
✖ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (3.848596ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.621564ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.115554ms)
ℹ tests 21
ℹ suites 0
ℹ pass 19
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 224.418977
✖ failing tests:
test at packages/plugins/tests/kinds.test.mjs:24:1
✖ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (4.50107ms)
AssertionError [ERR_ASSERTION]: Missing expected exception.
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/kinds.test.mjs:32: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'
}
test at packages/plugins/tests/loader.test.mjs:225:1
✖ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (3.848596ms)
AssertionError [ERR_ASSERTION]: meter: old setting kept
+ actual - expected
{
'limit-check': [
'cap'
],
'usage-source': [
'meter',
+ 'meter'
]
}
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:32:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:240:3)
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: { 'usage-source': [ 'meter', 'meter' ], 'limit-check': [ 'cap' ] },
expected: { 'usage-source': [ 'meter' ], 'limit-check': [ 'cap' ] },
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -0,0 +1,77 @@
✔ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source and limit-check at interface version 1, each a list (0.927314ms)
✔ REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included (0.20551ms)
✖ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (4.006769ms)
✔ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.150941ms)
✖ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.198054ms)
ℹ tests 5
ℹ suites 0
ℹ pass 3
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 44.972941
✖ failing tests:
test at packages/plugins/tests/kinds.test.mjs:24:1
✖ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (4.006769ms)
AssertionError [ERR_ASSERTION]: The validation function is expected to return "true". Received false
Caught error:
TypeError: Cannot read properties of undefined (reading 'switch')
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/kinds.test.mjs:26: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: TypeError: Cannot read properties of undefined (reading 'switch')
at namesFor (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/src/kinds.mjs:36:12)
at checkPlugins (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/src/kinds.mjs:63:5)
at file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/kinds.test.mjs:26:23
at getActual (node:assert:580:5)
at strict.throws (node:assert:728:24)
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/kinds.test.mjs:26: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),
operator: 'throws',
diff: 'simple'
}
test at packages/plugins/tests/kinds.test.mjs:42:1
✖ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.198054ms)
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /x plugins names unknown kind/. Input:
"TypeError: Cannot read properties of undefined (reading 'switch')"
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/kinds.test.mjs:45: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: TypeError: Cannot read properties of undefined (reading 'switch')
at namesFor (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/src/kinds.mjs:36:12)
at checkPlugins (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/src/kinds.mjs:63:5)
at file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/kinds.test.mjs:45:23
at getActual (node:assert:580:5)
at strict.throws (node:assert:728:24)
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/kinds.test.mjs:45: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),
expected: /x plugins names unknown kind/,
operator: 'throws',
diff: 'simple'
}
@@ -0,0 +1,32 @@
✔ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source and limit-check at interface version 1, each a list (0.998049ms)
✔ REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included (0.211036ms)
✖ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (0.608073ms)
✔ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.1756ms)
✔ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.131383ms)
ℹ tests 5
ℹ suites 0
ℹ pass 4
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 45.025922
✖ failing tests:
test at packages/plugins/tests/kinds.test.mjs:24:1
✖ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (0.608073ms)
AssertionError [ERR_ASSERTION]: Missing expected exception.
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/kinds.test.mjs:25:50)
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,84 @@
✖ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source and limit-check at interface version 1, each a list (1.690221ms)
✔ REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included (0.272352ms)
✔ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (4.003323ms)
✔ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.175796ms)
✔ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.130681ms)
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (7.278278ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.410108ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.313334ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.391059ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.001031ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (27.412686ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.597955ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.148237ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.269335ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.944476ms)
✖ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.921095ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.322861ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.68072ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.899035ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.889175ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.123508ms)
ℹ tests 21
ℹ suites 0
ℹ pass 19
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 220.083166
✖ failing tests:
test at packages/plugins/tests/kinds.test.mjs:8:1
✖ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source and limit-check at interface version 1, each a list (1.690221ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
{
exports: [
'mayLaunch',
- 'mustStop'
],
interfaceVersion: 1,
kind: 'limit-check',
switch: 'list'
}
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/kinds.test.mjs:12: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: { kind: 'limit-check', interfaceVersion: 1, exports: [ 'mayLaunch' ], switch: 'list' },
expected: { kind: 'limit-check', interfaceVersion: 1, exports: [ 'mayLaunch', 'mustStop' ], switch: 'list' },
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:185:1
✖ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.921095ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ []
- [
- [
- 'limit-check',
- 'half',
- 'missing-export'
- ]
- ]
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:196:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: [],
expected: [ [ 'limit-check', 'half', 'missing-export' ] ],
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -0,0 +1,452 @@
✖ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source and limit-check at interface version 1, each a list (1.64663ms)
✔ REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included (0.271592ms)
✔ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (3.753195ms)
✔ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.168197ms)
✔ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.122324ms)
✖ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (8.000324ms)
✖ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (2.237809ms)
✖ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (2.153363ms)
✖ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.039813ms)
✖ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.43548ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (26.022044ms)
✖ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.288343ms)
✖ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.026847ms)
✖ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.033377ms)
✖ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.01646ms)
✖ REQ-PLUG-1 a missing export refuses and keeps the old setting (1.959449ms)
✖ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.489118ms)
✖ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.887712ms)
✖ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (1.792952ms)
✖ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (1.835769ms)
✔ REQ-PLUG-1 the loader needs a log callback (0.964779ms)
ℹ tests 21
ℹ suites 0
ℹ pass 6
ℹ fail 15
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 122.695967
✖ failing tests:
test at packages/plugins/tests/kinds.test.mjs:8:1
✖ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source and limit-check at interface version 1, each a list (1.64663ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
{
exports: [
'readTurn'
],
+ interfaceVersion: 2,
- interfaceVersion: 1,
kind: 'usage-source',
switch: 'list'
}
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/kinds.test.mjs:10: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: { kind: 'usage-source', interfaceVersion: 2, exports: [ 'readTurn' ], switch: 'list' },
expected: { kind: 'usage-source', interfaceVersion: 1, exports: [ 'readTurn' ], switch: 'list' },
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:44:1
✖ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (8.000324ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ [
+ {
+ code: 'interface-version',
+ event: 'plugin-refused',
+ kept: [],
+ kind: 'usage-source',
+ message: 'usage-source fixture-usage implements interface 1, not 2',
+ name: 'fixture-usage'
+ }
+ ]
- []
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:56: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: [ { event: 'plugin-refused', kind: 'usage-source', name: 'fixture-usage', code: 'interface-version', message: 'usage-source fixture-usage implements interface 1, not 2', kept: [] } ],
expected: [],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:64:1
✖ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (2.237809ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ [
+ {
+ code: 'interface-version',
+ event: 'plugin-refused',
+ kept: [],
+ kind: 'usage-source',
+ message: 'usage-source meter implements interface 1, not 2',
+ name: 'meter'
+ }
+ ]
- []
at loadedTree (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:22:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:65:13)
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: [ { event: 'plugin-refused', kind: 'usage-source', name: 'meter', code: 'interface-version', message: 'usage-source meter implements interface 1, not 2', kept: [] } ],
expected: [],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:71:1
✖ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (2.153363ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ [
+ {
+ code: 'interface-version',
+ event: 'plugin-refused',
+ kept: [],
+ kind: 'usage-source',
+ message: 'usage-source meter implements interface 1, not 2',
+ name: 'meter'
+ }
+ ]
- []
at loadedTree (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:22:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:72:13)
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: [ { event: 'plugin-refused', kind: 'usage-source', name: 'meter', code: 'interface-version', message: 'usage-source meter implements interface 1, not 2', kept: [] } ],
expected: [],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:80:1
✖ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.039813ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ [
+ {
+ code: 'interface-version',
+ event: 'plugin-refused',
+ kept: [],
+ kind: 'usage-source',
+ message: 'usage-source meter implements interface 1, not 2',
+ name: 'meter'
+ }
+ ]
- []
at loadedTree (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:22:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:81:13)
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: [ { event: 'plugin-refused', kind: 'usage-source', name: 'meter', code: 'interface-version', message: 'usage-source meter implements interface 1, not 2', kept: [] } ],
expected: [],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:91:1
✖ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.43548ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ [
+ {
+ code: 'interface-version',
+ event: 'plugin-refused',
+ kept: [],
+ kind: 'usage-source',
+ message: 'usage-source meter implements interface 1, not 2',
+ name: 'meter'
+ }
+ ]
- []
at loadedTree (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:22:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:92:13)
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: [ { event: 'plugin-refused', kind: 'usage-source', name: 'meter', code: 'interface-version', message: 'usage-source meter implements interface 1, not 2', kept: [] } ],
expected: [],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:119:1
✖ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.288343ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ [
+ {
+ code: 'interface-version',
+ event: 'plugin-refused',
+ kept: [],
+ kind: 'usage-source',
+ message: 'usage-source meter implements interface 1, not 2',
+ name: 'meter'
+ }
+ ]
- []
at loadedTree (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:22:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:121:13)
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: [ { event: 'plugin-refused', kind: 'usage-source', name: 'meter', code: 'interface-version', message: 'usage-source meter implements interface 1, not 2', kept: [] } ],
expected: [],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:137:1
✖ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.026847ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ [
+ {
+ code: 'interface-version',
+ event: 'plugin-refused',
+ kept: [],
+ kind: 'usage-source',
+ message: 'usage-source meter implements interface 1, not 2',
+ name: 'meter'
+ }
+ ]
- []
at loadedTree (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:22:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:138:13)
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: [ { event: 'plugin-refused', kind: 'usage-source', name: 'meter', code: 'interface-version', message: 'usage-source meter implements interface 1, not 2', kept: [] } ],
expected: [],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:148:1
✖ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.033377ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ [
+ {
+ code: 'interface-version',
+ event: 'plugin-refused',
+ kept: [],
+ kind: 'usage-source',
+ message: 'usage-source meter implements interface 1, not 2',
+ name: 'meter'
+ }
+ ]
- []
at loadedTree (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:22:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:152:13)
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: [ { event: 'plugin-refused', kind: 'usage-source', name: 'meter', code: 'interface-version', message: 'usage-source meter implements interface 1, not 2', kept: [] } ],
expected: [],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:177:1
✖ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.01646ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ [
+ {
+ code: 'interface-version',
+ event: 'plugin-refused',
+ kept: [],
+ kind: 'usage-source',
+ message: 'usage-source meter implements interface 1, not 2',
+ name: 'meter'
+ }
+ ]
- []
at loadedTree (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:22:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:178:13)
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: [ { event: 'plugin-refused', kind: 'usage-source', name: 'meter', code: 'interface-version', message: 'usage-source meter implements interface 1, not 2', kept: [] } ],
expected: [],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:185:1
✖ REQ-PLUG-1 a missing export refuses and keeps the old setting (1.959449ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ [
+ {
+ code: 'interface-version',
+ event: 'plugin-refused',
+ kept: [],
+ kind: 'usage-source',
+ message: 'usage-source meter implements interface 1, not 2',
+ name: 'meter'
+ }
+ ]
- []
at loadedTree (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:22:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:186:13)
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: [ { event: 'plugin-refused', kind: 'usage-source', name: 'meter', code: 'interface-version', message: 'usage-source meter implements interface 1, not 2', kept: [] } ],
expected: [],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:200:1
✖ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.489118ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ [
+ {
+ code: 'interface-version',
+ event: 'plugin-refused',
+ kept: [],
+ kind: 'usage-source',
+ message: 'usage-source meter implements interface 1, not 2',
+ name: 'meter'
+ }
+ ]
- []
at loadedTree (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:22:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:201:13)
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: [ { event: 'plugin-refused', kind: 'usage-source', name: 'meter', code: 'interface-version', message: 'usage-source meter implements interface 1, not 2', kept: [] } ],
expected: [],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:208:1
✖ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.887712ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
'meter' !== 'absent'
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:221: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: 'meter',
expected: 'absent',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:225:1
✖ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (1.792952ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ [
+ {
+ code: 'interface-version',
+ event: 'plugin-refused',
+ kept: [],
+ kind: 'usage-source',
+ message: 'usage-source meter implements interface 1, not 2',
+ name: 'meter'
+ }
+ ]
- []
at loadedTree (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:22:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:226:13)
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: [ { event: 'plugin-refused', kind: 'usage-source', name: 'meter', code: 'interface-version', message: 'usage-source meter implements interface 1, not 2', kept: [] } ],
expected: [],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:246:1
✖ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (1.835769ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ [
+ {
+ code: 'interface-version',
+ event: 'plugin-refused',
+ kept: [],
+ kind: 'usage-source',
+ message: 'usage-source meter implements interface 1, not 2',
+ name: 'meter'
+ }
+ ]
- []
at loadedTree (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:22:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:247:13)
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: [ { event: 'plugin-refused', kind: 'usage-source', name: 'meter', code: 'interface-version', message: 'usage-source meter implements interface 1, not 2', kept: [] } ],
expected: [],
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -0,0 +1,46 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (6.90176ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.361998ms)
✖ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (2.748757ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.845159ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (1.995221ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (23.706494ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.631477ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.270016ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.299279ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (3.024096ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.184516ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.271304ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.660878ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.865617ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.916421ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.1015ms)
ℹ tests 16
ℹ suites 0
ℹ pass 15
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 215.805466
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:71:1
✖ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (2.748757ms)
AssertionError [ERR_ASSERTION]: absent: /home/jwoltje/dewey-scratch/tmp/mosaic-plugins-KZKNqY/packages/plugins/usage-source/absent can't be read (ENOENT)
+ actual - expected
+ 'unreadable'
- 'missing'
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:35:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:73:3)
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: 'unreadable',
expected: 'missing',
operator: 'strictEqual',
diff: 'simple'
}
@@ -0,0 +1,46 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (7.186614ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.315095ms)
✖ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.944373ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.278079ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (1.991503ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (24.395037ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (3.147566ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.186695ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.747091ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.52592ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.074237ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.305854ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.715183ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.821736ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.34957ms)
✔ REQ-PLUG-1 the loader needs a log callback (0.943575ms)
ℹ tests 16
ℹ suites 0
ℹ pass 15
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 222.57908
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:71:1
✖ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.944373ms)
AssertionError [ERR_ASSERTION]: dir-index: usage-source dir-index failed to load: Directory import '/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-wNOv6V/packages/plugins/usage-source/dir-index/index.mjs' is not supported resolving ES modules imported from /home/jwoltje/dewey-scratch/tmp/mosaic-plugins-wNOv6V/packages/plugins/src/loader.mjs
+ actual - expected
+ 'load-failed'
- 'missing'
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:35:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:77:3)
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: 'load-failed',
expected: 'missing',
operator: 'strictEqual',
diff: 'simple'
}
@@ -0,0 +1,89 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (6.714311ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.222662ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.20319ms)
✖ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.519204ms)
✖ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.042677ms)
✖ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (25.896417ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.731315ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.242542ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.508473ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.942552ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.163471ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.333247ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.672782ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.739229ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.819413ms)
✔ REQ-PLUG-1 the loader needs a log callback (0.989416ms)
ℹ tests 16
ℹ suites 0
ℹ pass 13
ℹ fail 3
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 216.086199
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:80:1
✖ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.519204ms)
AssertionError [ERR_ASSERTION]: linked: /home/jwoltje/dewey-scratch/tmp/mosaic-plugins-e5grks/packages/plugins/usage-source/linked is not a directory
+ actual - expected
+ 'missing'
- 'symlink'
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:35:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:84:3)
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: 'missing',
expected: 'symlink',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:91:1
✖ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.042677ms)
AssertionError [ERR_ASSERTION]: meter: /home/jwoltje/dewey-scratch/tmp/mosaic-plugins-xQ1n99/packages/plugins/usage-source is not a directory
+ actual - expected
+ 'missing'
- 'symlink'
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:35:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:96:3)
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: 'missing',
expected: 'symlink',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:99:1
✖ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (25.896417ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
+ actual - expected
+ 'missing'
- 'symlink'
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:115:10)
at Test.runInAsyncScope (node:async_hooks:226:14)
at Test.run (node:internal/test_runner/test:1402:25)
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
at Test.postRun (node:internal/test_runner/test:1542:19)
at Test.run (node:internal/test_runner/test:1467:12)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: 'missing',
expected: 'symlink',
operator: 'strictEqual',
diff: 'simple'
}
@@ -0,0 +1,51 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (6.925358ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.328723ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.325273ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.474962ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.163341ms)
✖ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (27.310415ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.626566ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.235051ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.358967ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.946526ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.874281ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.41141ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.707919ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.910123ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.4569ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.025233ms)
ℹ tests 16
ℹ suites 0
ℹ pass 15
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 221.688252
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:99:1
✖ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (27.310415ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ [
+ 'meter'
+ ]
- []
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:114: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: [ 'meter' ],
expected: [],
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -0,0 +1,44 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (6.802975ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.133239ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.0508ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.218829ms)
✖ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.305842ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (26.284746ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.734172ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.245204ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.310071ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.90276ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.22573ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.245922ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.611949ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.821806ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (104.303698ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.140143ms)
ℹ tests 16
ℹ suites 0
ℹ pass 15
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 216.760358
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:91:1
✖ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.305842ms)
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /plugins\/usage-source is a symlink/. Input:
'/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-zRZTGt/packages/plugins/usage-source/meter/index.mjs resolves to /home/jwoltje/dewey-scratch/tmp/mosaic-plugins-zRZTGt/packages/plugins/usage-real/meter/index.mjs'
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:39:23)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:96:3)
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: '/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-zRZTGt/packages/plugins/usage-source/meter/index.mjs resolves to /home/jwoltje/dewey-scratch/tmp/mosaic-plugins-zRZTGt/packages/plugins/usage-real/meter/index.mjs',
expected: /plugins\/usage-source is a symlink/,
operator: 'match',
diff: 'simple'
}
@@ -0,0 +1,62 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (7.068342ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.386477ms)
✖ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (2.797577ms)
✖ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.688309ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.000958ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (29.076793ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.557883ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.204728ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.365951ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (3.02219ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.271689ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.341166ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.633871ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.396452ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (101.998819ms)
✔ REQ-PLUG-1 the loader needs a log callback (0.981439ms)
ℹ tests 16
ℹ suites 0
ℹ pass 14
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 217.769386
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:71:1
✖ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (2.797577ms)
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /absent is missing/. Input:
'/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-dmINlK/packages/plugins/usage-source/absent/index.mjs is missing'
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:39:23)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:73:3)
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: '/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-dmINlK/packages/plugins/usage-source/absent/index.mjs is missing',
expected: /absent is missing/,
operator: 'match',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:80:1
✖ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.688309ms)
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /usage-source\/linked is a symlink/. Input:
'/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-wz847U/packages/plugins/usage-source/linked/index.mjs resolves to /home/jwoltje/dewey-scratch/tmp/mosaic-plugins-wz847U/packages/plugins/usage-source/meter/index.mjs'
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:39:23)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:84:3)
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: '/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-wz847U/packages/plugins/usage-source/linked/index.mjs resolves to /home/jwoltje/dewey-scratch/tmp/mosaic-plugins-wz847U/packages/plugins/usage-source/meter/index.mjs',
expected: /usage-source\/linked is a symlink/,
operator: 'match',
diff: 'simple'
}
@@ -0,0 +1,64 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (6.725849ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.243948ms)
✖ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (4.257439ms)
✖ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.458063ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.154277ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (25.532309ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.574681ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.263122ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.727393ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.514483ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.167637ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.339686ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.63742ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.910652ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.610045ms)
✔ REQ-PLUG-1 the loader needs a log callback (0.997279ms)
ℹ tests 16
ℹ suites 0
ℹ pass 14
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 219.515358
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:71:1
✖ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (4.257439ms)
AssertionError [ERR_ASSERTION]: dir-index: usage-source dir-index failed to load: Directory import '/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-0MgOLq/packages/plugins/usage-source/dir-index/index.mjs' is not supported resolving ES modules imported from /home/jwoltje/dewey-scratch/tmp/mosaic-plugins-0MgOLq/packages/plugins/src/loader.mjs
+ actual - expected
+ 'load-failed'
- 'missing'
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:35:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:77:3)
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: 'load-failed',
expected: 'missing',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:80:1
✖ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.458063ms)
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /link-index\/index\.mjs is a symlink/. Input:
'/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-GUjPC8/packages/plugins/usage-source/link-index/index.mjs resolves to /home/jwoltje/dewey-scratch/tmp/mosaic-plugins-GUjPC8/packages/plugins/usage-source/meter/index.mjs'
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:39:23)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:88:3)
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: '/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-GUjPC8/packages/plugins/usage-source/link-index/index.mjs resolves to /home/jwoltje/dewey-scratch/tmp/mosaic-plugins-GUjPC8/packages/plugins/usage-source/meter/index.mjs',
expected: /link-index\/index\.mjs is a symlink/,
operator: 'match',
diff: 'simple'
}
@@ -0,0 +1,53 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (6.945246ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.348134ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.268283ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.403583ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.127038ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (25.154045ms)
✖ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (3.963516ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.224672ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.980735ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.588943ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.205649ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.335382ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.605616ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.886208ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.434789ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.058781ms)
ℹ tests 16
ℹ suites 0
ℹ pass 15
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 219.290564
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:119:1
✖ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (3.963516ms)
AssertionError [ERR_ASSERTION]: swapped: old setting kept
+ actual - expected
{
'limit-check': [
'cap'
],
'usage-source': [
+ 'swapped'
- 'meter'
]
}
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:32:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:131:3)
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: { 'usage-source': [ 'swapped' ], 'limit-check': [ 'cap' ] },
expected: { 'usage-source': [ 'meter' ], 'limit-check': [ 'cap' ] },
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -0,0 +1,40 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (7.445183ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.640137ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.547417ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.603238ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.122971ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (27.289759ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.672318ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.206065ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.405737ms)
✖ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.528235ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.532213ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.427075ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.693242ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.966564ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.667996ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.00667ms)
ℹ tests 16
ℹ suites 0
ℹ pass 15
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 220.26357
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:177:1
✖ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.528235ms)
SyntaxError: Unexpected end of input
at compileSourceTextModule (node:internal/modules/esm/utils:355:16)
at ModuleLoader.moduleStrategy (node:internal/modules/esm/translators:93:18)
at #translate (node:internal/modules/esm/loader:441:20)
at afterLoad (node:internal/modules/esm/loader:509:29)
at ModuleLoader.loadAndTranslate (node:internal/modules/esm/loader:514:12)
at #getOrCreateModuleJobAfterResolve (node:internal/modules/esm/loader:567:36)
at afterResolve (node:internal/modules/esm/loader:614:52)
at ModuleLoader.getOrCreateModuleJob (node:internal/modules/esm/loader:620:12)
at node:internal/modules/esm/loader:639:32
at TracingChannel.tracePromise (node:diagnostics_channel:547:22)
@@ -0,0 +1,44 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (6.739325ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.163672ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.209673ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.221438ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (1.968567ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (29.583567ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.643279ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.23102ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.332869ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.986386ms)
✖ REQ-PLUG-1 a missing export refuses and keeps the old setting (2.449028ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.264944ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.58ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.38206ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.425578ms)
✔ REQ-PLUG-1 the loader needs a log callback (0.94313ms)
ℹ tests 16
ℹ suites 0
ℹ pass 15
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 218.248947
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:185:1
✖ REQ-PLUG-1 a missing export refuses and keeps the old setting (2.449028ms)
AssertionError [ERR_ASSERTION]: The input did not match the regular expression /doesn't export readTurn/. Input:
"usage-source no-read export readTurn isn't a function"
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:39:23)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:188:3)
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: "usage-source no-read export readTurn isn't a function",
expected: /doesn't export readTurn/,
operator: 'match',
diff: 'simple'
}
@@ -0,0 +1,53 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (6.876323ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.205801ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.377559ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.293927ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (1.93176ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (29.378703ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.696961ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.219404ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.46605ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (3.064478ms)
✖ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.728533ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.465109ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.785553ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.962387ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (103.606906ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.078982ms)
ℹ tests 16
ℹ suites 0
ℹ pass 15
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 220.230633
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:185:1
✖ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.728533ms)
AssertionError [ERR_ASSERTION]: not-fn: old setting kept
+ actual - expected
{
'limit-check': [
'cap'
],
'usage-source': [
+ 'not-fn'
- 'meter'
]
}
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:32:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:192:3)
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: { 'usage-source': [ 'not-fn' ], 'limit-check': [ 'cap' ] },
expected: { 'usage-source': [ 'meter' ], 'limit-check': [ 'cap' ] },
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -0,0 +1,53 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (7.01029ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.328125ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.276204ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.394084ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.098241ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (26.876637ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.668409ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.241584ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.788681ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.505207ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.185405ms)
✖ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.776892ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.769312ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (3.021162ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.820553ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.119294ms)
ℹ tests 16
ℹ suites 0
ℹ pass 15
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 217.379225
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:200:1
✖ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.776892ms)
AssertionError [ERR_ASSERTION]: v2: old setting kept
+ actual - expected
{
'limit-check': [
'cap'
],
'usage-source': [
+ 'v2'
- 'meter'
]
}
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:32:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:203:3)
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: { 'usage-source': [ 'v2' ], 'limit-check': [ 'cap' ] },
expected: { 'usage-source': [ 'meter' ], 'limit-check': [ 'cap' ] },
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -0,0 +1,53 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (7.648538ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.488841ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.338481ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.471408ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.159739ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (27.805471ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (4.124778ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (3.940293ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (4.805749ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (4.922765ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (6.049683ms)
✖ REQ-PLUG-1 a different interface version refuses and keeps the old setting (5.699961ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (3.253036ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (5.265904ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.996336ms)
✔ REQ-PLUG-1 the loader needs a log callback (0.995374ms)
ℹ tests 16
ℹ suites 0
ℹ pass 15
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 241.746866
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:200:1
✖ REQ-PLUG-1 a different interface version refuses and keeps the old setting (5.699961ms)
AssertionError [ERR_ASSERTION]: v-string: old setting kept
+ actual - expected
{
'limit-check': [
'cap'
],
'usage-source': [
+ 'v-string'
- 'meter'
]
}
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:32:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:205:3)
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: { 'usage-source': [ 'v-string' ], 'limit-check': [ 'cap' ] },
expected: { 'usage-source': [ 'meter' ], 'limit-check': [ 'cap' ] },
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -0,0 +1,295 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (6.867014ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.363527ms)
✖ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.828213ms)
✖ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.275087ms)
✖ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.068962ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (23.76621ms)
✖ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.669281ms)
✖ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.459637ms)
✖ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.28395ms)
✖ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.739034ms)
✖ REQ-PLUG-1 a missing export refuses and keeps the old setting (2.101171ms)
✖ REQ-PLUG-1 a different interface version refuses and keeps the old setting (1.982068ms)
✖ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.686111ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.317616ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (103.461316ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.045805ms)
ℹ tests 16
ℹ suites 0
ℹ pass 6
ℹ fail 10
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 213.193231
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:71:1
✖ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.828213ms)
AssertionError [ERR_ASSERTION]: empty: old setting kept
+ actual - expected
{
'limit-check': [
'cap'
],
+ 'usage-source': []
- 'usage-source': [
- 'meter'
- ]
}
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:32:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:75:3)
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: { 'usage-source': [], 'limit-check': [ 'cap' ] },
expected: { 'usage-source': [ 'meter' ], 'limit-check': [ 'cap' ] },
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:80:1
✖ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.275087ms)
AssertionError [ERR_ASSERTION]: linked: old setting kept
+ actual - expected
{
'limit-check': [
'cap'
],
+ 'usage-source': []
- 'usage-source': [
- 'meter'
- ]
}
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:32:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:84:3)
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: { 'usage-source': [], 'limit-check': [ 'cap' ] },
expected: { 'usage-source': [ 'meter' ], 'limit-check': [ 'cap' ] },
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:91:1
✖ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.068962ms)
AssertionError [ERR_ASSERTION]: meter: old setting kept
+ actual - expected
{
'limit-check': [
'cap'
],
+ 'usage-source': []
- 'usage-source': [
- 'meter'
- ]
}
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:32:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:96:3)
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: { 'usage-source': [], 'limit-check': [ 'cap' ] },
expected: { 'usage-source': [ 'meter' ], 'limit-check': [ 'cap' ] },
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:119:1
✖ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.669281ms)
AssertionError [ERR_ASSERTION]: swapped: old setting kept
+ actual - expected
{
'limit-check': [
'cap'
],
+ 'usage-source': []
- 'usage-source': [
- 'meter'
- ]
}
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:32:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:131:3)
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: { 'usage-source': [], 'limit-check': [ 'cap' ] },
expected: { 'usage-source': [ 'meter' ], 'limit-check': [ 'cap' ] },
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:137:1
✖ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.459637ms)
AssertionError [ERR_ASSERTION]: locked: old setting kept
+ actual - expected
{
'limit-check': [
'cap'
],
+ 'usage-source': []
- 'usage-source': [
- 'meter'
- ]
}
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:32:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:142:5)
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: { 'usage-source': [], 'limit-check': [ 'cap' ] },
expected: { 'usage-source': [ 'meter' ], 'limit-check': [ 'cap' ] },
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:148:1
✖ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.28395ms)
AssertionError [ERR_ASSERTION]: late: old setting kept
+ actual - expected
{
'limit-check': [
'cap'
],
+ 'usage-source': []
- 'usage-source': [
- 'meter'
- ]
}
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:32:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:162:5)
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: { 'usage-source': [], 'limit-check': [ 'cap' ] },
expected: { 'usage-source': [ 'meter' ], 'limit-check': [ 'cap' ] },
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:177:1
✖ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.739034ms)
AssertionError [ERR_ASSERTION]: syntax: old setting kept
+ actual - expected
{
'limit-check': [
'cap'
],
+ 'usage-source': []
- 'usage-source': [
- 'meter'
- ]
}
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:32:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:180:3)
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: { 'usage-source': [], 'limit-check': [ 'cap' ] },
expected: { 'usage-source': [ 'meter' ], 'limit-check': [ 'cap' ] },
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:185:1
✖ REQ-PLUG-1 a missing export refuses and keeps the old setting (2.101171ms)
AssertionError [ERR_ASSERTION]: no-read: old setting kept
+ actual - expected
{
'limit-check': [
'cap'
],
+ 'usage-source': []
- 'usage-source': [
- 'meter'
- ]
}
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:32:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:188:3)
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: { 'usage-source': [], 'limit-check': [ 'cap' ] },
expected: { 'usage-source': [ 'meter' ], 'limit-check': [ 'cap' ] },
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:200:1
✖ REQ-PLUG-1 a different interface version refuses and keeps the old setting (1.982068ms)
AssertionError [ERR_ASSERTION]: v2: old setting kept
+ actual - expected
{
'limit-check': [
'cap'
],
+ 'usage-source': []
- 'usage-source': [
- 'meter'
- ]
}
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:32:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:203:3)
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: { 'usage-source': [], 'limit-check': [ 'cap' ] },
expected: { 'usage-source': [ 'meter' ], 'limit-check': [ 'cap' ] },
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:208:1
✖ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.686111ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
{
'limit-check': [
'cap'
],
+ 'usage-source': [
+ 'meter'
+ ]
- 'usage-source': []
}
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:215: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: { 'usage-source': [ 'meter' ], 'limit-check': [ 'cap' ] },
expected: { 'usage-source': [], 'limit-check': [ 'cap' ] },
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -0,0 +1,52 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (7.043542ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.372489ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.476426ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.395554ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (1.976977ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (24.395172ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.635883ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.224907ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.865494ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (3.073079ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.226117ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.370889ms)
✖ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (2.407772ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.780775ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.329232ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.031941ms)
ℹ tests 16
ℹ suites 0
ℹ pass 15
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 217.450214
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:208:1
✖ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (2.407772ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
{
'limit-check': [
'cap'
],
+ 'usage-source': [
+ 'meter'
+ ]
- 'usage-source': []
}
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:215: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: { 'usage-source': [ 'meter' ], 'limit-check': [ 'cap' ] },
expected: { 'usage-source': [], 'limit-check': [ 'cap' ] },
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -0,0 +1,395 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (6.842033ms)
✖ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.129802ms)
✖ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (2.640275ms)
✖ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.60109ms)
✖ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.313009ms)
✖ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (23.854699ms)
✖ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.748928ms)
✖ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.591502ms)
✖ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.341508ms)
✖ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.913165ms)
✖ REQ-PLUG-1 a missing export refuses and keeps the old setting (2.333615ms)
✖ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.150218ms)
✖ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.753684ms)
✖ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.257445ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (103.565572ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.097398ms)
ℹ tests 16
ℹ suites 0
ℹ pass 3
ℹ fail 13
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 214.205253
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:64:1
✖ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.129802ms)
AssertionError [ERR_ASSERTION]: Meter: logged once
+ actual - expected
+ []
- [
- {
- code: 'bad-name',
- event: 'plugin-refused',
- kept: [
- 'meter'
- ],
- kind: 'usage-source',
- message: `plugins.usage-source names "Meter", which doesn't match /^[a-z][a-z0-9-]*$/`,
- name: 'Meter'
- }
- ]
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:40:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:67:5)
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: [],
expected: [ { event: 'plugin-refused', kind: 'usage-source', name: 'Meter', code: 'bad-name', message: `plugins.usage-source names "Meter", which doesn't match /^[a-z][a-z0-9-]*$/`, kept: [Array] } ],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:71:1
✖ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (2.640275ms)
AssertionError [ERR_ASSERTION]: absent: logged once
+ actual - expected
+ []
- [
- {
- code: 'missing',
- event: 'plugin-refused',
- kept: [
- 'meter'
- ],
- kind: 'usage-source',
- message: '/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-wv0QkT/packages/plugins/usage-source/absent is missing',
- name: 'absent'
- }
- ]
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:40:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:73:3)
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: [],
expected: [ { event: 'plugin-refused', kind: 'usage-source', name: 'absent', code: 'missing', message: '/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-wv0QkT/packages/plugins/usage-source/absent is missing', kept: [Array] } ],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:80:1
✖ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.60109ms)
AssertionError [ERR_ASSERTION]: linked: logged once
+ actual - expected
+ []
- [
- {
- code: 'symlink',
- event: 'plugin-refused',
- kept: [
- 'meter'
- ],
- kind: 'usage-source',
- message: '/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-15k7Qj/packages/plugins/usage-source/linked is a symlink',
- name: 'linked'
- }
- ]
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:40:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:84:3)
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: [],
expected: [ { event: 'plugin-refused', kind: 'usage-source', name: 'linked', code: 'symlink', message: '/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-15k7Qj/packages/plugins/usage-source/linked is a symlink', kept: [Array] } ],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:91:1
✖ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.313009ms)
AssertionError [ERR_ASSERTION]: meter: logged once
+ actual - expected
+ []
- [
- {
- code: 'symlink',
- event: 'plugin-refused',
- kept: [
- 'meter'
- ],
- kind: 'usage-source',
- message: '/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-cD7JSs/packages/plugins/usage-source is a symlink',
- name: 'meter'
- }
- ]
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:40:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:96:3)
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: [],
expected: [ { event: 'plugin-refused', kind: 'usage-source', name: 'meter', code: 'symlink', message: '/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-cD7JSs/packages/plugins/usage-source is a symlink', kept: [Array] } ],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:99:1
✖ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (23.854699ms)
TypeError: Cannot read properties of undefined (reading 'code')
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:115:30)
at Test.runInAsyncScope (node:async_hooks:226:14)
at Test.run (node:internal/test_runner/test:1402:25)
at Test.processPendingSubtests (node:internal/test_runner/test:974:18)
at Test.postRun (node:internal/test_runner/test:1542:19)
at Test.run (node:internal/test_runner/test:1467:12)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7)
test at packages/plugins/tests/loader.test.mjs:119:1
✖ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.748928ms)
AssertionError [ERR_ASSERTION]: swapped: logged once
+ actual - expected
+ []
- [
- {
- code: 'symlink',
- event: 'plugin-refused',
- kept: [
- 'meter'
- ],
- kind: 'usage-source',
- message: '/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-IVlR6R/packages/plugins/usage-source/swapped/index.mjs resolves to /home/jwoltje/dewey-scratch/tmp/mosaic-plugins-IVlR6R/packages/plugins/usage-source/meter/index.mjs',
- name: 'swapped'
- }
- ]
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:40:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:131:3)
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: [],
expected: [ { event: 'plugin-refused', kind: 'usage-source', name: 'swapped', code: 'symlink', message: '/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-IVlR6R/packages/plugins/usage-source/swapped/index.mjs resolves to /home/jwoltje/dewey-scratch/tmp/mosaic-plugins-IVlR6R/packages/plugins/usage-source/meter/index.mjs', kept: [Array] } ],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:137:1
✖ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.591502ms)
AssertionError [ERR_ASSERTION]: locked: logged once
+ actual - expected
+ []
- [
- {
- code: 'unreadable',
- event: 'plugin-refused',
- kept: [
- 'meter'
- ],
- kind: 'usage-source',
- message: "/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-dCeJM9/packages/plugins/usage-source/locked/index.mjs can't be read (EACCES)",
- name: 'locked'
- }
- ]
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:40:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:142:5)
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: [],
expected: [ { event: 'plugin-refused', kind: 'usage-source', name: 'locked', code: 'unreadable', message: "/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-dCeJM9/packages/plugins/usage-source/locked/index.mjs can't be read (EACCES)", kept: [Array] } ],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:148:1
✖ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.341508ms)
AssertionError [ERR_ASSERTION]: late: logged once
+ actual - expected
+ []
- [
- {
- code: 'unreadable',
- event: 'plugin-refused',
- kept: [
- 'meter'
- ],
- kind: 'usage-source',
- message: "/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-gscnZD/packages/plugins/usage-source/late/index.mjs can't be read (EACCES)",
- name: 'late'
- }
- ]
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:40:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:162:5)
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: [],
expected: [ { event: 'plugin-refused', kind: 'usage-source', name: 'late', code: 'unreadable', message: "/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-gscnZD/packages/plugins/usage-source/late/index.mjs can't be read (EACCES)", kept: [Array] } ],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:177:1
✖ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.913165ms)
AssertionError [ERR_ASSERTION]: syntax: logged once
+ actual - expected
+ []
- [
- {
- code: 'load-failed',
- event: 'plugin-refused',
- kept: [
- 'meter'
- ],
- kind: 'usage-source',
- message: 'usage-source syntax failed to load: Unexpected end of input',
- name: 'syntax'
- }
- ]
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:40:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:180:3)
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: [],
expected: [ { event: 'plugin-refused', kind: 'usage-source', name: 'syntax', code: 'load-failed', message: 'usage-source syntax failed to load: Unexpected end of input', kept: [Array] } ],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:185:1
✖ REQ-PLUG-1 a missing export refuses and keeps the old setting (2.333615ms)
AssertionError [ERR_ASSERTION]: no-read: logged once
+ actual - expected
+ []
- [
- {
- code: 'missing-export',
- event: 'plugin-refused',
- kept: [
- 'meter'
- ],
- kind: 'usage-source',
- message: "usage-source no-read doesn't export readTurn",
- name: 'no-read'
- }
- ]
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:40:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:188:3)
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: [],
expected: [ { event: 'plugin-refused', kind: 'usage-source', name: 'no-read', code: 'missing-export', message: "usage-source no-read doesn't export readTurn", kept: [Array] } ],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:200:1
✖ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.150218ms)
AssertionError [ERR_ASSERTION]: v2: logged once
+ actual - expected
+ []
- [
- {
- code: 'interface-version',
- event: 'plugin-refused',
- kept: [
- 'meter'
- ],
- kind: 'usage-source',
- message: 'usage-source v2 implements interface 2, not 1',
- name: 'v2'
- }
- ]
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:40:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:203:3)
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: [],
expected: [ { event: 'plugin-refused', kind: 'usage-source', name: 'v2', code: 'interface-version', message: 'usage-source v2 implements interface 2, not 1', kept: [Array] } ],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:208:1
✖ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.753684ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
0 !== 1
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:218: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: 0,
expected: 1,
operator: 'strictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:225:1
✖ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.257445ms)
AssertionError [ERR_ASSERTION]: meter: logged once
+ actual - expected
+ []
- [
- {
- code: 'bad-setting',
- event: 'plugin-refused',
- kept: [
- 'meter'
- ],
- kind: 'usage-source',
- message: 'plugins.usage-source must be a list of module names',
- name: 'meter'
- }
- ]
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:40:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:239:3)
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: [],
expected: [ { event: 'plugin-refused', kind: 'usage-source', name: 'meter', code: 'bad-setting', message: 'plugins.usage-source must be a list of module names', kept: [Array] } ],
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -0,0 +1,62 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (6.963343ms)
✖ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (2.817111ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (2.955087ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (3.078424ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.145339ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (25.00902ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.57343ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.213761ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.378731ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (3.178351ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.261548ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.88856ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.760315ms)
✖ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.584976ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.893941ms)
✔ REQ-PLUG-1 the loader needs a log callback (0.887259ms)
ℹ tests 16
ℹ suites 0
ℹ pass 14
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 216.920292
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:64:1
✖ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (2.817111ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
null !== 'Meter'
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:37:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:67: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: 'Meter',
operator: 'strictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:225:1
✖ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.584976ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
null !== 'meter'
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:37:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:240:3)
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: 'meter',
operator: 'strictEqual',
diff: 'simple'
}
@@ -0,0 +1,272 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (7.51982ms)
✖ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.0813ms)
✖ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (2.55638ms)
✖ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.338952ms)
✖ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.402059ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (25.268461ms)
✖ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.744027ms)
✖ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.330058ms)
✖ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.411112ms)
✖ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.370041ms)
✖ REQ-PLUG-1 a missing export refuses and keeps the old setting (2.629143ms)
✖ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.19746ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.684467ms)
✖ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.216029ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (103.245908ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.079293ms)
ℹ tests 16
ℹ suites 0
ℹ pass 5
ℹ fail 11
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 220.180387
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:64:1
✖ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.0813ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ []
- [
- 'meter'
- ]
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:38:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:67: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: [ 'meter' ],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:71:1
✖ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (2.55638ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ []
- [
- 'meter'
- ]
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:38:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:73:3)
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: [ 'meter' ],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:80:1
✖ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.338952ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ []
- [
- 'meter'
- ]
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:38:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:84:3)
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: [ 'meter' ],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:91:1
✖ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.402059ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ []
- [
- 'meter'
- ]
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:38:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:96:3)
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: [ 'meter' ],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:119:1
✖ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.744027ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ []
- [
- 'meter'
- ]
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:38:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:131:3)
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: [ 'meter' ],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:137:1
✖ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.330058ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ []
- [
- 'meter'
- ]
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:38:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:142: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: [ 'meter' ],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:148:1
✖ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.411112ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ []
- [
- 'meter'
- ]
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:38:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:162: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: [ 'meter' ],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:177:1
✖ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.370041ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ []
- [
- 'meter'
- ]
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:38:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:180:3)
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: [ 'meter' ],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:185:1
✖ REQ-PLUG-1 a missing export refuses and keeps the old setting (2.629143ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ []
- [
- 'meter'
- ]
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:38:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:188:3)
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: [ 'meter' ],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:200:1
✖ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.19746ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ []
- [
- 'meter'
- ]
at refusesKeepingOld (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:38:10)
at async TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:203:3)
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: [ 'meter' ],
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:225:1
✖ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.216029ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ []
- {
- 'limit-check': [
- 'cap'
- ],
- 'usage-source': [
- 'meter'
- ]
- }
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:236:12)
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: { 'usage-source': [ 'meter' ], 'limit-check': [ 'cap' ] },
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -0,0 +1,50 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (6.926484ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.396513ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.434101ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.301524ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.051384ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (28.602851ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.657239ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.225707ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.345032ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (3.099719ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.114078ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.309948ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.569355ms)
✖ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (3.129746ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.267948ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.079144ms)
ℹ tests 16
ℹ suites 0
ℹ pass 15
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 216.971027
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:225:1
✖ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (3.129746ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ []
- [
- [
- null,
- 'bad-setting'
- ]
- ]
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:235:12)
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: [ [ null, 'bad-setting' ] ],
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -0,0 +1,50 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (7.730643ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.631769ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.46267ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.488592ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.103026ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (27.013093ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.742227ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.273755ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.537806ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (6.850821ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.385225ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.499063ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.748648ms)
✖ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (3.050346ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.592205ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.270034ms)
ℹ tests 16
ℹ suites 0
ℹ pass 15
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 220.701273
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:225:1
✖ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (3.050346ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ []
- [
- [
- 'made-up',
- 'unknown-kind'
- ]
- ]
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:228:10)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: [],
expected: [ [ 'made-up', 'unknown-kind' ] ],
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -0,0 +1,78 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (6.927501ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.267371ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.150315ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.316604ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (1.936222ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (26.580279ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.608666ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.214372ms)
✖ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (3.555008ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.479883ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.25298ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.332956ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.675593ms)
✖ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (3.1044ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (101.831899ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.008853ms)
ℹ tests 16
ℹ suites 0
ℹ pass 14
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 218.806832
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:148:1
✖ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (3.555008ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
{
+ 'limit-check': [
+ 'cap'
+ ],
- 'limit-check': [],
'usage-source': [
'meter'
]
}
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:171:12)
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: { 'usage-source': [ 'meter' ], 'limit-check': [ 'cap' ] },
expected: { 'usage-source': [ 'meter' ], 'limit-check': [] },
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:225:1
✖ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (3.1044ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
{
'limit-check': [
'cap'
],
+ 'usage-source': [
+ 'meter'
+ ]
- 'usage-source': []
}
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:243: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: { 'usage-source': [ 'meter' ], 'limit-check': [ 'cap' ] },
expected: { 'usage-source': [], 'limit-check': [ 'cap' ] },
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -0,0 +1,47 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (7.546907ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.501287ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.353884ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.445685ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.053794ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (26.10064ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.669696ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.198338ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.333815ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.906748ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.160066ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.329839ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.701929ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.740437ms)
✖ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.628289ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.294596ms)
ℹ tests 16
ℹ suites 0
ℹ pass 15
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 219.466681
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:246:1
✖ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.628289ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
[
+ 'slow'
- 'fast'
]
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:258: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: [ 'slow' ],
expected: [ 'fast' ],
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -0,0 +1,40 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (6.897688ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.383988ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.379074ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.396567ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.076803ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (28.782334ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.81382ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.262741ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.457201ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (3.012166ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.302965ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.409747ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.664634ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.943894ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (103.25211ms)
✖ REQ-PLUG-1 the loader needs a log callback (1.385537ms)
ℹ tests 16
ℹ suites 0
ℹ pass 15
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 219.31302
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:261:1
✖ REQ-PLUG-1 the loader needs a log callback (1.385537ms)
AssertionError [ERR_ASSERTION]: Missing expected exception.
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:264: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: /log callback/,
operator: 'throws',
diff: 'simple'
}
@@ -0,0 +1,75 @@
✖ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (4.465769ms)
✖ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (28.836618ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (26.564737ms)
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.532625ms)
✖ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (3.127149ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.883818ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.019005ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (3.018491ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.116043ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (25.989013ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.585979ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.475614ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.561731ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (3.104094ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.438625ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.456483ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.79077ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.908187ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.692445ms)
✔ REQ-PLUG-1 the loader needs a log callback (0.998745ms)
ℹ tests 20
ℹ suites 0
ℹ pass 17
ℹ fail 3
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 222.828269
✖ failing tests:
test at packages/business/tests/plugin-settings.test.mjs:28:1
✖ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (4.465769ms)
Error [BusinessError]: unsupported business file key: "plugins"
at refuse (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/errors.mjs:12:9)
at rejectUnknownKeys (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/util.mjs:17:33)
at validateBusinessDocument (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/business.mjs:140:3)
at check (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/tests/plugin-settings.test.mjs:30:22)
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/tests/plugin-settings.test.mjs:33:20)
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) {
exitCode: 2
}
test at packages/business/tests/plugin-settings.test.mjs:42:1
✖ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (28.836618ms)
Error [BusinessError]: unsupported business file key: "plugins"
at refuse (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/errors.mjs:12:9)
at rejectUnknownKeys (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/util.mjs:17:33)
at validateBusinessDocument (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/business.mjs:140:3)
at file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/organization.mjs:186:7
at withLock (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/organization.mjs:128:14)
at Object.write (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/organization.mjs:180:12)
at Object.set (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/plugin-settings.mjs:40:28)
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/tests/plugin-settings.test.mjs:46:27)
at Test.runInAsyncScope (node:async_hooks:226:14)
at Test.run (node:internal/test_runner/test:1402:25) {
exitCode: 2
}
test at packages/plugins/tests/loader.test.mjs:44:1
✖ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (3.127149ms)
Error [BusinessError]: unsupported business file key: "plugins"
at refuse (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/errors.mjs:12:9)
at rejectUnknownKeys (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/util.mjs:17:33)
at validateBusinessDocument (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/business.mjs:140:3)
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:53:20)
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) {
exitCode: 2
}
@@ -0,0 +1,46 @@
✖ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (5.538428ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (146.577444ms)
✖ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (54.543955ms)
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.609906ms)
ℹ tests 4
ℹ suites 0
ℹ pass 2
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 257.581172
✖ failing tests:
test at packages/business/tests/plugin-settings.test.mjs:28:1
✖ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (5.538428ms)
AssertionError [ERR_ASSERTION]: Missing expected exception (BusinessError): {"made-up":[]}
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/tests/plugin-settings.test.mjs:38:12)
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,
operator: 'throws',
diff: 'simple'
}
test at packages/business/tests/plugin-settings.test.mjs:67:1
✖ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (54.543955ms)
AssertionError [ERR_ASSERTION]: Missing expected exception (BusinessError).
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/tests/plugin-settings.test.mjs:73: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,80 @@
✖ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (4.729021ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (155.588985ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (27.673956ms)
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.218845ms)
✖ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (7.087706ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.402118ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.173383ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.588572ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.064736ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (25.059742ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.627824ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.255102ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (5.983663ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.746589ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.1955ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.330971ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.760203ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (3.054302ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.686102ms)
✔ REQ-PLUG-1 the loader needs a log callback (0.965666ms)
ℹ tests 20
ℹ suites 0
ℹ pass 18
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 241.184302
✖ failing tests:
test at packages/business/tests/plugin-settings.test.mjs:28:1
✖ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (4.729021ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
undefined !== {}
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/tests/plugin-settings.test.mjs:31:10)
at Test.runInAsyncScope (node:async_hooks:226:14)
at Test.run (node:internal/test_runner/test:1402:25)
at Test.start (node:internal/test_runner/test:1262:17)
at startSubtestAfterBootstrap (node:internal/test_runner/harness:387:17) {
generatedMessage: true,
code: 'ERR_ASSERTION',
actual: undefined,
expected: {},
operator: 'deepStrictEqual',
diff: 'simple'
}
test at packages/plugins/tests/loader.test.mjs:44:1
✖ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (7.087706ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ [
+ {
+ code: 'bad-setting',
+ event: 'plugin-refused',
+ kept: {
+ 'limit-check': [],
+ 'usage-source': []
+ },
+ kind: null,
+ message: 'plugins must be an object with one key per kind',
+ name: null
+ }
+ ]
- []
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:56: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: [ { event: 'plugin-refused', kind: null, name: null, code: 'bad-setting', message: 'plugins must be an object with one key per kind', kept: [Object] } ],
expected: [],
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -0,0 +1,30 @@
✖ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (5.39097ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (138.497838ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (21.81373ms)
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.222557ms)
ℹ tests 4
ℹ suites 0
ℹ pass 3
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 219.705707
✖ failing tests:
test at packages/business/tests/plugin-settings.test.mjs:28:1
✖ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (5.39097ms)
AssertionError [ERR_ASSERTION]: the document itself stays mutable
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/tests/plugin-settings.test.mjs:36: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: false,
expected: true,
operator: '==',
diff: 'simple'
}
@@ -0,0 +1,31 @@
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (7.125693ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (144.63306ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (22.432923ms)
✖ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (53.654616ms)
ℹ tests 4
ℹ suites 0
ℹ pass 3
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 281.646923
✖ failing tests:
test at packages/business/tests/plugin-settings.test.mjs:79:1
✖ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (53.654616ms)
AssertionError [ERR_ASSERTION]: Missing expected exception: {"revision":"c92d69f429fdcba946713866b2c2ac72f13c1ed2bfe5a30832c5b1d71d3981c9","plugins":{},"limits":{}}
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/tests/plugin-settings.test.mjs:100: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,41 @@
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (7.614121ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (146.973865ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (21.603481ms)
✖ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (21.782057ms)
ℹ tests 4
ℹ suites 0
ℹ pass 3
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 248.746308
✖ failing tests:
test at packages/business/tests/plugin-settings.test.mjs:79:1
✖ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (21.782057ms)
AssertionError [ERR_ASSERTION]: {"revision":"nope","plugins":{}}
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/tests/plugin-settings.test.mjs:100: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: organization revision changed; read again
at fail (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/organization.mjs:20:9)
at file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/organization.mjs:185:32
at withLock (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/organization.mjs:128:14)
at Object.write (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/organization.mjs:180:12)
at Object.set (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/plugin-settings.mjs:40:28)
at file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/tests/plugin-settings.test.mjs:100:36
at getActual (node:assert:580:5)
at strict.throws (node:assert:728:24)
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/tests/plugin-settings.test.mjs:100:12)
at Test.runInAsyncScope (node:async_hooks:226:14),
operator: 'throws',
diff: 'simple'
}
@@ -0,0 +1,41 @@
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (7.457769ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (137.801438ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (20.692489ms)
✖ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (22.243252ms)
ℹ tests 4
ℹ suites 0
ℹ pass 3
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 239.967738
✖ failing tests:
test at packages/business/tests/plugin-settings.test.mjs:79:1
✖ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (22.243252ms)
AssertionError [ERR_ASSERTION]: {"revision":"5fd4d63e6518abd78e6b48b484dae3ca54569fd78a5b2f24f10bdd9ca881045f","plugins":{"made-up":["x"]}}
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/tests/plugin-settings.test.mjs:100: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: BusinessError: /home/jwoltje/dewey-scratch/tmp/mosaic-business-HNo5TU/businesses/acme.json plugins names unknown kind "made-up"; adding a kind is a core change
at refuse (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/errors.mjs:12:9)
at fail (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/business.mjs:185:101)
at checkPlugins (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/src/kinds.mjs:61:7)
at validateBusinessDocument (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/business.mjs:185:23)
at file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/organization.mjs:186:7
at withLock (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/organization.mjs:128:14)
at Object.write (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/organization.mjs:180:12)
at Object.set (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/plugin-settings.mjs:39:28)
at file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/tests/plugin-settings.test.mjs:100:36
at getActual (node:assert:580:5),
operator: 'throws',
diff: 'simple'
}
@@ -0,0 +1,35 @@
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (7.291864ms)
✖ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (51.051563ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (21.884761ms)
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.369764ms)
ℹ tests 4
ℹ suites 0
ℹ pass 3
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 132.691518
✖ failing tests:
test at packages/business/tests/plugin-settings.test.mjs:42:1
✖ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (51.051563ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly equal:
'host' !== 'jason'
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/tests/plugin-settings.test.mjs:52: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: 'host',
expected: 'jason',
operator: 'strictEqual',
diff: 'simple'
}
@@ -0,0 +1,41 @@
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (7.118862ms)
✖ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (53.184345ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (22.597414ms)
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.391426ms)
ℹ tests 4
ℹ suites 0
ℹ pass 3
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 135.23389
✖ failing tests:
test at packages/business/tests/plugin-settings.test.mjs:42:1
✖ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (53.184345ms)
AssertionError [ERR_ASSERTION]: Expected values to be strictly deep-equal:
+ actual - expected
+ undefined
- {
- 'usage-source': [
- 'meter'
- ]
- }
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/tests/plugin-settings.test.mjs:47: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: undefined,
expected: { 'usage-source': [ 'meter' ] },
operator: 'deepStrictEqual',
diff: 'simple'
}
@@ -0,0 +1,72 @@
✖ shared copy: npm ci, pushed reachability, readonly/existing copy, webui delegation (324.992135ms)
✔ wrapper preserves Q81 lease and marker, rejects foreign/symlink; check uses effective roots (372.160908ms)
✔ bus unit copy/pm pins, install refuses all busy states and failed reads, drop-in refusal (371.036254ms)
✔ missing package manifest refuses before npm; npm failure removes the unpublished temp copy (235.36278ms)
✖ real pinned install loads bus and Console; same-copy mosaic talk passes proof, other trees refuse (2311.883849ms)
✔ bus status reads effective copy/pm/drop-ins without writes; check refuses an overridden ExecStart (431.388093ms)
✔ drop-ins in either override field and malformed metadata refuse; uninstall also checks --no-reload (146.450925ms)
✔ install never shows a template name on systemd 261; template drop-ins still refuse (149.546642ms)
✔ unlisted instance drop-in is found in another unit lookup directory; path discovery errors refuse (133.921526ms)
✔ inherited mosaic-.service.d override refuses without changing the unit (206.342229ms)
✔ inherited service.d override refuses without changing the unit (171.242039ms)
✔ inherited drop-in unreadable directory or file refuses before writing (137.891427ms)
ℹ tests 12
ℹ suites 0
ℹ pass 10
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 5044.167849
✖ failing tests:
test at packages/cli/tests/stack-copy.test.mjs:34:1
✖ shared copy: npm ci, pushed reachability, readonly/existing copy, webui delegation (324.992135ms)
AssertionError [ERR_ASSERTION]: packages/plugins/src/kinds.mjs
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/cli/tests/stack-copy.test.mjs:37:234)
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: false,
expected: true,
operator: '==',
diff: 'simple'
}
test at packages/cli/tests/stack-copy.test.mjs:101:1
✖ real pinned install loads bus and Console; same-copy mosaic talk passes proof, other trees refuse (2311.883849ms)
AssertionError [ERR_ASSERTION]: node:internal/modules/esm/resolve:272
throw new ERR_MODULE_NOT_FOUND(
^
Error [ERR_MODULE_NOT_FOUND]: Cannot find module '/home/jwoltje/dewey-scratch/tmp/stack-copy-hwQIII/copies/35a4a0e34cbed9f4a37230c657f21dd946592216/packages/plugins/src/kinds.mjs' imported from /home/jwoltje/dewey-scratch/tmp/stack-copy-hwQIII/copies/35a4a0e34cbed9f4a37230c657f21dd946592216/packages/business/src/business.mjs
at finalizeResolution (node:internal/modules/esm/resolve:272:11)
at moduleResolve (node:internal/modules/esm/resolve:879:10)
at defaultResolve (node:internal/modules/esm/resolve:1006:11)
at #cachedDefaultResolve (node:internal/modules/esm/loader:708:20)
at #resolveAndMaybeBlockOnLoaderThread (node:internal/modules/esm/loader:728:38)
at ModuleLoader.resolveSync (node:internal/modules/esm/loader:766:56)
at #resolve (node:internal/modules/esm/loader:690:17)
at ModuleLoader.getOrCreateModuleJob (node:internal/modules/esm/loader:610:35)
at ModuleJob.syncLink (node:internal/modules/esm/module_job:277:33)
at ModuleJob.link (node:internal/modules/esm/module_job:389:17) {
code: 'ERR_MODULE_NOT_FOUND',
url: 'file:///home/jwoltje/dewey-scratch/tmp/stack-copy-hwQIII/copies/35a4a0e34cbed9f4a37230c657f21dd946592216/packages/plugins/src/kinds.mjs'
}
Node.js v26.8.1
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/cli/tests/stack-copy.test.mjs:111:84)
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: '',
expected: /bus host up/,
operator: 'match',
diff: 'simple'
}
@@ -0,0 +1,46 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (7.31411ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.348189ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.399955ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.452214ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.089915ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (24.500299ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.948601ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.265925ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.415219ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (3.072596ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.250837ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.30204ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.656149ms)
✖ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.644936ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.468755ms)
✔ REQ-PLUG-1 the loader needs a log callback (0.985858ms)
ℹ tests 16
ℹ suites 0
ℹ pass 15
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 217.591238
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:225:1
✖ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.644936ms)
AssertionError [ERR_ASSERTION]: made-up
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:231:12)
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: TypeError: Cannot read properties of undefined (reading 'map')
at Object.modules (file:///home/jwoltje/dewey-scratch/tmp/mosaic-plugins-IkfeMo/packages/plugins/src/loader.mjs:140:29)
at file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:231:34
at getActual (node:assert:580:5)
at strict.throws (node:assert:728:24)
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/tests/loader.test.mjs:231:12)
at async Test.run (node:internal/test_runner/test:1409:7)
at async Test.processPendingSubtests (node:internal/test_runner/test:974:7),
operator: 'throws',
diff: 'simple'
}
@@ -0,0 +1,55 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (6.740768ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.204354ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.141352ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.221148ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.016407ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (25.460671ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.664667ms)
✖ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.049547ms)
✖ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.053628ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (2.998748ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.228874ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.26028ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.786148ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.721669ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.995966ms)
✔ REQ-PLUG-1 the loader needs a log callback (0.950643ms)
ℹ tests 16
ℹ suites 0
ℹ pass 14
ℹ fail 2
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 215.389337
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:137:1
✖ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.049547ms)
Error: EACCES: permission denied, lstat '/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-6K3yuS/packages/plugins/usage-source/locked/index.mjs'
at lstatSync (node:fs:2138:25)
at fsCall (file:///home/jwoltje/dewey-scratch/tmp/mosaic-plugins-6K3yuS/packages/plugins/src/loader.mjs:25:12)
at component (file:///home/jwoltje/dewey-scratch/tmp/mosaic-plugins-6K3yuS/packages/plugins/src/loader.mjs:34:14)
at loadModule (file:///home/jwoltje/dewey-scratch/tmp/mosaic-plugins-6K3yuS/packages/plugins/src/loader.mjs:48:3)
at apply (file:///home/jwoltje/dewey-scratch/tmp/mosaic-plugins-6K3yuS/packages/plugins/src/loader.mjs:115:27)
at file:///home/jwoltje/dewey-scratch/tmp/mosaic-plugins-6K3yuS/packages/plugins/src/loader.mjs:129:34 {
errno: -13,
code: 'EACCES',
syscall: 'lstat',
path: '/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-6K3yuS/packages/plugins/usage-source/locked/index.mjs'
}
test at packages/plugins/tests/loader.test.mjs:148:1
✖ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.053628ms)
Error: EACCES: permission denied, lstat '/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-pKFMVj/packages/plugins/usage-source/late/index.mjs'
at realpathSync (node:fs:3413:29)
at fsCall (file:///home/jwoltje/dewey-scratch/tmp/mosaic-plugins-pKFMVj/packages/plugins/src/loader.mjs:25:12)
at loadModule (file:///home/jwoltje/dewey-scratch/tmp/mosaic-plugins-pKFMVj/packages/plugins/src/loader.mjs:53:16)
at apply (file:///home/jwoltje/dewey-scratch/tmp/mosaic-plugins-pKFMVj/packages/plugins/src/loader.mjs:115:27)
at file:///home/jwoltje/dewey-scratch/tmp/mosaic-plugins-pKFMVj/packages/plugins/src/loader.mjs:129:34 {
errno: -13,
code: 'EACCES',
syscall: 'lstat',
path: '/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-pKFMVj/packages/plugins/usage-source/late/index.mjs'
}
@@ -0,0 +1,39 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (7.407042ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.411779ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.268134ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.385117ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.048584ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (26.554973ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.672433ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.220027ms)
✖ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.164062ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (3.050272ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.210196ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.34134ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.66475ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.920591ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.560658ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.013584ms)
ℹ tests 16
ℹ suites 0
ℹ pass 15
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 216.58391
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:148:1
✖ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.164062ms)
Error: EACCES: permission denied, lstat '/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-pz2f6V/packages/plugins/usage-source/late/index.mjs'
at realpathSync (node:fs:3413:29)
at loadModule (file:///home/jwoltje/dewey-scratch/tmp/mosaic-plugins-pz2f6V/packages/plugins/src/loader.mjs:53:16)
at apply (file:///home/jwoltje/dewey-scratch/tmp/mosaic-plugins-pz2f6V/packages/plugins/src/loader.mjs:115:27)
at file:///home/jwoltje/dewey-scratch/tmp/mosaic-plugins-pz2f6V/packages/plugins/src/loader.mjs:129:34 {
errno: -13,
code: 'EACCES',
syscall: 'lstat',
path: '/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-pz2f6V/packages/plugins/usage-source/late/index.mjs'
}
@@ -0,0 +1,39 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (7.479358ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.446636ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.349896ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.366184ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.078721ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (25.810553ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.682094ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.269305ms)
✖ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.390598ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (3.047475ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.18947ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.373778ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.638337ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.927854ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.635309ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.107292ms)
ℹ tests 16
ℹ suites 0
ℹ pass 15
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 222.353049
✖ failing tests:
test at packages/plugins/tests/loader.test.mjs:148:1
✖ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.390598ms)
Error: EACCES: permission denied, lstat '/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-oPdUL1/packages/plugins'
at realpathSync (node:fs:3413:29)
at loadModule (file:///home/jwoltje/dewey-scratch/tmp/mosaic-plugins-oPdUL1/packages/plugins/src/loader.mjs:52:25)
at apply (file:///home/jwoltje/dewey-scratch/tmp/mosaic-plugins-oPdUL1/packages/plugins/src/loader.mjs:115:27)
at file:///home/jwoltje/dewey-scratch/tmp/mosaic-plugins-oPdUL1/packages/plugins/src/loader.mjs:129:34 {
errno: -13,
code: 'EACCES',
syscall: 'lstat',
path: '/home/jwoltje/dewey-scratch/tmp/mosaic-plugins-oPdUL1/packages/plugins'
}
@@ -0,0 +1,41 @@
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (7.645106ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (140.306431ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (21.675393ms)
✖ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (22.460189ms)
ℹ tests 4
ℹ suites 0
ℹ pass 3
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 240.189161
✖ failing tests:
test at packages/business/tests/plugin-settings.test.mjs:79:1
✖ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (22.460189ms)
AssertionError [ERR_ASSERTION]: {"revision":"6ccae343a4ae83a63855287a6fa5c35b7178678e8a7b90a8b003b0154077dd29","plugins":"1970-01-01T00:00:00.000Z"}
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/tests/plugin-settings.test.mjs:100: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: BusinessError: /home/jwoltje/dewey-scratch/tmp/mosaic-business-le2558/businesses/acme.json plugins must be an object with one key per kind
at refuse (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/errors.mjs:12:9)
at fail (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/business.mjs:185:101)
at checkPlugins (file:///home/jwoltje/dewey-scratch/r131/wt/packages/plugins/src/kinds.mjs:57:5)
at validateBusinessDocument (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/business.mjs:185:23)
at file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/organization.mjs:192:7
at withLock (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/organization.mjs:128:14)
at Object.write (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/organization.mjs:180:12)
at Object.set (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/src/plugin-settings.mjs:40:28)
at file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/tests/plugin-settings.test.mjs:100:36
at getActual (node:assert:580:5),
operator: 'throws',
diff: 'simple'
}
@@ -0,0 +1,31 @@
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (7.081237ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (138.849864ms)
✖ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (47.762831ms)
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.412805ms)
ℹ tests 4
ℹ suites 0
ℹ pass 3
ℹ fail 1
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 244.944358
✖ failing tests:
test at packages/business/tests/plugin-settings.test.mjs:67:1
✖ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (47.762831ms)
AssertionError [ERR_ASSERTION]: Missing expected exception (BusinessError).
at TestContext.<anonymous> (file:///home/jwoltje/dewey-scratch/r131/wt/packages/business/tests/plugin-settings.test.mjs:73: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,29 @@
✔ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source and limit-check at interface version 1, each a list (1.008025ms)
✔ REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included (0.226377ms)
✔ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (3.990673ms)
✔ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.158845ms)
✔ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.142748ms)
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (7.379363ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.568839ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.442899ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.450706ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.16396ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (28.188593ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (3.134283ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.440868ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.577226ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (3.222799ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (4.074162ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (3.897482ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (3.001734ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (5.579641ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (103.923658ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.123043ms)
ℹ tests 21
ℹ suites 0
ℹ pass 21
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 231.366359
@@ -0,0 +1,13 @@
✔ REQ-PLUG-1 REQ-LIMIT-4 the registry: usage-source and limit-check at interface version 1, each a list (1.035252ms)
✔ REQ-PLUG-1 checkPlugins accepts one key per kind, each a list of names, empty included (0.227758ms)
✔ REQ-PLUG-1 checkPlugins refuses bad shapes, unknown kinds, bad names and duplicates (0.926372ms)
✔ REQ-PLUG-1 a kind that switches on one module takes one name, not a list (0.140232ms)
✔ REQ-PLUG-1 checkPlugins reports through the caller's fail callback (0.131313ms)
ℹ tests 5
ℹ suites 0
ℹ pass 5
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 45.08752
@@ -0,0 +1,24 @@
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (8.366469ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.946059ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (4.009525ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.734755ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.346544ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (24.377766ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (3.231571ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.368765ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.380085ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (3.059489ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.196286ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.347574ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.652547ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (2.949262ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.166869ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.039357ms)
ℹ tests 16
ℹ suites 0
ℹ pass 16
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 224.359777
@@ -0,0 +1,28 @@
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (7.357566ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (146.435083ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (21.421444ms)
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.485988ms)
✔ REQ-PLUG-1 fixture modules of each kind switch on from a test organization file, no core file changed (7.287625ms)
✔ REQ-PLUG-1 a name not matching ^[a-z][a-z0-9-]*$ refuses and keeps the old setting (3.431513ms)
✔ REQ-PLUG-1 a missing module directory or index.mjs refuses and keeps the old setting (3.344207ms)
✔ REQ-PLUG-1 a symlinked module directory or index.mjs refuses and keeps the old setting (2.435744ms)
✔ REQ-PLUG-1 a symlinked kind directory refuses and keeps the old setting (2.067032ms)
✔ REQ-PLUG-1 a symlinked packages/plugins refuses (run with --preserve-symlinks so the path keeps it) (28.055842ms)
✔ REQ-PLUG-1 index.mjs swapped for a symlink after the lstat checks refuses at the realpath check (2.82659ms)
✔ REQ-PLUG-1 a path that can't be read refuses as unreadable, is logged and keeps the old setting (2.222447ms)
✔ REQ-PLUG-1 a path that becomes unreadable after the lstat checks refuses at either realpath (2.498076ms)
✔ REQ-PLUG-1 a module that fails to load refuses and keeps the old setting (6.073698ms)
✔ REQ-PLUG-1 a missing export refuses and keeps the old setting (3.30088ms)
✔ REQ-PLUG-1 a different interface version refuses and keeps the old setting (2.529776ms)
✔ REQ-PLUG-1 a kind refused on its first load has nothing switched on, and the log names kind and name (1.758871ms)
✔ REQ-PLUG-1 the setting's shape: unknown kinds refuse alone, a bad whole setting keeps everything (3.184964ms)
✔ REQ-PLUG-1 loads run one at a time, so the last requested setting wins (102.858976ms)
✔ REQ-PLUG-1 the loader needs a log callback (1.075237ms)
ℹ tests 20
ℹ suites 0
ℹ pass 20
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 228.619663
@@ -0,0 +1,12 @@
✔ REQ-PLUG-1 schema: plugins is optional, names known kinds and checked module names (7.602567ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the setter writes plugins through the organization writer and logs old and new names (135.320559ms)
✔ REQ-PLUG-1 REQ-ROLE-3 the writer checks the bytes it writes: a Date in plugins is refused there too (21.043279ms)
✔ REQ-PLUG-1 REQ-ROLE-3 a refused setter write throws a code, changes nothing and logs nothing (1.284299ms)
ℹ tests 4
ℹ suites 0
ℹ pass 4
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 217.646591
@@ -0,0 +1,20 @@
✔ shared copy: npm ci, pushed reachability, readonly/existing copy, webui delegation (343.359729ms)
✔ wrapper preserves Q81 lease and marker, rejects foreign/symlink; check uses effective roots (365.864337ms)
✔ bus unit copy/pm pins, install refuses all busy states and failed reads, drop-in refusal (372.544525ms)
✔ missing package manifest refuses before npm; npm failure removes the unpublished temp copy (247.913029ms)
✔ real pinned install loads bus and Console; same-copy mosaic talk passes proof, other trees refuse (3069.833138ms)
✔ bus status reads effective copy/pm/drop-ins without writes; check refuses an overridden ExecStart (427.677812ms)
✔ drop-ins in either override field and malformed metadata refuse; uninstall also checks --no-reload (148.223334ms)
✔ install never shows a template name on systemd 261; template drop-ins still refuse (152.264027ms)
✔ unlisted instance drop-in is found in another unit lookup directory; path discovery errors refuse (136.961363ms)
✔ inherited mosaic-.service.d override refuses without changing the unit (155.641078ms)
✔ inherited service.d override refuses without changing the unit (158.432943ms)
✔ inherited drop-in unreadable directory or file refuses before writing (138.363241ms)
ℹ tests 12
ℹ suites 0
ℹ pass 12
ℹ fail 0
ℹ cancelled 0
ℹ skipped 0
ℹ todo 0
ℹ duration_ms 5775.197495
@@ -0,0 +1,46 @@
[
{
"id": "control-01",
"test": [
"packages/plugins/tests/kinds.test.mjs",
"packages/plugins/tests/loader.test.mjs"
],
"exit": 0
},
{
"id": "control-02",
"test": [
"packages/plugins/tests/kinds.test.mjs"
],
"exit": 0
},
{
"id": "control-03",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"exit": 0
},
{
"id": "control-04",
"test": [
"packages/business/tests/plugin-settings.test.mjs",
"packages/plugins/tests/loader.test.mjs"
],
"exit": 0
},
{
"id": "control-05",
"test": [
"packages/business/tests/plugin-settings.test.mjs"
],
"exit": 0
},
{
"id": "control-06",
"test": [
"packages/cli/tests/stack-copy.test.mjs"
],
"exit": 0
}
]
@@ -0,0 +1,479 @@
[
{
"id": "01-name-pattern",
"path": "packages/plugins/src/kinds.mjs",
"test": [
"packages/plugins/tests/kinds.test.mjs",
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "02-list-cardinality",
"path": "packages/plugins/src/kinds.mjs",
"test": [
"packages/plugins/tests/kinds.test.mjs",
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "03-one-cardinality",
"path": "packages/plugins/src/kinds.mjs",
"test": [
"packages/plugins/tests/kinds.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "04-no-duplicates",
"path": "packages/plugins/src/kinds.mjs",
"test": [
"packages/plugins/tests/kinds.test.mjs",
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "05-known-kind",
"path": "packages/plugins/src/kinds.mjs",
"test": [
"packages/plugins/tests/kinds.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "06-plugins-object",
"path": "packages/plugins/src/kinds.mjs",
"test": [
"packages/plugins/tests/kinds.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "07-registry-exports",
"path": "packages/plugins/src/kinds.mjs",
"test": [
"packages/plugins/tests/kinds.test.mjs",
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "08-registry-version",
"path": "packages/plugins/src/kinds.mjs",
"test": [
"packages/plugins/tests/kinds.test.mjs",
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "09-missing-directory",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "10-component-type",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "11-symlink-test",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "12-plugins-dir-checked",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "13-kind-dir-checked",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "14-name-dir-checked",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "15-index-checked",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "16-realpath-before-import",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "17-load-failure",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "18-export-present",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "19-export-function",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "20-interface-version",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "21-version-strict",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "22-keep-old-setting",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "23-first-load-nothing-on",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "24-refusal-logged",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "25-log-names-module",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "26-log-kept",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "27-whole-setting-object",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "28-unknown-kind-logged",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "29-absent-key-off",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "30-loads-serialized",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "31-log-required",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "42-modules-known-kind",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "43-unreadable-refused",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "44-realpath-index-mapped",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "45-realpath-root-mapped",
"path": "packages/plugins/src/loader.mjs",
"test": [
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "32-schema-key",
"path": "packages/business/src/business.mjs",
"test": [
"packages/business/tests/plugin-settings.test.mjs",
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "33-schema-check",
"path": "packages/business/src/business.mjs",
"test": [
"packages/business/tests/plugin-settings.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "34-schema-returned",
"path": "packages/business/src/business.mjs",
"test": [
"packages/business/tests/plugin-settings.test.mjs",
"packages/plugins/tests/loader.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "35-schema-copy",
"path": "packages/business/src/business.mjs",
"test": [
"packages/business/tests/plugin-settings.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "36-setter-strict-keys",
"path": "packages/business/src/plugin-settings.mjs",
"test": [
"packages/business/tests/plugin-settings.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "37-setter-revision-format",
"path": "packages/business/src/plugin-settings.mjs",
"test": [
"packages/business/tests/plugin-settings.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "38-setter-checks-names",
"path": "packages/business/src/plugin-settings.mjs",
"test": [
"packages/business/tests/plugin-settings.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "39-setter-actor-logged",
"path": "packages/business/src/plugin-settings.mjs",
"test": [
"packages/business/tests/plugin-settings.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "40-setter-writes-plugins",
"path": "packages/business/src/plugin-settings.mjs",
"test": [
"packages/business/tests/plugin-settings.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "46-setter-plain-prototype",
"path": "packages/business/src/plugin-settings.mjs",
"test": [
"packages/business/tests/plugin-settings.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "47-writer-checks-bytes",
"path": "packages/business/src/organization.mjs",
"test": [
"packages/business/tests/plugin-settings.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
},
{
"id": "41-copy-ships-plugins",
"path": "scripts/stack-copy.sh",
"test": [
"packages/cli/tests/stack-copy.test.mjs"
],
"result": "KILLED",
"exit": 1,
"sites": 1
}
]
@@ -0,0 +1,69 @@
5c554cde903192487a162c63aa9f8aba4d108eaf4aedf8a5c886e3ade0412bb0 agents/dewey/work/queue-131/r2/BUILD.md
f9fbd2aa3f3502bddb2e94bcb9b5a1578772fbc38eec4b9a528a50ba3a93e6fd agents/dewey/work/queue-131/r2/MUTANTS.md
c3ef59884b9a37046393fa1b275acc9d0d5246a91b68ea984b8f1151d72bb67e agents/dewey/work/queue-131/r2/base.txt
10bdaadf6330f63dc880383df797b7043b8f196d1198781d7d4cd95443b81da7 agents/dewey/work/queue-131/r2/build.patch
466c835f7dce79d20c7ab74c197a52b70e7fdeb0efae0456222dc6d0a633f219 agents/dewey/work/queue-131/r2/candidate-manifest.sha256
d92f19d1bd17cd86b3697ff15c3e7b38c9fa06fc8030238c13ace153abe73aac agents/dewey/work/queue-131/r2/gate-run.log
f99b66b68e929005f7e086fad971bc1a40d74691615dd60d14d238407da26606 agents/dewey/work/queue-131/r2/gate.sh
b01aa4baa71ba322957a342c5e91251575626cca6acaa986505c0413a1d7b7c7 agents/dewey/work/queue-131/r2/gate/pkg-bus.log
2fa63f6f3ff27d2ccbf7a510b5f7bf30e628278dc02e49f48c21f38fc1840f74 agents/dewey/work/queue-131/r2/gate/pkg-business.log
4dcc649492414358ba24515bae655af6c36b45ba02ce68183bcbeac98a680aab agents/dewey/work/queue-131/r2/gate/pkg-cli.log
cc1f31d5b89594d9e5953bbe389e44373d117277120f94ac34b8c97c7ec0dabc agents/dewey/work/queue-131/r2/gate/pkg-plugins.log
c2ca8286412460212e338a96daf7d6329a83a9ae40d2fd9fa5d0b87b0ed3382e agents/dewey/work/queue-131/r2/gate/pkg-webui.log
46932df88ea3fc3b028a5e7b5ff48ae6479d43a0b892f086723708b228968a0d agents/dewey/work/queue-131/r2/mutants-run.log
17c6cef193989f94e06be202cdc95ca7b4a14b726eeb29a52e97a9677d1ae202 agents/dewey/work/queue-131/r2/mutants.py
db528971879169e4e03614ff4861d38f64da3704c1bf5384e6298d933073fe2d agents/dewey/work/queue-131/r2/mutants/01-name-pattern.log
530a422b54921af5d8516c4d24b5b6fc2b5efe5d6f453348a4f6c88719a67a8d agents/dewey/work/queue-131/r2/mutants/02-list-cardinality.log
db499885ca4c5b445b700c8fb503a84bb620ab9c6cb246f1a9db3beead930925 agents/dewey/work/queue-131/r2/mutants/03-one-cardinality.log
a8eb5db78e218cba7657aa4339f604210388c05001357f41c26ff3bf91ea0491 agents/dewey/work/queue-131/r2/mutants/04-no-duplicates.log
310e424b6d36f6680d6fbd0388c94ebcfc29b4344a51b7619edaa7edfe5841ac agents/dewey/work/queue-131/r2/mutants/05-known-kind.log
981fbe5536e9a1ea59d0c90be920b218f16a133048e35ab83a33ac5f16fc2c4c agents/dewey/work/queue-131/r2/mutants/06-plugins-object.log
d7564865514125e6a761b431dcf37c821a1a7a7c894750f2460df59c5c4529af agents/dewey/work/queue-131/r2/mutants/07-registry-exports.log
a25d6c8a6635b59d334805d9b05d848f9c89a0dc4783940509ee80bbf8682583 agents/dewey/work/queue-131/r2/mutants/08-registry-version.log
26459614d77e40ebf79f28a60b4a1fdb6eea18106a31dadadae0247744428bb3 agents/dewey/work/queue-131/r2/mutants/09-missing-directory.log
486accaf426db57051aadf602c5d1525702291e55254993e7be6447128053d66 agents/dewey/work/queue-131/r2/mutants/10-component-type.log
bcf56f74deb78e17ab60e4af29f1624957df0ef79229057863bb6fe9a6934a6d agents/dewey/work/queue-131/r2/mutants/11-symlink-test.log
470153fc34b60ebffeb40c7fcdb57680675306d75a1f108de93ad761cb822def agents/dewey/work/queue-131/r2/mutants/12-plugins-dir-checked.log
924ce50de17a30ecdd77591ea52975dc6390352e8426b4fc2b52f395e874b0f5 agents/dewey/work/queue-131/r2/mutants/13-kind-dir-checked.log
0164fd670f6d79006b44f691cb87b05a7886d1f310dbca0f99871d77cff99129 agents/dewey/work/queue-131/r2/mutants/14-name-dir-checked.log
8af5f488381a1df1dc7b2a8f8bd2555a6322a3fc897b5318a4d2d5dc6049e53f agents/dewey/work/queue-131/r2/mutants/15-index-checked.log
d4778bd2d7762ba4c8fbad75725e3e9a98041e78f27ac82b10eae113b5ec229c agents/dewey/work/queue-131/r2/mutants/16-realpath-before-import.log
0b0d97658786f81f1d76c62c5a3751c448619bcedff17676d283d2f40d6ae814 agents/dewey/work/queue-131/r2/mutants/17-load-failure.log
4b31923d9c592fd5b07831521380c10eefff693113be3f5c56600d9fe2c1a08d agents/dewey/work/queue-131/r2/mutants/18-export-present.log
e082e12d2ffd374451511544498fa6571815f24bde4945d4d489fa25f2238e0e agents/dewey/work/queue-131/r2/mutants/19-export-function.log
44f7e1a36dccd4f755a1678979abfbfea472a688fc6123a50a296e0e730b3620 agents/dewey/work/queue-131/r2/mutants/20-interface-version.log
45f2cb6e48e3ada4f7db48c29e1ee2d262ffb4a73173d7cf0700811503a88787 agents/dewey/work/queue-131/r2/mutants/21-version-strict.log
5d7ec09fcf871d337233b7ed3b4da078ba94b3bc9e740ae7f6955c92932d3f03 agents/dewey/work/queue-131/r2/mutants/22-keep-old-setting.log
ee8915b29cda2ebaad28fde567c4d4143669cbb28f26ecf85b2c80348b01678b agents/dewey/work/queue-131/r2/mutants/23-first-load-nothing-on.log
e81deb01822e81771a1b5852db22fed30166de2dd380646aeb1331462a9b65eb agents/dewey/work/queue-131/r2/mutants/24-refusal-logged.log
7c121b8ee17c4da727f2306dc2309ee097bc36ff99598851dcbd6b174937155f agents/dewey/work/queue-131/r2/mutants/25-log-names-module.log
9520ab1d987a63ae7f1acb529204385254394d4f6e6e805eaa7b8a42e409a760 agents/dewey/work/queue-131/r2/mutants/26-log-kept.log
22fe663d05cb24c6633408e45e4a10d23db52b4429e9f7f919712236dcc2eb4f agents/dewey/work/queue-131/r2/mutants/27-whole-setting-object.log
245dbed6172bb7a8f361dd02dc22adeaea5b43fc61648597d1a20717d4a2366e agents/dewey/work/queue-131/r2/mutants/28-unknown-kind-logged.log
0e173661d5f466f23da5985adfc6b83225f7c176e6359fbb5b5551470edd2eb4 agents/dewey/work/queue-131/r2/mutants/29-absent-key-off.log
c58ec6585229b9f88de2348f8f8116259a7eb53c83f7b46b3b7eb2671bb481fe agents/dewey/work/queue-131/r2/mutants/30-loads-serialized.log
8987bbc2457f1d09e1bf92c98e4a17807db3d81ca8cded3a83758b3dbbb77713 agents/dewey/work/queue-131/r2/mutants/31-log-required.log
2a7817e08656ca45b5bb27438766c4ea35179e7f4ed8abd1364ff5b1a024a869 agents/dewey/work/queue-131/r2/mutants/32-schema-key.log
00699a515cb7defa266cfd749fe45a3b7164a67dd0e51ab027d08b220f6b296d agents/dewey/work/queue-131/r2/mutants/33-schema-check.log
4f78be795718cd943e9acd78abc34bc791ea18958bd8fa28cc1cd4ecf2958665 agents/dewey/work/queue-131/r2/mutants/34-schema-returned.log
9d87114a65e66e77e5756e3ee43677f893d57cbe7f1d4480b342b5184f71d752 agents/dewey/work/queue-131/r2/mutants/35-schema-copy.log
fdab1977a3ddd12ff97ea7967fe049a6a9e5667b447f8ff166f4a4a447820d2b agents/dewey/work/queue-131/r2/mutants/36-setter-strict-keys.log
1a1156ff59777e8d043ad117593a535662c3d1e1f06febc6a8039297c4c1c85b agents/dewey/work/queue-131/r2/mutants/37-setter-revision-format.log
cc7a225d60625ba7f818d9413411f81cb6179a5ed5ed356f993ebd5eb2bbec53 agents/dewey/work/queue-131/r2/mutants/38-setter-checks-names.log
392dcfd725d75b030e5a39e3c83e63f3b134dc41b80635c3804798c546bfaa72 agents/dewey/work/queue-131/r2/mutants/39-setter-actor-logged.log
8aa0b1365efc431de8f0a3a3d214dd95bcde9b1aab84e7686aafcb7cdfa58c70 agents/dewey/work/queue-131/r2/mutants/40-setter-writes-plugins.log
a21a6f4bd14e5f5e6dfa546cb9ae4f802d54af8fcd395ebc0be0e958bd58f6e5 agents/dewey/work/queue-131/r2/mutants/41-copy-ships-plugins.log
65f073cec2538490b70aa21923a0bde5e2d543510b04c82d3ba6475af8ad960d agents/dewey/work/queue-131/r2/mutants/42-modules-known-kind.log
ad9ac553b5174d333ebce85c435c5a44421a3bf33d2bbd0e2c9635b54dc74e4f agents/dewey/work/queue-131/r2/mutants/43-unreadable-refused.log
cacf93a6a147689a68ebe0810921ed4ce6cb876c5f70c1503679c72cb667ffe2 agents/dewey/work/queue-131/r2/mutants/44-realpath-index-mapped.log
97077ec85d7054a6bd3c747ccdf7be1d89ea8b6cd4d35076bdc3b40bc4269882 agents/dewey/work/queue-131/r2/mutants/45-realpath-root-mapped.log
0a0fc78b7aaf619d9d37c41f97e984e82d5e459a3a1ebe6576566f1336d48373 agents/dewey/work/queue-131/r2/mutants/46-setter-plain-prototype.log
d0cf6f97df6c6ec832f329c64b6ffc855019d0a19fc6e05bab9a0f2b2d2cdd80 agents/dewey/work/queue-131/r2/mutants/47-writer-checks-bytes.log
2be23a1f7dd19baf5544cce068eaa065055f6448f1d170556eea792be892c451 agents/dewey/work/queue-131/r2/mutants/control-01.log
f76a19a96b432002d4b935a825aa634ebec3ae27272120bdb8303e7fbda7d81a agents/dewey/work/queue-131/r2/mutants/control-02.log
79e00e29840c077002388ff00bcc9e6ce8288b02227172682fdd61cbd9aa03e3 agents/dewey/work/queue-131/r2/mutants/control-03.log
618af49f3bad261032f23164e3e6f8a3e6a29f4ecc5b2ede80617228a4227bfb agents/dewey/work/queue-131/r2/mutants/control-04.log
a4ef5440d5afdf88182bacc155e7f53d9b0ee75c55b740f33a6e5f9f640a0cdf agents/dewey/work/queue-131/r2/mutants/control-05.log
bae206232c1d746532161e759daf4797d79fa03bf793154de2590a34aee97a38 agents/dewey/work/queue-131/r2/mutants/control-06.log
b1b255f2069a2b101d59eff4d32700ccb15edfe6140ea0aa2d0e104cfdf628d6 agents/dewey/work/queue-131/r2/mutants/control.json
d4c09ac69af424cf712c042a01e14c0ab586fab4a18414495c939773047ce455 agents/dewey/work/queue-131/r2/mutants/results.json