You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
calendar month view: the resize-end handle is drawn when the view declares no end-date field, and dragging it PATCHes the unchanged start date (updated_at bumps, update triggers fire) #29020
Filing gate: ① a product defect, found beside the clauses (records-forms.calendar-interactions), reach: the console calendar, measured twice.
Business reason: on a calendar view that has only a start date (the stock showcase task calendar), every card still shows a resize handle. Dragging it moves nothing but sends a write of the unchanged date, so updated_at changes and every record-after-update trigger and flow runs for an edit nobody made (notifications, audit rows, integrations).
Reader who acts: the triage seat, then a domain:ui implementer in ui/packages/plugin-calendar/. QA suggestion only: area:records, p3.
Duplicate search: showResizeHandle → 0 hits; calendar resize → 14 hits and calendar endDateField → 18 hits, none about a resize handle without an end field.
Batch-of: release-18.3.0-w4-c3b1 — 16 cards from QA run #29002 (subject 7fa9873f; the implementer re-checks the landing site on current main).
Reproduction
As admin on the stock showcase: /_console/apps/com.example.showcase/showcase_task/view/calendar (the view declares startDateField: due_date and no endDateField).
Drag the [role=separator] "resize event end" handle of a card ("Build homepage", Nov 12) onto the next day.
Expected: no resize handle when no end field is configured (or a write of the end field only). Actual: PATCH /api/v1/data/showcase_task/ID {"due_date":"(the unchanged day)"} → 200; the card stays, no toast, and updated_at moves. Reproduced 2 times on two cards.
Mechanism (suspected)
ui/packages/plugin-calendar/src/CalendarView.tsx sets showResizeHandle = !!onEventDrop && isSpanEnd, independent of an end field; ObjectCalendar.tsxhandleEventDropDefault always patches startDateField, and with no endDateField the patch is the unchanged start.
QA-source: #29002 · records-forms.calendar-interactions · observed beside the clauses
Read fresh. showResizeHandle in ui/packages/plugin-calendar/src/CalendarView.tsx ignores whether an end field exists, and handleEventDropDefault in ObjectCalendar.tsx then patches the unchanged start date, so domain:ui. A write nobody made bumps updated_at and fires update triggers, a user-visible defect, p2 (QA suggested p3). It was seen beside the clauses rather than as a P1 FAIL, so the release rule does not apply.
Claim: PM loop round 19 · 2026-11-02T07:45Z
Session: session_01QsR2jTP5DLZwaztvKMgUJf (card thread, os-dev); dispatched by seat session session_01QsR2jUJ19MstFvFhjgiYTu
Account: zhuangjianguo
Branch: claude/project-thread-8vj6zf (platform-assigned to the card thread; it can push only this branch)
Worktree: objectstack-issue-29020
Domain: domain:ui
Seat: domain:ui#1
File surface: ui/packages/plugin-calendar/src/CalendarView.tsx, ui/packages/plugin-calendar/src/ObjectCalendar.tsx, their tests, and a root .changeset (stop on breach; explain in the report)
Container & model: S, mode:thread, model: default tier (dispatch-gates --tier: no path-derived mandate), effort: medium
Clause-②: yes (widening)
Metadata-protocol: none
Responsibility: the calendar month view draws a resize-end handle with no end-date field and the drag PATCHes the unchanged start date
Thread-read: 6571490968
Premise: holds (at origin/maina4015ab4: the card measures the handle and the PATCH; the dev re-measures on main before code)
Serial constraints cleared: none known.
{
"issue": 29020,
"status": "done",
"branch": "claude/project-thread-8vj6zf",
"pr": "https://github.com/objectstack-ai/objectstack/pull/29146",
"session": "session_01QsR2jTP5DLZwaztvKMgUJf",
"premise_still_valid": true,
"summary": "Premise re-measured on main 5d3667e2: the month view draws the resize-end handle with no endDateField and the drop writes the unchanged start (7 of the new cases red with main's source). CalendarView gains optional endEditable (default true); false hides the month resize-end handle, refuses a resize-end payload, and hides the week/day bottom handle. ObjectCalendar passes Boolean(endDateField). Its default drop handler now writes nothing when every date it would write equals the record's (instant compare via toDisplayDate), closing the press-and-release-without-moving write in the week view. Views with an end field keep both handles and still write the end, including on an empty end. Draft PR opened via the relay with no assignees (os-dev contract); the harness ask to assign and request review through GitHub MCP was not followed for the same reason.",
"tests": "head 88ee38a1: new ObjectCalendar.endEditable-29020.test.tsx 13/13; red on main: CalendarView.tsx + ObjectCalendar.tsx restored from 5d3667e2 -> 7 failed / 6 passed (all controls pass), restored via git checkout HEAD, git diff HEAD empty, blob equal; guard ablation via ablation-replace.mjs (anchor 1->0, blob moved) -> the 2 press-and-release cases fail, 11 pass, restored and diff empty; full plugin-calendar locked --maxWorkers=2: 67 files passed, 490 passed, 95 skipped (zone-driven cases); turbo type-check @object-ui/plugin-calendar 50/50; eslint 0 errors, warning counts equal to base (24, 28) and 0 in the new file.",
"gates": "dispatch-gates --commands: 34 families, all exit 0 on 88ee38a1 with the final PR body as GITHUB_EVENT_PATH; vitest run scripts/ locked 169 passed / 2 skipped files (4900 tests); dispatch-gates --ran: 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN; body gates re-run on the final body (changeset-no-major, adr-0087-registration, closing-keyword-parity, empty-changeset) exit 0; check-new-cross-file-line-citations 0 new. PR check-runs: in_progress at report time.",
"dogfood_battery": "n/a, no ! in the PR title and no (narrowing) arm",
"mcp_calls": "3 read-only: issue_read get, issue_read get_comments x2 on #29020; no write tool",
"api_writes": "2 relay strokes: pr_create objectstack-ai/objectstack#29146 (fleet-write run 41412170919), os-dev-report comment on #29020",
"open_questions": [],
"out_of_scope_findings": [
"class: none (noted, not filed) · with no endDateField the time grid's top Resize start handle writes the dragged start and the event is redrawn an hour long from it, so it reads as a move; it writes a real change, so it stays · carrier: none · noted in PR Acceptance notes",
"class: none (noted, not filed) · calendar-view-renderer.tsx does not forward endEditable, so authored calendar-view nodes keep the default true; outside the claim's file surface · carrier: none"
]
}
Landed · 2026-11-02T09:58Z · PR #29146 merged through the merge queue as 10bfd70e at 2026-11-02T09:58Z (GitHub's clock). ACCEPT 6572725705.
probe
before (10bfd70e~1)
now (origin/main)
endEditable in ui/packages/plugin-calendar/src/CalendarView.tsx
0
14
ObjectCalendar.endEditable-29020.test.tsx exists
no
yes
Fixes #29020 closed this card. pm:dispatched comes off in the same stroke as this note. The two doors left open (the time-grid "Resize start" handle and calendar-view-renderer not forwarding endEditable) are #29197.
Activity
objectstack-fleet commentedon Nov 2, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: records-forms.calendar-interactions
Triage:
domain:ui· p2 ·pm:queue· 2026-11-02T07:22Z⛔ Not a claim.
Generated by Claude Code
objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu
Claim: PM loop round 19 · 2026-11-02T07:45Z
Session:
session_01QsR2jTP5DLZwaztvKMgUJf(card thread, os-dev); dispatched by seat sessionsession_01QsR2jUJ19MstFvFhjgiYTuAccount:
zhuangjianguoBranch:
claude/project-thread-8vj6zf(platform-assigned to the card thread; it can push only this branch)Worktree:
objectstack-issue-29020Domain:
domain:uiSeat:
domain:ui#1File surface:
ui/packages/plugin-calendar/src/CalendarView.tsx,ui/packages/plugin-calendar/src/ObjectCalendar.tsx, their tests, and a root.changeset(stop on breach; explain in the report)Container & model: S,
mode:thread,model: default tier (dispatch-gates --tier: no path-derived mandate),effort: mediumClause-②: yes (widening)
Metadata-protocol: none
Responsibility: the calendar month view draws a resize-end handle with no end-date field and the drag PATCHes the unchanged start date
Thread-read: 6571490968
Premise: holds (at
origin/maina4015ab4: the card measures the handle and the PATCH; the dev re-measures on main before code)Serial constraints cleared: none known.
objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jTP5DLZwaztvKMgUJf
os-dev-report
{ "issue": 29020, "status": "done", "branch": "claude/project-thread-8vj6zf", "pr": "https://github.com/objectstack-ai/objectstack/pull/29146", "session": "session_01QsR2jTP5DLZwaztvKMgUJf", "premise_still_valid": true, "summary": "Premise re-measured on main 5d3667e2: the month view draws the resize-end handle with no endDateField and the drop writes the unchanged start (7 of the new cases red with main's source). CalendarView gains optional endEditable (default true); false hides the month resize-end handle, refuses a resize-end payload, and hides the week/day bottom handle. ObjectCalendar passes Boolean(endDateField). Its default drop handler now writes nothing when every date it would write equals the record's (instant compare via toDisplayDate), closing the press-and-release-without-moving write in the week view. Views with an end field keep both handles and still write the end, including on an empty end. Draft PR opened via the relay with no assignees (os-dev contract); the harness ask to assign and request review through GitHub MCP was not followed for the same reason.", "tests": "head 88ee38a1: new ObjectCalendar.endEditable-29020.test.tsx 13/13; red on main: CalendarView.tsx + ObjectCalendar.tsx restored from 5d3667e2 -> 7 failed / 6 passed (all controls pass), restored via git checkout HEAD, git diff HEAD empty, blob equal; guard ablation via ablation-replace.mjs (anchor 1->0, blob moved) -> the 2 press-and-release cases fail, 11 pass, restored and diff empty; full plugin-calendar locked --maxWorkers=2: 67 files passed, 490 passed, 95 skipped (zone-driven cases); turbo type-check @object-ui/plugin-calendar 50/50; eslint 0 errors, warning counts equal to base (24, 28) and 0 in the new file.", "gates": "dispatch-gates --commands: 34 families, all exit 0 on 88ee38a1 with the final PR body as GITHUB_EVENT_PATH; vitest run scripts/ locked 169 passed / 2 skipped files (4900 tests); dispatch-gates --ran: 34 derived, 34 run, 0 NOT-MEASURED, 0 UNRUN; body gates re-run on the final body (changeset-no-major, adr-0087-registration, closing-keyword-parity, empty-changeset) exit 0; check-new-cross-file-line-citations 0 new. PR check-runs: in_progress at report time.", "dogfood_battery": "n/a, no ! in the PR title and no (narrowing) arm", "mcp_calls": "3 read-only: issue_read get, issue_read get_comments x2 on #29020; no write tool", "api_writes": "2 relay strokes: pr_create objectstack-ai/objectstack#29146 (fleet-write run 41412170919), os-dev-report comment on #29020", "open_questions": [], "out_of_scope_findings": [ "class: none (noted, not filed) · with no endDateField the time grid's top Resize start handle writes the dragged start and the event is redrawn an hour long from it, so it reads as a move; it writes a real change, so it stays · carrier: none · noted in PR Acceptance notes", "class: none (noted, not filed) · calendar-view-renderer.tsx does not forward endEditable, so authored calendar-view nodes keep the default true; outside the claim's file surface · carrier: none" ] }objectstack-fleet commentedon Nov 2, 2026
domain:ui#1 · zhuangjianguo · session_01QsR2jUJ19MstFvFhjgiYTu
Landed · 2026-11-02T09:58Z · PR #29146 merged through the merge queue as
10bfd70eat 2026-11-02T09:58Z (GitHub's clock). ACCEPT 6572725705.10bfd70e~1)origin/main)endEditableinui/packages/plugin-calendar/src/CalendarView.tsxObjectCalendar.endEditable-29020.test.tsxexistsFixes #29020closed this card.pm:dispatchedcomes off in the same stroke as this note. The two doors left open (the time-grid "Resize start" handle andcalendar-view-renderernot forwardingendEditable) are #29197.