Repository navigation
QA run · area:studio-authoring (17/17) · 2034975a · 2026-10-16 · 16 PASS / 1 PARTIAL / 0 FAIL / 0 BLOCKED / 0 NOT-RUN #23942
Description
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 speca35f7a67^(34b740f).- Built in a linked worktree with
scripts/build-console.sh, becausepnpm objectui:buildfails on main (Console pin does not build on main: objectui daeb77fc imports checkPageComponentViewData, deleted from spec by #23784 #23908, not re-filed): the pin importscheckPageComponentViewData, which feat(spec)!: delete checkPageComponentViewData; the component-props rule is the one judge of a page component's retired api data binding #23784 deleted from spec. - The resulting
packages/console/distwas copied into a second linked worktree at the subject sha, alongside every frameworkdistbuilt from the subject tree. There,pnpm check:console-shareports "Console dist matches the objectui pin (objectui@daeb77fc84dd)". - Every browser verdict below ran on objectui daeb77fc built against spec
a35f7a67^. Framework code is the subject's.
- Built in a linked worktree with
- App / boots:
examples/app-showcasefrom 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.tsedit (adefinePicklistplus onepicklistExtensionsentry) was uncommitted and reverted, and that boot used--compile.
- Admin:
admin@objectos.aifrom--seed-admin. Members were minted withPOST /api/v1/auth/admin/create-user, and identity was proven withGET /auth/get-sessionbefore 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.shcloned:celAuthoring.test.ts,CelPredicateField.test.tsx,CelTestRunDialog.test.tsx,PermissionAdvancedFacets.cel.test.tsx,PermissionMatrixEditor.fieldBulk.test.tsxandPermissionMatrixEditor.readonly.test.tsx. Result: 6 files, 81/81. The run includesdescribe('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/ namespacerepairs→POST /api/v1/packages201. The switcher lists "维修中心 com.example.repairs Writable".- No-reload proof: a second package created from the switcher appeared in the same document, and a
windowmarker survived.
- No-reload proof: a second package created from the switcher appeared in the same document, and a
- c1 PASS: New object "Repair Ticket" auto-suggested
repair_ticketand was saved asrepairs_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-drafts200, toast "Published 1 item in this package (one atomic release)". GET /meta/object/repairs_repair_ticket→fields.statuswith exactly 3 options.
- Status picklist (open / in_progress / done) → autosave PUT 200 → Publish all →
- c2 PASS: Studio Records grid → Add record "Broken compressor", Status "In Progress" →
POST /data/repairs_repair_ticket201.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_ticketshows the row with a blue "In Progress" label chip. GET /meta/app?id=repair_centernavigation 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→ 422WRITABLE_PACKAGE_REQUIRED.PUT /meta/object/showcase_task?mode=draft&package=com.example.showcase(+field) → 403ITEM_LOCKED.- The same without
?package→ 403NOT_OVERRIDABLE. - Afterwards
showcase_qa_forgedis 404, andshowcase_taskhas 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].labelplus the key order.
- v1 user-field 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_asset201, andGET …/wTWF4lapR7CdjAwAhas keyasset_code:'AC-001'(nofield_N). - c2 PASS:
repair_assettyped key by key intoobject-name-inputreads backrepair_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(listgrid +formsimple) → 200{success, version hmac…, seq 13, state:'draft'}. - c1 PASS: before publish, the GET of the name is 404,
/meta/view?object=repairs_repair_assetreturns[], 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→ expandedrepairs_repair_asset.default(list, authored columns) andrepairs_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 tolist, so it was set torecord, Objectshowcase_invoice.- Captured
PUT /meta/page/invoice_page_a1016b?mode=draft200 with bodytype:'record', object:'showcase_invoice', template:'default'. regions[0].components= page:header, record:highlights, record:path, page:tabs(record:details), record:discussion.
- Captured
- 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 …/publish200.GET /meta/page/invoice_page_a1016bcontains thepage:cardinside 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 onshowcase_task_metrics,[status]/[task_count]) → 200{success, version, seq 9, state:'draft'}. GET → 404. - c1 PASS:
POST …/publish200 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_CONFLICTwithcurrentVersion. The audit row readsoutcome denied,code metadata_conflict. - c4 PASS: writable
com.qa.lcpkg(namespaceqalc).- Drafts
qalc_good+bad_noprefix→POST /packages/com.qa.lcpkg/publish-drafts→ HTTP 200, bodydata.success:false,outcome:'refused',failed[0].code NAMESPACE_PREFIX. Both names are still 404 (atomic). - After discarding the bad draft and staging
qalc_second→data.success:true,publishedCount 2, both 200. - The 200-with-success:false shape is the open ledger question (studio-authoring run notes: one correction to #7637, two stale
automated.refspecs, and three ledger/route observations #7753 item 2) and is not scored.
- Drafts
- c5 PASS: a widget carrying a stray
objectkey is refused already at the draft door: 422INVALID_METADATAwidgets.0 [unrecognized_keys]. Publish then answers 404NO_DRAFT, and the GET is 404, so nothing crosses into active. - c6 PASS (lane B): a dashboard draft staged in writable
com.qa.lanebshows 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 nameswidgetsonly, with no label or columns dump. - c9 PASS:
POST …/rollback {toVersion:1}→ 200restoredFromVersion 1, and GET serves "Rev1 by status".- Lane B, own boot, the same sequence: the rendered
/apps/showcase_app/dashboard/qa_lifecycle_probeshows the bar "Rev1 by status" with status buckets. {}and{toVersion:'abc'}→ 400INVALID_REQUEST"'toVersion' (positive integer) is required".
- Lane B, own boot, the same sequence: the rendered
- c10 PASS: the
/auditrows for save, publish, rollback and the denied conflict each carryactor= the admin user id. - c11 PASS: rollback with header
X-Actor: someone_else_entirely→ 200. Its audit row names the admin id, andsomeone_elseis absent from both/auditand/history.
studio-authoring.authoring-validation-not-persisted · rev 3 · PASS
- c0 PASS:
PUT /meta/object/qa_invalid_probe?mode=draftwith a field missingtype→ 422INVALID_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/columnsbesidelist→ 422unrecognized_keys"typebelongs to a single VIEW, not to the container. Wrap it:defineView({ list: { type, data, columns, … } })… The container's own keys arelist,form,listViews,formViews." - c2 PASS: the GET after each rejection → 404
RESOURCE_NOT_FOUND. In the designer leg, both the active and the?state=draftreads 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.typeappears, 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 underlist) → 200state:'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) → 403NOT_OVERRIDABLE. VariantPUT /meta/field/showcase_task.title→ 403NOT_OVERRIDABLE. - c1 PASS:
PUT /meta/view/showcase_task.gridwith 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→ 403NOT_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 onshowcase_task. Dashboard variant: a new dashboard → 200. - c4 PASS:
DELETE /meta/view/showcase_task.grid→ 200reset: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.ts26/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)→ savedreturnType:"text". The un-edited siblingsib_totalkeeps its priorreturnType:"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 bareest_hoursis 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_matrixrowLevelSecurity.
- The persisted policy reads back in
- 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
websiteand "Clear" overbilling_emailtouched only those fields. - c2 PASS: Save → PUT 200. The saved
fieldskeys aretax_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_emailis absent from the saved map after Clear + Save. - c4 PASS: at 820 px the matrix container (
overflow-x:auto,scrollWidth960 >clientWidth772) scrolls. Scrolled right, the full Bulk column R / CRUD / All / None is visible and clickable. - c5 PASS: on packaged
showcase_contributorthere 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 arole=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 awindowmarker survived. - c2 PASS: DOM before
{hint:true, heading:false, body:false}→ after{false, true, true}. - c3 PASS: typing into
#field_emailshows the ready hint. - c4 PASS:
POST /api/v1/forms/contact-us/submitbody carries the typed name / email / company / message and no{{page.token. The response is 201. - c5 PASS:
showcase_inquiry3 → 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_tasktotal is 11, and the html pages send 0/dataor/analyticsrequests. - c2 PASS: Total projects 5 =
showcase_projecttotal 5, withGET /data/showcase_project?top=200on 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_METADATAwith 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 /packagesreportscom.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_alertis byte-identical before and after the whole probe.- Forged
PUT …?mode=draft&package=com.example.showcase→ 403ITEM_LOCKED; the same withoutpackage→ 403NOT_OVERRIDABLE. Neither is 2xx. - See the accuracy list: the clause names 422.
- Forged
- c2 PASS: the Enabled switch is disabled (
aria-describedby"Read-only package — switch to or create a writable package to edit."). A forced click leavesaria-checkedunchanged 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.defaultopens 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_taskserves the overlay, and/layersstill 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_overviewopens editable. Widget title "Login Events QAB" → publish 200, and the rendered board shows it. - c3 PASS: the "Reset overlay" control →
DELETE200reset:truefor 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_alertshows 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.scannedTypes27 = the registry types with agetMetadataTypeSchemaschema (27 of 28). - c1 PASS:
stats.count= list length for object 109, view 36 and flow 32, and the sorted distinct_packageIdsets are equal.lockedmatches the per-item/layersenvelope lock: object 107, view 0, flow 32.
- c2 PASS:
?package=com.example.showcasenarrows 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→ 400INVALID_REQUESTnamingview/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/_diagnosticsshows "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.tsis 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(namespaceqacd).- Docs
qacd_gated_docandqacd_open_doc. - Books:
qacd_aaa_empty(first by label, claims nothing),qacd_open_book, andqacd_gated_book({permissionSet:'showcase_auditor'}). - App
qacd_appwith 6 doc entries. - Reader: holds
showcase_auditorthrough asys_user_permission_setrow. Outsider: holds nothing extra. - Torn down afterwards;
/meta/book,/meta/docand/meta/app?id=showcase_appare byte-identical to the baseline.
- Docs
- c0 PASS:
/meta/app?id=qacd_appper 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"). Writablecom.qa.picks:qapk_ticket(severity bound, kind inline) andqapk_incident(level inline). - c0 PASS: Setup metadata ›
qapk_ticket, rename the Title label → autosavePUT /meta/object/qapk_ticket?mode=draft200.fields.severityis{type, label, picklist}with no options;fields.kindis 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 equalsGET /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.picks200, 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
/metawrite was sent.
- All 25 inputs and the Add/Remove row buttons are disabled, and no
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
studio-authoring.metadata-diagnostics-sweepc6: an invalid storedsys_metadatarow cannot be planted on a stock boot. It needs a pre-seeded DB snapshot from an older spec revision (already in the item's knownGaps, parked on qa(checklist): park the blocked partial-coverage gaps of the 17.7 pre-release runs (#21720, #21721, #21782, #21784) — each gets a fixture recipe, a pin, a re-pointed clause or a recorded knownGap #22017 row 17).
Checklist-accuracy findings (for the wave anchor #23878; not extracted)
org-override-registry-gatevariants: "field (override locked, create open)" is stale. The registry hasfield allowRuntimeCreate:falsesince meta-field-write-inert: an acceptedfieldPUT never reaches the object — a runtime-created field is storedvalid=trueand is absent fromfieldsforever #7893.metadata-diagnostics-sweepc1: the envelope lock is not on the defaultGET /meta/TYPE/NAME, because that cached arm carries nolockby design (rest-server.ts). Read it fromGET /meta/TYPE/NAME/layers.object-designer-roundtrip: the steps and clauses namerepair_asset/GET /meta/object/repair_asset, but in a namespaced writable package the object must beNS_repair_asset(the publish gate answersNAMESPACE_PREFIX). The route/apps/com.objectstack.studio/…renders inside Showcase chrome, because studio is not loaded on stock boots.draft-publish-lifecyclec6: 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.packaged-automation-studio-lockc1: the forged flow write is refused 403ITEM_LOCKED(with?package=) or 403NOT_OVERRIDABLE(without), naming clone/toggle, not "422 [writable_package_required]". c2 / step 4: the disabled switch carries its reason inaria-describedbyand a tooltip, not in atitle(objectui#12303).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/layersreportspackageId com.objectstack.plugin-auth, not platform-objects.
permission-matrix-editor-uxc5: three read-only reasons exist (package, artifactperm.readOnly.artifact, type). The type gate is unreachable on stock; name all three.custom-page-source-tiersstep 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.doc-on-app-menuknownGaps: daeb77fc is past the fork window; the console carries the refusal page and the pruning.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 16, 2026
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.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
objectstack-fleet commentedon Oct 16, 2026
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_Nnames → fixed on objectui main by objectui#12516.Closed by the
domain:devxseat 1 PM (seat post #6023) ·os-sales·session_014eFvbvGK4FjXvscggDNTD4, as part of the paced close-out of the #23878 wave.Generated by Claude Code