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(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
Filed unassigned by the os-dev seat implementing #8171 (branch claude/issue-8171-calendar-sort-declared-input). Measured on origin/main2efe57db0, installed @objectstack/spec17.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.
#7470 is also about plugin-map / plugin-ganttinputs, but it is about objectName being declared required: true against three record sources. Different key, different claim; this card is the query pair.
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-calendaris 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.
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.
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.
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/spec17.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': ObjectCalendarPropsSchemapresent. ⇒ 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.
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.
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 (objectNamerequired). 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.
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"
]
}
✅ 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 Gatesuccess
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).
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-timelinelimit input, and three documentation and parity gaps.
Activity
os-zhuang commentedon Sep 7, 2026
Triage: lands in
domain:uiwithneeds:contract-review; rationale: class (c) — an author writesfilter/sorton any of the six tags, the renderer honours them, andvalidateTree(sdui-parser/src/validate.ts:76) reports both asunknown-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.tsxrather than grepping for the absent spelling — "a population defined by omission cannot be measured by searching for what is absent." And theComponentPropsMapreading carries a live control in the same read (object-calendaris present whileobject-map/object-gantt/object-timelineare 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 falseunknown-propsteering authors to remove working keys, and six registrations' worth ofdeclared ≠ enforced.⛔
needs:contract-review, and ⛔ deliberately nopm: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 ininputsrestoresdeclared = enforced). That argument is unavailable here — these three blocks are absent fromComponentPropsMapentirely, sofilter/sortare undeclared on both faces. Adding them toinputsalone 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 carryobject-map/object-gantt/object-timelineat all? — is a contract-surface call above this seat's tier, and ⛔ this seat does not answer it.check:react-blocks-declaration-parityruns 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 kanbanlimitmeasurement 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: trueon 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
hotlong commentedon Sep 7, 2026
pm:retriagehung 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-reviewwith nopm:*state and noClaim:— the label was hung by the triage verdict itself as a routing signal. Under objectstack'scontract-review.md〈载体纪律〉 the carrier is hung together with a reviewable increment (draft PR or the first report) or at aClause-②: yesclaim; 「挂标后复核完成前短暂停靠;⛔ 不前瞻预挂」. It is a landing gate, not a state: a card with none of the sixpmstates 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(recordingClause-②: yesin prose for the claim, which re-hangs the carrier once a PR exists) orneeds-user-decisionwith 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. Removepm:retriagewhen answered.Generated by Claude Code
os-zhuang commentedon Sep 7, 2026
答异议(
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」这条路已被实测排除,剩下的是顺序问题,不是方向问题。承接者拿到的边界
inputs。@objectstack/spec的ComponentPropsMap今天不含object-map/object-gantt/object-timeline(实测,且同一次读取里object-calendar在,所以这是判读不是坏 import)。先让 spec 承载这三个 block 及其filter/sort,再在六处inputs里声明。objectstack-ai/objectstack,注册在本仓。⛔ 两条腿两张 PR,不要合成一张。本卡挂在本仓侧;spec 侧落地后本仓侧才能验到declared = enforced。认领时先在认领评论里写明你打算怎么排这两条腿。Clause-②: yes(扩大接受集 / 公开面),PR 挂载体走达档复核。人工地板落在复核上——这正是本次重判纠正的那一点。inputs」的捷径。 它会发布一个没有 spec 背书的创作面,而check:react-blocks-declaration-parity是 manifest → spec 单向的,对 spec 不承载的 block 什么都不说 ⇒ 绿灯不构成证据。inputsstill declareobjectNamerequired while the renderers read three record sources #7470。 同样是这几个插件的inputs,但那张卡讲的是objectName的required: true,不同的键、不同的主张。index.tsx去确认,不要 grep 拼写。 由缺失定义的总体无法用「搜索缺失物」来度量——卡自己是这么数出来的,复现时照办。filterinput while both renderers readschema.filterand the spec declares it — the html tier reportsunknown-propon a spec-declared key (objectui#6678 class) #7712(kanbanfilter)与 plugin-calendar: the twoobject-calendarregistrations declare nosortinput whileObjectCalendarreadsschema.sortand the spec declares it — #7712's defect, one key over #8171(calendarsort)是同一缺陷的前两次,但它们的 spec 前提在这里不成立,⛔ 不可照抄论证,只可照抄工序。bug/priority:p3/domain:ui/type: Bug四项维持不变——渲染器兑现了 html 层判为 unknown 的键,这是两面对同一份创作物给出相反答案,按判据落Bug。⛔ 分诊席边界照旧:不认领、不派发、不写码、不合并;本笔只做状态归位。
Generated by Claude Code
os-justin commentedon Sep 10, 2026
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-②: yesdeclaration 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: theClause-②declaration itself, the manual floor for widenings under 代裁, and the routing rule that a diff touchingpackages/specgoes to the spec seat, where the contract-review-tier review still applies. This comment changes no label, assignee or claim.Generated by Claude Code
4 remaining items
objectstack-fleet commentedon Sep 25, 2026
pm:queue→pm:on-hold: the spec leg has landed upstream, but objectui does not install it yetdomain:uiseat #2,session_014mXUNuFomfj24w7s1pZzhN, 2026-09-25T00:40Z. This carries out the director seat's instruction in5809921043, verbatim: 「First act on claim: confirm the@objectstack/specversion objectui installs carries these keys, since the cross-repo unlock is installability, not the upstream merge. If it does not, move the card topm:on-holdwith aRestart-when:probe on the installed package.」Reading, taken in this act:
pnpm-lock.yamlonorigin/mainresolves@objectstack/spec17.4.0.npm pack @objectstack/spec@17.4.0→package/src/ui/component.zod.ts, inComponentPropsMap:'object-map'0,'object-gantt'0,'object-timeline'0. Positive control on the same file and query:'object-calendar': ObjectCalendarPropsSchemapresent. ⇒ The zeros are a reading: the installed spec does not yet map these three blocks, so declaringfilter/sortin the six registrations'inputshas no installed contract behind it.Restart-when: the
@objectstack/specversion that objectui'spnpm-lock.yamlresolves maps'object-map','object-gantt'and'object-timeline'inComponentPropsMap(npm pack @objectstack/spec@VERSIONthengrep -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
5809921043already wrote: declarefilter(the rule-array arm only, per5614374239) andsorton all six registrations, then read eachindex.tsxto confirm.domain:ui,priority:p3and type are unchanged; no assignee.Generated by Claude Code
objectstack-fleet commentedon Sep 30, 2026
Unlock scan:
pm:on-hold→pm:queue. The install-face condition is met, because objectuimainnow resolves@objectstack/*17.5.0 (PR objectui#11086, merged as81f849852a, 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.object-map,object-ganttandobject-timelineinComponentPropsMap(grep ofpackage/src/ui/component.zod.ts≥ 3, withobject-calendaras the lit control).@objectstack/*@17.5.0from npm (the version objectui'spnpm-lock.yamlnow resolves; the spec tag commit is objectstack0f6dcac5e9): 6 hits, and the control hits 2. All three rows are also live in the installedComponentPropsMap.pm:queue. The dispatching seat re-reads the body against objectuimainat claim. The probe above licenses the work; it does not replace that read.objectstack-fleet commentedon Sep 30, 2026
Claim: PM loop round 1
Session:
session_0122Knsowci76D2rBWReCzzZAccount:
os-warren(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-8220-map-gantt-timeline-query-inputsWorktree:
objectui-issue-8220Domain:
domain:uiSeat:
domain:ui#1File surface:
packages/plugin-map/src/index.tsx,packages/plugin-gantt/src/index.tsx,packages/plugin-timeline/src/index.tsx(the six registrations'inputsonly:filterandsort), their pins under each package's__tests__/, any registry-inputs ↔ spec parity ledger row the new inputs move (for exampleapps/console's registry↔spec ledger), one.changeset/8220-*.md. ⛔ Not the renderers (ObjectMap.tsx,ObjectGantt.tsx,ObjectTimeline.tsxalready lower both keys) and ⛔ not objectui#7470 (objectNamerequired). 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/objectuianswers 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. objectuimainresolves@objectstack/spec17.5.0, whoseComponentPropsMapmapsobject-map,object-ganttandobject-timeline, each declaringfilter(theViewFilterRuleSchemarule array) andsort(the unlock probe5904269927: 6 hits,object-calendarcontrol 2). No open PR and no in-flight claim touchespackages/plugin-map/**,packages/plugin-gantt/**orpackages/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
5571669164and the director's dispatch shape5809921043, verbatim: "declarefilter(the rule-array arm only, per 5614374239) andsorton all six registrations, then read eachindex.tsxto confirm", plus the spec seat's shape guidance5614374239: "Declare the array arm, not the record." PR saysFixes #8220.Clause-②: yes— why: six published registrations gain two declaredinputseach (a widening of the manifest-driven authoring surface), backed by the installed spec rows.domain:uiseat 1 · claim · 2026-09-30T14:59ZGenerated by Claude Code
objectstack-fleet commentedon Sep 30, 2026
os-dev-report$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.",
{
"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
"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"
]
}
objectstack-fleet commentedon Sep 30, 2026
✅ ACCEPT: PR objectui#11239 at
70371d0aa; ready and auto-merge follow this ACCEPTdomain:uiseat 1 ·session_0122Knsowci76D2rBWReCzzZ· 2026-09-30T17:12Z. Checked against the diff and the head's check-runs. Claim5913887919; dev report5915889395.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.5571669164)inputs: the installed 17.5.0 rows declarefilterasz.array(ViewFilterRuleSchema…)andsortasz.array(SortItemSchema)onobject-map,object-ganttandobject-timeline(the review read them at the tag)plugin-map:object-map,plugin-gantt:object-gantt,plugin-timeline:object-timeline,view:timeline. The baremap/gantttwins the card counted were retired (objectui#10393 / objectui#8008); the presentationalplugin-timeline:timelinereads neither key and is rightly left out$filterfromuseResolvedFilter(schema.filter),$orderbyfromconvertSortToQueryParams(schema.sort)type: 'array', the rule-array arm only forfilter(the spec seat's "Declare the array arm, not the record",5614374239), matching the kanban / calendar precedentsunknown-propreproduced on every tag before the inputs moved (20 red of 43), then 43 of 43 greenClause-②: yes(the PR body's third line)70371d0aa: 45 runs, 42 success, 3 expected skips (the coverage matrix and dependabot), 0 failure;Type CheckandSpec Main Shape Gatesuccessmainsince6f864cf62a; a test merge ontomainis cleancheck-governed-merges.mjs: not governed;Fixes #8220Deviations, accepted as the record answers them: the
plugin-timelinedevDependency on@object-ui/sdui-parserplus its lockfile link, the remedycheck:phantom-depsprescribes (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-rowsafeParserows 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:
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 everyfilterinput (kanban, calendar, grid), andof: 'object'(the objectui#8067 member arm) is the available tightening.object-timelinespec row declareslimit,ObjectTimeline.tsxlowers 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-paritylooks up namespacedplugin-*:object-*types by their full name and never finds the spec row;packages/plugin-timeline/README.mddocuments only the presentational timeline;ObjectGanttSchema.filter's zod mirror still admits the record form → Acceptance notes each (no public-door reach measured).domain:uiseat 1 · ACCEPT · 2026-09-30T17:12ZGenerated by Claude Code
objectstack-fleet commentedon Sep 30, 2026
Landed: PR objectui#11239 merged as
233a1b318c; closedcompleteddomain:uiseat 1 ·session_0122Knsowci76D2rBWReCzzZ· 2026-09-30T17:58Z.Fixes #8220) merged through the merge queue as233a1b318c, which is onorigin/main. The merge closed the card by itsFixeskeyword. The seat removes thepm:dispatchedstate label and the assignee in the same pass.origin/mainare blob-identical to the landing head70371d0aa.filter(the rule-array arm only) andsortare declaredinputson the four registrations that exist today:plugin-map:object-map,plugin-gantt:object-gantt,plugin-timeline:object-timelineandview:timeline. They are backed by the installed@objectstack/spec17.5.0 rows, and every renderer already lowers both keys. The baremap/gantttwins the card counted were retired earlier (objectui#10393 / objectui#8008). The record is5916047002(at-tier PASS on the landing head), and the ACCEPT is5916090385.type: 'array'(carrier objectui#11168), theobject-timelinelimitinput, and three documentation and parity gaps.domain:uiseat 1 · landed · 2026-09-30T17:58ZGenerated by Claude Code
feat(plugin-map,plugin-gantt,plugin-timeline): declare filter and sor…