Skip to content

qa(checklist): re-point 36 stale access-security, api-backend and approvals items to what main does - #33400

Queued
objectstack-fleet[bot] wants to merge 3 commits into
mainfrom
claude/project-thread-v8xylo
Queued

objectstack-fleet[bot] wants to merge 3 commits into
mainfrom
claude/project-thread-v8xylo

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Leehom · project thread

domain:devx#4 · os-project-manager · session_01FEkQ5kHpQrXX5yTHRb5h4F

Fixes #33332

Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:[sweep] v18.4.0 release test sweep #32908 收尾的 C 批,测试清单三个区(access-security、api-backend、approvals)共 36 个条目的文字按 main 上的源码改了口径,覆盖账本 38 行,加上从 E 批转来的第 85 行 api-backend 一半,共 39 行。只改这三个 JSON 文件。
  • 为什么改:v18.4.0 那轮 QA 记下的「清单写错了、产品是对的」:拒绝码和状态码、控制台点按钮实际走的门(动作门 /api/v1/actions/…)、审批请求页落在哪个应用下、跑测试需要的运行时夹具、长大了的计数(路由账本 16 个、退役定义 249 条)。不改,下一轮 QA 会把正确的产品判成失败。
  • 风险与回滚:只改清单文字,不动产品代码;每个条目升一版并加一条历史记录。两条反例按设计放宽了口径(status-mirror-field negative[2]、ooo-delegation-reroute negative[3]),见 Acceptance notes。回滚即还原本 PR。
  • 先看:approvals.request-page-reply-and-reader-visibility(第 102 行):main 上普通成员已经能读 sys_approval_request([Decision] Should an approver be able to see and decide their pending approvals over MCP? #32442 裁决 1B),所以 404 那条腿不再需要临时授权;再看 approvals.record-page-decisions(第 159 行)acceptance[2] 的 clause 改了措辞。
  • 两分钟验证:pnpm check:platform-checklist,预期退出码 0。
  • 需要你做的:无,席位落地。

What changes

docs/qa/platform-checklist/areas/access-security.json (16 items), api-backend.json (9 items) and approvals.json (11 items), text only. Each item gets exactly one revision bump and one history row citing #33332, the QA record(s) the row came from, and the base it was read at (fca5f89c). No other file.

Every row was re-measured from source on origin/main fca5f89c before its edit. None turned out already right as a whole (row 211's knownGaps half was), none needs a live drive to settle, and none needs a ruling, so there are no needs_decision rows.

row # item disposition evidence on main
5 access-security.ai-service-account-agent-ceiling re-pointed current-user-endpoints.ts credentials session-only (L632); rest-route-ledger.ts L427 POST /api/v1/security/explain; explain-engine.ts L852 principalKind; task.object.ts sharingModel public_read_write (L24)
15 approvals.account-app-entry re-pointed ui/apps/console/src/pages/system/ApprovalsInboxPage.tsx L715-L737 requestPagePath via objectHostAppSegment (ui/packages/app-shell/src/utils/objectHostApp.ts L71-L84); spec system/platform-locales.ts L26 zh-Hans 简体中文; showcase objectstack.config.ts L192 supportedLocales en, zh-CN
22 approvals.account-app-entry re-pointed ui/apps/console/src/components/RootLandingRedirect.tsx L19-L23, L133-L136 (one visible non-Setup app lands in it; two or more land on /home)
24 access-security.walled-environment-metadata-operator-only re-pointed examples/app-showcase/package.json L33 @objectstack/organizations; packages/spec/src/kernel/manifest.zod.ts L336-L409 reverse-domain id rule
25 access-security.no-active-org-session-semantics re-pointed app-showcase permission-sets.ts showcase_member_default: showcase_project/showcase_account allowCreate false, showcase_task/private_note create true; task.object.ts L38 project masterDetail required; plugin-audit audit-writers.ts L1295 telemetry datasource
31 access-security.permission-set-package-resolution re-pointed app-showcase permission-sets.ts showcase_member_default object list (no showcase_contact); NOT_OVERRIDABLE in error-code-ledger.zod.ts L758
33 api-backend.automation-namespace-address re-pointed app-showcase automation/flows/index.ts showcase_batch_reminders variables tasks isInput (L944-L959); plugin-hono-server adapter.ts L1440 adds HEAD to Allow
35 access-security.credential-use-audit-row re-pointed plugin-audit credential-use-audit.ts L304-L322: metadata {credential_kind, credential_id, used_at, ip_address_absent}; ip_address/user_agent columns
36 api-backend.client-sdk-namespace-address re-pointed client package-addressing.test.ts (30 it( sites, each-loops expand them; QA #32940 read 83 at 5fb79bc)
56 api-backend.api-methods-verb-gate re-pointed spec data/api-derivation.ts L135-L155 restore/purge derive from delete
57 api-backend.retired-def-refusal re-pointed spec migrations/entries/retired-defs: 249 files (53 17., 196 18.); kernel/manifest.zod.ts ManifestSchema strictObject has no loading key; ai/agent.zod.ts L363 lifecycle retiredKey
58 api-backend.aggregate-contract-matrix re-pointed spec data/query.zod.ts L99-L118 withRefusalHead (#32279): head as message, prescription as hint
69 access-security.activation-write-operator-gate re-pointed platform-objects sys-metadata-activation.object.ts L206-L208 apiMethods ['get','list'] (verb gate only)
75 approvals.status-mirror-field re-pointed plugin-approvals status-mirror-cascade.integration.test.ts L8-L14 (the flow fires user-less; since #3760 its data operations are refused) and L388-L400 (dead-run release: cascaded stays falsy)
85 api-backend.automation-namespace-address re-pointed (api-backend half; routed from batch E #33331, automation.json half stays with E) same as row 33: steps[2] body now {"params":{"tasks":[]}}
98 access-security.share-link-landing-page re-pointed ui/apps/console/src/App.tsx L338 Route /s/:token; packages/cli/src/utils/console.ts L55 CONSOLE_PATH /_console
100 access-security.security-catalog-one-holder-and-boot-report re-pointed plugin-security catalog-reference-report.ts L115 LOGGED_LIMIT 50 on grant ids (L590), set names via nameCounts; clean-boot logger.info L675
102 approvals.request-page-reply-and-reader-visibility re-pointed plugin-security objects/default-permission-sets.ts L625 member_default, L856-L872 sys_approval_request allowRead (#32442); plugin-approvals request-read-gate.ts L1-L60; lint validate-security-posture.ts L155 security-owd-unset; plugin-security objects/sys-user-permission-set.object.ts L84-L113
132 access-security.capability-declaration-lifecycle re-pointed runtime domains/permission-set-clone.ts L69-L93: source in read-only package X lands in X.custom
134 approvals.quorum-m-of-n re-pointed examples/app-showcase/src/data/objects/expense-report.object.ts L164-L199 (expense_report and merchant required, amount required, category optional, line status options submitted/approved/rejected)
136 approvals.inbox-metadata-actions re-pointed ui/packages/app-shell/src/utils/approvalOverride.ts L81-L85 isOverrideOnlyViewer, L147-L151; ui/packages/app-shell/src/utils/apiActionDoor.ts L18-L31; plugin-approvals sys-approval-request.object.ts L620-L636, L789-L794 type api targets
138 approvals.decision-action-matrix re-pointed plugin-approvals approval-service.ts L10295-L10312 (first_response carries no decision_progress); examples/app-showcase/src/data/objects/project.object.ts L141-L149 spent_within_budget
156 api-backend.route-ledger-live-parity re-pointed git ls-files '*route-ledger.ts' = 16 files; rest-route-ledger.ts 20 distinct families incl. recycle-bin (L395) and user-work (L459)
157 approvals.notification-deep-link re-pointed ui/apps/console/src/pages/system/ApprovalsInboxPage.tsx L715-L737 requestPagePath; ui/packages/app-shell/src/utils/objectHostApp.ts L71-L84 objectHostAppSegment (asked-from app, else owner app, else Setup)
158 approvals.ooo-delegation-reroute re-pointed plugin-approvals lifecycle-hooks.ts L805-L823 bindDelegationWriteGuard FORBIDDEN 403 (no admin exemption); plugin-security objects/default-permission-sets.ts grants no sys_approval_delegation line
159 approvals.record-page-decisions re-pointed ui/packages/app-shell/src/utils/apiActionDoor.ts L18-L31; ui/packages/app-shell/src/hooks/useRecordApprovals.ts L581-L640 seedRecordApprovals (#27627); rest-route-ledger.ts L381 POST /data/:object/:id/page; showcase project.object.ts L141-L149
161 approvals.sla-escalation re-pointed plugin-approvals approval-service.ts L4622 DUPLICATE_REQUEST per object/record; service-automation subflow-guards.ts L299-L309 toggle refuses a runtime-authored flow 409 RESOURCE_CONFLICT
180 access-security.public-form-withdrawal-layers re-pointed RUNNER.md L184-L201 customization-pair recipe; metadata-protocol protocol-packaged-base-refusal.ts packagelessOverlayWriteRefusal; dogfood showcase-public-form-withdrawal-layers.dogfood.test.ts L32-L38 saves into the pair
181 access-security.security-catalog-activation-and-clone-doors re-pointed rest error-response.ts L645 details carries candidates only; core package-scoped-resolution.ts L406 internal reason
187 api-backend.action-activation-door-contract re-pointed runtime domains/actions.ts L187-L191 (parts.length over 3 declined after the gates); dispatcher-plugin.ts L2198 addressed 4-segment mount; route-ledger.ts L804-L805
188 api-backend.rest-crud-config-contract re-pointed examples/app-showcase declares no apiEnabled:false object; qa/dogfood rest-config-contract-live.dogfood.test.ts L193-L198 sox_hidden OBJECT_API_DISABLED
189 approvals.decision-only-via-service re-pointed examples/app-showcase/src/security/seed-approval-demo.ts L70, L376 admin holds finance and legal; flows/index.ts L1369-L1377 dual_signoff unanimous over both positions; plugin-approvals approval-service.ts L5158-L5167 isApprovalSatisfied
195 api-backend.package-rest-lifecycle re-pointed service-package package-table.ts L95, L177, L204 PRIMARY KEY (id, version); runtime domains/packages.ts L2160-L2203 GET /packages lists registry.getAllPackages()
197 access-security.record-view-read-audit re-pointed plugin-audit read-audit.test.ts L338 + describe L605 (once per cause) pin negative[0]; dogfood record-view-read-audit pin constructs new AuditPlugin()
199 access-security.suggested-binding-loop re-pointed lint validate-security-posture.ts L1488-L1504 isDefault high-privilege refusal; plugin-security suggested-audience-bindings.test.ts L325
200 access-security.agent-ceiling-set-assignment-refusal re-pointed no lint/build rule names mcp_agent_* outside spec ai/mcp.zod.ts L253 (git grep packages/lint/src packages/spec/src)
201 access-security.share-link-capability-tokens re-pointed app-showcase demo-personas.ts L118-L122 usr_showcase_phone_demo; positions.ts L85-L88 showcase_client_liaison; no seed binds it
211 access-security.walled-environment-metadata-operator-only re-pointed (personas); knownGaps[1] half already right plugin-auth auth-manager-organization-plugin.ts L335 + core posture-ladder.ts L15 (auto-org-admin-grant); knownGaps[1] already says install-local is scored from the pins
261 access-security.readonly-package-locks-studio re-pointed ui app-shell studio-design/StudioDesignSurface.tsx L6306-L6330 formViewReadOnly (override saved into the pair)

Why

The card's readings are from the v18.4.0 sweep's QA records (the #32908 ledger names each one) and were not driven live. The source on main confirms each, with three places where main had moved past the record:

  • Row 102: the run's runtime-grant recipe for acceptance[2]'s 404 leg is no longer needed. Since [Decision] Should an approver be able to see and decide their pending approvals over MCP? #32442 (ruling 6849636735, 1B) member_default grants every internal member read on sys_approval_request, and the request read gate narrows the rows (default-permission-sets.ts, request-read-gate.ts), so the stock non-participant member drives the 404 leg itself. The runtime grant recipe moved to the reader leg's scratch object, where it is still needed.
  • Row 134: the record said the expense line needs merchant, category and status. On main only merchant and amount (plus the report) are required; category is optional and status defaults to submitted. The step names the source fields, and the record's 400 for status pending (not an option).
  • Row 195: the record suggested a new clause (the manifest served after a restart equals the last one written). That is coverage, not a re-point, so it is recorded in the history row and left for a coverage pass.

Tests

No test added or changed: the diff is checklist text. Nothing to ablate (os-dev.md: docs are not ablated).

Acceptance notes

Verification

On head b4df2eaa (branch claude/project-thread-v8xylo, merge base origin/main fca5f89c), the list from node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (16 commands), each exit code captured before any pipe:

16 derived, 16 run, all exit 0; --ran reconciliation exit 0
node scripts/check-adr-links.mjs :: exit 0
node scripts/check-adr-links.mjs --self-test :: exit 0
node scripts/check-closing-keyword-parity.mjs :: exit 0
node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0
node scripts/check-comment-mask-corpus.mjs :: exit 0
node scripts/ci/plan-test-core-shards.mjs --self-test :: exit 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0
pnpm check:ci-filter-parity :: exit 0
pnpm check:cross-package-test-inputs :: exit 0
pnpm check:doc-authoring :: exit 0
pnpm check:driver-memory-census :: exit 0
pnpm check:gitlink-declared :: exit 0
pnpm check:nul-bytes :: exit 0
pnpm check:platform-checklist :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:watch-hint-literal :: exit 0

check:doc-formula-expressions needs @objectstack/lint built in a fresh worktree; built first with pnpm --filter "@objectstack/lint..." build (exit 0).

dispatch-gates --ran: "16 derived famil(ies) accounted for — 16 run, 0 NOT-MEASURED", exit 0. --tier: no path-derived mandate; 451 changed lines, under the 3000 human-merge threshold.

No package is touched, so there is no package build, test, typecheck or scoped pnpm lint owed; every other family is CI's and is read from this PR's check-runs.


Generated by Claude Code

🤖 Generated with Claude Code

https://claude.ai/code/session_01FEkQ5kHpQrXX5yTHRb5h4F

…s a non-reader gets as 404

approvals.request-page-reply-and-reader-visibility acceptance[1], approvals.quorum-m-of-n
steps[4] and approvals.decision-action-matrix acceptance[6] expected 403 FORBIDDEN from a
caller who cannot read the request. ApprovalService.refuseUnreadableRequest answers that
caller REQUEST_NOT_FOUND (404) before any slate or submitter check, so the request's
existence never leaks; 403 stays the answer to a reader who holds no slot. Each item gets
a revision bump and a history row.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FEkQ5kHpQrXX5yTHRb5h4F
…rovals items to what main does

Each item's text is re-read from source on main and re-pointed where the
v18.4.0 sweep found it stale: the refusal codes and statuses a caller now
meets, the doors a console click actually posts, the app a request page
opens under, the runtime fixtures a run needs, and counts that grew (route
ledgers, retired definitions). Two negatives read the design now: the
status mirror's user-less cascade fails only if its data operation lands,
and a forged delegation may be refused at the object gate as well as by
the delegation guard. One revision bump and one history row per item.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FEkQ5kHpQrXX5yTHRb5h4F
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:devx#4 · os-project-manager · session_01FEkQ5ooRyyS95kdyC2dPEX

席位核对 · ACCEPT · head b4df2eaa · 2026-11-14T18:54Z

  • 形态: draft → main, attribution first, Fixes #33332. Paths from the PR's file list: docs/qa/platform-checklist/areas/access-security.json (+150/-54), docs/qa/platform-checklist/areas/api-backend.json (+78/-34), docs/qa/platform-checklist/areas/approvals.json (+88/-47). No governed path, no packages/spec/src/**, Clause-②: no ⇒ no contract-review face; lane seat lands.
  • Diff read: 36 items re-pointed across access-security.json, api-backend.json and approvals.json (38 batch-C rows plus ledger row 85's api-backend half from checklist: re-point 21 stale items in integration-system, automation, area-level recipes (v18.4.0 sweep close-out, batch E of #32908) #33331), one revision bump and one history row per item; the api-backend.error-envelope-ledger INVALID_FILTER face is untouched (no hit in the diff). Seat spot-check on origin/main: default-permission-sets.ts L872 grants sys_approval_request allowRead: true to member_default ([Decision] Should an approver be able to see and decide their pending approvals over MCP? #32442), so row 102's 404 leg needs no runtime grant, as re-pointed.
  • 门禁 check-runs (head b4df2eaa): 51 runs · 28 success · 23 skipped · 0 not green; TypeScript Type Check success, Lint & Repo Gates success. K = 0 merges behind main (< 15).
  • Changeset: skip-changeset holds: the touched paths ship in no package.
  • 接受的偏差: two negatives now read the design instead of a stricter wording, each still failing on the bad behaviour: approvals.status-mirror-field negative[2] (the user-less mirror fires the flow by design; the FAIL is a data operation landing, refused since The #1888 user-less fail-open is wider than the lint that guards it — record-change flows fired by a system write run UNSCOPED, unlinted #3760) and approvals.ooo-delegation-reroute negative[3] (a forged delegation is refused 403 at the object gate before the delegation guard; an accepted foreign-delegator write is still the FAIL). Branch restarted by merging origin/main rather than a force-push.
  • 范围外去向: Acceptance notes only; nothing routed out. The INVALID_FILTER face stays with the maintainer ruling. Skills-docs: not owed (Metadata-protocol: none).
  • 落地条款: non-governed, all checks green ⇒ the seat readies and arms auto-merge. Ruling-ref: the maintainer's standing authorisation 「按照 pm-dispatch 规则复核过的都授权」 (2026-10-25T11:35Z) and 「你应该使用 pm-dispatch 技能审核和落地pr」 (this account's project).

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review November 14, 2026 18:54
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Nov 14, 2026
Any commits made after this event will not be merged.

This branch has not been deployed

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

Labels

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

Projects

None yet

Development

Successfully merging this pull request may close these issues.

checklist: re-point 36 stale items in access-security, api-backend, approvals (v18.4.0 sweep close-out, batch C of #32908)

1 participant