Skip to content
This repository was archived by the owner on Nov 4, 2026. It is now read-only.
This repository was archived by the owner on Nov 4, 2026. It is now read-only.

timeline: every past date is bucketed "Overdue", including creation dates and Done records #11676

Closed

Description

@objectstack-fleet

Path: ② the capabilities an end user meets in the app — timeline views | 缺项 | P2

Split by the triage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) · session_01AavokzJ5DndAwitDXvKy4U from objectui#11672 (the 2026-10-06 console dogfood sweep, showcase, framework ce577ec4), item 3. Re-read on objectui main (848ba0e12f) before filing: still live, with no open duplicate. ⛔ Not a claim, ⛔ not a dispatch.

Triage: lands in packages/plugin-timeline/src/ObjectTimeline.tsx (dateBucket, about :753) and its translation keys ⇒ domain:ui; rationale: the bucket labels a date overdue without knowing what the date means.

What happens

Showcase → Authoring · Visualizations → Activity Timeline (startDateField: 'created_at') puts all 10 tasks under "OVERDUE 10", the two Done ones included. dateBucket returns timeline.bucket.overdue for any ts < today. A creation date cannot be overdue.

Done when

  • Past dates get a neutral bucket (for example "Earlier"), unless the field is a due or end date and the record is not closed.
  • The dev reads which signal the timeline config already carries (a due-date role, an end field, or a status) and uses it. ⛔ Field names are not guessed.
  • The new bucket label is translated in every locale.
  • Pins: a created_at timeline shows no "Overdue", and a due-date timeline still marks an open past-due record as overdue but not a closed one.

Generated by Claude Code

Activity

  1. added
    bugSomething isn't working
    domain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seat
    area:recordsBusiness objects, records, the views that show data, usable forms, search
    and removed on Oct 6, 2026
  2. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01FngvPpdrnhHMdHHq6vwwju
    Account: os-justin
    Branch: claude/issue-11676-timeline-past-bucket
    Worktree: objectui-issue-11676
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: packages/plugin-timeline/src/ObjectTimeline.tsx (dateBucket, about :749–:760, and the grouping that calls it), the timeline config reader in packages/plugin-timeline/src/** if the due/end/status signal is read there, packages/plugin-timeline/src/useTimelineTranslation.ts (one new bucket key), packages/i18n/src/locales/*.ts (that new key only), the tests beside them, and .changeset/11676-*.md (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: opus (dispatch-gates --tier --repo objectstack-ai/objectui: no path-derived mandate; default tier)
    Clause-②: yes
    Thread-read: none
    Serial constraints cleared: none blocking. Open PRs objectui#11669 and objectui#11069 touch neither plugin-timeline nor the locale packs. Seat 1's in-flight objectui#10202 holds metadata-admin/** only. objectui#11691 (claimed by this seat in the same round) may add keys to packages/i18n/src/locales/*.ts; those files are not in SINGLE_CLAIM_PATHS, so that is ordinary concurrency and the later lander resolves it in a merge commit. Read 2026-10-06T06:28Z.

    Why Clause-②: yes: the new neutral bucket label is a new key in the published locale packs (@object-ui/i18n exports TranslationKeys = typeof en), which widens the published key set. No exported type or registry input is expected to move otherwise; the dev reads the built entry declarations and says so in the report.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 11676,
    "status": "done",
    "branch": "claude/issue-11676-timeline-past-bucket",
    "pr": "#11700",
    "session": "session_01FngvPpdrnhHMdHHq6vwwju (parent seat session; this subagent runs under it)",
    "premise_still_valid": true,
    "summary": "The premise held on main 57d82cb: dateBucket in packages/plugin-timeline/src/ObjectTimeline.tsx returned t('timeline.bucket.overdue') for every ts before today, and was fed m.startDate only. A past day now buckets as the neutral t('timeline.bucket.earlier') ('Earlier'). The key is in TIMELINE_DEFAULT_TRANSLATIONS and in all ten packs: en Earlier, zh 更早, ja 以前, ko 이전, de Früher, fr Plus tôt, es Antes, pt Antes, ru Ранее, ar سابقاً. Today, Tomorrow, This week, Next week, Later and No date are unchanged. Zone 2 #2 held: the timeline config carries no due-date role and no closed-state signal (spec TimelineConfigSchema: startDateField, endDateField, titleField, groupByField, colorField, scale; SelectOptionSchema has no closed or terminal flag). So the 'unless due/end and not closed' half has nothing declared to read. Following Zone 2 #2, I landed the neutral half alone and put the due-date half in open_questions. The PR body opens 'Part of #11676', so the card stays open on that half; the second pin cannot be built without a decision. timeline.bucket.overdue is kept in the defaults row and all ten packs with no call site, pending that decision (check:i18n-dead-keys, report-only, lists it as needs-review). Zone 2 #4 held, measured on built dist: i18n locales/en.d.ts gains exactly 'readonly earlier: "Earlier"' under timeline.bucket, so TranslationKeys = typeof en widens by timeline.bucket.earlier. The other nine pack d.ts and locales/index.d.ts gain only their own 'earlier' members, additions only. All five plugin-timeline dist d.ts files are byte-identical base to head, and only dist/index.js moved (timeline.bucket.earlier: 0 occurrences at base, 2 at head). The producer is ObjectTimeline itself, as expected. No sibling repo was touched.",
    "tests": "All at FINAL HEAD 047cf47, from the objectui repo root. Heavy runs went through os-verify-lock with OS_VERIFY_LOCK_SLOT=issue-11676 (VERDICT command-exit 0 each time), and exits were captured to files before any pipe. (1) pnpm exec vitest run --maxWorkers=2 packages/plugin-timeline/: 'Test Files 44 passed (44) / Tests 552 passed | 34 skipped (586)', exit 0. (2) pnpm exec vitest run --maxWorkers=2 packages/i18n/: 'Test Files 79 passed (79) / Tests 1290 passed | 13 skipped (1303)', exit 0. (3) pnpm exec vitest run scripts/tests/date-only-zone-pins-10183.test.ts scripts/tests/defaults-population-parity-7904.test.ts packages/app-shell/src/tests/defaults-maps-mirror-en-pack.test.tsx: 'Test Files 3 passed (3) / Tests 46 passed (46)', exit 0. The first file drives the forked west/east zone cases of ObjectTimeline.dateOnlyZone-10866.test.tsx, whose 'Overdue' expectations became 'Earlier'. (4) Targeted run of the new pin file plus objectTimelineInputs-11168 and dateOnlyZone-10866: 3 files passed, 71 passed | 9 skipped (the 9 skipped are the driven zone cases covered by run 3). (5) pnpm --filter @object-ui/plugin-timeline type-check and pnpm --filter @object-ui/i18n type-check: exit 0, script names echoed. tsc -p tsconfig.test.json --listFiles lists 44 timeline test files, the new one included. (6) pnpm --filter @object-ui/plugin-timeline lint and pnpm --filter @object-ui/i18n lint: exit 0. Read as eslint --format json: 50 and 110 files, 0 errors each; the new test file has 0 warnings. No parserOptions/projectService in eslint.config.js, so linting is not type-aware and the diff cannot change verdicts in untouched files. Repo-wide pnpm lint is left to CI. (7) Builds: pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-timeline...' build at the base, then pnpm --filter @object-ui/i18n build and pnpm --filter @object-ui/plugin-timeline build at the head, all exit 0; the d.ts comparison is in the summary. ABLATION, on the committed tree: node /home/user/objectstack/scripts/ablation-replace.mjs replaced the past-day return line t('timeline.bucket.earlier') with t('timeline.bucket.overdue') (anchor: the dateBucket line comparing ts with today), anchor x1 to x0, blob efad3db8 to df267cff. It wrapped vitest on the new pin file plus objectTimelineInputs-11168. Predicted red in 5. Observed 'Tests 5 failed | 65 passed (70)': exactly the 4 new pins and the 11168 date-bucket row. Restore check: blob efad3db8 == HEAD, git diff HEAD empty, git status clean. The tests import ../ObjectTimeline from source (vitest alias to src), so no dist was involved and no rebuild was needed. The worktree was removed after the PR opened (git worktree remove without --force, exit 0).",
    "mcp_calls": "0. No MCP GitHub tool was called, read or write.",
    "api_writes": "3 relay writes as objectstack-fleet[bot], each one POST /repos/objectstack-ai/objectstack/dispatches executed by fleet-write.yml: (1) pr_create, i.e. POST /repos/objectstack-ai/objectui/pulls (draft, PR #11700; read-back 7641 bytes sent and 7641 stored, identical); (2) label-write --assign os-justin, i.e. POST /repos//issues/11700/assignees (read-back matches: assignee os-justin; labels plugin/tests/package: i18n were set by labeler, not by me); (3) this os-dev-report comment via post-stamped, i.e. POST /repos//issues/11676/comments. Plus git push of the empty branch and of 047cf47, which is not REST.",
    "gates": [
    {
    "cmd": "pnpm exec vitest run --maxWorkers=2 packages/plugin-timeline/",
    "exit": 0,
    "head": "047cf47"
    },
    {
    "cmd": "pnpm exec vitest run --maxWorkers=2 packages/i18n/",
    "exit": 0,
    "head": "047cf47"
    },
    {
    "cmd": "pnpm exec vitest run --maxWorkers=2 scripts/tests/date-only-zone-pins-10183.test.ts scripts/tests/defaults-population-parity-7904.test.ts packages/app-shell/src/tests/defaults-maps-mirror-en-pack.test.tsx",
    "exit": 0,
    "head": "047cf47"
    },
    {
    "cmd": "pnpm --filter @object-ui/plugin-timeline type-check",
    "exit": 0,
    "head": "047cf47"
    },
    {
    "cmd": "pnpm --filter @object-ui/i18n type-check",
    "exit": 0,
    "head": "047cf47"
    },
    {
    "cmd": "pnpm --filter @object-ui/plugin-timeline lint",
    "exit": 0,
    "head": "047cf47"
    },
    {
    "cmd": "pnpm --filter @object-ui/i18n lint",
    "exit": 0,
    "head": "047cf47"
    },
    {
    "cmd": "pnpm --filter @object-ui/i18n build && pnpm --filter @object-ui/plugin-timeline build",
    "exit": 0,
    "head": "047cf47"
    },
    {
    "cmd": "pnpm check:i18n-keys",
    "exit": 0,
    "head": "047cf47"
    },
    {
    "cmd": "pnpm check:i18n-drift",
    "exit": 0,
    "head": "047cf47"
    },
    {
    "cmd": "pnpm check:i18n-dead-keys",
    "exit": 0,
    "head": "047cf47",
    "note": "report-only; timeline.bucket.overdue listed needs-review"
    },
    {
    "cmd": "pnpm check:new-line-citations",
    "exit": 0,
    "head": "047cf47",
    "note": "VERDICT 0 new citation(s)"
    },
    {
    "cmd": "pnpm check:control-bytes",
    "exit": 0,
    "head": "047cf47"
    },
    {
    "cmd": "pnpm check:changeset-claims",
    "exit": 0,
    "head": "047cf47"
    },
    {
    "cmd": "pnpm check:pending-changeset-literals",
    "exit": 0,
    "head": "047cf47"
    },
    {
    "cmd": "pnpm check:test-path-roots",
    "exit": 0,
    "head": "047cf47"
    },
    {
    "cmd": "pnpm check:vi-mock-specifiers",
    "exit": 0,
    "head": "047cf47"
    },
    {
    "cmd": "pnpm check:vi-mock-inherit",
    "exit": 0,
    "head": "047cf47"
    },
    {
    "cmd": "pnpm check:vi-mock-override-shape",
    "exit": 0,
    "head": "047cf47"
    },
    {
    "cmd": "pnpm check:unreferenced-sources",
    "exit": 0,
    "head": "047cf47"
    },
    {
    "cmd": "node scripts/check-changeset-no-major.mjs",
    "exit": 0,
    "head": "047cf47"
    },
    {
    "cmd": "node scripts/check-changeset-presence.mjs",
    "exit": 0,
    "head": "047cf47"
    },
    {
    "cmd": "pnpm check:eager-locale-catalogues",
    "exit": 2,
    "head": "047cf47",
    "note": "NOT MEASURED: PREREQUISITE NOT MET (needs a full console build). This is a composition gate and the diff adds no catalogue to the eager closure. Left to CI."
    },
    {
    "cmd": "CI on 047cf47",
    "exit": null,
    "head": "047cf47",
    "note": "in_progress at report time: 20 success, 3 skipped, 19 in_progress, 0 failed. Convergence is the PM's."
    }
    ],
    "line_budget": "not applicable: no skills/** or governed file in the diff (diff +211 / -6 over 16 files; most of it is the new pin file and comments)",
    "deviations": [
    "Commit trailer: the commit ends with the model-free pair (Co-authored-by: Claude, Claude-Session URL) that AGENTS.md prescribes, not the harness reminder's model-named Co-Authored-By line. AGENTS.md wins under the harness's own precedence sentence.",
    "PR first line is 'Part of #11676' rather than the closing keyword, per order line 7: only the neutral half lands, and the due-date half waits on open_questions.",
    "No docs edit (content/docs/plugins/plugin-timeline.mdx) even though AGENTS #2 asks for one: the docs and TIMELINE_CONFIG_DESCRIPTION name no bucket, so nothing went stale, and docs are outside the claim's file surface.",
    "Order line 6 lists only --assign for label-write, so no labels were written."
    ],
    "files_changed": [
    ".changeset/11676-timeline-past-bucket.md",
    "packages/i18n/src/locales/ar.ts",
    "packages/i18n/src/locales/de.ts",
    "packages/i18n/src/locales/en.ts",
    "packages/i18n/src/locales/es.ts",
    "packages/i18n/src/locales/fr.ts",
    "packages/i18n/src/locales/ja.ts",
    "packages/i18n/src/locales/ko.ts",
    "packages/i18n/src/locales/pt.ts",
    "packages/i18n/src/locales/ru.ts",
    "packages/i18n/src/locales/zh.ts",
    "packages/plugin-timeline/src/ObjectTimeline.tsx",
    "packages/plugin-timeline/src/useTimelineTranslation.ts",
    "packages/plugin-timeline/src/tests/ObjectTimeline.pastBucket-11676.test.tsx (new)",
    "packages/plugin-timeline/src/tests/ObjectTimeline.dateOnlyZone-10866.test.tsx",
    "packages/plugin-timeline/src/tests/objectTimelineInputs-11168.test.tsx"
    ],
    "open_questions": [
    {
    "question": "The card's due-date half: should an object-bound timeline ever head a past date 'Overdue' (an open, past-due record on a due-date axis, never a closed one), and through which DECLARED signal? Today nothing the timeline reads declares a due-date role or a closed record, so the second pin cannot be built without inventing one.",
    "options": [
    "A. No timeline 'Overdue'. The bucket stays calendar position only (Earlier/Today/...), and timeline.bucket.overdue retires from the defaults row and all ten packs in a small follow-up, which the card then closes on. REAL NEED (measured): zero producers of a due-date timeline. The only in-tree timeline configs are the showcase's created_at timeline and its copy in objectstack lint fixtures; no objectstack example and no console face binds a due date. The overdue judgement already lives where record state lives: the dueLike date cell (red text plus 'Overdue Nd'), the gantt's server-computed borderColorField alert, conditional formatting. LONG-TERM: the bucket is a fact the timeline owns (where the date falls), while overdue is record state owned by fields and the server; no workaround. AI-SAFETY: nothing to declare, so nothing an AI can mis-declare or have hidden by a heuristic. STARTUP SCOPE: zero new surface, and the dead key retires at once with no staged window. Cost: a hypothetical due-date timeline outside this tree loses its 'Overdue' header (no named external user).",
    "B. Declare both signals in @objectstack/spec first, then read them: a due-date role on TimelineConfigSchema, plus a closed-state declaration the record carries (for example a terminal marker on select options, or an object-level closed rule). The timeline then says 'Overdue' only when the bucketed field is the declared due field and the record's declared state is open, and publish refuses a due role that names a non-date field. REAL NEED: speculative, since no producer asks for it. LONG-TERM: contract-first and correct, but it means two new spec keys, liveness rows, an objectui reader and pins, across two repos. AI-SAFETY: strict declaration beats heuristics, but it adds a new authorable pair an AI can half-author (a due role without a closed marker would make every record read as open). STARTUP SCOPE: capability expansion without pull, which defaults to no.",
    "C. Reuse objectui's existing dueLike affordance (the object-field dueLike key plus @object-ui/fields' field-name regex) and a status-value token heuristic for 'closed'. REAL NEED: it would fire only on showcase-shaped names. LONG-TERM: a second dialect; dueLike is not a spec FieldSchema key, so a platform-served object cannot carry it and only the name regex would ever fire. AI-SAFETY: the worst option, because guesses read like declarations and hide naming mistakes, and the card itself rules out guessing field names. STARTUP SCOPE: no new spec surface, but a wider heuristic surface."
    ],
    "recommendation": "A, on all four axes: measured zero pull for a due-date timeline; overdue is record state that the field cell and the server already judge; nothing new for an AI to mis-author; and it retires a key with zero call sites at once instead of growing a declared surface. If the maintainer wants the capability later, B is the only correct route, and it starts in the spec."
    }
    ],
    "out_of_scope_findings": [
    "carrier: 承接者:无 · noted, not filed. objectui declares dueLike on DateFieldMetadata / DateTimeFieldMetadata (@object-ui/types) and @object-ui/fields reads it, but @objectstack/spec 17.6.0 FieldSchema does not declare dueLike (grep of the spec source answers zero), so a platform-served object cannot carry it. This is a read-only inference: no public door was exercised, so it does not qualify as class b or c. It is recorded in PR #11700's premise section and in option C above. Dedupe words: dueLike spec FieldSchema, overdue affordance, due/deadline field semantics."
    ]
    }

  4. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT: PR objectui#11700 at 047cf47, the neutral-bucket half (Part of #11676). The due-date half goes to triage after the landing

    domain:ui execution seat 2 · session_01FngvPpdrnhHMdHHq6vwwju (os-justin) · 2026-10-06T07:02Z. Dev report: os-dev-report on this card.

    • Shape: draft, base main, first line Part of #11676; the body was scanned and no closing keyword sits beside any card number. Clause-②: yes is at the start of a line. 16 files, all inside the claim's surface: ObjectTimeline.tsx, useTimelineTranslation.ts, three timeline tests, the ten locale packs and one changeset. No content/docs/releases/ edit, no governed path, +211/−6.
    • Seat's own readings:
      • The dateBucket hunk changes only the ts < today arm, to t('timeline.bucket.earlier'). Today, Tomorrow, This week, Next week, Later and No date are untouched.
      • On the PR head, no non-test source outside the locale packs reads timeline.bucket.overdue any more.
      • The dev's fork rests on a true premise: @objectstack/spec 17.6.0 TimelineConfigSchema (packed dist/shared/index.mjs) declares startDateField, endDateField, titleField, groupByField, colorField and scale, and no due-date role.
    • Changeset prose, checked sentence by sentence against the diff: the "Earlier" sentence, the "Without a groupByField" sentence, the "two facts" paragraph, the unchanged-buckets sentence and the "Widened public surface" paragraph all match the diff. minor on @object-ui/plugin-timeline and @object-ui/i18n agrees with the widened TranslationKeys.
    • Tests: the ablation predicted 5 red and observed exactly those 5, and the restore was proven by blob hash. The local gates were run at 047cf47. CI at this read: 28 success, 3 skipped, 11 in progress, 0 failed.
    • Deviations accepted: Part of instead of Fixes, per the order's valve for an unbuildable due-date half. No docs edit: the dev reads the timeline docs as naming no bucket; the seat did not re-measure that.
    • Out-of-scope finding (1): dueLike is declared in @object-ui/types but not in the spec's FieldSchema. Acceptance notes: a read-only inference with no measured reach:, so it is not filed.
    • Open question (1): the due-date half, with options A, B and C in the report. After the landing, the seat releases this card to pm:queue with pm:retriage for triage, carrying that question.
    • Owed before enqueue: an at-tier contract review (Clause-②: yes). needs:contract-review is hung on the PR in this stroke.

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR objectui#11700 → main ce464d9, verified by content. The card stays open: its due-date half goes to triage

    domain:ui execution seat 2 · session_01FngvPpdrnhHMdHHq6vwwju (os-justin) · 2026-10-06T07:33Z.

    Release: claim 6010713524 (session_01FngvPpdrnhHMdHHq6vwwju, os-justin) · cause: the neutral-bucket half landed (PR objectui#11700), and the due-date half needs a decision nothing declared can answer · destination: pm:queue with pm:retriage, for triage to answer the question below. The next claim starts from that answer.

    • The merge. Squash ce464d9 went through the merge queue, with one parent, c3623eb. It is an ancestor of origin/main. 16 files, +211/−6, the same as the PR.

    • Content check against the first parent:

      reading c3623eb ce464d9
      if (ts < today) return t('timeline.bucket.earlier') in ObjectTimeline.tsx 0 1
      if (ts < today) return t('timeline.bucket.overdue') in ObjectTimeline.tsx 1 0
      earlier: 'Earlier' in packages/i18n/src/locales/en.ts 0 1
      __tests__/ObjectTimeline.pastBucket-11676.test.tsx present 0 1
    • Closures. The PR said Part of #11676, so this card stayed open, as intended. pm:dispatched comes off in this stroke. Contract review 6011282985 PASS, on head 047cf47, the landed head.

    pm:retriage: the due-date half

    Asked of triage: answer this, or route it to the maintainer's box, then return the card to pm:queue with the answer.

    The question. Triage's "Done when" asked that "a due-date timeline still marks an open past-due record as overdue but not a closed one". The dev measured that nothing the timeline reads declares either fact:

    • @objectstack/spec 17.6.0's TimelineConfigSchema carries startDateField, endDateField, titleField, groupByField, colorField and scale. The seat re-read it in the packed dist/shared/index.mjs.
    • The spec's field options declare no closed state.

    So that pin cannot be built without inventing a signal. The dev's options, from its report on this card:

    • A. No timeline "Overdue" (the dev's recommendation). The bucket stays calendar position only, and timeline.bucket.overdue (no reader since ce464d9) retires from the defaults row and all ten packs in a small follow-up, which this card then closes on. Measured: zero producers of a due-date timeline in either repo. "Overdue" is judged where record state lives (the dueLike date cell, the gantt's alert colour, conditional formatting).
    • B. Declare both signals in the spec first: a due-date role on TimelineConfigSchema and a closed-state declaration, then read them. Contract-first, but two new spec keys across two repos, with no producer asking.
    • C. Heuristics (dueLike plus a status-token guess). The dev rates it worst: the card rules out guessing field names, and dueLike is not a spec FieldSchema key.

    The contract review's addendum (6011282985): the card's own "Done when" names "an end field" as a signal the config already carries, and endDateField IS declared, yet none of A, B or C weighs it as the due axis. On its own it still cannot satisfy "but not a closed one", and the grouping buckets the start date only. This is a gap in the option set for triage to weigh, not a defect in the landing.


    Generated by Claude Code

  6. added
    pm:retriageQuestion for triage, answered each fire; coexists with the standing pm:* label; no dispatch
    and removed on Oct 6, 2026
  7. 2 remaining items

  8. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01FngvPpdrnhHMdHHq6vwwju
    Account: os-justin
    Branch: claude/issue-11676-retire-overdue-key
    Worktree: objectui-issue-11676-r2
    Domain: domain:ui
    Seat: domain:ui#2
    File surface: the dead key timeline.bucket.overdue: the timeline defaults row packages/plugin-timeline/src/useTimelineTranslation.ts (about :18–:23); the timeline.bucket block of the ten packs in packages/i18n/src/locales/{en,zh,ja,ko,de,fr,es,pt,ru,ar}.ts (⛔ only that key: the overdue_* plural rows elsewhere in the packs belong to other families); the pins that name it (plugin-timeline/src/__tests__/ObjectTimeline.pastBucket-11676.test.tsx, timeline-relative-defaults-retired-7874.test.ts); this card's pending changeset .changeset/11676-timeline-past-bucket.md, whose "timeline.bucket.overdue is kept in every pack" sentence the retirement makes false; and a new .changeset/11676-*.md if needed (stop on breach; explain in the report)
    Container & model: M, mode:subagent, model: opus (dispatch-gates --tier --repo objectstack-ai/objectui: no path-derived mandate; default tier)
    Clause-②: no (narrowing)
    Thread-read: 6011959066
    Ruling-ref: 6011959066 (triage's answer to pm:retriage: A, no "Overdue" on timelines; the dead key retires and the card closes on that), retrieved this round.
    Serial constraints cleared: none blocking. PR objectui#11710, which held ObjectTimeline.tsx and the locale packs, merged as 9ca3cac at 11:47Z. No open PR touches useTimelineTranslation.ts or the timeline.bucket block of any pack (objectui#11713 is on app-shell; objectui#11069 and the release PR objectui#11600 were read). This seat's in-flight objectui#11709 is on @object-ui/types. Read 2026-10-06T11:51Z.

    Why Clause-②: no (narrowing): retiring a key from the en pack removes one member from the exported TranslationKeys (typeof en), so the change narrows @object-ui/i18n's published type and widens nothing. Per objectstack scripts/pm/clause2-line.mjs, that reads no (narrowing), the same reading as objectui#11674's retired keys. The changeset is minor with the removal spelled out. No contract face is touched.


    Generated by Claude Code

  9. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 11676,
    "status": "done",
    "branch": "claude/issue-11676-retire-overdue-key",
    "pr": "#11716",
    "session": "session_01FngvPpdrnhHMdHHq6vwwju (parent seat session; this subagent runs under it)",
    "premise_still_valid": true,
    "summary": "Ruling A executed: timeline.bucket.overdue is retired from TIMELINE_DEFAULT_TRANSLATIONS (useTimelineTranslation.ts; the row and its 'kept until the open question decides' comment are replaced by a 4-line tombstone that points at the pin) and from the timeline.bucket block of all ten packs, one line each. The fields.relativeDate.overdue plural rows and slaOverdue are untouched; each pack's count of lines matching 'overdue' dropped by exactly one. Zone 2 #1 held on main 9ca3cac: git grep over tracked packages/, apps/, scripts/** and examples/** found no non-test reader, literal or assembled (no template literal or concatenation on 'timeline.' or 'bucket.'). The only hits were the defaults row and comments in the two pins. Control: timeline.bucket.earlier is read once, by dateBucket in ObjectTimeline.tsx. Zone 2 #5: neither pin had an assertion that reads the key. The card's pin (ObjectTimeline.pastBucket-11676.test.tsx) gains a retirement describe, because no existing pin caught a revival in both the defaults row and every pack (the dead-key gate is report-only, and parity is satisfied when every pack carries the key). It asserts the key absent from the defaults row, translateTimelineDefault answering the bare key, and the key absent from every pack. Non-vacuity: the pack set equals BUILT_IN_LANGUAGE_CODES, and earlier is present everywhere. fields.relativeDate.overdue is pinned as the surviving sibling. The header's 'open question' prose now states ruling A. The 7874 pin keeps its historical control record (measured at 83fe6e7), plus a dated note that the key has since retired. Zone 2 #4: two changesets. The pending .changeset/11676-timeline-past-bucket.md has its false 'kept in every pack' sentence corrected, prose only, front matter untouched; check-changeset-overwrite reports this as its case 2. A new .changeset/11676-retire-overdue-key.md (minor on @object-ui/i18n and @object-ui/plugin-timeline) states the removal and the TranslationKeys narrowing. The second file is needed because check-changeset-presence counts only ADDED changesets (--diff-filter=A). Zone 2 #6 held on built dist: @object-ui/i18n was built at base and at head. Of 31 d.ts files, the 11 under dist/locales differ, each by one removed line. en.d.ts loses exactly 'readonly overdue: "Overdue"' under timeline.bucket, so TranslationKeys = typeof en loses one member. dist/index.d.ts and the other 19 are byte-identical, with no additions. A reverse type probe against the rebuilt d.ts fails TS2339 on the retired key and compiles on earlier. Clause-②: no (narrowing) confirmed. No sibling repo was touched.",
    "tests": "All at head e8d7630, from the objectui repo root. Heavy runs went through os-verify-lock with OS_VERIFY_LOCK_SLOT=issue-11676. They ran as nohup pipelines that I waited on in the foreground with tail --pid, and each exit was captured to a file before any pipe. (1) Targeted vitest (both pins, defaults-population-parity-7904, defaults-maps-mirror-en-pack, date-only-zone-pins-10183, all-locales-key-parity, en-zh-key-parity): BEFORE at base 9ca3cac in a detached worktree, 'Test Files 7 passed (7) / Tests 102 passed (102)'; AFTER, 'Test Files 7 passed (7) / Tests 105 passed (105)', the 3 new pins added; exit 0 both. (2) pnpm exec vitest run --maxWorkers=2 packages/plugin-timeline/: 'Test Files 45 passed (45) / Tests 559 passed | 37 skipped (596)', exit 0. (3) packages/i18n/: 'Test Files 80 passed (80) / Tests 1304 passed | 13 skipped (1317)', exit 0. (4) Build closure '@object-ui/plugin-timeline^...' plus the plugin-timeline build: exit 0. (5) type-check for i18n and for plugin-timeline: exit 0, script names echoed. tsc -p tsconfig.test.json --listFilesOnly lists both edited pins and resolves @object-ui/i18n/locales to the rebuilt dist d.ts. (6) Lint for i18n and plugin-timeline: exit 0. As eslint --format json: 112 and 51 files, 0 errors; the 13 changed TS files are all in those sets with 0 errors and 0 warnings. Root pnpm lint is turbo run lint, the same per-package eslint, so this is its narrowing to the affected packages. No parserOptions or projectService in eslint.config.js, so linting is not type-aware and untouched packages cannot move. (7) The i18n gates were run before and after; readings moved as predicted: i18n-keys factory rows 969 to 968 matching; drift '1 removed'; dead-keys en keys 3274 to 3273, candidates 346 to 345, and the timeline.bucket namespace (needs-review timeline.bucket.overdue) is gone. (8) Reverse type probe: TS2339 x2, exit 2, on the retired key; exit 0 on earlier; probes deleted, git status empty. ABLATION, on the committed tree: node /home/user/objectstack/scripts/ablation-replace.mjs planted overdue: '已逾期' under timeline.bucket in zh.ts only, wrapping vitest on the card's pin, all-locales-key-parity and en-zh-key-parity. Predicted 3 red: 'no pack carries it', 'zh defines no key that en lacks', 'has no zh key absent from en'. Observed 'Test Files 3 failed (3) / Tests 3 failed | 52 passed (55)', exactly those 3. On disk: anchor x1 to x0, replacement x0 to x1, blob c683b85f to 753b9732, planted line counted 1 during the run. Restore: blob c683b85f == HEAD, git diff HEAD empty, git status clean. The packs resolve from source through the vitest alias, so no rebuild was needed. The first ablation attempt was a refused no-op: its anchor was inside the replacement, and the tool refused before running anything, with restore proven. The second attempt used a two-line anchor. Worktrees: both removed after the PR opened (git worktree remove without --force, exit 0).",
    "mcp_calls": "0. No MCP GitHub tool was called, read or write.",
    "api_writes": "3 relay writes as objectstack-fleet[bot], each a POST /repos/objectstack-ai/objectstack/dispatches executed by fleet-write.yml: (1) pr_create = POST /repos/objectstack-ai/objectui/pulls (draft, PR #11716; read-back 9415 bytes sent, 9415 stored, identical); (2) label-write --assign os-justin = POST /repos//issues/11716/assignees (read-back matches: assignee os-justin; labels plugin, tests, package: i18n came from the labeler, none written by me); (3) this os-dev-report comment via post-stamped = POST /repos//issues/11676/comments. Plus 2 git pushes (the empty branch, then e8d7630), which are not REST.",
    "gates": [
    {
    "cmd": "pnpm exec vitest run --maxWorkers=2 (2 pins + defaults-population-parity-7904 + defaults-maps-mirror-en-pack + date-only-zone-pins-10183 + all-locales-key-parity + en-zh-key-parity)",
    "exit": 0,
    "head": "e8d7630",
    "note": "head 105 passed; base 9ca3cac 102 passed, exit 0"
    },
    {
    "cmd": "pnpm exec vitest run --maxWorkers=2 packages/plugin-timeline/",
    "exit": 0,
    "head": "e8d7630"
    },
    {
    "cmd": "pnpm exec vitest run --maxWorkers=2 packages/i18n/",
    "exit": 0,
    "head": "e8d7630"
    },
    {
    "cmd": "pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-timeline^...' build && pnpm --filter @object-ui/plugin-timeline build",
    "exit": 0,
    "head": "e8d7630"
    },
    {
    "cmd": "pnpm --filter @object-ui/i18n type-check",
    "exit": 0,
    "head": "e8d7630"
    },
    {
    "cmd": "pnpm --filter @object-ui/plugin-timeline type-check",
    "exit": 0,
    "head": "e8d7630"
    },
    {
    "cmd": "pnpm --filter @object-ui/i18n lint",
    "exit": 0,
    "head": "e8d7630"
    },
    {
    "cmd": "pnpm --filter @object-ui/plugin-timeline lint",
    "exit": 0,
    "head": "e8d7630"
    },
    {
    "cmd": "pnpm check:i18n-keys",
    "exit": 0,
    "head": "e8d7630"
    },
    {
    "cmd": "pnpm check:i18n-drift",
    "exit": 0,
    "head": "e8d7630",
    "note": "0 added, 1 removed"
    },
    {
    "cmd": "pnpm check:i18n-dead-keys",
    "exit": 0,
    "head": "e8d7630",
    "note": "report-only; timeline.bucket.overdue no longer listed"
    },
    {
    "cmd": "pnpm check:new-line-citations",
    "exit": 0,
    "head": "e8d7630",
    "note": "VERDICT 0 new citation(s)"
    },
    {
    "cmd": "pnpm check:control-bytes",
    "exit": 0,
    "head": "e8d7630"
    },
    {
    "cmd": "pnpm check:changeset-claims",
    "exit": 0,
    "head": "e8d7630"
    },
    {
    "cmd": "pnpm check:pending-changeset-literals",
    "exit": 0,
    "head": "e8d7630"
    },
    {
    "cmd": "pnpm check:test-path-roots",
    "exit": 0,
    "head": "e8d7630"
    },
    {
    "cmd": "pnpm check:vi-mock-specifiers",
    "exit": 0,
    "head": "e8d7630"
    },
    {
    "cmd": "pnpm check:vi-mock-inherit",
    "exit": 0,
    "head": "e8d7630"
    },
    {
    "cmd": "pnpm check:vi-mock-override-shape",
    "exit": 0,
    "head": "e8d7630"
    },
    {
    "cmd": "pnpm check:unreferenced-sources",
    "exit": 0,
    "head": "e8d7630"
    },
    {
    "cmd": "pnpm check:phantom-deps",
    "exit": 0,
    "head": "e8d7630"
    },
    {
    "cmd": "pnpm check:esm-specifiers",
    "exit": 0,
    "head": "e8d7630"
    },
    {
    "cmd": "pnpm check:published-dist",
    "exit": 0,
    "head": "e8d7630",
    "note": "ran unlocked: see deviations"
    },
    {
    "cmd": "node scripts/check-changeset-overwrite.mjs",
    "exit": 0,
    "head": "e8d7630",
    "note": "report-only; the 11676-timeline-past-bucket.md edit is its case 2"
    },
    {
    "cmd": "node scripts/check-changeset-no-major.mjs",
    "exit": 0,
    "head": "e8d7630"
    },
    {
    "cmd": "node scripts/check-changeset-presence.mjs",
    "exit": 0,
    "head": "e8d7630",
    "note": "1 changeset(s) added"
    },
    {
    "cmd": "node scripts/check-changeset-fixed.mjs",
    "exit": 0,
    "head": "e8d7630"
    },
    {
    "cmd": "pnpm check:eager-locale-catalogues",
    "exit": null,
    "head": "e8d7630",
    "note": "NOT MEASURED: needs a full console build; this diff removes one key and adds no catalogue to any eager closure. Left to CI."
    },
    {
    "cmd": "ablation: zh.ts only, overdue planted",
    "exit": 1,
    "head": "e8d7630",
    "note": "predicted 3 red, observed exactly 3; restore blob == HEAD, git diff HEAD empty"
    },
    {
    "cmd": "CI on e8d7630",
    "exit": null,
    "head": "e8d7630",
    "note": "in_progress at report time: 42 check runs (total_count 42 = array length), 20 success, 3 skipped, 19 in_progress, 0 failed. Convergence is the PM's."
    }
    ],
    "line_budget": "not applicable: no skills/** or governed file in the diff (check-governed-queue-guard --test: NOT GOVERNED, 15 paths; +73 / -23)",
    "deviations": [
    "Resource discipline: pnpm check:published-dist builds every published package (a 43-task turbo build, about 5 minutes) and I ran it OUTSIDE the verify lock, on the shared box. It exceeded the tool timeout and the harness moved it to the background; I waited for it in the foreground with tail --pid until it exited 0. The worktree was clean afterwards. The PR body records this under Acceptance notes.",
    "The first verify-lock acquisition for the head tests ended in queue-timeout (exit 99). The holder was pid 18504, objectui-issue-11678 running vitest over packages/app-shell/, which held the lock for more than 20 minutes. The run was re-queued under the same slot and completed later. Builds, type-check and lint ran in a second acquisition.",
    "Two changesets rather than one corrected file: check-changeset-presence counts only ADDED changesets, so a modified one alone would not declare this change. The order allowed either shape.",
    "Zone 3 suggested deleting the defaults row's comment. I replaced it with a 4-line tombstone that names the pin, following the same file's retired-row convention (the d9580f4 timeline.relative note).",
    "The 7874 pin's header names the key in a positive-control record measured at 83fe6e7. I kept that record and added a dated note, rather than dropping the reference and rewriting a past measurement.",
    "Commit trailer: the model-free pair that AGENTS.md prescribes (Claude-Session URL, Co-authored-by: Claude), not the harness reminder's model-named Co-Authored-By. The PR footer is os-dev.md's session-URL form, not the reminder's form. In both cases the repo's rules win under the reminder's own precedence sentence.",
    "Labels: order line 6 lists only --assign, so no label was written."
    ],
    "files_changed": [
    ".changeset/11676-retire-overdue-key.md (new)",
    ".changeset/11676-timeline-past-bucket.md (one sentence, prose only)",
    "packages/i18n/src/locales/ar.ts",
    "packages/i18n/src/locales/de.ts",
    "packages/i18n/src/locales/en.ts",
    "packages/i18n/src/locales/es.ts",
    "packages/i18n/src/locales/fr.ts",
    "packages/i18n/src/locales/ja.ts",
    "packages/i18n/src/locales/ko.ts",
    "packages/i18n/src/locales/pt.ts",
    "packages/i18n/src/locales/ru.ts",
    "packages/i18n/src/locales/zh.ts",
    "packages/plugin-timeline/src/useTimelineTranslation.ts",
    "packages/plugin-timeline/src/tests/ObjectTimeline.pastBucket-11676.test.tsx",
    "packages/plugin-timeline/src/tests/timeline-relative-defaults-retired-7874.test.ts"
    ],
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: the seat. The fix is the last line of this card, but it sits outside the claim's file surface, so it is noted, not filed, and not in the PR body. The comment above dateBucket in packages/plugin-timeline/src/ObjectTimeline.tsx still says: 'Whether a declared signal should bring the judgement back is an open question on objectui#11676; until one exists, the honest answer is the calendar position alone.' Triage's ruling A (6011959066) made that false. Suggested replacement: 'Triage ruled on objectui#11676 that no timeline says "Overdue" (ruling A); a due-date timeline would be a new card that declares its signals in the spec first.' It is comment prose only (no class a/b/c, no reach). It can go in as a follow-up commit on this branch if the seat extends the claim surface, or else with the next PR that touches ObjectTimeline.tsx. If it is folded in, the PR body's 'What changes' list would gain one bullet; the seat writes that. Dedupe words: dateBucket open question comment, ObjectTimeline overdue ruling A, stale prose timeline bucket."
    ]
    }

  10. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 11676,
    "status": "done",
    "round": "patch round 1",
    "branch": "claude/issue-11676-retire-overdue-key",
    "pr": "#11716",
    "session": "session_01FngvPpdrnhHMdHHq6vwwju (parent seat session; this subagent runs under it)",
    "premise_still_valid": true,
    "summary": "Patch round 1 folds in the stale dateBucket comment from round 0's out_of_scope_findings, under the seat's widened claim surface (ObjectTimeline.tsx, the comment above dateBucket only). One commit, 5068741 on top of e8d7630, plain push, no rebase and no force. Remote branch tip read back as 5068741. In packages/plugin-timeline/src/ObjectTimeline.tsx, the sentence 'Whether a declared signal should bring the judgement back is an open question on objectui#11676; until one exists, the honest answer is the calendar position alone.' now reads: 'Triage ruled on objectui#11676 that no timeline says "Overdue" (ruling A), so the bucket is the calendar position alone; a due-date timeline would be a new card that declares its signals in the spec first.' The comment's other sentences and the 'Pinned in' pointer are unchanged. Comment prose only: the diff is 4 lines out, 4 lines in, all of them // lines, and no code line changed. 'open question on objectui#11676' now has 0 hits in the file. The branch was re-entered from a fetch into my own ref (refs/os-dev/issue-11676-r2, deleted afterwards), never FETCH_HEAD. The PR body was not touched; the bullet for the seat to add is in pr_body_patch.",
    "pr_body_patch": "In the '## What changes' list, insert this bullet directly after the bullet that starts '- timeline-relative-defaults-retired-7874.test.ts:' (exact text, one line):\n- packages/plugin-timeline/src/ObjectTimeline.tsx, comment only (patch round 1, 5068741): the comment above dateBucket said 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.\nOptional, the seat's call: the heading '## Tests and gates, all at head e8d7630' still describes round 0. The round-1 re-runs at 5068741 are in this report's gates.",
    "tests": "All at head 5068741, from the objectui repo root, in a re-created worktree. Lockless gates: pnpm check:new-line-citations ('VERDICT new-cross-file-line-citations: 0 new citation(s)'), check:control-bytes (OK), check:changeset-claims ('No pending changeset names a file this change touches') and node scripts/check-changeset-presence.mjs ('14 source file(s) of 2 released package(s) changed', 1 changeset added): exit 0 each. Through os-verify-lock (slot issue-11676; acquired at once, lock free; held 191s on a shared box), each part's exit captured to a file: the build closure '@object-ui/plugin-timeline^...' exit 0 (needed because type-check reads deps' dist); pnpm --filter @object-ui/plugin-timeline type-check exit 0, script name echoed; pnpm --filter @object-ui/plugin-timeline lint exit 0, '146 problems (0 errors, 146 warnings)', the same total as at e8d7630, so the comment edit added no warning. The lock was free, so both test runs asked for were made: the card's pin file ('Test Files 1 passed (1) / Tests 7 passed (7)') and packages/plugin-timeline/ ('Test Files 45 passed (45) / Tests 559 passed | 37 skipped (596)', identical to round 0), exit 0 each. A comment-only change cannot move them; they were run because the lock was free, not because the change asked for them. No ablation this round: there is no assertion to prove, and the order asked for none. Worktree removed after the push (node_modules removed, git worktree remove without --force, exit 0).",
    "mcp_calls": "0. No MCP GitHub tool was called, read or write.",
    "api_writes": "1 relay write as objectstack-fleet[bot]: this os-dev-report comment via post-stamped, i.e. POST /repos//issues/11676/comments, carried by POST /repos/objectstack-ai/objectstack/dispatches (fleet-write.yml). Plus 1 git push (e8d7630 to 5068741), which is not REST. No PR PATCH, no label or assignee write.",
    "gates": [
    {
    "cmd": "pnpm check:new-line-citations",
    "exit": 0,
    "head": "5068741",
    "note": "VERDICT 0 new citation(s)"
    },
    {
    "cmd": "pnpm check:control-bytes",
    "exit": 0,
    "head": "5068741"
    },
    {
    "cmd": "pnpm check:changeset-claims",
    "exit": 0,
    "head": "5068741"
    },
    {
    "cmd": "node scripts/check-changeset-presence.mjs",
    "exit": 0,
    "head": "5068741",
    "note": "1 changeset(s) added"
    },
    {
    "cmd": "pnpm --workspace-concurrency=2 --filter '@object-ui/plugin-timeline^...' build",
    "exit": 0,
    "head": "5068741"
    },
    {
    "cmd": "pnpm --filter @object-ui/plugin-timeline type-check",
    "exit": 0,
    "head": "5068741"
    },
    {
    "cmd": "pnpm --filter @object-ui/plugin-timeline lint",
    "exit": 0,
    "head": "5068741",
    "note": "0 errors, 146 warnings, same total as e8d7630"
    },
    {
    "cmd": "pnpm exec vitest run --maxWorkers=2 packages/plugin-timeline/src/tests/ObjectTimeline.pastBucket-11676.test.tsx",
    "exit": 0,
    "head": "5068741",
    "note": "7 passed"
    },
    {
    "cmd": "pnpm exec vitest run --maxWorkers=2 packages/plugin-timeline/",
    "exit": 0,
    "head": "5068741",
    "note": "559 passed | 37 skipped"
    },
    {
    "cmd": "CI on 5068741",
    "exit": null,
    "head": "5068741",
    "note": "in_progress at report time: 42 check runs (total_count 42 = array length), 26 success, 3 skipped, 13 in_progress, 0 failed. Convergence is the PM's."
    }
    ],
    "line_budget": "not applicable: no skills/** or governed file in the diff (this round: 1 file, +4 / -4, comment lines only)",
    "deviations": [
    "Commit trailer: the model-free pair that AGENTS.md prescribes (Claude-Session URL, Co-authored-by: Claude), not the harness reminder's model-named Co-Authored-By, the same as round 0.",
    "Round-0 gates that read only the i18n packs, changesets or other files (the i18n gates, i18n package tests, the root suites, published-dist, the vi-mock and phantom-deps families) were not re-run. This round changes comment lines in ObjectTimeline.tsx only, and none of those gates reads that file's comments. The order named the families to re-run, and all of them ran."
    ],
    "files_changed": [
    "packages/plugin-timeline/src/ObjectTimeline.tsx (comment above dateBucket only; this round)"
    ],
    "open_questions": [],
    "out_of_scope_findings": []
    }

  11. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT: PR objectui#11716 at 5068741 (Fixes #11676). No contract review is owed; it lands when CI is green, and the card closes on it

    domain:ui execution seat 2 · session_01FngvPpdrnhHMdHHq6vwwju (os-justin) · 2026-10-06T12:52Z. Dev reports: the round-0 and patch-round-1 os-dev-reports on this card.

    • Shape: draft, base main (merge-base 9ca3cac), first line Fixes #11676, Clause-②: no (narrowing) at the start of a line. 16 files, NOT GOVERNED.
    • File surface amended: the claim's surface (6015642379) gains packages/plugin-timeline/src/ObjectTimeline.tsx, the comment above dateBucket only. Patch round 1 (5068741) changed four // lines and no code line, so that the comment no longer calls ruling A's question "open". The card closes with this PR, which would have left that comment false.
    • Seat's own reading of the diff (ruling A, 6011959066, executed):
      • timeline.bucket.overdue leaves TIMELINE_DEFAULT_TRANSLATIONS; a tombstone comment points at the pin.
      • It leaves the timeline.bucket block of all ten packs, one line each.
      • The fields.relativeDate.overdue plurals and slaOverdue are untouched; each pack's overdue line count drops by exactly one.
      • The card's pin gains a retirement block: the key is absent from the defaults row and from every pack, with non-vacuity over BUILT_IN_LANGUAGE_CODES and earlier present everywhere. fields.relativeDate.overdue is pinned as the surviving sibling.
      • The 7874 pin keeps its historical control and gains a dated note.
    • Changesets:
      • The pending .changeset/11676-timeline-past-bucket.md had a sentence this retirement makes false ("kept in every pack"). It is corrected, prose only, with the front matter untouched; check-changeset-overwrite reports it as its intended case 2.
      • The new .changeset/11676-retire-overdue-key.md (minor, @object-ui/i18n + @object-ui/plugin-timeline), checked sentence by sentence: the removal, the "no timeline heads a group Overdue" paragraph, and the Narrowed public surface paragraph. The last matches the built dist/locales/en.d.ts, which loses exactly readonly overdue: "Overdue" under timeline.bucket. dist/index.d.ts is byte-identical. The changeset also names fields.relativeDate.overdue as the surviving key.
    • Tests and gates (dev, measured):
      • Targeted suites: 102 → 105 tests, base to head. packages/plugin-timeline/ 559 passed; packages/i18n/ 1304 passed.
      • Type-check and lint exit 0 for both packages.
      • The i18n gates moved as predicted: drift "1 removed", dead-keys 346 → 345 with the namespace gone.
      • The reverse type probe gives TS2339 on the retired key.
      • One ablation leg (the key planted in zh.ts only) went exactly 3 red, as predicted, and was restored by blob.
      • Patch round 1 re-ran plugin-timeline type-check, lint and tests, and the line-citation, control-byte and changeset gates at 5068741; all exit 0.
    • Declared and accepted:
      • check:published-dist ran outside the verify lock and was waited on in the foreground. It exited 0.
      • check:eager-locale-catalogues is left to CI.
    • PR body: the dev's pr_body_patch bullet for the comment change is added in this stroke, and the Tests heading now names both heads.
    • CI on 5068741: in progress at this read (29 success, 3 skipped, 10 running, 0 failed). The red Test aggregate on e8d7630 was the run cancelled by this push, not a failure.

    Generated by Claude Code

  12. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR objectui#11716 → main c910630, verified by content. Fixes closed this card, which is now complete

    domain:ui execution seat 2 · session_01FngvPpdrnhHMdHHq6vwwju (os-justin) · 2026-10-06T13:26Z.

    • The merge. Squash c910630 went through the merge queue, with one parent, 89cc738, and is an ancestor of origin/main. 16 files, +77/−27. Its diff against the parent is byte-identical to the PR's net diff at 5068741 (md5 61b7976a… on both). Clause-②: no (narrowing), so no contract review was owed (ACCEPT 6016677614).

    • Content check against the first parent:

      reading 89cc738 c910630
      'timeline.bucket.overdue' row in useTimelineTranslation.ts 1 0
      packs whose timeline.bucket block carries overdue (of 10) 10 0
      "open question on objectui#11676" in ObjectTimeline.tsx 1 0
      .changeset/11676-retire-overdue-key.md present 0 1
    • The card, end to end:

      • the neutral "Earlier" bucket landed as ce464d9 (PR objectui#11700);
      • triage answered the due-date question with A (6011959066), so no timeline says "Overdue";
      • the dead key retired here.
    • Closures. Fixes #11676 closed this card as completed at the merge. No other issue closed in the landing window. pm:dispatched comes off in this stroke.


    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

Labels

area:recordsBusiness objects, records, the views that show data, usable forms, searchbugSomething isn't workingdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions