✔ config directory and file path follow MOSAIC_CONFIG (1.190535ms) ✔ the fixture business validates and comes back frozen (3.542186ms) ✔ two instances may share a definition (1.12973ms) ✔ top-level refusals (3.786489ms) ✔ arbiters and projects (5.446422ms) ✔ role instances (2.723895ms) ✔ Vikunja bots (5.808997ms) ✔ a role without Vikunja takes no tracker block (2.076394ms) ✔ credential references match the definition's services (2.399388ms) ✔ launch (7.654281ms) ✔ loadBusiness: file checks (1.704533ms) ✔ loadBusiness: not a regular file (39.026876ms) ✔ loading writes nothing (1.016534ms) ✔ names that are Object.prototype properties don't count as declared (2.515974ms) ✔ the shipped example refuses as written and validates once filled in (0.502565ms) ✔ the role file loads and resolves through loadBusiness (4.568517ms) ✔ the shipped file is exactly decision 104's list (0.674527ms) ✔ the resolved record matches decision 104, so a widened file fails (1.489106ms) ✔ message.send is within role and every other action is gated (1.117162ms) ✔ a business grant of a gated action through limits does not widen the role (1.141573ms) ✔ a launch block whose by is the chief-of-staff instance is refused (1.400198ms) ✔ the instance takes no credential references and no tracker (2.36108ms) ✔ usage errors exit 4 (265.74256ms) ✔ validate: a good business exits 0 and prints instance digests (68.80396ms) ✔ validate: project files (305.753704ms) ✔ validate: missing files and a broken system config (229.802578ms) ✔ validate: credential reference problems exit 2 and name each one (65.287687ms) ✔ validate: a token file inside the repository is refused (66.746012ms) ✔ validate: role definitions come from MOSAIC_ROLES_DIR (183.529591ms) ✔ resolve: prints one instance's record (186.318694ms) ✔ resolve: refusals (357.397648ms) ✔ parse: exactly one of file or env, plus the service's date (2.846532ms) ✔ check: a good file has no problems (0.721111ms) ✔ check never opens the file: a write-only token passes (0.392126ms) ✔ check: file problems (1.019069ms) ✔ check: token files can't live in the repository or dataRoot, even through a linked directory (1.034691ms) ✔ check: dates and environment references (0.486034ms) ✔ path and load (1.930114ms) ✔ refusals (1.032083ms) ✔ systemVars flattens the validated config (1.920161ms) ✔ precedence: system, business, project, project role, agent (4.38676ms) ✔ limits narrow the definition and never widen it (2.23746ms) ✔ role.launch stays within-role only for the instance the launch block names (4.322647ms) ✔ limits.authority without role.launch leaves the launcher with no launch block (1.528354ms) ✔ limits.authority narrows cross-role actions too (0.901637ms) ✔ classify (1.009811ms) ✔ the record carries what the broker and launcher need (0.843685ms) ✔ digest: key order doesn't matter, any value change does (5.281272ms) ✔ refusals (2.034675ms) ✔ the four shipped version 2 roles load (2.574874ms) ✔ shipped role scopes match addendum B section 2 and the SR runbook (0.815313ms) ✔ shipped authority follows the note's table (0.445952ms) ✔ version 1 files keep loading with no authority (0.887694ms) ✔ the conductor policy isn't a role (0.230046ms) ✔ a missing role file is exit 4, a symbolic link too (0.434255ms) ✔ version 2 refusals (1.366814ms) ✔ authority: closed vocabulary, no gated-only action, no overlap (2.077109ms) ✔ credentials: Gitea scopes (0.85747ms) ✔ credentials: Vikunja scopes are a group-to-verbs map from the grantable list (0.981349ms) ✔ credentials: services (0.561201ms) ✔ contract: a non-empty regular Markdown file beside the role file (0.594573ms) ✔ every key names known layers and a merge rule (1.087761ms) ✔ unknown keys and wrong layers refuse (0.939958ms) ✔ types (2.370843ms) ✔ merge: defaults, then the most specific layer wins (0.339041ms) ✔ merge: limits only narrow, and provenance lists each source (0.37708ms) ✔ merge doesn't change its inputs (0.179536ms) ℹ tests 67 ℹ suites 0 ℹ pass 67 ℹ fail 0 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 1797.527264