Skip to content

QA run · area:studio-authoring (17/17) · 2034975a · 2026-10-16 · 16 PASS / 1 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN #23942

Closed

Description

@objectstack-fleet

Slice area:studio-authoring of the #23878 wave (the full platform-checklist run on main). A cloud runner ran it for the #23878 runner session session_01K3qUoyh1xFGoWzAACPMbXJ. The maintainer, verbatim: 「测试资源不够,你可以开云卡片吧?」 · 「测试遇到的问题,随时使用 pm-dispatch 技能提交issue」 · 「我不是马上要发布,就是测试看还有什么新问题,一起都要解决」.

Text only. Screenshots were consulted live as oracles and are not attached. The durable truth stays in docs/qa/platform-checklist/areas/studio-authoring.json.

Environment fingerprint

  • Framework (subject): objectstack 2034975a47193f04db4791614f4ac9331ff211d3 (main, detached), pnpm install --frozen-lockfile && pnpm build: 75/75 turbo tasks, 9 min.
  • Console: objectui daeb77fc84dd (.objectui-sha), built against spec a35f7a67^ (34b740f).
  • App / boots: examples/app-showcase from that worktree, OS_PORT=P objectstack dev --ui --seed-admin -p P -d file:DIR/data.db.
    • Ports: 4310 (parent API legs), 4320 / 4330 / 4340 (browser lanes A / B / C), 4350 (the picklist fixture boot) and 4360 (re-verification of the extracted observations). Each boot had its own DB.
    • The 4340 lane ran a second boot with OS_PAGE_REACT=off, confirmed through /proc/PID/environ.
    • The picklist fixture ran from a third scratch worktree at the subject sha. Its examples/app-showcase/objectstack.config.ts edit (a definePicklist plus one picklistExtensions entry) was uncommitted and reverted, and that boot used --compile.
  • Admin: admin@objectos.ai from --seed-admin. Members were minted with POST /api/v1/auth/admin/create-user, and identity was proven with GET /auth/get-session before each persona cell.
  • Browser: Playwright from Node on /opt/pw-browsers/chromium. Each persona had its own context with a form sign-in.
  • Execution:
    • Three runner subagents (lanes A, B, C) ran in parallel, each on its own port and DB. The parent ran the API legs, the picklist item, the Tier-1 pins and the re-verification.
    • The lanes ran 12:47–13:19Z on 2026-10-16. No server stayed up during any vitest run.
  • Tier-1 pins cited (this repo, --maxWorkers=1):
    • packages/objectql/src/overlay-precedence.test.ts: 26/26.
    • packages/metadata-protocol/src/protocol.diagnostics-store-outage.test.ts + metadata-diagnostics.union-issues.test.ts: 2 files, 25/25.
    • packages/qa/dogfood/test/dashboard-designer-roundtrip.dogfood.test.ts: 3/3.
  • objectui pins (RUNNER option b): run inside the objectui checkout at daeb77fc that build-console.sh cloned: celAuthoring.test.ts, CelPredicateField.test.tsx, CelTestRunDialog.test.tsx, PermissionAdvancedFacets.cel.test.tsx, PermissionMatrixEditor.fieldBulk.test.tsx and PermissionMatrixEditor.readonly.test.tsx. Result: 6 files, 81/81. The run includes describe('celAuthoring · graceful degradation').
  • Server-restart evidence: every boot that scored a no-restart clause shows exactly one "Development Mode … ✓ Server is ready" sequence, and the listening PID did not change across the sequence (lane A PID 17092, lane B PID 16830).

Scope

node scripts/checklist-select.mjs area:studio-authoring --json returned 17 runnable items, and all 17 are judged here. No blocked item was hidden by the selector, and no planned item matched.

item rev priority surface
studio-authoring.first-run-loop 3 P0 mixed
studio-authoring.object-designer-roundtrip 3 P1 mixed
studio-authoring.view-authoring-live 2 P1 mixed
studio-authoring.record-page-roundtrip 4 P1 mixed
studio-authoring.draft-publish-lifecycle 5 P1 mixed
studio-authoring.authoring-validation-not-persisted 3 P1 mixed
studio-authoring.org-override-registry-gate 2 P1 api
studio-authoring.expression-editors 3 P1 mixed
studio-authoring.permission-matrix-editor-ux 2 P2 mixed
studio-authoring.custom-page-render-and-blocks 1 P2 mixed
studio-authoring.page-variables-and-actions 1 P2 mixed
studio-authoring.custom-page-source-tiers 2 P2 mixed
studio-authoring.packaged-automation-studio-lock 2 P1 browser
studio-authoring.packaged-display-class-direct-edit 1 P2 browser
studio-authoring.metadata-diagnostics-sweep 3 P2 mixed
studio-authoring.doc-on-app-menu 2 P1 mixed
studio-authoring.picklist-bound-select 1 P2 mixed

Per-clause verdicts (text evidence)

Clause ids are cN, the index in the item's acceptance.

studio-authoring.first-run-loop · rev 3 · PASS (lane A, :4320, one boot)

  • c0 PASS: Home → Build an app → Studio "New package (writable base)" wizard: 维修中心 / com.example.repairs / namespace repairs → POST /api/v1/packages 201. The switcher lists "维修中心 com.example.repairs Writable".
    • No-reload proof: a second package created from the switcher appeared in the same document, and a window marker survived.
  • c1 PASS: New object "Repair Ticket" auto-suggested repair_ticket and was saved as repairs_repair_ticket. OWD was pre-selected "Private — owner only".
    • Status picklist (open / in_progress / done) → autosave PUT 200 → Publish all → POST /packages/com.example.repairs/publish-drafts 200, toast "Published 1 item in this package (one atomic release)".
    • GET /meta/object/repairs_repair_ticket → fields.status with exactly 3 options.
  • c2 PASS: Studio Records grid → Add record "Broken compressor", Status "In Progress" → POST /data/repairs_repair_ticket 201. GET /data/repairs_repair_ticket → status:'in_progress'.
  • c3 PASS: Create app "Repair Center" → repair_center, nav seeded (checkbox default ON, knownGap) → Publish all 200.
    • Home launcher shows the Repair Center tile.
    • The end-user list /apps/com.example.repairs/repairs_repair_ticket shows the row with a blue "In Progress" label chip.
    • GET /meta/app?id=repair_center navigation is [{type:'object', objectName:'repairs_repair_ticket'}].
  • c4 PASS: the boot log has one "Development Mode … Server is ready" sequence. Listener PID 17092 (12:47:40) was unchanged through the end-user list, and no code was written.
  • c5 PASS: forged writes to the read-only showcase:
    • PUT /meta/object/showcase_qa_forged?mode=draft&package=com.example.showcase → 422 WRITABLE_PACKAGE_REQUIRED.
    • PUT /meta/object/showcase_task?mode=draft&package=com.example.showcase (+field) → 403 ITEM_LOCKED.
    • The same without ?package → 403 NOT_OVERRIDABLE.
    • Afterwards showcase_qa_forged is 404, and showcase_task has no added field.

studio-authoring.object-designer-roundtrip · rev 3 · PASS (lane A; manual run, objectui pin not cited)

  • c0 PASS: object minted as repairs_repair_asset (namespaced package; see accuracy list). Save + Publish 200.
    • v1 user-field order: asset_code, condition.
    • After a drag-reorder and renaming option Fair→Average, Save + Publish 200. v2 order: condition, asset_code.
    • The v1→v2 diff is only fields.condition.options[1].label plus the key order.
  • c1 PASS: typing label "Asset Code" gives field-apiname-input = asset_code (typing and after blur). The Records tab create → POST /data/repairs_repair_asset 201, and GET …/wTWF4lapR7CdjAwA has key asset_code:'AC-001' (no field_N).
  • c2 PASS: repair_asset typed key by key into object-name-input reads back repair_asset (underscore kept). A screenshot confirmed render first.
  • c3 PASS: the select-needs-options banner showed before any real option (expected). With 3 real options plus 1 empty row, there was no validation-banner / role=alert / "at least 2 characters" after a 3.5 s debounce. The saved PUT and the published meta both carry exactly 3 options.

studio-authoring.view-authoring-live · rev 2 · PASS (lane A)

  • c0 PASS: PUT /meta/view/qa_repair_asset_views?mode=draft&package=com.example.repairs (list grid + form simple) → 200 {success, version hmac…, seq 13, state:'draft'}.
  • c1 PASS: before publish, the GET of the name is 404, /meta/view?object=repairs_repair_asset returns [], and the end-user list shows the synthesized Asset Code | Condition.
    • With a second draft pending, the list still showed the published columns.
  • c2 PASS: publish 200. After a client reload the list shows Condition | Asset Code | Owner, and the record form shows the "QA Asset Section" section. Single boot, PID unchanged.
  • c3 PASS: /meta/view?object=repairs_repair_asset → expanded repairs_repair_asset.default (list, authored columns) and repairs_repair_asset.form (the authored section). The container name is absent, as designed.
  • c4 PASS: edit (reorder + created_at) → draft 200 → publish 200. The reload renders Owner | Asset Code | Condition | Created At.

studio-authoring.record-page-roundtrip · rev 4 · PASS (lane A; manual, the stale pin was not used)

  • c0 PASS: /apps/showcase_app/metadata/page/new; the form defaulted to list, so it was set to record, Object showcase_invoice.
    • Captured PUT /meta/page/invoice_page_a1016b?mode=draft 200 with body type:'record', object:'showcase_invoice', template:'default'.
    • regions[0].components = page:header, record:highlights, record:path, page:tabs(record:details), record:discussion.
  • c1 PASS: the editor shows the Basics and Layout canvas. The Add-block picker lists Card (page:card), Section (page:section) and Record details (record:details), among the DATA / LAYOUT / RECORD CONTEXT groups.
  • c2 PASS: Card "QA Card A1016" added → draft PUT 200 → POST …/publish 200. GET /meta/page/invoice_page_a1016b contains the page:card inside the tabs' Details child.
  • c3 PASS: the end-user record INV-1002 renders header, highlights, path, details, the "QA Card A1016" card and Discussion. The authored page wins over the default.

studio-authoring.draft-publish-lifecycle · rev 5 · PASS (parent :4310 API legs; lane B :4330 browser legs)

  • c0 PASS: PUT /meta/dashboard/qa_lifecycle_probe?mode=draft (bar widget on showcase_task_metrics, [status] / [task_count]) → 200 {success, version, seq 9, state:'draft'}. GET → 404.
  • c1 PASS: POST …/publish 200 seq 10. GET 200 serves widget "Rev1 by status".
  • c2 PASS: draft rev2 ("Rev2 by priority", [priority]) is staged while the live read stays on rev1. After publish the live read is rev2.
  • c3 PASS: PUT with If-Match = the rev1 version → 409 METADATA_CONFLICT with currentVersion. The audit row reads outcome denied, code metadata_conflict.
  • c4 PASS: writable com.qa.lcpkg (namespace qalc).
  • c5 PASS: a widget carrying a stray object key is refused already at the draft door: 422 INVALID_METADATA widgets.0 [unrecognized_keys]. Publish then answers 404 NO_DRAFT, and the GET is 404, so nothing crosses into active.
  • c6 PASS (lane B): a dashboard draft staged in writable com.qa.laneb shows the "Unpublished draft" chip and a "1" pill on the Changes button in Studio. Publish all → publish-drafts 200 → chip and pill gone, also after a reload.
  • c7 PASS: /history → v1 create (draft), v2 publish, v3 create, v4 publish, ascending seq 9–12, actor = the admin id.
  • c8 PASS: /diff?from=2&to=4 → added [] removed [] changed [{path:'widgets', from:[…Rev1/status…], to:[…Rev2/priority…]}]. It names widgets only, with no label or columns dump.
  • c9 PASS: POST …/rollback {toVersion:1} → 200 restoredFromVersion 1, and GET serves "Rev1 by status".
    • Lane B, own boot, the same sequence: the rendered /apps/showcase_app/dashboard/qa_lifecycle_probe shows the bar "Rev1 by status" with status buckets.
    • {} and {toVersion:'abc'} → 400 INVALID_REQUEST "'toVersion' (positive integer) is required".
  • c10 PASS: the /audit rows for save, publish, rollback and the denied conflict each carry actor = the admin user id.
  • c11 PASS: rollback with header X-Actor: someone_else_entirely → 200. Its audit row names the admin id, and someone_else is absent from both /audit and /history.

studio-authoring.authoring-validation-not-persisted · rev 3 · PASS

  • c0 PASS: PUT /meta/object/qa_invalid_probe?mode=draft with a field missing type → 422 INVALID_METADATA "object/qa_invalid_probe failed spec validation: 1 issue — fields.bad_field.type [invalid_value]", issues[0].path fields.bad_field.type.
  • c1 PASS: a container carrying type / columns beside list → 422 unrecognized_keys "type belongs to a single VIEW, not to the container. Wrap it: defineView({ list: { type, data, columns, … } }) … The container's own keys are list, form, listViews, formViews."
  • c2 PASS: the GET after each rejection → 404 RESOURCE_NOT_FOUND. In the designer leg, both the active and the ?state=draft reads are 404.
  • c3 PASS (lane A): object designer Source tab, a field without a type.
    • The live banner reads "Fields → bad_field → type: Invalid option …".
    • Save → PUT 422 with the same located issue. A second red banner located on fields.bad_field.type appears, and the editor stays Unsaved. There is no generic "save failed".
  • c4 PASS: the corrected object (type text) → 200 state:'draft'. The corrected view (wrapped under list) → 200 state:'draft'.

studio-authoring.org-override-registry-gate · rev 2 · PASS (parent :4310; the registry flags were read first and are unchanged for object/view/dashboard/job)

  • c0 PASS: PUT /meta/object/showcase_task (label changed) → 403 NOT_OVERRIDABLE. Variant PUT /meta/field/showcase_task.title → 403 NOT_OVERRIDABLE.
  • c1 PASS: PUT /meta/view/showcase_task.grid with label "QA Overlay Grid" → 200 "Saved customization overlay (env-wide, state=active)". GET serves "QA Overlay Grid".
  • c2 PASS: PUT /meta/job/qa_probe_job → 403 NOT_CREATABLE ("type 'job' is code-only … allowRuntimeCreate=false").
  • c3 PASS: PUT /meta/object/qa_org_probe (new, sharingModel private) → 200 active, in the same run as the 403 on showcase_task. Dashboard variant: a new dashboard → 200.
  • c4 PASS: DELETE /meta/view/showcase_task.grid → 200 reset:true, and the GET is byte-identical to the pre-overlay base. A second DELETE → reset:false "already at artifact default".
  • Pin: overlay-precedence.test.ts 26/26.

studio-authoring.expression-editors · rev 3 · PASS (lane B; engine truth = a direct import of @objectstack/formula 18.0.0-next.2 with celAuthoring's own arguments)

  • c0 PASS: formula editor record.est_hours * 1.1 → "Σ Result type: Number". record.a + record.b → "Result type: Unknown — … Wrap operands in double() / int() / string()". The engine infers number / unknown.
  • c1 PASS: the edited formula string(record.est_hours) → saved returnType:"text". The un-edited sibling sib_total keeps its prior returnType:"number" (formulaEdited guard).
  • c2 PASS: lint tiers equal the engine for every probe:
    • est_hourz → error unknown-field;
    • bare est_hours → error bare-reference, and autosave is held;
    • record.est_hours * → error invalid-cel;
    • non-pushdownable USING → warning, matching engine isPushdownableCel ok:false.
  • c3 PASS: previous. / record. open a listbox with this object's fields, and Enter inserts. current_user. offers none of them. A bare est_hours is withheld from completion and flagged.
  • c4 PASS: RLS USING, non-pushdownable → amber widen-access warning with Save enabled. Parse fault owner_id == → red error, Save disabled, title "Fix the CEL syntax errors before saving."
    • The persisted policy reads back in GET /meta/permission/qab_matrix rowLevelSecurity.
  • c5 PASS: Test-policy dialog results:
    • status == 'open' with an open sample → Allowed;
    • the same predicate with a closed sample → Denied;
    • est_hours * 2 → "Non-boolean result 6".
    • Engine evaluate gives true / false / 6.
  • c6 PASS: in the parity table, every editor verdict equals the engine verdict.
  • c7 PASS (pin, RUNNER option b): objectui celAuthoring.test.ts "celAuthoring · graceful degradation" (lint [], introspect fallback, test-run 'unavailable'), at objectui daeb77fc, within the 81/81 run.

studio-authoring.permission-matrix-editor-ux · rev 2 · PASS (lane B; objectui pins fieldBulk + readonly also green at daeb77fc)

  • c0 PASS: writable set qab_matrix (com.qa.laneb), Account expanded (23 fields). Filter "rea" leaves counter "3 / 23" and only 6 checkboxes in the DOM.
  • c1 PASS: Write all over the 3 visible fields. After clearing the filter, the 20 hidden fields equal the baseline (diff []). "Read all" over website and "Clear" over billing_email touched only those fields.
  • c2 PASS: Save → PUT 200. The saved fields keys are tax_id (pre-existing, untouched), website, churn_reason / created_at / created_by: each is a subset of the names visible at its bulk.
  • c3 PASS: showcase_account.billing_email is absent from the saved map after Clear + Save.
  • c4 PASS: at 820 px the matrix container (overflow-x:auto, scrollWidth 960 > clientWidth 772) scrolls. Scrolled right, the full Bulk column R / CRUD / All / None is visible and clickable.
  • c5 PASS: on packaged showcase_contributor there is no Save ("Clone to customize"), every bulk button and all 795 checkboxes are disabled, and no write was sent.
    • The badges name the reason distinctly: "Read-only (this set is provided by a code package)" in metadata-admin, and "Read-only package — switch to or create a writable package to edit." in Studio Access.

studio-authoring.custom-page-render-and-blocks · rev 1 · PASS (lane C; seed: 5 projects / 10 tasks / 14 accounts)

  • c0 PASS: command-center, my-work, project-workspace and active-projects each render their declared blocks: 0 role=alert, 0 "Unknown component type", 0 pageerror, and 5 recharts SVGs on command-center.
  • c1 PASS: KPIs equal the data plane: Active 2, Open 8, Review 2, At-Risk 1, Accounts 14, Budget 1.1M. The work-queue grid's 10 rows equal GET /data/showcase_task.
  • c2 PASS: SVGs are 315×350 / 681×350. '任务状态分布' = POST /analytics/dataset/query showcase_task_metrics [status]: 5 buckets of 2, matching the data-plane counts.
  • c3 PASS: the My Work grid query filters owner_id = the admin id, 10 rows. A foreign-owned task (minted member) is absent; the unfiltered table has 11.
  • c4 PASS: Active Projects shows 4 rows, budget descending (600k / 200k / 150k / 90k). The completed "Legacy Sunset" exists in the data plane but is filtered out. The grid/kanban switch and the Health/Status filters are present.
  • c5 PASS: project-workspace shows the parent fields plus the inline Tasks child table with "Add task".
  • c6 PASS: qa_page_probe (published) renders "Error loading grid — Metadata not found for object: qa_no_such_object_zz" and a role=alert "Unknown component type: qa_bogus_block_type". Neither region is blank. The probe was deleted.

studio-authoring.page-variables-and-actions · rev 1 · PASS (lane C)

  • c0 PASS: on first render the hint is visible and the detail panel absent.
  • c1 PASS: getByRole('combobox',{name:'Project'}) → "Website Relaunch". The hint disappears and the detail panel appears. 0 navigations, and a window marker survived.
  • c2 PASS: DOM before {hint:true, heading:false, body:false} → after {false, true, true}.
  • c3 PASS: typing into #field_email shows the ready hint.
  • c4 PASS: POST /api/v1/forms/contact-us/submit body carries the typed name / email / company / message and no {{page. token. The response is 201.
  • c5 PASS: showcase_inquiry 3 → 4, and the new row carries the typed values (status new, source web).

studio-authoring.custom-page-source-tiers · rev 2 · PASS (lane C; boot1 default, boot2 OS_PAGE_REACT=off)

  • c0 PASS: capability-map and command-center-jsx render static composed boards (0 <script>, no compile panel). crm-workbench renders a live ListView and a form.
  • c1 PASS: Open Tasks shows 128 while showcase_task total is 11, and the html pages send 0 /data or /analytics requests.
  • c2 PASS: Total projects 5 = showcase_project total 5, with GET /data/showcase_project?top=200 on the wire.
  • c3 PASS: a row click binds the form to "Mobile App", and "+ New project" switches the form to create mode.
  • c4 PASS: on boot2 (OS_PAGE_REACT=off), crm-workbench shows "React pages are disabled on this deployment… (OS_PAGE_REACT=off…)" and sends no data requests. The html pages are unchanged.
  • c5 PASS: faulting html source at the active PUT → 422 INVALID_METADATA with 3 compile issues. Saved ?mode=draft → 200; publish → 422; GET → 404.
    • The Studio draft preview shows "HTML page failed to compile (3)".
    • A throwing react page renders "React page error — Error: QA-LANEC deliberate react runtime fault".

studio-authoring.packaged-automation-studio-lock · rev 2 · PASS (lane B)

  • Precondition: GET /packages reports com.example.showcase writable:false, and the page's own fetch answered before the rail rendered.
  • c0 PASS: the Automations rail ("AUTOMATIONS 32") has no New button. After canvas touches, a drag, Delete and a 5 s wait, the network shows 0 non-GET requests.
  • c1 PASS: GET /meta/flow/showcase_urgent_task_alert is byte-identical before and after the whole probe.
    • Forged PUT …?mode=draft&package=com.example.showcase → 403 ITEM_LOCKED; the same without package → 403 NOT_OVERRIDABLE. Neither is 2xx.
    • See the accuracy list: the clause names 422.
  • c2 PASS: the Enabled switch is disabled (aria-describedby "Read-only package — switch to or create a writable package to edit."). A forced click leaves aria-checked unchanged and sends 0 requests.
  • c3 PASS: all 17 inspector controls are disabled and the typed edit is not actionable. After a reload the flow is unchanged (the inert shape).

studio-authoring.packaged-display-class-direct-edit · rev 1 · PASS (lane B)

  • c0 PASS: /metadata/view/showcase_task.default opens with a "writable" chip and no lock banner.
    • Label → "All Tasks QAB", plus an Owner column → draft PUT 200 → publish 200.
    • /meta/view?object=showcase_task serves the overlay, and /layers still carries the code base underneath.
  • c1 PASS: a minted member's task list shows the tab "All Tasks QAB" with an Owner column. Single boot, PID 16830.
  • c2 PASS: system_overview opens editable. Widget title "Login Events QAB" → publish 200, and the rendered board shows it.
  • c3 PASS: the "Reset overlay" control → DELETE 200 reset:true for the view (seq 15) and the dashboard (seq 16). Fresh GETs are byte-identical to the baselines, and both renders are back to stock.
  • c4 PASS: /metadata/flow/showcase_urgent_task_alert shows the lock banner "This item is locked and cannot be edited or deleted. com.example.showcase@0.1.0". There is no save / publish / reset control, the inputs are disabled, and no write was sent.

studio-authoring.metadata-diagnostics-sweep · rev 3 · PARTIAL (parent :4310 API; lane B browser)

  • c0 PASS: the bare body has keys entries, total, scannedTypes, scannedItems, stats, with total 0 = entries.length. scannedTypes 27 = the registry types with a getMetadataTypeSchema schema (27 of 28).
  • c1 PASS: stats.count = list length for object 109, view 36 and flow 32, and the sorted distinct _packageId sets are equal.
    • locked matches the per-item /layers envelope lock: object 107, view 0, flow 32.
  • c2 PASS: ?package=com.example.showcase narrows the sweep to 245 items (object 24, view 36, flow 32, page 28, action 71…). All 20 package-scoped directory tiles equal the scoped stats (Object 24 ≠ unscoped 107).
  • c3 PASS: ?type=viewes → 400 INVALID_REQUEST naming view / views. ?severity=error&severity=warning → 400 "supplied 2 times".
  • c4 PASS: ?severity=warning → 200, total 0, entries byte-identical to the error sweep, no warning rows.
  • c5 PASS: /metadata/_diagnostics shows "All clear — Scanned 399 item(s) across 27 type(s)" (= the API). The directory has no diagnostics button (0 links).
  • c6 BLOCKED(fixture): no invalid stored row can be planted on a stock boot (knownGaps[0]). The producer pin metadata-diagnostics.union-issues.test.ts is green but does not score this clause.
  • c7 PASS: pin protocol.diagnostics-store-outage.test.ts (with union-issues) 25/25.

studio-authoring.doc-on-app-menu · rev 2 · PASS (lane C; console daeb77fc carries the refusal page and the menu pruning, so this run is outside the fork window)

  • Fixture (knownGaps recipe): package com.qa.lanecdoc (namespace qacd).
    • Docs qacd_gated_doc and qacd_open_doc.
    • Books: qacd_aaa_empty (first by label, claims nothing), qacd_open_book, and qacd_gated_book ({permissionSet:'showcase_auditor'}).
    • App qacd_app with 6 doc entries.
    • Reader: holds showcase_auditor through a sys_user_permission_set row. Outsider: holds nothing extra.
    • Torn down afterwards; /meta/book, /meta/doc and /meta/app?id=showcase_app are byte-identical to the baseline.
  • c0 PASS: /meta/app?id=qacd_app per persona (each session proven with get-session): reader 6 entries, outsider 3, admin 3. /meta/doc/qacd_gated_doc: reader 200, outsider 403.
  • c1 PASS: the rendered menu equals the API answer for each persona (6 / 3 / 3), empty diff.
  • c2 PASS: the reader's {doc}-only entry lands on /apps/com.qa.lanecdoc/docs/qacd-gated/qacd_gated_doc (the claiming book, not "AAA Empty Book"). Each book sidebar is a subset of that member's /meta/book/X/tree.
  • c3 PASS: the outsider gets "You do not have access to this documentation" plus the server's reason on 6 direct routes (by doc / book name, /docs/… and /apps/qacd_app/docs/…), with the server at 403. The control name reads "Documentation not found" (server 404).

studio-authoring.picklist-bound-select · rev 1 · PASS (parent :4350; console daeb77fc, which already carries objectui#10202 — Options-from / read-only picklist pages observed)

  • Fixture: qa_severity (low / medium / high) plus an extension "critical", loaded by the boot ("1 Picklists 1 Extensions"). Writable com.qa.picks: qapk_ticket (severity bound, kind inline) and qapk_incident (level inline).
  • c0 PASS: Setup metadata › qapk_ticket, rename the Title label → autosave PUT /meta/object/qapk_ticket?mode=draft 200.
    • fields.severity is {type, label, picklist} with no options; fields.kind is byte-identical.
  • c1 PASS: no "cannot both be declared" text after load.
  • c2 PASS: on qapk_incident › Level, the 'Options from' combobox offers ["This field's own options","QA Severity (qa_severity)"], which equals GET /meta/picklist.
  • c3 PASS: choosing it → PUT 200 fields.level {type, label, picklist:'qa_severity'} with no options.
  • c4 PASS: the bound inspector shows "Options come from the picklist “QA Severity”. A field bound to a picklist has no options of its own…", with the values listed read-only and 0 "Add value" buttons.
  • c5 PASS: Studio › Data › QA Ticket › Form › Add field → PUT …?mode=draft&package=com.qa.picks 200, with severity sent without options.
  • c6 PASS: after publish-drafts (2 published), both Studio new-record dialogs offer Low / Medium / High / Critical.
  • c7 PASS: the list page carries a read-only badge and no New. The detail page shows label, name, the owning package, options, and "Extensions — Added by ObjectStack Showcase (com.example.showcase) Critical/critical".
    • All 25 inputs and the Add/Remove row buttons are disabled, and no /meta write was sent.

Derived item verdicts

16 PASS / 1 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN. No item is planned.

  • PARTIAL: studio-authoring.metadata-diagnostics-sweep (c6 blocked(fixture)). Every other item passes.
  • No fail, so no reproduction rules are owed. The two product defects extracted from this run were met outside any clause. They are listed with their cards in the close-out comment below, and their reproductions live on the cards.

Fixture gaps

Checklist-accuracy findings (for the wave anchor #23878; not extracted)

  1. org-override-registry-gate variants: "field (override locked, create open)" is stale. The registry has field allowRuntimeCreate:false since meta-field-write-inert: an accepted field PUT never reaches the object — a runtime-created field is stored valid=true and is absent from fields forever #7893.
  2. metadata-diagnostics-sweep c1: the envelope lock is not on the default GET /meta/TYPE/NAME, because that cached arm carries no lock by design (rest-server.ts). Read it from GET /meta/TYPE/NAME/layers.
  3. object-designer-roundtrip: the steps and clauses name repair_asset / GET /meta/object/repair_asset, but in a namespaced writable package the object must be NS_repair_asset (the publish gate answers NAMESPACE_PREFIX). The route /apps/com.objectstack.studio/… renders inside Showcase chrome, because studio is not loaded on stock boots.
  4. draft-publish-lifecycle c6: the counter is now a numbered pill inside "Changes" (objectui#12459), not "Changes · n". An env-wide (package-less) dashboard draft is not counted in any package scope, so stage the draft in a writable package.
  5. packaged-automation-studio-lock c1: the forged flow write is refused 403 ITEM_LOCKED (with ?package=) or 403 NOT_OVERRIDABLE (without), naming clone/toggle, not "422 [writable_package_required]". c2 / step 4: the disabled switch carries its reason in aria-describedby and a tooltip, not in a title (objectui#12303).
  6. packaged-display-class-direct-edit:
    • the flow lock banner reads "This item is locked and cannot be edited or deleted." (not "provided by an installed package");
    • the showcase ships individual views (showcase_task.default …), not a container;
    • system_overview's /layers reports packageId com.objectstack.plugin-auth, not platform-objects.
  7. permission-matrix-editor-ux c5: three read-only reasons exist (package, artifact perm.readOnly.artifact, type). The type gate is unreachable on stock; name all three.
  8. custom-page-source-tiers step 8(a): the draft-preview compile panel is reachable only for a page in a writable package that an app's nav references (/studio/PKG/interfaces?surface=page:NAME). An env-wide draft has no Studio surface.
  9. doc-on-app-menu knownGaps: daeb77fc is past the fork window; the console carries the refusal page and the pruning.

Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Close-out for this record (checklist-test §5). The run has no fail, so there is no four-way disposition owed. One PARTIAL coverage gap is parked on the wave anchor. Two product defects met outside the clauses were extracted to objectui, where their fixes land.

    Extracted: objectstack-ai/objectui#12680 · studio-authoring.object-designer-roundtrip · observation (label overwrites a hand-typed object name)
    Extracted: objectstack-ai/objectui#12681 · studio-authoring.expression-editors · observation (false retired-`formula` banner on every formula edit)
    Parked-on: #23878 · studio-authoring.metadata-diagnostics-sweep c6 blocked(fixture): no invalid stored row plantable on stock
    

    Both objectui cards were created through the fleet relay (runs 38907724977 and 38907832287, whose annotations name the issue numbers). This session cannot read objectui over the API, so their read-back is unverified here.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 16, 2026

    @objectstack-fleet
    ContributorAuthor

    Closing at 2026-10-16T15:21Z: this record's §5 close-out is posted — comment 6216532870 — with 16 pass · 1 partial · 0 fail of 17. The one partial is parked there (Parked-on: #23878 · studio-authoring.metadata-diagnostics-sweep c6 blocked(fixture)), and its two extractions are objectstack-ai/objectui#12680 and objectstack-ai/objectui#12681. The slice's non-clause observations were re-checked by the #23878 recheck slice (report 6218243967): diagnostics red header → objectstack-ai/objectui#12721; raw view-tab name → #23967; raw picklist values on the canvas → not reproducible; Access pillar scope → by design; field_N names → fixed on objectui main by objectui#12516.

    Closed by the domain:devx seat 1 PM (seat post #6023) · os-sales · session_014eFvbvGK4FjXvscggDNTD4, as part of the paced close-out of the #23878 wave.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions