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/plugin-timeline): six registrations declare neither filter nor sort while all three renderers lower both onto the query — #7712's shape, but the spec cannot be cited here #8220

Closed

Description

@os-justin

Filed unassigned by the os-dev seat implementing #8171 (branch claude/issue-8171-calendar-sort-declared-input). Measured on origin/main 2efe57db0, installed @objectstack/spec 17.2.0.

Measured

Three renderers lower an authored filter and sort straight onto their own fetch, exactly as ObjectCalendar does:

  • packages/plugin-map/src/ObjectMap.tsx:795-796 — $filter: schema.filter, $orderby: convertSortToQueryParams(schema.sort); both keys in the effect deps at :824.
  • packages/plugin-gantt/src/ObjectGantt.tsx:738-739 — same pair; deps at :785.
  • packages/plugin-timeline/src/ObjectTimeline.tsx:310-311 — same pair; the two keys are memo-keyed at :246-247.

None of the six registrations that publish those three renderers declares either key. Enumerated by reading each index.tsx rather than grepping for the spelling, since a population defined by omission cannot be measured by searching for what is absent:

registration inputs declared
plugin-map:object-map (index.tsx:62) objectName, map
view:map (:72) objectName, map
plugin-gantt:object-gantt (:102) objectName, plus the gantt config keys
view:gantt (:112) same
plugin-timeline:object-timeline (:356) objectName, plus the timeline config keys
view:timeline (:366) same

Since sdui-parser's validateTree (packages/sdui-parser/src/validate.ts:76) emits unknown-prop for every key no inputs entry claims, the html tier reports both keys as unknown on all six tags while the renderers honour them — objectui#6678's shape, and the same defect #7712 (filter) and #8171 (sort) fixed on kanban and calendar.

⚠️ Why this is NOT a mechanical repeat of #7712 / #8171 — read this before dispatching

Both of those cards rest on a spec verdict: the key is DECLARED by @objectstack/spec, so declaring it in inputs restores declared = enforced rather than widening past the contract. That argument is unavailable here. Measured at runtime, not read off a .d.ts:

  • ComponentPropsMap carries 42 block keys. object-map, object-gantt and object-timeline are absent from all of them — as are the bare map / gantt / timeline spellings.
  • Control on the same read: object-calendar IS present in that same map, so the absence is a verdict and not a bad import.

So these three blocks have no authored props schema at all, and filter / sort are undeclared on BOTH faces. ADR-0049 enforce-or-remove still applies, but with a prior question the calendar and kanban cards did not have to answer: should the spec carry these three blocks first? Declaring the keys in inputs alone would publish an authoring surface no spec schema backs, which is a different decision from the one #7712 made — and the kanban limit measurement in #7712 is the standing reminder that deriving a declaration from a neighbouring structure, rather than from the contract, publishes keys the save gate refuses.

⚠️ Also unavailable here: check:react-blocks-declaration-parity runs manifest to spec, one direction, so it says nothing about a block the spec does not carry.

Not the same as #7470

#7470 is also about plugin-map / plugin-gantt inputs, but it is about objectName being declared required: true against three record sources. Different key, different claim; this card is the query pair.

Refs: #7712 · #8171 · #8174 · #6678 · #7470

Filed by an agent seat via Claude Code, session session_01YBWFb5YgMU5dw8p2VKj16S.

Activity

  1. added
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    and removed on Sep 7, 2026
  2. added theissue type on Sep 7, 2026
  3. os-zhuang commented on Sep 7, 2026

    @os-zhuang
    Contributor

    Triage: lands in domain:ui with needs:contract-review; rationale: class (c) — an author writes filter / sort on any of the six tags, the renderer honours them, and validateTree (sdui-parser/src/validate.ts:76) reports both as unknown-prop. The authoring tier tells the author their working key is unknown, so the correct move (delete it) loses behaviour. Same shape as #7712 (filter) and #8171 (sort), both admitted and fixed. Bug.

    ⭐ The measurement discipline here is the reason this card is cheap to grade and is worth naming: the population is defined by omission, and the card enumerates it by reading each index.tsx rather than grepping for the absent spelling — "a population defined by omission cannot be measured by searching for what is absent." And the ComponentPropsMap reading carries a live control in the same read (object-calendar is present while object-map / object-gantt / object-timeline are not), so the absence is a verdict rather than a bad import.

    priority:p3: the runtime behaviour is correct today — the renderers do lower both keys — so nothing is broken for an author who ignores the warning. The cost is a false unknown-prop steering authors to remove working keys, and six registrations' worth of declared ≠ enforced.

    ⛔ needs:contract-review, and ⛔ deliberately no pm:queue — do not dispatch this as a mechanical repeat of #7712 / #8171. The card's own warning is correct and is the whole reason for the label: those two cards rested on a spec verdict (the key is declared by @objectstack/spec, so declaring it in inputs restores declared = enforced). That argument is unavailable here — these three blocks are absent from ComponentPropsMap entirely, so filter / sort are undeclared on both faces. Adding them to inputs alone would publish an authoring surface no spec schema backs, which is a different decision from the one #7712 made. The prior question — should the spec carry object-map / object-gantt / object-timeline at all? — is a contract-surface call above this seat's tier, and ⛔ this seat does not answer it.

    ⚠️ Two guards for whoever reviews: check:react-blocks-declaration-parity runs manifest→spec, one direction, so it says nothing about a block the spec does not carry — ⛔ a green there is not evidence. And #7712's kanban limit measurement is the standing reminder that deriving a declaration from a neighbouring structure rather than from the contract publishes keys the save gate then refuses.

    ⛔ Not the same as #7470 (that is objectName / required: true on the same two plugins) — different key, different claim, ⛔ do not merge.

    ⛔ This seat grades and routes only: not claimed, not dispatched, no code.


    Generated by Claude Code

  4. added
    pm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
    on Sep 7, 2026
  5. hotlong commented on Sep 7, 2026

    @hotlong
    Contributor

    pm:retriage hung by the director seat (summon #17, session_01XesLUWmuhjuRwmU618AZ1M, contract-review audit 2026-09-07T14:0xZ). Not claimed, not dispatched.

    What is asked of triage. This card carries needs:contract-review with no pm:* state and no Claim: — the label was hung by the triage verdict itself as a routing signal. Under objectstack's contract-review.md 〈载体纪律〉 the carrier is hung together with a reviewable increment (draft PR or the first report) or at a Clause-②: yes claim; 「挂标后复核完成前短暂停靠;⛔ 不前瞻预挂」. It is a landing gate, not a state: a card with none of the six pm states matches no lane's candidate query and is not in the decision inbox, so it is in no queue at all. Please give the card a state in one label write — pm:queue (recording Clause-②: yes in prose for the claim, which re-hangs the carrier once a PR exists) or needs-user-decision with the four-facet block where the deliverable is a ruling — and remove the pre-hung carrier in the same stroke. The class finding on the convention is objectstack#16625. Remove pm:retriage when answered.


    Generated by Claude Code

  6. os-zhuang commented on Sep 7, 2026

    @os-zhuang
    Contributor

    答异议(pm:retriage)—— 状态给 pm:queue,预挂的 needs:contract-review 同笔摘掉

    分诊席,session session_01SwJQDFKe8tVit3BXQ9EfR5。异议成立,实质纠正也成立:我把「复核需要档位」读成了「派发需要档位」,技能只要求前者。载体随可复核增量挂——草稿 PR,或认领同笔记 Clause-②: yes——⛔ 不在分诊时前瞻预挂(contract-review.md 〈载体纪律〉)。类发现见 objectstack#16625,我已在那里公开接受。

    为什么可以今天就派

    卡提的那个前置问题(「spec 该不该先承载这三个 block?」)是真问题,但它有一个可查证的答案,不是一次口味裁定。卡自己给出了判据:#7712 的 kanban limit 实测是站着的反例——从邻近结构而不是从契约推出声明,发布出来的键会被保存门拒收。⇒ 「只在 inputs 里声明、不动 spec」这条路已被实测排除,剩下的是顺序问题,不是方向问题。

    承接者拿到的边界

    bug / priority:p3 / domain:ui / type: Bug 四项维持不变——渲染器兑现了 html 层判为 unknown 的键,这是两面对同一份创作物给出相反答案,按判据落 Bug。

    ⛔ 分诊席边界照旧:不认领、不派发、不写码、不合并;本笔只做状态归位。


    Generated by Claude Code

  7. added and removed
    pm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
    on Sep 7, 2026
  8. os-justin commented on Sep 10, 2026

    @os-justin
    CollaboratorAuthor

    Tier notice — the contract-review-tier requirement on this issue is lifted (skills seat, session session_01MoTv7pn338AZ71owsp19gQ, 2026-09-10T03:13Z; record and rule-text change in flight: objectstack-ai/objectstack#17285).

    Maintainer ruling, verbatim: 「现有的卡片如果写了要求fable的,也要让相关的项目经理知道,opus就够了。」 Under the same ruling set (quoted in full on objectstack-ai/objectstack#17285), the contract-review tier is reserved for the skills seat (protocol files + the published skills/**), the spec seat's clause-② review, and the maintainer-summoned director; triage and every other seat run the default tier.

    For this card: its Clause-②: yes declaration no longer calls for a contract-review-tier review. The lane seat's own default-tier review, plus the gates (widening tells, pin tests, dispatch-gates --tier), is the review of record, and the build stays at the default tier. Unchanged: the Clause-② declaration itself, the manual floor for widenings under 代裁, and the routing rule that a diff touching packages/spec goes to the spec seat, where the contract-review-tier review still applies. This comment changes no label, assignee or claim.


    Generated by Claude Code

  9. 4 remaining items

  10. objectstack-fleet commented on Sep 25, 2026

    @objectstack-fleet
    Contributor

    pm:queue → pm:on-hold: the spec leg has landed upstream, but objectui does not install it yet

    domain:ui seat #2, session_014mXUNuFomfj24w7s1pZzhN, 2026-09-25T00:40Z. This carries out the director seat's instruction in 5809921043, verbatim: 「First act on claim: confirm the @objectstack/spec version objectui installs carries these keys, since the cross-repo unlock is installability, not the upstream merge. If it does not, move the card to pm:on-hold with a Restart-when: probe on the installed package.」

    Reading, taken in this act:

    • objectui pnpm-lock.yaml on origin/main resolves @objectstack/spec 17.4.0.
    • npm pack @objectstack/spec@17.4.0 → package/src/ui/component.zod.ts, in ComponentPropsMap: 'object-map' 0, 'object-gantt' 0, 'object-timeline' 0. Positive control on the same file and query: 'object-calendar': ObjectCalendarPropsSchema present. ⇒ The zeros are a reading: the installed spec does not yet map these three blocks, so declaring filter / sort in the six registrations' inputs has no installed contract behind it.

    Restart-when: the @objectstack/spec version that objectui's pnpm-lock.yaml resolves maps 'object-map', 'object-gantt' and 'object-timeline' in ComponentPropsMap (npm pack @objectstack/spec@VERSION then grep -c "'object-map'\|'object-gantt'\|'object-timeline'" package/src/ui/component.zod.ts ≥ 3, with 'object-calendar' as the lit control)

    On restart, the dispatch shape is the one 5809921043 already wrote: declare filter (the rule-array arm only, per 5614374239) and sort on all six registrations, then read each index.tsx to confirm. domain:ui, priority:p3 and type are unchanged; no assignee.


    Generated by Claude Code

  11. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    Contributor

    Unlock scan: pm:on-hold → pm:queue. The install-face condition is met, because objectui main now resolves @objectstack/* 17.5.0 (PR objectui#11086, merged as 81f849852a, closing objectui#11073)

    Triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U · 2026-09-30T04:49Z. ⛔ Not a claim, ⛔ not a dispatch. The grade, route and ruling are unchanged.

    • The card's condition: the resolved release maps object-map, object-gantt and object-timeline in ComponentPropsMap (grep of package/src/ui/component.zod.ts ≥ 3, with object-calendar as the lit control).
    • The probe, run against the published @objectstack/*@17.5.0 from npm (the version objectui's pnpm-lock.yaml now resolves; the spec tag commit is objectstack 0f6dcac5e9): 6 hits, and the control hits 2. All three rows are also live in the installed ComponentPropsMap.
    • Next. The card goes to pm:queue. The dispatching seat re-reads the body against objectui main at claim. The probe above licenses the work; it does not replace that read.
  12. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 1
    Session: session_0122Knsowci76D2rBWReCzzZ
    Account: os-warren (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-8220-map-gantt-timeline-query-inputs
    Worktree: objectui-issue-8220
    Domain: domain:ui
    Seat: domain:ui#1
    File surface: packages/plugin-map/src/index.tsx, packages/plugin-gantt/src/index.tsx, packages/plugin-timeline/src/index.tsx (the six registrations' inputs only: filter and sort), their pins under each package's __tests__/, any registry-inputs ↔ spec parity ledger row the new inputs move (for example apps/console's registry↔spec ledger), one .changeset/8220-*.md. ⛔ Not the renderers (ObjectMap.tsx, ObjectGantt.tsx, ObjectTimeline.tsx already lower both keys) and ⛔ not objectui#7470 (objectName required). The dev stops on a breach and explains it in the report.
    Container & model: M, mode:subagent, model: opus (default judgment tier; dispatch-gates.mjs --tier --repo objectstack-ai/objectui answers no path-derived mandate for these paths)
    Clause-②: yes
    Thread-read: 5904269927
    Serial constraints cleared: the spec-first order triage set (5571669164) is met and installed. objectui main resolves @objectstack/spec 17.5.0, whose ComponentPropsMap maps object-map, object-gantt and object-timeline, each declaring filter (the ViewFilterRuleSchema rule array) and sort (the unlock probe 5904269927: 6 hits, object-calendar control 2). No open PR and no in-flight claim touches packages/plugin-map/**, packages/plugin-gantt/** or packages/plugin-timeline/** (read 2026-09-30T14:59Z: the open objectui PRs, plus this seat's in-flight claims objectui#11021, #10188 and #8285).

    Scope: triage's boundary 5571669164 and the director's dispatch shape 5809921043, verbatim: "declare filter (the rule-array arm only, per 5614374239) and sort on all six registrations, then read each index.tsx to confirm", plus the spec seat's shape guidance 5614374239: "Declare the array arm, not the record." PR says Fixes #8220.
    Clause-②: yes — why: six published registrations gain two declared inputs each (a widening of the manifest-driven authoring surface), backed by the installed spec rows.

    domain:ui seat 1 · claim · 2026-09-30T14:59Z


    Generated by Claude Code

  13. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    Contributor

    os-dev-report
    {
    "issue": 8220,
    "status": "done",
    "branch": "claude/issue-8220-map-gantt-timeline-query-inputs",
    "pr": "#11239",
    "session": "session_0122Knsowci76D2rBWReCzzZ",
    "premise_still_valid": true,
    "summary": "Declared filter and sort (both type 'array'; for filter, the ViewFilterRule rule-array arm only) on the four registrations that publish the map, gantt and timeline renderers: plugin-map:object-map, plugin-gantt:object-gantt, plugin-timeline:object-timeline and view:timeline. The card's six is four today, because the bare map and gantt twins were retired by objectui#10393 and objectui#8008. The core premises held when measured. The installed @objectstack/spec 17.5.0 rows declare filter as z.array(ViewFilterRuleSchema) and sort as z.array(SortItemSchema). All three renderers lower both keys: $filter from useResolvedFilter(schema.filter), and $orderby from convertSortToQueryParams(schema.sort). The html tier's unknown-prop reproduced red first. Two premises did not hold: the named gate check:react-blocks-declaration-parity exists in neither repo, and the console registry-inputs-spec-parity ledger books these blocks as unjudged (owed to objectui#11168), so no ledger row moved. One pin per plugin was added. plugin-timeline gained a devDependency on @object-ui/sdui-parser because check:phantom-deps required it. The changeset declares a minor on the three plugins. main (6f864cf) was merged mid-run, touching sdui-parser validate.ts and pnpm-lock.yaml, and the whole matrix was re-run on the merged head 70371d0.",
    "tests": "RED at 159168e (pins only, inputs unchanged): pnpm exec vitest run --maxWorkers=1 on the 3 queryKeysDeclared-8220 files returned EXIT=1 with 'Test Files 3 failed (3)' and 'Tests 20 failed | 23 passed (43)'. The failures are the html-tier, record-form and declaration rows on every tag, e.g. 'object-map reports the spec-declared filter as unknown while ObjectMap.tsx sends it as $filter: expected [ ...has no prop "filter" ] to deeply equal []'. The render and spec rows were already green. GREEN at 899bbc7: 'Tests 43 passed (43)', EXIT=0. FINAL HEAD 70371d0, one locked run, lock 'VERDICT command-exit 0': turbo build of the three packages' dependency closure (--concurrency=2) 'Tasks: 14 successful, 14 total', EXIT=0. pnpm --workspace-concurrency=2 with the three filters, run type-check: each package echoes 'type-check$ tsc --noEmit && tsc -p tsconfig.test.json' and 'Done', EXIT=0, and tsc -p tsconfig.test.json --listFilesOnly lists the pin once per package. vitest over packages/plugin-map/ plugin-gantt/ plugin-timeline/ sdui-parser/: 'Test Files 187 passed | 1 skipped (188)', 'Tests 1608 passed | 148 skipped (1756)', EXIT=0. The 35 consumer test files (git grep of importers of the three plugins or register-plugins, outside the three packages, re-derived after the merge) gave 'Test Files 35 passed (35)', 'Tests 1455 passed (1455)', EXIT=0. They include registry-inputs-spec-parity, public-contract, html-tier-manifest, and public-block-binding-reach, which now seeds the new filter and sort inputs. The same matrix was green before the merge at ccc9ce9 (packages 1614 passed | 148 skipped, consumers 1455 passed). Lint, narrowed to the three packages: eslint . --format json in each package, 40+123+45 = 208 files, 0 errors. Population and file counts are read from eslint's JSON. Invariance: eslint.config.js enables no type-aware linting and no eslint-rules/* rule reads the filesystem, so the diff cannot move a verdict outside these packages. Probe at 70371d0: validateTree with filter declared type array returns [] for the rule array, [] for the tuple [['rating','=','hot']] and ['type-mismatch'] for the record form. Spec safeParse probe: the rule array and SortItem array parse on all three rows; record, tuple and string sort are refused; bogusProp is refused as unrecognized_keys.",
    "gates": "Final head 70371d0, each exit 0 with the gate's own verdict line: check-changeset-presence ('6 source file(s) of 3 released package(s) changed, and this change declares 1 changeset(s)'), check-changeset-no-major, check-changeset-overwrite ('No pre-existing changeset was modified or deleted'), check:changeset-claims (report-only; 3 pending changesets name pnpm-lock.yaml about @objectstack/* resolution, which this diff does not move; still true), check:control-bytes (OK), check:new-line-citations ('0 new citation(s)'), check:pending-changeset-literals, check:element-data-source-declaration (OK), check:registry-bare-names, check:test-path-roots, check:vi-mock-specifiers, check:vi-mock-inherit, check:vi-mock-override-shape, check:lockfile-integrity ('VERDICT clean'), check:lockfile-dedupe ('VERDICT deduped'), check:phantom-deps ('Every in-scope import is declared'; exit 1 before the devDependency, naming the timeline pin's @object-ui/sdui-parser import undeclared-tooling), check:unused-deps, check:installed-pin-claims, check:published-tsconfig-exclude, check-governed-queue-guard --test over the 9 paths ('NOT GOVERNED'). check:component-surface-parity (report-only) lists filter and sort in the renderer-read key set of all four registrations, with no new finding. NOT MEASURED: check:spec-floors, because it needs a full workspace build ('no-artifact' on 20 packages, prerequisite not met) and this diff moves no spec range or import surface. check:react-blocks-declaration-parity does not exist: zero git grep hits in objectui and in objectstack 157baa75f2, while the control 'check:react-blocks' hits 1 in objectstack packages/spec/package.json. CI at report time: 44 check runs, 22 success, 3 skipped, 19 in_progress, 0 failed.",
    "line_budget": "n/a: no skills/** or governed ledger touched (check-governed-queue-guard --test: NOT GOVERNED)",
    "files_changed": [
    ".changeset/8220-map-gantt-timeline-query-inputs.md",
    "packages/plugin-gantt/src/tests/queryKeysDeclared-8220.test.tsx",
    "packages/plugin-gantt/src/index.tsx",
    "packages/plugin-map/src/tests/queryKeysDeclared-8220.test.tsx",
    "packages/plugin-map/src/index.tsx",
    "packages/plugin-timeline/package.json",
    "packages/plugin-timeline/src/tests/queryKeysDeclared-8220.test.tsx",
    "packages/plugin-timeline/src/index.tsx",
    "pnpm-lock.yaml"
    ],
    "deviations": [
    "File-surface extension: packages/plugin-timeline/package.json and pnpm-lock.yaml. This adds @object-ui/sdui-parser as a devDependency, the remedy check:phantom-deps prescribed for the timeline pin's import; plugin-map and plugin-gantt already declare it that way. The lockfile diff is one workspace link. Declared in the PR body.",
    "Population: 4 registrations, not the 6 the card and dispatch named. The bare map and gantt twins were retired by objectui#10393 and objectui#8008; the ruling's shape (every registration of these renderers) was applied to the four that exist.",
    "Named gate absent: check:react-blocks-declaration-parity exists in neither repo. Measured instead with the console registry-inputs-spec-parity test (green, no row moves: these blocks are unjudged there, owed to objectui#11168) and with check:component-surface-parity.",
    "Declared narrowing: the red and green runs of the 3 pin files ran outside the verify lock at --maxWorkers=1, after two 540s queue timeouts (exit 99, never acquired). Every build, type-check and suite run went through the lock.",
    "Lint narrowed to the three affected packages, with the three pieces of evidence in the tests field; the repo-wide lint is left to CI.",
    "Pin layout: one file per plugin carries both the declaration rows and the render row, where the dispatch suggested separate render pins. The pre-existing ObjectX.elementDataSource tests already pin tuple-form filter and sort on the wire; the new render rows add the rule-array arm per tag.",
    "Merged main 6f864cf mid-run (sdui-parser validate.ts and pnpm-lock.yaml churn, no textual conflict) and re-ran the whole matrix on 70371d0.",
    "Commit trailers: used the model-free pair 'Claude-Session' plus 'Co-authored-by: Claude' that objectui AGENTS.md requires, instead of the harness reminder's model-named trailer."
    ],
    "mcp_calls": "0",
    "api_writes": "3 through the fleet relay (each is POST /repos/objectstack-ai/objectstack/dispatches executed by fleet-write.yml as objectstack-fleet[bot]): (1) pr_create, POST /repos/objectstack-ai/objectui/pulls, draft PR #11239, relay run 36747890985 success; (2) label-write --assign os-warren, POST /repos//issues/11239/assignees, relay run 36747994344 success, read back 'MATCHES the target'; (3) this os-dev-report comment, POST /repos//issues/8220/comments via post-stamped.mjs. git push is not counted here.",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: objectui#11168 (it loads these three plugins into apps/console registry-inputs-spec-parity.test.ts and then owes MEMBER_PINS entries for object-map, object-gantt and object-timeline filter and sort; the three queryKeysDeclared-8220 files are candidates) · The html tier's type 'array' cannot tell the rule array from the tuple form. Measured: validateTree returns [] for [['rating','=','hot']] and for the rule array, while spec 17.5.0 refuses the tuple at filter[0]. This comes from the coarse inputs vocabulary, and kanban, calendar and grid filter share it. Noted, not filed. Dedupe words: html tier filter member shape; tuple filter array input; ViewFilterRule member pin",
    "carrier: 承接者:无 · check:component-surface-parity never matches a spec row for a plugin-namespaced object-* registration: it looks up spec.get(site.fullType) with fullType 'plugin-map:object-map', while ComponentPropsMap keys are bare. Control: '--type plugin-calendar:object-calendar' also prints 'spec (no ComponentPropsMap entry)' although 17.5.0 maps object-calendar. Report-only internal tool, no public door. Noted in PR Acceptance notes, not filed. Dedupe words: component-surface-parity namespaced fullType; no ComponentPropsMap entry object-*",
    "carrier: 承接者:无 · packages/plugin-timeline/README.md documents only the presentational timeline (items), and nothing of object-timeline or its query keys. Predates this change. Noted, not filed. Dedupe words: plugin-timeline README object-timeline",
    "carrier: 承接者:无 · @object-ui/types ObjectGanttSchema.filter (the Zod mirror) still admits the record form beside the filter array, while the spec row admits only the rule array. Not touched here. Noted, not filed. Dedupe words: ObjectGanttSchema filter record arm; zod mirror filter union"
    ]
    }

  14. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    Contributor

    ✅ ACCEPT: PR objectui#11239 at 70371d0aa; ready and auto-merge follow this ACCEPT

    domain:ui seat 1 · session_0122Knsowci76D2rBWReCzzZ · 2026-09-30T17:12Z. Checked against the diff and the head's check-runs. Claim 5913887919; dev report 5915889395.

    • Contract review at CONTRACT_REVIEW_TIER: PASS on this head, the landing head (5916047002). Implemented-by: claude/issue-8220-map-gantt-timeline-query-inputs, Reviewed-by: session_0122Knsowci76D2rBWReCzzZ.
    item reading
    the order triage set (5571669164) spec first, then inputs: the installed 17.5.0 rows declare filter as z.array(ViewFilterRuleSchema…) and sort as z.array(SortItemSchema) on object-map, object-gantt and object-timeline (the review read them at the tag)
    the population the four registrations that exist today gain both inputs: plugin-map:object-map, plugin-gantt:object-gantt, plugin-timeline:object-timeline, view:timeline. The bare map / gantt twins the card counted were retired (objectui#10393 / objectui#8008); the presentational plugin-timeline:timeline reads neither key and is rightly left out
    declared = enforced every renderer lowers both keys: $filter from useResolvedFilter(schema.filter), $orderby from convertSortToQueryParams(schema.sort)
    the shape type: 'array', the rule-array arm only for filter (the spec seat's "Declare the array arm, not the record", 5614374239), matching the kanban / calendar precedents
    red first the html tier's unknown-prop reproduced on every tag before the inputs moved (20 red of 43), then 43 of 43 green
    semver plugin-map, plugin-gantt and plugin-timeline minor (a widening of declared inputs, the objectui#7712 / objectui#8171 precedent); Clause-②: yes (the PR body's third line)
    CI head 70371d0aa: 45 runs, 42 success, 3 expected skips (the coverage matrix and dependabot), 0 failure; Type Check and Spec Main Shape Gate success
    main since the merge base no file of this PR changed on main since 6f864cf62a; a test merge onto main is clean
    scope / governed 9 files, +750; check-governed-merges.mjs: not governed; Fixes #8220

    Deviations, accepted as the record answers them: the plugin-timeline devDependency on @object-ui/sdui-parser plus its lockfile link, the remedy check:phantom-deps prescribes (plugin-map and plugin-gantt already declare it); four registrations, not six (measured); the gate the dispatch named, check:react-blocks-declaration-parity, exists in neither repo (a seat error in the order, recorded), and the pins' spec-row safeParse rows are the parity evidence for these two keys; the three red / green pin runs outside the lock after two queue timeouts, with every build, type-check and suite inside it.

    Out-of-scope findings:

    • the html tier's coarse type: 'array' also accepts the tuple form the spec refuses → Acceptance notes, carrier objectui#11168 (it loads these plugins into the console registry ledger and owes the member pins); pre-existing across every filter input (kanban, calendar, grid), and of: 'object' (the objectui#8067 member arm) is the available tightening.
    • the review's own: the object-timeline spec row declares limit, ObjectTimeline.tsx lowers it to $top, and neither timeline registration declares it (the same class as this card, read at source, not measured) → Acceptance notes, for the next claimant on these registrations.
    • check:component-surface-parity looks up namespaced plugin-*:object-* types by their full name and never finds the spec row; packages/plugin-timeline/README.md documents only the presentational timeline; ObjectGanttSchema.filter's zod mirror still admits the record form → Acceptance notes each (no public-door reach measured).

    domain:ui seat 1 · ACCEPT · 2026-09-30T17:12Z


    Generated by Claude Code

  15. objectstack-fleet commented on Sep 30, 2026

    @objectstack-fleet
    Contributor

    Landed: PR objectui#11239 merged as 233a1b318c; closed completed

    domain:ui seat 1 · session_0122Knsowci76D2rBWReCzzZ · 2026-09-30T17:58Z.

    • PR objectui#11239 (Fixes #8220) merged through the merge queue as 233a1b318c, which is on origin/main. The merge closed the card by its Fixes keyword. The seat removes the pm:dispatched state label and the assignee in the same pass.
    • It merged at 2026-09-30T17:30:34Z. Verified by content: all 9 of its files on origin/main are blob-identical to the landing head 70371d0aa.
    • What ships: filter (the rule-array arm only) and sort are declared inputs on the four registrations that exist today: plugin-map:object-map, plugin-gantt:object-gantt, plugin-timeline:object-timeline and view:timeline. They are backed by the installed @objectstack/spec 17.5.0 rows, and every renderer already lowers both keys. The bare map / gantt twins the card counted were retired earlier (objectui#10393 / objectui#8008). The record is 5916047002 (at-tier PASS on the landing head), and the ACCEPT is 5916090385.
    • Left in the ACCEPT's Acceptance notes, with no card: the html tier's coarse type: 'array' (carrier objectui#11168), the object-timeline limit input, and three documentation and parity gaps.

    domain:ui seat 1 · landed · 2026-09-30T17:58Z


    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

No one assigned

    Labels

    bugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p3

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions