Repository navigation
spec: declare viewMode on GanttConfigSchema — the contract half of objectui#5074's ruled both-branches wiring #9463
Description
Activity
Claim: session
session_01Fs18A2DdXLVN2h8PaaFBcP(thedomain:specexecution seat, #6017), branchclaude/issue-9463-gantt-viewmode. Clause-②: yes (new authorable key widens the accept set) — contract-review tier; if the Fable tier is quota-refused at launch, the measured quota exemption applies (→ opus, recorded here, compensating measured review by this seat before landing). Enum members strictly from measurement of objectuiplugin-gantt/GanttView.tsx, per the card. Generated-artifacts coupling declared: wave-8 siblings #9406/#9447/#9345 also regenerate the family — landings serialize, later landers runscripts/pm/os-regen-merge.sh.
Generated by Claude Code
- added a commit that references this issue
on Aug 18, 2026 { "issue": 9463, "outcome": "delivered", "pr": 9489, "branch": "claude/issue-9463-gantt-viewmode", "head": "84a5f2185", "enum_members": ["day", "week", "month", "quarter", "year"], "measurement_receipts": [ "objectui origin/main @ 68d9e282c83af26f639180fc22dacba4c26dc201: packages/plugin-gantt/src/GanttView.tsx:197 — type GanttViewMode = 'day'|'week'|'month'|'quarter'|'year'", "GanttView.tsx:199 — VIEW_MODES runtime membership guard, applied to the prop at :645, :803, :808; :207-213 — NOMINAL_DAYS maps all five members (year honored despite the stale four-member JSDoc at :195, filed as objectui#5132)", "default 'day': GanttView.tsx:802-805 (viewModeProp valid ? viewModeProp : restoredLayout?.viewMode ?? 'day'); ResourceWorkload.tsx:63 (viewMode = 'day'); ObjectGantt.tsx:1445 ((schema as any).viewMode || 'day')" ], "files": [ "packages/spec/src/ui/view.zod.ts", "packages/spec/src/ui/view.test.ts", "packages/spec/liveness/view.json", "packages/spec/authorable-surface/ui.json", "content/docs/references/ui/view.mdx", ".changeset/gantt-viewmode-declared.md" ], "gates": [ "spec test 409 files / 10922 passed; spec typecheck green (incl. check:test-typecheck) — at head 84a5f2185", "check:generated — 1 stale (content/docs/references), regenerated via --fix; authorable-surface picked up exactly ui/GanttConfig:viewMode", "dispatch-gates union (24 families + check:nul-bytes) all green: liveness, strictness-ledger, empty-state, variant-docs, merge-driver, adr-0087-registration, changeset-no-major, empty-changeset, objectui-changeset, changeset-gate-self-tests, cross-package-test-inputs, docs-audit-scope, docs-redirects, quick-reference-counts, role-word, spec-parsed-alias, type-source-resolution, query-options-erasure, engine-double-contract, where-matcher, type-check-coverage, affected-docs, dev-prereqs + lint doc-formula-expressions + type-check-debt --re-measure (after building the workspace closure as lint.yml does)" ], "reverse_verification": "Schema alone reverted to origin/main from the committed state; direction predicted first: exactly 1 of 7 new pins red (the refusal pin — passthrough parent already tolerated the key's presence, declaring it changes value judgment only). Observed: 1 failed | 266 passed, failure = the 'hour' refusal pin (view.test.ts:304). Restored, re-run 267/267 green, tree clean at 84a5f2185.", "deviations": [ "Liveness ledger: recorded viewMode at PLANNED strength inside the view/list/gantt blanket-note (with amend-on-landing instruction), not as a per-key row — the ledger drills one level only and gantt is an undrilled container under a blanket 'live' verdict; a per-key row would require drilling all 18 gantt keys with invented evidence. check:liveness green.", "Out-of-scope finding filed unassigned: objectui#5132 (GanttView.tsx:195 JSDoc names four granularities, type/toolbar honor five — doc drift, finding label, no pm:queue)." ] }
Generated by Claude Code
Generated by Claude Code
ACCEPT — review of record against PR #9489 (head
84a5f2185), full diff read (6 files).- Enum = the measured vocabulary, with line-level receipts:
GanttViewMode/VIEW_MODES(objectuiGanttView.tsx:197/199, applied at:645/:803/:808), all five members carried byNOMINAL_DAYS— includingyear, which the stale four-member JSDoc omits (correctly filed as objectui#5132, finding-only, not fixed cross-repo). Default'day'traced to three read sites and deliberately NOT materialized spec-side — the omitted-key path lets persisted-layout seeding win, same reasoning as the map block's defaultlesszoom/center, and there is a pin asserting the parsed object leaves the key absent. - Strictness posture untouched: the key is declared inside the deliberately-passthrough gantt parent; the refusal pin proves declared-key values are still judged (
'hour'— the exact near-miss from the timeline block's vocabulary — refused with all five members named). - Reverse verification predicted exactly 1/7 pins red on revert (only the refusal pin, since passthrough already tolerated presence) and observed exactly that. That is the right prediction for a passthrough parent and shows the dev understood what declaring the key changes.
- Liveness: PLANNED-strength note riding the gantt blanket verdict with an amend-to-live instruction naming the objectui#5074 landing — accepted as the honest grain (drilling 18 keys with invented evidence would be worse). All 24+ gate families green, spec 10922 tests, changeset minor.
- Clause-② dispatch ran AT the contract-review tier (no quota refusal), so no
needs:contract-reviewloop applies.
Landing: wave-8 serialization — this is the first ACCEPT, so #9489 takes the first landing slot (ready + auto-merge squash once ESLint/TypeCheck conclude). Siblings #9406/#9447/#9345 land after, each running os-regen-merge if dirty. On MERGE: this seat posts the unlock on objectui#5074.
Generated by Claude Code
- Enum = the measured vocabulary, with line-level receipts:
- added a commit that references this issue
on Oct 7, 2026
Filed by the triage seat as the spec half of the objectui#5074 ruling (maintainer, 2026-08-18, verbatim 「同意」: declare
viewModeand wire BOTH branches — the half-wired state, effective only underresourceView, is the worst of the three options).Scope
Add a
viewModeenum toGanttConfigSchemainpackages/spec(theganttblock vocabulary — currently 17 keys,viewModeabsent), with the docs/authorable-surface/pin artifacts spec-surface conventions require.Enum members come from measurement, not invention: read
GanttView's actually supported granularities in objectui (packages/plugin-gantt/src/GanttView.tsx— itsviewModecomponent prop and defaults) before fixing the member list; declare exactly what the renderer honors, nothing speculative.Constraints
Clause-②: yes.pm:blockedon this card) declares it onObjectGanttSchemaand wires the timeline branch, retiring the(schema as any).viewModecast. After this lands, post the landing on objectui#5074 so its unlock scan fires.as anyreads (readOnly,markers,holidays, …) are ⛔ out of scope — they belong to objectui#5043's family track.Refs: objectui#5074 (the ruling record and the measured half-wiring) · objectui#5057 (the README half that depends on this outcome) · objectui#5043 (the index-signature/passthrough root cause).
Filed by triage session
session_pm_triage_20260818T0104Z; ruling provenance on objectui#5074.