✔ config directory and file path follow MOSAIC_CONFIG (1.313754ms) ✔ the fixture business validates and comes back frozen (3.851765ms) ✔ two instances may share a definition (1.282205ms) ✔ top-level refusals (3.716172ms) ✔ arbiters and projects (6.694067ms) ✔ role instances (3.785125ms) ✔ Vikunja bots (6.270255ms) ✔ a role without Vikunja takes no tracker block (2.115665ms) ✔ credential references match the definition's services (2.475395ms) ✔ launch (6.655809ms) ✔ loadBusiness: file checks (1.622417ms) ✔ loadBusiness: not a regular file (37.161488ms) ✔ loading writes nothing (1.787749ms) ✔ names that are Object.prototype properties don't count as declared (2.51723ms) ✔ the shipped example refuses as written and validates once filled in (0.519378ms) ✔ the role file loads and resolves through loadBusiness (5.836774ms) ✔ the shipped file is exactly decision 104's list (0.565831ms) ✔ the resolved record matches decision 104, so a widened file fails (1.391311ms) ✔ message.send is within role and every other action is gated (1.103283ms) ✔ a business grant of a gated action through limits does not widen the role (1.12858ms) ✔ a launch block whose by is the chief-of-staff instance is refused (1.575775ms) ✔ the instance takes no credential references and no tracker (2.608464ms) ✔ usage errors exit 4 (254.751726ms) ✔ validate: a good business exits 0 and prints instance digests (62.537022ms) ✔ validate: project files (302.167283ms) ✔ validate: missing files and a broken system config (225.181111ms) ✔ validate: credential reference problems exit 2 and name each one (58.803933ms) ✔ validate: a token file inside the repository is refused (57.120144ms) ✔ validate: role definitions come from MOSAIC_ROLES_DIR (185.68733ms) ✔ resolve: prints one instance's record (174.976644ms) ✔ resolve: refusals (352.73137ms) ✔ parse: exactly one of file or env, plus the service's date (2.161109ms) ✔ check: a good file has no problems (0.774082ms) ✔ check never opens the file: a write-only token passes (0.350559ms) ✔ check: file problems (0.74108ms) ✔ check: token files can't live in the repository or dataRoot, even through a linked directory (0.733537ms) ✔ check: dates and environment references (0.350406ms) ✔ path and load (1.879673ms) ✔ refusals (0.94469ms) ✔ systemVars flattens the validated config (1.702944ms) ✔ precedence: system, business, project, project role, agent (4.805313ms) ✔ limits narrow the definition and never widen it (2.925243ms) ✔ role.launch stays within-role only for the instance the launch block names (4.674216ms) ✔ limits.authority without role.launch leaves the launcher with no launch block (1.801037ms) ✔ limits.authority narrows cross-role actions too (0.854397ms) ✔ classify (1.001878ms) ✔ the record carries what the broker and launcher need (0.829468ms) ✔ digest: key order doesn't matter, any value change does (5.537756ms) ✔ refusals (1.938827ms) ✔ the four shipped version 2 roles load (3.188019ms) ✔ shipped role scopes match addendum B section 2 and the SR runbook (1.001678ms) ✔ shipped authority follows the note's table (0.600714ms) ✔ version 1 files keep loading with no authority (1.002955ms) ✔ the conductor policy isn't a role (0.226972ms) ✔ a missing role file is exit 4, a symbolic link too (0.445656ms) ✔ version 2 refusals (1.214353ms) ✔ authority: closed vocabulary, no gated-only action, no overlap (2.483861ms) ✔ credentials: Gitea scopes (1.102514ms) ✔ credentials: Vikunja scopes are a group-to-verbs map from the grantable list (1.07196ms) ✔ credentials: services (0.754963ms) ✔ contract: a non-empty regular Markdown file beside the role file (0.840554ms) ✔ every key names known layers and a merge rule (0.931454ms) ✔ unknown keys and wrong layers refuse (0.778607ms) ✔ types (2.106421ms) ✔ merge: defaults, then the most specific layer wins (0.314233ms) ✔ merge: limits only narrow, and provenance lists each source (0.416978ms) ✔ merge doesn't change its inputs (0.126027ms) ℹ tests 67 ℹ suites 0 ℹ pass 67 ℹ fail 0 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 1733.511253