Repository navigation
Commit 9f40488
test(dogfood): pin access-security checklist clauses at the oracle's layer, slice 3 (#26905)
<!-- claude-projects-attribution: {"github_login":"os-warren"} -->
_Requested by **Warren** · [project
thread](https://claude.ai/code/project/chan_01U5RdnAAmkSQmZbqh6FtqZ8?thread=cmsg_01U5RdnAAmkSQmZbqh6FtqZ8YSjPf3hTSLEBa52VUBikb4)_
Refs #26571 (slice 3 of 4, items:
access-security.anonymous-floor-v18-doors,
access-security.meta-authoring-trail-and-audience-gates,
access-security.security-catalog-activation-and-clone-doors,
access-security.security-catalog-one-holder-and-boot-report,
access-security.grant-table-write-contract)
Clause-②: no
Metadata-protocol: none
## 维护者速读
- 改了什么:给 access-security 区第三批 5 个清单条目补上 dogfood 断言(进程内 HTTP 与启动日志,即这些条款
oracle 指定的层),共钉住 14 条此前只在单元层或靠手跑的条款;扩写 4 个现有用例文件,新增 4 个隔离用例文件。8
个条目的清单记录更新:本批 5 个的 `automated.ref` 逐条款改写,另外按席位要求把第二批 3 个条目(以及本批
one-holder 条目)的 `automated.kind` 从 `unit` 改成 `dogfood`;每个条目 `revision`
加一、`history` 记本卡。
- 为什么改:18.2.0 Tier 1 记录 #26468 把这 5 条判为
PARTIAL:错误码、管理员对照、备用读入口和启动日志都只在单元层或手跑。
- 风险与回滚:只加测试和改清单文字,不动产品代码,不加 CI 通道。回滚即 revert 本 PR。
- 先看:① `meta-view-audience-alternate-doors.dogfood.test.ts`(受限视图在
/published、/layers、?state=draft、/history 各入口的拒绝,以及 ETag 回放不得 304);②
`security-catalog-one-holder-http.dogfood.test.ts`(install-local
重名拒绝与启动日志 50 条上限);③ `access-security.json` 的 kind 改动。
- 两分钟验证:`cd packages/qa/dogfood && pnpm exec vitest run
test/meta-view-audience-alternate-doors.dogfood.test.ts`(需先按 dogfood 惯例
build 依赖闭包),预期 `Tests 8 passed`。
- 需要你做的:无,席位落地。余下 3
条(parent-and-organization-write-guards、deployment-tables-platform-only、share-link-combined-gates)在第
4 片。
## What changes
Each clause is pinned at the layer its oracle names. `api` is the
in-process HTTP stack of `@objectstack/verify`, and `log` is the process
output captured across a boot. All changes are in
`packages/qa/dogfood/**`, with no product code changes. Every new
assertion was written against today's behaviour and is green.
| item | clauses newly pinned | where |
|---|---|---|
| anonymous-floor-v18-doors | acceptance[1], [2] (admin leg), [3], [4] |
New `anonymous-floor-v18-doors` (isolated). Each of steps[0]'s six doors
answers an anonymous caller 401 with `UNAUTHENTICATED` or
`AUTH_REQUIRED`. The admin's same GET is served 200 on every door except
`/keys`, which serves POST alone and answers the admin's GET 405. A
bogus share-link token gets a 4xx that is not 401. An anonymous form
submit that forges `owner_id` and `status` answers 201 with exactly `{
id }`, and neither forged value is stored.
`showcase-anonymous-deny-surfaces` gains the admin leg of the retired
`/docs` comparison, which is read-only and stays in the shared project |
| meta-authoring-trail-and-audience-gates | acceptance[2], negative[0] |
New `meta-view-audience-alternate-doors` (isolated). The admin saves a
scratch list view gated on `manage_users`, plus a draft. A
`setup.access`-only member does not see it in `GET /meta/view` and gets
403 `PERMISSION_DENIED` on the plain read, `/published`, `/layers` and
`?state=draft`. On `/history` that member gets 403 `FORBIDDEN` first,
while a `studio.access` member gets the audience refusal
`PERMISSION_DENIED`. The admin reads every door. When the member replays
the admin's ETag, the answer is 403, never 304, beside the control that
the admin's own replay is a 304 |
| security-catalog-activation-and-clone-doors | acceptance[2], [3] |
`catalog-activation-door`: switching off `everyone` or `guest` is
refused 400 naming the anchor, and no row is written.
`permission-set-clone-door`: the source's own name is 409
`RESOURCE_CONFLICT`. A closed body (a key missing, or an extra key) is
400 `VALIDATION_FAILED` and nothing is saved. An anonymous caller is 401
|
| security-catalog-one-holder-and-boot-report | acceptance[1], [2], [4]
| New `security-catalog-one-holder-http` (isolated). `POST
/marketplace/install-local` with an inline manifest redeclaring
`showcase_auditor` answers 422 `PLUGIN_REGISTER_FAILED`, naming the set
and `com.example.showcase`, and `GET /packages` is unchanged. A
permission-set save whose body `packageId` names another package answers
400 `VALIDATION_ERROR` at `packageId`. The boot log, captured across two
boots of one database file: the clean boot logs one INFO line; after 51
grants naming no catalog set are planted, the next boot logs one ERROR
line with the grant ids capped at 50 (`more: 1`) |
| grant-table-write-contract | acceptance[1], [2], [3] | New
`grant-table-write-contract` (isolated), over `POST
/data/sys_user_permission_set`. `permission_set_id` gets 400
`INVALID_FIELD`. A duplicate grant gets 409 `UNIQUE_VIOLATION`. A grant
naming someone else as `granted_by` stores the admin.
`permission-set-assignment-window` gains the authored message, the
absence of the `unevaluable` constraint, and the valid-window 201
control |
Ledger:
- The five items each get a rewritten `automated.ref` that maps clauses
to cases, `revision` +1, and a `history` row citing #26571.
- As the seat's slice-3 order asks, activation-write-operator-gate,
platform-owner-email-anchor and record-view-read-audit move from
`automated.kind` `unit` to `dogfood`. Each gets `revision` +1 and a
history row; their refs are unchanged.
- security-catalog-one-holder-and-boot-report moves to `dogfood` too,
because its rewritten ref now leads with the dogfood pins. The order
named only the three slice-2 items, so this one is a deviation, listed
below.
Clauses left as they are, each with its reason in the item's
`automated.ref`:
- Every item's acceptance[0] is the pin run itself (`test` oracle).
- security-catalog-one-holder-and-boot-report acceptance[3] is pinned
in-process by the cli's integration test, which the `build` oracle
accepts.
- grant-table-write-contract acceptance[4] is the walled-boot leg
(knownGaps), scored from the engine pin.
## Tests
Head `abf45d31`, before the final no-overlap merge of main, ran the
eight touched files under `os-verify-lock`: `Test Files 8 passed (8)`,
`Tests 127 passed (127)` (`VERDICT command-exit 0`). `pnpm --filter
@objectstack/dogfood typecheck`: exit 0. The merge that followed brought
in only `plugin-auth`'s set-manager change, other area ledgers and
unrelated dogfood files. The full dogfood battery is CI's.
## Acceptance notes
- anonymous-floor-v18-doors: `GET /api/v1/keys` answers the admin 405
`METHOD_NOT_ALLOWED`, because the dispatcher registers every verb on
`/keys` (#23909) and the domain serves POST alone. The admin control
there is therefore omitted, and the anonymous 401 is the floor's by the
same argument the item's knownGaps makes.
- meta-authoring-trail-and-audience-gates: the scratch view's column is
`title`. A `name` column is refused at author time
(`list-view-field-unknown`), because `showcase_task` has no `name`
field.
- security-catalog-one-holder-and-boot-report: the scratch package id is
`com.example.qa-one-holder`, because install-local refuses an underscore
in a package id with 400 `PLUGIN_MANIFEST_INVALID` before registration.
## Verification
Local gate subset on head `6f533694` (origin/main merged): `node
scripts/pm/dispatch-gates.mjs --commands --repo
objectstack-ai/objectstack` derives 55 families. All 55 ran and exited
0, and `--ran` reconciles `55 derived famil(ies) accounted for — 55 run,
0 NOT-MEASURED`. Repository-wide scans (`pnpm lint`, the full dogfood
battery) are CI's.
`node scripts/check-platform-checklist.mjs`: `check-platform-checklist:
OK — 16 areas, 329 items (324 active, 1 planned)`.
Changeset: none. `@objectstack/dogfood` is private and `docs/qa/**`
ships in no package, so this PR carries `skip-changeset`.
Template note: `.github/PULL_REQUEST_TEMPLATE.md`'s `Why` section is
folded into 维护者速读 and What changes. Its Human Minimum items: 1 n/a (no
spec); 2 yes; 3 no formatter ran, and `pnpm lint` is left to CI; 4 yes;
5 n/a (publishes nothing); 6 n/a; 7 yes; 8 yes.
---
_Generated by [Claude
Code](https://claude.ai/code/session_01JQwxbWKBLcQCG7FBS17aMA)_
---------
Co-authored-by: Claude <noreply@anthropic.com>1 parent d887aa9 commit 9f40488
9 files changed
Lines changed: 658 additions & 17 deletions
File tree
- docs/qa/platform-checklist/areas
- packages/qa/dogfood/test
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
262 | 262 | | |
263 | 263 | | |
264 | 264 | | |
| 265 | + | |
| 266 | + | |
| 267 | + | |
| 268 | + | |
| 269 | + | |
| 270 | + | |
| 271 | + | |
| 272 | + | |
| 273 | + | |
| 274 | + | |
| 275 | + | |
| 276 | + | |
| 277 | + | |
265 | 278 | | |
266 | 279 | | |
267 | 280 | | |
| |||
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
| |||
| 1 | + | |
| 2 | + | |
| 3 | + | |
| 4 | + | |
| 5 | + | |
| 6 | + | |
| 7 | + | |
| 8 | + | |
| 9 | + | |
| 10 | + | |
| 11 | + | |
| 12 | + | |
| 13 | + | |
| 14 | + | |
| 15 | + | |
| 16 | + | |
| 17 | + | |
| 18 | + | |
| 19 | + | |
| 20 | + | |
| 21 | + | |
| 22 | + | |
| 23 | + | |
| 24 | + | |
| 25 | + | |
| 26 | + | |
| 27 | + | |
| 28 | + | |
| 29 | + | |
| 30 | + | |
| 31 | + | |
| 32 | + | |
| 33 | + | |
| 34 | + | |
| 35 | + | |
| 36 | + | |
| 37 | + | |
| 38 | + | |
| 39 | + | |
| 40 | + | |
| 41 | + | |
| 42 | + | |
| 43 | + | |
| 44 | + | |
| 45 | + | |
| 46 | + | |
| 47 | + | |
| 48 | + | |
| 49 | + | |
| 50 | + | |
| 51 | + | |
| 52 | + | |
| 53 | + | |
| 54 | + | |
| 55 | + | |
| 56 | + | |
| 57 | + | |
| 58 | + | |
| 59 | + | |
| 60 | + | |
| 61 | + | |
| 62 | + | |
| 63 | + | |
| 64 | + | |
| 65 | + | |
| 66 | + | |
| 67 | + | |
| 68 | + | |
| 69 | + | |
| 70 | + | |
| 71 | + | |
| 72 | + | |
| 73 | + | |
| 74 | + | |
| 75 | + | |
| 76 | + | |
| 77 | + | |
| 78 | + | |
| 79 | + | |
| 80 | + | |
| 81 | + | |
| 82 | + | |
| 83 | + | |
| 84 | + | |
| 85 | + | |
| 86 | + | |
| 87 | + | |
| 88 | + | |
| 89 | + | |
| 90 | + | |
| 91 | + | |
| 92 | + | |
| 93 | + | |
| 94 | + | |
| 95 | + | |
| 96 | + | |
| 97 | + | |
| 98 | + | |
| 99 | + | |
| 100 | + | |
| 101 | + | |
| 102 | + | |
| 103 | + | |
| 104 | + | |
| 105 | + | |
| 106 | + | |
| 107 | + | |
| 108 | + | |
| 109 | + | |
| 110 | + | |
| 111 | + | |
| 112 | + | |
| 113 | + | |
| 114 | + | |
| 115 | + | |
| 116 | + | |
| 117 | + | |
| 118 | + | |
| 119 | + | |
| 120 | + | |
| 121 | + | |
| 122 | + | |
| 123 | + | |
| 124 | + | |
| 125 | + | |
| 126 | + | |
| 127 | + | |
| 128 | + | |
| 129 | + | |
| 130 | + | |
| 131 | + | |
| 132 | + | |
| 133 | + | |
| 134 | + | |
| 135 | + | |
| 136 | + | |
| 137 | + | |
| 138 | + | |
| 139 | + | |
| 140 | + | |
| 141 | + | |
| 142 | + | |
| 143 | + | |
| 144 | + | |
| 145 | + | |
| 146 | + | |
| 147 | + | |
| 148 | + | |
| 149 | + | |
| 150 | + | |
| 151 | + | |
0 commit comments