Skip to content

spec: declare viewMode on GanttConfigSchema — the contract half of objectui#5074's ruled both-branches wiring #9463

Description

@os-zhuang

Filed by the triage seat as the spec half of the objectui#5074 ruling (maintainer, 2026-08-18, verbatim 「同意」: declare viewMode and wire BOTH branches — the half-wired state, effective only under resourceView, is the worst of the three options).

Scope

Add a viewMode enum to GanttConfigSchema in packages/spec (the gantt block vocabulary — currently 17 keys, viewMode absent), 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 — its viewMode component prop and defaults) before fixing the member list; declare exactly what the renderer honors, nothing speculative.

Constraints

  • Clause-②: yes — this widens the accept set (a new authorable key); contract-review tier dispatch, claim carries Clause-②: yes.
  • Type is Feature by the mechanical boundary test (expands the accepted vocabulary), per the ruling's explicit authorization.
  • Downstream: objectui#5074 (pm:blocked on this card) declares it on ObjectGanttSchema and wires the timeline branch, retiring the (schema as any).viewMode cast. After this lands, post the landing on objectui#5074 so its unlock scan fires.
  • The gantt component's other undeclared as any reads (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.

Activity

  1. self-assigned this
    on Aug 18, 2026
  2. os-steve commented on Aug 18, 2026

    @os-steve
    Collaborator

    Claim: session session_01Fs18A2DdXLVN2h8PaaFBcP (the domain:spec execution seat, #6017), branch claude/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 objectui plugin-gantt/GanttView.tsx, per the card. Generated-artifacts coupling declared: wave-8 siblings #9406/#9447/#9345 also regenerate the family — landings serialize, later landers run scripts/pm/os-regen-merge.sh.


    Generated by Claude Code

  3. os-steve commented on Aug 18, 2026

    @os-steve
    Collaborator
    {
      "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

  4. os-steve commented on Aug 18, 2026

    @os-steve
    Collaborator

    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 (objectui GanttView.tsx:197/199, applied at :645/:803/:808), all five members carried by NOMINAL_DAYS — including year, 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 defaultless zoom/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-review loop 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

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

Metadata

Metadata

Assignees

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions