|
|
|
@@ -8,7 +8,7 @@ Base: 94c33a43c on branch `scrooge/row285`.
|
|
|
|
|
|
|
|
|
|
- The code, tests, fixtures and docs are written locally. No test has run. Sage's order puts row 252 first at the next CLEAR, and nothing runs during another seat's slot.
|
|
|
|
|
- The Results section is empty until that run. Nothing below claims a pass.
|
|
|
|
|
- Mos ruled the mos-1272 points in mos-1332 (18:55Z). See "Old tests" below.
|
|
|
|
|
- Mos ruled the mos-1272 points in mos-1332 (18:55Z). mos-1333 (19:04Z) withdrew item 3, the business.mjs publish fence. See "Old tests" below.
|
|
|
|
|
|
|
|
|
|
## What changes
|
|
|
|
|
|
|
|
|
@@ -22,7 +22,7 @@ Base: 94c33a43c on branch `scrooge/row285`.
|
|
|
|
|
- `vocabulary.mjs` drops CREATIVE_KINDS and adds CREATIVE_ACTIONS (`message.send`, `library.write`) and CREATIVE_SERVICE (`gitea`).
|
|
|
|
|
- `role.mjs` checkCreative refuses a creative role that holds any withinRole action outside CREATIVE_ACTIONS, any crossRole action, or any credential service other than gitea.
|
|
|
|
|
- `broker.mjs` #giteaRole (:2138) also refuses the chief of staff with `gitea-not-declared` (sage-2921).
|
|
|
|
|
- `business.mjs` (near :166, clear of :283-291, which row 287 owns): a chief-of-staff or creative instance that names `publish` refuses at load (mos-1332 item 3).
|
|
|
|
|
- business.mjs does not change (mos-1333 item 1). The fence added in 5f81d0da0 is removed in a later commit, so the branch's business.mjs equals the base.
|
|
|
|
|
|
|
|
|
|
## Rulings
|
|
|
|
|
|
|
|
|
@@ -45,6 +45,13 @@ Base: 94c33a43c on branch `scrooge/row285`.
|
|
|
|
|
- **sage-2937:** if Mos rules (b), business.mjs joins the files owned, scoped to the refusal near :166 and clear of :283-291 (row 287, Megavolt).
|
|
|
|
|
- **webby-0174:** each changed expected value carries Mos's ruling key. The load fence needs a design line, its own test, a mutant and a grep of the tests for the N10 text.
|
|
|
|
|
- **mos-1332:** the mos-1272 rulings, items 1-5, cited under "Old tests". The ROUTED commit and the landing still wait on Jason's yes on PRD 1.16 (Q32, Vikunja 546). The build, the gate and Webby's review go ahead.
|
|
|
|
|
- **mos-1333:** withdraws mos-1332 item 3, since the fence contradicted the brief (:1825, :1829, :1839, and row 287's chief publish ["books"] at :1998). Items 1, 2, 4 and 5 stand.
|
|
|
|
|
- The fence leaves business.mjs in a new commit, no force-push. business.mjs leaves the manifest and its fence mutants are dropped.
|
|
|
|
|
- business.test "row 285: a creative instance with identity and publish loads" is back in its 8c529fb4d form.
|
|
|
|
|
- N10 takes option (a). See "Old tests" item 3.
|
|
|
|
|
- A new named test: a chief with its gitea ref, identity and publish ["stack"] loads.
|
|
|
|
|
- Row 287 has nothing to reshape. Its binding note below still applies.
|
|
|
|
|
- **sage-2946:** the bus suite runs whole (broker.mjs is in the manifest and bus tests read roles/chief-of-staff.json), plus the cli example readers. Item 2 is answered below under "Scopes field required".
|
|
|
|
|
|
|
|
|
|
## Scopes rule evidence (sage-2915 q2)
|
|
|
|
|
|
|
|
|
@@ -54,6 +61,10 @@ The only other tokenCreate caller is the admin rotate (`gitea-grant.mjs:331`), w
|
|
|
|
|
|
|
|
|
|
The creative declaration therefore equals SEAT_SCOPES. The chief's read declaration would be narrower than a minted token. #giteaRole refuses the chief, so no grant path mints the chief a token at the landing commit.
|
|
|
|
|
|
|
|
|
|
### Scopes field required (sage-2946 item 2, Megavolt's question)
|
|
|
|
|
|
|
|
|
|
role.mjs refuses a gitea credential entry with no scopes. `{"service": "gitea"}` goes through checkGiteaScopes (role.mjs:100-111), which calls `requireDistinctList(scopes, "gitea scopes", ..., {nonEmpty: true})`. util.mjs:42 refuses a non-array with "gitea scopes must be an array". Only a `host` entry may omit scopes (role.mjs:134). So every gitea entry names its scopes, and for a minted token they must equal SEAT_SCOPES (sage-2915).
|
|
|
|
|
|
|
|
|
|
### Binding note for row 287 (C2-21)
|
|
|
|
|
|
|
|
|
|
- The library read grant row must mint the chief's declared scopes (`read:repository`, `read:user`) and not SEAT_SCOPES.
|
|
|
|
@@ -107,10 +118,10 @@ Data only, with one named exception listed under "Old tests".
|
|
|
|
|
New named tests (mos-1330 item 1):
|
|
|
|
|
|
|
|
|
|
- business.test "row 285: a chief or creative instance without credentials.gitea refuses at load". Each case refuses with the checkCredentialMap "(gitea; got none)" message, and a positive control loads.
|
|
|
|
|
- business.test "row 285: a creative instance with gitea, identity and publish refuses at load" (mos-1332 item 3). Identity alone loads, and publish refuses with the fence message.
|
|
|
|
|
- agent-identity.test "row 285: an instance whose definition has no gitea refuses publish with the N10 text" (mos-1332 item 3). An assistant instance with identity and publish refuses with the plain N10 message, anchored at the end so the fence message doesn't match. This keeps the "no gitea definition" branch covered.
|
|
|
|
|
- business.test "row 285: a creative instance with identity and publish loads" (brief :1825, :1839, restored by mos-1333 item 2). The grant still refuses it at raise (#giteaRole).
|
|
|
|
|
- agent-identity.test "row 285: a chief with its gitea reference, identity and publish loads" (mos-1333 item 4, brief :1829). It also checks the chief's credentials are exactly gitea.
|
|
|
|
|
|
|
|
|
|
## Old tests (mos-1272, ruled in mos-1332)
|
|
|
|
|
## Old tests (mos-1272, ruled in mos-1332 and mos-1333)
|
|
|
|
|
|
|
|
|
|
Webby (webby-0174) passes each item only with Mos's ruling key next to it.
|
|
|
|
|
|
|
|
|
@@ -121,20 +132,21 @@ Webby (webby-0174) passes each item only with Mos's ruling key next to it.
|
|
|
|
|
2. **`packages/business/tests/role.test.mjs`** (mos-1332 item 2, accepted). checkCreative checks the service and not the scopes (webby-0178 N1). The scopes are pinned by the load test, which deepEquals each of the six creative role files' credentials to `[{service: "gitea", scopes: ["read:user", "write:repository"]}]`, so a widened scope in any one file is red.
|
|
|
|
|
- The six-creative-roles load test now pins withinRole `[message.send, library.write]` and credentials `[{gitea, [read:user, write:repository]}]` exactly. Old: `[message.send]` and `[]`.
|
|
|
|
|
- The M1 block checked record.write and one crossRole case. It now loops over every routed action outside CREATIVE_ACTIONS, keeps the crossRole refusal, and adds the vikunja and host credential refusals. The refusal text changes from "may hold only withinRole message.send" to "may hold only withinRole message.send and library.write".
|
|
|
|
|
3. **`packages/business/tests/agent-identity.test.mjs:49-50` (N10)** (mos-1332 item 3, option (b) widened to the creative definitions). N10 is unchanged.
|
|
|
|
|
- Fence in business.mjs near :166: a chief-of-staff or CREATIVE_DEFINITIONS instance with `publish` refuses with `<at>.publish needs identity and a gitea definition (<definition> never publishes)`.
|
|
|
|
|
- The literal "chief-of-staff" follows mos-1332's wording. business/src exports no chief constant (STAFF_TO is broker.mjs:240), so I left it as is (webby-0178 N2, optional).
|
|
|
|
|
- Wording: the message starts with the N10 text, so the :50 regex still matches, and the reason follows in parentheses.
|
|
|
|
|
- Design line: on refactor today, a chief or creative instance with identity and publish refuses at load because neither definition declares gitea. After 285 both declare gitea for the library alone, so the fence keeps today's refusal and adds no new policy. #giteaRole refuses both at raise (mos-1163 for the creative ones, sage-2921 for the chief).
|
|
|
|
|
- Grep of `packages/*/tests/*` for "needs identity and a gitea definition": only agent-identity.test :47, :48 and :50, plus the two new tests. No other reader.
|
|
|
|
|
- New tests: see the named tests above. Mutants M7-M9 below.
|
|
|
|
|
3. **`packages/business/tests/agent-identity.test.mjs:49-50` (N10)** (mos-1333 item 3, option (a); replaces mos-1332 item 3). After 285 the chief's definition declares gitea, so the old second case no longer refuses. Only the fixture instance and the instance name in the regex change. The text after the name is unchanged.
|
|
|
|
|
- Old: `refuses(() => check((d) => { d.roles.chief.identity = structuredClone(IDENTITY); d.roles.chief.publish = ["stack"]; }),` / `/roles\.chief\.publish needs identity and a gitea definition/);`
|
|
|
|
|
- New: `refuses(() => check((d) => { d.roles.helper = { definition: "assistant", holder: "mos", identity: structuredClone(IDENTITY), publish: ["stack"] }; }),` / `/roles\.helper\.publish needs identity and a gitea definition/);`
|
|
|
|
|
- The standalone helper test added in 5f81d0da0 is removed. The fence and its business.test change are reverted.
|
|
|
|
|
- Grep of `packages/*/tests/*` for "needs identity and a gitea definition": only agent-identity.test :47, :48 and :52. No other reader.
|
|
|
|
|
- Mutant M9 below.
|
|
|
|
|
4. **`packages/business/tests/instance-settings.test.mjs:289`** (mos-1332 item 4, accepted). Old: `{ services: [], accepted: true }`. New: `{ services: ["gitea"], accepted: true }`. If the :298 listing changes at the run, the exact new value goes here and Webby hears about it. Anything that removes or weakens a check goes back to Mos.
|
|
|
|
|
5. **Other fixture edits** (mos-1332 item 5): data only, no ruling needed.
|
|
|
|
|
|
|
|
|
|
## Commit plan
|
|
|
|
|
|
|
|
|
|
1. Role files, contracts, vocabulary, role.mjs, broker #giteaRole, gitea-grant.test and role.test, plus this file.
|
|
|
|
|
2a. The mos-1332 commit: the business.mjs publish fence, its two tests, instance-settings.test:289 and this file.
|
|
|
|
|
2a. The mos-1332 commit (5f81d0da0): instance-settings.test:289 and this file. Its business.mjs fence and two fence tests are reverted by the mos-1333 commit.
|
|
|
|
|
2b. The webby-0178 commit (d79cfe674): B1, B2 and notes.
|
|
|
|
|
2c. The mos-1333 commit: the fence removed, business.test restored, N10 option (a), the named chief test and this file.
|
|
|
|
|
2. The fixture commit (mos-1330): helpers.mjs, chief-of-staff.test, business.test (fixture refs and the two new named tests), the loader fixtures above, the example json and README. Mos ruled the old-test points in mos-1332.
|
|
|
|
|
3. The 1.16 commit: `library.write` in ACTIONS and ROUTED in both `business/src/vocabulary.mjs` and `bus/src/broker.mjs`, citing the PRD 1.16 paragraph (row #1796), with a hard-waits test that it is routed. It's held until Jason's yes and 1.16 lands.
|
|
|
|
|
|
|
|
|
@@ -152,9 +164,9 @@ Kill rules are written before the runs. Each mutant is one edit, then a restore,
|
|
|
|
|
| M4 | drop the crossRole check | role.mjs checkCreative | role.test M1 crossRole refusals |
|
|
|
|
|
| M5 | creative role file without library.write | roles/companion.json | role.test creative-load test |
|
|
|
|
|
| M6 | chief scopes widened with write:repository | roles/chief-of-staff.json | chief-of-staff.test "the shipped file is exactly the approved list" |
|
|
|
|
|
| M7 | drop `entry.definition === "chief-of-staff"` from the publish fence | business.mjs | agent-identity.test N10 :50 (the chief then loads) |
|
|
|
|
|
| M8 | drop `CREATIVE_DEFINITIONS.includes(entry.definition)` from the fence | business.mjs | business.test "row 285: a creative instance with gitea, identity and publish refuses at load" |
|
|
|
|
|
| M9 | drop `\|\| !services.includes("gitea")` from the N10 check | business.mjs | agent-identity.test "row 285: an instance whose definition has no gitea refuses publish with the N10 text" |
|
|
|
|
|
| M9 | drop `\|\| !services.includes("gitea")` from the N10 check | business.mjs:166 | agent-identity.test N10's helper case :51-52 (mos-1333 item 5) |
|
|
|
|
|
|
|
|
|
|
M7 and M8 targeted the withdrawn fence and are dropped (mos-1333 item 1). M9 mutates a file outside the manifest only to show the N10 test still guards it.
|
|
|
|
|
|
|
|
|
|
## Manifest
|
|
|
|
|
|
|
|
|
@@ -162,7 +174,6 @@ Source and roles:
|
|
|
|
|
- packages/business/src/vocabulary.mjs
|
|
|
|
|
- packages/business/src/role.mjs
|
|
|
|
|
- packages/bus/src/broker.mjs (#giteaRole only, sage-2921)
|
|
|
|
|
- packages/business/src/business.mjs (the publish fence near :166 only, sage-2937, mos-1332 item 3)
|
|
|
|
|
- roles/{companion,ideas,research,proofreader,fact-checker,continuity}.{json,md}
|
|
|
|
|
- roles/chief-of-staff.{json,md}
|
|
|
|
|
|
|
|
|
@@ -178,7 +189,7 @@ Tests:
|
|
|
|
|
- packages/business/tests/resolve.test.mjs
|
|
|
|
|
- packages/bus/tests/creative.test.mjs
|
|
|
|
|
- packages/cli/tests/launcher.test.mjs
|
|
|
|
|
- packages/business/tests/agent-identity.test.mjs (one test appended, mos-1332 item 3)
|
|
|
|
|
- packages/business/tests/agent-identity.test.mjs (N10 :51-52 and one named test, mos-1333 items 3 and 4)
|
|
|
|
|
|
|
|
|
|
Docs:
|
|
|
|
|
- packages/business/examples/mosaic-stack.example.json
|
|
|
|
@@ -190,6 +201,7 @@ Docs:
|
|
|
|
|
- `git grep CREATIVE_KINDS -- packages roles scripts` is empty. Checked locally.
|
|
|
|
|
- Grep the tests for `gitea-not-declared`, and for 64-hex pins on broker.mjs and each changed role file.
|
|
|
|
|
- Run business.test, stack-release.test, stack-release-external.test and stack-upgrade.test whole, since they read the example json (webby-0178 B2).
|
|
|
|
|
- Run the bus suite whole (sage-2946 item 1): broker.mjs is in the manifest, and these bus tests read roles/chief-of-staff.json by name: chief-of-staff, fire-revokes-grants, host-run, instances-verb, names, reload, routes-verb. Sage listed five. A git grep finds the seven.
|
|
|
|
|
- Run each fixture-importing suite whole: the business suite, the bus suite, the cli suite, `scripts/test-config.sh` and every `scripts/test-*.sh`, with TMPDIR under /mnt/storage/scratch/tmp.
|
|
|
|
|
- Sage confirms the result against mos-1309 item 5.
|
|
|
|
|
|
|
|
|
|