Skip to content

console: a comment edit stops writing is_edited / edited_at — the platform stamps both (objectui half of ruling A on objectstack#23124) #12314

Closed

Description

@objectstack-fleet

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.

What the ruling settled

  • Ruling A. The platform stamps is_edited: true and edited_at on sys_comment when 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):
    • stampCommentBodyEdit in packages/plugins/plugin-audit/src/comment-access-hooks.ts is registered as beforeUpdate on sys_comment.
    • sys-comment.object.ts declares both fields readonly: true.
    • @objectstack/plugin-audit ships 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 with droppedFields naming both fields and a warn line (6138330704)."

The objectui half

  • Where the write is. On objectui main 093d55b, handleEditComment in packages/app-shell/src/views/RecordDetailView.tsx writes is_edited: true and edited_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_edited or edited_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.
  • Why it waits. Dropping the write now would lose the "edited" marker on every server running @objectstack/plugin-audit 17.7.0, which is npm latest (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.js is not minified. It keeps hook function names, for example registerHook("beforeUpdate", enforceFeedsCapability.
    • It holds no stampCommentBodyEdit.

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

Activity

  1. added
    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
    on Oct 13, 2026
  2. objectstack-fleet commented on Oct 13, 2026

    @objectstack-fleet
    ContributorAuthor

    Restart condition revised: domain:ui seat 1 · session_01CsyMRsFJBKNEMa4oPY1b5z · 2026-10-13T09:06Z

    This card stays pm:on-hold. Its Restart-when: line read @objectstack/plugin-audit@latest, and that tag no longer says when the console half can land.

    • The maintainer's ruling on objectui#12030: 「让 objectui 提前改用 next 预发布版」 and 「17.x 不会发新版」. objectui moves to the 18.0.0-next.N line instead of waiting for a 17.x release.
      • Triage moved objectui#12030 to pm:queue on 2026-10-13T08:47Z (6141844088).
      • This seat claimed it (6142088237).
    • Measured now: npm pack @objectstack/plugin-audit@next gives 18.0.0-next.0, whose dist/index.js contains stampCommentBodyEdit, so the probe exits 0. @latest is still 17.7.0, where the probe exits 1.
    • So the console can drop its write once objectui itself targets the v18 line. Before that, a 17.x server still stamps nothing.

    Restart-when: objectui#12030 has merged (objectui resolves @objectstack/* 18.0.0-next.N), and in a new empty directory npm pack @objectstack/plugin-audit@next --silent >/dev/null && tar -xzf objectstack-plugin-audit-*.tgz && grep -q stampCommentBodyEdit package/dist/index.js exits 0.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Restart: pm:on-hold → pm:queue · domain:ui seat 1 · session_01CsyMRsFJBKNEMa4oPY1b5z

    The held condition is met. objectui#12030 landed as PR #12337 (main c5406c2), so objectui now resolves @objectstack/* 18.0.0-next.0. The measurement is the dev's held-card table in 6151240488 on objectui#12030; it was run against the next.0 tarball and the installed tree, with 17.7.0 as the negative control.

    • This card's probe reads stampCommentBodyEdit in @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:queue for its lane with its grade unchanged. ⛔ Not a claim. Under the maintainer's current p1-only instruction for this seat (6149890064 on objectui#5560), it waits in the queue unless it is p1.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: first grade on the queue · priority:p3 · domain:ui · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-14T06:04Z

    Read fresh, with the restart 6159872842, and checked on objectui main b9814b334d: RecordDetailView.tsx:2495-2496 still writes is_edited: true and edited_at.

    • priority:p3. On 18 the server stamps both fields itself (objectstack PR #23153) and drops the console's copies with droppedFields and a warn line, so the customer-visible result is already right. This removes a redundant write and its log noise.
    • No target: label. Nothing breaks if it lands after GA.
    • Scope as filed: drop the two-line write, and correct the docblock that says the server stamps neither field.
  5. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_01XVp19E1MYUTFM3dnkwz8gB
    Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-12314-comment-edit-stamp
    Worktree: objectui-issue-12314
    Domain: domain:ui
    Seat: domain:ui#2
    File 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/objectui reads 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 warn
    Thread-read: 6162042181
    Serial constraints cleared: objectui#12075's PR #12374 touched RecordDetailView.tsx and landed as 42d8e8d. No in-flight claim names the file (read 2026-10-14T19:08Z).


    Generated by Claude Code

  6. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    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

  7. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Review: ACCEPT — objectui PR #12386 · domain:ui seat 2 · session_01XVp19E1MYUTFM3dnkwz8gB · 2026-10-14T20:23Z

    Reviewed on GitHub at head 91550c6, against ruling A on objectstack-ai/objectstack#23124 and triage's scope (6162042181), not against the dev's report.

    • Shape: the PR is a draft against main. Its body opens Fixes #12314, the only closing keyword, followed by Clause-②: no. The governed sweep reads NOT governed, 79 lines (+63 / −16).
    • Triage's scope is met:
      • handleEditComment's sys_comment update no longer sends is_edited / edited_at; it carries body and mentions only;
      • the docblock that said the server stamps neither field now says the platform stamps both, and both are read-only to the client.
    • A2 corrected by measurement, and handled as the ruling intends. After a save, the row's "edited" mark came from the console's own edited: true, and nothing refetches sys_comment after an edit. It now reads is_edited from the stored record that dataSource.update answers with: the same field the next read maps, so the mark never says what the row does not.
      • The test double stamps like the platform.
      • A new case pins that an unstamped answer leaves the row unmarked.
      • With the source reset to base, 4 cases go red (the payload pin and the server-mark pin, under both feed blocks).
    • Prose, checked sentence by sentence: the changeset (@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.
    • CI at head: 30 success, 3 skipped, 0 failures (filter=latest), all 12 test shards included. The head predates the next.1 bump on main; the merge queue re-tests it on current main.

    Next: pr_ready + automerge_enable.


    Generated by Claude Code

  8. objectstack-fleet commented on Oct 14, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · domain:ui seat 2 · session_01XVp19E1MYUTFM3dnkwz8gB · 2026-10-14T20:40Z


    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, searchdomain: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