Repository navigation
qa(checklist): studio-authoring accuracy fixes + 23 items from the Studio QA run - #26848
Conversation
…-10-27 Writer and reconciler pass of a scoped, single-hunter checklist-author run over the findings of the Studio QA run (run record #26715, tested at 3fcafcd, re-read at 4373103). Accuracy fixes to 12 existing studio-authoring items, each with a revision bump and a history row: object-designer-roundtrip (Studio is the door), view-authoring-live and authoring-validation-not-persisted (the second view container collision), draft-publish-lifecycle (the diff is shallow by contract; stray keys refused at the draft save), org-override-registry-gate (SCREAMING_SNAKE codes), expression-editors (RLS editor in Studio Access, the formula-field probe), permission-matrix-editor-ux (Setup path, read-only bulk absent, published-objects fixture), packaged-automation-studio-lock (pin command from ui/, flat refusal body), packaged-display-class-direct-edit (blur before Save), doc-on-app-menu (nav through the API, mustChangePassword false), picklist-bound-select (fixture gap recorded) and multi-package-item-rows (a dashboard, not a view outside the closure). 23 new active items for the capabilities the run exercised and no item covered: the leave guard and held-edit publish refusal; the Automations rail, edge types, package-less scope and status-vs-runtime; the Data tabs (validations, hooks, actions, API, summary fields) and key preservation across a Studio save; the Interfaces create dialogs, widget and filter types, report options, app and menu-entry keys, page slots and variables; the Access set lifecycle, facets and OWD / suggestions panels; the no-Studio-entry property matrix, removed-key refusal at the save door and the uninstalled-package refusal. Broken capabilities are written against the correct behaviour with the defect recorded in knownGaps. coverage.json maps the new items and replaces the stale picklist waiver with items; FOLLOW-UPS.md gains section 12. Co-authored-by: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01J8VVAkZns5rNnK2rtszzbQ
|
Claim: PM loop round 2 · takeover of this PR · 2026-10-28T03:27Z Release: the authoring session Session: Open for the maintainer (from this PR's own 速读): whether to accept replacing the Generated by Claude Code |
Resolves the one content conflict, in docs/qa/platform-checklist/areas/studio-authoring.json: item studio-authoring.doc-on-app-menu was bumped r6 -> r7 on both sides. Both edits are kept (main's fixtures.knownGaps[1] 'objectui revision' wording, this branch's knownGaps[2] mustChangePassword recipe); the item goes to revision 8; main's r7 history row stays as written and this branch's row follows it renumbered r8. No other item collides. Claude-Session: https://claude.ai/code/session_01QSeKYkS7Zv7Z3r6tzUFzSf Co-authored-by: Claude <noreply@anthropic.com>
The items in this branch were authored against 4373103. Every defect card they cited as failing (#26705, #26707, #26708, #26711, #26712, #26718, #26719) is now closed as fixed on main, and several defects recorded only by the QA run have since been fixed through their own cards. Where an item said FAILS TODAY, its fixtures.knownGaps entry is removed or narrowed to what still fails; the clauses stay as the correct behaviour. Source citations follow the Studio strings into ui/packages/i18n/src/namespaces/studio/en.ts. 17 items gain a revision and a history row; no existing history row is rewritten. FOLLOW-UPS.md gains §12b recording the re-verification. Claude-Session: https://claude.ai/code/session_01QSeKYkS7Zv7Z3r6tzUFzSf Co-authored-by: Claude <noreply@anthropic.com>
|
os-dev-report {
"issue": 26848,
"status": "done",
"branch": "claude/laughing-hawking-9cg53i",
"pr": "https://github.com/objectstack-ai/objectstack/pull/26848",
"session": "session_01QSeKYkS7Zv7Z3r6tzUFzSf",
"premise_still_valid": true,
"summary": "Takeover of PR #26848, continuing its branch with two commits (no rebase or force-push), and the claim 6459900913 names this branch. 096ba37d merges origin/main 3230bdbf. Its one conflict was doc-on-app-menu, bumped r6 to r7 on both sides (#26962). Both edits are kept, the item goes to r8, and main's r7 history row is kept as written with this PR's row renumbered to r8. A stage-by-stage scan found no other revision collision. feaeba00 re-verifies all 35 items (12 accuracy fixes, 23 new) at 3230bdbf. All seven cited cards (#26705, #26707, #26708, #26711, #26712, #26718, #26719) are closed as fixed, and each fix commit is an ancestor of origin/main. So 17 items had their FAILS TODAY knownGaps removed or narrowed to what still fails, with no clause changed. Each of those 17 got a revision bump and a new history row, and no existing row was rewritten. 18 items hold and 0 were dropped. FOLLOW-UPS.md gains an appended §12b. The PR body was updated through the relay (Takeover note and Validation), and 速读 line 6 (the picklist question) is kept unchanged. Scope held to the PR's three files.",
"per_item": [
"held-edit-leave-guard · updated r2 · #26705 fixed by #26839 (942ffb21, unsavedPillarWork feeds confirmLeavePillar) and #26927 (3fd0ba1f); knownGaps removed; source re-pointed to ui/packages/i18n/src/namespaces/studio/en.ts",
"held-edit-publish-refusal · updated r2 · source[1] only: engine.studio.held.publish moved to studio/en.ts",
"automations-rail-and-new-flow · still holds · FLOW_GLYPH_ICON, flowRailStatus, engine.studio.auto.preset.needsObject present",
"flow-edge-type-authoring · updated r2 · #26707 half fixed by #26856 (57820085, draft _diagnostics carries the publish verdict); Studio pillar passes FlowPreview no diagnostics, so the inspector/Problems half still fails (source read)",
"org-scope-flows · still holds · STUDIO_ORG_SCOPE_SEGMENT '~org' in studioScope.ts",
"flow-status-matches-runtime · still holds · getFlowRuntimeStates (service-automation engine.ts), GET /automation/_status (dispatcher-plugin.ts)",
"validation-rules-authoring · updated r2 · both recorded sightings fixed by c4a4aefc (#26731); knownGaps removed",
"hooks-tab-authoring · updated r2 · fixed by fc92c62a (#26726, capabilities checkboxes) and e46e25c0 (403 INSUFFICIENT_PRIVILEGES, throwCapabilityDenial); knownGap reduced to its not-judged scope line",
"actions-tab-presets · updated r2 · four recorded defects fixed by e9e344a9, 2720874a, 27e4d656 (#26728, #26734, #26735, #26736 closed); knownGaps removed",
"object-api-tab-curl · still holds · ObjectApiPanel.tsx unchanged since 43731031",
"summary-field-authoring · updated r2 · #26707 closed but the summary is still saved not held, and sum/avg still offer non-numeric fields (SummaryConfigFields); still fails, cited to the run",
"api-written-keys-survive-studio-save · updated r2 · permission variant still fails; now cites open card #26837",
"interfaces-create-dialogs · still holds · doCreateApp, doCreateSurface, isReportBindingComplete present",
"dashboard-widget-and-filter-types · updated r2 · widget-type gap fixed by #26967 (#26745: menu and Type select read ChartTypeSchema.options); global-filter half still fails (Add item autosaves a filter with no field)",
"report-authoring-options · still holds · ReportType four members; runtimeFilter, drilldown, chart, joinedBlockDatasetRequired present",
"app-and-nav-properties · updated r2 · #26712 fixed by dbf7e04a (conversion retired; already ancestor of 43731031); inspector gap narrowed by #26977 (#26740); requiresObject edited by neither Studio nor Setup, scored not judged; clause unchanged",
"authored-page-slots-and-variables · still holds · PageVariableSchema six types, seven slots, DEFAULT_RECORD_PAGE_CONFLICT present",
"access-permission-set-lifecycle · updated r2 · fixed by #26916 (#26836, findTakenIdentifier, discardDraft) and #26959; knownGaps removed; source re-pointed",
"access-facets-runtime · updated r2 · tab-name typing fixed by #27025 (#26748, TabNameInput); launcher half still fails (no console reader of /me/apps); steps[3] drops the paste fallback",
"access-owd-and-suggestions · updated r2 · source[1] only: strings moved to studio/en.ts",
"no-entry-property-matrix · updated r2 · restrict row fixed by #26864/#26930 (#26718), unknown datasource by #26912 (422 INVALID_METADATA), chart dataset by #26842/#26906 (#26719); gap-view rows still fail",
"removed-key-save-door-refusal · updated r2 · #26711 fixed by #26851 (view envelope refuses unknown key 422); 11 tombstones and the 22 aged-out keys unchanged",
"uninstalled-package-refused · updated r2 · #26708 fixed by #26920 (uninstalledNamedBaseRefusal for every type, 422 WRITABLE_PACKAGE_REQUIRED; publish-drafts unknown id 404); knownGaps removed",
"expression-editors · updated r7 · knownGaps[4]: #26707 draft half fixed by 57820085, editor half still fails (rlsPredicateVerdict lints a one-clause stack with no object)",
"object-designer-roundtrip · still holds · prefixObjectName, ObjectFormDesigner PointerSensor distance 4",
"view-authoring-live · still holds · viewContainerNameCollisionRefusal in protocol.ts",
"draft-publish-lifecycle · still holds · diffShallow in protocol.ts; dashboard.zod.ts untouched",
"authoring-validation-not-persisted · still holds · viewContainerNameCollisionRefusal",
"org-override-registry-gate · still holds · NOT_OVERRIDABLE / NOT_CREATABLE in protocol-packaged-base-refusal.ts",
"permission-matrix-editor-ux · still holds · FieldsSubTable bulk controls only when writable; bulkHint and perm.readOnly keys present",
"packaged-automation-studio-lock · still holds · app-shell test script unchanged (vitest run --root ../..)",
"packaged-display-class-direct-edit · still holds · same refusal codes; ResourceEditPage.tsx untouched",
"doc-on-app-menu · still holds (r8 after merge) · runAdminCreateUser defaults mustChangePassword true; nav pickers list through the audience-pruned client.list",
"picklist-bound-select · still holds · picklist allowRuntimeCreate false (metadata-plugin.zod.ts); liveness picklist.json still 10 of 11 live",
"multi-package-item-rows · still holds · list-view-object-outside-closure in packages/lint rule-explanations.ts"
],
"tests": "No code changed, so no unit or vitest run. Re-verification is a source read at 3230bdbf, with fix commits proven on main by merge-base --is-ancestor (exit 0 for all 16 shas, self-proving) and card states read by REST GET.",
"gates": "At feaeba00: node scripts/check-platform-checklist.mjs exit 0 (16 areas, 352 items); --self-test exit 0 (265 assertions); node scripts/checklist-select.mjs --self-test exit 0 (31 cases); node scripts/checklist-select.mjs area:studio-authoring exit 0; node scripts/check-doc-authoring.mjs exit 0. Derived list (dispatch-gates --commands --repo objectstack-ai/objectstack, from feaeba00, merge base 3230bdbf7): 16 commands, all exit 0; pnpm --filter @objectstack/lint run check:doc-formula-expressions first exit 3 (PREREQUISITE NOT MET, formula/lint unbuilt), exit 0 after os-verify-lock build (VERDICT command-exit 0, 4/4 tasks). --ran reconciliation: 16 derived, 16 run, 0 NOT-MEASURED, 0 UNRUN, exit 0. CI check-runs on feaeba00: in_progress at report time, not awaited.",
"dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
"mcp_calls": "0 by this session (all GitHub reads were REST GETs); the four read-only verification forks were told no writes and reported none",
"api_writes": "2 — relay issue_patch on #26848 (PR body; read-back 7178 bytes identical), relay comment on #26848 (this report). Plus 2 git pushes (096ba37d, feaeba00), not REST",
"open_questions": [
{
"question": "Accept replacing the picklist coverage waiver with items (this PR's choice, its 速读 line 6)?",
"options": [
"A accept: the waiver's premise is stale, the liveness ledger grades 10 of 11 picklist keys live (unchanged at 3230bdbf)",
"B keep the waiver"
],
"recommendation": "maintainer's decision; not decided here, the PR's choice is kept as written"
},
{
"question": "app-and-nav-properties acceptance[5] names requiresObject, which neither Studio's inspector nor Setup's AppNavInspector edits. Must Studio offer it?",
"options": [
"A yes: keep the clause, the cell becomes a FAIL and a card is filed",
"B no: a later revision drops requiresObject from acceptance[5]"
],
"recommendation": "product question, left as a fork: the clause is unchanged and its knownGap scores that one cell not judged"
},
{
"question": "Implementation trade-off taken: the 16 new items edited here went r1 to r2 with a new history row, rather than amending their unlanded r1 row",
"options": [
"A as done: no history row is ever rewritten",
"B amend r1 in place before first landing"
],
"recommendation": "A, because the never-rewrite-a-history-row rule has no carve-out for unlanded rows"
}
],
"out_of_scope_findings": [
"class: none (read-only inference, not measured) · reach: none · Studio Automations pillar shows no draft verdict for an invalid edge condition: StudioDesignSurface passes FlowPreview no diagnostics, expression-validate.ts parses no CEL · dedupe words: flow edge condition Problems diagnostics Studio · carrier: none, recorded in flow-edge-type-authoring knownGaps[0] and the PR's Notes for review",
"class: none (read-only inference) · reach: none · summary field saved unconfigured instead of held; sum/avg offer non-numeric fields (SummaryConfigFields) · dedupe words: summary field aggregate held non-numeric · carrier: none, recorded in summary-field-authoring knownGaps[0]",
"class: none (read-only inference) · reach: none · RLS editor reads Valid CEL on a formula-field USING predicate (celAuthoring.ts rlsPredicateVerdict) · dedupe words: RLS editor formula field rls-predicate-unenforceable · carrier: none, recorded in expression-editors knownGaps[4]",
"class: none (stale ledger text, pre-existing, outside this PR's changes) · reach: none · expression-editors knownGaps[3] describes a warning-with-fail-open the editor no longer gives (lintCelPredicate asks rlsPredicateVerdict, landed a14f3e61 before 43731031) · carrier: none, noted in PR Notes for review",
"class: none (pre-existing spelling) · reach: none · some older source lines spell objectui paths without ui/ and cite content/docs/*.md now *.mdx (build-without-code, capabilities/integrations) · carrier: none, noted in PR Notes for review"
]
}Generated by Claude Code |
席位核对 — ACCEPT · domain:devx#2 · head
|
|
Brief-claimed-by: session_01QSeKYo7qYsX6HsAneHBMP2 · batch #422 · 2026-10-28T10:50Z Director seat, summon #53 (ledger objectstack#12708). Presented to the maintainer in batch #422 as item 2 of 3 — the one open question the devx seat 2 put to the maintainer in its ACCEPT (6461427971): accept the replacement of the Seat increment (re-read 2026-10-28T10:50Z):
Prior rulings read: picklist · waiver · coverage.json → README L34 / L400, SWEEP.md L36; thread: 6459900913 (takeover claim), 6460164831 (report), 6461427971 (ACCEPT with the question). |
|
Ruling: batch #422 item 2 · letter A · maintainer 「26848 A」 2026-10-28T11:14Z Recorded by the director seat (summon #53, A — the Workload: 0. Execution: |
|
Landed: merged as The merged diff matches the reviewed head Generated by Claude Code |
Takeover
Taken over by
session_01QSeKYkS7Zv7Z3r6tzUFzSf(dispatched by devx seat 2, claim 6459900913). It added two commits on this branch, with no rebase or force-push:096ba37dmergesorigin/main3230bdbf. It resolves the one conflict, instudio-authoring.json:doc-on-app-menuwas bumped r6 to r7 both here and by docs(qa): retire the objectui-pin wording left in the checklist ledger #26962. Both edits are kept (main's knownGaps[1] wording and this PR's knownGaps[2] recipe). The item goes to r8. Main's r7 history row stays as written, and this PR's row follows it as r8. No other item collided.feaeba00re-verifies all 35 items against3230bdbf. Every defect card the pass cited (Studio: an edit the Data, Automations or Interfaces pillar is still holding (not yet saveable) is discarded silently when the builder leaves the pillar, switches item or reloads — no confirm, no beforeunload #26705, Studio/metadata: a draft the editors, the draft_diagnosticsand the Problems tab all call valid is refused only at publish — and one such draft rolls back the whole package release #26707, metadata: the save door and the package publish door accept a package id that is not installed (object, dashboard, page …), storing and even publishing items into a phantom package; Studio renders a writable builder for it #26708, spec: the view save door silently strips unknown top-level keys from the view envelope (200, not stored) while object, page and dashboard bodies refuse them 422 unrecognized_keys #26711, spec:app.hidden: trueon a stored app is rewritten to_unpublished: trueby the appHiddenToUnpublished conversion replayed on stored rows — after publish-drafts the app shows again; after a per-item publish it vanishes for non-builders #26712, objectql: a lookup withdeleteBehavior: "restrict"is overridden when the same parent is also the child's master_detail target — deleting the parent cascade-deletes the child instead of refusing 409 #26718, spec: a chart list view on object A accepts a dataset bound to another object or another package without refusal #26719) is now closed as fixed. So the "FAILS TODAY" knownGaps were removed, or narrowed to what still fails. The clauses are unchanged. 17 items gain a revision and a history row, and FOLLOW-UPS.md gains §12b.维护者速读
node scripts/check-platform-checklist.mjs && node scripts/check-platform-checklist.mjs --self-test && node scripts/checklist-select.mjs area:studio-authoring,预期全部退出 0。Clause-②: no
Metadata-protocol: none
What changes
This is a scoped, single-hunter
checklist-authorpass over the findings of the Studio QA run. The run record is #26715. The run tested3fcafcd3; this pass re-read the sources at43731031.Accuracy fixes (12 items). Each item gets a revision bump and a
historyrow:23 new
activeitems:GET /automation/_status.Where the run found a capability broken, the clause states the correct behaviour and
knownGapscites the defect card (#26705, #26707, #26708, #26711, #26712, #26718, #26719), or "recorded by QA run #26715" where no card existed yet.Re-verification at
3230bdbf(takeover). All seven cards are now closed as fixed onmain, and several run-recorded defects were fixed through their own cards (#26726, #26728, #26731, #26734, #26735, #26736, #26740, #26745, #26748, #26836). The affected knownGaps are removed or narrowed. The Studio strings moved toui/packages/i18n/src/namespaces/studio/en.ts, so five items'sourcelines follow them there. The per-item table is in the os-dev report comment on this PR.coverage.json. The new items are mapped to their kinds. The
picklistwaiver was re-audited and replaced with items: its premise is stale, because the liveness ledger grades 10 of 11 picklist keys live. The$commentstates what the mapping does not claim.FOLLOW-UPS.md §12. Records the scope, the liveness-ledger note and the pin-spelling note.
Deliberately not changed
studio-authoring.permission-matrix-editor-uxacceptance[3] and steps[3] stay as written: a QA finding on that question is held under a security card (detail withheld pending maintainer).Validation
On head
feaeba00(branch merged withorigin/main3230bdbf):node scripts/check-platform-checklist.mjs→ 0 (16 areas, 352 items).node scripts/check-platform-checklist.mjs --self-test→ 0 (265 assertions).node scripts/checklist-select.mjs --self-test→ 0 (31 cases).node scripts/checklist-select.mjs area:studio-authoring→ 0.node scripts/check-doc-authoring.mjs→ 0.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackderived 16 commands. All 16 exit 0.--ranreconciles them: 16 derived, 16 run, 0 NOT-MEASURED, 0 UNRUN.check:doc-formula-expressionsfirst refused with exit 3 because@objectstack/formulaand@objectstack/lintwere not built. It exited 0 once those two were built under the verify lock.Vitest pins were not run, since this diff changes no code. The item re-verification is a reading of the source at
3230bdbf. It is not a re-run of the items.Notes for review
docs/qachange that publishes nothing, so it carriesskip-changeset.flow-edge-type-authoring(the Studio Automations pillar passes its flow preview no draft diagnostics, and the client check parses no CEL),summary-field-authoring(an unconfigured summary is saved rather than held, and sum and avg offer non-numeric fields), andexpression-editorsknownGaps[4] (the RLS editor reads 'Valid CEL' on a formula-field predicate).app-and-nav-propertiesacceptance[5] is unchanged. Neither Studio nor Setup's AppNavInspector editsrequiresObject, so its knownGap scores that one cell as not judged until a ruling says whether Studio must offer it.expression-editorsknownGaps[3] looks stale (lintCelPredicatenow asks the publish rule throughrlsPredicateVerdict). Some oldersourcelines spell objectui paths withoutui/, or cite.mdfiles that are now.mdx.🤖 Generated with Claude Code
https://claude.ai/code/session_01J8VVAkZns5rNnK2rtszzbQ