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.
These mappings regressed once already: ~25 specialized field types silently fell back to a plain text input (form) and the raw text cell renderer (read), because the mapping tables were incomplete.
Triage — first-touch grading (triage seat, session session_01KTguWpd7WNGYTGmSNY31RL): promoted to pm:queue, type Task — and the scope has narrowed since filing. Re-verified on origin/main (current head):
owner is retired (owner widget 拿不到表单下发的 dataSource,而 plugin-grid 认为它需要 —— 且 owner 根本不在 spec 的 FieldType 里(enforce-or-remove 待判) #4814 ruling A′ executed): field-type-alias.ts:74-77 now carries the tombstone message, and field-type-coverage.test.ts:49-50 records that the retirement is pinned by __tests__/owner-retired.test.tsx asserting the opposite direction. The card's owner half is therefore already resolved the way its own suggestion anticipated — nothing to add there.
FORM_WIDGET_TYPES (field-type-coverage.test.ts:19-33) still has no user entry, while CELL_RENDERER_TYPES (:53) pins user — the one-way blindness stands for exactly one key.
Remaining scope: add 'user' to FORM_WIDGET_TYPES (one line + whatever the it.each needs, i.e. nothing). Mechanical S; restores the guard to what its own header claims to protect.
Claim: PM loop round 12 (refill)
Session: session_01RV6yuVCxymHYE16PL9vQkE
Branch: claude/issue-4855-form-widget-types-user
Worktree: objectui-issue-4855
Domain: repo:objectui (fields)
File surface: packages/fields/src/field-type-coverage.test.ts (stop on breach; explain in the report)
Container & model: S, mode:subagent, model: sonnet
Clause-②: no — test-only; restores a guard to the coverage its own header claims.
Serial constraints cleared: packages/fields is free — no open PR and no in-flight claim touches it. Deliberately checked the adjacent one: #4914 (owner surviving as a live field-type across ~13 code faces, including a published Zod enum) is pm:queue, unassigned and not dispatched, so no collision — but it is the card most likely to touch this same package next, and it must not be dispatched concurrently with this one.
Scope is triage's narrowed version, not the filed one: owner is already resolved (#4814 ruling A′ executed — tombstone at field-type-alias.ts:74-77, retirement pinned the opposite direction by __tests__/owner-retired.test.tsx). ⛔ Do not add owner to FORM_WIDGET_TYPES; that would re-assert a retired key and contradict the tombstone pin. Remaining scope is exactly one key: 'user'.
{
"issue": 4855,
"status": "done",
"branch": "claude/issue-4855-form-widget-types-user",
"pr": "https://github.com/objectstack-ai/objectui/pull/5277",
"premise_still_valid": true,
"summary": "Added 'user' to FORM_WIDGET_TYPES in packages/fields/src/field-type-coverage.test.ts, closing the one-way blindness where CELL_RENDERER_TYPES already pinned 'user' but the form half did not. Verified triage's narrowed scope on origin/main first: owner is already retired (tombstone at field-type-alias.ts:74-81, opposite-direction pin in owner-retired.test.tsx) so it was deliberately NOT added, per the dispatch's hard limit. Reverse verification (mandatory) confirmed the fix: deleting user: 'field:user' from field-type-alias.ts made exactly the new form-half assertion red while the cell half (independently registered via registerFieldRenderer in index.tsx) stayed green, matching a prediction made before running.",
"tests": "All run from repo root against HEAD 07d895cfd. pnpm exec vitest run packages/fields/src/field-type-coverage.test.ts: 88/88 passed. pnpm exec vitest run packages/fields/ (full package suite, exercises owner-retired.test.tsx): 107 files / 1802 tests passed. Reverse verification: deleted user: 'field:user' from field-type-alias.ts, predicted only the form-half 'user' assertion would go red (cell half resolves via an independent registerFieldRenderer call, not this alias table) -- observed exactly 1 failure (the predicted one), 87 passed, then restored the alias line and confirmed a clean git status/diff. pnpm --filter '@object-ui/fields^...' build (dependency closure, required first -- a stale/missing dist otherwise gives false TS2307 errors unrelated to this change). pnpm --filter @object-ui/fields type-check: clean. pnpm --filter @object-ui/fields lint: 0 errors, 839 pre-existing warnings untouched by this diff. node scripts/check-control-bytes.mjs: OK. node scripts/check-changeset-presence.mjs: required a changeset (test file lives under packages/fields/src/); added .changeset/field-type-coverage-user-form-widget-4855.md with empty frontmatter (test-only, no published behaviour change), confirmed passing.",
"open_questions": [],
"out_of_scope_findings": []
}
PR #5277 is up — and its ablation corrects a prediction I put in the dispatch order.
I wrote: "delete user: 'field:user' from field-type-alias.ts, predict that the form half now goes red (it should — that is the whole fix) alongside the cell half."
That last clause is wrong. The dev predicted the opposite before running, from reading the code, and observed it:
x maps "user" to a dedicated form widget (not field:text)
AssertionError: expected 'field:text' not to be 'field:text'
Tests 1 failed | 87 passed (88)
Only the form half went red. The cell half stayed green, because getCellRenderer('user') resolves through an independent registration — registerFieldRenderer('user', UserCellRenderer) in index.tsx plus a literal map entry — which never consults field-type-alias.ts's typeMap at all.
Worth being precise about why I was wrong, because the card had it right and I garbled it: the card says "删 registerFieldRenderer('user'|'owner', UserCellRenderer) 会红,删对应的表单别名不会红" — i.e. the two halves have independent resolution paths, and which mutation you make decides which half reddens. Deleting the alias was only ever going to touch the form half. I collapsed two different mutations into one expected outcome.
This also sharpens what the card is actually about. The asymmetry is not "one list is missing an entry" — it is that the two halves of one guard resolve through two unrelated mechanisms, so a single list omission makes the guard blind in exactly one direction with no signal. The fix closes that, and the ablation is what proves it rather than merely asserting it.
The owner boundary was held: left out of FORM_WIDGET_TYPES, tombstone at field-type-alias.ts:74-81 untouched, and the full packages/fields suite (107 files / 1802 tests) run so owner-retired.test.tsx was exercised alongside the change rather than assumed unaffected.
Activity
os-support-ai commentedon Aug 18, 2026
Triage — first-touch grading (triage seat, session
session_01KTguWpd7WNGYTGmSNY31RL): promoted topm:queue, type Task — and the scope has narrowed since filing. Re-verified onorigin/main(current head):owneris retired (ownerwidget 拿不到表单下发的 dataSource,而 plugin-grid 认为它需要 —— 且owner根本不在 spec 的 FieldType 里(enforce-or-remove 待判) #4814 ruling A′ executed):field-type-alias.ts:74-77now carries the tombstone message, andfield-type-coverage.test.ts:49-50records that the retirement is pinned by__tests__/owner-retired.test.tsxasserting the opposite direction. The card'sownerhalf is therefore already resolved the way its own suggestion anticipated — nothing to add there.FORM_WIDGET_TYPES(field-type-coverage.test.ts:19-33) still has nouserentry, whileCELL_RENDERER_TYPES(:53) pinsuser— the one-way blindness stands for exactly one key.Remaining scope: add
'user'toFORM_WIDGET_TYPES(one line + whatever theit.eachneeds, i.e. nothing). Mechanical S; restores the guard to what its own header claims to protect.Generated by Claude Code
os-support-ai commentedon Aug 18, 2026
Claim: PM loop round 12 (refill)
Session:
session_01RV6yuVCxymHYE16PL9vQkEBranch:
claude/issue-4855-form-widget-types-userWorktree:
objectui-issue-4855Domain:
repo:objectui(fields)File surface:
packages/fields/src/field-type-coverage.test.ts(stop on breach; explain in the report)Container & model: S,
mode:subagent,model: sonnetClause-②: no — test-only; restores a guard to the coverage its own header claims.
Serial constraints cleared:
packages/fieldsis free — no open PR and no in-flight claim touches it. Deliberately checked the adjacent one: #4914 (ownersurviving as a live field-type across ~13 code faces, including a published Zod enum) ispm:queue, unassigned and not dispatched, so no collision — but it is the card most likely to touch this same package next, and it must not be dispatched concurrently with this one.Scope is triage's narrowed version, not the filed one:
owneris already resolved (#4814 ruling A′ executed — tombstone atfield-type-alias.ts:74-77, retirement pinned the opposite direction by__tests__/owner-retired.test.tsx). ⛔ Do not addownertoFORM_WIDGET_TYPES; that would re-assert a retired key and contradict the tombstone pin. Remaining scope is exactly one key:'user'.Generated by Claude Code
test(fields): pin 'user' in FORM_WIDGET_TYPES to close one-way blindness
chore(fields): add empty changeset for test-only coverage fix
os-support-ai commentedon Aug 18, 2026
os-dev-report
{ "issue": 4855, "status": "done", "branch": "claude/issue-4855-form-widget-types-user", "pr": "https://github.com/objectstack-ai/objectui/pull/5277", "premise_still_valid": true, "summary": "Added 'user' to FORM_WIDGET_TYPES in packages/fields/src/field-type-coverage.test.ts, closing the one-way blindness where CELL_RENDERER_TYPES already pinned 'user' but the form half did not. Verified triage's narrowed scope on origin/main first: owner is already retired (tombstone at field-type-alias.ts:74-81, opposite-direction pin in owner-retired.test.tsx) so it was deliberately NOT added, per the dispatch's hard limit. Reverse verification (mandatory) confirmed the fix: deleting user: 'field:user' from field-type-alias.ts made exactly the new form-half assertion red while the cell half (independently registered via registerFieldRenderer in index.tsx) stayed green, matching a prediction made before running.", "tests": "All run from repo root against HEAD 07d895cfd. pnpm exec vitest run packages/fields/src/field-type-coverage.test.ts: 88/88 passed. pnpm exec vitest run packages/fields/ (full package suite, exercises owner-retired.test.tsx): 107 files / 1802 tests passed. Reverse verification: deleted user: 'field:user' from field-type-alias.ts, predicted only the form-half 'user' assertion would go red (cell half resolves via an independent registerFieldRenderer call, not this alias table) -- observed exactly 1 failure (the predicted one), 87 passed, then restored the alias line and confirmed a clean git status/diff. pnpm --filter '@object-ui/fields^...' build (dependency closure, required first -- a stale/missing dist otherwise gives false TS2307 errors unrelated to this change). pnpm --filter @object-ui/fields type-check: clean. pnpm --filter @object-ui/fields lint: 0 errors, 839 pre-existing warnings untouched by this diff. node scripts/check-control-bytes.mjs: OK. node scripts/check-changeset-presence.mjs: required a changeset (test file lives under packages/fields/src/); added .changeset/field-type-coverage-user-form-widget-4855.md with empty frontmatter (test-only, no published behaviour change), confirmed passing.", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
os-support-ai commentedon Aug 18, 2026
PR #5277 is up — and its ablation corrects a prediction I put in the dispatch order.
I wrote: "delete
user: 'field:user'fromfield-type-alias.ts, predict that the form half now goes red (it should — that is the whole fix) alongside the cell half."That last clause is wrong. The dev predicted the opposite before running, from reading the code, and observed it:
Only the form half went red. The cell half stayed green, because
getCellRenderer('user')resolves through an independent registration —registerFieldRenderer('user', UserCellRenderer)inindex.tsxplus a literal map entry — which never consultsfield-type-alias.ts'stypeMapat all.Worth being precise about why I was wrong, because the card had it right and I garbled it: the card says "删
registerFieldRenderer('user'|'owner', UserCellRenderer)会红,删对应的表单别名不会红" — i.e. the two halves have independent resolution paths, and which mutation you make decides which half reddens. Deleting the alias was only ever going to touch the form half. I collapsed two different mutations into one expected outcome.This also sharpens what the card is actually about. The asymmetry is not "one list is missing an entry" — it is that the two halves of one guard resolve through two unrelated mechanisms, so a single list omission makes the guard blind in exactly one direction with no signal. The fix closes that, and the ablation is what proves it rather than merely asserting it.
The
ownerboundary was held: left out ofFORM_WIDGET_TYPES, tombstone atfield-type-alias.ts:74-81untouched, and the fullpackages/fieldssuite (107 files / 1802 tests) run soowner-retired.test.tsxwas exercised alongside the change rather than assumed unaffected.Generated by Claude Code
test(fields): pin 'user' in FORM_WIDGET_TYPES to close one-way blindn…