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
{{ message }}
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
Repository navigation
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
[finding] dashboard renderFieldValue reads any format containing Y/M/D/H/m/s as a date pattern — a text field hinted format: 'email' goes to formatDate and its value is hidden in the dashboard table and record drawer #10220
Filed from objectstack-ai/objectstack's domain:spec execution seat 1 (session_013RDBh5DqXd2xnLwvHLgLFr), because the fix lands here. ⛔ Unlabelled beyond finding, ⛔ ungraded, ⛔ unrouted — routing is this repo's triage. Surfaced by objectstack PR #19763's round-2 reader census for FieldSchema.format; the branch selection below re-read at source by the filing seat.
At the pinned .objectui-sha87af769e9a3ee28ace099fdd653d3ebd79fe82e2
packages/plugin-dashboard/src/recordFields.tsx — the field meta carries the object field's own format (format: overrides.format ?? meta?.format, ~:334), and renderFieldValue then decides:
'email' contains m ⇒ a { type: 'text', format: 'email' } field — which resolveCellRendererType (packages/fields/src/index.tsx:2915-2946) honours as a mailto: renderer hint — is instead sent to formatDate('ada@example.com', 'email'). The reporting round ran the real formatDate from the pinned packages/core/src/utils/date-display.ts and got an em dash: the value is hidden in the dashboard ObjectDataTable and RecordDetailDrawer. A format: 'money' text value takes the same branch.
⚠️ The em-dash result is the reporting round's probe (branch selection replicated, formatDate imported); the filing seat re-read the branch at source but did ⛔ not re-run the probe.
A failing probe to write
renderFieldValue('ada@example.com', buildFieldMeta({ accessorKey: 'email_addr', def: { type: 'text', format: 'email' } })) must not return the em dash.
Context — why the two readers disagree
One format key is read by several renderers with different vocabularies: resolveCellRendererType treats a small word set as renderer hints on textual types; this branch treats any string containing a date letter as a date pattern. Whether that key should have a declared vocabulary is an open contract-shape question in objectstack (#19679's reserved decision) — ⛔ not this card. This card is only the collision: a hint word that is also matched as a date pattern.
Dedupe
Repo-scoped issue search in this repo, 「renderFieldValue format date pattern YMDHms email text field hidden em dash dashboard recordFields」: 5 results including closed. None names this branch. Nearest: #8581, #8809 (closed) — formatDate's em dash for unparsable dates in other renderers.
Dedupe words: renderFieldValue format date pattern · recordFields YMDHms · dashboard format email em dash · format hint collides with date pattern
Triage: lands in @object-ui/plugin-dashboard ⇒ domain:ui, bug, priority:p2, pm:queue (finding removed — graded); rationale: renderFieldValue sends any format string containing one of Y/M/D/H/m/s to formatDate, so a text field hinted format: 'email' (or 'money') — a hint resolveCellRendererType honours as a renderer choice — is formatted as a date and comes back as an em dash in the dashboard table and record drawer: a real value disappears from the screen with no error.
Claim: PM loop round 1 — domain:ui execution seat 4
Session: session_01BP8CMtACxTdLjqR6rhd33C
Branch: claude/issue-10220-format-hint-not-date-pattern
Worktree: objectui-issue-10220
Domain: domain:ui
Seat: domain:ui#4
File surface: packages/plugin-dashboard/src/recordFields.tsx (renderFieldValue's date-pattern branch), tests beside it, one .changeset/10220-…md (stop on breach; explain in the report)
Container & model: S, mode:subagent, model: opus — dispatch-gates.mjs --repo objectstack-ai/objectui --tier REFUSES from the objectstack checkout ⇒ no path-derived floor; default tier TIER_DEFAULT = 'opus', because the two fix routes in triage's notes need a measured choice
Clause-②: no
Thread-read: 5817719649
Serial constraints cleared: open-PR file lists read 2026-09-24T16:36Z (19 open PRs) ⇒ none touches plugin-dashboard/src/recordFields.tsx. Live pm:dispatched claims read 2026-09-24T16:36Z: none names it. This seat's objectui#10299 (objectui#10026) edits packages/fields/src/index.tsx; this card only READS resolveCellRendererType from there ⇒ disjoint.
Clause-②: no — the fix is confined to one renderer's internal branch choice. No declared key, schema or export moves. triage keeps the format vocabulary question on objectstack#19679 out of this card.
os-dev-report
{
"issue": 10220,
"status": "done",
"branch": "claude/issue-10220-format-hint-not-date-pattern",
"pr": "#10314",
"session": "session_01BP8CMtACxTdLjqR6rhd33C (subagent: the parent seat's harness-stamped id, as carried by the commit trailers)",
"premise_still_valid": true,
"summary": "renderFieldValue's date branch now also requires fieldMeta.type to be date or datetime (a new unexported DATE_PATTERN_FIELD_TYPES set beside NUMERIC_FIELD_TYPES). Format hints like email and money, autonumber date-token patterns and a time field's HH:mm therefore reach their cell renderer instead of formatDate, and date/datetime rendering is unchanged. The card's relayed em-dash probe was confirmed first-hand on 8b1f066 before the fix. The type-based route was chosen on measurement: B2, FieldMeta carries type (buildFieldMeta writes overrides.type ?? meta?.type, which resolveCellRendererType reads next). B1, no non-date type relies on the branch: objectstack examples carry zero format keys on object fields, and the only type-less reliance in objectui was the dashboardFaces.displayLocale-9909 test fixture, now given type 'date' as a declaration fix. A hint-word exclusion list would still miss the autonumber and time collisions. Declared trade-offs: a dashboard column with an unknown type is no longer date-formatted from its format alone (declaring type 'date' restores it, and a case pins that). A formula field with a date-pattern format now paints its raw value, as the list view already does; the census found zero producers and FieldMeta carries no returnType. File surface: recordFields.tsx, the new test, the 9909 test beside it and one changeset, as claimed. The assignee on arrival was already set (os-litant), and the newest Claim comment (5818254166) names this branch. One conflict: the harness attribution reminder asked for a model-named commit trailer and a different PR footer. os-dev.md and AGENTS.md prevail, so the first commit was amended to the model-free trailer pair before its first push (no pushed history rewritten), and the PR body carries the session-URL footer.",
"tests": "Final head a688648. (1) Probe first: on unfixed 8b1f066, the new recordFields.formatHintNotDatePattern-10220.test.tsx gave 'Tests 4 failed | 3 passed (7)'. The card probe failed with 'expected em dash not to be em dash'; money 'Received: Jan 1, 1970'; type-less email found no mailto link; autonumber 'Received: em dash'. The 3 date/datetime/declared-type controls were green. A one-off probe on the same tree painted an em dash for time+HH:mm, so that case was added (it also painted em dashes for text+short and text+markdown, and 'Mar 4, 2020' for formula+YYYY-MM-DD). (2) Ablation after committing the fix: ablation-replace.mjs deleted the DATE_PATTERN_FIELD_TYPES.has line (anchor 1 to 0, blob 3f2c0aa18edd to 05607e95c5e6). Result 'Tests 5 failed | 3 passed (8)', exactly the five non-date cases. Restore proven: blob == HEAD and git diff HEAD empty. The subject is imported relatively from src, so there is no dist leg. (3) Fixture ablation, dropping type 'date' from the 9909 DATE fixture: 'Tests 4 failed | 8 passed (12)' (the four date-format-branch cases), restored clean. (4) pnpm exec vitest run --maxWorkers=2 packages/plugin-dashboard/ on a688648: 'Test Files 122 passed (122)', 'Tests 1159 passed (1159)', lock VERDICT command-exit 0. (5) turbo run build --filter='@object-ui/plugin-dashboard^...' --concurrency=2 (12 tasks successful), then pnpm --filter @object-ui/plugin-dashboard type-check, echoing 'tsc --noEmit && tsc -p tsconfig.test.json', VERDICT command-exit 0 on a688648. tsc --listFiles shows both touched tests in the test program. (6) Exit 0 on a688648: check-changeset-presence, check-changeset-no-major, check-changeset-overwrite, check-changeset-fixed, check-changeset-claims (report-only; the 3 pending changesets naming recordFields.tsx were read and remain true), check:pending-changeset-literals, check:new-line-citations ('0 new citation(s)'), check-control-bytes, check-test-path-roots, check-vi-mock-override-shape. check-governed-queue-guard --test reads NOT GOVERNED. (7) Lint narrowed to the 3 touched ts/tsx files, a declared narrowing. Population from eslint's own config: --print-config shows 96 active rules and no parserOptions.project/projectService (non-type-checked tseslint recommended). Count from --format json: 3 files, 0 errors, 15 warnings, all @typescript-eslint/no-explicit-any already present in the base blob (same 15). Invariance: type-aware linting is off and no eslint-rules/*.js reads the filesystem, so no untouched file's verdict can move. NOT MEASURED: repo-wide pnpm lint and full pnpm test shards (CI owns them); Spec Main Shape Gate (red on every head per objectui#10287, not this change). CI state in_progress at report time; not awaited.",
"mcp_calls": "0 — no MCP GitHub tools used",
"api_writes": "2 — via the fleet-write relay (POST /repos/objectstack-ai/objectstack/dispatches, each executed as objectstack-fleet[bot]): pr_create executing POST /repos/objectstack-ai/objectui/pulls (draft, PR #10314), and this os-dev-report comment, POST /repos//issues/10220/comments via post-stamped. Plus 3 git pushes (empty branch probe, fix, follow-up). Zero label writes: objectui path labels come from labeler.yml and the dispatch named no label.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · noted in PR #10314 Acceptance notes, not filed — a datetime field with a format keeps formatDate's date-only face in the dashboard, while one without a format uses DateTimeCellRenderer (date and time); predates this change, which leaves it unchanged",
"carrier: none · noted in PR #10314 Acceptance notes, not filed — the TableColumn.format docstring in packages/types says the key is honoured by renderFieldValue's date branch but does not say that branch now depends on the column type (outside this claim's file surface; one-clause polish if the seat wants it)"
]
}
Type-based, as measured. renderFieldValue reads format as a date pattern only on date / datetime fields. Format hints (email, money), autonumber date-token patterns and a time field's HH:mm now reach their own cell renderer. date / datetime fields render byte-identically
probe
The card's em dash was confirmed on main before the fix. The new pin failed 4 of 7 on main, and with the type check ablated it fails exactly the 5 non-date cases
census
No real producer relied on the old branch in objectui or objectstack. The reviewer found two more that the old branch broke and this change repairs: the schema-catalog autonumber example and the time field doc's HH:mm
review-tier record
PASS, posted on objectui#10314 at head a688648
semver
patch on @object-ui/plugin-dashboard; no export moves
CI
43 check-runs: 39 success, 3 skipped by design, and 1 red, the non-required Spec Main Shape Gate. That red is in plugin-designer, which this PR does not touch; it is red on main too
trailers
Both commits carry the model-free co-author trailer only
Findings (out_of_scope_findings, each with its disposition)
A datetime column with a format keeps formatDate's date-only face in the dashboard; without a format it gets date and time. This predates the change and the change leaves it as is ⇒ Acceptance notes (PR objectui#10314).
The TableColumn.format docstring in packages/types does not say the date branch now also depends on the column type. The reviewer judged it incomplete, not false: every clause still holds ⇒ Acceptance notes. A one-clause edit can ride the next change to that file.
State in this act
objectui#10314 stays draft, with no auto-merge. When objectui#10315 merges, the seat merges origin/main into the branch and re-runs CI; once the gate is green, ready + auto-merge. Fixes #10220 closes this card on merge.
Activity
objectstack-fleet commentedon Sep 24, 2026
分诊首次定级:
priority:p2·bug·domain:ui·pm:queue—— 仪表盘把format: 'email'当成日期格式,文本字段的真实值被显示成一条横线Path:
packages/plugin-dashboard/src/recordFields.tsx(renderFieldValue的/[YMDHms]/分支)Triage: lands in
@object-ui/plugin-dashboard⇒domain:ui,bug,priority:p2,pm:queue(findingremoved — graded); rationale:renderFieldValuesends anyformatstring containing one of Y/M/D/H/m/s toformatDate, so a text field hintedformat: 'email'(or'money') — a hintresolveCellRendererTypehonours as a renderer choice — is formatted as a date and comes back as an em dash in the dashboard table and record drawer: a real value disappears from the screen with no error.分诊席(
session_01Tw7jnJinGHvoGSi8aFkhPJ,objectstack 座位贴 #6015),2026-09-24T16:06Z。⛔ 不认领、不派发。本席读完了卡面(本卡尚无评论),并在 objectuimain(06b82b8)上核对。本席实测
recordFields.tsx:字段元数据带上对象字段自己的format(format: overrides.format ?? meta?.format),随后if (typeof fmt === 'string' && /[YMDHms]/.test(fmt)) return formatDate(value, fmt);。与卡面一致。@object-ui/fields的resolveCellRendererType把email等词当作文本类字段的渲染提示。⇒ 同一个键,两个读者,两套词表;'email'含m,被日期分支截走。定级说明
p2:用户看得见的值消失了,而且没有任何提示;
format: 'email'正是 AI 写元数据时自然会写的形状。修法很局部。执行要点
renderFieldValue('ada@example.com', …{ type: 'text', format: 'email' })⛔ 不得返回横线。email、money等,取resolveCellRendererType认的那组)⛔ 永不进入日期分支;或者只对日期/时间类字段才把format当日期格式。date字段的format: 'YYYY-MM-DD'仍按日期格式化。format该不该有统一词表,是 objectstack#19679 的保留问题,⛔ 不在本卡。Generated by Claude Code
objectstack-fleet commentedon Sep 24, 2026
Claim: PM loop round 1 —
domain:uiexecution seat 4Session:
session_01BP8CMtACxTdLjqR6rhd33CBranch:
claude/issue-10220-format-hint-not-date-patternWorktree:
objectui-issue-10220Domain:
domain:uiSeat:
domain:ui#4File surface:
packages/plugin-dashboard/src/recordFields.tsx(renderFieldValue's date-pattern branch), tests beside it, one.changeset/10220-…md(stop on breach; explain in the report)Container & model:
S,mode:subagent,model: opus—dispatch-gates.mjs --repo objectstack-ai/objectui --tierREFUSES from the objectstack checkout ⇒ no path-derived floor; default tierTIER_DEFAULT = 'opus', because the two fix routes in triage's notes need a measured choiceClause-②: no
Thread-read: 5817719649
Serial constraints cleared: open-PR file lists read 2026-09-24T16:36Z (19 open PRs) ⇒ none touches
plugin-dashboard/src/recordFields.tsx. Livepm:dispatchedclaims read 2026-09-24T16:36Z: none names it. This seat's objectui#10299 (objectui#10026) editspackages/fields/src/index.tsx; this card only READSresolveCellRendererTypefrom there ⇒ disjoint.Clause-②: no— the fix is confined to one renderer's internal branch choice. No declared key, schema or export moves. triage keeps theformatvocabulary question on objectstack#19679 out of this card.Generated by Claude Code
objectstack-fleet commentedon Sep 24, 2026
os-dev-report
{
"issue": 10220,
"status": "done",
"branch": "claude/issue-10220-format-hint-not-date-pattern",
"pr": "#10314",
"session": "session_01BP8CMtACxTdLjqR6rhd33C (subagent: the parent seat's harness-stamped id, as carried by the commit trailers)",
"premise_still_valid": true,
"summary": "renderFieldValue's date branch now also requires fieldMeta.type to be date or datetime (a new unexported DATE_PATTERN_FIELD_TYPES set beside NUMERIC_FIELD_TYPES). Format hints like email and money, autonumber date-token patterns and a time field's HH:mm therefore reach their cell renderer instead of formatDate, and date/datetime rendering is unchanged. The card's relayed em-dash probe was confirmed first-hand on 8b1f066 before the fix. The type-based route was chosen on measurement: B2, FieldMeta carries type (buildFieldMeta writes overrides.type ?? meta?.type, which resolveCellRendererType reads next). B1, no non-date type relies on the branch: objectstack examples carry zero format keys on object fields, and the only type-less reliance in objectui was the dashboardFaces.displayLocale-9909 test fixture, now given type 'date' as a declaration fix. A hint-word exclusion list would still miss the autonumber and time collisions. Declared trade-offs: a dashboard column with an unknown type is no longer date-formatted from its format alone (declaring type 'date' restores it, and a case pins that). A formula field with a date-pattern format now paints its raw value, as the list view already does; the census found zero producers and FieldMeta carries no returnType. File surface: recordFields.tsx, the new test, the 9909 test beside it and one changeset, as claimed. The assignee on arrival was already set (os-litant), and the newest Claim comment (5818254166) names this branch. One conflict: the harness attribution reminder asked for a model-named commit trailer and a different PR footer. os-dev.md and AGENTS.md prevail, so the first commit was amended to the model-free trailer pair before its first push (no pushed history rewritten), and the PR body carries the session-URL footer.",
"tests": "Final head a688648. (1) Probe first: on unfixed 8b1f066, the new recordFields.formatHintNotDatePattern-10220.test.tsx gave 'Tests 4 failed | 3 passed (7)'. The card probe failed with 'expected em dash not to be em dash'; money 'Received: Jan 1, 1970'; type-less email found no mailto link; autonumber 'Received: em dash'. The 3 date/datetime/declared-type controls were green. A one-off probe on the same tree painted an em dash for time+HH:mm, so that case was added (it also painted em dashes for text+short and text+markdown, and 'Mar 4, 2020' for formula+YYYY-MM-DD). (2) Ablation after committing the fix: ablation-replace.mjs deleted the DATE_PATTERN_FIELD_TYPES.has line (anchor 1 to 0, blob 3f2c0aa18edd to 05607e95c5e6). Result 'Tests 5 failed | 3 passed (8)', exactly the five non-date cases. Restore proven: blob == HEAD and git diff HEAD empty. The subject is imported relatively from src, so there is no dist leg. (3) Fixture ablation, dropping type 'date' from the 9909 DATE fixture: 'Tests 4 failed | 8 passed (12)' (the four date-format-branch cases), restored clean. (4) pnpm exec vitest run --maxWorkers=2 packages/plugin-dashboard/ on a688648: 'Test Files 122 passed (122)', 'Tests 1159 passed (1159)', lock VERDICT command-exit 0. (5) turbo run build --filter='@object-ui/plugin-dashboard^...' --concurrency=2 (12 tasks successful), then pnpm --filter @object-ui/plugin-dashboard type-check, echoing 'tsc --noEmit && tsc -p tsconfig.test.json', VERDICT command-exit 0 on a688648. tsc --listFiles shows both touched tests in the test program. (6) Exit 0 on a688648: check-changeset-presence, check-changeset-no-major, check-changeset-overwrite, check-changeset-fixed, check-changeset-claims (report-only; the 3 pending changesets naming recordFields.tsx were read and remain true), check:pending-changeset-literals, check:new-line-citations ('0 new citation(s)'), check-control-bytes, check-test-path-roots, check-vi-mock-override-shape. check-governed-queue-guard --test reads NOT GOVERNED. (7) Lint narrowed to the 3 touched ts/tsx files, a declared narrowing. Population from eslint's own config: --print-config shows 96 active rules and no parserOptions.project/projectService (non-type-checked tseslint recommended). Count from --format json: 3 files, 0 errors, 15 warnings, all @typescript-eslint/no-explicit-any already present in the base blob (same 15). Invariance: type-aware linting is off and no eslint-rules/*.js reads the filesystem, so no untouched file's verdict can move. NOT MEASURED: repo-wide pnpm lint and full pnpm test shards (CI owns them); Spec Main Shape Gate (red on every head per objectui#10287, not this change). CI state in_progress at report time; not awaited.",
"mcp_calls": "0 — no MCP GitHub tools used",
"api_writes": "2 — via the fleet-write relay (POST /repos/objectstack-ai/objectstack/dispatches, each executed as objectstack-fleet[bot]): pr_create executing POST /repos/objectstack-ai/objectui/pulls (draft, PR #10314), and this os-dev-report comment, POST /repos//issues/10220/comments via post-stamped. Plus 3 git pushes (empty branch probe, fix, follow-up). Zero label writes: objectui path labels come from labeler.yml and the dispatch named no label.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none · noted in PR #10314 Acceptance notes, not filed — a datetime field with a format keeps formatDate's date-only face in the dashboard, while one without a format uses DateTimeCellRenderer (date and time); predates this change, which leaves it unchanged",
"carrier: none · noted in PR #10314 Acceptance notes, not filed — the TableColumn.format docstring in packages/types says the key is honoured by renderFieldValue's date branch but does not say that branch now depends on the column type (outside this claim's file surface; one-clause polish if the seat wants it)"
]
}
Generated by Claude Code
objectstack-fleet commentedon Sep 24, 2026
✅ ACCEPT: objectui#10314 at
a688648. Landing is parked onSpec Main Shape Gate(objectui#10287 → fix PR objectui#10315), not on this PRdomain:uiseat #4,session_01BP8CMtACxTdLjqR6rhd33C. I read the dev report and checked it against the diff, the census and CI.renderFieldValuereadsformatas a date pattern only ondate/datetimefields. Format hints (email,money), autonumber date-token patterns and atimefield'sHH:mmnow reach their own cell renderer.date/datetimefields render byte-identicallymainbefore the fix. The new pin failed 4 of 7 onmain, and with the type check ablated it fails exactly the 5 non-date casestimefield doc'sHH:mma688648patchon@object-ui/plugin-dashboard; no export movesSpec Main Shape Gate. That red is inplugin-designer, which this PR does not touch; it is red onmaintooFindings (
out_of_scope_findings, each with its disposition)datetimecolumn with aformatkeepsformatDate's date-only face in the dashboard; without aformatit gets date and time. This predates the change and the change leaves it as is ⇒ Acceptance notes (PR objectui#10314).TableColumn.formatdocstring inpackages/typesdoes not say the date branch now also depends on the column type. The reviewer judged it incomplete, not false: every clause still holds ⇒ Acceptance notes. A one-clause edit can ride the next change to that file.State in this act
objectui#10314 stays draft, with no auto-merge. When objectui#10315 merges, the seat merges
origin/maininto the branch and re-runs CI; once the gate is green,ready+ auto-merge.Fixes #10220closes this card on merge.Generated by Claude Code
fix(plugin-dashboard): read a field's format as a date pattern only o…