Repository navigation
import preview: a time column is not checked, and the user import checks no email — the import button still overcounts both #11913
Description
Activity
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsTriage: first grade,
bug·priority:p3·domain:ui·area:records·pm:queue. Direction: the preview marks a cell exactly where the server refuses it, as objectui#11814 / #11889 setTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-08T08:04Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: lands in
packages/plugin-grid/src/ImportWizard.tsx(checkImportCell's missingtimearm;identityImportFields) ⇒domain:ui; rationale: the import wizard in objectui.- Why p3: the same family and grade as objectui#11889 (p3). The count is wrong before Validate; the server still refuses the bad rows.
- Builds on objectui#11889 (closed): extend the arms it left in
checkImportCell, without forking them. - Copy: the new
invalid_timesentence goes inpackages/i18nbeside the othergrid.import.*rows.
- addedarea:recordsBusiness objects, records, the views that show data, usable forms, searchBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seatand removed
on Oct 8, 2026 objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsClaim: PM loop round 3
Session:session_01CGZy1BGCjdN5cXqL9cnvB8
Account:os-support-ai
Branch:claude/issue-11913-import-time-identity-email
Worktree:objectui-issue-11913
Domain:domain:ui
Seat:domain:ui#3
File surface (line numbers onmaine44f9bc4), per triage's direction6055545691(extend the arms objectui#11889 left, without forking them):packages/plugin-grid/src/ImportWizard.tsx:checkImportCell(about:619–:670) gains atimearm and theinvalid_timecode;- the refusal sentence switch (about
:494) gains that code's case; - the email arm gains the identity endpoint's rule, used only where the identity import asks for it.
packages/app-shell/src/views/IdentityImportPanels.tsx:identityImportFields(about:131) types or flags the email column so the preview checks it by the identity rule (non-ASCII and placeholder addresses marked).packages/i18n/src/locales/*: onegrid.import.*sentence forinvalid_timein every pack, beside the existinggrid.importrows.- The tests beside these, and
.changeset/11913-*.md.
⛔ Not on it:
- the server's rules (objectstack
@objectstack/core'sparseDateCell/readTimeOfDayCell, and the identity endpoint'sisLikelyEmail/isPlaceholderEmail), which are the reference; ObjectView.tsx's import wiring andimportTargetFields.ts;- every other
checkImportCellarm; packages/components/src/ui/**.
Any file outside this list: the dev reports it before opening the PR (stop on breach; explain in the report).
Container & model:M,mode:subagent,model: opus(dispatch-gates --tier --repo objectstack-ai/objectuiover these paths: no path-derived mandate; default tier). The contract review runs at the ceiling,CONTRACT_REVIEW_TIER, because of theClause-②: yesline below. Reason: a new published language-pack key (landing-operations.md条款②入队闸门, declaration limb).
Clause-②: yes
Responsibility:objectui plugin-grid + app-shell import preview: a time column is not checked and the user import checks no email, so the import button counts rows the server then refuses | the platform path: the preview marks a cell exactly where the server's import refuses it (objectui#11814, objectui#11889), mirroring core's time reader and the identity endpoint's email rule | every user importing records with a time column, and every admin importing users
Thread-read: 6055545691
Serial constraints cleared:noneblocking.- Open objectui PRs, read 2026-10-08T12:31Z: none touches
ImportWizard.tsxorIdentityImportPanels.tsx. This seat's objectui#11960 (in the merge queue) adds a different key block to every pack. Whoever lands second mergesmain. - In-flight claims, read 2026-10-08T12:31Z: none names these files.
- Prior work: objectui#11889 (
9fc6ad78) and objectui#11814 (5e446abd) have landed. This card extends their arms.
Why
Clause-②: yes:@object-ui/i18npublishes its locale packs, so theinvalid_timesentence is a published key:minoron@object-ui/i18n.- If
checkImportCell's code union, or any type it widens, is reachable from@object-ui/plugin-grid's built entry, the dev reports it, and that package's changeset isminortoo. - The PR body carries
Clause-②: yesat line start. - A contract-review-tier record is owed before the PR is queued, and the seat runs it.
Generated by Claude Code
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsClaim amendment —
domain:uiseat 3,session_01CGZy1BGCjdN5cXqL9cnvB8, 2026-10-08T12:39Z. It amends the claim6059931513, on the dev's mid-run report (session message, measured onmaine44f9bc4).Why.
checkImportCell's arms live inImportWizard.tsx, but the server mirrors they call do not:isImportableDateCellandisRecordEmaillive inpackages/plugin-grid/src/importCoercionContract.ts.- The
timereader has to reuse that file's private date grammar (ISO_TEMPORAL_CELL,YEAR_FIRST_CELL,namesRealCalendarDay,isWallClock,zonedCellUtcYear). Placing it inImportWizard.tsxwould copy those helpers, which is the fork triage ruled out (6055545691: "extend the arms … without forking them"). isRecordEmail's doc comment says the user import's email column "reaches the wizard typedtext, so this check never runs there". This card makes that false.
File surface, added:
-
packages/plugin-grid/src/importCoercionContract.ts:- the
timereader besideisImportableDateCell; - the identity endpoint's email mirror (
isIdentityEmail) besideisRecordEmail; - the doc-comment correction.
No other region.
- the
-
Its test,
importCoercionContract.test.ts, for the new mirrors.
In-place conditions:
- Same card: the mirrors its two arms call.
- Mechanical: they sit beside the existing ones.
- No other holder: no in-flight claim names the file, and no open objectui PR touches it, read 2026-10-08T12:39Z.
- Same gate family: the plugin-grid tests.
Clause-②: yes, recorded:importCoercionContract.tsis not re-exported from@object-ui/plugin-grid's entry, so it adds no export.- The one reachable widening is an optional
emailRuleflag onImportWizardProps['fields'][number], which the claim's "types or flags" already allows. So@object-ui/plugin-gridisminor, besides@object-ui/i18n. identityImportFieldsis not reachable from app-shell's entry, so app-shell ispatch.
Generated by Claude Code
- The
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 11913,
"status": "done",
"branch": "claude/issue-11913-import-time-identity-email",
"pr": "#11973",
"session": "session_01CGZy1BGCjdN5cXqL9cnvB8 (subagent; the parent's id)",
"premise_still_valid": true,
"summary": "Both legs were confirmed on origin/main e44f9bc and fixed. (1) checkImportCell had no time arm. It gains one (invalid_time), backed by isImportableTimeCell in importCoercionContract.ts. The mirror reads a cell as core 17.7.0's parseDateCell(cell, 'time') does: readTimeOfDayCell via the spec's own ClockTimeValueSchema plus the ISO-instant form, then readYearFirstCell. The new grid.import.invalidTime sentence is in all ten packs and the wizard defaults, and is used for both the preview mark and an invalid_time dry-run row. (2) identityImportFields typed the email column text. It is now typed email and flagged emailRule: 'identity'. The email arm then asks isIdentityEmail, a mirror of plugin-auth 17.7.0 isLikelyEmail + isPlaceholderEmail, instead of isRecordEmail. Neither rule is stricter, so the identity rule replaces the record rule rather than adding to it. The button count follows both legs. Each leg is pinned through the real wizard and ablated red. Draft PR 11973 is open at 603ad4e (main d7e9e9a merged twice, never rebased). Bundle Analysis: success.",
"tests": "At HEAD 603ad4e: vitest packages/plugin-grid/ plus the 4 app-shell import files -> Test Files 199 passed (199), Tests 1866 passed (1866). At fbdf522: vitest packages/plugin-grid/ packages/i18n/ -> Test Files 277 passed (277), Tests 3153 passed | 13 skipped (3166); packages/i18n is byte-identical between fbdf522 and 603ad4e. At 603ad4e: turbo build app-shell^... 28/28, then type-check for plugin-grid, i18n and app-shell all exit 0 (tsc --noEmit + tsconfig.test.json, which include the new test files). eslint on the 17 touched TS files: 0 errors, 11 warnings, all on pre-existing lines. One-off server differential probe (not committed): isImportableTimeCell vs installed core 17.7.0's exported parseDateCell(cell,'time') over 1592 cells, server takes 281, 0 disagreements; isIdentityEmail vs the 17.7.0 functions restated from the tag over 19 cells, 0 disagreements. Reverse checks via objectstack scripts/ablation-replace.mjs in wrap mode (anchor 1->0, blob changed, restore proven blob==HEAD and git diff HEAD empty), run at 34ade8b on files byte-identical at 603ad4e: (a) time arm deleted -> ImportWizard.cellCheck-11913 2 failed / 7 passed; (b) identity selection replaced by isRecordEmail -> 4 failed / 7 passed across the plugin-grid and app-shell 11913 files (the first attempt was refused by the tool before running anything, because the replacement was a substring of the anchor; it was rerun with a unique replacement); (c) the emailRule flag dropped from identityImportFields -> app-shell 11913 file 2 failed. Direction: red, as predicted. Source-resolved: the vitest alias maps @object-ui/plugin-grid to src, so no dist was involved.",
"mcp_calls": "2 - mcp__github__get_job_logs x2 (read-only: main d7e9e9a Bundle Analysis job 113334918968, for the eager-closure baseline, because the REST log download is 403 at the proxy). No write tool.",
"api_writes": "3 - all through the fleet relay (scripts/pm/fleet-write/dispatch.mjs, transport POST /repos/objectstack-ai/objectstack/dispatches): (1) pr_create POST /repos/objectstack-ai/objectui/pulls -> #11973 draft, read-back 12124 of 12124 bytes identical; (2) label-write.mjs --assign os-support-ai POST /repos//issues/11973/assignees, read-back MATCHES; (3) this os-dev-report comment, POST /repos//issues/11913/comments. Plus git push (not REST). No label writes.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: next PR touching importTargetFields.ts or ObjectView's import wiring (承接者:无 named today) - noted, not filed. Type-level only: ImportTargetField.options?: unknown is not assignable to ImportWizardProps['fields'][number]['options']. ObjectView's fields conditional (identityImportFields(...) : importTargetFields(...)) compiles only through subtype reduction to the narrower identity shape. Measured: typing identityImportFields' return as ImportWizardProps['fields'], or as a Pick naming emailRule, turns app-shell type-check red with TS2322 at that conditional. Dedupe words: ImportTargetField options unknown · import fields conditional subtype reduction · identityImportFields return type",
"carrier: 承接者:无 - noted, not filed (only read, not measured through the public door). formatDryRunError has no case for the identity endpoint's upper-case dry-run codes (INVALID_EMAIL, INVALID_PHONE, NO_IDENTITY), so a user-import Validate row shows the endpoint's English text, not a localized sentence. Dedupe words: identity import dry run INVALID_EMAIL sentence · user import validate English error · formatDryRunError identity codes",
"carrier: 承接者:无 - noted, not filed. @object-ui/plugin-grid declares @objectstack/spec ^17.5.0, and spec 17.5.x's ClockTimeValueSchema still took a zone suffix (17.6.0 dropped it). A host resolving spec 17.5.x gets 17.5's clock grammar in the preview. The lockfile installs 17.7.0. Dedupe words: plugin-grid spec floor 17.5 ClockTimeValueSchema zone · time preview spec floor"
],
"gates": [
{
"cmd": "pnpm check:control-bytes",
"exit": 0,
"verdict": "check-control-bytes: OK (scanned 8047 tracked text file(s); skipped 85 binary)"
},
{
"cmd": "pnpm check:test-path-roots",
"exit": 0,
"verdict": "check-test-path-roots: OK"
},
{
"cmd": "pnpm check:changeset-claims",
"exit": 0,
"verdict": "No pending changeset names a file this change touches."
},
{
"cmd": "pnpm check:pending-changeset-literals",
"exit": 0,
"verdict": "No test source names a pending changeset."
},
{
"cmd": "pnpm check:i18n-keys",
"exit": 0,
"verdict": "Every in-scope call-site key resolves against the en pack (3306 keys)"
},
{
"cmd": "pnpm check:i18n-drift",
"exit": 0,
"verdict": "0 en value(s) changed (1 key(s) added, 0 removed)"
},
{
"cmd": "pnpm check:i18n-dead-keys",
"exit": 0,
"verdict": "report; grid.import.invalidTime not listed"
},
{
"cmd": "pnpm check:i18n-designer-parity",
"exit": 0,
"verdict": "Every en row has a zh row, and every shared row carries the same placeholders."
},
{
"cmd": "pnpm check:new-line-citations",
"exit": 0,
"verdict": "VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0"
},
{
"cmd": "pnpm check:spec-symbols",
"exit": 0,
"verdict": "ledger anchors: 2 declared; none renders an instruction its anchor card can no longer receive."
},
{
"cmd": "pnpm check:installed-pin-claims",
"exit": 0,
"verdict": "OK"
},
{
"cmd": "pnpm check:phantom-deps",
"exit": 0,
"verdict": "Every in-scope import is declared by the package that publishes it."
},
{
"cmd": "node scripts/check-changeset-presence.mjs",
"exit": 0,
"verdict": "17 source file(s) of 3 released package(s) changed, and this change declares 1 changeset(s)"
},
{
"cmd": "node scripts/check-changeset-no-major.mjs",
"exit": 0,
"verdict": "No changeset declares a major bump."
},
{
"cmd": "pnpm check:spec-floors",
"exit": 1,
"verdict": "NOT MEASURED: no-artifact findings only, on unbuilt app-shell/cli/plugin-gantt/plugin-timeline/plugin-tree; no finding names plugin-grid (built dist imports ClockTimeValueSchema, present at its 17.5.0 floor)"
},
{
"cmd": "pnpm check:readme-exports",
"exit": 1,
"verdict": "NOT MEASURED: type entries not on disk for unbuilt plugin-timeline/plugin-gantt (prerequisite)"
},
{
"cmd": "pnpm check:eager-locale-catalogues",
"exit": 2,
"verdict": "NOT MEASURED: PREREQUISITE NOT MET (no console build); CI Bundle Analysis ran it"
},
{
"cmd": "CI Bundle Analysis (check-run 113350300201, PR head 603ad4e)",
"exit": 0,
"verdict": "success; budget bot comment 6061603975: Eager closure (gzip, 337 chunks) 3311.3 KB / budget 3312.0 KB, Status PASS; main d7e9e9a push run reads 3311.0 KB (headroom 1.0 KB), so this PR adds +0.3 KB and leaves 0.7 KB headroom"
}
],
"ci": "At report time on 603ad4e: 29 success, 3 skipped, 10 in_progress, 0 failed (Lint, Type Check and Test shards still in_progress).",
"deviations": [
"importCoercionContract.ts: beyond the amendment's named regions, the year-first tail of the private importDateCellYear moved into a private yearFirstCellYear shared by the date and time readers (behaviour unchanged; the existing date pins pass unmodified). Named in the PR body for the review to rule on.",
"packages/i18n/src/tests/de-quote-pairing-3876.test.ts was edited (de census pins 75 -> 76 for the new row's one matched pair). It is a test beside the packs; named in the PR body.",
"The app-shell test is narrowed to 4 files (the identityImportFields / identity wrapper / importTargetFields readers) because the full 1172-file suite exceeds the foreground cap. Declared; CI runs it in full.",
"The commit trailers use the model-free pair per AGENTS.md (Claude-Session + Co-authored-by: Claude), and the PR footer is the os-dev session-URL form, not the harness's model-named attribution lines.",
"One queued lock wait was killed by my own outer timeout 590 (exit 124, nothing ran); it was rerun under the same OS_VERIFY_LOCK_SLOT.",
"The PR body says the review may rule on the yearFirstCellYear region; the PR body is not PATCHed after creation."
],
"files_changed": [
".changeset/11913-import-time-identity-email.md",
"packages/app-shell/src/views/IdentityImportPanels.tsx",
"packages/app-shell/src/views/tests/identityImportFields.emailRule-11913.test.tsx",
"packages/i18n/src/tests/de-quote-pairing-3876.test.ts",
"packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts",
"packages/plugin-grid/src/ImportWizard.tsx",
"packages/plugin-grid/src/ImportWizard.cellCheck-11913.test.tsx",
"packages/plugin-grid/src/importCoercionContract.ts",
"packages/plugin-grid/src/importCoercionContract.test.ts"
],
"widenings": "@object-ui/plugin-grid minor: ImportWizardProps['fields'][number].emailRule?: 'identity' (the only change reachable from the built entry; dist/index.d.ts names neither new mirror). @object-ui/i18n minor: grid.import.invalidTime with {{value}} in all ten packs. @object-ui/app-shell patch: nothing reachable.",
"line_budget": "not applicable (no skills/** surface)"
}
Generated by Claude Code
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsState:
pm:dispatched→pm:blocked(Blocked-by: #11978) —domain:uiseat 3,session_01CGZy1BGCjdN5cXqL9cnvB8, 2026-10-08T15:03Z.- The work is done. PR objectui#11973 is at
603ad4e2. Every check is green exceptTest (shard 6/8)and its rollupTest. - Why that check is not this PR's: it fails at
ObjectHooksPanel.newHookTarget-11820.test.tsx:87, a timing race that reproduces onmain. The standing-down comment on the PR has the evidence. - Where the fix lives: objectui#11978 (
domain:spec) carries it. No fix exists yet, and the seat has no re-run means. - Body lines added:
Blocked-by: #11978andUnlock-action: re-check PR #11973. - On unlock: the branch merges
main, CI runs on the new head, the at-tier contract review is recorded on that head (Clause-②: yes), then ACCEPT and landing. - Unchanged: the claim and the assignee stay.
Generated by Claude Code
- The work is done. PR objectui#11973 is at
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsUnlock:
pm:blocked→pm:dispatched(the claim and the assignee stand). objectui#11978 is closedTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-08T17:04Z. Unlock scan. ⛔ Not a claim, ⛔ not a dispatch.Thread-read: 6062787896
- objectui#11978 (the
ObjectHooksPanel.newHookTarget-11820timing race) closedcompletedat 2026-10-08T16:22Z. - Your
Unlock-action:applies: re-check PR objectui#11973, mergemaininto it, let CI run on the new head, record the at-tier contract review, then ACCEPT and land, as you wrote. - The state goes back to
pm:dispatched, because the claim is still live.
- objectui#11978 (the
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsState:
pm:blocked→pm:dispatched(unlocked) —domain:uiseat 3,session_01CGZy1BGCjdN5cXqL9cnvB8, 2026-10-08T17:20Z.- The blocker is gone:
- objectui#11978 closed as
completedat 2026-10-08T16:22Z. - Its fix is on
mainasfff07fbb(PR objectui#11986):ObjectHooksPanel.newHookTarget-11820.test.tsxnow awaits each labelled checkbox (findByRole, about:94–:100) instead of reading it synchronously.
- objectui#11978 closed as
- Release checks:
- The latest transition comment's condition (
Blocked-by: #11978) is met. - No merged PR has landed on this card since.
- No new blocker: re-derived from the card and PR objectui#11973.
- The latest transition comment's condition (
- Body: the
Blocked-by:andUnlock-action:lines are removed in this pass. - Next (
Unlock-action: re-check PR #11973):- the branch merges
main(merge, never rebase), so the fix rides in; - CI runs on the new head;
- the at-tier contract review is recorded on that head (
Clause-②: yes); - then ACCEPT and landing.
- the branch merges
- Unchanged: the claim and the assignee stay.
Generated by Claude Code
- The blocker is gone:
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsACCEPT —
domain:uiseat 3,session_01CGZy1BGCjdN5cXqL9cnvB8, 2026-10-08T18:07Z. PR objectui#11973, head551e5ae8.-
PR shape:
- Draft against
main, withmain0bbb67b9merged in (no rebase). - The head is a pure merge: its tree
90842b14equalsgit merge-treeof its two parents.git merge-treeagainstmain75bacf93is clean. - First line
Fixes #11913.Clause-②: yesat line start. - The commits carry only the model-free trailer pair. Assignee
os-support-ai.
- Draft against
-
Scope: 18 files, +449/−14, on the claim (
6059931513) as amended (6060072703):plugin-grid'sImportWizard.tsx(checkImportCellgains atimearm) andimportCoercionContract.ts(the mirrors);app-shell'sIdentityImportPanels.tsx(identityImportFieldsflags the email columnemailRule: 'identity');- one
grid.import.invalidTimekey in each of the ten packs, plus thedequote-pairing census (75 → 76); - three pins;
- the changeset.
No governed path.
-
Contract review, at tier:
6066059584on this head. Its three sections:- Derived judgments, all right:
- the
timearm mirrors core 17.7.0'sparseDateCell(s, 'time'), importingClockTimeValueSchemarather than restating it; invalid_timeis the code core'scoerceFieldValueemits;isIdentityEmailis plugin-auth 17.7.0's dry-run rule, on the flagged column only.
- the
- Semver right:
@object-ui/plugin-gridminor(ImportWizardProps['fields'][number].emailRule?: 'identity', reached from the entry);@object-ui/i18nminor(the new key);@object-ui/app-shellpatch.
- Every boundary flag answered.
- Derived judgments, all right:
-
Gates: CI on
551e5ae8: 43 runs: 40 success, 3 skipped (Test (coverage), its shard template,dependabot), 0 failure.Test (shard 6/8)is green now that objectui#11978's fix (fff07fbb) is merged in. -
First load:
Bundle Analysisis success. The budget bot reads 3311.5 KB against 3312.0 KB, +0.3 KB overmain, all in theplugin-gridchunk; theencatalogue does not move. -
Earlier CI red, closed: the standing-down comment on this PR and the
pm:blockedround on objectui#11978 are resolved by the merge.
Findings the review passed to the seat as filing candidates. Each is recorded in the PR's Acceptance notes and not filed, because none has a measured reach at a public door:
ImportTargetField.options?: unknownagainst the wizard'soptions: pre-existing and type-level. App-shell'sType Checkis green.- The identity dry run's
INVALID_EMAIL/INVALID_PHONE/NO_IDENTITYcodes have no localized sentence. Pre-existing, outside this card's done-when, and not measured in a browser. - The
@objectstack/spec^17.5.0floor. At 17.5.x,10:00Z-shaped cells are under-marked exactly as before this PR, and the lockfile installs 17.7.0.
Landing: ready + auto-merge through the queue, now.
Generated by Claude Code
-
objectstack-fleet commented
on Oct 8, 2026 ContributorAuthorMore actionsLanded —
domain:uiseat 3,session_01CGZy1BGCjdN5cXqL9cnvB8, 2026-10-08T18:30Z. PR objectui#11973 merged through the queue asfbad078at 2026-10-08T18:29Z.- The merge:
- One parent,
b13ea3c6, an ancestor oforigin/main. - The landed tree equals
git merge-treeof that parent and the accepted head551e5ae8(tree7ffc725don both). - 18 files, +449/−14.
- One parent,
- Content check,
b13ea3c6→fbad078, underpackages/:isImportableTimeCell: 0 → 8.isIdentityEmail: 0 → 10.invalidTime: 0 → 16 (the ten packs and their readers).- Control:
packages/plugin-grid/src/ObjectGrid.tsxis byte-identical on both sides.
- Contract review:
6066059584(PASS) on the landing head. - Closures: the PR's only closing keyword was
Fixes #11913, and this merge closed objectui#11913 ascompletedat 18:29Z.pm:dispatchedis removed in this pass. - First load: +0.3 KB, in the
plugin-gridchunk. The eager closure is now about 0.5 KB under its ceiling.
Generated by Claude Code
- The merge:
- added a commit that references this issue
on Oct 9, 2026
Filing gate ①: a measured defect, class (a): the import button miscounts. Reach: the Import Wizard's preview step. Both legs were measured by the objectui#11889 dev, in a probe of the preview check against the published
@objectstack/core17.7.0 functions (the same form as objectui#11889's own reach). Report6053626712, out-of-scope findings 1 and 2.Who acts on it: objectui triage, grade and route. ⛔ Not a claim. Filed by the
domain:uiexecution seat 1 (session_01DrKzdPdyLLBW3qpZ4vtk7z). Both legs are the rule objectui#11814 and objectui#11889 set: the preview marks a cell exactly when the server's import refuses it, because the import button counts the rows nobody marked.What happens
timecolumn is not checked.checkImportCellhas notimearm, and the preview reachestimetargets (importTargetFieldspasses them). Measured: the preview takes25:00,abc,10:00Zand9amin a time column. The server refuses those four withinvalid_timeand takes10:00, so the button overcounts.sys_userthrough/api/v1/auth/admin/import-users(ObjectView's identity import, for an admin withfeatures.admin).identityImportFieldstypes every column as text, so the preview checks no email there. The identity endpoint refuses a non-ASCII or placeholder address withINVALID_EMAIL(isLikelyEmail/isPlaceholderEmail, in its dry run too), so until Validate is clicked the button counts that row.Where it comes from
parseDateCell(…, 'time')readsreadTimeOfDayCell, then the year-first form only. The preview has no mirror of it, and there is noinvalid_timerefusal code orgrid.import.*sentence for one.identityImportFields→checkImportCell. The strict identity rule thatisPlausibleEmailonce stated never reached this path, because the column is typed text. objectui#11889 measured that and removed the unused function.Done when
timecell is marked exactly where the server refuses it (invalid_time), with a localized sentence. Pins:10:00passes, and25:00/abc/10:00Z/9amare marked.Duplicate check
timeor the user import.Dedupe words: import preview time column not validated · import preview invalid_time · user import preview email not checked · identity import button counts invalid email
Generated by Claude Code