From 0ed4fbab9b8e2ddfbb79cad51a5b1d72e573d9cb Mon Sep 17 00:00:00 2001 From: Jason Woltje Date: Fri, 23 Oct 2026 14:33:28 -0500 Subject: [PATCH] row284: migrate playground get tests under mos-1330 (unrun) --- agents/della/work/queue-284/BUILD.md | 105 ++++++++++++++++++++++++++ packages/library/tests/query.test.mjs | 14 +++- 2 files changed, 115 insertions(+), 4 deletions(-) create mode 100644 agents/della/work/queue-284/BUILD.md diff --git a/agents/della/work/queue-284/BUILD.md b/agents/della/work/queue-284/BUILD.md new file mode 100644 index 000000000..22bb8bea4 --- /dev/null +++ b/agents/della/work/queue-284/BUILD.md @@ -0,0 +1,105 @@ +# Row284 C2-05c — supporting scope and served-tree blob (#1789) + +Owner Della; reviewer Dewey; gate Sage. Build start sage-3658/3660 (10-23). +Branch della/row284. Original prerequisite base Honker28346bad7ea3; +merge fc05bcbc3 carries22423816cf28 and2164f3fbc25a intact. Only conflict was +CLI thread-launch's added footer tests: retained both full test bodies and +assertions. No prerequisite code copied. Every prerequisite needs its own +review/mutants/landing under mos1351; rebase after283 lands. + +## Execution status + +UNTESTED. No Node, node--check, test or mutant run before Sage CLEAR. First +own commit is the authorized old-test migration; the implementation follows. +Sage authorizes an immediate untested push. No queue write or shared-log edit. +224 stays first;284 is critical to Bubba288. T4 for224 is not a CLEAR yet. + +## Binding readings + +Brief C2-05c at94c33a43c:1737-1789, Q226, sage2918 and mos1330 item3. +get defaults canon; explicit playground/supporting opt-in; mismatch null. +Sort full outgoing/incoming lists supporting, playground, canon before paging, +keep cross-scope links and universe filter. Manuscript stays canon/playground. +No all/array scope, write tool, guard, mapping or creative-name-count change. + +## mos-1330 old-test migration (separate commit) + +All paths below are packages/library/tests/query.test.mjs. Baseline file at +fc05bcbc3 matches216's file. Source assertions retained; negative calls receive +explicit scope too, so universe isolation cannot pass on default-scope denial. + +Call/assertion 348 -> 348: + +```js +// OLD + const rin = await get(s, { universe: 'idea', path: 'Drafts/New World/Characters/Rin.md' }); +// NEW + const rin = await get(s, { universe: 'idea', path: 'Drafts/New World/Characters/Rin.md', scope: 'playground' }); +``` + +Call/assertion 350 -> 350: + +```js +// OLD + assert.equal(await get(s, { universe: 'harbor', path: 'Drafts/New World/Characters/Rin.md' }), null); +// NEW + assert.equal(await get(s, { universe: 'harbor', path: 'Drafts/New World/Characters/Rin.md', scope: 'playground' }), null); +``` + +Call/assertion 366 -> 366: + +```js +// OLD + assert.equal(await get(src(ref, mapping(WITH_BLEND)), { universe: 'blend', path }), null); +// NEW + assert.equal(await get(src(ref, mapping(WITH_BLEND)), { universe: 'blend', path, scope: 'playground' }), null); +``` + +Call/assertion 367 -> 367: + +```js +// OLD + const own = await get(src(ref), { universe: 'harbor', path }); +// NEW + const own = await get(src(ref), { universe: 'harbor', path, scope: 'playground' }); +``` + +Assertion 349 retained, OLD == NEW: + +```js + assert.equal(rin.scope, 'playground'); +``` + +Assertion 368 retained, OLD == NEW: + +```js + assert.equal(own.scope, 'playground'); +``` + +The null assertions at350 and366 are the complete OLD/NEW expressions above: +expectation remains null. Added one separate no-scope playground-get -> null +behavior test. It is unrun and expected to expose old get behavior until the +new scope implementation lands. This migration is authorized by mos1330 under +mos1272; no check removed or weakened. Dewey checks this list in manifest review. + +## 283 surface and blob choice + +Inspected actual46bad7ea3: optional editor.user is present. reader's parsed +file records and index entries still discard tree oid. In owned query.mjs use +the existing bounded listTree(repo, servedCommit) to obtain exact path oid, +not HEAD and not a user-supplied revision expression. No reader/index edit. +Tradeoff: one additional bounded tree listing per get; latency unmeasured. +Recheck after rebasing to283's actual landing. + +## Intended owned paths + +query.mjs; broker.mjs lookup branch; tools.mjs lookup schemas/descriptions; +library query.test.mjs/query-fixture.mjs; bus library-lookups.test.mjs; +harness library-tools.test.mjs; this BUILD.md. Other files are prerequisites. + +## Gate + +Dewey manifest approval, whole library/bus/harness suites and every +scripts/test-*.sh on Sage gate. Before review grep all package tests for enum +pins and canon/playground pairs. Keep shared logs out; send receipts to Sage. +No test or mutant evidence claimed. Manifest/digest follows complete code. diff --git a/packages/library/tests/query.test.mjs b/packages/library/tests/query.test.mjs index 0c884705b..d73e1f092 100644 --- a/packages/library/tests/query.test.mjs +++ b/packages/library/tests/query.test.mjs @@ -345,9 +345,9 @@ test('PRD 1.14: a draft universe has no canon, so its lookups return files only assert.ok(found.results.every(r => r.scope === 'playground' && r.universe === 'idea' && r.book === null)); const hits = (await search(s, { universe: 'idea', text: 'draft', scope: 'playground' })).results; assert.equal(hits.length, 2); - const rin = await get(s, { universe: 'idea', path: 'Drafts/New World/Characters/Rin.md' }); + const rin = await get(s, { universe: 'idea', path: 'Drafts/New World/Characters/Rin.md', scope: 'playground' }); assert.equal(rin.scope, 'playground'); - assert.equal(await get(s, { universe: 'harbor', path: 'Drafts/New World/Characters/Rin.md' }), null); + assert.equal(await get(s, { universe: 'harbor', path: 'Drafts/New World/Characters/Rin.md', scope: 'playground' }), null); }); test('PRD 1.14: library_universe on a draft returns its kind, name and prefixes', async t => { @@ -363,7 +363,13 @@ test('PRD 1.14: library_universe on a draft returns its kind, name and prefixes' test('a hybrid gets a source playground file as null, while the source gets it with scope playground', async t => { const ref = scratchRepo(t, FILES); const path = 'Book One/Playground/What If.md'; - assert.equal(await get(src(ref, mapping(WITH_BLEND)), { universe: 'blend', path }), null); - const own = await get(src(ref), { universe: 'harbor', path }); + assert.equal(await get(src(ref, mapping(WITH_BLEND)), { universe: 'blend', path, scope: 'playground' }), null); + const own = await get(src(ref), { universe: 'harbor', path, scope: 'playground' }); assert.equal(own.scope, 'playground'); }); + +// mos-1330 item3: the new get contract defaults to canon even for an explicit playground path. +test('C2-05c get without scope returns null for a playground path', async t => { + const s = src(scratchRepo(t, FILES)); + assert.equal(await get(s, { universe: 'harbor', path: 'Book One/Playground/What If.md' }), null); +});