Skip to content

spec: a shared picklist (global value set) metadata kind — option lists reused across objects and packages are TypeScript constants today #18164

Closed
3 of 3 issues completed

Description

@os-elon-musk

Epic: session_016tKoy8NJa35Yih1FdzrVmn (director seat, summon #32), taken over on the maintainer's order 「你负责接手,并派发处理所有所有相关的」 · 2026-10-03T09:43Z · checklist 5967887779
Epic territory: objectstack-ai/hotcrm#2000 (hotcrm src/**: _picklists.ts, new *.picklist.ts, the select fields and consumers that import the lists, locale bundles); objectstack-ai/objectui#10202 when it unlocks (Studio picklist page, object designer field editor)
Ruled: 5904864936 · letter Q1 A · Q2 A — #19518 (the spec layer) is dispatchable now; the kind is named picklist (*.picklist.ts, Field.select({ picklist }), picklists.<name>, picklistExtensions); #19519 and objectui#10202 keep their Blocked-by order · 2026-09-30T05:42Z

Path: 本地跑起来、看到 — records-forms (清单项待写, authored with #19518) | P2

Parent of a cross-layer feature point (ruling batch #209 item 1 · A · maintainer 「18164 同意」): sub-issues in Blocked-by: order — #19518 (spec) → #19519 (runtime) → objectui#10202 (Studio). This card is a coordination node and is never dispatched itself; the road order (behind the open product P0/P1 items) decides when #19518 is taken.

Gap

There is no metadata kind for an option list that several objects share. Checked on @objectstack/spec 17.4.0's dist/index.d.ts and dist/data/index.d.ts: no globalPicklist, valueSet, picklists or equivalent key. An app that wants industry, lead_source, salutation, opportunity_stage or territory to mean the same thing on several objects keeps them as exported TypeScript arrays and spreads them into each Field.select({ options: [...] }).

Evidence (hotcrm, origin/main c716a2c)

  • src/objects/_picklists.ts — ~3,001 authored tokens; imported by 17 files: seven objects (account, contact, lead, opportunity, task, event, event_attendee, plus contract and quote), two views, a flow, an action, a dashboard, an import mapping and a locale bundle.
  • Under the ADR-0130 package split (Epic: split HotCRM into ADR-0130 packages — sales is the app, service / revenue / marketing are modules, a directory is a package hotcrm#1904) those consumers sit in three packages (sales, revenue, and the app's own dashboards and translations), so the file becomes cross-package source that every module must import from the app package — the shape a metadata kind would replace with a reference by name.
  • The same lists are what a customer overlay most often wants to extend (a customer-specific industry or lead-source value), and today that is a source edit in the app, not an overlay (ADR-0005 has nothing to overlay).

Ask

A picklists (or valueSets) stack collection: { name, label, options: SelectOption[] }, owned by a package like any other metadata, referenced from a select field by name (Field.select({ picklist: 'crm_industry' })), translatable through the locale packs the way field options are, and extensible by an org overlay (ADR-0005) so a customer can add a value without forking the object. Salesforce Global Value Sets and Dataverse global option sets are the reference shape.

Dedupe words: global picklist, value set, shared select options, _picklists.ts, picklist metadata kind.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    Contributor

    Ruling: batch #251 item 3 · letter Q1 A · Q2 A · maintainer 「同意」 2026-09-30T05:39Z

    Director seat (objectstack#12708, summon #30 续 2, session_01AsCNgFBs8HCjwhyHQsFbx3). Provenance: maintainer, live PM chat with the director seat, 2026-09-30, replying 「同意」 to batch #251 as presented (this card as item 3, with #20281 and #18386); 「同意」 is to the director's recommendation in chat, which adopted the seat's decision request 5903510250 (Q1 A, Q2 A) after this seat's own reading: open P0 2 / P1 19 at 04:3xZ and none takeable in the domain:spec lane; #19518 pm:queue, p2, unclaimed; "picklist" in content/docs 9 hits and in the reference app's _picklists.ts, valueSet 0 hits in packages/spec/src; the design of record 5715762696 item 1 already spells picklist with the name left to confirm; ruling 5755653853 (batch #209 item 1, A).

    Ruled: Q1 A. #19518 (the spec layer) is dispatchable now: the maintainer's 2026-09-23 release of the P0/P1-first rule in the domain:spec lane covers the sequencing sentence of ruling 5755653853 for this layer. #19519 (runtime) and objectui#10202 (Studio) keep their Blocked-by: order and are released as that ruling states, not by this one.

    Ruled: Q2 A — the kind is named picklist. File pattern *.picklist.ts; the field reference Field.select({ picklist: 'industry' }), mutually exclusive with options; translation TranslationData.picklists.<name>; the package-level extension picklistExtensions — the design of record with its one open name closed. ⛔ Not valueSet: the repository, the reference app and the docs already say picklist, and a published name is permanent.

    Readings recorded with the ruling:

    • Long-run: a first-class shared option list, named as this ecosystem already speaks (Salesforce's field type is Picklist; its set is a Global Value Set; Dataverse says global choice; ServiceNow choice list — the names differ, the documented word here is one).
    • Pull: 17 use sites in the reference app (measured on the earlier ruling); external demand unmeasured.
    • AI-safety: a wrong reference is refused loudly under either name; the documented word is the one an AI writes correctly.
    • Startup scope: the spec layer only.

    Execution parameters (ruled in the same stroke):

    State: needs-user-decision → pm:queue on this parent (the coordination node; priority:p2, domain:spec, area:records stay); #19518 stays pm:queue and is takeable now; the Ruled line goes on the body in the same stroke; a pointer goes on #19518.

  2. objectstack-fleet commented on Oct 3, 2026

    @objectstack-fleet
    Contributor

    Epic checklist: #18164 (shared picklist) · epic PM taken over · 2026-10-03T09:42Z

    Director seat, summon #32, session_016tKoy8NJa35Yih1FdzrVmn, now this card's epic PM. This is on the maintainer's order in the live director chat, verbatim 「你负责接手,并派发处理所有所有相关的」, after the maintainer asked why the card had stalled. ⛔ Not a new ruling: every step below executes ruling 5755653853 (batch #209 item 1) and ruling 5904864936 (batch #251 item 3).

    Why it looked stalled. Ruling 5755653853 said an epic PM takes this parent when work starts. None did. The spec and runtime seats landed their sub-issues and closed them, and two steps had no owner:

    • hotcrm's migration, which the ruling assigned to the epic PM "when this lands", was never filed;
    • objectui#10202 stayed held behind objectui's 17.6.0 upgrade and the lane's road order.
    Step Card State
    ① spec: picklist kind, Field.select({ picklist }), translation face, NORTH-STAR line, two checklist items #19518 ✅ landed 2026-09-30, closed
    ② runtime: serve resolved options, additive picklistExtensions, write validation #19519 ✅ PR #21047 → 88b484e00, shipped in 17.6.0
    ③ acceptance: hotcrm's shared lists become picklist metadata, plus the live-boot checklist run objectstack-ai/hotcrm#2000 🟡 filed in this act; claimed and dispatched next
    ④ Studio: picklist page, "use picklist" in the object designer, and dropping options when picklist is set before a PUT (the producer obligation in objectui#10202 5925784898) objectstack-ai/objectui#10202 ⏸ pm:on-hold. Restart-when: objectui resolves a 17.6.0. Blocked behind objectui#11438 (ruled A′ on batch #272; PR objectui#11531, the trunk). The road-order clause ("after the open product P0/P1 items") is lifted by the maintainer's order above.
    deferred: per-organization overlay (records-forms.picklist-org-append) not filed on a measured customer requirement, ADR-0005 additive only, as both rulings state

    The parent closes when ③ and ④ land. Each dispatch and each landing appends one audit line here.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 3, 2026

    @objectstack-fleet
    Contributor

    Epic audit · #18164 · 2026-10-03T09:54Z · session_016tKoy8NJa35Yih1FdzrVmn. This updates checklist 5967887779.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    Contributor

    Epic audit · #18164 · 2026-10-06T00:10Z · director seat, summon #34, session_0195diSK6vuqxgiJ38VWBHb6. This updates checklist 5967887779 by one line; ⛔ not a takeover of the epic.

  5. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    Contributor

    Cross-seat note from the repo:hotcrm seat, session_012zh91QzFgePbkmuHnugLN3, 2026-10-08T03:08Z. ⛔ Not a claim on this card; its body and labels are untouched.

    objectstack-ai/hotcrm#2000, the hotcrm acceptance step of this epic, left this subtree and is now in the repo:hotcrm lane's pm:queue. pm:epic was removed from it.


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 11, 2026

    @objectstack-fleet
    Contributor

    Epic close-out at 2026-10-11T22:28Z: completed. The shared picklist kind shipped in all three layers that stayed in this subtree. The one remaining item is ruled out. Session session_01EgxC4UNYnzhuvmG12fh5A8.

    Provenance: the maintainer gave the order in live PM chat in this session, verbatim 「该关的关,改开卡的开卡」 and 「按组织追加 picklist 值,不考虑」, and this session executed it.

    Landed

    Dropped

    • The per-organization overlay ("an organization appends values to a shared picklist") was the one item 6051363510 left here. It was never filed. The maintainer's 「按组织追加 picklist 值,不考虑」 drops it.
    • This agrees with ADR-0131 D6, which retired the per-organization overlay axis (docs/adr/0131-total-organization-ownership-no-null-organization-id.md:105).

    Filed as #22869

    Reservation

    • The epic PM session_016tKoy8NJa35Yih1FdzrVmn was recorded unreachable in 6006149092.
    • The subtree has had no claim, branch or PR since objectui#10202 closed at 2026-10-06T06:47Z.
    • pm:epic is removed in the same act.
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

    area:recordsBusiness objects, records, the views that show data, usable forms, searchdomain:specpriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions