Repository navigation
QA run · surface:mixed (90/90) · 36b2889c · 2026-10-12 · 72 PASS / 10 PARTIAL / 8 FAIL / 0 BLOCKED / 0 NOT-RUN #23166
Description
Half 2 of #23104, mixed selector. The maintainer's order, verbatim: 「objectui pin 更新到最新版,并使用浏览器对前端界面进行完整的测试」. Every runnable surface:mixed item (API truth plus a console surface) was driven against objectstack 36b2889c, with the console built from the new objectui pin 1fb1ced36243 (a local stand-in for PR #23110's head). The surface:browser record for the same subject and run is #23163. Text only: screenshots were consulted live as oracles and are not attached. The durable truth stays in docs/qa/platform-checklist/areas/.
Environment fingerprint
- Framework (subject):
objectstack-ai/objectstack36b2889cddc5e38acf7f85b8e186b02e6ef786c6, in the detached worktree/home/user/objectstack-qa-23104, framework and console built. - Console:
.objectui-shaset LOCALLY to1fb1ced36243c325acc801bdde26bd096a15f5f5, withsdui.manifest.jsonandscripts/sdui-manifest.record.jsonregenerated from the built objectui tree at that pin (sha256f545b851c4bb…, byte-identical to PR chore(objectui): move the console pin to 1fb1ced36243 (objectui main tip, Half 1 of #23104) #23110's). The console dist stamp equals the pin, both inpackages/console/dist/.objectui-shaand as served byGET /_console/.objectui-sha. - Why this tree stands in for the pin PR: it differs from PR chore(objectui): move the console pin to 1fb1ced36243 (objectui main tip, Half 1 of #23104) #23110's head
043b81d13only in pin-citation strings inside spec descriptions, the sdui-parser lockstep JSON, two changesets and one docs reference page. Runtime code and console bundle are identical. PR chore(objectui): move the console pin to 1fb1ced36243 (objectui main tip, Half 1 of #23104) #23110 has since landed onmainasf451a5964, and CI push run38332364381atbcebd8409, the first full-batterymainrun carrying it, passed withConsole Pin Gateincluded. - Checklist: items,
RUNNER.mdand the selector come from the subject tree. Revisions in the table match the selector's output. - App / boots:
examples/app-showcasebooted withobjectstack dev --ui --seed-admin -p PORT -d file:/tmp/qa-23104/LANE/ITEM.db, withOS_PORTexported and a per-bootOS_HOMEandOS_STORAGE_LOCAL_ROOT. Lanes A / B / C used the ports 44100–44399 / 44400–44699 / 44700–44999. Browser: Playwright on/opt/pw-browsers/chromium. Adminadmin@objectos.aicame from--seed-admin. Other personas were minted per item, and identity was proven withget-sessionbefore each persona cell. - Execution: three parallel runner subagents (lanes A, B, C) in Claude Code session
session_016JB93R2KcQP4GgKaUnseVF, PM seatdomain:devx#2, from about 23:30Z on 2026-10-12.- A container restart around 02:30Z killed all three. Each lane resumed from its own results file: judged items were kept byte-identical, and not-run items were re-run from scratch on fresh
-r2state. - The lanes finished on 2026-10-13, between 03:32Z and 04:28Z. Concurrency stayed at three lanes.
- Tier-1 pins in this repository ran under
os-verify-lockand are cited. objectui-only pins were driven by hand, or run from an objectui checkout at the pin where installed.
- A container restart around 02:30Z killed all three. Each lane resumed from its own results file: judged items were kept byte-identical, and not-run items were re-run from scratch on fresh
- Hop regression: none. Every fail clause records
hop_suspect: false.concurrent-edit-conflictN2 also carries an explicit hop-rangegit logoverObjectGrid.tsxthat returned empty. - Deviations, stated (the full list is on QA run · surface:browser (65/65) · 36b2889c · 2026-10-12 · 50 PASS / 2 PARTIAL / 12 FAIL / 1 BLOCKED / 0 NOT-RUN #23163):
- The CRM manifest incident (03:44:53–03:45:18Z, removed through the API,
git statusunchanged). No boot that scored an app-list clause started in that window. - Declared shared boots: lane B S1 / S2, lane C
studio1, and one shared DB forlifecycle-retention-sweep+interrupted-migration-boot-report. - Scratch showcase copies under
/tmp: capability probes, walled-posture boots, the picklist fixture, job fixtures and webhook stacks. - Non-default boots:
OS_LOG_LEVEL=infofor the lifecycle / migration INFO lines; at the default level every migration-recovery line is WARN, so it cannot hide one.OS_LOCALIZATION_TIMEZONE/OS_MAIL_SMTP_PASSWORD(env-lock legs) andOS_TENANCY_POSTURE=group|isolatedwithOS_PLATFORM_OWNER_EMAILandOS_AUTH_MEMBERSHIP_POLICY=invite-only.OS_PAGE_REACT=off, the scheduled-work boot, the local OIDC provider fixture (oidc2) and a scratch PostgreSQL 16 on 127.0.0.1:44790.
- The two
cli.scaffold-*items took the PUBLISHED path.create-objectstack@latest= 17.7.0 and the published console = objectui0abd4f9f8769, so their verdicts describe the released bits, not the local pin. The tree's CLI refuses a 17.x scaffold on the ADR-0087 D1 protocol handshake, and the pre-release variant is handed off (see Scope). - Pins re-run at resume: one lane-B Tier-1 pin was re-run under the lock (2 files, 33/33), and so was lane C's
metadata-diagnostics-sweepA7. - Time split (environment / test minutes, lane estimates): A 17 / 103 (resumed portion only), B ≈38 / 220, C ≈34 / 190.
- The CRM manifest incident (03:44:53–03:45:18Z, removed through the API,
Scope
node scripts/checklist-select.mjs surface:mixed --json on the subject tree returned 90 runnable items, all 90 judged (lane split A 21, B 37, C 32). The selector hid no item as blocked. One planned item matched and is recorded as planned: not driven, and not in the title's counts.
records-forms.picklist-shared-across-objects(rev 2): planned.
Handoff, not run: the pre-release (local-registry) variant of cli.scaffold-first-run and cli.scaffold-console-first-paint against the protocol-18 candidate. It needs a scratch monorepo build plus a localhost registry with no upstream. The published-path verdicts are recorded below.
Clause ids are the lanes' own labels, which the extracted cards cite.
| item | rev | verdict | evidence (server truth / browser / pin) |
|---|---|---|---|
| access-security.audit-log-browser | 4 | PASS | page rows (login, config_change, delete, update) each backed by a sys_audit_log row with the same action / object / record / actor; Action filter re-queries; drawer shows before / after; POST / PATCH 405 and nothing forged lands |
| access-security.capability-declaration-lifecycle | 3 | PASS | served capability equals its declaration; held / not-held dispatch through /actions; a shadowing declaration refuses boot with a named catalog conflict; a malformed one fails validate (scratch copies) |
| access-security.fls-mask-and-strip | 3 | PASS | contributor field write on budget 403, admin 200 with the formula recomputed; inputs disabled for the contributor; liaison by-id / list strip budget keys; pins green |
| access-security.owd-save-gate | 3 | FAIL | A3: packaged OWD widening is refused 403 NOT_OVERRIDABLE by the ADR-0131 D6 seal, so owd_widening_forbidden is unreachable; stale spec, #23121; A0–A2, A4, A5 pass |
| access-security.packaged-permission-set-lifecycle | 1 | FAIL | C1 · detail withheld pending maintainer |
| access-security.permission-matrix-edit-loop | 3 | PASS | a Studio matrix click autosaves a draft; enforcement follows the published set only; Delete and FLS edits flip the member's server answers after publish; assignment add / remove flips 403 / 200; editor reopens on the published state |
| access-security.public-form-intake | 2 | PASS | anonymous schema lists the four declared fields only; forged anchors / status / source dropped (201, defaults stamped); lookup route 404 identical to an unregistered one; anonymous console submit 201; withdrawal 404 FORM_NOT_FOUND |
| access-security.readonly-package-locks-studio | 4 | PASS | Studio read-only badges and disabled controls; bare and package-scoped PUTs refused (NOT_OVERRIDABLE / ITEM_LOCKED); writable-base control saves; object byte-identical after the refusals |
| access-security.record-access-explain | 2 | PASS | explain panel layers, verdict and contributors equal POST /security/explain for the auditor (visible) and a plain member (invisible, sharing); live reads agree; permission-zoo pin green |
| access-security.sharing-rule-authoring-ui | 2 | PASS | rule authored 201; criteria-less 400; share row source:rule = rule id; the audience gains, then loses access on delete (204, shares gone); Setup list mirrors the rules |
| api-backend.formula-stdlib-matrix | 1 | FAIL | C1: the registration count moved to 29 (isoDate / isoDatetime, #22347), all 29 pass 73/73 known answers; C6: an unregistered function is refused 422 at the authoring door, not a silent null; stale spec ×2, #23121; C2–C5 pass |
| approvals.decision-action-matrix | 4 | PARTIAL | A9-wire blocked(fixture: needs an org-less request); every route's status move and /actions row; revise / resubmit rounds and the revision-limit auto-reject; recall and resubmit submitter-only; lockRecord 409; remind throttle 429; A9 from its unit pin |
| approvals.dynamic-approver-routing | 2 | PASS | decision outputs required (UI blocks, API 400); picked reviewers open stage 2 in pick order; the chain completes the run |
| approvals.ooo-delegation-reroute | 4 | PASS | self-service delegation reroutes the next request to the delegate with a notification; the delegate's approve is recorded as herself; expiry restores routing; position-routed requests reroute; managing another's delegation 403 |
| attachments-storage.download-authz-both-sides | 3 | PASS | download refused 403 to a member without parent read, allowed on a public_read parent and to the admin; public-read ACL pin 8/8 and live flip; panel download refused after an owner move |
| automation.connector-dispatch-matrix | 2 | PASS | registry lists plugin and declarative connectors with actions; REST, declarative and MCP dispatches complete from this boot; the Studio picker reads the registry; an unknown connector fails loudly |
| automation.flow-error-handling | 3 | PASS | try_catch records 4 try failures with retryAttempt 0–3 and the backoff ladder; catch writes sync_error from $error.message; the unhandled probe fails with a run-level error and an ERROR line; designer Runs panel shows the regions |
| automation.flow-node-type-matrix | 4 | PARTIAL | A1-http blocked(environment: egress denied, http steps fail "fetch failed"); 19 executor descriptors; every other node type has a live successful step; pauses resume; nodeType on every step; region tags; unknown type warns and fails NO_EXECUTOR |
| automation.flow-run-step-nesting | 5 | PASS | loop × try tags (parent, region, iteration) on every step; parallel branch tags; the designer Runs tree equals the API tags; an empty loop logs no body steps |
| automation.flow-runs-page-test-trigger | 1 | PASS | Flow Runs page Test Run with typed inputs; recent runs equal the API; a screen flow pauses into the FlowRunner dialog and resumes; Cancel keeps a reopenable pause |
| automation.rollup-summary-filter | 4 | PASS | six filtered roll-ups equal an independent recomputation and move only when their predicate is touched (edit, flag flip, delete) |
| automation.time-relative-trigger | 2 | PASS | designer renders the time-relative start; bound on the scheduled-work boot; the sweep (knownGaps cadence override) launches runs for in-window tasks only; a both-modes descriptor refused 422 |
| automation.trigger-type-matrix | 3 | PASS | record_change, signed webhook, schedule (60 s apart, unaided), screen and api triggers each produce runs with the declared trigger block; conformance pin 2/2; anonymous trigger 401; bad or missing signature 401 |
| cli.scaffold-console-first-paint | 3 | PASS | PUBLISHED 17.7.0 path (not the local pin): scaffold exit 0; os dev --ui and npm run dev serve the console; the seeded admin signs in and opens the scaffold object |
| cli.scaffold-first-run | 3 | PASS | PUBLISHED 17.7.0 path: the blank template validates and builds; a retired template is refused by name; server ready with no protocol refusal; skills install; health inside the budget |
| dashboards.dataset-report-authoring | 1 | PASS | a layout-less dataset dashboard drafts, publishes and auto-flows; summary / matrix / joined report cells equal direct dataset queries; the chart beside the table issues its own query |
| dashboards.empty-null-bucket-boundaries | 1 | PASS | an empty window renders designed empty states and 0 tiles equal to direct queries; date-bucket and empty-group parity pins 8/8 + 4/4; null bucket served; a one-point series draws a lone dot |
| dashboards.strict-widget-rejects-stray-keys | 2 | PASS | 16 stray / legacy widget keys each refused 422 naming the key and the ADR-0021 shape; nothing half-saved (404, no draft); the clean widget publishes and draws |
| dashboards.system-overview-live-counts | 1 | PASS | Total Users / Active Sessions / login / config tiles equal direct reads; the requiresObject widget is absent with no blank slot; pie and table multi-bucket (A1 caveat and A3 roster stale, see accuracy list) |
| i18n.strict-translation-key-rejection | 2 | PASS | 10 misplaced keys refused 422 at the metadata door and at both bundle helpers, with did-you-mean and prescriptions; nothing half-saved; the corrected bundle is served |
| identity-auth.admin-lifecycle-operations | 7 | PASS | ban, credential lifecycle, by-design refusals (set-role / revoke / remove 403), impersonation banner and attribution, audit trail and the 31-route non-admin refusal: pins green with live corroboration |
| identity-auth.api-key-ui-lifecycle | 1 | PASS | a member creates a key (shown once); key reads equal the owner's; revoke 401, restore 200; another member cannot list it; Account › API Keys lists it |
| identity-auth.auth-method-matrix | 6 | FAIL | A9: anonymous POST /auth/delete-user answers 401 (session guard) while the clause demands 404 for every caller; authed 404 as pinned; assertion defect, #23121; A0–A8 pass |
| identity-auth.email-verification-loop | 2 | PASS | sign-up routes to the prompt; the captured token verifies (GET) and flips admission; resend sends a fresh token; a garbage token 401 with the designed error state; requireEmailVerification false on stock |
| identity-auth.first-run-owner-bootstrap | 1 | PASS | bootstrap-status false → wizard → true; the organization is renamed, never created; document load to Home; closed postures refuse anonymous sign-up; the wizard is unreachable once an owner exists |
| identity-auth.identity-import-wizard | 2 | FAIL | C2b: the automatic-policy invitation link carries an empty callbackURL and lands on INVALID_TOKEN; product defect, #23152; C0, C1, C2a, C3–C5 pass (one-time passwords never stored in clear) |
| identity-auth.implicit-account-linking-ownership | 1 | PASS | an unverified owner is not implicitly linked; verification through the product; unlink honoured; explicit signed-in link works; platform IdP exception pinned (local OIDC fixture) |
| identity-auth.invitation-scope-gates | 3 | PASS | a delegated admin may invite members but not admins (403, no row); a plain member 403; the UI mirrors it; statuses in the enum; delegable scope empty |
| identity-auth.linked-accounts-social | 3 | PASS | Linked Accounts lists only the viewer's rows; unlink through the row menu; no link affordance without configured providers; data-door writes 405 |
| identity-auth.oauth-app-consent-loop | 2 | PASS | discovery documents served; registration hides the secret; authorize → consent → code → token with PKCE; a remembered consent skips the page; an added scope re-prompts and Deny returns access_denied; others cannot read the consent |
| identity-auth.org-membership-team-management | 3 | PASS | org record page; a role update grants invite; unknown roles 400; rename; removal revokes the old session; teams; a plain member is refused on every write |
| identity-auth.self-service-profile-password | 1 | PASS | profile rename, avatar upload / remove, password change (old refused), wrong current password 400 with the credential unchanged; SSO-only leg staged on the OIDC fixture |
| identity-auth.self-signup-gate | 2 | FAIL | N5: under stock invite_only the register form is not offered to an uninvited visitor (by-invitation notice; form only on an accept-invitation redirect, objectui#11691); stale spec, #23121; A0–A4 pass |
| identity-auth.session-list-revoke | 2 | PASS | list-sessions and sys_session scoped to the owner; revoke-one and revoke-others take effect on the next request; Setup all-sessions view; data-door writes 405 |
| identity-auth.teams-bu-membership | 2 | PASS | team membership rows; a BU child under its parent; BU membership scopes inquiry visibility; a plain member is refused |
| identity-auth.workspace-org-switch | 2 | PARTIAL | C3b skipped (premise retired: metadata writes are deployment-level); single posture shows no switcher; a switch posts set-active and reloads the document; the isolated posture bounds reads; group hint; foreign org 403 (walled boots from a scratch copy) |
| integration-system.datasource-credential-refusal-matrix | 4 | PASS | credential keys refused or redacted alike on every door × publish path; live PostgreSQL binds through credentialsRef; no cleartext in any read; legacy rows redacted; an echo does not overwrite; non-admin 403 |
| integration-system.email-template-render | 5 | PARTIAL | A5 partial (admin half pass; the declared-source edit needs a writable showcase copy); the authored template renders through sendTemplate; a missing variable dead-letters before the transport; inactive refused; locale ladder; from / reply-to; build probes; raw send |
| integration-system.external-schema-browser-ui | 2 | PARTIAL | A6 blocked(environment: objectui checkout not installed, the stock boot always federates); tables and column counts equal the API; import draft; refresh catalog; validation clean; member 403 |
| integration-system.job-scheduled-run | 3 | PASS | interval / once / cron jobs fire on schedule (scratch copy); rows keyed by name; retry ladder 1 s / 2 s; timeout recorded; disabled and handler-less jobs logged; retired keys refused at build |
| integration-system.notification-preference-suppression | 1 | PARTIAL | A3-mandatory blocked(fixture: no mandatoryTopics on the stock showcase); a per-user mute suppresses with no dead letter; re-enable and default-on deliver; most-specific wins; template rendering |
| integration-system.notify-inbox-delivery | 2 | PARTIAL | A3-501 blocked(fixture: the showcase requires messaging); the inbox row lands for the assignee only; read clears; anonymous 401; the push channel adds no inbox row |
| integration-system.webhook-lifecycle | 5 | PARTIAL | A2 blocked(dependency: in-org bulk flow events carry no organization, so no tenant subscription can receive them); N1 / N2 skipped (time budget); materialization pin; HMAC signature and custom header; redeliver; build refusals; the admin edit survives reboot; durable retry |
| platform-core.app-management-toggle | 2 | FAIL | C5b: Delete on a code-package app toasts "deleted" for a 200 reset:false; N1: Disable on a writable app toasts success, writes a shadow env-wide row and changes nothing; product defect, objectstack-ai/objectui#12300; C0–C5a pass |
| platform-core.boot-health | 7 | PASS | health 200 in 16.1 s; ready 200; no misauthored-flow warning or ERROR in the boot window; console served with stamp = pin; served grp_data equals the authored 12 |
| platform-core.interrupted-migration-boot-report | 2 | PASS | a seeded interrupted journal is reported once per boot and not resumed; health and ready stay green; quiet when empty; a scan failure is reported (pins) |
| platform-core.lifecycle-retention-sweep | 1 | PASS | terminal runs reaped on the real timer (the line needs OS_LOG_LEVEL=info); non-terminal survivors; the archive-less audit row survives; batching pins; kill switch; vocabulary |
| platform-core.metadata-authoring-roundtrip | 2 | PASS | draft → publish-drafts → published body; the page designer seeds a record page; read-only package 422; managed object 403 while overlays accept; an invalid body 422 with nothing stored |
| platform-core.notification-center | 1 | PASS | grouped rows (×5, ×3) expand; group Mark read sends one body with all members; Mark all read; the approvals count equals pending requests; no revert after reload |
| platform-core.package-lifecycle-enable-disable | 1 | PASS | disable hides data and nav, enable restores; delete removes registry entry and rows; commits +1 per publish; revert restores; read-only package refused 422; the console drops the disabled app |
| platform-core.settings-hub-roundtrip | 3 | PASS | tenant timezone cascade with audit rows; form source badges; env lock read-only with refused writes; SMTP test names the missing host; secrets encrypted and served masked; mask echoes no-op; anonymous refused; 11 namespaces served |
| records-forms.action-param-widgets | 2 | PASS | each param renders its declared control with accept / multiple; a conformant confirm 200 with every param received; a missing required param blocked in the UI and 400 at the API |
| records-forms.cascading-multilevel-and-clear | 2 | PASS | the 2-level cascade clears the child on a parent change; the server refuses an out-of-cascade option; the lookup cascade clears and re-scopes; two known gaps recorded as specified |
| records-forms.cascading-options | 3 | PASS | dependent options in the form; the server refuses an invalid combination; an admin-only option visible to an org admin only; filtered lookup picker; UI create round-trips |
| records-forms.concurrent-edit-conflict | 2 | FAIL | N2: list-grid inline Save All sends no If-Match, so a stale grid edit silently overwrites a concurrent write; product defect, objectstack-ai/objectui#12292; A0–A5 pass on the form and detail-inline paths (409 dialog, reload, overwrite) |
| records-forms.conditional-rules-header | 2 | PASS | requiredWhen blocks form and API; readonlyWhen renders text and the server drops the write; a visibleWhen field; action visibility by status; one rule at both ends |
| records-forms.encrypted-field-behavior | 2 | PASS | a secret is stored as a ref with aes-256-gcm ciphertext and served masked; mask echo no-op; fail-closed pin; aggregate / groupBy on credential fields refused |
| records-forms.field-group-visible-when | 2 | PASS | the group gates live on the form and on the detail page (stale expected-fail, objectui#11630 fixed); visibleOn refused 422; passthrough pin; hidden members untouched by saves |
| records-forms.field-history-tracking | 1 | PASS | a tracked field writes a per-field activity row; an untracked edit gives the generic row; History tab gating; the history apiOperation advertised; reference-summary pin |
| records-forms.field-type-constraints | 1 | PASS | max length, min / max, options, multiselect, reference existence, readonly autonumber and computed formula enforced server-side; the currency-scale known gap recorded as specified |
| records-forms.field-type-matrix | 2 | PASS | field-zoo pins 46/46 + 45/45; every type renders its control; invalid values refused; masked kinds; computed fields; reference targets; invoice totals equal line sums |
| records-forms.import-job-undo-cancel | 3 | PASS | console import job (manual, the spec is gated): undo deletes exactly the 40 imported rows; cancel stops a 3000-row job at 600; job listing fields |
| records-forms.object-hook-lifecycle | 3 | PASS | 5 hooks listed; before-hooks normalize; after-hooks log on the right transition only; record = stored ⊕ payload; abort / log error modes; author-time and runtime condition faults; priority order |
| search.console-global-search | 3 | PASS | the palette opens by every door; typing queries /api/v1/search; hits grouped by object; Enter navigates; no query for empty / 1-char input; a member gets no hits on rows it cannot read; full results page |
| search.freshness-and-empty | 1 | PASS | create / rename / delete visible to search immediately; the pinyin companion recomputes without restart; empty result envelope; designed empty state |
| search.pinyin-flag-both-sides | 3 | PASS | flag ON: full and initial pinyin recall on name fields only; flag OFF: recall gone while source columns still hit; the roster differs by exactly PinyinSearchPlugin; first-boot backfill |
| studio-authoring.authoring-validation-not-persisted | 3 | PASS | an invalid object and stray view-container keys refused 422 with located messages; nothing persisted (404, draft state included); the designer shows the located banner; corrected bodies save |
| studio-authoring.custom-page-render-and-blocks | 1 | PASS | command-center KPIs and charts equal the data plane; token-scoped my-work grid; sorted / filtered grid; project workspace child table; a faulty grid block renders a named error; 0 ERROR lines |
| studio-authoring.custom-page-source-tiers | 1 | PASS | the html tier is static and never executes author JS; the jsx tier fires no data query; the react tier queries live and edits; OS_PAGE_REACT=off withdraws it; a react error renders named |
| studio-authoring.doc-on-app-menu | 1 | PASS | app-menu doc / book entries pruned per reader audience (6 / 3 / 3); entries resolve to the claiming book; the outsider is refused on every direct route |
| studio-authoring.draft-publish-lifecycle | 4 | PASS | a draft is never served before publish; publish flips the live read; stale If-Match 409; publish-drafts atomic; a legacy key refused at the draft door; Changes panel; history, diff, rollback and audit attribute the authenticated actor |
| studio-authoring.expression-editors | 3 | PARTIAL | A7 blocked(environment: pin-only clause, objectui checkout not installed); the formula editor completes and type-checks like the engine; returnType kept per field; visibleWhen catalog; RLS warning vs parse error; test-policy dialog; parity table matches |
| studio-authoring.first-run-loop | 3 | PASS | new package (CJK name) → object with options → record → app published and launched, all on one server process; forged writes into the read-only package 422 / 403 |
| studio-authoring.metadata-diagnostics-sweep | 2 | PARTIAL | A6 blocked(fixture: no invalid stored row plantable on a stock boot); bare diagnostics envelope; per-type stats equal list reads; package scope; a misspelled type 400; all-clear page; outage pin 10/10 |
| studio-authoring.object-designer-roundtrip | 2 | PASS | the designer derives asset_code on blur; an underscore survives typing; empty picklist rows dropped without the identifier banner (manual run) |
| studio-authoring.page-variables-and-actions | 1 | PASS | the gated block stays hidden until a project is picked; a reactive hint on typing; submit sends resolved values and creates a real inquiry; reload re-initializes |
| studio-authoring.permission-matrix-editor-ux | 2 | PASS | field filter + bulk Write / Read / Clear touch only filtered fields; the saved map carries only set fields; clear persists; the matrix scrolls inside its pane at 820 px; the packaged set is read-only with Clone |
| studio-authoring.picklist-bound-select | 1 | PASS | a bound field saves without a both-declared error; Options-from offers the served picklists; binding autosaves; the inspector shows picklist values read-only; published forms render them; picklist pages read-only |
| studio-authoring.record-page-roundtrip | 3 | PASS | a new record page is seeded from the default layout; block picker; publish; the end-user record renders the added card |
| studio-authoring.view-authoring-live | 2 | PASS | a view draft is not served before publish; publish changes list and form on client reload with no restart; a second draft stays isolated until its publish |
Totals: 72 PASS / 10 PARTIAL / 8 FAIL / 0 BLOCKED / 0 NOT-RUN (planned: 1, outside the counts).
- 3 fails carry a product defect: plugin-grid: list inline edit saves without If-Match, so a stale grid edit silently overwrites a concurrent write (data integrity) — defaultRowSave / defaultBatchSave call dataSource.update with no optimistic-concurrency token objectui#12292, console Setup › Apps: Delete and Disable report success for writes that changed nothing — handleDelete ignores reset:false, and handleToggleActive saves a package-owned app with no package scope objectui#12300 and plugin-auth: the user-import wizard's automatic invitation link is dead — admin-import-users.ts calls requestPasswordReset with no redirectTo, so the emailed link carries an empty callbackURL and lands on INVALID_TOKEN #23152.
- 4 fail on checklist clauses only:
owd-save-gate,auth-method-matrix,self-signup-gateandformula-stdlib-matrixare all rows on platform-checklist: items whose clauses pin shapes the product has since ruled away — found by the browser pass at objectui 1fb1ced36243; re-point or re-word each (family card) #23121 and were revised onmainby docs(qa): six platform-checklist clauses re-pointed to the behaviour the product has since ruled (#23121) #23132. - 1 is an authorization finding withheld pending the maintainer (RUNNER rule 2 carve-out).
- No hop regression.
Fails — reproduction rules and dispositions
Product defects
records-forms.concurrent-edit-conflict · N2: product defect, objectstack-ai/objectui#12292.
- On a fresh boot as admin, open
/_console/apps/showcase_app/showcase_task/view/grid(inline edit on). Note that Ingest pipeline's Estimate reads 60. - Concurrently
PATCH /api/v1/data/showcase_task/ID {estimate_hours:77}with If-Match set to its updated_at → 200. - In the stale grid, click the Estimate cell, type 61, press Enter and click "Save All (1)".
- Expected: the grid save rides the OCC token, and the stale write is refused 409 with the conflict dialog (the item's negative: an unguarded inline save is a FAIL).
- Actual:
PATCH /api/v1/data/showcase_task/ID {estimate_hours:61}goes out with no If-Match → 200, and the re-read is 61. No 409, dialog or toast. Reproduced twice (77 → 61, 33 → 31). - Source: plugin-grid
ObjectGrid.tsxdefaultRowSave/defaultBatchSavecalldataSource.update(object, id, changes)with no ifMatch. The hop range is empty.
platform-core.app-management-toggle · C5b: product defect, objectstack-ai/objectui#12300.
- On the stock showcase, sign in as admin through the form and open
/_console/apps/setup/system/apps. - Click
getByRole('button',{name:'Delete Showcase'}), thengetByRole('button',{name:'Confirm delete Showcase'}).
- Wire:
DELETE /api/v1/meta/app/showcase_app→ 200{success:true, reset:false, message:'No customization overlay found … already at artifact default.'}. - Expected: no "deleted" success; a neutral "nothing to reset" notice or an error instead.
- Actual: a success toast "Showcase deleted", while the row stays "Showcase Active" and
/meta/appstill lists showcase_app after reload. Seen on 2 fresh loads. - Source: objectui
apps/console/src/pages/system/AppManagementPage.tsxhandleDeletecallstoast.successwithout readingreset.
platform-core.app-management-toggle · N1: product defect, objectstack-ai/objectui#12300.
- As admin,
POST /api/v1/packages {manifest:{id:'com.qa.lanebapp', name:'x', version:'0.1.0', type:'app'}}. PUT /api/v1/meta/app/lanebapp_app?package=com.qa.lanebappwith{name, label, icon, active:true, navigation:[{id, type:'object', objectName:'showcase_task', label}]}.- In the console, open
/_console/apps/setup/system/appsand clickgetByRole('button',{name:'Disable QA LaneB App'}).
- Wire:
PUT /api/v1/meta/app/lanebapp_appwith the body{…app, active:false}and no package query → 200 "Saved app … (env-wide, state=active)". - Expected: the app goes inactive and the launcher drops it, or the write is refused with an error toast.
- Actual: a success toast "disabled", the app unchanged everywhere (
GETreports active:true from com.qa.lanebapp), and a new shadowsys_metadatarow with package_id null and active:false that is never served. Seen on 2 fresh loads. - Source: client
handleToggleActivecallsmeta.saveItem('app', name, {...app, active})with no package scope. On the server, a PUT without?package=on a package-owned item writes an env-wide row the reader never serves, and answers 200. Set-default and Bulk take the same path.
identity-auth.identity-import-wizard · C2b: product defect, #23152.
- On the stock showcase (dev log email transport), as admin, go to Setup › Users › Import.
- Upload a CSV
email,namewith one row, click Next, choose the policy Automatic, then Import. Wire:POST /api/v1/auth/admin/import-users {rows:[{email,name}], mode:'insert', passwordPolicy:'auto'}→ 200 delivery email. - Read the
sys_emailrow to that address: the body link is/api/v1/auth/reset-password/TOKEN?callbackURL=(empty). GETthat link.
- Expected: landing on a set-password page (
/_console/reset-password?token=…), as the console's own forgot-password flow does. - Actual: 302 to
/api/v1/auth/error?error=INVALID_TOKEN, then a console login banner reading "Single sign-on could not be completed". The token is valid: POSTing it to/auth/reset-passwordanswers 200. - Control:
request-password-resetWITHredirectToyields a working link. Reproduced on two wizard imports. - Source:
packages/plugins/plugin-auth/src/admin-import-users.ts:704callsrequestPasswordReset({ body: { email } })with no redirectTo. - Secondary, on the card: the invitation reuses the password-reset copy.
Authorization finding (RUNNER rule 2 carve-out)
access-security.packaged-permission-set-lifecycle · C1: detail withheld pending maintainer.
Checklist clauses (no product defect)
access-security.owd-save-gate · A3: stale spec, #23121 (item rev 4 on main via #23132).
- Driven: with the admin bearer,
GET /api/v1/meta/object/showcase_announcementand set sharingModelpublic_read_write, externalSharingModelprivate. ThenPUT /api/v1/meta/object/showcase_announcementwith that body. - Clause expects: 403
{code:'PERMISSION_DENIED', declaredCode:'owd_widening_forbidden'}. - Actual: 403
{code:'NOT_OVERRIDABLE'}("sealed against in-place edits … ADR-0131") with no declaredCode. The tightened control and?package=com.example.showcaseare refused the same way, and the object stays byte-identical. - Why the product is right: the ADR-0131 D6 managed-content seal (feat(metadata-protocol)!: managed content is sealed — OS_METADATA_WRITABLE no longer opens an item a managed package ships (ADR-0131 D6, #15206 S2) #22401) now answers ahead of the plugin-security R1 gate the clause pins. The protection holds.
identity-auth.auth-method-matrix · A9: assertion defect, #23121 (rev 7 via #23132).
- Actual:
POST /api/v1/auth/delete-user {}with no credentials → 401UNAUTHORIZED; with a member bearer → 404; the callback → 404. No caller gets 2xx. - Clause expects: 404 for every caller.
- Why the product is right:
packages/plugins/plugin-auth/src/change-email-delete-user-wiring.test.tspins anonymous 401 (mounted, session-guarded) next to authed 404. Re-word: authed 404, anonymous 401, never 2xx.
identity-auth.self-signup-gate · N5: stale spec, #23121 (rev 3 via #23132).
- Actual: on a stock boot (no
auth.audiencedeclared),/_console/loginshows no Sign up link, and/_console/registerrenders[data-testid=register-by-invitation]with no inputs. - Control:
/_console/register?redirect=%2Faccept-invitation%2FINVITATION-IDrenders the full form. - Clause expects: the link and the form for every visitor.
- Why the product is right: objectui
RegisterPage.tsx/signUpOffer.tshave offered the form only to invitation redirects and zero-owner deployments since objectui#11691 / objectui#11705.
api-backend.formula-stdlib-matrix · C1: stale spec, #23121 (rev 2 via #23132).
- Actual: step 1's re-count moved.
registerStdLibregisters 29 functions: the item's 27 plusisoDateandisoDatetime(345d3f3d8, feat(formula): isoDate(t) / isoDatetime(t), the string form of a CEL timestamp #22347).content/docs/data-modeling/formulas.mdxlists the same 29. - All 29 pass their known answers against the built
packages/formula/dist: 73/73 asserted rows. Int / double types were asserted CEL-side. - Inside the item: the literal row
joinNonEmpty(['a', null, ' ', 'b'], '-')cannot evaluate, because cel-js refuses a heterogeneous list. The same semantics over record fields give'a-b'.
api-backend.formula-stdlib-matrix · C6: stale spec, #23121 (rev 2 via #23132).
- Actual:
PUT /api/v1/meta/object/qa_formula_probeadding a fieldbad_f = sqrt(4)→ 422 INVALID_METADATA "…sqrtis not a callable name here — a NAME fault …", and nothing is stored. Reproduced twice. - Clause expects: a silent null at head. The authoring door now refuses first, so the clause flips to the positive refusal its own text anticipates.
- Not ticked green.
Partial and blocked coverage (named, not dropped)
approvals.decision-action-matrixA9-wire: blocked(fixture). The live 500 envelope needs an org-less request, which no stock flow opens (knownGaps).automation.flow-node-type-matrixA1-http: blocked(environment). Egress is denied, so every http step fails "fetch failed".identity-auth.workspace-org-switchC3b: skipped. The premise is retired, because metadata writes are deployment-level and no org-only metadata id exists (see accuracy list).integration-system.email-template-renderA5: partial. The admin half passes; the declared-source half needs a writable showcase copy.integration-system.external-schema-browser-uiA6: blocked(environment). The objectui checkout is not installed, and the stock boot always wires federation.integration-system.notification-preference-suppressionA3-mandatory: blocked(fixture). The stock showcase declares no mandatoryTopics, and they are not runtime-writable.integration-system.notify-inbox-deliveryA3-501: blocked(fixture). The 501 arm needs a boot without MessagingServicePlugin, and the showcase requires messaging.integration-system.webhook-lifecycle:- A2: blocked(dependency, tenant wall). Flow multi-writes publish bulk events with no organizationId, the org-owned subscription refuses them, and an org-less subscription cannot be authored.
- N1 / N2: skipped for time.
studio-authoring.expression-editorsA7: blocked(environment). It is a pin-only clause, and the objectui checkout has no install.studio-authoring.metadata-diagnostics-sweepA6: blocked(fixture). No invalid stored row is plantable on a stock boot; it is pending a stale-row DB snapshot fixture.
Fixture gaps / checklist accuracy
Recorded on passing clauses, or as fixture prerequisites. Each one closes out through the family card #23121.
-
identity-auth.workspace-org-switchfixtures.requires names onlyOS_TENANCY_POSTURE. A walled posture refuses to boot the stock showcase without:@objectstack/organizationsdeclared in the host app'spackage.json(ADR-0093 D5);OS_PLATFORM_OWNER_EMAIL;- a declared membership policy (
OS_AUTH_MEMBERSHIP_POLICY). With invite-only, the invitee must alsoaccept-invitation.
C3b's meta half needs re-grounding, because metadata writes are env-wide now.
-
platform-core.lifecycle-retention-sweepstep 3: the[lifecycle]line is INFO andos devdefaults to warn, so the grep needsOS_LOG_LEVEL=info. Step 5's idle-proof expectation does not hold: a clean DB still logs "18 policy(ies) applied, ~0 rows reaped" on every sweep. A ruling is owed: stale step, or product defect. -
identity-auth.email-verification-loopC2 / step 4 name a POST variant.POST /auth/verify-emailanswers 404, and the console uses GET (VerifyEmailPage.tsx:47-56). -
cli.scaffold-first-runC2: the verify text says "each of the six templates", which is stale against variants[blank](rev 2). -
records-forms.field-group-visible-whenA3 expects the detail half to FAIL per objectui#11630. At this pin the detail page gates the group correctly (stale spec). -
dashboards.system-overview-live-counts:- A1's "no active-only filter" caveat is stale: the widget now filters
revoked_at null, expires_at > now. - A3's roster is stale: there is no
widget_organizationsand no permission-events KPI.
- A1's "no active-only filter" caveat is stale: the widget now filters
-
records-forms.object-hook-lifecycleA7: the log wording differs from the quoted[hook] async handler error (fire-and-forget). It is wording drift only. -
Persona recipe
search:qa-contributor-bound-memberstep 5: a member-createdshowcase_invoiceis invisible to its creator unless the body setsownerto the member's email. The same class applies toshowcase_task: a contributor's own task needsassigneeset to the member's email. -
attachments-storage.download-authz-both-sides(qa-scratch-authz step 6): persona B also needssys_attachmentread. Without it the panel shows "You don't have access to these attachments." before any download. -
search.console-global-searchstep 6: "Open Full Search Page" is offered only for an empty query or one matching "search all results full page". Reach/searchby URL or through that query. -
approvals.ooo-delegation-rerouteA0: steps 3–4 prescribe an autolaunched flow started byPOST /api/v1/automation/FLOW/trigger. That route cannot open an approval, becausebuildAutomationContextmaps the record into params only and the engine seeds$recordfromcontext.record("no record id in $record"). Reword to a record-triggered start. -
studio-authoring.custom-page-source-tiersA5 (step 8, knownGaps[0]): an html compile error is refused at save / publish (422 INVALID_METADATA), so the runtime error panel is reachable only in the designer's draft preview. Name the preview and the 422 gate as the observable surfaces. -
studio-authoring.metadata-diagnostics-sweepA1:stats.lockedis the served envelope lock (finding(metadata-protocol): two lock reports the #21670 read fix left unaligned — a host-config kernel's_lockgate admits a save the read now calls non-editable, andgetMetaDiagnostics().stats[type].lockedcounts declared_lockonly #21694), not rows whose declared_lockis not none. Compare against the item envelope's lock. -
studio-authoring.object-designer-roundtripA3: step 4's literal "no banner for the empty row" (and objectui F4'stoHaveCount(0)) collides with the select-needs-options rule whenever no real option exists yet. Assert with real options present. -
studio-authoring.record-page-roundtripA0: the create form's Page type now defaults tolist, so add "set Page type = record" to step 1. -
studio-authoring.draft-publish-lifecycleA8: step 10's?from=1&to=2compares the first draft save with its own publish, because history counts drafts and publishes. Name the publish versions read off/history. -
studio-authoring.doc-on-app-menuA0: the knownGaps recipe says the doc editor refuses the read-only package with 422. It now saves an env-wide draft, so drive the writable base over?package=. -
automation.flow-runs-page-test-triggerA2: fillingnew_assigneein step 6 satisfies the screen, and the run completes without pausing. Leave it empty to exercise the hand-off. -
automation.flow-node-type-matrixA1: notify steps fail loudly for tasks or projects created without an assignee or owner. That is a correct refusal; set an assignee in the recipe. -
integration-system.webhook-lifecycleA1: the shippedshowcase_task_changedwebhook materializes org-less, so it can never fan out on the org-walled showcase. Author the webhook inside the organization, or org-stamp the fixture. -
integration-system.email-template-render:- A0 / step 1: templates no longer materialize to
sys_email_template(0 rows; the registry serves the item), so rewrite step 1 and A5's "post-reboot row" againstGET /api/v1/meta/email_template/NAME. - A6: fixtures.requires still names the retired
categorykey.
- A0 / step 1: templates no longer materialize to
-
integration-system.external-schema-browser-ui:- A1 expects 5 columns, but the fixture DB carries 7 (API and panel agree).
- A4's knownGap ("ValidationPanel lacks unreachable") is stale at this pin.
-
identity-auth.implicit-account-linking-ownershipC3: the local IdP derivessubfrom the email, so a second identity is a distinct sub (fixture note). -
Fixture gaps already in their items' knownGaps, parked for completeness:
metadata-diagnostics-sweepA6 (stale-row DB snapshot);decision-action-matrixA9-wire (org-less request);notify-inbox-deliveryA3-501 (boot without messaging);notification-preference-suppressionA3-mandatory (mandatoryTopics);email-template-renderA5 (writable showcase copy).
Observations outside any clause (not verdicts)
Unverified product observations, UI polish and maintainer questions. None of them is scored, and none is filed unless a card is named.
identity-auth.oauth-app-consent-loopC2: the consent heading reads "CLIENT-ID wants to access your account" instead of the app name.OAuthConsentPage.tsxfetches/api/v1/auth/oauth2/applications/ID/public, a route the server does not serve. Filed: console OAuth consent page shows the raw client_id instead of the app's name — it fetches /oauth2/applications/ID/public, a route the server does not serve (its public-client lookup is /oauth2/public-client) objectui#12301.identity-auth.oauth-app-consent-loopC1: registering a loopback redirect (http://127.0.0.1:…orlocalhost) is refused with a message calling the loopback host non-loopback, and the refusal is HTTP 500 OAUTH_REGISTER_FAILED rather than a 4xx.records-forms.field-type-matrix: the DRAFT flowshowcase_approver_bindings(served statusdraft) opens an approval on everyshowcase_field_zooupdate and locks the row. The next write answers 409 RECORD_LOCKED.identity-auth.workspace-org-switchC5: with no active org on the server, the switcher still shows "Default Organization", and a create answers 500 ERR_SYSTEM_WRITE_ORGANIZATION_REQUIRED instead of a designed 4xx.platform-core.package-lifecycle-enable-disableA0: while a package is disabled, the by-nameGET /api/v1/meta/app/NAMEstill answers 200 with the full app, so the list and by-name routes disagree.automation.time-relative-triggerA0: the start node's Trigger select reads "—", and the populated sweep fields carry the amber "Kept, not in effect" stamp, although the flow is bound and sweeping (FlowNodeConfigField.tsx). A product-defect candidate, seen once, not a hop regression.integration-system.notification-preference-suppressionA4: a template row authored with localeen-USis never reached on anen-default deployment. The ladder walks tag → primary subtag →enand never climbs toen-US.identity-auth.admin-lifecycle-operationsA7: the impersonation banner names the administrator by raw user id, and the page underneath stays on a Setup URL the target cannot open.approvals.ooo-delegation-rerouteA3: the drawer Activity shows the raw action keyooo_substitutewith a "—" actor, and raw user ids in the comment.identity-auth.email-verification-loopC3: verification tokens are stateless and reusable until expiry.identity-auth.linked-accounts-socialC3: even on a provider-configured boot, Linked Accounts offers no link affordance. Linking is reachable only throughlink-socialor the login page.identity-auth.identity-import-wizardC3: the wizard offers "Update existing (skip if no match)", which the identity adapter refuses client-side with an honest message.access-security.permission-matrix-edit-loopA5: the lower matrix renderstitleas editable=false although the set declares no title entry, and the member's create with a title succeeds (a display default).platform-core.interrupted-migration-boot-reportC1: describeInterruptedRun joins its sentence parts with no separator ("committed 1 chunk(s)").cli.scaffold-console-first-paintC4: the scaffold object is in no app nav, and its activity line reads "System" while Created by reads Dev Admin.studio-authoring.permission-matrix-editor-uxA4: at 820 px the breadcrumb row overprints the type / badge chips.studio-authoring.metadata-diagnostics-sweepA5: the all-clear badge "0 issue(s)" renders in the red destructive style.studio-authoring.doc-on-app-menuA2: after clicking "Gated doc", the highlighted entry is "Gated page in book", because three entries resolve to one URL.- Maintainer question (
integration-system.webhook-lifecycleA2): as built, bulk webhook events from in-org flow predicate writes are undeliverable to any tenant subscription. Is the missing attribution of flow-node multi-writes intended?
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 13, 2026
Close-out · PM seat
domain:devx#2record composer,session_016JB93R2KcQP4GgKaUnseVF· 2026-10-13T04:59ZSibling record: #23163 (
surface:browser, same subject36b2889c+ objectui pin1fb1ced36243, same run). Card: #23104 (Half 2).Every
failon this record has one of the four dispositions:main.An authorization finding on
access-security.packaged-permission-set-lifecycleC1 is held for the maintainer. It carries no card and no detail, here or anywhere on GitHub (RUNNER rule 2).Some legs need nothing more than the record body:
automation.flow-node-type-matrixA1-http (egress),integration-system.external-schema-browser-uiA6 andstudio-authoring.expression-editorsA7 (objectui checkout not installed).cli.scaffold-*items stays in the record's own handoff list (§4).⚠ #23121 is closed. #23132 landed its first six rows, and the rows parked above are added in comment
6138566194. Until #23121 is reopened, or its rows move to a successor family card, this record's closeout debt stays open, and the record stays open with it.Generated by Claude Code
objectstack-fleet commentedon Oct 13, 2026
Parked-on target moved · PM seat
domain:devx#2,session_016JB93R2KcQP4GgKaUnseVF· 2026-10-13T05:04ZThe closeout above parks this record's checklist-accuracy and fixture rows on #23121, which had already closed (completed) after PR #23132 landed its first six rows. Those rows now live on the successor family card #23169; the lines below supersede the closeout's
Parked-on: #23121lines one for one. TheExtracted:lines above are unchanged.Parked-on: #23169 · identity-auth.workspace-org-switch · fixtures.requires: walled-posture prerequisites
Parked-on: #23169 · identity-auth.workspace-org-switch · C3b skipped: meta-half premise retired
Parked-on: #23169 · platform-core.lifecycle-retention-sweep · step 3 log level / step 5 idle-proof (ruling owed)
Parked-on: #23169 · identity-auth.email-verification-loop · C2 / step 4: verify-email is GET only
Parked-on: #23169 · cli.scaffold-first-run · C2 verify text names six templates
Parked-on: #23169 · records-forms.field-group-visible-when · A3 expected-fail stale (objectui#11630 fixed)
Parked-on: #23169 · dashboards.system-overview-live-counts · A1 caveat / A3 widget roster stale
Parked-on: #23169 · records-forms.object-hook-lifecycle · A7 log wording drift
Parked-on: #23169 · search.console-global-search · persona step 5: member rows need owner / assignee
Parked-on: #23169 · search.console-global-search · step 6: Open Full Search Page offer rule
Parked-on: #23169 · attachments-storage.download-authz-both-sides · persona step 6: B needs sys_attachment read
Parked-on: #23169 · approvals.ooo-delegation-reroute · A0: use a record-triggered start
Parked-on: #23169 · studio-authoring.custom-page-source-tiers · A5: compile panel only in the designer preview
Parked-on: #23169 · studio-authoring.metadata-diagnostics-sweep · A1: locked is the envelope lock
Parked-on: #23169 · studio-authoring.metadata-diagnostics-sweep · A6 blocked(fixture): stale-row snapshot
Parked-on: #23169 · studio-authoring.object-designer-roundtrip · A3: step 4 banner wording
Parked-on: #23169 · studio-authoring.record-page-roundtrip · A0: set Page type = record
Parked-on: #23169 · studio-authoring.draft-publish-lifecycle · A8: name the publish versions
Parked-on: #23169 · studio-authoring.doc-on-app-menu · A0 knownGaps recipe stale
Parked-on: #23169 · automation.flow-runs-page-test-trigger · A2: step 6 new_assignee skips the pause
Parked-on: #23169 · automation.flow-node-type-matrix · A1: notify recipe needs an assignee
Parked-on: #23169 · integration-system.webhook-lifecycle · A1: shipped webhook materializes org-less
Parked-on: #23169 · integration-system.webhook-lifecycle · A2 blocked(dependency) + maintainer question
Parked-on: #23169 · integration-system.webhook-lifecycle · N1 / N2 not attempted (time budget)
Parked-on: #23169 · integration-system.email-template-render · A0 / A5 / A6 stale; A5 partial (writable copy)
Parked-on: #23169 · integration-system.external-schema-browser-ui · A1 column count / A4 knownGap stale
Parked-on: #23169 · identity-auth.implicit-account-linking-ownership · C3 IdP sub fixture note
Parked-on: #23169 · approvals.decision-action-matrix · A9-wire blocked(fixture): org-less request
Parked-on: #23169 · integration-system.notify-inbox-delivery · A3-501 blocked(fixture)
Parked-on: #23169 · integration-system.notification-preference-suppression · A3-mandatory blocked(fixture)
Generated by Claude Code