Repository navigation
console: a comment edit stops writing is_edited / edited_at — the platform stamps both (objectui half of ruling A on objectstack#23124) #12314
Copy link
Copy link
Closed
Labels
area:recordsBusiness objects, records, the views that show data, usable forms, searchBusiness objects, records, the views that show data, usable forms, searchdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p3
Description
Filing gate ④ coordination node: the objectui-layer child of the cross-repo ruling objectstack-ai/objectstack#23124 (ruling A, comment 6137155820). Filed by objectui domain:ui seat 1 (seat post #5560) · session_01CsyMRsFJBKNEMa4oPY1b5z. It goes in as pm:on-hold because the platform half is merged but not yet published, as the platform seat's landing note 6138611286 on objectstack#23124 asks.
- Who acts: the objectui
domain:uiexecution seat, once theRestart-when:probe below exits 0. That is one dev and one small PR inpackages/app-shell. - Dedupe: MCP
search_issueson objectui, closed included, forconsole stops writing comment is_edited edited_at handleEditComment server stamps edited marker. It returned 5 hits: console: an author cannot edit or delete their own comment on a record page, though sys_comment's data layer allows both (split from objectui#12249) #12268, console: record comments cannot be edited, deleted or replied to;record:activitydeclaresenableThreading: trueand no reply control renders (objectui#12211 item 5) #12249, console: inline-editing a date-only field in record highlights saves the day before east of UTC — it sends local midnight as a UTC instant (the Edit form sends the plain date) #12206, Chatter: read and write comment reactions as the member's own sys_comment_reaction records (ruling A amended on objectstack#22505); stop writing sys_comment.reactions #12078 and [console] 编辑保存不发 If-Match/If-Unmodified-Since,并发编辑静默后写覆盖(数据层 409 检测是好的) #3116. None is this change. console: an author cannot edit or delete their own comment on a record page, though sys_comment's data layer allows both (split from objectui#12249) #12268 (closed) is the console feature that added the client-side write; the ruling's question was raised from its Acceptance note.
What the ruling settled
- Ruling A. The platform stamps
is_edited: trueandedited_atonsys_commentwhen the body changes, both fields are read-only to data entry, and the console drops its own two-line write. - The platform half has landed. objectstack-ai/objectstack PR #23153 merged as
dc93781c19(2026-10-13T05:00Z):stampCommentBodyEditinpackages/plugins/plugin-audit/src/comment-access-hooks.tsis registered asbeforeUpdateonsys_comment.sys-comment.object.tsdeclares both fieldsreadonly: true.@objectstack/plugin-auditships it through.changeset/23124-comment-edit-stamp.md(minor, BREAKING narrowing) at the next version release.
- The landing note, verbatim: "Until the console drops the write, a
mentions-only save answers 200 withdroppedFieldsnaming both fields and a warn line (6138330704)."
The objectui half
- Where the write is. On objectui
main093d55b,handleEditCommentinpackages/app-shell/src/views/RecordDetailView.tsxwritesis_edited: trueandedited_at: new Date().toISOString()with the new body. Its docblock says the server stamps neither field on update. Re-check:grep -n "is_edited\|edited_at" packages/app-shell/src/views/RecordDetailView.tsx. - Wanted on restart:
- The edit save no longer sends
is_editedoredited_at. Everything else it sends today stays. - The docblock says the platform stamps both fields.
- The display keeps reading
edited: c.is_edited === true. - A pin asserts the edit save's payload carries neither field.
- ⛔ No client-side stamp is kept as a fallback, because the ruling makes both fields read-only to clients.
- The edit save no longer sends
- Why it waits. Dropping the write now would lose the "edited" marker on every server running
@objectstack/plugin-audit17.7.0, which is npmlatest(published 2026-10-06) and stamps nothing. - Negative control, run at filing time against
@objectstack/plugin-audit@latest(17.7.0): the probe below exits 1.- The bundled
dist/index.jsis not minified. It keeps hook function names, for exampleregisterHook("beforeUpdate", enforceFeedsCapability. - It holds no
stampCommentBodyEdit.
- The bundled
Restart-when: an @objectstack/plugin-audit release carrying objectstack-ai/objectstack PR #23153 (dc93781c19) is published on npm: in a new empty directory, npm pack @objectstack/plugin-audit@latest --silent >/dev/null && tar -xzf objectstack-plugin-audit-*.tgz && grep -q stampCommentBodyEdit package/dist/index.js exits 0.
Generated by Claude Code
Reactions are currently unavailable
Metadata
Metadata
Assignees
Labels
area:recordsBusiness objects, records, the views that show data, usable forms, searchBusiness objects, records, the views that show data, usable forms, searchdomain:uiobjectui ui stream: fix lands on the published library or apps — objectui execution seatobjectui ui stream: fix lands on the published library or apps — objectui execution seatpriority:p3
Activity
objectstack-fleet commentedon Oct 13, 2026
Restart condition revised:
domain:uiseat 1 ·session_01CsyMRsFJBKNEMa4oPY1b5z· 2026-10-13T09:06ZThis card stays
pm:on-hold. ItsRestart-when:line read@objectstack/plugin-audit@latest, and that tag no longer says when the console half can land.18.0.0-next.Nline instead of waiting for a 17.x release.pm:queueon 2026-10-13T08:47Z (6141844088).6142088237).npm pack @objectstack/plugin-audit@nextgives18.0.0-next.0, whosedist/index.jscontainsstampCommentBodyEdit, so the probe exits 0.@latestis still17.7.0, where the probe exits 1.Restart-when: objectui#12030 has merged (objectui resolves
@objectstack/*18.0.0-next.N), and in a new empty directorynpm pack @objectstack/plugin-audit@next --silent >/dev/null && tar -xzf objectstack-plugin-audit-*.tgz && grep -q stampCommentBodyEdit package/dist/index.jsexits 0.Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
Restart:
pm:on-hold→pm:queue·domain:uiseat 1 ·session_01CsyMRsFJBKNEMa4oPY1b5zThe held condition is met. objectui#12030 landed as PR #12337 (
mainc5406c2), so objectui now resolves@objectstack/*18.0.0-next.0. The measurement is the dev's held-card table in6151240488on objectui#12030; it was run against thenext.0tarball and the installed tree, with17.7.0as the negative control.stampCommentBodyEditin@objectstack/plugin-audit's dist. Against@latest(17.7.0) it exits 1. Against@next(18.0.0-next.0), which objectui now resolves, it exits 0.The card returns to
pm:queuefor its lane with its grade unchanged. ⛔ Not a claim. Under the maintainer's current p1-only instruction for this seat (6149890064on objectui#5560), it waits in the queue unless it is p1.Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
Triage: first grade on the queue ·
priority:p3·domain:ui·pm:queue· triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-14T06:04ZRead fresh, with the restart
6159872842, and checked on objectuimainb9814b334d:RecordDetailView.tsx:2495-2496still writesis_edited: trueandedited_at.priority:p3. On 18 the server stamps both fields itself (objectstack PR #23153) and drops the console's copies withdroppedFieldsand a warn line, so the customer-visible result is already right. This removes a redundant write and its log noise.target:label. Nothing breaks if it lands after GA.objectstack-fleet commentedon Oct 14, 2026
Claim: PM loop round 1
Session:
session_01XVp19E1MYUTFM3dnkwz8gBAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12314-comment-edit-stampWorktree:
objectui-issue-12314Domain:
domain:uiSeat:
domain:ui#2File surface:
packages/app-shell/src/views/RecordDetailView.tsx(the comment-edit write and its docblock), and its tests (stop on breach; explain in the report)Container & model:
S,mode:subagent,model: opus(default tier;dispatch-gates --tier --repo objectstack-ai/objectuireads no path-derived mandate)Clause-②: no
Responsibility:
objectui's console writes two fields the platform now owns | the platform's beforeUpdate stamp covers it (objectstack PR #23153) | every comment edit; the server drops the client copies and logs a warnThread-read: 6162042181
Serial constraints cleared: objectui#12075's PR #12374 touched
RecordDetailView.tsxand landed as42d8e8d. No in-flight claim names the file (read 2026-10-14T19:08Z).Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
os-dev-report
{
"issue": 12314,
"status": "done",
"branch": "claude/issue-12314-comment-edit-stamp",
"pr": "#12386",
"session": "session_01XVp19E1MYUTFM3dnkwz8gB",
"premise_still_valid": true,
"summary": "handleEditComment in packages/app-shell/src/views/RecordDetailView.tsx no longer sends is_edited / edited_at. The sys_comment update carries body and mentions only, and the docblock now says the platform stamps both on a body change and both are read-only to the client (ruling A, objectstack-ai/objectstack#23124). A2 held only in part: after a save the marker came from the console's own copy (edited: true), not from the server, and nothing refetches sys_comment after an edit. It is now read from the stored record the update answers with (stored?.is_edited === true), the same field the read maps. The DataSource.update contract resolves to the updated record, and the platform's SQL driver answers with a read-back of the row. Test double now stamps like the platform; one new case pins that an unstamped answer leaves the row unmarked. Changeset .changeset/12314-comment-edit-stamp.md (patch, @object-ui/app-shell).",
"tests": "Final head 91550c6. (1) pnpm exec vitest run --maxWorkers=2 packages/app-shell/src/views/RecordDetailView.feedCommentEditDelete-12268.test.tsx, run under os-verify-lock: Test Files 1 passed (1), Tests 23 passed (23), VERDICT command-exit 0. (2) pnpm --filter '@object-ui/app-shell^...' build exit 0, then pnpm --filter @object-ui/app-shell type-check (tsc --noEmit && tsc -p tsconfig.test.json, test config includes src/**/*.test.tsx) exit 0. (3) Ablation: the fix was committed first. RecordDetailView.tsx was then replaced by its base fc211e8 copy under an EXIT trap. On disk, 'is_edited: true,' counted 1 and 'stored?.is_edited' counted 0. The file runs from source (relative import), so no dist was involved. Result: Tests 4 failed | 19 passed (23), the payload pin and the server-mark pin under both feed blocks. Restored with git checkout HEAD --, git diff HEAD empty, blob hash equals HEAD. (4) eslint --no-inline-config --format json on the 2 changed source files: 2 files, 0 errors, 113 warnings, equal to the base copies of the same files (113). Repo-wide pnpm lint is left to CI. (5) Battery exit codes: check:phantom-deps, self-import, unreferenced-sources, doc-example-readers, handler-key-reads, side-effects-array, element-data-source-declaration, spec-symbols, action-forward-parity, designer-field-key-parity, icon-record-names, i18n-keys, i18n-drift and i18n-designer-parity were all 0. check-changeset-fixed.mjs 0, check-changeset-presence.mjs 0. check:spec-floors 1, already red on main (objectui#12334, 'The scan collapsed: 0 package(s) declare @objectstack/spec'), recorded and not fixed. check-nul-bytes OK, and the control-byte self-scan of the 3 changed files found 0.",
"mcp_calls": "0",
"api_writes": "2 relay dispatches (fleet-write repository_dispatch to objectstack-ai/objectstack): pr_create (POST /repos/objectstack-ai/objectui/pulls draft plus POST issues/12386/assignees) and this os-dev-report comment (POST /repos//issues/12314/comments). Two earlier pr_create sends were refused by write-pace (exit 10, nothing written). Plus git push x3 on the branch. Zero label writes: objectui has no gate reading a label the order named.",
"open_questions": [],
"out_of_scope_findings": []
}
Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
Review: ACCEPT — objectui PR #12386 ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-14T20:23ZReviewed on GitHub at head
91550c6, against ruling A on objectstack-ai/objectstack#23124 and triage's scope (6162042181), not against the dev's report.main. Its body opensFixes #12314, the only closing keyword, followed byClause-②: no. The governed sweep reads NOT governed, 79 lines (+63 / −16).handleEditComment'ssys_commentupdate no longer sendsis_edited/edited_at; it carriesbodyandmentionsonly;edited: true, and nothing refetchessys_commentafter an edit. It now readsis_editedfrom the stored record thatdataSource.updateanswers with: the same field the next read maps, so the mark never says what the row does not.@object-ui/app-shell: patch) matches the diff, including its statement that a server before the stamp answers an unstamped row and shows no mark.filter=latest), all 12 test shards included. The head predates the next.1 bump onmain; the merge queue re-tests it on currentmain.Next:
pr_ready+automerge_enable.Generated by Claude Code
objectstack-fleet commentedon Oct 14, 2026
Landed ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-14T20:40Zmainaafaf9c. The card closedcompletedby the PR'sFixes #12314, which is the only closing keyword. No other card closed with it.origin/main, every file the PR touches is blob-identical to the accepted head91550c6:RecordDetailView.tsx, its feed comment-edit test and.changeset/12314-comment-edit-stamp.md.pm:dispatchedis removed in the same stroke as this comment.Generated by Claude Code