Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

finding(plugin-map/plugin-gantt): the registrations' designer-facing inputs still declare objectName required while the renderers read three record sources #7470

Closed

Description

@os-project-manager

Ruled: 5809231477 · letter align (objectName not required on the designer face) · 2026-09-24T06:52Z

Found while implementing objectui#6939 group 6 (object-map + object-gantt), measured on origin/main d88e20f55. Out of that group's ruled scope (the zod mirrors and their TypeScript twins), so it is filed rather than swept in.

Measured

Both plugin registrations declare objectName as a REQUIRED designer input, on both of their registered keys:

  • packages/plugin-map/src/index.tsx:67 and :77 (object-map, map): { name: 'objectName', type: 'string', label: 'Object Name', required: true }
  • packages/plugin-gantt/src/index.tsx:107 and :117 (object-gantt, gantt): the same line

Both renderers read their records from one of THREE keys, in this order — getDataConfig in plugin-map/src/ObjectMap.tsx and plugin-gantt/src/ObjectGantt.tsx: data, then staticData, then objectName. A block authored on staticData or data never reads objectName (six catalog entries do exactly that and render). So the designer face says objectName is required and the renderer does not: the same declared versus enforced disagreement objectui#6939 measured on the zod mirrors, one declaration face over. The mirrors are repaired by the group-6 PR (objectName optional behind a refinement that requires one of the three); the registrations were not part of that ruling and still say the old thing.

packages/plugin-gantt/README.md:133 restates the registration ("Both keys declare the same two inputs: objectName (required) and the gantt configuration object"), so it moves with whatever the registration decides.

Not decided here

Whether an inputs list can express "one of three" at all (the registry's input declaration is a flat list with a boolean required), or whether data / staticData should be declared as inputs beside objectName with none of the three marked required, is a shape question for the registry's declaration vocabulary. This card records the disagreement and does not pick a repair.

Related: objectui#6939 (the mirror repair — group 6, branch claude/issue-6939-objectql-source-refinement), objectui#6318 (the parent census).

Filed unassigned by the os-dev seat; grading and domain:* are the triage seat's. Generated by Claude Code, session session_01EMrWaQw3XS5DxTHxp4yRyC.

Activity

  1. added
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    on Sep 5, 2026
  2. os-zhuang commented on Sep 5, 2026

    @os-zhuang
    Contributor

    分诊 — domain:ui / priority:p3 / pm:queue / finding

    锚定 (anchoring):packages/plugin-map/src/index.tsx + packages/plugin-gantt/src/index.tsx 的注册面 ⇒ domain:ui。

    在 origin/main a472b07 上复核 —— 四处逐字成立,行号未漂

    packages/plugin-gantt/src/index.tsx:107   { name: 'objectName', type: 'string', label: 'Object Name', required: true },
    packages/plugin-gantt/src/index.tsx:117   { name: 'objectName', type: 'string', label: 'Object Name', required: true },
    packages/plugin-map/src/index.tsx:67      { name: 'objectName', type: 'string', label: 'Object Name', required: true },
    packages/plugin-map/src/index.tsx:77      { name: 'objectName', type: 'string', label: 'Object Name', required: true },
    

    两个包 × 两个注册键(object-map/map、object-gantt/gantt),四行完全相同。

    README 的复述也在:

    packages/plugin-gantt/README.md:133   fallback. Both keys declare the same two inputs: `objectName` (required) and the
    

    ⭐ 上游那一半已经修好了 —— 这正是本卡存在的理由

    本席在同一轮处理 #7296 与 #7313 时实测过 #6939 的产物:

    packages/types/src/objectql.ts:2270              objectName?: string;                       ← ObjectMapSchema,已可选
    packages/types/src/objectql.ts:2368              objectName?: string;                       ← ObjectGanttSchema,已可选
    packages/types/src/zod/objectql.zod.ts:607       function requireRecordSource(type: 'object-map' | 'object-gantt') {
    packages/types/src/zod/objectql.zod.ts:651       }).superRefine(requireRecordSource('object-map'));
    packages/types/src/zod/objectql.zod.ts:840       }).superRefine(requireRecordSource('object-gantt'));
    

    ⇒ zod 镜像与 TS 声明已经说"三选一",而设计器面仍然说"objectName 必填"。 这不是"两处都陈旧",是已修的一半与未修的一半现在互相矛盾 —— 比卡片立时的状态更该收拾。

    定级理由

    priority:p3:

    • 无运行时缺陷:六个 catalog 条目用 staticData / data 授权并正常渲染(卡片实测),校验器也已按 refinement 放行。
    • 代价在设计器面:作者在设计器里被要求填一个渲染器不读的键,或者看到一个与校验器矛盾的必填标记。
    • 不上 p2:设计器不是唯一授权入口,直接写元数据的作者不受影响;且没有静默错答。

    ⚠️ 卡片明确不裁的那个问题,是这张卡真正的难点

    Whether an inputs list can express "one of three" at all (the registry's input declaration is a flat list with a boolean required), or whether data / staticData should be declared as inputs beside objectName with none of the three marked required, is a shape question for the registry's declaration vocabulary.

    ⭐ 这个自我限制是对的:required: boolean 表达不了"三选一"。所以本卡不是一次 required: true → false 的改动,而是一次词表能力的判断:

    处置 代价
    最小:四处改成 required: false,并把 data / staticData 也声明为 inputs、三者都不必填 设计器不再说谎,但也不再表达"至少要一个" —— 作者可以什么都不填、通过设计器、然后被 requireRecordSource 在保存时拒绝
    完整:给 registry 的 input 声明加一种"互斥/至少一个"的表达 触及注册词表本身,影响所有插件 ⇒ 更大的裁决

    ⛔ 分诊席不裁决。但指出最小方案的具体缺口(作者会在更晚的环节才被拒),因为那是选路的关键代价,而卡片没有展开。

    ⛔ 给执行席的边界

    1. 四处一起改(两个包 × 两个键),⛔ 少一个就会让 map 与 object-map 说两种话。
    2. README 同 PR 改(plugin-gantt/README.md:133)—— 卡片已指出它复述了注册内容。⚠️ plugin-map 的 README 本席没查,请一并确认。
    3. 修法要与 requireRecordSource 对齐:设计器面表达的约束不能比校验器更严(现状)也不能更松到无约束(最小方案的缺口)。⛔ 若只能做到"更松",请在 PR 里写明这个已知缺口以及为什么可接受。
    4. ⛔ 不要顺手改 zod 侧 —— 那一半已由 24 catalog entries fail safeValidateSchema because the Zod mirror names a key its renderer never reads (8 components) #6939 修好且是对的,本卡只动注册面。

    ⛔ 分诊席不认领、不派单、不写码、不裁决词表能力问题。


    Generated by Claude Code

  3. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    Ruling: UI closure batch 2 item 8 · letter align (the designer face stops claiming objectName is required) · maintainer 「同意」 (chat, director seat summon #29, session_01EcrTi7s5oDYPHS4Pi7h31d) 2026-09-24T06:49Z

    Thread re-read to its last comment (5548706201) in this act. Read on objectui origin/main 62597c5: packages/plugin-map/src/index.tsx:67 and :77 and packages/plugin-gantt/src/index.tsx:120 still declare { name: 'objectName', ..., required: true }. The typed contract says one of data / staticData / objectName: the TS field is optional, and the zod mirror carries requireRecordSource (objectui#6939).

    Ruled: align the registration to the contract. Drop required: true from objectName on every map and gantt registration key. State in its description that the record source is one of data, staticData and objectName, and that the schema refuses a block with none. Correct packages/plugin-gantt/README.md (the "objectName (required)" sentence) in the same PR. ⛔ No new "one-of" vocabulary is added to the registry's input declaration, since the zod refinement is where "one of three" is enforced. ⛔ No change to the renderers' read order.

    Execution: pm:queue · priority:p3 · domain:ui stand.


    Generated by Claude Code

  4. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 5 — domain:ui execution seat 3
    Session: session_01D486C1axmXnrkJMNUfz2eb
    Branch: claude/issue-7470-designer-objectname-not-required
    Worktree: objectui-issue-7470
    Domain: domain:ui
    Seat: domain:ui#3
    File surface: packages/plugin-map/src/index.tsx and packages/plugin-gantt/src/index.tsx (the registrations' objectName input loses required: true; its description names the three record sources), packages/plugin-gantt/README.md (the 「objectName (required)」 sentence), tests beside them, one .changeset/7470-…md (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: opus (default judgement tier). dispatch-gates refuses objectui (the answer is quoted on objectui#10226's claim), so the tier is this seat's judgement.
    Clause-②: no
    Thread-read: 5809231477
    Serial constraints cleared: open PRs (file lists read 2026-09-24T21:18Z) and live pm:dispatched claims: none touches this surface.

    Ruling-ref: UI closure batch 2 item 8 · letter align, maintainer 「同意」 (5809231477). ⛔ No new one-of vocabulary in the registry input declaration, and ⛔ no change to the renderers' read order. Why Clause-②: no: the designer face stops over-claiming a requirement the typed contract and the zod refinement do not make. The schema's accept-set is unchanged.


    Generated by Claude Code

  5. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    os-dev-report

    {
     "issue": 7470,
     "status": "done",
     "branch": "claude/issue-7470-designer-objectname-not-required",
     "pr": "https://github.com/objectstack-ai/objectui/pull/10390",
     "session": "session_01D486C1axmXnrkJMNUfz2eb",
     "premise_still_valid": true,
     "summary": "Carried out ruling 5809231477 (letter align) as written. I re-derived the keys by symbol on origin/main 62bc8a250: the registration keys that declare objectName required are object-map (plugin-map), map (view) and object-gantt (plugin-gantt). The bare gantt key has been retired since objectui#8008, so gantt has one key, not the two the card lists. objectName loses required: true on all three. Its description now says the record source is one of data, staticData and objectName, and that the object-map / object-gantt schema refuses a block with none. The plugin-gantt README sentence is corrected. No one-of vocabulary was added, no renderer or zod change was made, and the assignee was not touched (it is os-project-manager). H2: no pin or generated artefact asserted required: true. The console public manifest has no map or gantt entry, and the docs pages already say 'at least one of data / staticData / objectName'. H3 holds: requireRecordSource in packages/types/src/zod/objectql.zod.ts adds RECORD_SOURCE_REQUIRED when none of RECORD_SOURCE_KEYS is present, via superRefine on ObjectMapSchema and ObjectGanttSchema, and the new tests assert this. H4: plugin-map README and both mdx pages make no false claim, so they are untouched.",
     "tests": "head 2083a24f8. (1) Under the lock: pnpm exec vitest run --maxWorkers=2 packages/plugin-map/ packages/plugin-gantt/ gave 'Test Files 97 passed (97) / Tests 705 passed (705)', VERDICT command-exit 0. (2) Reverse verification with the fix committed, using objectstack scripts/ablation-replace.mjs with the anchor hit confirmed at x1 each time and a trap that restores with git checkout HEAD. Restoring required on object-gantt gave 1 failed / 9 passed. On object-map alone it gave 'x object-map: objectName is declared and not required', and on map alone 'x view:map: ...'. Each restore was proved by matching the HEAD blob hash, and git diff HEAD was empty afterwards. The re-run was 10/10 green. The first map attempt was a no-op: the anchor was ambiguous (x2) and the tool refused it with exit 3, so I redid it with per-key anchors. No dist step was needed, because the root vitest aliases resolve these packages to src. (3) type-check (tsc --noEmit plus tsc -p tsconfig.test.json) for both packages: exit 0 after a turbo build of the dependency closure (plugin-map^... and plugin-gantt^..., 14 tasks). The first attempt exited 2 because the closure was unbuilt, so that run is NOT MEASURED, not red. --listFiles shows both new tests in the test program. (4) Gates, each exit captured to a file: exit 0 for check:new-line-citations (VERDICT 0 new citation(s)), check:control-bytes, check:element-data-source-declaration, check:component-surface-parity (report-only; its divergences are on the map / gantt config inputs and existed before), check:changeset-claims (it flags .changeset/6470-gantt-dependency-field-deprecated.md for the gantt README; I read that paragraph and it is still true), check:pending-changeset-literals, check:vi-mock-specifiers / inherit / override-shape, check:test-path-roots, check:registry-bare-names, check:phantom-deps, check-changeset-presence, and check-governed-queue-guard --test (NOT GOVERNED). NOT MEASURED: check:sdui-registration-pins (exit 2, reason: no console build) and check:readme-exports (exit 1, reason: population collapsed with the packages unbuilt); both are declared to CI. (5) ESLint over the 4 touched ts/tsx files: 4 files in its --format json output, 0 errors, 17 warnings (no-explicit-any and react-refresh, the same kinds as the files' existing ones). The config is not type-aware, so untouched files' verdicts cannot move. The self-scan for control bytes was clean.",
     "mcp_calls": "0",
     "api_writes": "2: POST /repos/objectstack-ai/objectui/pulls (draft, via the fleet-write relay, run 36062308735) and POST /repos/objectstack-ai/objectui/issues/7470/comments (this os-dev-report, via post-stamped). Plus 2 git pushes (the empty branch probe and the commit), which are not REST writes. Zero label writes and zero PR PATCH.",
     "files_changed": [
      "packages/plugin-map/src/index.tsx",
      "packages/plugin-gantt/src/index.tsx",
      "packages/plugin-gantt/README.md",
      "packages/plugin-map/src/index.recordSourceInput-7470.test.tsx",
      "packages/plugin-gantt/src/__tests__/recordSourceInput-7470.test.ts",
      ".changeset/7470-designer-objectname-not-required.md"
     ],
     "head_sha": "2083a24f8",
     "line_counts": "6 files, 1 commit. The PR body read back byte-identical: 5914 bytes sent and 5914 stored, with no differing index.",
     "deviations": [
      "The card and the ruling name two gantt keys or line :120. On current main object-gantt is the only gantt key (gantt was retired by objectui#8008), so three keys changed, not four.",
      "The new test imports @object-ui/types/zod (a declared dependency) and does not use sdui-parser, which neither package declares. That kept package.json and the lockfile out of the diff. The sdui-parser missing-required-prop consequence is described in prose and not pinned."
     ],
     "open_questions": [],
     "out_of_scope_findings": [
      "class: b · Contract: requireRecordSource('object-calendar') on ObjectCalendarSchema makes the record source one of data / staticData / objectName. The object-calendar and calendar registrations in packages/plugin-calendar/src/index.tsx still declare { name: 'objectName', type: 'string', required: true }, so sdui-parser validateTree raises the missing-required-prop ERROR on a staticData-only calendar that the schema accepts. This is the same disagreement objectui#7470 closes for map and gantt. Seam: spec:ObjectCalendarSchema.requireRecordSource → renderer:ObjectCalendarRenderer registration inputs · dedupe words: object-calendar objectName required, requireRecordSource calendar, missing-required-prop calendar, calendar registration inputs",
      "class: b · Contract: the plugin-map README says the map key is 'the bare spec view-type name ... for a node authored with it directly'. On a built types dist, safeValidateSchema of a map node with staticData gives invalid_union 'Invalid input', while an object-map node with the same content passes. AnyComponentSchema declares no map arm, which is the shape objectui#8008 retired for gantt. Seam: spec:AnyComponentSchema (no 'map' literal) → renderer:ObjectMapRenderer registered as map/view · dedupe words: map node type no schema arm, bare map key registry, view:map invalid_union, map key retirement",
      "class: b · Contract: ObjectMapSchema and ObjectGanttSchema declare data and staticData. The map and gantt registrations do not list them as inputs, so validateTree reports a staticData-only block as unknown-prop (a warning), which is the objectui#7712 shape. The ruling for objectui#7470 did not order declaring them. Seam: spec:ObjectMapSchema.staticData / ObjectGanttSchema.staticData → renderer:object-map / map / object-gantt registration inputs · dedupe words: object-map staticData unknown-prop, object-gantt data input undeclared, map registration staticData, record source inputs declared"
     ]
    }
  6. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    ✅ ACCEPTED — PR objectui#10390 at 2083a24f8

    domain:ui seat 3, session_01D486C1axmXnrkJMNUfz2eb, 2026-09-24T21:36Z. Reviewed against the dev report (comment 5822635237) and the diff on the PR head.

    • Ruling align (5809231477) met as written. objectName loses required: true on every map and gantt registration key. Re-derived by symbol: object-map, map and object-gantt. The bare gantt key has been retired since objectui#8008, which is why three keys changed, not four. Each description names the three record sources and the schema's refusal of none, and the plugin-gantt README sentence is corrected. ⛔ No one-of vocabulary, no renderer change and no zod change.
    • The description sentence is true. requireRecordSource (packages/types/src/zod/objectql.zod.ts) raises RECORD_SOURCE_REQUIRED on ObjectMapSchema / ObjectGanttSchema when none of the three is present, and the new pins assert it. Reverse-verified per key: restoring required turns that key's case red.
    • Surface and trailers. The surface is inside the claim; the docs pages already said "at least one of". Trailers are model-free. Clause-②: no is confirmed, since the schema accept-set does not move.

    Three class (b) findings from the report (the calendar registration's same required claim; the bare map key with no schema arm; data / staticData undeclared as registration inputs) are filed separately by this seat.

    Next: ready + auto-merge once CI is green on the head.


    Generated by Claude Code

  7. objectstack-fleet commented on Sep 24, 2026

    @objectstack-fleet
    Contributor

    🟢 LANDED — PR objectui#10390 merged as 3ef0b51c2 (merge queue)

    domain:ui seat 3, session_01D486C1axmXnrkJMNUfz2eb, 2026-09-24T22:01Z. Merged 2026-09-24T22:00Z. Ruling align (5809231477) is on main.

    Verified by content on objectui origin/main: no objectName input in packages/plugin-map/src/index.tsx or packages/plugin-gantt/src/index.tsx still carries required, and each of the three registration keys (object-map, map, object-gantt) states that the record source is one of data, staticData and objectName. The squash commit carries no model-named trailer.

    Fixes #7470 closed the card completed, but the auto-close does not strip labels; pm:dispatched is removed in this stroke. The siblings this dev found are filed as objectui#10392, objectui#10393 and objectui#10394.


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Labels

domain: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