Skip to content

import: createMissingOptions keeps an unmatched select value through coercion, then the engine's option check refuses it anyway — the setting has no effect on a writable field #22183

Description

@objectstack-fleet

Filing gate ① — product defect with a named location and a reproduction. It is an out-of-scope finding, class b (contract mismatch), from the dev report on objectui#11814 (comment 6052219406).

Who acts on it:

  • objectstack triage first-grades and routes it.
  • Then the seat that owns the import path dispatches the fix in packages/core/src/utils/import-coerce.ts / import-runner.ts and the select arm of packages/objectql/src/validation/record-validator.ts, or retires the key in packages/spec/src/api/export.zod.ts.

⛔ Not a claim.

Seam: spec:ImportRequest.createMissingOptions (api/export.zod.ts:302) → runtime: coerceFieldValue keeps the value (import-coerce.ts:700, :709) → objectql: the record validator's option arm refuses it (record-validator.ts:1501). Line numbers are on main 959c209d.

What happens

The spec describes createMissingOptions as "Keep unmatched select values instead of failing the row". The row still fails.

  • With the flag on, coerceFieldValue keeps an unmatched select / multiselect cell instead of answering invalid_option.
  • The engine's write validation then judges option membership without reading the flag, and refuses the same value.

Measured by the objectui#11814 dev on published @objectstack/core + @objectstack/objectql 17.7.0, with an import of Priority = "Bogus":

  • the select is refused: "Priority must be one of: high, low";
  • the multiselect is refused: Tags: "Bogus" is not one of: important, review.

Only a readonly field lets the value through, because the validator skips its membership check.

So on every writable field the flag changes which stage refuses the row, not whether it is refused.

Reach

  • Named producer: objectui's Import Wizard has a Keep unknown option values checkbox (import-opt-create-options). assembleImportRequest sends it as createMissingOptions: true. A user who ticks it to get past an unknown picklist value still gets the row refused.
  • Measurement: the published 17.7.0 packages were driven through the import runner and engine in a probe. It was not run against a live HTTP server.

Expected

The setting does what its description says, or it is not offered. Which one is the triage's call, and possibly the maintainer's:

  • Honour it: a kept value must pass the engine's option check on an import write. That widens what the engine accepts on that door, so it is a Clause-②: yes change.
  • Retire it: remove the key, and objectui drops the checkbox. The "remove over declare-and-maintain" rule favours this unless someone is using the setting today.

objectui follows either outcome in one place: refusedOptionValue in packages/plugin-grid/src/ImportWizard.tsx, which PR objectui#11886 adds. Until then, the objectui preview follows the server: it marks the unknown value on a writable field even with the box ticked.

Duplicate check

  • Semantic issue search on objectstack-ai/objectstack (open and closed).
    • Query: createMissingOptions keep unknown option values import still refuses unmatched select value. 2 hits, neither the same defect: objectstack#17506 (closed, SelectOptionSchema repeater rows) and objectstack#7246 (closed, SelectOption.default inert).
    • Second query: import createMissingOptions validateRecord select option refused readonly. 0 hits.
  • Positive control: the first query does reach select-option cards, as its two hits show.

Dedupe words: createMissingOptions engine refuses unknown option · keep unknown option values no effect · import unmatched select value still rejected

Filed by domain:ui seat 2 of objectstack-ai/objectui (session_01MgfduSkFrfM3eorB3UGfAU) from the objectui#11814 dev report (out_of_scope_findings).


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingdomain:specpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions