Repository navigation
feat(i18n,plugin-timeline): retire the unread timeline.bucket.overdue key (objectui#11676) - #11716
Merged
objectstack-fleet[bot] merged 2 commits intoOct 6, 2026
Merged
Conversation
…e` key (objectui#11676) A past day on a timeline is "Earlier" since ce464d9, and triage ruled that no timeline says "Overdue" (ruling A). Nothing reads the key, so it retires from TIMELINE_DEFAULT_TRANSLATIONS and from the timeline.bucket block of all ten packs. The fields.relativeDate.overdue plural rows and slaOverdue are other families and stay. The card's own pin now asserts the row and the ten pack keys absent, with the fields.relativeDate.overdue family as the surviving sibling. The pending changeset's "kept in every pack" sentence is corrected, and a second changeset declares the TranslationKeys narrowing (minor). Claude-Session: https://claude.ai/code/session_01FngvPpdrnhHMdHHq6vwwju Co-authored-by: Claude <noreply@anthropic.com>
Contributor
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
… open question (objectui#11676) The comment above dateBucket said that bringing "Overdue" back through a declared signal was an open question on the card. Triage answered it (ruling A: no timeline says "Overdue"), and this PR closes the card, so the sentence would be false on merge. Comment prose only; the rest of the comment is unchanged. Claude-Session: https://claude.ai/code/session_01FngvPpdrnhHMdHHq6vwwju Co-authored-by: Claude <noreply@anthropic.com>
Contributor
✅ Console Performance Budget
The eager closure is every chunk the entry reaches through static imports — what the browser fetches and parses before the app renders. The entry chunk on its own is a small fraction of it. 📦 Bundle Size Report
Size Limits
|
This was referenced Oct 6, 2026
objectstack-fleet
Bot
deleted the
claude/issue-11676-retire-overdue-key
branch
October 6, 2026 13:25
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #11676
Clause-②: no (narrowing)
The card's last piece. Its first half landed as
ce464d9(PR objectui#11700): a past day on an object-bound timeline is "Earlier". Triage then answered the due-date question with ruling A (comment 6011959066): no timeline says "Overdue", the dead key retires, and the card closes on that. This PR retirestimeline.bucket.overdueand nothing else: no due-date bucket, no new key, no spec change.What changes
packages/plugin-timeline/src/useTimelineTranslation.ts: the'timeline.bucket.overdue': 'Overdue'row ofTIMELINE_DEFAULT_TRANSLATIONSis gone, with its "kept until the open question decides" comment. A short tombstone comment points at the pin.packages/i18n/src/locales/{en,zh,ja,ko,de,fr,es,pt,ru,ar}.ts): theoverduemember of eachtimeline: { bucket: { ... } }block is deleted, one line per pack. Thefields.relativeDate.overdueplural rows (the date cell's "Overdue 3d") andslaOverdueare other families and stay. Each pack's count of lines matchingoverduedrops by exactly one.ObjectTimeline.pastBucket-11676.test.tsx: the card's own pin gains adescribethat asserts the key is absent from the defaults row (and thattranslateTimelineDefaultanswers the bare key) and from every pack'stimeline.bucket. Non-vacuity: the pack set equalsBUILT_IN_LANGUAGE_CODES, andearlieris present in the table and in every pack. Thefields.relativeDate.overduefamily is pinned as the surviving sibling, because a sweep by leaf name would take it out. The header's "open question" prose now states ruling A. No existing assertion changed.timeline-relative-defaults-retired-7874.test.ts: no assertion reads the key. Its header cites a positive control measured at83fe6e741that usedtimeline.bucket.overdue. That record stays, with a dated note that the key has since retired, so a re-run needs anotherObjectTimeline.tsxkey as its control.packages/plugin-timeline/src/ObjectTimeline.tsx, comment only (patch round 1,5068741): the comment abovedateBucketsaid that bringing "Overdue" back through a declared signal "is an open question on objectui#11676". Ruling A answered that, and this PR closes the card, so the sentence now says that triage ruled that no timeline says "Overdue" (ruling A), the bucket is the calendar position alone, and a due-date timeline would be a new card that declares its signals in the spec first. No code line changed..changeset/11676-timeline-past-bucket.md(pending, this card's first half) said "timeline.bucket.overdueis kept in every pack". That sentence is corrected in prose only; the front matter is untouched. A new.changeset/11676-retire-overdue-key.md(minoron@object-ui/i18nand@object-ui/plugin-timeline) declares the removal and theTranslationKeysnarrowing. The second file is needed becausecheck-changeset-presencecounts ADDED changesets only (--diff-filter=A), so a modified one would not declare this change.No docs edit:
content/docs/plugins/plugin-timeline.mdxand the package README already list the buckets as Earlier, Today, Tomorrow, This week, Next week, Later, No date.Premise, re-measured on
main9ca3cacgit grepover trackedpackages/**,apps/**,scripts/**andexamples/**, for the literal key and for assembled spellings (a template literal or concatenation ontimeline.orbucket.). Zero non-test source readstimeline.bucket.overdue. The only hits were the defaults row itself and comments in the two pins. Control: the same search findstimeline.bucket.earlierread once, bydateBucketinObjectTimeline.tsx.timeline: {thenbucket: {, read before the edit. The deletion was anchored on that three-line shape, one hit per pack, checked on disk after writing.Public surface: the narrowing, read on built output
@object-ui/i18nwas built at base (9ca3cac, a detached worktree) and at head, and everydist/**/*.d.tswas compared. The file set is the same. 11 files differ, all underdist/locales/, and every difference is one removed line.locales/en.d.tsloses exactlyreadonly overdue: "Overdue";undertimeline.bucket, soTranslationKeys = typeof enloses one member.zh.d.tslosesreadonly overdue: "已逾期";, the other eight packs each loseoverdue: string;, andlocales/index.d.tsloses those ten members.dist/index.d.tsand the other d.ts files are byte-identical. No additions anywhere, soClause-②: no (narrowing)holds. In@object-ui/plugin-timeline,TIMELINE_DEFAULT_TRANSLATIONSkeeps its string-to-stringRecordtype; headdist/index.jscarriestimeline.bucket.overdue0 times andtimeline.bucket.earlier2 times.Reverse type check against the rebuilt d.ts: a throwaway probe in
packages/plugin-timelinereadingen.timeline.bucket.overdueandTranslationKeys['timeline']['bucket']['overdue']fails with TS2339 twice (exit 2). The same probe onearliercompiles (exit 0). Both probes were deleted after the run;git statuswas empty.Tests and gates, at head
e8d7630(patch round 1 at5068741, a comment-only commit, re-ran the plugin-timeline type-check, lint, the card's pin,packages/plugin-timeline/(559 passed) and the line-citation, control-byte and changeset gates, all exit 0)Heavy runs went through
os-verify-lock.shwithOS_VERIFY_LOCK_SLOT=issue-11676. Every exit below was captured before any pipe.pnpm exec vitest run --maxWorkers=2on the two pins,scripts/__tests__/defaults-population-parity-7904.test.ts,packages/app-shell/src/__tests__/defaults-maps-mirror-en-pack.test.tsx,scripts/__tests__/date-only-zone-pins-10183.test.ts,all-locales-key-parity.test.tsanden-zh-key-parity.test.ts: at baseTest Files 7 passed (7),Tests 102 passed (102); at headTest Files 7 passed (7),Tests 105 passed (105), the 3 new pins added. Exit 0 both.pnpm exec vitest run --maxWorkers=2 packages/plugin-timeline/:Test Files 45 passed (45),Tests 559 passed | 37 skipped (596), exit 0. The skipped cases include the zone cases the 10183 driver runs.pnpm exec vitest run --maxWorkers=2 packages/i18n/:Test Files 80 passed (80),Tests 1304 passed | 13 skipped (1317), exit 0.pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-timeline^...' build, thenpnpm --filter @object-ui/plugin-timeline build: exit 0.pnpm --filter @object-ui/i18n type-check,pnpm --filter @object-ui/plugin-timeline type-check: exit 0, both script names echoed.tsc -p tsconfig.test.json --listFilesOnlylists both edited pins, and it resolves@object-ui/i18n/localesto the rebuiltdist/locales/index.d.ts.pnpm --filter @object-ui/i18n lint,pnpm --filter @object-ui/plugin-timeline lint: exit 0. Aseslint . --format json: 112 and 51 files, 0 errors. The 13 changed TS files are all in those sets, with 0 errors and 0 warnings. Rootpnpm lintisturbo run lint, the same per-packageeslint ., so these two runs are its narrowing to the packages this diff touches.eslint.config.jssets noparserOptions/projectService, so linting is not type-aware and this diff cannot change a verdict in another package. The full run is CI's.pnpm check:i18n-keys,check:i18n-drift,check:i18n-dead-keys: exit 0 before and after. Readings moved as predicted. Keys: the factory-defaults rows compared went from 969 to 968, all matching. Drift: "0 key(s) added, 1 removed". Dead keys: en pack keys from 3274 to 3273, candidates from 346 to 345, and thetimeline.bucketnamespace (1 needs-review,timeline.bucket.overdue) is gone from the report.pnpm check:new-line-citations(VERDICT ... 0 new citation(s)),check:control-bytes,check:changeset-claims,check:pending-changeset-literals,check:test-path-roots,check:vi-mock-specifiers,check:vi-mock-inherit,check:vi-mock-override-shape,check:unreferenced-sources,check:phantom-deps,check:esm-specifiers,check:published-dist: exit 0.node scripts/check-changeset-overwrite.mjs: exit 0, report-only. It reports the edit to.changeset/11676-timeline-past-bucket.mdas its case 2, a deliberate prose correction; the declared packages are unchanged.check-changeset-no-major,check-changeset-presence("1 changeset(s) added"),check-changeset-fixed: exit 0.check:eager-locale-cataloguesneeds a full console build. This diff removes one key and adds no catalogue to any eager closure. Left to CI.Ablation: one key back in one pack
On the committed tree,
node /home/user/objectstack/scripts/ablation-replace.mjsputoverdue: '已逾期',back undertimeline.bucketinzh.tsonly. It wrapped a vitest run of the card's pin,all-locales-key-parity.test.tsanden-zh-key-parity.test.ts. The prediction was 3 red: the new "no pack carries it" pin, "zh defines no key that en lacks", and "has no zh key absent from en". Observed:Test Files 3 failed (3),Tests 3 failed | 52 passed (55), exactly those three. The mutation landed on disk: anchor x1 to x0, replacement x0 to x1, blobc683b85fto753b9732, and the planted line counted 1 during the run. Restore: blobc683b85fequals HEAD,git diff HEADis empty, andgit statusis clean. The run read packs from source (the vitest alias maps@object-ui/i18ntopackages/i18n/src), so no rebuild was involved.The first attempt was a refused no-op. Its anchor, the
earlierline, also occurs inside the planted text, so the anchor count could not drop. The tool refused before running anything and proved the restore. The second attempt used the two-linebucket: {plusearlieranchor.Acceptance notes
pnpm check:published-distbuilds every published package (a 43-task turbo build, about 5 minutes) and ran outside the verify lock. It finished green and left the worktree clean.Generated by Claude Code