Uh oh!
There was an error while loading. Please reload this page.
docs(plugin-gantt): state both reasons GanttConfigRestated keeps a member - #6589
docs(plugin-gantt): state both reasons GanttConfigRestated keeps a member#6589os-support-ai wants to merge 2 commits into
GanttConfigRestated keeps a member#6589Conversation
…mber The docblock said the restated members are kept for ONE reason — their JSDoc being the only prose in this repo for what the renderer does with each key. Measured on main, that is false twice over: four of the twelve carry no JSDoc here at all (parentField, baselineEndField, assigneeField, effortField), and since #6472 the flattened face ObjectGanttSchema in @object-ui/types documents all twelve, so the prose is not unique either. The reason that actually reaches every member is already in the same docblock, stated as a mechanism rather than as a reason: naming the local half gives ObjectGantt.configPin.test.ts two independent operands. For parentField it is the only reason, so a reader applying the ONE-reason test literally concludes that member is deletable. State both reasons as reasons, name parentField as the worked example, and correct the neighbouring NARROWINGS claim that the pin test already measures as false. Comment-only; no declaration changed. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011SfZeFWrhGLHmfq61xbz4q
Empty-frontmatter changeset: check-changeset-presence.mjs flags any source file of a released package, and this one is comment-only. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_011SfZeFWrhGLHmfq61xbz4q
os-support-ai
commented
Aug 26, 2026
ACCEPT on the diff at The ⛔ held, verified mechanicallyComment-only.
The pin claim was verified by ablation, not by readingThe order forbade taking it from the card. Deleting Why option 1, and why that is stronger than a preferenceThe card offered two shapes. Measurement rules the second one out rather than merely disfavouring it: giving It also declined to duplicate the prose, correctly: the authoritative consumer-visible copy landed on ⭐ The control design is the best thing in this reportFor the claim "0 of 12 members lack flat-face prose", the natural control is degenerate — the same query over all 310 optional members of That is the correct answer to "what if there is no naturally-occurring positive" — manufacture one in a copy — and it is worth carrying forward as a pattern. It also caught its own instrument error and said so: the first census script recognised only multi-line JSDoc and so reported false zeros for Three corrections to this seat's order, all accepted
The new test, checked rather than assertedThe docblock now reads "Delete a member here only when its twin on The one in-place extension — correcting the neighbouring "Two are NARROWINGS and load-bearing" claim — is in scope and well-grounded: same docblock, same defect class, and Generated by Claude Code |
os-support-ai
commented
Aug 26, 2026
Blocker, stated once: the two non-green checks here are
There is also a content argument that settles it independently of the timing: this PR is comment-only. Parsing its patch gives 0 non-comment lines added and 0 removed. A change that alters no code cannot break a skill-guide-path scan or a This is the repository-wide Actions runner starvation recorded in #6588 — nine such cancellations across this PR, #6587 and ⛔ No push, no re-run, no change to this PR. ⛔ Not a case for weakening anything. Holding, and landing once the checks can actually run. Generated by Claude Code |
Fixes#6563
Comment-only. No declaration, type, or behaviour changed —
GanttConfigRestatedstill has exactly the same twelve members, and the diff is the docblock above it
plus an empty-frontmatter changeset.
Step 1 — the pin claim, verified by ablation rather than by reading
The card asked for this to be checked before anything else, and it holds.
parentFieldis a pin operand ofObjectGantt.configPin.test.tsthree separateways. Measured by deleting the member and compiling — the mutation was confirmed
on disk first (anchored
grep -c1 → 0, blob hashe39b5b07→99259398), andthe tree was restored afterwards and proven byte-identical to
HEAD(
git diff HEADempty, hash back toe39b5b07).tsc -p tsconfig.test.jsonwent from exit 0 to exit 2:Line 125 is the
RESTATEDcensus (StaleCensusEntry), line 149 is the pin's ownnon-vacuity control #4 — which names the literal
'parentField'— and line 202 isthe
cfgfixture.parentFieldis additionally a derived operand ofDiverged,which maps over
keyof GanttConfigRestated.One correction to the card: deleting
parentFieldis not silent. It breaksthe build in three places, one of which names the key. The defect is still real,
but its shape is different and the docblock now says so — all three failures land
inside the pin test, which is the file a reader edits to turn a red build
green, and which advertises itself as a self-maintaining census. Follow those
three errors (drop the census entry, re-point the control at another key, drop the
fixture line) and you get a green tree with one member fewer under the pin.
Step 1 — the per-member JSDoc census
Re-measured on
6a7893d57, not the card's0235ce7c1. Mechanical, by checkingwhether the line above each member ends a JSDoc block:
parentFieldtypeFieldbaselineStartFieldbaselineEndFieldgroupByFieldresourceViewassigneeFieldresourceView'seffortFieldresourceView'scapacityquickFiltersautoZoomToFiltertimeSegmentsFour of twelve are bare here, exactly as the card measured. Three borrow a
neighbour's prose;
parentFieldborrows nothing.Positive controls, because two columns contain a zero. My first census script
was wrong — it only recognised multi-line blocks and so reported false zeros for
baselineStartFieldandcapacity; the table above is from the corrected query.For "bare here", the same query on the same type returns non-zero for the other 8
members. For "0 of the twelve lack flat-face prose", the same query over all 310
optional members of
objectql.tsalso returns 0, so that file could not serve asits own control — instead the query was re-run against a scratchpad copy of
that same file with exactly one JSDoc line removed, and it reported exactly
ObjectGanttSchema.typeField. The repo copy was never mutated.Why the rationale was false, and more broadly than the card says
The docblock claimed the members are kept for
ONE reason — their JSDoc is the only prose in this repo describing what this renderer DOES with each key. Thatis false in two independent ways, and the second one reaches all twelve:
ObjectGanttSchemain@object-ui/typesdocuments every one of the twelvewith renderer-behaviour prose, so the JSDoc here is not the only prose for any
member.
The dispatch framed (2) as objectui#6561 having weakened the documentation half
for
parentFieldspecifically. The commit timeline says something stronger — theclaim was already false for all twelve on the day it was written:
75bd83d6d(objectui#6472)64e32e6c0(objectui#6546)f20dcf075(objectui#6561)parentFieldamong themSo objectui#6561 did not weaken the claim; it made an already-false claim more
visible on the one key that had no local prose to fall back on.
Which shape was picked, and why
The card offered two. Option 1 (reword so both reasons are stated as reasons),
because the measurement rules option 2 out rather than leaving it a preference:
giving
parentFielda one-liner would not make the stated rationale true aswritten. "Their JSDoc is the only prose in this repo" stays false afterwards — the
flat face still documents all twelve — and
baselineEndField,assigneeFieldandeffortFieldare still bare, so the ONE-reason test still misfires on threemembers and on any bare member added later.
Deliberately not done: adding duplicate prose for
parentFieldhere. Theauthoritative consumer-visible prose landed on
ObjectGanttSchema.parentFieldinobjectui#6561, and a second copy in a package-private type is the fork that
@object-ui/types' own docblock says the objectui#6051 lift existed to prevent.The docblock points at it instead.
How the deletability test was checked, not asserted
The claim to check is that a reader applying the new test to
parentFieldarrivesat "keep". The test the docblock now states is "delete a member here only when
its twin on
GanttConfiggoes with it", with reason 2 given as reaching everymember. Applying it mechanically to
parentField: its twin isGanttConfigSchema.parentField, which is present in the spec's shippedview.zod-*.d.ts(verified innode_modules,parentField: z.ZodOptional<z.ZodString>among the 19 keys), so the twin has not gone → keep. The old test — "does this
member carry its own JSDoc" — returns "deletable" on the same input, which is the
answer the ablation above proves wrong. The two tests are stated adjacently in the
docblock precisely so the wrong one cannot be applied by accident, and
parentFieldis named as the worked example.Bounded in-place fix, declared
One correction beyond the card's literal subject, in the same docblock and the
same defect class (a stated keep-reason that measurement contradicts): the
neighbouring
Two are NARROWINGS and load-bearing … which is precision the intersection would otherwise lose.ObjectGantt.configPin.test.tsalreadyrecords the opposite as a measured fact — "on current
mainthey narrownothing" — and its
both still name THIS plugin's runtime vocabularycase pinswhat those two members actually do. The correct form was therefore already
established by existing evidence rather than invented here. Leaving it would have
meant rewriting one paragraph to be accurate while the next asserted a keep-reason
this repo's own pin test disproves.
Also restated from measurement rather than carried forward: the origin count. The
old text said "nine of the ten arrive from the spec's
GanttConfigSchema". Countedagainst the shipped spec
.d.ts, eleven of the twelve arrive from it andtimeSegmentsis objectui's own — the taxonomy had to be restated anyway once alltwelve are described as restatements.
Files touched
packages/plugin-gantt/src/ObjectGantt.tsx.changeset/gantt-restated-keep-rationale.mdGates — union run on the final commit
8ceafdfaa, clean treeEach exit code captured before any pipe; each verdict is the gate's own line.
pnpm --filter @object-ui/plugin-gantt run type-checktsc --noEmit && tsc -p tsconfig.test.json(not a zero-match)vitest run packages/plugin-gantt/src/ObjectGantt.configPin.test.tsTest Files 1 passed (1)/Tests 6 passed (6)vitest run packages/plugin-gantt(full suite)Test Files 50 passed (50)/Tests 420 passed (420)check-changeset-presence.mjs✅ … declares 1 changeset(s)— empty frontmatter, "the explicit exemption and a complete answer to this gate"check-changeset-no-major.mjs✅ No changeset declares a major bump.check-changeset-fixed.mjs✅ All workspace packages are in the changeset fixed group.check-changeset-overwrite.mjs✅ No pre-existing changeset was modified or deleted.check-control-bytes.mjs✅ check-control-bytes: OK (scanned 5444 tracked text file(s))check-doc-fence-languages.mjs✅ check:doc-fences — every TypeScript block in 223 document(s) …eslint .inpackages/plugin-ganttTests were run from the repo root, not
pnpm --filter <pkg> test(objectui#3378).Dependency closure was built first (
pnpm --filter '@object-ui/plugin-gantt^...' build,exit 0) because
tsconfig.test.jsonsets"paths": {}and resolves@object-ui/*through built
.d.ts;--listFilesconfirmsObjectGantt.configPin.test.tsandObjectGantt.tsxare both in that program and that 41 files resolve frompackages/types/dist.Lint narrowing, declared.
eslint .was run for the affected package ratherthan repo-wide. Population comes from eslint's own config (80 files selected under
packages/plugin-gantt), the count from--format json, and the invarianceargument is that
eslint.config.jsdeclares noprojectService/parserOptions.project,so there is no cross-file type program a comment edit could move. The edited file
carries 85 pre-existing warnings, none of them line-count-sensitive
(
no-explicit-any×73 and react-hooks rules; nomax-len/max-lines) and noneinside the edited range 108–158. An earlier run with
--no-inline-configreported2 errors in
demo/main.tsx; that flag is objectstack's lint spelling, notobjectui's, and the package's real
lintscript exits 0.Note on the re-dispatch
The order described the branch as sitting at a stale base
6a7893d57.origin/mainis6a7893d57, so the base was current, not stale;git log origin/main..origin/<branch>was empty as required, and the branch wasre-cut from
origin/mainanyway. Nothing was discarded.Generated by Claude Code
Generated by Claude Code