You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Maintainer ruling recorded — maintainer, 2026-08-17, batch acceptance of the PM decision-inbox recommendations, verbatim: 「同意」. Four-dimension analysis delivered in-session; provenance: PM session session_01NYgmGheCzM6NrHZN436Cxf.
Ruled: unify on the adjudicated predicate. The remote-picker branch condition reads hasStaticOptionDomain(field) (PR #5030's single criterion: options is a non-empty array) instead of !field?.options, so options: [] routes to LookupValuePicker exactly as the value-domain side already treats it. Pin: a referenceTo field with options: [] gets the remote picker; a non-empty options field keeps the static Select.
The adjacent observation (plugin-view's deriveFieldOptions not passing referenceTo) stays out of scope per the card — file separately if wanted.
Label needs-user-decision → pm:queue in the same stroke.
{
"issue": 5031,
"status": "done",
"branch": "claude/issue-5031-lookup-empty-options",
"pr": "https://github.com/objectstack-ai/objectui/pull/5107",
"premise_still_valid": true,
"summary": "Verified the premise on origin/main (405d54e): PR #5030 is landed and the remote-picker branch in packages/components/src/custom/filter-builder.tsx still read `!field?.options`, which is false for `options: []`. Replaced that one conjunct with PR #5030's adjudicated predicate `hasStaticOptionDomain(field)`, so a `referenceTo` (or user/owner) lookup column with an empty options array now reaches LookupValuePicker exactly as the value-domain side already treats it, while a column with non-empty options keeps its static Select. The branch's other conjuncts are unchanged, so a lookup with nothing to search against routes as before. Also corrected the two comment spans in the same file that asserted the old routing, and re-pointed the two assertions in PR #5030's suite that pinned `account_pending` rendering through a temporary SelectItem — adding a new case on `stage` so that SelectItem path stays covered on a column that genuinely owns its option domain.",
"tests": "All at cd91efd, the final commit (git rev-parse --short HEAD), tree clean. Heavy runs serialized under flock /tmp/os-heavy-verify.lock. Build closure first: `pnpm --filter '@object-ui/components^...' build` EXIT=0. New + amended suites: `pnpm exec vitest run packages/components/src/__tests__/filter-builder-lookup-empty-options.test.tsx packages/components/src/__tests__/filter-builder-value-option-domain.test.tsx` -> 'Test Files 2 passed (2) / Tests 37 passed (37)'. Full package: `pnpm exec vitest run packages/components/` -> 'Test Files 155 passed (155) / Tests 1428 passed (1428)'. `pnpm --filter @object-ui/components type-check` -> EXIT=0 (tsc --noEmit && tsc -p tsconfig.test.json). `pnpm --filter @object-ui/components lint` -> '868 problems (0 errors, 868 warnings)', EXIT=0, warning baseline unchanged. DOWNSTREAM consumer sweep (consumers of @object-ui/components that render the builder: packages/fields widgets, packages/plugin-view config, packages/app-shell views) -> 'Test Files 284 passed (284) / Tests 3028 passed | 1 skipped'. Repo gates: check-changeset-presence.mjs ('3 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)'), check-changeset-no-major.mjs, check-changeset-fixed.mjs, check-control-bytes.mjs ('scanned 4533 tracked text file(s)') all green; manual control-byte grep over the 4 changed files found none. REVERSE VERIFICATION from the committed state (restore `!field?.options`, re-run, then `git checkout <branch> -- <file>`): predicted red on the new pins and green on the guards, observed exactly that -> 'Tests 9 failed | 28 passed (37)' — red were all 7 pins under 'routes an unloaded lookup column to the remote picker' plus the 2 re-pointed visibility assertions; every blast-radius guard stayed green. CI on PR #5107 is in_progress at report time per the dispatch contract. Note: the repo's own vitest guard rejected `pnpm --filter <pkg> test -- <paths>` (objectui#3288 — args after `--` are silently dropped); all runs used the prescribed root-level `pnpm exec vitest run <path>` form.",
"open_questions": [],
"out_of_scope_findings": []
}
Notes for the PM (not part of the JSON):
No new issues filed. The card's own adjacent observation (plugin-view's deriveFieldOptions not passing referenceTo) is explicitly out of scope per the ruling and is already recorded in this issue's body; I did not file it separately since the ruling says "file separately if wanted" — that call is yours.
skip-changeset was not used or created: this repo declares via a changeset file, and a real one is included (.changeset/filter-builder-lookup-empty-options.md, @object-ui/components: patch).
Activity
os-zhuang commentedon Aug 17, 2026
Maintainer ruling recorded — maintainer, 2026-08-17, batch acceptance of the PM decision-inbox recommendations, verbatim: 「同意」. Four-dimension analysis delivered in-session; provenance: PM session
session_01NYgmGheCzM6NrHZN436Cxf.Ruled: unify on the adjudicated predicate. The remote-picker branch condition reads
hasStaticOptionDomain(field)(PR #5030's single criterion: options is a non-empty array) instead of!field?.options, sooptions: []routes toLookupValuePickerexactly as the value-domain side already treats it. Pin: areferenceTofield withoptions: []gets the remote picker; a non-emptyoptionsfield keeps the static Select.The adjacent observation (plugin-view's
deriveFieldOptionsnot passingreferenceTo) stays out of scope per the card — file separately if wanted.Label
needs-user-decision→pm:queuein the same stroke.Generated by Claude Code
os-zhuang commentedon Aug 18, 2026
Claim: PM seat dispatch (post-ruling)
Session:
session_01NYgmGheCzM6NrHZN436CxfBranch:
claude/issue-5031-lookup-empty-optionsScope: per the ruling above — the remote-picker branch reads
hasStaticOptionDomain(field)(PR #5030's adjudicated predicate) in place of!field?.options; pins foroptions: []⇒ remote picker and non-emptyoptions⇒ static Select. Nothing else; thederiveFieldOptions/referenceToobservation stays out of scope.Routing authority: maintainer ruling, 2026-08-17 「同意」 batch (comment above).
Label
pm:queue→pm:dispatchedin the same stroke.Generated by Claude Code
fix(components): FilterBuilder routes an `options: []` lookup to the …
os-zhuang commentedon Aug 18, 2026
{ "issue": 5031, "status": "done", "branch": "claude/issue-5031-lookup-empty-options", "pr": "https://github.com/objectstack-ai/objectui/pull/5107", "premise_still_valid": true, "summary": "Verified the premise on origin/main (405d54e): PR #5030 is landed and the remote-picker branch in packages/components/src/custom/filter-builder.tsx still read `!field?.options`, which is false for `options: []`. Replaced that one conjunct with PR #5030's adjudicated predicate `hasStaticOptionDomain(field)`, so a `referenceTo` (or user/owner) lookup column with an empty options array now reaches LookupValuePicker exactly as the value-domain side already treats it, while a column with non-empty options keeps its static Select. The branch's other conjuncts are unchanged, so a lookup with nothing to search against routes as before. Also corrected the two comment spans in the same file that asserted the old routing, and re-pointed the two assertions in PR #5030's suite that pinned `account_pending` rendering through a temporary SelectItem — adding a new case on `stage` so that SelectItem path stays covered on a column that genuinely owns its option domain.", "tests": "All at cd91efd, the final commit (git rev-parse --short HEAD), tree clean. Heavy runs serialized under flock /tmp/os-heavy-verify.lock. Build closure first: `pnpm --filter '@object-ui/components^...' build` EXIT=0. New + amended suites: `pnpm exec vitest run packages/components/src/__tests__/filter-builder-lookup-empty-options.test.tsx packages/components/src/__tests__/filter-builder-value-option-domain.test.tsx` -> 'Test Files 2 passed (2) / Tests 37 passed (37)'. Full package: `pnpm exec vitest run packages/components/` -> 'Test Files 155 passed (155) / Tests 1428 passed (1428)'. `pnpm --filter @object-ui/components type-check` -> EXIT=0 (tsc --noEmit && tsc -p tsconfig.test.json). `pnpm --filter @object-ui/components lint` -> '868 problems (0 errors, 868 warnings)', EXIT=0, warning baseline unchanged. DOWNSTREAM consumer sweep (consumers of @object-ui/components that render the builder: packages/fields widgets, packages/plugin-view config, packages/app-shell views) -> 'Test Files 284 passed (284) / Tests 3028 passed | 1 skipped'. Repo gates: check-changeset-presence.mjs ('3 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s)'), check-changeset-no-major.mjs, check-changeset-fixed.mjs, check-control-bytes.mjs ('scanned 4533 tracked text file(s)') all green; manual control-byte grep over the 4 changed files found none. REVERSE VERIFICATION from the committed state (restore `!field?.options`, re-run, then `git checkout <branch> -- <file>`): predicted red on the new pins and green on the guards, observed exactly that -> 'Tests 9 failed | 28 passed (37)' — red were all 7 pins under 'routes an unloaded lookup column to the remote picker' plus the 2 re-pointed visibility assertions; every blast-radius guard stayed green. CI on PR #5107 is in_progress at report time per the dispatch contract. Note: the repo's own vitest guard rejected `pnpm --filter <pkg> test -- <paths>` (objectui#3288 — args after `--` are silently dropped); all runs used the prescribed root-level `pnpm exec vitest run <path>` form.", "open_questions": [], "out_of_scope_findings": [] }Notes for the PM (not part of the JSON):
plugin-view'sderiveFieldOptionsnot passingreferenceTo) is explicitly out of scope per the ruling and is already recorded in this issue's body; I did not file it separately since the ruling says "file separately if wanted" — that call is yours.skip-changesetwas not used or created: this repo declares via a changeset file, and a real one is included (.changeset/filter-builder-lookup-empty-options.md,@object-ui/components: patch).Generated by Claude Code
fix(components): FilterBuilder routes an `options: []` lookup to the …