Repository navigation
Checklist maintenance from the identity-auth QA run (#7663): 5 item/oracle/fixture corrections for docs/qa/platform-checklist #7740
Description
Activity
Findings triage (grade): promoted —
findingremoved,pm:queuestays (resolves the filed dual pm-state). Scoped checklist/docs maintenance with named anchors — auto-queue class.Premise spot-check on
origin/main@8f1851e: item 1's spec-side half is live — the stale role vocabulary is still atpackages/spec/src/identity/organization.zod.ts:84-87("Common roles: 'owner', 'admin', 'member', 'guest'", repeated in the.describe(...)at :87). Routing note for the executor: that one doc-comment line ispackages/spectext (spec-surface territory); as filed the principal landing isdocs/qa/platform-checklist/areas/identity-auth.json⇒domain:devxstands, and the spec doc-comment can ride as the declared cross-surface line item the card already names.本评论来自分诊座位 Routine(#5474 试点),不构成认领。
Generated by Claude Code
huangyiirene commented
on Aug 11, 2026 CollaboratorAuthorMore actionsClaim: PM loop round 5 (devx seat, 2026-08-11 term) — wave 5 unit A(清单维护同类打包)
Session: session_01GZKbx4xyF7U5WXj6ch49BM
Branch:claude/issue-7740-checklist-run-notes-pack(pack:#7740+#7745+#7753+#7720,一 PR 四条 Fixes)
Worktree: cloud dev session(独立容器)
Domain: devx
File surface(本卡):docs/qa/platform-checklist/areas/identity-auth.json主落点 +packages/spec/src/identity/organization.zod.ts:84-87doc-comment rider(triage 已批随行,PR 正文声明跨面行项)
Container & model: mode:cloud / claude-opus-5
Serial constraints: 包内四文件两两不相交;coverage.json ⛔ 只读(#7347 独占)
Generated by Claude Code
huangyiirene commented
on Aug 11, 2026 CollaboratorAuthorMore actionsos-dev 主报告 — wave 5 unit A(清单维护同类打包:#7740 + #7745 + #7753 + #7720)
- PR: docs(qa,spec): checklist maintenance pack — identity-auth corrections, integration-system notes, studio-authoring records, the fixtures-recipe convention #7785(draft,base
main,4 行 Fixes) - Branch:
claude/issue-7740-checklist-run-notes-pack@b067379 - Session:
session_013GSfhABhmzsa8uA2fZCiXU/ mode:cloud / claude-opus-5 - 交付点: push + draft PR 已完成。CI 收敛、翻转、合并归 PM,本 seat 不等 CI、不 merge、未动 merge queue。
逐卡逐项完成情况
#7740 —
areas/identity-auth.json(5/5 落地) ·premise_still_valid: true(逐项见下)项 落点 before after 1 org-membership-team-management(step / clause / negative / source,rev 1→2)角色词表 {owner, admin, member, guest};source 引的正是那条陈旧 doc-commentADR-0108 闭集 {owner, admin, delegated_admin, member};新增「词表是闭的」条款(guest、stackposition、PermissionSet 名各被 400ROLE_NOT_FOUND拒于门外且不留行);source 改指membership-role.ts:116+ ADR-0108 +membership-role-vocabulary.dogfood.test.ts2 invitation-scope-gates(step 8 / 条款 / negative / source,rev 2→3)「返回的 role set 含 member 不含 admin」——不可断言 改为断言真实形状 { isTenantAdmin, scopes, placeableBusinessUnitIds, assignablePositions }(security-service.ts:92-105)与自作用域;邀请角色门交回条款 1–4;negative 拆开:over-report 才是 FAIL,under-report 是安全方向、禁止立案3 admin-lifecycle-operations(revoke step / 条款 / negative / source,rev 2→3)oracle 是 get-session状态码,期望 401oracle 改为受保护的 authed 请求(revoke 前 2xx、紧接一次被拒); get-session只作旁证并注明 200-with-null-body 约定,锚点session-of-record.test.ts:1654 teams-bu-membership(requires / knownGaps / step / 条款 / source,rev 1→2)knownGap:也许没有几何消费 BU 树,条款可能 blocked(fixture)gap 退休(保留为 retired 行不删): share_new_inquiries_with_field_ops展开bu_field_ops子树,条款照跑。换成 zero-seeded-placements 注记:全新 boot 只 seed 树、sys_business_unit_member零行,必须先放置、BEFORE 读预期为空5 identity-import-wizard(knownGaps /auto条款 / source,rev 1→2)无注记,fallback 缺席易被当缺陷 记录 auto的 temporary-fallback 分支在objectstack dev下不可达(两路 transport 恒注册;NODE_ENV=development 使两个可达性门都无法为假),写明什么样的 boot 才能触发,并指引用temporary策略覆盖同一凭据路径Rider(triage 已批,PR 正文单列跨面行项):
packages/spec/src/identity/organization.zod.ts:84-87的 doc-comment +:87的.describe()已修正。两处主动声明的外溢,请 PM 裁断是否收回:
- 同文件
InvitationSchema.role(:139)携带同一缺陷('admin','member','guest')。卡面只点名 :84-87。我一并修了——留着就等于给下一个读者留下这张卡要关掉的同一个坑;纯注释文本,零行为。PM 若要严格按锚点,单独 revert 这一段即可。 content/docs/references/identity/organization.mdx是从这些.describe()生成的,check:docs(build-docs.ts --check)是 CI 门禁,所以两行表格随之更新。本容器从未 install 过(无node_modules),无法跑真正的gen:schema+build-docs,因此是按生成器自身渲染路径手工对齐的:build-docs.ts:427原样输出 description,escapeMdxDescription只处理`/{/</|/\,新串一个都不含。这一处值得有构建树的人复核一眼——若 CI 的check:docs仍红,重跑生成器覆盖即可。
#7745 —
areas/integration-system.json(1 修正 + 3 注记) ·premise_still_valid: true项 落点 before after wire keys email-template-render(step / raw-send 条款 / negative / source,rev 3→4){ to, subject, bodyHtml }——实际被 400 "at least one of text or html is required"更正为 { to, subject, html | text }(SendEmailInput,email-service.ts:42-68);点明bodyHtml/bodyText是模板字段;加了「错词表探针」把两套词汇钉开,并加 NOT-a-FAIL negativesys_account 405 notify-inbox-delivery(requires / knownGaps,rev 1→2)三 persona 需求没写怎么造 记录 POST /api/v1/data/sys_account→ 405(managedBy better-auth、apiMethods ['get','list'],405 先于写守卫的 403,sys-account.object.ts:234-241),旧的「给 seeded persona 接一条凭据」配方已关闭;改指 sign-up /admin/create-userStudio flow 只读 flow-connector-picker(fixtures / knownGaps / step,rev 2→3)无注记 记录 ResourceEditPage的 artifact-backed 启发式 +flow的allowOrgOverride:false,指明可编辑路径是 console 自己的 create page,并交叉链接 objectui#4308(极性相反那一例才是缺陷)predicate multi:true webhook-lifecycle(requires / knownGaps / bulk step / source,rev 3→4)只写「需要 predicate multi-write path」 记录 REST 走不通是设计如此——#3897 把 options.multi剥离作为安全边界(rest-server.ts:10461-10492),bulk 条款需用 flowupdate_record/delete_record节点经 api trigger 触发#7753 —
areas/studio-authoring.json(+platform-core.json)(6/6 记录项) ·premise_still_valid: true项 落点 before after #7637 更正 org-override-registry-gate(knownGaps / source,rev 1→2)#7637 的观察原样留存 记录更正: OS_METADATA_WRITABLE=permission下徽标会清除、编辑器完全可写(GET /meta报overrideSource:'env',protocol.zod.ts:208),两个方向都被证过 → #7637 不得按原文行动publish-drafts 200 draft-publish-lifecycle(step / publish-drafts 条款 / negative,rev 2→3)条款按 HTTP 状态判 abort 改为按 data.success判(该门 abort 答 200 + success:false),原子性结论保留(abort 后两个名字都 404);状态码之争记为待一次明确裁决的 open ledger 项。⛔ 只记录不裁决,已在 negative 里写明 runner 不得据此判 FAILflow 路由注记 同 org-override-registry-gate(同一次 rev)— ResourceEditPage 行号 + objectui#4308 交叉链接 _diagnostics横幅authoring-validation-not-persisted(knownGaps / negative,rev 1→2)— 记录已知误报:保存成功的合法草稿上出现 "Unrecognized key(s): _diagnostics"(设计器对服务端自己的注解做了回读校验),并与真正的 located-error 缺失区分开stale ref A record-page-roundtrip(automated.stale/ 两条 clause verify / source,rev 1→2)两个 objectui spec 无 stale 标注 标为 stale-not-red 并写明具体原因( studio-record-page.spec.ts把 Object 控件当 input 填,实际已是role=combobox按钮;studio-editor.spec.ts指向已不存在的 "Layout" 标题 + 一个编辑器正确锁住的 shipped page),附 runner 规则:手工驱动、不得引用其输出、不得把其失败记为本项 FAILstale ref B platform-core.metadata-authoring-roundtrip(automated.stalepartial / clause 3 verify,rev 1→2)同上 仅标注 studio-record-page.spec.ts这一半;dogfood pin 与studio-object-designer.spec.ts明确不受影响#7720 —
docs/qa/platform-checklist/README.md·premise_still_valid: true(#7716 已合并,qa-scratch-authz在 main 上)Item anatomy 补齐 recipe 约定的两半:item-anatomy 代码块新增
fixtures.provisioning = { use, why };新增小节《Area-levelfixtures— one named provisioning recipe, many items》给出 area 级配方块完整形状(title/why/provenance/app/requires/sequence[{step, call, body, expect, source}]/teardown/knownGaps)+ item 侧引用 + 四条设计理由(运行时供给故 teardown 是唯一清理;每个调用引 frameworkfile:line;why是债务标记;opt-in 是把knownGaps改写成 CLOSED-by-recipe 而不是删掉)。option C(教校验器解析provisioning.use)按卡面 deliberately deferred,未做,并在 README 里写明「已推迟」及其后果(拼错的use由 review 而非check:platform-checklist兜住)。
验证
node scripts/check-platform-checklist.mjs→ 1 problem,即已知 base 红coverage.json · qa: UNCLASSIFIED(finding:check:platform-checklistis red onmain— the newqaliveness ledger is neither mapped nor waived in coverage.json #7347,并行修复中)。本 diff 引入的问题为零。每个被改动的 item 都 bump 了revision并追加history(校验器的 revision/history 检查要求)。node scripts/check-empty-changeset.mjs→ clean(1 declaring changeset);node scripts/check-changeset-no-major.mjs→ clean。docs/qa/platform-checklist/coverage.json未触碰 ——git diff --stat与本清单 1:1,无该文件行。
Changeset / 标签
清单与 README 属 docs,本可走
skip-changeset;但packages/specrider 确实改了已发布的.describe()文本,故附了@objectstack/specpatch 级 changeset(门禁是按标签而非按路径判的,这样两条路都成立)。docs 部分的skip-changeset标签仍归 PM 处理。跨仓 / 越界发现清单
- objectui — e2e spec 重指向(studio-authoring run notes: one correction to #7637, two stale
automated.refspecs, and three ledger/route observations #7753 item 6,report-don't-edit):e2e/live/studio-record-page.spec.ts(Object 控件已是role=combobox按钮)与e2e/live/studio-editor.spec.ts("Layout" 标题已移除 + 目标是编辑器正确锁住的 shipped page)需重指向当前 surface。本 PR 未改 objectui 任何文件,只在本仓把 staleness 记下来,止住每轮红跑。请 PM 转 objectui 车道。 - objectui#4308:artifact-backed 启发式极性相反的那一例(写入型 package 里的对象被判只读),本 PR 两处注记交叉引用它,并请接手者确认 flow 这一例保持正确。
- 越界但已修并声明:
InvitationSchema.roledoc-comment(同文件 :139,同一缺陷)—— 见上文 Checklist maintenance from the identity-auth QA run (#7663): 5 item/oracle/fixture corrections for docs/qa/platform-checklist #7740 rider 第 1 条。 - 需有构建树者复核:
content/docs/references/identity/organization.mdx的两行为手工按生成器渲染路径对齐(本容器无node_modules)—— 见 Checklist maintenance from the identity-auth QA run (#7663): 5 item/oracle/fixture corrections for docs/qa/platform-checklist #7740 rider 第 2 条。
⛔ 未 merge、未 auto-merge、未动 merge queue、未改
content/docs/releases/**、未git stash。
工作在专用 worktreeobjectstack-7740(容器内新建、推送后已回收),未在共享主检出上编辑。
Generated by Claude Code
- PR: docs(qa,spec): checklist maintenance pack — identity-auth corrections, integration-system notes, studio-authoring records, the fixtures-recipe convention #7785(draft,base
- added a commit that references this issue
on Aug 17, 2026
Summary
Consolidated checklist-maintenance edits falling out of the identity-auth FULL-area QA run (#7663). All five are edits to
docs/qa/platform-checklist/(primarilyareas/identity-auth.json) — checklist text / oracle / fixture-note corrections, not product fixes. Each item's product defect, where one exists, is filed separately.Items
org-membership-team-managementclause 1 (and its negative) name the wrong role vocabulary. The enforced builtin set is{owner, admin, delegated_admin, member}per ADR-0108 (BUILTIN_MEMBERSHIP_ROLE_OPTIONS, "nothing widens these at boot any more") — not{owner, admin, member, guest}.guestis actually rejected (400ROLE_NOT_FOUND), anddelegated_adminis legitimate. The stale spec doc-comment onMemberSchema.role(packages/spec/src/identity/organization.zod.ts:84-87, "Common roles: 'owner', 'admin', 'member', 'guest'"; the.describe(...)at line 87 repeats it) is probably where the checklist text came from — fix both the checklist clause and the spec doc-comment. (The spec doc-comment edit is apackages/specchange, so it may warrant its own tinydomain:specPR; the checklist clause is thedomain:devxpart.)invitation-scope-gatesclause 6 conflates two axes.DelegableScopemodels ObjectStack positions / permission sets / business units and has no field that could carry a better-auth org invitation role, so it can never "contain member". The delegate demonstrably can mint a member invitation while the endpoint reports an empty assignable set — it under-reports, never over-reports (the safe direction). The clause needs a revision, not a product fix.admin-lifecycle-operationsclause 4 should name the authed-request oracle, notget-session's status code. better-auth's no-session convention is 200-with-null-body, so the clause's literal 401 expectation misdescribes a correct implementation. The session was provably gone; the clause should assert against a protected authed request, notget-session's status.teams-bu-membership— retire theknownGap(a BU-consuming geometry does ship:share_new_inquiries_with_field_ops, so the clause runs) and add the zero-seeded-placements note: a fresh boot seeds the BU tree but zerosys_business_unit_memberrows, so the rule materializes nothing until a tester places someone (theseed-data-thintrap for this item). (Product defect from this clause filed separately as teams-bu-membership: sharing-rule revocation is lazy — a BU moved OUT of a shared subtree keeps read access until the shared record is next written #7729.)identity-import-wizard— add the fixture note that theautopolicy's temporary-fallback branch cannot occur onobjectstack dev: both transports always register anddev.tshard-setsNODE_ENV='development'soisPhoneOtpDeliverable()cannot be made false. Record as a fixture note so the next sweep does not re-derive it.Source
Extracted from the QA run #7663 (framework 92f26f7, console 09987b680).