Repository navigation
fix(dogfood): the wall CONTROL cases' packages declare the CRM dependency and their publish lines read the receipt - #24777
Conversation
…ency and their publish lines read the receipt
The walled `CONTROL: the platform operator writes at every one of these
doors` case and the `single (CONTROL)` case each published a draft list
view bound to `crm_lead` into a package that declared no dependency on
`com.example.crm`. Under the ruled closure narrowing each publish answers
200 with `success: false, outcome: refused, publishedCount: 0`
(`list-view-object-outside-closure`), and the status-only `ok()` read it
as a write, so neither CONTROL could fail at the publish-drafts door.
Each package now declares `dependencies: { [CRM_PKG]: '*' }` at
`POST /packages`, and each publish line asserts the receipt in `data`
(`success: true`, `outcome: 'published'`, `publishedCount: 1`) with
`failed[]` as the message, the form the /packages case already uses.
The view names stay on `crm_lead`; no other line changes.
Claude-Session: https://claude.ai/code/session_01LmjU2x1faLZ39DVTFyVca6
Co-authored-by: Claude <noreply@anthropic.com>
📓 Docs Drift CheckNothing in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 0 changed package(s)), so this run has no opinion about the docs. What this run could not see
Coarse fallback — 0 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
席位核对 · ACCEPT
Accepted deviations:
Out-of-scope dispositions (one line each):
Landing: through the merge queue by this seat once every check on this head reads Generated by Claude Code |
Fixes #24725
Clause-②: no
The two CONTROL cases of
packages/qa/dogfood/test/wall-environment-metadata-refusal.dogfood.test.tsthat PR #24724 held off now publish for real and assert it. They are the walledCONTROL: the platform operator writes at every one of these doorscase (both postures,isolatedandgroup) and thesingle (CONTROL)case. Before this change, each one'spublish-draftswas refused with a200, and the status-onlyok()read that refusal as a write.The ruled closure narrowing (PR #24630,
9f12d06770) is unchanged, as are every save-door and publish rule, every other case in this file (the/packagescase PR #24724 changed included), and every other dogfood file. This PR changes one test file and nothing else.What changes (two cases, one file, +19 / -4)
POST /packagesnow sendsdependencies: { [CRM_PKG]: '*' }, whereCRM_PKGis the file's existing constant forcom.example.crm(examples/app-crm'smanifest.id). This coverscom.em.PREFIX.opctl(walled) andcom.em.sin.a(single).data. The receipt must read{ success: true, outcome: 'published', publishedCount: 1 }, withfailed[]as the assertion message. The form is copied byte for byte from the/packagescase. It stays inline rather than moving into a helper, so the/packagescase's lines stay untouched and a failure points at each case's own line.crm_lead(crm_lead.em_PREFIX_pkgv,crm_lead.em_sin_pv), so no later line changes.ok()stays status-only for every other line.Evidence
Every run used the same command,
pnpm exec vitest run --maxWorkers=2 test/wall-environment-metadata-refusal.dogfood.test.tsinpackages/qa/dogfood, under the shared verify lock.pnpm turbo run build --filter=@objectstack/dogfood --concurrency=2: 66/66 tasks, the dogfood gate's own build target.isolated,group) and thesinglecontrol in one run. That is how the gate'sturbo run test --filter=@objectstack/dogfoodexecutes it, sinceOS_TEST_SHARDonly slices whole files. So one run covers every variant the gate runs.scripts/ablation-replace.mjsin WRAP mode. Each was restored and proven hash-equal toHEAD: blob16c8fd8a2for R0,3bfd0b150for R2 to R4, withgit diff HEADempty.580fd4ed3(origin/main), with a log of each CONTROLpublish-draftsreceipt23 passed: the false green. All three receipts are200 {"success":false,"outcome":"refused","publishedCount":0,"failedCount":1,...}, each withlist-view-object-outside-closure:crm_lead.em_iso_pkgvintocom.em.iso.opctl,crm_lead.em_gro_pkgvintocom.em.gro.opctl, andcrm_lead.em_sin_pvintocom.em.sin.acff4ff61e, this change23 passedcff4ff61eplus the receipt log23 passed. All three receipts are200 {"success":true,"outcome":"published","publishedCount":1,"failedCount":0,...}, for the same three viewscff4ff61ewithdependenciesremoved from the two CONTROL packages only (the/packagescase keeps its own)3 failed / 20 passed. The failures are at the receipt assertion,:333:10(isolated and group) and:378:8(single). Received{ success: false, outcome: 'refused', publishedCount: 0 }. The message isfailed[]:view/crm_lead.em_sin_pv failed author-time validation: 1 issue — views[0].object [list-view-object-outside-closure](the same forem_iso_pkgvandem_gro_pkgv)cff4ff61eplus logs of the next doors23 passed. In both walled postures,duplicateanswers200withcopiedCount: 1, and the copy holdscrm_lead.em_PREFIX_pkgvasactive.DELETE /packages/com.em.PREFIX.opctlanswers200withdeletedCount: 1(the published view) andregistryRemoved: true, and the operator'sGETthen answers404. Undersingle, A'sDELETE /packages/com.em.sin.aanswers200withdeletedCount: 1, and nosys_metadatarow of the package remainsWhat the runs establish:
mainboth CONTROLs measured nothing at thepublish-draftsdoor (R0).manage_metadataholder below the operator, undersinglereally publish. A's create withdependenciesanswers201(R1, R2).Gates (local subset, on
cff4ff61e)tsc --noEmitinpackages/qa/dogfood:TSC_EXIT=0, and--listFilesincludes this file.node scripts/pm/dispatch-gates.mjs --commandsderived 55 families. 54 exit 0.pnpm check:dual-build-cjs-loadsexits 3 with PREREQUISITE NOT MET: it reads every package'sdist, and eight packages outside the dogfood closure are unbuilt locally. That family is NOT MEASURED locally, and CI'sLint & Repo Gatesreads it.--ranreconciliation:55 derived famil(ies) accounted for — 54 run, 1 NOT-MEASURED,0 UNRUN.pnpm lint(eslint . --no-inline-config):LINT_EXIT=0, no finding.main's hourly full battery, and the runs above are its pre-merge reading.Changeset
None.
skip-changesetapplies: the diff is one file underpackages/qa/dogfood/test/, and@objectstack/dogfoodis"private": true, so it publishes nothing.Acceptance notes
ok()still reads only the status for every other line of these two cases. R4 read the bodies ofduplicateandDELETEin addition, and both carry a success receipt. No other door's body was read here.single, A'sGET /packages/com.em.sin.aafter the delete answers403, not404. That is the read gate as written: package reads needstudio.accessorsetup.access(packages/runtime/src/domains/packages.ts), which A does not hold. It is not a line of this file.Generated by Claude Code