✔ config directory and file path follow MOSAIC_CONFIG (1.109815ms) ✔ the fixture business validates and comes back frozen (3.261029ms) ✔ two instances may share a definition (1.258841ms) ✔ top-level refusals (3.103686ms) ✔ arbiters and projects (4.84218ms) ✔ role instances (3.396019ms) ✔ Vikunja bots (5.509823ms) ✔ a role without Vikunja takes no tracker block (1.882958ms) ✔ credential references match the definition's services (2.342714ms) ✔ launch (10.086901ms) ✔ loadBusiness: file checks (1.655292ms) ✔ loadBusiness: not a regular file (39.630265ms) ✔ loading writes nothing (1.005445ms) ✔ names that are Object.prototype properties don't count as declared (2.449512ms) ✔ the shipped example refuses as written and validates once filled in (0.500634ms) ✔ the role file loads and resolves through loadBusiness (6.252118ms) ✔ the shipped file is exactly decision 104's list (0.850397ms) ✔ the resolved record matches decision 104, so a widened file fails (1.966502ms) ✔ message.send is within role and every other action is gated (1.601645ms) ✔ a business grant of a gated action through limits does not widen the role (1.633186ms) ✔ a launch block whose by is the chief-of-staff instance is refused (1.82978ms) ✔ the instance takes no credential references and no tracker (2.76933ms) ✔ usage errors exit 4 (287.611086ms) ✔ validate: a good business exits 0 and prints instance digests (63.497887ms) ✔ validate: project files (304.734629ms) ✔ validate: missing files and a broken system config (230.709653ms) ✔ validate: credential reference problems exit 2 and name each one (61.452751ms) ✔ validate: a token file inside the repository is refused (64.021321ms) ✔ validate: role definitions come from MOSAIC_ROLES_DIR (184.299912ms) ✔ resolve: prints one instance's record (177.725921ms) ✔ resolve: refusals (363.91945ms) ✔ parse: exactly one of file or env, plus the service's date (2.218508ms) ✔ check: a good file has no problems (0.653489ms) ✔ check never opens the file: a write-only token passes (0.312823ms) ✔ check: file problems (0.719856ms) ✔ check: token files can't live in the repository or dataRoot, even through a linked directory (0.671479ms) ✔ check: dates and environment references (0.324265ms) ✔ path and load (1.657775ms) ✔ refusals (0.910635ms) ✔ systemVars flattens the validated config (2.312078ms) ✔ precedence: system, business, project, project role, agent (5.741744ms) ✔ limits narrow the definition and never widen it (2.787483ms) ✔ role.launch stays within-role only for the instance the launch block names (5.755605ms) ✔ limits.authority without role.launch leaves the launcher with no launch block (2.287863ms) ✔ limits.authority narrows cross-role actions too (0.880058ms) ✔ classify (0.99725ms) ✔ the record carries what the broker and launcher need (0.847769ms) ✔ digest: key order doesn't matter, any value change does (4.839386ms) ✔ refusals (1.863991ms) ✔ the four shipped version 2 roles load (2.418585ms) ✔ shipped role scopes match addendum B section 2 and the SR runbook (0.735235ms) ✔ shipped authority follows the note's table (0.420412ms) ✔ version 1 files keep loading with no authority (0.727549ms) ✔ the conductor policy isn't a role (0.245007ms) ✔ a missing role file is exit 4, a symbolic link too (0.330645ms) ✔ version 2 refusals (1.084103ms) ✔ authority: closed vocabulary, no gated-only action, no overlap (2.361837ms) ✔ credentials: Gitea scopes (1.009208ms) ✔ credentials: Vikunja scopes are a group-to-verbs map from the grantable list (1.331503ms) ✔ credentials: services (0.544628ms) ✔ contract: a non-empty regular Markdown file beside the role file (0.5185ms) ✔ every key names known layers and a merge rule (0.681264ms) ✔ unknown keys and wrong layers refuse (0.57581ms) ✔ types (1.526514ms) ✔ merge: defaults, then the most specific layer wins (0.212046ms) ✔ merge: limits only narrow, and provenance lists each source (0.263578ms) ✔ merge doesn't change its inputs (0.143187ms) ℹ tests 67 ℹ suites 0 ℹ pass 67 ℹ fail 0 ℹ cancelled 0 ℹ skipped 0 ℹ todo 0 ℹ duration_ms 1799.397393