✔ config directory and file path follow MOSAIC_CONFIG (2.183268ms) ✔ the fixture business validates and comes back frozen (6.602748ms) ✔ two instances may share a definition (2.13351ms) ✔ top-level refusals (6.796159ms) ✔ arbiters and projects (13.063638ms) ✔ role instances (4.562729ms) ✔ Vikunja bots (9.67808ms) ✔ a role without Vikunja takes no tracker block (2.771037ms) ✔ credential references match the definition's services (4.410447ms) ✔ launch (9.913796ms) ✔ loadBusiness: file checks (2.178237ms) ✔ loadBusiness: not a regular file (55.383245ms) ✔ loading writes nothing (1.896338ms) ✔ names that are Object.prototype properties don't count as declared (3.225168ms) ✔ the shipped example refuses as written and validates once filled in (0.656711ms) ✔ usage errors exit 4 (405.030898ms) ✔ validate: a good business exits 0 and prints instance digests (151.464385ms) ✔ validate: project files (558.998158ms) ✔ validate: missing files and a broken system config (307.427517ms) ✔ validate: credential reference problems exit 2 and name each one (101.183619ms) ✔ validate: a token file inside the repository is refused (105.981073ms) ✔ validate: role definitions come from MOSAIC_ROLES_DIR (432.868788ms) ✔ resolve: prints one instance's record (241.832955ms) ✔ resolve: refusals (485.036739ms) ✔ parse: exactly one of file or env, plus the service's date (4.324999ms) ✔ check: a good file has no problems (1.4598ms) ✔ check never opens the file: a write-only token passes (0.597147ms) ✔ check: file problems (1.32524ms) ✔ check: token files can't live in the repository or dataRoot, even through a linked directory (1.28172ms) ✔ check: dates and environment references (0.600572ms) ✔ path and load (3.448641ms) ✔ refusals (1.930464ms) ✔ systemVars flattens the validated config (2.895867ms) ✔ precedence: system, business, project, project role, agent (7.189615ms) ✔ limits narrow the definition and never widen it (3.369537ms) ✔ role.launch stays within-role only for the instance the launch block names (6.447022ms) ✔ limits.authority without role.launch leaves the launcher with no launch block (2.407627ms) ✔ limits.authority narrows cross-role actions too (1.82741ms) ✔ classify (1.316918ms) ✔ the record carries what the broker and launcher need (0.984331ms) ✔ digest: key order doesn't matter, any value change does (17.686519ms) ✔ refusals (6.905781ms) ✔ the four shipped version 2 roles load (4.314257ms) ✔ shipped role scopes match addendum B section 2 and the SR runbook (1.885955ms) ✔ shipped authority follows the note's table (0.856015ms) ✔ version 1 files keep loading with no authority (1.415186ms) ✔ the conductor policy isn't a role (0.527962ms) ✔ a missing role file is exit 4, a symbolic link too (0.601861ms) ✔ version 2 refusals (2.541944ms) ✔ authority: closed vocabulary, no gated-only action, no overlap (3.583984ms) ✔ credentials: Gitea scopes (1.096183ms) ✔ credentials: Vikunja scopes are a group-to-verbs map from the grantable list (1.694496ms) ✔ credentials: services (0.954423ms) ✔ contract: a non-empty regular Markdown file beside the role file (1.126891ms) ✔ every key names known layers and a merge rule (3.028061ms) ✔ unknown keys and wrong layers refuse (1.183861ms) ✔ types (4.110335ms) ✔ merge: defaults, then the most specific layer wins (0.467747ms) ✔ merge: limits only narrow, and provenance lists each source (0.818552ms) ✔ merge doesn't change its inputs (0.255662ms) ℹ tests 60 ℹ suites 0 ℹ pass 60 ℹ fail 0 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 2896.07396