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.
Maintainer ruling recorded — maintainer, 2026-08-18, batch acceptance of the triage seat's decision-inbox recommendations, verbatim: 「同意」. Provenance: triage session session_pm_triage_20260818T0104Z (objectstack#6015).
Ruled: declare viewMode and wire BOTH branches — the half-wired state (effective only under resourceView) is the worst of the three. Contract-first sequencing: the spec half comes first — GanttConfigSchema in @objectstack/spec gains a viewMode enum (objectstack card, spec seat, clause-② semantic face, contract-review tier; being filed by this seat now) — then this card's objectui half: ObjectGanttSchema declares it and the timeline branch passes it to GanttView, retiring the (schema as any).viewMode cast. Blocked-by: the objectstack spec card's landing (number will be posted here once filed; the rate-limited window delayed creation).
The component's other undeclared as any reads (readOnly, markers, holidays, skipWeekends, criticalPath, showBaselines, mobileReadOnly, navigation, persistLayout) are ⛔ not ruled here per-key — they go to the #5043 family track as one population.
Label needs-user-decision → pm:blocked in the same stroke (queued on the spec half).
This card unblocks when #9463 lands; the wiring scope here is unchanged from the ruling comment above. (Blocked-by line carried in this comment per the #8813 body-edit caution; the unlock scan reads comment-level lines under standing instruction ⑥.)
Unlock notice from the objectstack domain:spec seat (#6017, session session_01Fs18A2DdXLVN2h8PaaFBcP): the spec half is landed — objectstack#9463 closed via objectstack PR #9489, squashed onto objectstack main as 870f710e7 (2026-08-18T06:03Z).
What the contract now says, for this card's both-branches wiring:
GanttConfigSchema.viewMode is declared: z.enum(['day','week','month','quarter','year']).optional() — the member list measured from THIS repo's renderer (GanttView.tsxGanttViewMode/VIEW_MODES, all five members verified live including year; the stale four-member JSDoc at GanttView.tsx:195 is filed as objectui#5132).
Deliberately NO spec-side default: an omitted viewMode must keep letting the persisted layout (persistLayoutKey) seed the granularity before the 'day' fallback — a spec default would arrive as an explicit author choice and defeat that seeding. The objectui-side declaration on ObjectGanttSchema should preserve the same absence semantics.
The spec liveness ledger records viewMode at PLANNED strength with an amend-to-live instruction naming THIS card's landing (the timeline-branch read + retiring the (schema as any).viewMode cast at ObjectGantt.tsx:1445).
This card's Blocked-by: objectstack#9463 is discharged once your repo's .objectstack-sha spec pin advances past 870f710e7 — dispatch after the pin covers it. objectui#5057 (the README half) chains behind this card per its own note.
Triage (state-machine hygiene): swapped pm:blocked → needs-user-decision. This card IS the pending ruling (enforce-or-remove for the undeclared viewMode read, per its own "两条路的取舍是维护者的裁定"), not a card waiting on an upstream — pm:blocked with no upstream is a state nothing can ever unlock, while #5057 and #5126 both wait on this ruling. #5057's 2026-08-17 PM header already describes it as being in the decision inbox; the label now matches.
Four-axis block (required on inbox entry):
Platform long-term coherence: the component reads ~10 undeclared keys via as any (card's own census) — ruling on viewMode sets the pattern for the family; declaring it means also wiring the timeline branch, removing it means the ResourceWorkload branch loses a granularity input.
Measured business pull: viewMode half-works today (resource view honors it, timeline silently ignores it) — an author-visible inconsistency, but the key was never declared authoring surface.
AI-agent error-resistance: BaseSchema's index signature + passthrough makes every undeclared read invisible to gates (measured in the card); either outcome must land as a declared, pinned contract, never another tolerated cast.
Startup scope discipline: remove is the cheaper standing obligation; declare only if the granularity control is wanted product surface.
Recommendation: remove the undeclared viewMode read (both branches keyed off declared config only), letting #5057's README rewrite state one truth — with the readOnly-family casts left to their own later enforce-or-remove pass, not folded in here.
Not dispatched — the ruling's own dispatch precondition fails, measured. PM round 17, repo:objectui execution seat, session session_01RV6yuVCxymHYE16PL9vQkE. pm:queue → pm:blocked.
Blocked-by: #5328
The ruling is not in question — declare-and-wire stands, and the reasoning for confirming it over the triage seat's "remove" recommendation is exactly right: the spec half is paid, so removing the objectui read would turn a freshly published spec key into a declared-but-unread key one level up. What fails is the precondition attached to it.
.changeset/gantt-viewmode-declared.md on objectstack main
still present — unreleased (303 changesets pending)
Counter-probe on the schema read: the same window shows resourceView at the expected offset, so the file and range are right — viewMode really is in source.
The source half landed; the published half has not. The 17.0.0 this repo installs predates the commit, so viewMode is not in node_modules here. Declaring it on ObjectGanttSchema today would publish a key the save gate refuses — the preview-works / save-refuses trap, which is the exact defect class this cleanup exists to eliminate. Wiring it before the pin covers it would trade one instance of the disease for another.
Two corrections to the precondition as written
The ruling says: "verify the .objectstack-sha spec pin covers 870f710e7 (REST compare, not local merge-base); if not yet covered, wait or document the fork window per protocol."
objectui has no .objectstack-sha — I looked; that file is the cloud repo's mechanism. objectui consumes the spec as a published npm package, so the pin is package.json + pnpm-lock.yaml, and the covering event is a release, not a commit. A REST compare on the commit therefore answers a question this repo does not ask.
#5074 returns to pm:queue when #5328 closes; the wiring scope is unchanged from the ruling. #5057 and #5126 stay chained behind this card.
Not blocked, and dispatched this round instead: #5132 — the one-word GanttViewMode JSDoc fix in the same file. It touches only the doc comment, so it cannot collide with this card's wiring when that unblocks, and it is worth landing now precisely because the upstream enum's member list was measured from that file.
Unblocked — GanttConfigSchema.viewMode is now in the pinned build
Unlock scan by the spec@objectui seat after PR #5529 merged. Verified on origin/main @ 2d36552d2.
Blocker discharged
This card's own Restart-when: criterion — carried on #5328 — was run against the published package and passed, counter-probed:
probe
result
viewMode on GanttConfigSchema
true ← the criterion
resourceView (known-present control)
true
zzNotAKey (known-absent control)
false
and the pin is now actually on main: all six @objectstack/* resolve 17.1.0, 0 entries left at 17.0.0. Merged upstream / published / pinned here — all three true for the first time. Blocked-by: objectui#5328 discharged; pm:blocked → pm:queue.
pm:blocking is kept — #5057 and #5126 chain behind this card, not behind #5328, so this one still gates them.
Premise note for whoever takes it
I did not re-derive the full card. One reading worth having before you start: viewMode appears throughout packages/plugin-gantt/src as a host prop (tests drive it via renderView({ viewMode }), and it is persisted in GanttLayout), which is consistent with the card's framing that the authored-metadata path is the missing half. Confirm the current declaration state of ObjectGanttSchema and the (schema as any) cast on merged main before writing anything — #5529 moved the pin and touched several consumer surfaces, so treat the card's file-level assertions as dated and re-measure.
Standing constraint from #5328's dependant list: ⛔ do not work around a spec key by declaring it objectui-side only.
Triage: domain:ui. The fix lands in packages/plugin-gantt — the viewMode key read only by the ResourceWorkload branch while the timeline ignores it. Published library source.
⚠️ The card also records that viewMode is undeclared in bothObjectGanttSchema and the spec's GanttConfigSchema. If the chosen fix is to declare it rather than to read it, that half is a contract change and belongs to domain:spec as a separate card — ⛔ do not fold an accept-set expansion into a ui-lane renderer fix.
pm:blocking is carried; it is a derived cache and was not touched here.
Routed via the maintainer direct-dispatch channel, this session, verbatim: 「objectui 有 79 张卡在车道视图之外(占该仓 35%),你帮我分批处理」. PM session session_0124Qg8rLvpXnQDwCmpKUmaJ. Not a Routine triage fire — the triage seat remains the standing producer of domain:* and may re-grade.
Claim — domain:ui execution seat. PM round 28, session session_01EuPCi56cnGyykygi3z9w4m, branch claude/issue-5074-gantt-viewmode-declare-wire. Dispatching at contract-review tier (clause ②: the change widens what ObjectGanttSchema declares).
Precondition re-verified before claiming, since the 2026-08-19 dispatch attempt failed on exactly this point:
reading
value
Blocked-by: #5328
discharged 2026-08-22 (comment 5376979824) — viewMode present on the published GanttConfigSchema, counter-probed against resourceView (present) and zzNotAKey (absent)
pinned @objectstack/spec
now 17.2.0 — later than the 17.1.0 that discharged the blocker, so the key is a fortiori in node_modules here
The ruling being executed is the 2026-08-19 maintainer-confirmed one (comment 5339681862): declare and wire both branches; the triage seat's "remove" recommendation was rejected there and stays rejected. Scope as ruled — ObjectGanttSchema declares viewMode, the timeline branch passes it to GanttView, the (schema as any).viewMode cast at ObjectGantt.tsx:1445 retires, and absence semantics are preserved (no default; an omitted viewMode must still let the persisted layout seed granularity before the 'day' fallback).
⛔ Out of scope, restated so the dev cannot drift into them: the other nine undeclared as any reads (readOnly, markers, holidays, skipWeekends, criticalPath, showBaselines, mobileReadOnly, navigation, persistLayout) stay with the #5043 family track. ⛔ Do not work around a spec key by declaring it objectui-side only — the objectui declaration must mirror the already-published upstream enum, not invent a parallel one.
Per the 2026-08-22 unlock note, the card's file-level assertions are dated (#5529 moved the pin and touched consumer surfaces); the dev re-measures the declaration state and the cast on current main before writing.
{
"issue": 5074,
"status": "done",
"branch": "claude/issue-5074-gantt-viewmode-declare-wire",
"pr": "https://github.com/objectstack-ai/objectui/pull/5825",
"premise_still_valid": true,
"summary": "Executed the 2026-08-19 maintainer ruling (declare-and-wire, comment 5339681862). ObjectGanttSchema now declares viewMode in the TS interface (derived as SpecGanttConfig['viewMode']) and the zod mirror (SpecGanttConfigSchema.shape.viewMode by reference — inner enum reference-identical, pinned by test); no default, absence semantics preserved so persisted layouts keep seeding granularity. getGanttConfig picks viewMode into GanttConfigEx, the timeline branch passes viewMode={ganttConfig?.viewMode} to GanttView (no || 'day' — guard comment marks it load-bearing), the ResourceWorkload branch keeps its explicit 'day' fallback, and the (schema as any).viewMode cast is retired (zero such reads remain repo-wide). Spec precondition re-verified in node_modules before writing: viewMode present on the installed GanttConfigSchema as z.enum(['day','week','month','quarter','year']).optional(), counter-probed against resourceView (present) and zzNotAKey (absent). Repo sweep found no fixture/example/app authoring viewMode on a gantt schema, so the declared-key value narrowing (off-enum values now refused) re-judges nothing in-repo. Out-of-scope surfaces untouched: the nine #5043-family casts, #5057, #5126, #5132, plugin-gantt.mdx.",
"tests": "New suites: packages/plugin-gantt/src/ObjectGantt.viewmode.test.tsx (wiring: timeline honours authored viewMode in both authoring styles; receives exactly undefined when omitted; ResourceWorkload branch pinned) and packages/types/src/__tests__/gantt-view-mode-declared.test.ts (key declared; enum reference-identity anti-fork pin; all spec members accepted; off-enum 'hour' refused with invalid_value on the viewMode path; no default materialised; TS mutual-assignability + @ts-expect-error compiled via tsconfig.test.json). Reverse verification on the real commit (git checkout HEAD~1 -- the 3 source files, tests kept; mutation confirmed on disk by git status showing the 3 reverted files): 5 discriminating legs went red — both timeline wiring legs, 'declares the key', 'reference identity', 'refuses off-enum' — observed direction: red, as predicted; 6 legs do not discriminate and are declared as pins (omitted-stays-undefined guards the future || 'day' regression only; ResourceWorkload legs; accepts-every-member; no-default runtime half; TS runtime-erased leg). Restored, git diff HEAD --stat empty, 11/11 green. No dist-based ablation was involved: vitest resolves @object-ui/* to package src via the root config aliases, so both reverse-verification legs read the mutated/restored source directly. Union at final commit c4a12f52e (all via the shared verify lock, verdicts read from gate output, not bare $?): vitest run packages/plugin-gantt/ packages/types/ from repo root = Test Files 92 passed (92), Tests 912 passed (912); pnpm --filter type-check for @object-ui/types and @object-ui/plugin-gantt both clean after building the dependency closure; pnpm lint (turbo run lint, full farm, not narrowed) = 47/47 successful; check-changeset-presence / check-changeset-no-major / check-control-bytes / check-spec-symbol-derivation all green. CI not awaited per dispatch protocol; changeset gantt-viewmode-declared-both-branches-5074.md declares minor for @object-ui/types + @object-ui/plugin-gantt.",
"open_questions": [],
"out_of_scope_findings": []
}
(Re-post of the previous comment, 5386271475: the sanitizer stripped its HTML-comment marker line, which would hide it from the PM scan. Same JSON, now behind the literal-text marker. Read this one.)
{
"issue": 5074,
"status": "done",
"branch": "claude/issue-5074-gantt-viewmode-declare-wire",
"pr": "https://github.com/objectstack-ai/objectui/pull/5825",
"premise_still_valid": true,
"summary": "Executed the 2026-08-19 maintainer ruling (declare-and-wire, comment 5339681862). ObjectGanttSchema now declares viewMode in the TS interface (derived as SpecGanttConfig['viewMode']) and the zod mirror (SpecGanttConfigSchema.shape.viewMode by reference — inner enum reference-identical, pinned by test); no default, absence semantics preserved so persisted layouts keep seeding granularity. getGanttConfig picks viewMode into GanttConfigEx, the timeline branch passes viewMode={ganttConfig?.viewMode} to GanttView (no || 'day' — guard comment marks it load-bearing), the ResourceWorkload branch keeps its explicit 'day' fallback, and the (schema as any).viewMode cast is retired (zero such reads remain repo-wide). Spec precondition re-verified in node_modules before writing: viewMode present on the installed GanttConfigSchema as z.enum(['day','week','month','quarter','year']).optional(), counter-probed against resourceView (present) and zzNotAKey (absent). Repo sweep found no fixture/example/app authoring viewMode on a gantt schema, so the declared-key value narrowing (off-enum values now refused) re-judges nothing in-repo. Out-of-scope surfaces untouched: the nine #5043-family casts, #5057, #5126, #5132, plugin-gantt.mdx.",
"tests": "New suites: packages/plugin-gantt/src/ObjectGantt.viewmode.test.tsx (wiring: timeline honours authored viewMode in both authoring styles; receives exactly undefined when omitted; ResourceWorkload branch pinned) and packages/types/src/__tests__/gantt-view-mode-declared.test.ts (key declared; enum reference-identity anti-fork pin; all spec members accepted; off-enum 'hour' refused with invalid_value on the viewMode path; no default materialised; TS mutual-assignability + @ts-expect-error compiled via tsconfig.test.json). Reverse verification on the real commit (git checkout HEAD~1 -- the 3 source files, tests kept; mutation confirmed on disk by git status showing the 3 reverted files): 5 discriminating legs went red — both timeline wiring legs, 'declares the key', 'reference identity', 'refuses off-enum' — observed direction: red, as predicted; 6 legs do not discriminate and are declared as pins (omitted-stays-undefined guards the future || 'day' regression only; ResourceWorkload legs; accepts-every-member; no-default runtime half; TS runtime-erased leg). Restored, git diff HEAD --stat empty, 11/11 green. No dist-based ablation was involved: vitest resolves @object-ui/* to package src via the root config aliases, so both reverse-verification legs read the mutated/restored source directly. Union at final commit c4a12f52e (all via the shared verify lock, verdicts read from gate output, not bare $?): vitest run packages/plugin-gantt/ packages/types/ from repo root = Test Files 92 passed (92), Tests 912 passed (912); pnpm --filter type-check for @object-ui/types and @object-ui/plugin-gantt both clean after building the dependency closure; pnpm lint (turbo run lint, full farm, not narrowed) = 47/47 successful; check-changeset-presence / check-changeset-no-major / check-control-bytes / check-spec-symbol-derivation all green. CI not awaited per dispatch protocol; changeset gantt-viewmode-declared-both-branches-5074.md declares minor for @object-ui/types + @object-ui/plugin-gantt.",
"open_questions": [],
"out_of_scope_findings": []
}
Activity
yinlianghui commentedon Aug 17, 2026
正文里那段分支结构原本贴的是 JSX,被 issues 正文清洗器按 HTML 标签吞掉了(
<+字母),已改写成文字描述并保留 file:line 复核命令。另注:本卡正文末尾的生成者脚注同样被端点剥除,故用本评论补上。Generated by Claude Code
os-zhuang commentedon Aug 18, 2026
Maintainer ruling recorded — maintainer, 2026-08-18, batch acceptance of the triage seat's decision-inbox recommendations, verbatim: 「同意」. Provenance: triage session
session_pm_triage_20260818T0104Z(objectstack#6015).Ruled: declare
viewModeand wire BOTH branches — the half-wired state (effective only underresourceView) is the worst of the three. Contract-first sequencing: the spec half comes first —GanttConfigSchemain@objectstack/specgains aviewModeenum (objectstack card, spec seat, clause-② semantic face, contract-review tier; being filed by this seat now) — then this card's objectui half:ObjectGanttSchemadeclares it and the timeline branch passes it toGanttView, retiring the(schema as any).viewModecast. Blocked-by: the objectstack spec card's landing (number will be posted here once filed; the rate-limited window delayed creation).The component's other undeclared
as anyreads (readOnly,markers,holidays,skipWeekends,criticalPath,showBaselines,mobileReadOnly,navigation,persistLayout) are ⛔ not ruled here per-key — they go to the #5043 family track as one population.Label
needs-user-decision→pm:blockedin the same stroke (queued on the spec half).Generated by Claude Code
os-zhuang commentedon Aug 18, 2026
Spec half filed: objectstack-ai/objectstack#9463 (GanttConfigSchema
viewModeenum, clause-② contract-review tier).Blocked-by: objectstack-ai/objectstack#9463
This card unblocks when #9463 lands; the wiring scope here is unchanged from the ruling comment above. (Blocked-by line carried in this comment per the #8813 body-edit caution; the unlock scan reads comment-level lines under standing instruction ⑥.)
Generated by Claude Code
os-steve commentedon Aug 18, 2026
Unlock notice from the objectstack
domain:specseat (#6017, sessionsession_01Fs18A2DdXLVN2h8PaaFBcP): the spec half is landed — objectstack#9463 closed via objectstack PR #9489, squashed onto objectstackmainas870f710e7(2026-08-18T06:03Z).What the contract now says, for this card's both-branches wiring:
GanttConfigSchema.viewModeis declared:z.enum(['day','week','month','quarter','year']).optional()— the member list measured from THIS repo's renderer (GanttView.tsxGanttViewMode/VIEW_MODES, all five members verified live includingyear; the stale four-member JSDoc atGanttView.tsx:195is filed as objectui#5132).viewModemust keep letting the persisted layout (persistLayoutKey) seed the granularity before the'day'fallback — a spec default would arrive as an explicit author choice and defeat that seeding. The objectui-side declaration onObjectGanttSchemashould preserve the same absence semantics.viewModeat PLANNED strength with an amend-to-live instruction naming THIS card's landing (the timeline-branch read + retiring the(schema as any).viewModecast atObjectGantt.tsx:1445).This card's
Blocked-by: objectstack#9463is discharged once your repo's.objectstack-shaspec pin advances past870f710e7— dispatch after the pin covers it. objectui#5057 (the README half) chains behind this card per its own note.Generated by Claude Code
os-support-ai commentedon Aug 19, 2026
Triage (state-machine hygiene): swapped
pm:blocked→needs-user-decision. This card IS the pending ruling (enforce-or-remove for the undeclaredviewModeread, per its own "两条路的取舍是维护者的裁定"), not a card waiting on an upstream —pm:blockedwith no upstream is a state nothing can ever unlock, while #5057 and #5126 both wait on this ruling. #5057's 2026-08-17 PM header already describes it as being in the decision inbox; the label now matches.Four-axis block (required on inbox entry):
as any(card's own census) — ruling onviewModesets the pattern for the family; declaring it means also wiring the timeline branch, removing it means the ResourceWorkload branch loses a granularity input.viewModehalf-works today (resource view honors it, timeline silently ignores it) — an author-visible inconsistency, but the key was never declared authoring surface.BaseSchema's index signature +passthroughmakes every undeclared read invisible to gates (measured in the card); either outcome must land as a declared, pinned contract, never another tolerated cast.Recommendation: remove the undeclared
viewModeread (both branches keyed off declared config only), letting #5057's README rewrite state one truth — with thereadOnly-family casts left to their own later enforce-or-remove pass, not folded in here.本评论来自分诊座位 Routine (session
session_018euHiF12oV8iSfYdjVioUF).Generated by Claude Code
os-support-ai commentedon Aug 19, 2026
Not dispatched — the ruling's own dispatch precondition fails, measured. PM round 17,
repo:objectuiexecution seat, sessionsession_01RV6yuVCxymHYE16PL9vQkE.pm:queue→pm:blocked.Blocked-by: #5328The ruling is not in question — declare-and-wire stands, and the reasoning for confirming it over the triage seat's "remove" recommendation is exactly right: the spec half is paid, so removing the objectui read would turn a freshly published spec key into a declared-but-unread key one level up. What fails is the precondition attached to it.
The measurement
packages/spec/src/ui/view.zod.ts→GanttConfigSchemaviewMode: z.enum(['day','week','month','quarter','year']).optional()✅870f710e7ancestor of objectstackmain?pnpm-lock.yaml→@objectstack/spec17.0.0, lockfile-exact under^17.0.0packages/spec/package.jsononmain17.0.0.changeset/gantt-viewmode-declared.mdon objectstackmainCounter-probe on the schema read: the same window shows
resourceViewat the expected offset, so the file and range are right —viewModereally is in source.The source half landed; the published half has not. The
17.0.0this repo installs predates the commit, soviewModeis not innode_moduleshere. Declaring it onObjectGanttSchematoday would publish a key the save gate refuses — the preview-works / save-refuses trap, which is the exact defect class this cleanup exists to eliminate. Wiring it before the pin covers it would trade one instance of the disease for another.Two corrections to the precondition as written
The ruling says: "verify the
.objectstack-shaspec pin covers870f710e7(REST compare, not local merge-base); if not yet covered, wait or document the fork window per protocol.".objectstack-sha— I looked; that file is thecloudrepo's mechanism. objectui consumes the spec as a published npm package, so the pin ispackage.json+pnpm-lock.yaml, and the covering event is a release, not a commit. A RESTcompareon the commit therefore answers a question this repo does not ask.pm:blockedneeds aBlocked-by: #N, so I filed The locked@objectstack/spec@17.0.0does not carry the spec keys already merged upstream —GanttConfigSchema.viewMode(#5074) is the first card measurably stalled on it #5328 to be that N — it carries the full measurement and a machine-readableRestart-when:line. ⛔ It does not authorise anyone to cut a release; that is a maintainer action, and version releases are never executed by an AI seat.What happens next
#5074 returns to
pm:queuewhen #5328 closes; the wiring scope is unchanged from the ruling. #5057 and #5126 stay chained behind this card.Not blocked, and dispatched this round instead: #5132 — the one-word
GanttViewModeJSDoc fix in the same file. It touches only the doc comment, so it cannot collide with this card's wiring when that unblocks, and it is worth landing now precisely because the upstream enum's member list was measured from that file.Generated by Claude Code
os-support-ai commentedon Aug 22, 2026
Unblocked —
GanttConfigSchema.viewModeis now in the pinned buildUnlock scan by the spec@objectui seat after PR #5529 merged. Verified on
origin/main@2d36552d2.Blocker discharged
This card's own
Restart-when:criterion — carried on #5328 — was run against the published package and passed, counter-probed:viewModeonGanttConfigSchemaresourceView(known-present control)zzNotAKey(known-absent control)and the pin is now actually on main: all six
@objectstack/*resolve 17.1.0, 0 entries left at 17.0.0. Merged upstream / published / pinned here — all three true for the first time.Blocked-by: objectui#5328discharged;pm:blocked→pm:queue.pm:blockingis kept — #5057 and #5126 chain behind this card, not behind #5328, so this one still gates them.Premise note for whoever takes it
I did not re-derive the full card. One reading worth having before you start:
viewModeappears throughoutpackages/plugin-gantt/srcas a host prop (tests drive it viarenderView({ viewMode }), and it is persisted inGanttLayout), which is consistent with the card's framing that the authored-metadata path is the missing half. Confirm the current declaration state ofObjectGanttSchemaand the(schema as any)cast on merged main before writing anything — #5529 moved the pin and touched several consumer surfaces, so treat the card's file-level assertions as dated and re-measure.Standing constraint from #5328's dependant list: ⛔ do not work around a spec key by declaring it objectui-side only.
Generated by Claude Code
os-zhuang commentedon Aug 23, 2026
Triage:
domain:ui. The fix lands inpackages/plugin-gantt— theviewModekey read only by theResourceWorkloadbranch while the timeline ignores it. Published library source.viewModeis undeclared in bothObjectGanttSchemaand the spec'sGanttConfigSchema. If the chosen fix is to declare it rather than to read it, that half is a contract change and belongs todomain:specas a separate card — ⛔ do not fold an accept-set expansion into a ui-lane renderer fix.pm:blockingis carried; it is a derived cache and was not touched here.objectui three-stream split (maintainer 2026-08-21):
domain:devxengineering surface ·domain:speccontract surface ·domain:uieverything else (published libraries and apps).Routed via the maintainer direct-dispatch channel, this session, verbatim: 「objectui 有 79 张卡在车道视图之外(占该仓 35%),你帮我分批处理」. PM session
session_0124Qg8rLvpXnQDwCmpKUmaJ. Not a Routine triage fire — the triage seat remains the standing producer ofdomain:*and may re-grade.⛔ pm-state, assignee and scope untouched.
Generated by Claude Code
os-zhuang commentedon Aug 23, 2026
Claim —
domain:uiexecution seat. PM round 28, sessionsession_01EuPCi56cnGyykygi3z9w4m, branchclaude/issue-5074-gantt-viewmode-declare-wire. Dispatching at contract-review tier (clause ②: the change widens whatObjectGanttSchemadeclares).Precondition re-verified before claiming, since the 2026-08-19 dispatch attempt failed on exactly this point:
Blocked-by: #5328viewModepresent on the publishedGanttConfigSchema, counter-probed againstresourceView(present) andzzNotAKey(absent)@objectstack/specnode_moduleshereThe ruling being executed is the 2026-08-19 maintainer-confirmed one (comment 5339681862): declare and wire both branches; the triage seat's "remove" recommendation was rejected there and stays rejected. Scope as ruled —
ObjectGanttSchemadeclaresviewMode, the timeline branch passes it toGanttView, the(schema as any).viewModecast atObjectGantt.tsx:1445retires, and absence semantics are preserved (no default; an omittedviewModemust still let the persisted layout seed granularity before the'day'fallback).⛔ Out of scope, restated so the dev cannot drift into them: the other nine undeclared
as anyreads (readOnly,markers,holidays,skipWeekends,criticalPath,showBaselines,mobileReadOnly,navigation,persistLayout) stay with the #5043 family track. ⛔ Do not work around a spec key by declaring it objectui-side only — the objectui declaration must mirror the already-published upstream enum, not invent a parallel one.Per the 2026-08-22 unlock note, the card's file-level assertions are dated (#5529 moved the pin and touched consumer surfaces); the dev re-measures the declaration state and the cast on current
mainbefore writing.Generated by Claude Code
feat(gantt): declare viewMode on ObjectGanttSchema and wire both rend…
os-zhuang commentedon Aug 23, 2026
{ "issue": 5074, "status": "done", "branch": "claude/issue-5074-gantt-viewmode-declare-wire", "pr": "https://github.com/objectstack-ai/objectui/pull/5825", "premise_still_valid": true, "summary": "Executed the 2026-08-19 maintainer ruling (declare-and-wire, comment 5339681862). ObjectGanttSchema now declares viewMode in the TS interface (derived as SpecGanttConfig['viewMode']) and the zod mirror (SpecGanttConfigSchema.shape.viewMode by reference — inner enum reference-identical, pinned by test); no default, absence semantics preserved so persisted layouts keep seeding granularity. getGanttConfig picks viewMode into GanttConfigEx, the timeline branch passes viewMode={ganttConfig?.viewMode} to GanttView (no || 'day' — guard comment marks it load-bearing), the ResourceWorkload branch keeps its explicit 'day' fallback, and the (schema as any).viewMode cast is retired (zero such reads remain repo-wide). Spec precondition re-verified in node_modules before writing: viewMode present on the installed GanttConfigSchema as z.enum(['day','week','month','quarter','year']).optional(), counter-probed against resourceView (present) and zzNotAKey (absent). Repo sweep found no fixture/example/app authoring viewMode on a gantt schema, so the declared-key value narrowing (off-enum values now refused) re-judges nothing in-repo. Out-of-scope surfaces untouched: the nine #5043-family casts, #5057, #5126, #5132, plugin-gantt.mdx.", "tests": "New suites: packages/plugin-gantt/src/ObjectGantt.viewmode.test.tsx (wiring: timeline honours authored viewMode in both authoring styles; receives exactly undefined when omitted; ResourceWorkload branch pinned) and packages/types/src/__tests__/gantt-view-mode-declared.test.ts (key declared; enum reference-identity anti-fork pin; all spec members accepted; off-enum 'hour' refused with invalid_value on the viewMode path; no default materialised; TS mutual-assignability + @ts-expect-error compiled via tsconfig.test.json). Reverse verification on the real commit (git checkout HEAD~1 -- the 3 source files, tests kept; mutation confirmed on disk by git status showing the 3 reverted files): 5 discriminating legs went red — both timeline wiring legs, 'declares the key', 'reference identity', 'refuses off-enum' — observed direction: red, as predicted; 6 legs do not discriminate and are declared as pins (omitted-stays-undefined guards the future || 'day' regression only; ResourceWorkload legs; accepts-every-member; no-default runtime half; TS runtime-erased leg). Restored, git diff HEAD --stat empty, 11/11 green. No dist-based ablation was involved: vitest resolves @object-ui/* to package src via the root config aliases, so both reverse-verification legs read the mutated/restored source directly. Union at final commit c4a12f52e (all via the shared verify lock, verdicts read from gate output, not bare $?): vitest run packages/plugin-gantt/ packages/types/ from repo root = Test Files 92 passed (92), Tests 912 passed (912); pnpm --filter type-check for @object-ui/types and @object-ui/plugin-gantt both clean after building the dependency closure; pnpm lint (turbo run lint, full farm, not narrowed) = 47/47 successful; check-changeset-presence / check-changeset-no-major / check-control-bytes / check-spec-symbol-derivation all green. CI not awaited per dispatch protocol; changeset gantt-viewmode-declared-both-branches-5074.md declares minor for @object-ui/types + @object-ui/plugin-gantt.", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
Generated by Claude Code
os-zhuang commentedon Aug 23, 2026
os-dev-report
(Re-post of the previous comment, 5386271475: the sanitizer stripped its HTML-comment marker line, which would hide it from the PM scan. Same JSON, now behind the literal-text marker. Read this one.)
{ "issue": 5074, "status": "done", "branch": "claude/issue-5074-gantt-viewmode-declare-wire", "pr": "https://github.com/objectstack-ai/objectui/pull/5825", "premise_still_valid": true, "summary": "Executed the 2026-08-19 maintainer ruling (declare-and-wire, comment 5339681862). ObjectGanttSchema now declares viewMode in the TS interface (derived as SpecGanttConfig['viewMode']) and the zod mirror (SpecGanttConfigSchema.shape.viewMode by reference — inner enum reference-identical, pinned by test); no default, absence semantics preserved so persisted layouts keep seeding granularity. getGanttConfig picks viewMode into GanttConfigEx, the timeline branch passes viewMode={ganttConfig?.viewMode} to GanttView (no || 'day' — guard comment marks it load-bearing), the ResourceWorkload branch keeps its explicit 'day' fallback, and the (schema as any).viewMode cast is retired (zero such reads remain repo-wide). Spec precondition re-verified in node_modules before writing: viewMode present on the installed GanttConfigSchema as z.enum(['day','week','month','quarter','year']).optional(), counter-probed against resourceView (present) and zzNotAKey (absent). Repo sweep found no fixture/example/app authoring viewMode on a gantt schema, so the declared-key value narrowing (off-enum values now refused) re-judges nothing in-repo. Out-of-scope surfaces untouched: the nine #5043-family casts, #5057, #5126, #5132, plugin-gantt.mdx.", "tests": "New suites: packages/plugin-gantt/src/ObjectGantt.viewmode.test.tsx (wiring: timeline honours authored viewMode in both authoring styles; receives exactly undefined when omitted; ResourceWorkload branch pinned) and packages/types/src/__tests__/gantt-view-mode-declared.test.ts (key declared; enum reference-identity anti-fork pin; all spec members accepted; off-enum 'hour' refused with invalid_value on the viewMode path; no default materialised; TS mutual-assignability + @ts-expect-error compiled via tsconfig.test.json). Reverse verification on the real commit (git checkout HEAD~1 -- the 3 source files, tests kept; mutation confirmed on disk by git status showing the 3 reverted files): 5 discriminating legs went red — both timeline wiring legs, 'declares the key', 'reference identity', 'refuses off-enum' — observed direction: red, as predicted; 6 legs do not discriminate and are declared as pins (omitted-stays-undefined guards the future || 'day' regression only; ResourceWorkload legs; accepts-every-member; no-default runtime half; TS runtime-erased leg). Restored, git diff HEAD --stat empty, 11/11 green. No dist-based ablation was involved: vitest resolves @object-ui/* to package src via the root config aliases, so both reverse-verification legs read the mutated/restored source directly. Union at final commit c4a12f52e (all via the shared verify lock, verdicts read from gate output, not bare $?): vitest run packages/plugin-gantt/ packages/types/ from repo root = Test Files 92 passed (92), Tests 912 passed (912); pnpm --filter type-check for @object-ui/types and @object-ui/plugin-gantt both clean after building the dependency closure; pnpm lint (turbo run lint, full farm, not narrowed) = 47/47 successful; check-changeset-presence / check-changeset-no-major / check-control-bytes / check-spec-symbol-derivation all green. CI not awaited per dispatch protocol; changeset gantt-viewmode-declared-both-branches-5074.md declares minor for @object-ui/types + @object-ui/plugin-gantt.", "open_questions": [], "out_of_scope_findings": [] }Generated by Claude Code
Generated by Claude Code
feat(gantt): declare viewMode on ObjectGanttSchema and wire both rend…