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
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:
packages/core/src/utils/import-coerce.ts/import-runner.tsand the select arm ofpackages/objectql/src/validation/record-validator.ts, or retires the key inpackages/spec/src/api/export.zod.ts.⛔ Not a claim.
Seam: spec:
ImportRequest.createMissingOptions(api/export.zod.ts:302) → runtime:coerceFieldValuekeeps the value (import-coerce.ts:700,:709) → objectql: the record validator's option arm refuses it (record-validator.ts:1501). Line numbers are onmain959c209d.What happens
The spec describes
createMissingOptionsas "Keep unmatched select values instead of failing the row". The row still fails.coerceFieldValuekeeps an unmatchedselect/multiselectcell instead of answeringinvalid_option.Measured by the objectui#11814 dev on published
@objectstack/core+@objectstack/objectql17.7.0, with an import ofPriority = "Bogus":Only a
readonlyfield 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
import-opt-create-options).assembleImportRequestsends it ascreateMissingOptions: true. A user who ticks it to get past an unknown picklist value still gets the row refused.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:
Clause-②: yeschange.objectui follows either outcome in one place:
refusedOptionValueinpackages/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
SelectOptionSchemarepeater rows) and objectstack#7246 (closed,SelectOption.defaultinert).Dedupe words:
createMissingOptionsengine refuses unknown option · keep unknown option values no effect · import unmatched select value still rejectedFiled by
domain:uiseat 2 of objectstack-ai/objectui (session_01MgfduSkFrfM3eorB3UGfAU) from the objectui#11814 dev report (out_of_scope_findings).Generated by Claude Code