✔ config directory and file path follow MOSAIC_CONFIG (3.499142ms) ✔ the fixture business validates and comes back frozen (8.200955ms) ✔ two instances may share a definition (2.889005ms) ✔ top-level refusals (9.161253ms) ✔ arbiters and projects (18.302779ms) ✔ role instances (7.565324ms) ✔ Vikunja bots (14.375041ms) ✔ a role without Vikunja takes no tracker block (7.070399ms) ✔ credential references match the definition's services (8.726652ms) ✔ launch (19.472588ms) ✔ loadBusiness: file checks (4.217411ms) ✔ loadBusiness: not a regular file (75.414373ms) ✔ loading writes nothing (3.026667ms) ✔ names that are Object.prototype properties don't count as declared (6.226665ms) ✔ the shipped example refuses as written and validates once filled in (1.219599ms) ✔ usage errors exit 4 (477.425638ms) ✔ validate: a good business exits 0 and prints instance digests (122.226689ms) ✔ validate: project files (587.623581ms) ✔ validate: missing files and a broken system config (412.505364ms) ✔ validate: credential reference problems exit 2 and name each one (114.443595ms) ✔ validate: a token file inside the repository is refused (115.872029ms) ✔ validate: role definitions come from MOSAIC_ROLES_DIR (395.576524ms) ✔ resolve: prints one instance's record (382.072144ms) ✔ resolve: refusals (671.297775ms) ✔ parse: exactly one of file or env, plus the service's date (5.20369ms) ✔ check: a good file has no problems (3.750629ms) ✔ check never opens the file: a write-only token passes (0.883724ms) ✔ check: file problems (2.127762ms) ✔ check: token files can't live in the repository or dataRoot, even through a linked directory (1.608643ms) ✔ check: dates and environment references (1.54162ms) ✔ path and load (3.887149ms) ✔ refusals (3.166373ms) ✔ systemVars flattens the validated config (3.977377ms) ✔ precedence: system, business, project, project role, agent (9.369246ms) ✔ limits narrow the definition and never widen it (5.814447ms) ✔ role.launch stays within-role only for the instance the launch block names (9.938752ms) ✔ limits.authority without role.launch leaves the launcher with no launch block (3.698816ms) ✔ limits.authority narrows cross-role actions too (3.358156ms) ✔ classify (2.651364ms) ✔ the record carries what the broker and launcher need (1.878428ms) ✔ digest: key order doesn't matter, any value change does (16.959853ms) ✔ refusals (5.200785ms) ✔ the four shipped version 2 roles load (6.343277ms) ✔ shipped role scopes match addendum B section 2 and the SR runbook (1.898026ms) ✔ shipped authority follows the note's table (0.923704ms) ✔ version 1 files keep loading with no authority (1.694498ms) ✔ the conductor policy isn't a role (0.391224ms) ✔ a missing role file is exit 4, a symbolic link too (1.024239ms) ✔ version 2 refusals (2.475814ms) ✔ authority: closed vocabulary, no gated-only action, no overlap (4.492413ms) ✔ credentials: Gitea scopes (2.331614ms) ✔ credentials: Vikunja scopes are a group-to-verbs map from the grantable list (4.431165ms) ✔ credentials: services (1.431893ms) ✔ contract: a non-empty regular Markdown file beside the role file (1.71708ms) ✔ every key names known layers and a merge rule (1.619414ms) ✔ unknown keys and wrong layers refuse (1.319144ms) ✔ types (3.666892ms) ✔ merge: defaults, then the most specific layer wins (0.481573ms) ✔ merge: limits only narrow, and provenance lists each source (0.550264ms) ✔ merge doesn't change its inputs (0.231736ms) ℹ tests 60 ℹ suites 0 ℹ pass 60 ℹ fail 0 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 3407.146697