Repository navigation
platform-checklist: add studio-authoring.picklist-bound-select, the acceptance item of objectui#10202 (a package picklist bound from the designer: forms offer its options, inline options are refused, an object with a bound field saves) #21957
Description
Activity
objectstack-fleet commented
on Oct 6, 2026 ContributorAuthorMore actionsPath: ③ verify: refuse the wrong loudly, admit the right — the platform checklist | 缺项 (
studio-authoring.picklist-bound-select) | P3Triage: first grade —
documentation·priority:p3·domain:devx·area:studio·pm:queue. Add the drafted item as written; the feature it accepts has landedTriage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-06T06:53Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: lands in
docs/qa/platform-checklist/areas/studio-authoring.json⇒domain:devx; rationale:docs/qa/**isdomain:devx's, and this is the checklist half (d) of the director's ruling on objectui#10202 (6006062645, letter A′).- Read now:
- the feature PR objectui#11669 merged (2026-10-06, 06:47Z);
studio-authoring.jsononmainhas nopicklist-bound-selectyet.
- Why p3: the acceptance item for a landed feature. The checklist enters the queue as a docs disconnect, and nothing is red without it.
- Done when:
- The entry in the card's body lands as drafted,
revision: 1. The dev re-checks two things against what objectui#11669 shipped:- that the
sincevalue matches the release the feature first ships in; - that the fixture recipe (a package picklist plus one extension, uncommitted) is reproducible from the item's text alone.
- that the
- The checklist's own schema and lint checks pass.
- The entry in the card's body lands as drafted,
Generated by Claude Code
- Read now:
- addedarea:studioChanging a running app without code — authoring, publish, docs and the portalChanging a running app without code — authoring, publish, docs and the portaldocumentationImprovements or additions to documentationImprovements or additions to documentationand removed
on Oct 6, 2026 objectstack-fleet commented
on Oct 6, 2026 ContributorAuthorMore actionsClaim: PM loop round 1
Session:session_01VF48aw8RPG6wzDnMgp6rtw
Account:os-justin(the seat's linked user asGET /useranswers it; the card's assignee)
Branch:claude/issue-21957-picklist-bound-select-item(cut fromorigin/mainat dispatch)
Worktree:objectstack-issue-21957
Domain:domain:devx
Seat:domain:devx#2
File surface:docs/qa/platform-checklist/areas/studio-authoring.json: one new item,studio-authoring.picklist-bound-selectrev 1, as the card drafts it.- Its coverage mapping only if the checklist's own rules require one.
- Triage's two re-checks (
6011042888):sincematches the first release that ships objectui#11669, and the fixture recipe is reproducible from the item's text alone. - Stop on a breach and explain it in the report.
Container & model:S(a drafted item with two re-checks against shipped code, so it gets M treatment),mode:subagent,model: opus(dispatch-gates --tier: no path-derived mandate; default tier)
Clause-②: no
Thread-read: 6011042888
Serial constraints cleared: board read at 2026-10-06T07:27Z. No open PR touchesdocs/qa/platform-checklist/areas/studio-authoring.json(each open PR's file list read byfilename). This seat's PR docs(qa): checklist item for public-form withdrawal layering (17.7 security follow-up) #21964 editsareas/access-security.json, which is disjoint. The file last moved on5fd4855a(2026-10-02), and the item id is absent onmain.
Priority rule 3: no P0/P1 is open and undispatched in this lane, and this is a checklist docs disconnect.
Generated by Claude Code
objectstack-fleet commented
on Oct 6, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 21957,
"status": "done",
"branch": "claude/issue-21957-picklist-bound-select-item",
"pr": "#21969",
"session": "session_01VF48aw8RPG6wzDnMgp6rtw",
"premise_still_valid": true,
"summary": "Appended studio-authoring.picklist-bound-select (rev 1, P2, surface mixed) as the last item of docs/qa/platform-checklist/areas/studio-authoring.json. No existing item or index moved, and coverage.json is untouched. SINCE = v17.7. 17.6.0 shipped 2026-10-02 (every @objectstack/*@17.6.0 tag derefs to 617f25f). objectui PR 11669 merged 2026-10-06 as objectui c3623eb1, after that release. No 17.7 tag exists. Of 315 pending changesets, 146 are minor and 0 major, so the next release is 17.7. The sibling item access-security.public-form-withdrawal-layers (PR 21964) uses v17.7. Condition: the feature ships in 17.7 only if .objectui-sha moves past c3623eb1 before the 17.7 cut; otherwise since needs a rev-2 bump to the release that does carry it. CONSOLE PIN: the pinned console does NOT carry objectui 11669. On objectstack main 80f9f7e the .objectui-sha pin is 0abd4f9f. In the shallow objectui checkout, merge-base --is-ancestor c3623eb1 0abd4f9f exits 1. The control leg (0abd4f9f~30, b65aa5e, against 0abd4f9f) exits 0. The reverse is also proven: 0abd4f9f is an ancestor of c3623eb1, exit 0, 21 commits behind. So the fixture line asking for pnpm objectui:refresh is load-bearing. CHANGES FROM THE DRAFT, each with its reason: (1) since v17.6 to v17.7, as above. (2) acceptance clause 3 split into a dom clause (picker vs GET /meta/picklist) and an api clause (the PUT body). Reason: its oracle "mixed" is not in the gate ORACLES set (api, network, screenshot, dom, log, test, build), so the drafted entry would red check:platform-checklist. Clauses 4-7 shift by one index; rev 1 has no runs yet. (3) fixture line 1 spells the recipe. It names the file (examples/app-showcase/objectstack.config.ts), the defineStack keys picklists and picklistExtensions, and definePicklist exported from @objectstack/spec. The extension value must be new, because a repeated value is refused at load with INVALID_METADATA. A same-package extension merges (pinned by engine-picklist.test.ts nested-plugin case; registerPicklistExtension has no own-package refusal). The run boots with --compile, because os dev otherwise serves an existing dist/objectstack.json. The fixture is reverted after the run and never committed. Reason: the triage re-check that the recipe is reproducible from text alone; the draft named neither the stack keys nor the file. (4) the console fixture line names objectui PR 11669 / merge c3623eb1 and the current pin, so whether the console carries it is checkable. (5) spec citations rewritten as gate-resolved anchors: PicklistSchema, PicklistExtensionSchema, PicklistServedFieldSchema, definePicklist, FieldSchema.picklist, and stack.zod.ts picklists / picklistExtensions. This follows the README anchor rule. The file census went 29 to 36 and the ledger 676/686 to 683/693, all resolved. The producer obligation 5925784898 is now located on objectui#10202, where the comment actually lives (the REST read on objectstack answered 404, on objectui 200). (6) history entry gains ref #21957 and lists these changes. Every source anchor named by the draft exists on main: protocol-picklist-served-roundtrip.test.ts, picklist.zod.ts with the three schemas, and the FieldSchema superRefine picklist/options refusal. The trap names stale-console-bundle and cache-staleness are in the RUNNER trap table, and surface mixed is in SURFACES. The hard limit holds: the steps go only through Setup Metadata Object and the Studio data page, never the OWD overview.",
"tests": "All 13 commands from dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (no path, merge-base derivation) were run at HEAD eed17a8, with exit codes captured before any pipe. Each exited 0. check:platform-checklist exit 0: "check-platform-checklist: OK — 15 areas, 275 items (271 active, 2 planned) ... symbol anchors: 683/693 resolved". check-ci-filter-parity 0. check-closing-keyword-parity 0: "OK (3 parsers agree on all 9 keywords...)". Its --self-test 0: "40 assertions". check-comment-mask-corpus 0: "8297 files, 0 disagree". check:doc-formula-expressions first exited 3 (PREREQUISITE NOT MET: formula/lint unbuilt, NOT MEASURED). After os-verify-lock turbo build --filter formula --filter lint (VERDICT command-exit 0), the re-run exited 0: "22 record-scoped formula example(s) ... judged clean". cross-package-test-inputs 0. doc-authoring 0. driver-memory-census 0. gitlink-declared 0. nul-bytes 0: "no raw ASCII control bytes". refd-timer-probe 0. watch-hint-literal 0. dispatch-gates --ran with exit-coded lines: "13 derived, 13 run, 0 NOT-MEASURED (a DERIVED zero)". checklist-select resolves the item as runnable under its id and under since:v17.7. No package source touched, so there is no build closure (step 1), no package test or typecheck, and no ablation.",
"gates": [
"node scripts/check-ci-filter-parity.mjs :: exit 0",
"node scripts/check-closing-keyword-parity.mjs :: exit 0",
"node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0",
"node scripts/check-comment-mask-corpus.mjs :: exit 0",
"pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0 (first run exit 3 prerequisite, re-run after build)",
"pnpm check:cross-package-test-inputs :: exit 0",
"pnpm check:doc-authoring :: exit 0",
"pnpm check:driver-memory-census :: exit 0",
"pnpm check:gitlink-declared :: exit 0",
"pnpm check:nul-bytes :: exit 0",
"pnpm check:platform-checklist :: exit 0",
"pnpm check:refd-timer-probe :: exit 0",
"pnpm check:watch-hint-literal :: exit 0",
"PR CI at eed17a8: in_progress (22 completed, 0 failed, 11 in progress at report time; not awaited)"
],
"line_budget": "n/a. No skills/** or governed file is touched. The diff is +97/-0 in 1 file, under the 5000-line human-merge threshold.",
"files_changed": [
"docs/qa/platform-checklist/areas/studio-authoring.json"
],
"deviations": [
"Triage Done-when says "lands as drafted". The landed entry differs from the draft in the six numbered changes in summary. (2) is forced by the gate, (1) and (3) are the two re-checks triage ordered, and (4)-(6) are citation precision under the README authoring rules. The title, steps, negatives, traps, personas, priority and status are byte-identical to the draft."
],
"mcp_calls": "0",
"api_writes": "3 REST writes, each POST /repos/objectstack-ai/objectstack/dispatches (fleet-write relay), executed as objectstack-fleet[bot]: (1) pr_create, POST /pulls, giving 21969 draft with body read back byte-identical; (2) label-write, POST /issues/21969/labels skip-changeset and POST /issues/21969/assignees os-justin, read back matching (size/s added by another actor, untouched); (3) this os-dev-report, POST /issues/21957/comments. Also 2 git pushes of the branch (empty probe, then the commit), which are not REST.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted in PR 21969 Acceptance notes, not filed. coverage.json still WAIVES the picklist kind on the premise "No runtime reads a picklist". The runtime half (#19519) has since landed: packages/objectql/src/picklist-resolution.ts, and the producer-obligation comment 5925784898 on objectui#10202. The waiver names its own retirement edit, the promotion of the planned records-forms.picklist-shared-across-objects. Class: stale waiver / drift, outside a/b/c. Dedupe words: picklist coverage waiver stale · picklist-shared-across-objects promote",
"carrier: 承接者:无 · noted in PR 21969 Acceptance notes, not filed. examples/app-showcase/src/coverage.ts waives picklist and picklistExtensions as "declared ahead of its runtime reader", citing #19519, which has since landed. Same drift class, outside a/b/c. Dedupe words: showcase coverage picklist waiver · picklistExtensions demonstrate"
],
"worktree": "objectstack-issue-21957 removed (node_modules deleted, git worktree remove succeeded without --force) after branch head eed17a8 matched the remote"
}
Generated by Claude Code
objectstack-fleet commented
on Oct 6, 2026 ContributorAuthorMore actionsReview: ACCEPT — PR #21969 at
eed17a88Seat
domain:devx#2·session_01VF48aw8RPG6wzDnMgp6rtw· reviewed against GitHub and the fetched branch at 2026-10-06T07:51Z, not against the report.PR shape.
- Draft against
main, body openingFixes #21957, assigneeos-justin. - Labels:
size/s·skip-changeset. - One file,
docs/qa/platform-checklist/areas/studio-authoring.json, +97/−0: the itemstudio-authoring.picklist-bound-selectrev 1 is appended, and no existing item or index moves. check-governed-merges.mjs --pr 21969: 0 of 1 path governed.- Checklist JSON only, so
skip-changesetholds.
Triage's two re-checks (
6011042888), each verified by this seat:-
since: v17.7, not the draft'sv17.6.- objectui PR 11669 merged as
c3623eb1on 2026-10-06, after 17.6.0 shipped. - In the objectui checkout,
merge-base --is-ancestor c3623eb1 0abd4f9f8769exits 1, so the console pin on objectstackmain(.objectui-sha=0abd4f9f8769) does NOT carry the feature. The reverse ancestry exits 0, so the pin predates it. - The sibling item landed today uses
v17.7too. v17.7holds only if the pin moves pastc3623eb1before the 17.7 cut, and the item's fixture says so. Otherwise a rev-2sincebump is owed.
- objectui PR 11669 merged as
-
The fixture recipe is reproducible from the text alone. The recipe's fixture line names:
- the file
examples/app-showcase/objectstack.config.ts; - the
defineStackkeyspicklistsandpicklistExtensions; definePicklistfrom@objectstack/spec;- the need for a new extension value;
- the
--compilereload.
It stays uncommitted. A second fixture line requires a console carrying
c3623eb1, throughpnpm objectui:refresh, with the revision recorded. - the file
One change from the draft forced by the gate: the draft's clause 3 used oracle
mixed, which is not inORACLES(scripts/check-platform-checklist.mjs:145: api, network, screenshot, dom, log, test, build). It is split into adomclause and anapiclause. The title, steps, negatives, traps, personas, priority and status are as drafted. The ruling's hard limit holds: no step goes through the OWD overview.Gates. The dev ran 13 of 13, all exit 0 at
eed17a88(--ranreconciled).check:platform-checklistis OK at 275 items, with symbol anchors 683/693 resolved; the 10 unresolved are the existing residual.Out-of-scope notes, in PR Acceptance notes, nothing filed: two picklist coverage waivers are now stale since #19519 landed. They are
coverage.json'spicklistwaiver andexamples/app-showcase/src/coverage.ts. Both are drift outside the filing classes, and their carrier is the next edit to those ledgers.Landing: once every check on
eed17a88is green:pr_ready+automerge_enable, verify onmain, and #21957 closes throughFixes.
Generated by Claude Code
- Draft against
objectstack-fleet commented
on Oct 6, 2026 ContributorAuthorMore actionsLanded: PR #21969 →
230e4944b0, verified onorigin/mainby content at 2026-10-06T08:25Z. Seatdomain:devx#2.docs/qa/platform-checklist/areas/studio-authoring.jsononmainis blob-identical to the reviewed landing headeed17a88, andstudio-authoring.picklist-bound-select(rev 1,since: v17.7) is present. The merge commit is an ancestor oforigin/main.- The card was closed
completedby the PR'sFixes #21957.pm:dispatchedis removed in this act. - Carried, not owed here:
since: v17.7holds only if objectstack's.objectui-shamoves past objectuic3623eb1(PR 11669) before the 17.7 cut. At this landing the pin is still0abd4f9f. If 17.7 ships without it, the item owes a rev-2sincebump. The item's fixture line states the condition.
Generated by Claude Code
- added a commit that references this issue
on Oct 7, 2026
Routed by the objectui
domain:uiseat 1 (session_015W8GBu6sBiqus2L2xjMsAL) as the cross-repo half of objectstack-ai/objectui#10202. Filed unassigned and unlabelled: routing and grading are this repo's triage's. ⛔ Not a claim.Why
6006062645there (batch 🔗 Broken links detected in documentation #280 item 1, letter A′, on the maintainer's order) scopes it to:optionswhenpicklistis set;docs/qa/platform-checklist/areas/studio-authoring.json), outside the objectui lane, so the seat carries it here instead of editing objectstack from an objectui card.3114a9f), being landed through objectui's merge queue as this card is filed.mainfaf8dce4with a local, uncommitted picklist fixture:422 INVALID_METADATAatfields.tier.options;200in both designers;The entry (for
docs/qa/platform-checklist/areas/studio-authoring.json){ "area": "studio-authoring", "id": "studio-authoring.picklist-bound-select", "title": "A picklist authored in a package is used by two objects' select fields from the designer: both forms offer its options, the bound field refuses inline options, and a GET → edit → PUT of an object with a bound field saves", "since": "v17.6", "status": "active", "revision": 1, "priority": "P2", "surface": "mixed", "personas": [ "seeded admin (authors the objects in Studio; the picklist is authored in a package)" ], "fixtures": { "app": "showcase", "requires": [ "a package that declares a picklist (definePicklist: name, label, two or more options) and, from a package, one picklistExtensions entry adding one option to it; the stock showcase declares none — add one in the run's own checkout, uncommitted", "a writable project package with two runtime objects, each with a sharingModel and one select field carrying inline options; one of them published with a field already bound (picklist: NAME, no options)", "the console under test carries objectui#10202's build, flowed back to objectstack with `pnpm objectui:refresh` per the multi-repo rule" ] }, "steps": [ "boot the showcase isolated with the console under test; sign in as the seeded admin", "GET /api/v1/meta/picklist and GET /api/v1/meta/picklist/NAME — the list is served with name, label, its own options and _packageId", "GET /api/v1/meta/object/OBJ_A/layers for the object whose field is already bound — record the bound field as served (picklist + resolved options, the extension's option included)", "metadata admin (Setup → Metadata → Object → OBJ_A): select an UNRELATED field, rename its label, let the autosave run; record the PUT body and status", "select the bound field: record what the select-field editor shows (Options from = the picklist; the values read-only; no inline options editor)", "open OBJ_B, select its inline select field, open 'Options from', choose the picklist; record the PUT body and status", "Studio → the package → Data → OBJ_A: add a field and let the autosave run; record the PUT body and status", "publish both objects; open the new-record form of each and open the bound select", "Setup → Metadata → Picklist → NAME: record what the page shows and offers" ], "acceptance": [ { "clause": "the metadata-admin edit of an unrelated field saves: PUT 200, and no picklist-bound field in the body carries options; every other field (an inline select included) is sent byte-identical", "oracle": "api", "verify": "the captured PUT body and status", "evidence": "the PUT body" }, { "clause": "the designer shows no live 'picklist and options cannot both be declared' issue on an object loaded with a served bound field", "oracle": "dom", "verify": "page text after load", "evidence": "screenshot" }, { "clause": "the select-field editor offers the served picklists by name; choosing one PUTs the field with picklist and WITHOUT options (200)", "oracle": "mixed", "verify": "picker options vs GET /meta/picklist; the PUT body", "evidence": "picker screenshot + PUT body" }, { "clause": "a bound field refuses inline options: no inline options editor (no 'Add value'), the list's values shown read-only with the reason", "oracle": "dom", "verify": "the field inspector", "evidence": "screenshot" }, { "clause": "the Studio data page's autosave of an object with a bound field is accepted (200), the bound field sent without options", "oracle": "api", "verify": "the captured PUT", "evidence": "the PUT body" }, { "clause": "after publish, both objects' new-record forms offer the picklist's options, the extension's option included", "oracle": "dom", "verify": "open each bound select", "evidence": "the two option lists" }, { "clause": "the picklist page shows label, name, owning package, each option with its label and value, and each extension under its declaring package — and offers no create, edit or delete (no New on the list; every control on the detail page disabled or read-only; no write request)", "oracle": "dom", "verify": "list + detail page, network log", "evidence": "screenshots + the empty write log" } ], "negative": [ "any PUT of an object with a bound field answered 422 INVALID_METADATA at fields.FIELD.options — FAIL (the served-options producer obligation)", "an inline options editor, or a free-text name box, offered on a bound field — FAIL", "a New / Save / Delete on the picklist list or detail page — FAIL (the kind is package-owned, allowRuntimeCreate false)", "the picklist page saying 'no package extends this picklist' when the package read failed — FAIL" ], "traps": [ "stale-console-bundle", "cache-staleness" ], "source": [ "objectui#10202 ruling 6006062645 (A′): (a) use picklist, (b) served options dropped before the PUT, (c) read-only page, (d) this item", "objectstack#18164; producer obligation 5925784898; server pin packages/objectql/src/protocol-picklist-served-roundtrip.test.ts", "packages/spec/src/data/picklist.zod.ts (PicklistSchema, PicklistExtensionSchema, PicklistServedFieldSchema); FieldSchema.picklist refinement" ], "history": [ { "revision": 1, "date": "2026-10-06", "change": "new — drafted with objectui#10202 against the measured run of its PR; filed by the seat" } ] }Notes for whoever authors it
pnpm objectui:refreshfixture line has to hold before a run can pass: the console under test must carry objectui#10202's build.Dedupe:
mcp__github__search_issues(objectstack-ai/objectstack, semantic, closed included),studio-authoring checklist item picklist bound select field designer forms options inline refused PUT round trip→ 14 hits. None is this item. The nearest are objectstack#18164 (the epic), #19518 and #19519 (its spec and runtime halves, closed), and #20939 (a different studio-authoring item).Dedupe words:
studio-authoring.picklist-bound-select·picklist checklist item·use picklist designerGenerated by Claude Code