Skip to content

test(dogfood): pin access-security checklist clauses at the oracle's layer, slice 3 - #26905

Merged
objectstack-fleet[bot] merged 9 commits into
mainfrom
claude/project-thread-czmdl5
Oct 27, 2026
Merged

objectstack-fleet[bot] merged 9 commits into
mainfrom
claude/project-thread-czmdl5

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Warren · project thread

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 记录 QA run · release-18.2.0-w2-tier1-a (73/73) · 756220c4 · 2026-10-27 · 13 PASS / 60 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN #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 qa(checklist): access-security — pin the Tier 1 clauses the 18.2.0 sweep scored partial at the layer their oracle names (18 items) #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

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

…s layer (#26571)

Items: rls-both-sides, write-path-guards, crud-permission-matrix,
owd-sharing-matrix, fls-mask-and-strip. Each item's automated.ref names
the new cases, revision bumped, history row cites the card.

Claude-Session: https://claude.ai/code/session_01JQwxbWKBLcQCG7FBS17aMA
Co-authored-by: Claude <noreply@anthropic.com>
…layer, slice 2

Slice 2 covers anonymous-deny-surfaces, public-form-withdrawal-layers,
activation-write-operator-gate, platform-owner-email-anchor and
record-view-read-audit: two pins extended, three new isolated pins,
and each item's automated.ref, revision and history updated. No
product code changes.

Claude-Session: https://claude.ai/code/session_01JQwxbWKBLcQCG7FBS17aMA
Co-authored-by: Claude <noreply@anthropic.com>
…layer, slice 3

Slice 3 covers anonymous-floor-v18-doors,
meta-authoring-trail-and-audience-gates,
security-catalog-activation-and-clone-doors,
security-catalog-one-holder-and-boot-report and
grant-table-write-contract: four pins extended, four new isolated
pins, each item's automated.ref, revision and history updated, and
automated.kind set to dogfood where the ref now leads with a dogfood
pin. No product code changes.

Claude-Session: https://claude.ai/code/session_01JQwxbWKBLcQCG7FBS17aMA
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 27, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

Nothing 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): node scripts/docs-audit/affected-docs.mjs --json c4a4aefcb01e1dd4d335c86c69a0be076199c39f → packageMentionDocs.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

维护者速读

  • 改了什么:access-security 区第 3 批共 5 条清单项(v18 匿名底线各入口、元数据视图受众门的替代入口、安全目录激活与克隆入口、同名只能一个持有者与启动报告、授权表写入契约)。新增 4 个 dogfood 测试文件,扩充 4 个已有文件,在接口和日志层钉住 14 个 PARTIAL 条款。8 条清单项的 automated、修订号和历史行已更新,其中包括把第 2 批三条的 kind 更正为 dogfood。
  • 为什么改:18.2.0 Tier 1 扫描把这些条款判为 PARTIAL。原有钉子停在路由处理器、引擎或假日志器这一层,没有断言真实 HTTP 回答和真实启动日志。
  • 风险与回滚:只加测试和清单文字,不改产品代码,不加 CI 通道,也不动依赖和 lockfile。回滚 = revert 本 PR。
  • 先看:security-catalog-one-holder-http.dogfood.test.ts。它先启动一次干净库,再重启植入了 51 条悬空授权的同一库,读取真实进程输出,断言 ERROR 行和 50 条上限。之后看 meta-view-audience-alternate-doors.dogfood.test.ts 的 ETag 重放对照。
  • 两分钟验证:node scripts/check-platform-checklist.mjs,退出 0。
  • 需要你做的:无,席位落地。余下 3 条由第 4 片派发。
  • 席位意见:每个拒绝都配了能通过的对照,例如管理员读得到、合法窗口返回 201、管理员自己的 ETag 返回 304,所以不会把入口不存在误判为拒绝。

席位核对

ACCEPT · domain:devx#1 · session_01JQwxbaFpnMwgpCgneKe2qS · head 6f533694e3 · 2026-10-27T20:41Z

  1. Shape: 9 files, +658/−17.
    • docs/qa/platform-checklist/areas/access-security.json.
    • Four new isolated files: anonymous-floor-v18-doors, meta-view-audience-alternate-doors, grant-table-write-contract, security-catalog-one-holder-http.
    • Four extended files: catalog-activation-door, permission-set-clone-door, permission-set-assignment-window, showcase-anonymous-deny-surfaces.
    • Not governed (check-governed-merges --pr 26905, 675 lines ≤ 3000).
    • File surface as in claim 6445125819. Refs #26571 (slice 3 of 4).
    • No package.json or lockfile change: @objectstack/cloud-connection and @objectstack/verify are already dogfood dependencies.
  2. Read by the seat: the whole diff.
    • Every refusal reads its control. The admin's GET serves each v18 door, except /keys, whose GET is the domain's 405, as the file says. A valid window answers 201 beside the inverted one. The admin's own If-None-Match answers 304 beside the member's replay. Refused writes are re-read from the store as absent.
    • The boot-report case boots one database file twice. It plants 51 grants that name no catalog set and asserts the ERROR line with "more": 1.
    • SHARED_SHOWCASE: the only shared file touched is showcase-anonymous-deny-surfaces, and its new leg is an admin GET, so it is read-only.
    • The 201 control lands in permission-set-assignment-window, an isolated file, as its last case. The new files are isolated by path.
  3. Gates:
    • Head check-runs on 6f533694e3: 35 success, 16 skipped, 0 failing.
    • check-expected-skips --pr 26905: OK, all 16 in main's roster.
    • Mergeable clean.
    • Thread's local run: 127/127 on the 8 files, dogfood typecheck exit 0, dispatch-gates 55/55 exit 0 with --ran reconciled, check-platform-checklist OK.
    • Report 6452716070.
  4. Accepted deviations:
    • automated.kind → dogfood on security-catalog-one-holder-and-boot-report too, beyond the three slice-2 items. Its rewritten ref now leads with dogfood pins, which is the same correction.
    • The dogfood battery does not run on pull_request or merge_group, so these pins first run on main's next full battery. A red there is main-red, and this seat stanches it.
  5. Out of scope:
    • grant-table-write-contract acceptance[4] stays the walled-boot leg (knownGaps).
    • security-catalog-one-holder-and-boot-report acceptance[3] stays the CLI's in-process integration test, which the build oracle accepts.
    • Slice 4 takes parent-and-organization-write-guards, deployment-tables-platform-only and share-link-combined-gates.
    • Skills-docs: not owed.
  6. Landing: not governed, CI green on this head, mergeable clean ⇒ the seat readies it and arms auto-merge through the relay. The card stays pm:dispatched for slice 4.

Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

size/l skip-changeset PR has no user-facing published change; bypasses the changeset gate tests

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants