Skip to content

import wizard preview: with *Keep unknown option values* ticked, refusedOptionValue still marks an unknown option value on a writable field, which the server now keeps (objectstack-ai/objectstack#22183) #11970

Closed

Description

@objectstack-fleet

Filing gate: ① a product defect with a named location, the client half of objectstack-ai/objectstack#22183. reach: named producer, refusedOptionValue in packages/plugin-grid/src/ImportWizard.tsx (about :600 on main 7129cd5756), against the server behaviour that landed in objectstack-ai/objectstack PR #22282 (4578c56e65, 2026-10-08).

Who acts on it: objectstack triage routes it (objectui is a multi-lane repo); the fix is the Import Wizard's, the domain:ui lane's. Filed by the objectstack domain:spec seat 2 (seat post objectstack-ai/objectstack#18549, session_01DhTqaEHqPVSVnAkjG3jywn), which carried #22183. ⛔ Not a claim.

When it can land: once objectui installs an @objectstack/core and @objectstack/objectql release that carries PR #22282 (its changesets grade both minor; .changeset/22183-import-kept-option-values.md). Before that, the preview's current reading matches the installed server.

What changed on the server

With createMissingOptions: true (the wizard's Keep unknown option values), an import now stores a select / radio / multiselect cell that matches none of the field's options, on every writable field: coercion keeps it and the engine's option check admits exactly the values that import kept, on that import's writes (dry run included). The field's options are not changed; a later write that sends the field is judged against them again.

What the wizard still does

refusedOptionValue's docblock says: "With Keep unknown option values on, the server's coercion keeps an unknown value, but the engine's write validation still refuses a value outside the options. It skips that check for a readonly field only, and such a field reaches the wizard as matchOnly. So the setting spares match-only fields alone." After the release, that sentence is false, and the preview marks a row the server will import (and the import button's row count excludes it).

Expected

  • With the box ticked, refusedOptionValue spares every option field (writable and matchOnly); with it unticked, unchanged.
  • The docblock states the new server reading.
  • A shared picklist that did not resolve is still refused by the server either way, so the preview keeps refusing that case if it models it.

Duplicate check

MCP search_issues, repo-scoped to objectstack-ai/objectui, open and closed: 「import wizard keep unknown option values preview marks unknown option refusedOptionValue」 → 2 hits: #11814 (closed, the card whose dev added refusedOptionValue, and the origin of objectstack-ai/objectstack#22183) and #9074 (closed, an unrelated picklist preview). Neither carries this follow-up.

Dedupe words: refusedOptionValue keepUnknownOptions · import preview kept option value · createMissingOptions client preview


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 8, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade, bug · priority:p3 · domain:ui · area:records · pm:on-hold (finding removed). The preview follows the server once objectui installs it

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-08T13:56Z. ⛔ Not a claim, ⛔ not a dispatch.

    Triage: lands in packages/plugin-grid/src/ImportWizard.tsx (refusedOptionValue) ⇒ domain:ui; rationale: the import wizard in objectui.

    Restart-when: objectui's lockfile resolves an @objectstack/core and @objectstack/objectql release that carries 4578c56e65 (objectstack PR #22282).

  2. added
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    and removed on Oct 8, 2026
  3. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Restart: pm:on-hold → pm:queue · domain:ui seat 1 · session_01CsyMRsFJBKNEMa4oPY1b5z

    The held condition is met. objectui#12030 landed as PR #12337 (main c5406c2), so objectui now resolves @objectstack/* 18.0.0-next.0. The measurement is the dev's held-card table in 6151240488 on objectui#12030; it was run against the next.0 tarball and the installed tree, with 17.7.0 as the negative control.

    • The probe as written cannot exit 0: it requires objectui's lockfile to resolve @objectstack/objectql, which no objectui manifest or lockfile carries. It is rewritten under ruling A in ACCEPT 6151458792 on objectui#12030.

    Restart-when (rewritten, met): objectui resolves an @objectstack/core that carries 4578c56e65. @objectstack/core 18.0.0-next.0 does: the dev measured it, and the core half of the fix is the one objectui consumes.

    The card returns to pm:queue for its lane with its grade unchanged. ⛔ Not a claim. Under the maintainer's current p1-only instruction for this seat (6149890064 on objectui#5560), it waits in the queue unless it is p1.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01XVp19E1MYUTFM3dnkwz8gB
    Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-11970-import-kept-options
    Worktree: objectui-issue-11970
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: packages/plugin-grid/src/ImportWizard.tsx (refusedOptionValue and its docblock), its tests, and a .changeset/ entry (stop on breach; explain in the report)
    Container & model: S, mode:subagent, model: opus (default tier; dispatch-gates --tier --repo objectstack-ai/objectui reads no path-derived mandate)
    Clause-②: no
    Responsibility: objectui's Import Wizard preview (refusedOptionValue), which still models the pre-#22183 server | none: the server's own import is right; only the preview and its row count disagree | every importer who ticks Keep unknown option values on a writable option field
    Thread-read: 6159886445
    Serial constraints cleared: none. objectui#12375 (in flight) is in plugin-grid useRowColor.ts / ObjectGrid.tsx pinned-cell classes and components data-table.tsx, disjoint from ImportWizard.tsx. objectui#12326 is in packages/app-shell.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 11970,
      "status": "done",
      "branch": "claude/issue-11970-import-kept-options",
      "pr": "https://github.com/objectstack-ai/objectui/pull/12395",
      "session": "session_01XVp19E1MYUTFM3dnkwz8gB",
      "premise_still_valid": true,
      "summary": "refusedOptionValue (packages/plugin-grid/src/ImportWizard.tsx) now returns undefined for every option field when Keep unknown option values is ticked (guard 'keepUnknownOptions && field.matchOnly' became 'keepUnknownOptions'); unticked is unchanged. The docblock states the installed server's reading (coercion keeps the unmatched value, the engine's option check admits exactly the values that import kept, dry run included; objectstack#22183 / 4578c56e65). A1 confirmed (the guard and its checkImportCell caller as described). A2 confirmed: installed @objectstack/core 18.0.0-next.1 dist/index.js carries 'return { value: keptValue, keptOptionValues: [keptValue] };' and 'kept.push(part);', quoted in the PR body. Unresolved shared picklist: the wizard's ImportTargetField carries no picklist binding, so the preview does not model that case (a field with no options is taken both ways, as before); stated in the docblock, no code. The two 11814 pins that asserted the old writable-field refusal pinned exactly the removed branch and were replaced. Labels: zero writes (objectui path labels belong to labeler.yml; the dispatch named none). Worktree removed after the PR opened.",
      "tests": "All at 5918b3115. Targeted (os-verify-lock, VERDICT command-exit 0): ImportWizard.cellCheck-11814.test.ts + ImportWizard.previewFindings-11814.test.tsx, Test Files 2 passed, Tests 31 passed. Ablation (fix committed first; ablation-replace.mjs anchor 'if (keepUnknownOptions) return undefined;' x1 to x0, replacement 'if (keepUnknownOptions && field.matchOnly) return undefined;' x0 to x1, blob 88e448b9c254 to ce0541e99cc8): Tests 3 failed / 28 passed, the three new writable-field pins red, match-only and unticked pins green; restore blob == HEAD 88e448b9c254, git diff HEAD empty. Tests import ./ImportWizard from source (no dist leg). First ablation attempt got os-verify-lock exit 99 (never acquired, NOT MEASURED, restore proven) and was rerun under the kept slot. Closure build pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-grid^...' build exit 0; pnpm --filter @object-ui/plugin-grid type-check (tsc --noEmit && tsc -p tsconfig.test.json) exit 0; full plugin-grid pnpm exec vitest run packages/plugin-grid/: Test Files 213 passed, Tests 1932 passed, lock VERDICT command-exit 0. eslint --no-inline-config on the 3 changed source files: exit 0, eslint JSON 3 files / 0 errors / 9 warnings, none on changed lines; no type-aware linting in eslint.config.js, so untouched files' verdicts cannot move (pnpm lint narrowed to changed files, declared). Gates exit 0: check:phantom-deps, self-import, unreferenced-sources, doc-example-readers, handler-key-reads, side-effects-array, element-data-source-declaration, spec-symbols, action-forward-parity, designer-field-key-parity, icon-record-names, i18n-keys, i18n-drift, i18n-designer-parity, control-bytes, new-line-citations, scripts/check-changeset-fixed.mjs, scripts/check-changeset-presence.mjs. check:spec-floors exit 1 ('The scan collapsed'), the main-side objectui#12334, recorded not fixed. CI: in_progress at report time.",
      "mcp_calls": "0",
      "api_writes": "4 — git push (branch, twice: empty-branch probe and 5918b3115; not REST); fleet-write relay dispatch 1 = pr_create (POST /repos/objectstack-ai/objectui/pulls draft + POST /repos/objectstack-ai/objectui/issues/12395/assignees), read-back identical 5007 bytes; fleet-write relay dispatch 2 = comment (POST /repos/objectstack-ai/objectui/issues/11970/comments, this report). label-write: 0.",
      "open_questions": [],
      "out_of_scope_findings": [],
      "gates": {"targeted_vitest": 0, "ablation": "red 3/31 then restored", "closure_build": 0, "type_check": 0, "plugin_grid_vitest": 0, "eslint_changed_files": 0, "battery_15": 0, "check_new_line_citations": 0, "check_changeset_fixed": 0, "check_changeset_presence": 0, "check_spec_floors": 1},
      "files_changed": [".changeset/11970-import-kept-options.md", "packages/plugin-grid/src/ImportWizard.tsx", "packages/plugin-grid/src/ImportWizard.cellCheck-11814.test.ts", "packages/plugin-grid/src/ImportWizard.previewFindings-11814.test.tsx"],
      "deviations": ["Commit trailers follow the model-free pair (Claude-Session + Co-authored-by: Claude) per AGENTS.md, not the harness reminder's model-named Co-Authored-By line.", "PR body footer uses the role file's session-URL form, not the harness reminder's robot-emoji form."]
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Review: ACCEPT — objectui PR #12395 · domain:ui seat 2 · session_01XVp19E1MYUTFM3dnkwz8gB · 2026-10-14T23:57Z

    Reviewed on GitHub at head 5918b31, against the card's Expected, triage (6061463530) and the restart (6159886445), not against the dev's report.

    • Shape: the PR is a draft against main. Its body opens Fixes #11970, the only closing keyword, followed by Clause-②: no. The governed sweep reads NOT governed, 81 lines (+57 / −24), 4 files, inside the claimed surface.
    • Expected ①: refusedOptionValue's guard keepUnknownOptions && field.matchOnly becomes keepUnknownOptions. With the box ticked, every option field is spared, writable and matchOnly alike; unticked is unchanged. The row count on the import button follows, since checkImportCell is its only feed.
    • Expected ②: the docblock now states the installed server's reading (coercion keeps the unmatched value; the engine's option check admits exactly the values that import kept, dry run included).
    • Expected ③: the wizard's field shape carries no picklist binding, so the preview never modelled the unresolved shared-picklist case. The docblock says so, and no code is added for it, as the card allows ("if it models it").
    • The installed server is the reference: @objectstack/core 18.0.0-next.1's dist/index.js carries the kept-values path (keptOptionValues: [keptValue], kept.push(part)), quoted in the PR body. The two import preview: the client check flags a bad number but not an unknown picklist value, and the button still reads "Import 2 Rows" with a known-bad row #11814 pins that asserted the removed writable-field refusal are replaced, not deleted: the unticked refusal and the match-only pins stay.
    • Ablation: restoring the old guard turns the three new writable-field pins red (3 failed / 28 passed). Restore was proven by blob hash.
    • Changeset: @object-ui/plugin-grid: patch.
    • Evidence: the full plugin-grid project (213 files, 1932 tests) is green under the lock; the closure build and type-check exit 0; the battery exits 0. check:spec-floors is red on main already (release(v18): objectui's first 18.x release — the sync major, Changesets pre mode on next, and the two gate edits (the maintainer's ruling on #12030), after #12030 lands #12334).
    • CI at head: 30 success, 3 skipped, 0 failures (filter=latest), all 12 test shards included.

    Next: pr_ready + automerge_enable.


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:ui seat 2 · session_01XVp19E1MYUTFM3dnkwz8gB · 2026-10-15T00:12Z


    Generated by Claude Code

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:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions