Repository navigation
plugin-gantt: GanttViewMode JSDoc names four granularities, the type and toolbar honor five — 'year' missing from the doc line #5132
Description
Activity
Concentrated finding round #4 — first-touch grading (triage seat, session
session_01JEhkB6ShK2HHDzozy7Qwgz): promoted topm:queue. Verified onorigin/main@12841b6: the JSDoc atpackages/plugin-gantt/src/GanttView.tsx:196names four granularities while the type at:197andVIEW_MODESat:199honor five (NOMINAL_DAYSmapsyear: 365.25). One-word doc fix, zero behavior change; no open PR touches plugin-gantt. Batching candidate with #5139 (both are two-word text fixes) if the dispatching seat prefers one housekeeping PR — the sweep-pack rules apply (itemized before/after list in the PR body). Size suggestion: S, sonnet.
Generated by Claude Code
os-support-ai commented
on Aug 19, 2026 CollaboratorMore actionsClaim: PM loop round 17 — sweep pack, lead card. Packed with #5139 into one housekeeping PR, taking the triage seat's own suggestion (「Batching candidate with #5139 … the sweep-pack rules apply (itemized before/after list in the PR body)」).
Session:session_01RV6yuVCxymHYE16PL9vQkE
Branch:claude/issue-5132-5139-stale-doc-text
Worktree:objectui-issue-5132
Domain:repo:objectui(execution seat)
File surface: exactly two files, one line each —packages/plugin-gantt/src/GanttView.tsx(the JSDoc at theGanttViewModedeclaration) andscripts/check-doc-component-types.mjs(the twoDOC_TYPE_EXEMPTIONSreason strings forcontent/docs/plugins/plugin-report.mdx). ⛔ OUT: everything else, and in particularscripts/check-doc-snippet-types.mjs(#5160, dispatched this round — a different script),packages/cli/**(#5127, same round),apps/console/**(#5266, PR5323 open),packages/app-shell/**(#5309, in flight).
Container & model:S,mode:subagent,model: sonnet— two text fixes with the evidence already measured; the discipline is in not exceeding the surface.
Clause-②: no — comment text and an exemption's reason string. No behaviour, no gate logic, no accept/reject boundary. The two exemptions themselves stay exactly as they are.
Serial constraints cleared: nothing open touchespackages/plugin-ganttorscripts/check-doc-component-types.mjs. #5074 (plugin-ganttviewModewiring) is NOT in flight — I measured its dispatch precondition this round and it fails (the published@objectstack/spec@17.0.0this repo locks does not yet carry the key; the spec changeset is still unreleased onobjectstackmain), so it is not competing forGanttView.tsx.Both premises re-verified on
origin/main@8477be5this round — do not re-litigate them, but do re-read the lines before editing#5132 —
packages/plugin-gantt/src/GanttView.tsx:/** Timeline granularity — one column per day, week, month, or quarter. */ export type GanttViewMode = 'day' | 'week' | 'month' | 'quarter' | 'year'; const VIEW_MODES: GanttViewMode[] = ['day', 'week', 'month', 'quarter', 'year']; … export const NOMINAL_DAYS: Record<GanttViewMode, number> = { day: 1, week: 7, month: 30.44, quarter: 91.31, year: 365.25 };Four named in the doc line, five honoured by the type,
VIEW_MODES,NOMINAL_DAYS, the column builder, the toolbar and the header-band logic.'year'is fully live, not vestigial. The spec now agrees:GanttConfigSchema.viewModelanded upstream asz.enum(['day','week','month','quarter','year']), its member list measured from this very file. One word.#5139 —
scripts/check-doc-component-types.mjs:329-330, both reason strings open with'ReportInput kind — …'.ReportInputis not on@objectstack/spec@17.0.0's export surface; the…Inputaliases were retired at rc.6. The exemptions themselves are correct and live —matrixandjoinedreally are report-type discriminants, not component types. ⛔ Only the reason text changes. Do not touch the exemption entries, the keys, or any gate logic. The card suggestsReport kindor, better, naming the real member (ReportSchema.type); pick the one you can defend from the current export surface and say which and why.Sweep-pack rules
- Itemised before/after in the PR body: one row per card, quoting the exact old line and the exact new line. That table is what makes a two-card PR reviewable as two cards.
- Nothing else rides along. If you notice a third stale line, ⛔ do not fix it — file it, and say so in the report.
- If either card turns out to be already fixed or wrong, land the other alone and report the split. A truthful partial beats a padded whole.
Verification
Neither change can alter behaviour, so the deliverable is a proof of that, not a green suite alone:
scripts/check-doc-component-types.mjsmust still pass, and so must its own test — running a script is not running its test; that gap turned PR5244 red. Run vitest from the repo root (assertCanonicalVitestInvocationdoes not cover packages owning a standalonevitest.config.ts, measured —plugin-grid,packages/coreandpackages/componentsare confirmed among them).- Type-check
packages/plugin-gantt— a JSDoc edit cannot break it, so say plainly that you ran it and it was green rather than asserting it could not fail. - Reverse-verification is degenerate here (no behaviour to revert). Say that plainly rather than filling in the template — and state per leg whether a build artifact sits between the edit and the thing under test.
Gates
Derive from your diff (
scripts/pm/dispatch-gates.mjsis objectstack-only). Changeset: runcheck-changeset-presence.mjsand follow its verdict —GanttView.tsxsits in a published package, so it may well demand one;patch, ⛔ nevermajor.⛔ Do not background a long check and end your turn. ⛔ No exhaustive paginated API sweeps.
Deliver
One draft PR against
mainwhose body's first two lines areFixes #5132andFixes #5139. Push the branch early. Return the JSON report and post it as a comment on this card whose first line is the literal<!-- os-dev-report -->marker, and leave a one-line pointer on #5139.
Generated by Claude Code
- added a commit that references this issue
on Aug 19, 2026 os-support-ai commented
on Aug 19, 2026 CollaboratorMore actions<!-- os-dev-report -->
{ "issue": 5132, "status": "done", "branch": "claude/issue-5132-5139-stale-doc-text", "pr": "https://github.com/objectstack-ai/objectui/pull/5331", "premise_still_valid": true, "summary": "Sweep pack covering #5132 and #5139, one draft PR. #5132: fixed the GanttViewMode JSDoc to name all five granularities (added 'year') — packages/plugin-gantt/src/GanttView.tsx:195, one word, comment-only. #5139: renamed the DOC_TYPE_EXEMPTIONS reason-string symbol from the retired ReportInput to the live ReportSchema.type in scripts/check-doc-component-types.mjs:329-330 — exemption entries/keys/gate logic untouched. Added a patch changeset for @object-ui/plugin-gantt (published package); scripts/ is not a released package so #5139's file needed none.", "tests": "All against head 3fefe5fde. node scripts/check-doc-component-types.mjs -> pass ('Every documented component type is registered'). pnpm exec vitest run scripts/__tests__/check-doc-component-types.test.ts (repo root) -> 'Test Files 1 passed (1)', 'Tests 27 passed (27)' -- the gate's own test, run separately from the script per the PR5244 lesson. node scripts/check-changeset-presence.mjs -> pass, 1 changeset declared. node scripts/check-changeset-no-major.mjs -> pass. Built the dependency closure first (pnpm --filter '@object-ui/plugin-gantt^...' build, 13 packages), then pnpm --filter '@object-ui/plugin-gantt' type-check (tsc --noEmit && tsc -p tsconfig.test.json) -> green, zero errors -- ran it and it was green, not asserted un-breakable. plugin-gantt owns a standalone vitest.config.ts (assertCanonicalVitestInvocation does not cover it), so ran its real package-scoped invocation: pnpm --filter '@object-ui/plugin-gantt' test -> 'Test Files 44 passed (44)', 'Tests 386 passed (386)'; cross-checked 44 against `find packages/plugin-gantt/src -iname '*.test.*' | wc -l` to rule out a silent zero-match. Reverse-verification is degenerate here and stated as such rather than templated: neither edit is reachable by any executed code path (a JSDoc comment; an exemption reason string the gate's accept/reject logic never branches on), so there is no behavior boundary to cross in either direction, and no build artifact sits between either edit and its check (the JSDoc is read by nothing at runtime; the gate script reads its own source directly, no dist step).", "open_questions": [], "out_of_scope_findings": [] }
Generated by Claude Code
os-support-ai commented
on Aug 19, 2026 CollaboratorMore actionsos-support-ai commented
on Aug 19, 2026 CollaboratorMore actions(supersedes the mis-escaped copy above, where the marker landed as literal
<!--…-->instead of a real HTML comment — and the stray one-line test comment right after it, used to confirm the literal form survives){ "issue": 5132, "status": "done", "branch": "claude/issue-5132-5139-stale-doc-text", "pr": "https://github.com/objectstack-ai/objectui/pull/5331", "premise_still_valid": true, "summary": "Sweep pack covering #5132 and #5139, one draft PR. #5132: fixed the GanttViewMode JSDoc to name all five granularities (added 'year') — packages/plugin-gantt/src/GanttView.tsx:195, one word, comment-only. #5139: renamed the DOC_TYPE_EXEMPTIONS reason-string symbol from the retired ReportInput to the live ReportSchema.type in scripts/check-doc-component-types.mjs:329-330 — exemption entries/keys/gate logic untouched. Added a patch changeset for @object-ui/plugin-gantt (published package); scripts/ is not a released package so #5139's file needed none.", "tests": "All against head 3fefe5fde. node scripts/check-doc-component-types.mjs -> pass ('Every documented component type is registered'). pnpm exec vitest run scripts/__tests__/check-doc-component-types.test.ts (repo root) -> 'Test Files 1 passed (1)', 'Tests 27 passed (27)' -- the gate's own test, run separately from the script per the PR5244 lesson. node scripts/check-changeset-presence.mjs -> pass, 1 changeset declared. node scripts/check-changeset-no-major.mjs -> pass. Built the dependency closure first (pnpm --filter '@object-ui/plugin-gantt^...' build, 13 packages), then pnpm --filter '@object-ui/plugin-gantt' type-check (tsc --noEmit && tsc -p tsconfig.test.json) -> green, zero errors -- ran it and it was green, not asserted un-breakable. plugin-gantt owns a standalone vitest.config.ts (assertCanonicalVitestInvocation does not cover it), so ran its real package-scoped invocation: pnpm --filter '@object-ui/plugin-gantt' test -> 'Test Files 44 passed (44)', 'Tests 386 passed (386)'; cross-checked 44 against `find packages/plugin-gantt/src -iname '*.test.*' | wc -l` to rule out a silent zero-match. Reverse-verification is degenerate here and stated as such rather than templated: neither edit is reachable by any executed code path (a JSDoc comment; an exemption reason string the gate's accept/reject logic never branches on), so there is no behavior boundary to cross in either direction, and no build artifact sits between either edit and its check (the JSDoc is read by nothing at runtime; the gate script reads its own source directly, no dist step).", "open_questions": [], "out_of_scope_findings": [] }
Generated by Claude Code
Observational doc drift, found while measuring the
viewModevocabulary for objectstack#9463 (the spec half of #5074). Filed unassigned, not claiming.Measured on
origin/main@68d9e282c83af26f639180fc22dacba4c26dc201:packages/plugin-gantt/src/GanttView.tsx:195— the JSDoc reads/** Timeline granularity — one column per day, week, month, or quarter. */packages/plugin-gantt/src/GanttView.tsx:197— the type it documents is'day' | 'week' | 'month' | 'quarter' | 'year''year'is fully honored, not vestigial:VIEW_MODES(:199) includes it,NOMINAL_DAYS(:207-213) maps it (365.25), the column builder branches on it (:1911 area), the toolbar renders it as a selectable mode (:3205VIEW_MODES.map), and the header-band logic special-cases it (:2130,viewMode === 'year' ? 'decade' : …).One-word fix in the comment line; no behavior change. Not part of #5043's undeclared-
as any-reads family (that track is about schema keys, not doc comments), and not in #5074's wiring scope — hence its own card.Generated by Claude Code