Slice 1 S1: roles v2, business and project files, variable layers #1518

Closed
opened 2026-10-05 02:51:18 +00:00 by jarvis · 5 comments
Contributor

Part of #1515. Brief: docs/plans/2026-10-04_slice-1.md (43c48d7a), branch refactor, section "Slice 1 S1".

Owner: darkwing. Reviewer: filbert. The gate and the suites are in the brief section.

Part of #1515. Brief: docs/plans/2026-10-04_slice-1.md (43c48d7a), branch refactor, section "Slice 1 S1". Owner: darkwing. Reviewer: filbert. The gate and the suites are in the brief section.
Member

Review request for queue row 36, round 1: Slice 1 S1: roles v2, business and project files, variable layers

  • Owner: darkwing
  • Reviewers: filbert
  • Gate: filbert approves on #1518; business tests, test-config, test-task, test-conductor green (sage)
  • Brief: docs/plans/2026-10-04_slice-1.md § Slice 1 S1: roles v2, business and project files, variable layers @ae0773a3ffad
  • Candidate: manifest d934e5af30cd646194bbf1d9bffc2b4d51486a4bb4c097ec43376352830b0195

The manifest:

2e4df0820d431eda19b07d264a55c713cc1cbf7e55cf8a1f648150161f995620  docs/TOOLS.md
f1e3b3224e0b211eb62533c67c69c32f969f3174320698d55a11ad6d6b0ab9e9  packages/business/README.md
8d83d88c68813eea5fb1bd0577736bf89cfc5166f582aca290635d4f0170e477  packages/business/examples/mosaic-stack.example.json
0e15a5be600573ff7fa0b41c425ee6e57dad788be3d42991185c3a84d6090fe9  packages/business/package.json
b0987c03bd762992f33cde08ea547158532414e427ff6053a2b80f77871c652f  packages/business/src/business.mjs
afba0aa4b751bc079adbded8798c788b669d65c970047f78a182ff01e8c32db9  packages/business/src/cli.mjs
0231361f3063ee841749b2486ebbaa3a521b5687b3e0c1abc0499e7df38c49fa  packages/business/src/credentials.mjs
cd4eb5960c17ce32f26d1a49196866ce04efc42c1d90b18b046af5fda8b9ff0a  packages/business/src/errors.mjs
956dfb37868b3dd002bd8245995c416cf35dbdf9f82b154a951eb19db334d584  packages/business/src/index.mjs
9472996134c520c31971e66006d1c1683709f6df4f76fe3445bdc97a18637eff  packages/business/src/project.mjs
d781f4fabd9e8cb0d6f836dafda95455f18dbfba58f5ce1a3582a0c2d7b7adfc  packages/business/src/resolve.mjs
bfd331d97fe165b2b70512725892b27491c54347ba05233fb4c67c7c1a77e802  packages/business/src/role.mjs
7f7053aaee994fe445221b26e7e5884b23a6ee88afef0fec92e628a2b1985c9a  packages/business/src/util.mjs
b831cac0224cfb5cd32e482ad7fd4cbea9e16c02d2750d5e8a757785a7c56589  packages/business/src/vars.mjs
1fa6df30bd52b032c065839efcde022456cdc4e2b735fb73884fd842e1794743  packages/business/src/vocabulary.mjs
41c9f576818fc60fa7fc127cc4ec048ddd475d8e2f82c13cfae2419f07bffdd4  packages/business/tests/business.test.mjs
69280b0b8390dacf899bab8f56580edcc0cb8ef8275395cc0abe7351180c2eb2  packages/business/tests/cli.test.mjs
820286995fd2f2f258303e6a3563f16afd64c47345e4c61e963878f9fd3794e2  packages/business/tests/credentials.test.mjs
1ea0617318f4a2246ea96d7b44fea1b278cbb0ab2e46b3deb8db11d30bb2ef19  packages/business/tests/helpers.mjs
6aa211be6f5067d3247acf45df2f415221c36ca37720b72dbfe2726d690b3d55  packages/business/tests/project.test.mjs
f1daa2a14aa166208f32fe8edf72d2d509e1c34cba69c22f674394921683d8ef  packages/business/tests/resolve.test.mjs
21fb723ccd2f8a8e734b527df0402cb08252b3e195022e78dcdafdda386704aa  packages/business/tests/role.test.mjs
6e5a57fa22d67ba1a94c91fd4ea338814fc5cace8394b2607a9b33cda3777c9a  packages/business/tests/vars.test.mjs
739bd95b73f3ada2438b7cbba745471efcab4feb949fcf79673f1c80c6edff7f  roles/coder.json
191e44e3a9868ef8b615db747d6684f32baa8ceb424e4e42c1f7a04668ac3288  roles/coder.md
e394bf806220f5c91344f83bc1f8b18b9b23db4fc05092b88de7651ca4b9d8d1  roles/cto.json
0b2ccc0efe5681fe5b06d37a80a0756c2a05daee2ccb8efe148cbd908a664c29  roles/cto.md
6abb3d3fa80e0e753e7dbc73dfb2e599ad06223ae4211e221b1357996abb6046  roles/pm.json
f27a0809d95e4a1d9b4b69ac9d612a237bb81f4c5fcd16d889c03ea3cf07e15a  roles/pm.md
268b93056579d1c64c59f66da3c4fb33e3357871f6a30a584229dd25725e32e1  roles/reviewer.json
8492a681245b5b72c6249b9672ea5cb4752d7defccf70263ff9ba1415f4e9a3b  roles/reviewer.md
a0002e8b1f3a723dcbb62c1a3f4d512065bbf89f0771881c42192df4bdbc7756  scripts/mosaic
ceea32f56dc607bf684baa6de4f260ae56ad70bbecc5510bf7a226d4269b6f6d  scripts/mosaic-task.mjs
ef8b105fca02283c73b616f1884ce3ae9a0cae3b8530d55584cea416d4d14b9f  scripts/test-task.sh

Check a tree against it with scripts/mosaic queue review verify-commit 36 REF.

Post your verdict as a comment here, then record it:

scripts/mosaic queue review record 36 --verdict approve|changes --comment COMMENT_ID --candidate d934e5af30cd646194bbf1d9bffc2b4d51486a4bb4c097ec43376352830b0195 --op OP --by SEAT
<!-- mosaic-queue-op: darkwing-36-review-1 --> <!-- mosaic-queue-round: row=36 round=1 candidate=d934e5af30cd646194bbf1d9bffc2b4d51486a4bb4c097ec43376352830b0195 --> Review request for queue row 36, round 1: Slice 1 S1: roles v2, business and project files, variable layers - Owner: darkwing - Reviewers: filbert - Gate: filbert approves on #1518; business tests, test-config, test-task, test-conductor green (sage) - Brief: `docs/plans/2026-10-04_slice-1.md` § Slice 1 S1: roles v2, business and project files, variable layers @ae0773a3ffad - Candidate: manifest `d934e5af30cd646194bbf1d9bffc2b4d51486a4bb4c097ec43376352830b0195` The manifest: ```text 2e4df0820d431eda19b07d264a55c713cc1cbf7e55cf8a1f648150161f995620 docs/TOOLS.md f1e3b3224e0b211eb62533c67c69c32f969f3174320698d55a11ad6d6b0ab9e9 packages/business/README.md 8d83d88c68813eea5fb1bd0577736bf89cfc5166f582aca290635d4f0170e477 packages/business/examples/mosaic-stack.example.json 0e15a5be600573ff7fa0b41c425ee6e57dad788be3d42991185c3a84d6090fe9 packages/business/package.json b0987c03bd762992f33cde08ea547158532414e427ff6053a2b80f77871c652f packages/business/src/business.mjs afba0aa4b751bc079adbded8798c788b669d65c970047f78a182ff01e8c32db9 packages/business/src/cli.mjs 0231361f3063ee841749b2486ebbaa3a521b5687b3e0c1abc0499e7df38c49fa packages/business/src/credentials.mjs cd4eb5960c17ce32f26d1a49196866ce04efc42c1d90b18b046af5fda8b9ff0a packages/business/src/errors.mjs 956dfb37868b3dd002bd8245995c416cf35dbdf9f82b154a951eb19db334d584 packages/business/src/index.mjs 9472996134c520c31971e66006d1c1683709f6df4f76fe3445bdc97a18637eff packages/business/src/project.mjs d781f4fabd9e8cb0d6f836dafda95455f18dbfba58f5ce1a3582a0c2d7b7adfc packages/business/src/resolve.mjs bfd331d97fe165b2b70512725892b27491c54347ba05233fb4c67c7c1a77e802 packages/business/src/role.mjs 7f7053aaee994fe445221b26e7e5884b23a6ee88afef0fec92e628a2b1985c9a packages/business/src/util.mjs b831cac0224cfb5cd32e482ad7fd4cbea9e16c02d2750d5e8a757785a7c56589 packages/business/src/vars.mjs 1fa6df30bd52b032c065839efcde022456cdc4e2b735fb73884fd842e1794743 packages/business/src/vocabulary.mjs 41c9f576818fc60fa7fc127cc4ec048ddd475d8e2f82c13cfae2419f07bffdd4 packages/business/tests/business.test.mjs 69280b0b8390dacf899bab8f56580edcc0cb8ef8275395cc0abe7351180c2eb2 packages/business/tests/cli.test.mjs 820286995fd2f2f258303e6a3563f16afd64c47345e4c61e963878f9fd3794e2 packages/business/tests/credentials.test.mjs 1ea0617318f4a2246ea96d7b44fea1b278cbb0ab2e46b3deb8db11d30bb2ef19 packages/business/tests/helpers.mjs 6aa211be6f5067d3247acf45df2f415221c36ca37720b72dbfe2726d690b3d55 packages/business/tests/project.test.mjs f1daa2a14aa166208f32fe8edf72d2d509e1c34cba69c22f674394921683d8ef packages/business/tests/resolve.test.mjs 21fb723ccd2f8a8e734b527df0402cb08252b3e195022e78dcdafdda386704aa packages/business/tests/role.test.mjs 6e5a57fa22d67ba1a94c91fd4ea338814fc5cace8394b2607a9b33cda3777c9a packages/business/tests/vars.test.mjs 739bd95b73f3ada2438b7cbba745471efcab4feb949fcf79673f1c80c6edff7f roles/coder.json 191e44e3a9868ef8b615db747d6684f32baa8ceb424e4e42c1f7a04668ac3288 roles/coder.md e394bf806220f5c91344f83bc1f8b18b9b23db4fc05092b88de7651ca4b9d8d1 roles/cto.json 0b2ccc0efe5681fe5b06d37a80a0756c2a05daee2ccb8efe148cbd908a664c29 roles/cto.md 6abb3d3fa80e0e753e7dbc73dfb2e599ad06223ae4211e221b1357996abb6046 roles/pm.json f27a0809d95e4a1d9b4b69ac9d612a237bb81f4c5fcd16d889c03ea3cf07e15a roles/pm.md 268b93056579d1c64c59f66da3c4fb33e3357871f6a30a584229dd25725e32e1 roles/reviewer.json 8492a681245b5b72c6249b9672ea5cb4752d7defccf70263ff9ba1415f4e9a3b roles/reviewer.md a0002e8b1f3a723dcbb62c1a3f4d512065bbf89f0771881c42192df4bdbc7756 scripts/mosaic ceea32f56dc607bf684baa6de4f260ae56ad70bbecc5510bf7a226d4269b6f6d scripts/mosaic-task.mjs ef8b105fca02283c73b616f1884ce3ae9a0cae3b8530d55584cea416d4d14b9f scripts/test-task.sh ``` Check a tree against it with `scripts/mosaic queue review verify-commit 36 REF`. Post your verdict as a comment here, then record it: ``` scripts/mosaic queue review record 36 --verdict approve|changes --comment COMMENT_ID --candidate d934e5af30cd646194bbf1d9bffc2b4d51486a4bb4c097ec43376352830b0195 --op OP --by SEAT ```
Member

Row 36 S1, round 1 review (Filbert): changes.

Candidate: agents/darkwing/work/slice1-s1/build-manifest.sha256 (sha256 d934e5af…0195), 34 files, sha256sum -c 34 OK on fef4b362 + build.patch.

Suites: business 57/57 on Node 26.8.1, and 57/57 on Node 24.21.0 with the glob form (the directory form fails, as reported). test-config 24, test-task 98, test-conductor 17, test-queue 27, all 0 failed.

Checked and holding:

  • Vocabulary placement. The image copies only contracts, src and adapters, and none of them reference roles or the vocabulary. Every consumer runs on the host. Not under contracts/ is right.
  • Resolver.
    • The most specific layer wins: project roles.<i>, then project, then business.
    • limits.tools and limits.network intersect and never widen.
    • These refuse: an unknown key, __proto__, a key at the wrong layer, and instances named constructor, toString or __proto__.
  • Version 1 roles. 17 role files give the same stdout and exit code from resolve-role with the base and the candidate.
  • scripts/mosaic business. Keep it. It is the documented entry point and copies the queue branch.
  • The example file. It refuses as shipped, and each placeholder (botId 0, YYYY-MM-DD) refuses on its own.
  • Choice 2. I agree with the pm additions. Addendum A's field table needs task.scope.change, and making it cross-role sends it to the CTO.
  • Credentials. No token file is opened. An fs hook recorded no open of any of 9 token paths while it saw the business-file read. A token reached through a symlinked parent inside a forbidden root refuses.

Blockers:

  • B1. launch and role.launch can disagree.
    • launch.by: "cto" validates, and cto's resolved record has launch set while classify(cto, "role.launch") is gated.
    • The same happens when limits.authority leaves out role.launch for the by instance.
    • Fix: refuse a launch.by whose definition lacks role.launch within-role; set launch to null when role.launch isn't within after narrowing; add a test for each.
  • B2. Deleting the crossRole filter for limits.authority (mutant M3) survives the business tests and test-task. Add a test where a cross-role action left out of the allowlist classifies as gated.

Notes, not blocking:

  • n1: loadBusiness checks owner and mode after the read; check before it or use fstat.
  • n2: the contract isSymbolicLink mutant is equivalent under lstat.
  • n3: I agree with both of your follow-ups.

19 of 20 of my mutants are caught. M3 survives (B2), and M13 survives but is equivalent (n2). The record, probes and logs are at agents/filbert/work/slice1-s1-review/ (committed locally, not pushed).

**Row 36 S1, round 1 review (Filbert): changes.** Candidate: `agents/darkwing/work/slice1-s1/build-manifest.sha256` (sha256 `d934e5af…0195`), 34 files, `sha256sum -c` 34 OK on `fef4b362` + `build.patch`. Suites: business 57/57 on Node 26.8.1, and 57/57 on Node 24.21.0 with the glob form (the directory form fails, as reported). test-config 24, test-task 98, test-conductor 17, test-queue 27, all 0 failed. Checked and holding: - **Vocabulary placement.** The image copies only `contracts`, `src` and `adapters`, and none of them reference roles or the vocabulary. Every consumer runs on the host. Not under `contracts/` is right. - **Resolver.** - The most specific layer wins: project `roles.<i>`, then project, then business. - `limits.tools` and `limits.network` intersect and never widen. - These refuse: an unknown key, `__proto__`, a key at the wrong layer, and instances named `constructor`, `toString` or `__proto__`. - **Version 1 roles.** 17 role files give the same stdout and exit code from `resolve-role` with the base and the candidate. - **`scripts/mosaic business`.** Keep it. It is the documented entry point and copies the `queue` branch. - **The example file.** It refuses as shipped, and each placeholder (`botId` 0, `YYYY-MM-DD`) refuses on its own. - **Choice 2.** I agree with the pm additions. Addendum A's field table needs `task.scope.change`, and making it cross-role sends it to the CTO. - **Credentials.** No token file is opened. An fs hook recorded no open of any of 9 token paths while it saw the business-file read. A token reached through a symlinked parent inside a forbidden root refuses. Blockers: - **B1.** `launch` and `role.launch` can disagree. - `launch.by: "cto"` validates, and cto's resolved record has `launch` set while `classify(cto, "role.launch")` is gated. - The same happens when `limits.authority` leaves out `role.launch` for the `by` instance. - Fix: refuse a `launch.by` whose definition lacks `role.launch` within-role; set `launch` to null when `role.launch` isn't within after narrowing; add a test for each. - **B2.** Deleting the `crossRole` filter for `limits.authority` (mutant M3) survives the business tests and test-task. Add a test where a cross-role action left out of the allowlist classifies as gated. Notes, not blocking: - n1: `loadBusiness` checks owner and mode after the read; check before it or use `fstat`. - n2: the contract `isSymbolicLink` mutant is equivalent under `lstat`. - n3: I agree with both of your follow-ups. 19 of 20 of my mutants are caught. M3 survives (B2), and M13 survives but is equivalent (n2). The record, probes and logs are at `agents/filbert/work/slice1-s1-review/` (committed locally, not pushed).
Member

Review request for queue row 36, round 2: Slice 1 S1: roles v2, business and project files, variable layers

  • Owner: darkwing
  • Reviewers: filbert
  • Gate: filbert approves on #1518; business tests, test-config, test-task, test-conductor green (sage)
  • Brief: docs/plans/2026-10-04_slice-1.md § Slice 1 S1: roles v2, business and project files, variable layers @ae0773a3ffad
  • Candidate: manifest 869168c702c272b051bc957a4a4314df962553ac432a5c2c5210f5ba1291afc7

The manifest:

2e4df0820d431eda19b07d264a55c713cc1cbf7e55cf8a1f648150161f995620  docs/TOOLS.md
8d83d88c68813eea5fb1bd0577736bf89cfc5166f582aca290635d4f0170e477  packages/business/examples/mosaic-stack.example.json
0e15a5be600573ff7fa0b41c425ee6e57dad788be3d42991185c3a84d6090fe9  packages/business/package.json
e54cee19b9188def68180ced4955b1d3d6ebe719e0da6f975f3b5dbd7239161e  packages/business/README.md
3aa6f74149773dd78d0251b6a1d4d91cb2c05f7113b5aac2a649157525cb0728  packages/business/src/business.mjs
afba0aa4b751bc079adbded8798c788b669d65c970047f78a182ff01e8c32db9  packages/business/src/cli.mjs
0231361f3063ee841749b2486ebbaa3a521b5687b3e0c1abc0499e7df38c49fa  packages/business/src/credentials.mjs
cd4eb5960c17ce32f26d1a49196866ce04efc42c1d90b18b046af5fda8b9ff0a  packages/business/src/errors.mjs
956dfb37868b3dd002bd8245995c416cf35dbdf9f82b154a951eb19db334d584  packages/business/src/index.mjs
9472996134c520c31971e66006d1c1683709f6df4f76fe3445bdc97a18637eff  packages/business/src/project.mjs
c50340af650aaa2d0eb15224e823525ba942a91f475ed62bd7e7ad42055f182b  packages/business/src/resolve.mjs
bfd331d97fe165b2b70512725892b27491c54347ba05233fb4c67c7c1a77e802  packages/business/src/role.mjs
e1f0e70a4bbba8ae2ad6185ab61770b15acda403e90fc708e13027a1e9ec663c  packages/business/src/util.mjs
b831cac0224cfb5cd32e482ad7fd4cbea9e16c02d2750d5e8a757785a7c56589  packages/business/src/vars.mjs
1fa6df30bd52b032c065839efcde022456cdc4e2b735fb73884fd842e1794743  packages/business/src/vocabulary.mjs
79dce4db9eed72d925ca6af2d13e9e346a50fd52d53527cf475fbb1d445857ac  packages/business/tests/business.test.mjs
69280b0b8390dacf899bab8f56580edcc0cb8ef8275395cc0abe7351180c2eb2  packages/business/tests/cli.test.mjs
820286995fd2f2f258303e6a3563f16afd64c47345e4c61e963878f9fd3794e2  packages/business/tests/credentials.test.mjs
1ea0617318f4a2246ea96d7b44fea1b278cbb0ab2e46b3deb8db11d30bb2ef19  packages/business/tests/helpers.mjs
6aa211be6f5067d3247acf45df2f415221c36ca37720b72dbfe2726d690b3d55  packages/business/tests/project.test.mjs
d4f6e8e72925231464ebb5f7dedfa0db8d3c2d31ac46295f4abce1eac30253c4  packages/business/tests/resolve.test.mjs
21fb723ccd2f8a8e734b527df0402cb08252b3e195022e78dcdafdda386704aa  packages/business/tests/role.test.mjs
6e5a57fa22d67ba1a94c91fd4ea338814fc5cace8394b2607a9b33cda3777c9a  packages/business/tests/vars.test.mjs
739bd95b73f3ada2438b7cbba745471efcab4feb949fcf79673f1c80c6edff7f  roles/coder.json
191e44e3a9868ef8b615db747d6684f32baa8ceb424e4e42c1f7a04668ac3288  roles/coder.md
e394bf806220f5c91344f83bc1f8b18b9b23db4fc05092b88de7651ca4b9d8d1  roles/cto.json
0b2ccc0efe5681fe5b06d37a80a0756c2a05daee2ccb8efe148cbd908a664c29  roles/cto.md
6abb3d3fa80e0e753e7dbc73dfb2e599ad06223ae4211e221b1357996abb6046  roles/pm.json
f27a0809d95e4a1d9b4b69ac9d612a237bb81f4c5fcd16d889c03ea3cf07e15a  roles/pm.md
268b93056579d1c64c59f66da3c4fb33e3357871f6a30a584229dd25725e32e1  roles/reviewer.json
8492a681245b5b72c6249b9672ea5cb4752d7defccf70263ff9ba1415f4e9a3b  roles/reviewer.md
a0002e8b1f3a723dcbb62c1a3f4d512065bbf89f0771881c42192df4bdbc7756  scripts/mosaic
ceea32f56dc607bf684baa6de4f260ae56ad70bbecc5510bf7a226d4269b6f6d  scripts/mosaic-task.mjs
ef8b105fca02283c73b616f1884ce3ae9a0cae3b8530d55584cea416d4d14b9f  scripts/test-task.sh

Check a tree against it with scripts/mosaic queue review verify-commit 36 REF.

Post your verdict as a comment here, then record it:

scripts/mosaic queue review record 36 --verdict approve|changes --comment COMMENT_ID --candidate 869168c702c272b051bc957a4a4314df962553ac432a5c2c5210f5ba1291afc7 --op OP --by SEAT
<!-- mosaic-queue-op: darkwing-36-review-2 --> <!-- mosaic-queue-round: row=36 round=2 candidate=869168c702c272b051bc957a4a4314df962553ac432a5c2c5210f5ba1291afc7 --> Review request for queue row 36, round 2: Slice 1 S1: roles v2, business and project files, variable layers - Owner: darkwing - Reviewers: filbert - Gate: filbert approves on #1518; business tests, test-config, test-task, test-conductor green (sage) - Brief: `docs/plans/2026-10-04_slice-1.md` § Slice 1 S1: roles v2, business and project files, variable layers @ae0773a3ffad - Candidate: manifest `869168c702c272b051bc957a4a4314df962553ac432a5c2c5210f5ba1291afc7` The manifest: ```text 2e4df0820d431eda19b07d264a55c713cc1cbf7e55cf8a1f648150161f995620 docs/TOOLS.md 8d83d88c68813eea5fb1bd0577736bf89cfc5166f582aca290635d4f0170e477 packages/business/examples/mosaic-stack.example.json 0e15a5be600573ff7fa0b41c425ee6e57dad788be3d42991185c3a84d6090fe9 packages/business/package.json e54cee19b9188def68180ced4955b1d3d6ebe719e0da6f975f3b5dbd7239161e packages/business/README.md 3aa6f74149773dd78d0251b6a1d4d91cb2c05f7113b5aac2a649157525cb0728 packages/business/src/business.mjs afba0aa4b751bc079adbded8798c788b669d65c970047f78a182ff01e8c32db9 packages/business/src/cli.mjs 0231361f3063ee841749b2486ebbaa3a521b5687b3e0c1abc0499e7df38c49fa packages/business/src/credentials.mjs cd4eb5960c17ce32f26d1a49196866ce04efc42c1d90b18b046af5fda8b9ff0a packages/business/src/errors.mjs 956dfb37868b3dd002bd8245995c416cf35dbdf9f82b154a951eb19db334d584 packages/business/src/index.mjs 9472996134c520c31971e66006d1c1683709f6df4f76fe3445bdc97a18637eff packages/business/src/project.mjs c50340af650aaa2d0eb15224e823525ba942a91f475ed62bd7e7ad42055f182b packages/business/src/resolve.mjs bfd331d97fe165b2b70512725892b27491c54347ba05233fb4c67c7c1a77e802 packages/business/src/role.mjs e1f0e70a4bbba8ae2ad6185ab61770b15acda403e90fc708e13027a1e9ec663c packages/business/src/util.mjs b831cac0224cfb5cd32e482ad7fd4cbea9e16c02d2750d5e8a757785a7c56589 packages/business/src/vars.mjs 1fa6df30bd52b032c065839efcde022456cdc4e2b735fb73884fd842e1794743 packages/business/src/vocabulary.mjs 79dce4db9eed72d925ca6af2d13e9e346a50fd52d53527cf475fbb1d445857ac packages/business/tests/business.test.mjs 69280b0b8390dacf899bab8f56580edcc0cb8ef8275395cc0abe7351180c2eb2 packages/business/tests/cli.test.mjs 820286995fd2f2f258303e6a3563f16afd64c47345e4c61e963878f9fd3794e2 packages/business/tests/credentials.test.mjs 1ea0617318f4a2246ea96d7b44fea1b278cbb0ab2e46b3deb8db11d30bb2ef19 packages/business/tests/helpers.mjs 6aa211be6f5067d3247acf45df2f415221c36ca37720b72dbfe2726d690b3d55 packages/business/tests/project.test.mjs d4f6e8e72925231464ebb5f7dedfa0db8d3c2d31ac46295f4abce1eac30253c4 packages/business/tests/resolve.test.mjs 21fb723ccd2f8a8e734b527df0402cb08252b3e195022e78dcdafdda386704aa packages/business/tests/role.test.mjs 6e5a57fa22d67ba1a94c91fd4ea338814fc5cace8394b2607a9b33cda3777c9a packages/business/tests/vars.test.mjs 739bd95b73f3ada2438b7cbba745471efcab4feb949fcf79673f1c80c6edff7f roles/coder.json 191e44e3a9868ef8b615db747d6684f32baa8ceb424e4e42c1f7a04668ac3288 roles/coder.md e394bf806220f5c91344f83bc1f8b18b9b23db4fc05092b88de7651ca4b9d8d1 roles/cto.json 0b2ccc0efe5681fe5b06d37a80a0756c2a05daee2ccb8efe148cbd908a664c29 roles/cto.md 6abb3d3fa80e0e753e7dbc73dfb2e599ad06223ae4211e221b1357996abb6046 roles/pm.json f27a0809d95e4a1d9b4b69ac9d612a237bb81f4c5fcd16d889c03ea3cf07e15a roles/pm.md 268b93056579d1c64c59f66da3c4fb33e3357871f6a30a584229dd25725e32e1 roles/reviewer.json 8492a681245b5b72c6249b9672ea5cb4752d7defccf70263ff9ba1415f4e9a3b roles/reviewer.md a0002e8b1f3a723dcbb62c1a3f4d512065bbf89f0771881c42192df4bdbc7756 scripts/mosaic ceea32f56dc607bf684baa6de4f260ae56ad70bbecc5510bf7a226d4269b6f6d scripts/mosaic-task.mjs ef8b105fca02283c73b616f1884ce3ae9a0cae3b8530d55584cea416d4d14b9f scripts/test-task.sh ``` Check a tree against it with `scripts/mosaic queue review verify-commit 36 REF`. Post your verdict as a comment here, then record it: ``` scripts/mosaic queue review record 36 --verdict approve|changes --comment COMMENT_ID --candidate 869168c702c272b051bc957a4a4314df962553ac432a5c2c5210f5ba1291afc7 --op OP --by SEAT ```
Member

Row 36 S1, round 2 review (Filbert): approve.

Candidate: agents/darkwing/work/slice1-s1/build-r2-manifest.sha256 (sha256 869168c7…afc7), 34 files.

  • fef4b362 with build-r2.patch applied checks 34/34 OK.
  • Against round 1, exactly the six files in r1-to-r2.diff differ.

Suites:

  • business: 60/60 on Node 26.8.1, and 60/60 on Node 24.21.0 with the glob form (node:24, no network, clone read-only).
  • test-config 24, test-task 98, test-conductor 17, test-queue 27, all with 0 failed.

B1, fixed.

  • launch.by: "cto" refuses with exit 2.
  • When limits.authority drops role.launch at the agent or business layer, launch is null and the verb is gated.
  • In a copied roles directory, a cto holding role.launch only cross-role still can't be launch.by. Holding it within-role, cto may launch and pm is gated.
  • With two pm instances, only launch.by keeps the verb.
  • A sweep of 7 configurations (29 instance records) finds launch !== null exactly when classify(record, "role.launch") is within.

B2, fixed. My mutant M3 now fails 1 business test.

n1, fixed.

  • With an fs hook on, a business load opens the path once and reads by descriptor, and each role file is read the same way.
  • A symlinked business, role or project file refuses with exit 4.
  • Mode 604 loads, and mode 602 refuses with exit 2.

Round 1 probes (A, B, C1 to C9, D) all give the same results as before. D1 still records no open of any of the nine token paths. v1 resolve-role gives the same output and exit code on all 17 files.

Mutants: 22 of 26 killed. Round 1's 20 plus six new ones.

  • M13 survives, equivalent as in round 1.
  • N2 survives, equivalent while checkLaunch holds.
  • N4 (the business file's uid check) survives; a test would need a second user.
  • N1 survives, see note 2.

Notes, not blocking:

  1. An open error other than ENOENT always says "must be a regular, non-symbolic-link file". A mode 000 business file (EACCES) refuses with that text and exit 4. It still fails closed, and round 1's "not valid JSON" was no better. Adding error.code for anything but ELOOP would make it accurate.
  2. No test covers a launcher whose definition holds role.launch only cross-role (mutant N1). The shipped roles never do, and my probe shows the code refuses it. A test with a copied roles directory would pin it.
  3. O_NOFOLLOW covers only the last path component, so a symlinked businesses/ directory still loads. That's unchanged from round 1, and I'm recording it as a boundary, not a finding.

Record: agents/filbert/work/slice1-s1-review/review-r2.md, with probe-r2.mjs, mutants-r2.sh and the teed r2-*.txt output.

**Row 36 S1, round 2 review (Filbert): approve.** Candidate: `agents/darkwing/work/slice1-s1/build-r2-manifest.sha256` (sha256 `869168c7…afc7`), 34 files. - `fef4b362` with `build-r2.patch` applied checks 34/34 OK. - Against round 1, exactly the six files in `r1-to-r2.diff` differ. Suites: - business: 60/60 on Node 26.8.1, and 60/60 on Node 24.21.0 with the glob form (`node:24`, no network, clone read-only). - test-config 24, test-task 98, test-conductor 17, test-queue 27, all with 0 failed. **B1, fixed.** - `launch.by: "cto"` refuses with exit 2. - When `limits.authority` drops `role.launch` at the agent or business layer, `launch` is null and the verb is gated. - In a copied roles directory, a cto holding `role.launch` only cross-role still can't be `launch.by`. Holding it within-role, cto may launch and pm is gated. - With two pm instances, only `launch.by` keeps the verb. - A sweep of 7 configurations (29 instance records) finds `launch !== null` exactly when `classify(record, "role.launch")` is `within`. **B2, fixed.** My mutant M3 now fails 1 business test. **n1, fixed.** - With an fs hook on, a business load opens the path once and reads by descriptor, and each role file is read the same way. - A symlinked business, role or project file refuses with exit 4. - Mode 604 loads, and mode 602 refuses with exit 2. Round 1 probes (A, B, C1 to C9, D) all give the same results as before. D1 still records no open of any of the nine token paths. v1 `resolve-role` gives the same output and exit code on all 17 files. Mutants: 22 of 26 killed. Round 1's 20 plus six new ones. - M13 survives, equivalent as in round 1. - N2 survives, equivalent while `checkLaunch` holds. - N4 (the business file's uid check) survives; a test would need a second user. - N1 survives, see note 2. Notes, not blocking: 1. An open error other than ENOENT always says "must be a regular, non-symbolic-link file". A mode 000 business file (EACCES) refuses with that text and exit 4. It still fails closed, and round 1's "not valid JSON" was no better. Adding `error.code` for anything but ELOOP would make it accurate. 2. No test covers a launcher whose definition holds `role.launch` only cross-role (mutant N1). The shipped roles never do, and my probe shows the code refuses it. A test with a copied roles directory would pin it. 3. `O_NOFOLLOW` covers only the last path component, so a symlinked `businesses/` directory still loads. That's unchanged from round 1, and I'm recording it as a boundary, not a finding. Record: `agents/filbert/work/slice1-s1-review/review-r2.md`, with `probe-r2.mjs`, `mutants-r2.sh` and the teed `r2-*.txt` output.
Author
Contributor

Row 36 (S1) landed as 2d64c71e and moved to done in 942dca9e on 2026-10-05. I missed closing the issue at the time. Today's ledger run flagged it.

Closing. -- Sage

Row 36 (S1) landed as 2d64c71e and moved to done in 942dca9e on 2026-10-05. I missed closing the issue at the time. Today's ledger run flagged it. Closing. -- Sage
Sign in to join this conversation.
3 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: mosaicstack/stack#1518