Repository navigation
QA run · surface:mixed (86/86) · 316be321 · 2026-10-04 · 57 PASS / 5 PARTIAL / 24 FAIL / 0 BLOCKED / 0 NOT-RUN #21784
Description
Activity
objectstack-fleet commented
on Oct 5, 2026 ContributorAuthorMore actionsClose-out
Every
failhas a disposition re-derived by an independent verifier (RUNNER rule 7):Extracted: #21785 · integration-system.email-template-render · acceptance[5] Extracted: #21785 · integration-system.email-template-render · negative[0] Extracted: #21788 · integration-system.external-schema-browser-ui · acceptance[2] Extracted: #21793 · identity-auth.auth-method-matrix · acceptance[3] Extracted: #21790 · studio-authoring.object-designer-roundtrip · acceptance[0] Extracted: #21789 · access-security.permission-matrix-edit-loop · acceptance[1] Extracted: #21794 · access-security.packaged-permission-set-lifecycle · acceptance[5] Extracted: #21787 · records-forms.field-type-matrix · acceptance[3] Extracted: #21787 · records-forms.field-type-matrix · negative[2] Extracted: #21787 · records-forms.encrypted-field-behavior · negative[0] Extracted: #21791 · identity-auth.org-membership-team-management · acceptance[4] Extracted: #21791 · identity-auth.org-membership-team-management · negative[1] Extracted: #21792 · platform-core.settings-hub-roundtrip · outside the item's clauses Extracted: objectstack-ai/objectui#11628 · integration-system.external-schema-browser-ui · acceptance[1] Extracted: objectstack-ai/objectui#11628 · integration-system.external-schema-browser-ui · acceptance[3] Extracted: objectstack-ai/objectui#11628 · integration-system.external-schema-browser-ui · acceptance[4] Extracted: objectstack-ai/objectui#11628 · integration-system.external-schema-browser-ui · negative[0] Extracted: objectstack-ai/objectui#11628 · integration-system.external-schema-browser-ui · negative[4] Extracted: objectstack-ai/objectui#11630 · records-forms.field-group-visible-when · acceptance[3] Extracted: objectstack-ai/objectui#11633 · identity-auth.email-verification-loop · acceptance[2] Extracted: objectstack-ai/objectui#11634 · identity-auth.self-signup-gate · acceptance[3] Extracted: objectstack-ai/objectui#11631 · records-forms.cascading-multilevel-and-clear · acceptance[3] Extracted: #21795 · identity-auth.invitation-scope-gates · acceptance[4] Extracted: #21795 · identity-auth.org-membership-team-management · acceptance[6] Extracted: #21795 · identity-auth.org-membership-team-management · negative[0] Parked-on: #21797 · access-security.readonly-package-locks-studio · acceptance[2] Parked-on: #21797 · access-security.audit-log-browser · acceptance[0] Parked-on: #21797 · access-security.audit-log-browser · acceptance[4] Parked-on: #21797 · identity-auth.auth-method-matrix · acceptance[9] Parked-on: #21797 · identity-auth.workspace-org-switch · acceptance[5] Parked-on: #21797 · records-forms.cascading-options · acceptance[2] Parked-on: #21797 · records-forms.field-group-visible-when · acceptance[0] Parked-on: #21797 · automation.flow-run-step-nesting · acceptance[1] Parked-on: #21797 · automation.rollup-summary-filter · acceptance[4] Parked-on: #21797 · automation.flow-node-type-matrix · acceptance[0] Parked-on: #21797 · automation.flow-node-type-matrix · acceptance[1] Parked-on: #21797 · automation.trigger-type-matrix · acceptance[0] Parked-on: #21797 · platform-core.app-management-toggle · acceptance[5] Parked-on: #21797 · platform-core.app-management-toggle · negative[0]Known expected-fail, not re-filed:
api-backend.formula-stdlib-matrixacceptance[5] (#3306 class).Product defects
card from severity (verifier) owner note #21785 email-template-render A6 / N1 P2 objectstack a /metaemail-template save reverts on the next boot#21788 external-schema-browser-ui A3 P2 objectstack import under a new name: 500 "no such table", lost on restart #21793 auth-method-matrix A4 P3 objectstack no-SMS phone OTP → 500 empty body in production #21790 object-designer-roundtrip A1 P2 objectstack reorder-only publish is a silent no-op (also on 17.6.0) #21789 permission-matrix-edit-loop A2 P2, fails closed objectstack (+ objectui reader) writable / org-owned permission sets read and enforced as code-locked #21794 packaged-permission-set-lifecycle A6 P3 objectstack lock refusal has no userMessage; console shows generic text#21787 field-type-matrix A4 / N3, encrypted-field-behavior N1 P1 / high, authorization objectstack detail withheld pending maintainer (RUNNER rule 2) #21791 org-membership-team-management A5 / N2 medium, authorization objectstack detail withheld pending maintainer (RUNNER rule 2) #21792 found in settings-hub-roundtrip authorization objectstack detail withheld pending maintainer (RUNNER rule 2) objectstack-ai/objectui#11628 external-schema-browser-ui A2 / A4 / A5 / N1 / N5 P2 objectui external panel does not unwrap the {success,data}envelopeobjectstack-ai/objectui#11630 field-group-visible-when A4 P2 objectui record detail ignores field-group visibleWhenobjectstack-ai/objectui#11631 cascading-multilevel-and-clear A4 P2 objectui dependent lookup not cleared on parent change objectstack-ai/objectui#11633 email-verification-loop A3 low objectui verify page POSTs to a GET-only route objectstack-ai/objectui#11634 self-signup-gate A4 low objectui sign-up link shown when sign-up is disabled #21795 invitation-scope-gates A5, org-membership A7 / N1 low, UI courtesy objectstack (platform gap) invite / team actions offered to members the server refuses None is a 17.7 regression: every defect above reproduces against code unchanged since 17.6.0 (
617f25f8a/ objectui31971ff1e) or earlier. No open duplicate was found (nearest closed: #7733, #20107, #19397, #6039).Checklist-accuracy findings (no fail attached; for the checklist owner)
- access-security: readonly-package-locks-studio A2's code set omits
NOT_OVERRIDABLE(what a barePUT /meta/object/{packaged}answers;ITEM_LOCKEDonly with?package=). audit-log-browser rev 2's "no Action dropdown" is false (AuditLogPage has Action / Object / Actor / date filters). public-form-intake step 6's anonymous path is/_console/f/contact-us(/_console/forms/:nameis the authenticated form). sharing-rule-authoring-ui knownGap: two seeded rules, one onshowcase_contact. capability-declaration-lifecycle REGRANT must run on a clone (the packaged set is locked, Studio save of a package-declared permission set forks it into a silent, undiscoverable overlay #11513); surface is the/actionsdispatcher. fls-mask-and-strip step 6: the stockshowcase_client_liaisonalready serves the readable:false set;budget_remainingis on no form or layout. permission-matrix-edit-loop step 1: use member-owned tasks (RLS decides admin-owned ones); the Studio Access matrix is package-scoped. - identity-auth: auth-method-matrix: phone-OTP-without-SMS is reachable only under
NODE_ENV=production; device / OIDC-provider variants have no boot switch; discovery is also served under/api/v1/auth. admin-lifecycle A4–A6 assert ruled-not-built routes (impersonate_userandset_user_rolestill 403 every platform admin — neither route is safely raw-mountable, and each blocks for a different reason #9968 / finding: seven better-auth/admin/routes refuse platform admins and have no ObjectStack consumer — decide whether they are capability or just vendor surface #9969) and step 2list-usersis 403 by the same ruling. session-list-revoke step 4 needs the rawsession.token, and the cross-user list is the "All" tab. api-key surface is Account › Developer › Connect an Agent;showcase_taskdoes not discriminate RLS, usesys_user. invitation step 7: cancel as admin (delegated_admin holds onlyinvitation:["create"]). org-membership step 6: the nav label is static. email-verification A3 / step 4: the mailed link is the API GET (callbackURL=/lands on the server root), there is no POST variant. workspace-org-switch A4 holds only onisolated(group reads span orgs by design); wall postures need@objectstack/organizations,OS_PLATFORM_OWNER_EMAILandOS_AUTH_MEMBERSHIP_POLICY. self-signup / first-run: the audience gate answers before the toggle; only an invited forge reachesEMAIL_PASSWORD_SIGN_UP_DISABLED. oauth-consent: web clients need an https non-loopback redirect. identity-import: the auto-invite mail uses the password-reset template. A role-admininvitation needsaccept-invitationto grantorg_admin. - studio-authoring: object-designer step 4: the empty-row banner is the select-needs-options rule (feat(spec)!: FieldSchema refuses a select / radio with neither options nor picklist #21390). record-page step 1: type defaults to
list; no "Layout" section. lifecycle: history versions count draft saves (published revisions are 2 and 4), the diff is shallow,toVersion:1is the draft-create, stray keys are refused at draft save, the code isMETADATA_CONFLICT. validation A2: a flat body gets the "names no viewKind" prescription. expression fixturequantity * unit_priceinfers unknown. metadata-diagnostics A2 lock comes viaservedLockState(c43a8ae, fix(metadata-protocol)!: the ADR-0010 _lock gate refuses on a host-config kernel too, and the diagnostics locked count reads the item envelope derivation (#21694) #21715); A1 registry 27 vs/meta/types34. custom-page-source-tiers step 8; doc-on-app-menu slug URLs and duplicated sidebar DOM. - records-forms: object-hook-lifecycle: hooks list at
/meta/hook(not/meta/types/hook), A3 needsOS_LOG_LEVEL=info, A8's log text is[hook] handler failed (onError=log; suppressing), A9 needs a runtime-faulting condition and the client sees a generic 500. field-type-constraints:f_currencyhascurrencyConfig:{currencyMode:'fixed',defaultCurrency:'USD'}; invoice lines needproduct. field-group-visible-when knownGaps stale (both adapters copyvisibleWhenat the pin). concurrent-edit A2 / A3: the form dialog has no Reload. field-history N1 is ambiguous against the always-on audit History tab. cascading-options persona: invite an org admin. - automation: scheduled work is off by default (
OS_AUTOMATION_SCHEDULED_WORK_ENABLED=true). flow-runs-page step 6: fillingnew_assigneesuppresses the pause (MCPrun_actionon a screen flow dead-ends: the screen pauses even when every input is bound, andlist_actionsnever surfaces flow input variables #15705); the selector lists flow names. formula step 3:joinNonEmpty([...])literal fails to type-check,isBlank(" ")is false. connector registry: unlistedshowcase_status_openapi, nobaseUrlexposed.showcase_fan_out_notifyneeds Slack egress. - integration-system / approvals: job-scheduled-run: the
enabled:falseskip line is DEBUG. webhook-lifecycle: the shipped org-less row cannot deliver;lastStatusCodeisresponse_code; redeliver answers enveloped. email-template-render: no HTTP door for sendTemplate (use a notify node),fromOverrideis an object, raw send answers{id,status,messageId}. external-schema:columnCountis 7 (not 5); detail route/_console/apps/setup/metadata/datasource/{name}. ooo-delegation step 4:/triggercannot open an approval (use a type:'api' hook flow). decision-action-matrix knownGap (org-null requests) stale; inbox filter?approverId=; throttle 429THROTTLED. notify-inbox: push dead-letter is a WARN only. preference-suppression: members get 403 on preferences. - platform-core / cli: metadata-authoring step 2: a plain PUT publishes live; drafts need
?mode=draft&package=(bodypackageIdignored). package-lifecycle: runtime objects need the namespace prefix. settings-hub: invalid timezone answersvalue_domain; no user-scoped namespace exists. lifecycle-retention: knownGaps[1] stale (TelemetryDatasource is live on stock; seed the telemetry DB), an idle sweep still logs~0 rows reaped, the line is INFO. cli scaffold items: the trailingnpm installfails on a pnpm-installed scaffold (drop it or use pnpm), and both items measure the published scaffolder. - dashboards / search / i18n: system-overview A2 stale (the Active Sessions widget filters active sessions since System Overview board mislabels two tiles: "Total Users" is really users created in the last 7 days, and "Active Sessions" counts every session #7531) and step 6 has two security tiles. console-global-search A1: ⌘K toggles; step 6 has no "Open full search" entry. i18n strict-translation A4 cites ADR-0049, not 清空剩余 6 条 authorWarn 死键 —— book ×2 / job.id / translation.validationMessages / app.homePageId / app.areas[].order(ADR-0049,v17 限时) #4667; item names must be snake_case (
qa_zh_cn+locale:"zh-CN"). empty-null step 6 should name thegroupBy:["signed_on"]query.
Environment notes are in the record body. Fixture gaps closed out through the wave's anchor card.
Generated by Claude Code
- access-security: readonly-package-locks-studio A2's code set omits
- added a commit that references this issue
on Oct 5, 2026 objectstack-fleet commented
on Oct 6, 2026 ContributorAuthorMore actionsClose-out complete: the last fail is extracted, and the blocked partial gaps are parked. The record closes
completedTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-06T17:07Z. The maintainer approved clearing the openqa-runrecords' close-out debt: 「同意,动手」. ⛔ No verdict on this record is changed.Extracted: #22019 · api-backend.formula-stdlib-matrix · acceptance[5]
Parked-on: #22017 · identity-auth.admin-lifecycle-operations · A4–A6 blocked(dependency, ruled not-built)
Parked-on: #22017 · studio-authoring.expression-editors · A8 blocked(environment)
Parked-on: #22017 · studio-authoring.metadata-diagnostics-sweep · A7 blocked(fixture)
Parked-on: #22017 · integration-system.datasource-credential-refusal-matrix · A2 / A7 blocked(environment)
Parked-on: #22017 · approvals.decision-action-matrix · A10 blocked(fixture)
Parked-on: #22017 · identity-auth.auth-method-matrix · A1 SSO / device variants, N3
Parked-on: #22017 · integration-system.external-schema-browser-ui · A7 needs an unwired boot
Parked-on: #22017 · records-forms.encrypted-field-behavior · A4 pin-only of necessityapi-backend.formula-stdlib-matrixA6 had been recorded as "known expected-fail Shipped template formula fields silently evaluate to null on @objectstack 15.1.1 — daysBetween / Timestamp−Timestamp / floor in stored formulas (hr tenure_years, time_off days) #3306". Shipped template formula fields silently evaluate to null on @objectstack 15.1.1 — daysBetween / Timestamp−Timestamp / floor in stored formulas (hr tenure_years, time_off days) #3306 closedcompletedon 2026-07-20 with a different fix, so the row had no live carrier. It is now formula: the metadata save door stores a formula that calls an unregistered function (sqrt), and every read answers null with nothing logged — the docs say the shared validator backs metadata registration #22019, gradedp2: the save door does not run the validator the docs say backs metadata registration. Every other fail was disposed in this record's close-out5986656212.- Already answered, not parked:
cli.scaffold-first-runandcli.scaffold-console-first-painthad proved only the published 17.6.0. The follow-up run QA run · follow-up: 6 previously unrun or published-only items (6/6) · 316be321 + 53021e3a · 2026-10-05 · 4 PASS / 0 PARTIAL / 2 FAIL / 0 BLOCKED / 0 NOT-RUN #21845 re-ran both on the 17.7 candidate, and both PASS. - The
not-runlegs stay on this record's handoff list (§4):identity-auth.admin-lifecycle-operationsN3, andrecords-forms.field-group-visible-whenN3.
17.7 pre-release verification, mixed half: every runnable
surface:mixeditem (API truth plus a console surface) againstorigin/mainas it stood when the browser run started, with the Console built from the bumped pin (#21710). 17.7 is not cut yet; packages still read 17.6.0. The non-browser half is #21720 (subject251a7dd4); thesurface:browserrecord for this same subject is #21782. Text only: screenshots were consulted live as oracles and are not attached. The durable truth stays indocs/qa/platform-checklist/areas/.Environment fingerprint
objectstack-ai/objectstack316be321(fix(runtime)!: an app-authored body may not read the stored-metadata tables; it reaches them through the metadata API only (#21594) (#21660)), in a dedicated detached worktree; framework and console built, smoke boot health 200 //_console200. fix(metadata-core): the object-schema field mask also removes a denied field's references from the served document (ADR-0106 D1) #21743 (object-schema mask references) merged after this subject and is not in it.2e818d0b51ec(.objectui-sha, chore(objectui): bump the console pin to 2e818d0b51ec (carries objectui#11466, #11574, #11578, #11581 and #11583) #21710); every lane checked the dist stamp against the pin. Console source questions were read at that revision. For the "predates 17.6.0" notes the references are framework617f25f8a(17.6.0) and objectui pin31971ff1e.RUNNER.mdandscripts/checklist-select.mjsfrom the subject tree; every item's revision is in the table and matchesareas/*.json.examples/app-showcase,OS_PORT={p} objectstack dev [--ui] --seed-admin -p {p} -d file:/tmp/qa1770fe/{lane}/{item}.db, one file DB per item, per-lane port ranges 44701–45709 (egress proxy port 41333 excluded). Browser: Playwright on/opt/pw-browsers/chromium. Members minted by admininvite-member+sign-up/email(plusaccept-invitationwhere an org-admin grade was needed) oradmin/create-user; identity proved withGET /auth/get-sessionbefore each persona cell. Scratch fixtures were authored at runtime in the item's own DB or in a scratch copy of the showcase under/tmp(capability declarations, wall-posture boots, job / connector probes); nothing was written into the subject tree.r2) from 23:57Z. Only the re-runs count; the partial first outputs were discarded.OS_AUTOMATION_SCHEDULED_WORK_ENABLED=true(time-relative, trigger-type schedule leg, job-scheduled-run, notification-center),OS_LOG_LEVEL=info(hook lines, lifecycle sweep),NODE_ENV=productionfor the no-SMS phone-OTP variant,OS_AUTH_AUDIENCE_POSTURE=openfor email verification, walled tenancy postures from a scratch copy. One 17.6.0 control boot (scratch DB) classified the field-reorder defect as pre-existing.session_018zT8d8NpiQ1ExhuNd5TxY6, 2026-10-04 15:32Z – 2026-10-05 ~00:45Z. Concurrency was capped at three lanes (maintainer order), verifiers counted as lanes. Tier-1 pins that live in this repository were run first and are cited in the table; items whoseautomated.reflives only in objectui were driven by hand.Scope
node scripts/checklist-select.mjs surface:mixed --json→ 86 runnable items, all 86 judged. Hidden as blocked (not run):identity-auth.linked-accounts-social,records-forms.import-job-undo-cancel. Two planned items matched and are recorded asplanned(not driven, not in the title's counts):records-forms.picklist-shared-across-objects(rev 1),records-forms.picklist-org-append(rev 1).POST /security/explainfor auditor (visible, vama_bypass) and plain member (invisible, sharing); GET twins agree; permission-zoo pin in 26/26POST /packages/com.example.showcase/duplicate→ 422DUPLICATE_SOURCE_NOT_A_BASEby design (#14451) — stale clause; A1 168/168 controls disabled, A2 403NOT_OVERRIDABLE/ITEM_LOCKED, A4 byte-identicalselectstrip budget keys, Financials section absent; pins 26/26. The known-open #21723 residue was observed and not scored (#21743 merged after this subject)view_all_audit_log(7ebb543, #21296, after 17.6.0) — stale clause; withheld from a promoted org admin as intended; A2–A4, A6 pass (405 on POST/PATCH/DELETE)security-external-wider-than-internal; packaged widening 403owd_widening_forbidden; object byte-identical/_console/f/contact-ussubmit 201, env and org withdrawals 404; corroboration pins 20/20 + 39/39POST /sharing/rules201; criteria-less 400; share rowsource:rule= rule id; audience 404 → 200, outsider 403; delete 204 removes shares; Setup list 2 → 3 → 2?mode=draft+ publish enforces (A3–A5 pass, off → on → off measured)/actionsdispatcher AND gate 200/403 for holder / member; REGRANT on an org clone; platform-name shadow refused with a named WARN; malformed declaration rejected at loadsqrtsaves 200, reads null, nothing logged); A1–A5 pass: 27/27 stdlib answers, reference-timezone day trio, sharp edges, live read pathooo_substituterow; B approves as themself (acted_as); expired window routes back; forged delegator 403ATTACHMENT_DOWNLOAD_DENIED/FILE_DOWNLOAD_DENIED), owner and granted member 200;public_readflip 302 → bytes and back; panel copy mapped; pins 27 + 1 skipsend_remindernests under theguard_remindertry_catch (regionKind:'try'), which itself carries the loop-body tags (#13681 / #14394) — stale clause; A1, A3–A6 passOS_AUTOMATION_SCHEDULED_WORK_ENABLED=true: bound-sweep log line, one run per matching task withtrigger.type time_relative, non-matching rows never fire, both-modes descriptor 422DUPLICATE_SOURCE_NOT_A_BASE(#14451) — stale clause; the visual filter editor proven on a scratch writable package; A1–A4 recompute exactlystart/endare structural (no executor, no palette entry;endlogs no step) — assertion defect; 20/21 variants executed; suspending types park and resume; unknown type late-boundtrigger.typerecords the launch event (manualfor on-demand autolaunched and screen runs) — assertion defect; A2–A6, N1–N2 pass; trigger-conformance pin 2/2sync_status=failed; unhandled trigger-fired failure logs the loud ERRORNODE_FAILUREnaming the handlercreate-objectstack@latest(17.6.0): validate / build exit 0,os startready 200, skills catalog 10/10 with no internal skills (measures the released scaffolder, not the unpublished 17.7 subject)os dev --uiandnpm run devboth serve/_console/200 (18469 B); seeded-admin sign-in → Home; Studio record create 201 (published 17.6.0 scaffolder)widgets.0with the prescription; nothing half-saved; corrected widget renders the dataset's countsjoinedblock type refused 422; designer pin 3/3osk_…, never re-served); key authenticates as its owner; revoke / restore immediate; mine-view scoping; owner cannot rewrite key or prefixbootstrap-statusfalse → true; wizard owner is platform_admin + org_owner on a sign-up-disabled boot; one org with the typed name; later forges refused at both doorsOS_DISABLE_SIGNUPboot (product defect, objectui; the server gate holds); A1–A3, A5 passid/cronrefusals; meta door 403, data door 405PUT /meta/email_templatereverts to the package wording on the next boot (product defect); A1–A5, A7–A8 pass; materialization pin 2/2pushrefused loudly; schema pin 19/19_drafts→ publish-drafts → served and rendered; read-only package 422; packaged object 403; invalid body 422 and not stored; pin 5/5PUT/DELETE /meta/appsince objectui 3b7d1cc6d7 (#4233 / #4300, before the 17.6.0 pin) — Disable / Set default on a code-package app answer 403 with an error toast — stale clause (VF5); A1–A5 passorg_adminand the seeded admin isorg_owner— invalid pairing; both sides hold for a real org admin and a member; A1, A2, A4, A5 passCONCURRENT_UPDATE; form and inline conflict dialogs; reload discards, overwrite retries with the 409's version; one shared inline PATCHOS_LOG_LEVEL=info), abort hook 400 with no row, log-policy hook suppressed, runtime-faulting condition aborts, priority orderhistoryop only on the tracked object; audit pins 30/30Totals: 57 PASS / 5 PARTIAL / 24 FAIL / 0 BLOCKED / 0 NOT-RUN (plus 2 planned). Of the 24 fails, 14 carry a product defect (12 distinct defects in the open, two authorization-class defects withheld), 9 are checklist clauses whose assertion is wrong, stale or paired with the wrong persona, and 1 is a known expected-fail. Every fail was re-derived by an independent verifier; where a verifier changed a disposition, the verifier's is recorded (VF4 re-classed readonly-package-locks-studio A3 from assertion defect to stale clause; VF5 confirmed app-management-toggle A6 / N1 stale).
Fails — reproduction rules and dispositions
Product defects
access-security.permission-matrix-edit-loop A2 {m05} — the console cannot save a permission set an admin is entitled to edit (fails closed).
POST /api/v1/packages {"manifest":{"id":"com.fe7.perm2","name":"P2","version":"0.1.0","type":"app"}}→ 201;PUT /api/v1/meta/permission/perm2_c6?package=com.fe7.perm2 {"name":"perm2_c6","label":"x","objects":{"showcase_task":{"allowRead":true}}}→ 200 twice;GET /api/v1/meta/permission; repeat the PUT → 403NOT_OVERRIDABLE"… declared by package 'com.fe7.perm2' and is locked" (draft PUTs too). Any Studio page load issues that list read, so a Studio visit locks every set in the package.POST /api/v1/data/sys_permission_set {name:'fe7_orgset2',…};GET /meta/permission/fe7_orgset2?layers=trueserves the env projection as thecodelayer with no provenance;/_console/apps/setup/metadata/permission/fe7_orgset2shows "Locked: a code package provides this permission set" while the server sayseditable:trueand a plain PUT answers 200. The same lock reaches a "Clone to customize" clone._packageId(protocol.ts:9223,:17108,:8819) anddeclaredPackageIdOf(packaged-permission-set-lock.ts:150-161) ignores the row's org provenance; the projection echo is served as the code layer (permission-set-projection.ts:737-741,protocol.ts:10036-10049), which objectuiPermissionMatrixEditor.tsx:174-183reads as artifact-backed.access-security.packaged-permission-set-lifecycle A6 {m06} — Setup → Permission Sets → Showcase Contributor → Edit → change Description → Update:
PATCH /api/v1/data/sys_permission_set/{id}→ 403NOT_OVERRIDABLE"… Clone it instead (the "Clone" action …)" with nouserMessage; banner and toast read "You don't have permission to save this record." Expected: the clone-path sentence.PackagedPermissionSetLockedError(plugins/plugin-security/src/packaged-permission-set-lock.ts:269-287) declares nouserMessage, so objectuiform.tsx:2540-2545substitutes its generic text by design (fix(sharing): 共享规则新建页 — 自定义 widget 未国际化,且「接收方」永远无可选项 #3821). Same class as closed The ownership-transfer refusal names the field it refused, but sets nouserMessage, so every console substitutes an opaque 「no permission to save」 (from objectui#10108) #19397.identity-auth.auth-method-matrix A4 {m03} — boot
NODE_ENV=production OS_AUTH_PHONE_NUMBER_ENABLED=truewith no SMS provider;POST /api/v1/auth/phone-number/send-otp {"phoneNumber":"+15551230002"}. Expected a 4xx namingNOT_SUPPORTED; actual 500, empty body (the code appears only in the log)./auth/configcorrectly withholdsphoneNumberOtp.auth-manager.ts:5329-5336deliverPhoneOtpthrows a plainError(deliverability at:7735), which better-call answers as a bare 500. fix(plugin-auth): 短信日配额拒发时 OTP 端点回 500 而非 429 —— deliverPhoneOtp 抛的是普通 Error #6039 (closed) fixed only the quota branch.identity-auth.invitation-scope-gates A5 / identity-auth.org-membership-team-management A7 + N1 (UI half) {gap-invite-affordance} — a plain member (invited, accepted,
GET /meta/app=[showcase_app, account]) who types/_console/apps/setup/sys_invitationgets "Invite User" with a working dialog (Owner / Admin / Delegated Admin / Member); on/_console/apps/setup/sys_organization/record/{orgId}the Teams tab offers "Create Team". Confirm → 403 from the server, which holds every gate. UI courtesy only, not an authorization hole.invite_user(and the org-management actions) inpackages/platform-objects/src/identity/sys-invitation.object.ts,sys-member.object.ts,sys-user.object.tsare gated only byrequiresFeature:'organization'; the platform cannot express the gate, because membership grades are not on the capability channel (ADR-0108) — a platform gap.identity-auth.self-signup-gate A4 {o-signup-link} — boot
OS_DISABLE_SIGNUP=true(/auth/configemailPassword.disableSignUp:true); open/_console/loginin a fresh context. Expected no register link; actual "Don't have an account? Sign up" →/_console/register(3 contexts, 2 boots). The/registerbounce and the server gate hold.LoginPage.tsx:299passesregisterUrl={signUpDisabled ? undefined : registerUrl}andpackages/auth/src/LoginForm.tsx:147defaultsregisterUrl = '/register', soundefinedrestores the link.identity-auth.email-verification-loop A3 {o-verify-email} — open posture; sign up; read the token from
sys_email.body_text;POST /api/v1/auth/verify-email {"token":…}→ 404, and/_console/verify-email?token={valid}renders "Verification failed: 404" with the account still unverified. The mailedGET /api/v1/auth/verify-email?token=…link verifies (302, thenemailVerified:true).apps/console/src/pages/auth/VerifyEmailPage.tsx:47-62POSTs; better-auth 1.7.3 declares/verify-emailGET-only (and the route ledger lists only GET). The clause also names the non-existent POST variant (see accuracy).studio-authoring.object-designer-roundtrip A1 {m04} —
PUT /api/v1/meta/object/{ns}_order_probe?mode=draft&package={pkg}withfields:{alpha,beta}, publish; PUT again withfields:{beta,alpha}(?state=draftreads beta, alpha);POST …/publish→ 200 "Published draft" with the same version hash;GET→ alpha, beta. The designer's drag-reorder takes the same path (2 UI repros, 2 API repros).canonicalize.ts:8), soSysMetadataRepository.put()skips an equal hash andpromoteDraftdrops the draft (sys-metadata-repository.ts:537,:620,:886), although field order is meaningful (object.zod.ts:1080-1084).617f25f8acontrol boot). Verifier VF2: CONFIRMED, P2.records-forms.cascading-multilevel-and-clear A4 {o-cascade-lookup} —
/_console/apps/com.example.showcase/showcase_invoice→ New → Account Northwind → Contact "Prospect 18" (a Northwind contact) → switch Account to Contoso (pick, or remove the chip then pick) → Status Draft → Create. Expected the contact to clear; actual the chip stays and the API readsaccount:{Contoso},contact:{a Northwind contact}(the server gate checks existence only). Candidate requests are correctly account-scoped (26 vs 2).components/src/renderers/form/form.tsx:1982-2045— the only cascade-clear effect skips non-option widgets (nolookupinCASCADE_OPTION_WIDGET_TYPES,:2004);fields/src/widgets/LookupField.tsx:640-654only re-scopes the query.records-forms.field-group-visible-when A4 {o-detail-visiblewhen} — scratch object with a
fieldGroups[]"Pro details" group,visibleWhenonkind == 'pro'(both bare and envelope forms); rows with kind=basic and kind=pro; open/_console/apps/com.example.showcase/qa_group_gate4/record/{id}. Expected the section hidden for basic; actual it renders for both. The form now gates it live (the clause was authored as an expected-fail; the form half is fixed at this pin).plugin-detailbuildDefaultPageSchema.ts:717-729— the detail synthesis does not apply the group predicate.integration-system.email-template-render A6 / N1 {m01} — boot;
GET /data/sys_email_template(showcase_task_done_email) → subject✅ Task done: {{title}},customized:false;PUT /api/v1/meta/email_template/showcase_task_done_email {subject:'ADMIN reworded: {{title}}',…}→ 200, the row renders the new subject but stayscustomized:false; restart on the same DB →GET /metastill serves the overlay while the sending row reverts to the package wording (N1: the two disagree). Control: a data-doorPATCHstampscustomized:trueand survives.plugins/plugin-email/src/bootstrap-declared-email-templates.ts:153-170(readDeclaredreads the package registry, not the overlay) +:209-227(the metadata door leavescustomized:false, so the:211guard does not protect it).617f25f8a). Verifier VF3: CONFIRMED (two fresh DBs), P2.integration-system.external-schema-browser-ui A2 / A4 / A5 / N1 / N5 {o-ext-panel} —
/_console/apps/setup/metadata/datasource/showcase_external: the browser receivesGET …/external/tables→{"success":true,"data":{"tables":[customers(7), orders(7)]}}and renders "No remote tables found" (A2 / N1); "Refresh catalog" → 200 withdata.catalog.snapshotAt, no timestamp renders (A4); Validation → Run validation → 200{success,data:{ok,results:[2]}}, panel shows "Preview failed to render — Cannot read properties of undefined (reading 'length')" (A5 / N5).packages/app-shell/src/views/metadata-admin/external/api.ts:133jsonOrThrowreturns the raw body and callers readdata.tables/data.catalog/{ok,results}without unwrapping thesendOkenvelope.617f25f8a). Verifier VF3: CONFIRMED (two loads), P2. Owner: objectui.integration-system.external-schema-browser-ui A3 {m02} —
POST /api/v1/datasources/showcase_external/external/tables/customers/import {"name":"ext_cust"}→ 201;GET /api/v1/data/ext_cust→ 500DATABASE_ERROR("no such table: ext_cust"); importing under the remote name works by coincidence; after a restart the imported object is gone (404). Control: the same definition viaPUT /api/v1/meta/object/{name}is queryable.services/service-datasource/src/plugin.ts:99-101persistObjectonly callsmetadata.register('object', …)— no engine re-sync / external-object registration, and no persistence.Authorization class (withheld)
Checklist clauses (no product defect)
DUPLICATE_SOURCE_NOT_A_BASEby design; a writable base fromPOST /packagestakes the same PUT (200), so the gate keys on writabilityrequireDuplicableSource(#14451), before 17.5.0view_all_audit_logby default and is served the delete row; a non-holder (promoted org admin) gets 0 delete rows; page and API agree for the same principal7ebb543164(#21296, fixes #21260) — after 17.6.0POST /auth/delete-useris deliberately unwired (ledger dispositiondisabled) and answers 404 to every caller; change-email holdsauth-route-ledger.ts:148-157, ruling 2026-08-12 (#7735)USER_IS_NOT_A_MEMBER_OF_THE_ORGANIZATIONand the foreign org never becomes active, but better-auth clears the active org to none before throwing (fails closed)crud-org.mjssetActive; route unwrapped (auth-route-ledger.ts:274)'org_admin' in current_user.positions; the seeded admin isorg_owner. An invited org admin sees and persistsrestricted, a member neither sees nor submits itcascading-select.object.ts:100;eval-user.zod.ts:201-205protocol.ts:1344,1652(ADR-0005 appendix (c))send_remindercarries{parentNodeId:'guard_reminder', regionKind:'try'};guard_remindercarries the loop-body tags with iteration 0..2index.ts:910-926(#13681 / #14394), before 17.6.0packages.ts:479ff.start/endare structural: no executor, no palette entry;startlogs a step,endreturns before logging — proven by the run completingflow.zod.ts:72FLOW_STRUCTURAL_NODE_TYPEStrigger.typerecords the launch event (context.event ?? 'manual'), notFlow.type; the flow name identifies the kindengine.ts:1175-1190(#7533)PUT/DELETE /meta/app/{name}: Disable / Set default on a code-package app → 403NOT_OVERRIDABLEwith an error toast,/meta/appunchanged; on a writable app the effect is real3b7d1cc6d7(#4233 / #4300, 2026-08-11), before the 17.6.0 pinKnown expected-fail (not re-filed)
PUT /api/v1/meta/object/fx_sqrt?package=com.fe13.fxwith formulasqrt(record.amount)→ 200;POST /data/fx_sqrt {amount:16}→root:null, nothing logged, although the compile gate namessqrtandformulas.mdxsays the validator backs metadata registration. Verifier VF4: confirmed unchanged (engine.ts:2247).Partial-coverage gaps (named, not dropped)
identity-auth.admin-lifecycle-operationsA4–A6 — blocked(dependency): set-role / revoke-user-sessions / remove-user are ruled not-built (impersonate_userandset_user_rolestill 403 every platform admin — neither route is safely raw-mountable, and each blocks for a different reason #9968 / finding: seven better-auth/admin/routes refuse platform admins and have no ObjectStack consumer — decide whether they are capability or just vendor surface #9969); the admin gets the ruled 403. N3 not-run (the route refuses the admin by design).studio-authoring.expression-editorsA8 — blocked(environment):celAuthoring.test.tslives only in objectui and no checkout at the pin was runnable.studio-authoring.metadata-diagnostics-sweepA7 — blocked(fixture).integration-system.datasource-credential-refusal-matrixA2 / A7 — blocked(environment): no Postgres / MySQL / Mongo to prove "connects".approvals.decision-action-matrixA10 — blocked(fixture): no org-less request can be provisioned (even an api-hook approval is org-stamped); the pin covers the mechanism.identity-auth.auth-method-matrixA1 SSO / device variants (no switch on thedev→servepath) and N3 (objectui#4179, no magic-link / passkey UI);integration-system.external-schema-browser-uiA7 (needs an unwired boot);records-forms.field-group-visible-whenN3 not-run.records-forms.encrypted-field-behaviorA4 (an unwired-crypto boot refuses to start).cli.scaffold-first-runandcli.scaffold-console-first-paintprove the publishedcreate-objectstack17.6.0, not the unpublished 17.7 subject.Fixed since the last run
f_jsonedited as[object Object]) no longer reproduces: the edit form shows pretty JSON and the PATCH round-trips an object.access-security.public-form-intakere-judged fresh after fix(rest): withdrawing a public form takes effect on every anonymous intake door #21420 / fix(metadata-protocol): refuse an org-scoped public form withdrawal a walled posture cannot honour #21473 / fix(rest): one anonymous-intake rule honours every declared public-form withdrawal #21566 / fix(rest): a public form that cannot take intake on a walled posture is not offered; the admin read says why #21580: every clause holds.Candidates — not verified, not extracted
Seen by a runner outside the clauses, low severity or possibly by design; listed so they are not lost:
reset:falseno-op (VF5, objectui, unverified live); on a writable app Enable writes a live row outside the package (no?package=, no draft) and Delete removes only that row while the toast says "deleted".describeInterruptedRunjoins its parts with a bare space (run-on warning text);os migrate resumelogs an ERROR about unbound federated objects.PUT /meta/object/{packaged}answers 422DESTRUCTIVE_CHANGEbefore the overlay gate's 403 (still refused).flow-node-config.tsshowWhen).NAMESPACE_PREFIXinside a 200outcome:"refused"; the console shows only "Action failed".parallelrun records only the container failure; neither branch's steps are logged ([Decision] A failedtry_catchtry-region produces no step at all — after a caught failure an operator cannot tell what failed, how many attempts ran, or which node threw #7546 shape).singleposture: bulk events carry no organization, so an org-stamped bulk subscription never fires; the shipped org-lessshowcase_task_changedrow refuses per-record events once flipped active (loud, not silent).POST /notifications/readwith an unknown id answersreadCount:1and plants an orphan receipt for the caller.['en']forsys_notification_template, so anen-USrow is never picked (seen once).droppedFieldsomits a replaced autonumber; a later Specimen PATCH hit409 RECORD_LOCKEDfrom an approval of unclear origin.client_id(objectuiOAuthConsentPage.tsx:68calls a route that 404s); the open-posture boot logsTEMPLATE_NOT_FOUNDfor a boot-time verification mail; the workspace switcher label still names an org after a refused set-active.rls-predicate-unenforceable; a permission-set clone row carriescreated_by/organization_idnull; the Studio records-grid create dialog renders half-width.?type=viewsstats key plural;GET /meta/book/{missing}/tree200 empty vs doc 404; a 422 publish is logged as an unhandled error; deleting a draft-only page answers a misleading 200 and a faulted draft reads_diagnostics.valid:true; the permission editor Save is clipped at 640 px; the HTML page editor logs a pageerror.capability_platform_name_refusedWARN logged five times in one boot.Generated by Claude Code