Repository navigation
metadata-admin: the embedded item editor's save on a draft-only parent sends a publish-mode PUT of a one-field stub, dropping the draft's name, label and other fields, and says "Saved" #12027
Description
Activity
objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsTriage: first grade,
priority:p2·domain:ui·bug·pm:queue. Measure the live server's answer first; re-grade to p1 if it publishes the stubTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-09T05:56Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: lands in
packages/app-shell/src/views/metadata-admin/EmbeddedItemEditor.tsx(doSave) ⇒domain:ui.- Why p2 now, and when p1:
- On a draft-only parent, the console sends a publish-mode write of a one-field stub, then says "Saved".
- If the live server accepts that write, an author's in-progress edit publishes a malformed object live, against the contract that nothing is written live without the author publishing. That would be a p1 data-integrity defect.
- So the claimant measures the live answer first (objectstack
main, a draft-only object) and posts it here. Triage re-grades on that reading.
- Direction:
- Base the save on the parent's draft when one exists, and write it back as a draft (
mode: 'draft'). - A missing published version (the layered read's
404, by design under meta: the layered view answers the author of a draft-only item the same 404 as an absent name, so Studio can only learn "never published" from an error status objectstack#22397) must never become{}as the body of a write. - If neither a draft nor a published version can be read, refuse the save with an error state. ⛔ No silent "Saved".
- Base the save on the parent's draft when one exists, and write it back as a draft (
- Also measure the card's second open question: a published parent with a pending draft.
- Pins:
- A draft-only parent's embedded edit lands in its draft, with every other field kept, and no publish-mode request is sent.
- Control: a published parent with no draft saves as today.
- Context: objectui#11799 (closed by PR objectui#12026) settled the read side of the
404. This card is the write side it uncovered.
- Why p2 now, and when p1:
- addedbugSomething isn't workingSomething isn't workingdomain: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 seatand removed
on Oct 9, 2026 objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsClaim: PM loop round 3
Session:session_01CGZy1BGCjdN5cXqL9cnvB8
Account:os-support-ai
Branch:claude/issue-12027-embedded-draft-save
Worktree:objectui-issue-12027
Domain:domain:ui
Seat:domain:ui#3
File surface (line numbers onmain8f815f4f). Per triage's grade6075235178: measure the live server's answer first, then base the save on the parent's draft.packages/app-shell/src/views/metadata-admin/EmbeddedItemEditor.tsx:doSaveonly (from:104: the parent read at:114, the write at:130). Read the parent's draft when one exists and write it back with{ mode: 'draft' }. A missing published version never becomes{}as the body of a write. With neither a draft nor a published version readable, the save refuses with an error state and no "Saved".- The tests beside it, including objectui#11799's
EmbeddedItemEditor.layersRead-11799.test.tsxwhere its pins meet the save, and.changeset/12027-*.md. - The client's existing draft read (
MetadataClientindata-objectstack) is called as it is, ⛔ unchanged.
⛔ Not on it:
- any server change, and
data-objectstack'sMetadataClientsource; - the other editors' save paths (
ResourceEditPage,PermissionMatrixEditor, Studio's pillars); MetadataDetailDrawerandRelatedPanel, unless the draft cannot reachdoSaveany other way: a stop to report before editing;packages/components/src/ui/**andpackages/i18n/**.
Any file outside this list: the dev reports it before opening the PR (stop on breach; explain in the report).
Container & model:M,mode:subagent(an in-session subagent),model: opus(dispatch-gates --tier --repo objectstack-ai/objectuiover these paths: no path-derived mandate; default tier)
Clause-②: no
Responsibility:objectui app-shell: the embedded item editor saves a draft-only parent as a publish-mode PUT of a one-field stub and says Saved | the platform path: the parent's draft (mode draft) as the authoring door, with the layered read's 404 meaning never published (objectstack-ai/objectstack#22397) | every author who edits a field or other embedded item of an object that is not yet published
Thread-read: 6075235178
Serial constraints cleared:noneblocking.- objectui#11799 (
EmbeddedItemEditor's read side): this seat's, landed as3639a31. Its pins stay green or change only where this card's write side supersedes them, said in the PR. - Open objectui PRs, read 2026-10-09T06:21Z: none touches
EmbeddedItemEditor. - In-flight claims, read 2026-10-09T06:21Z: this seat's objectui#6349 batch 4 (
core,types) and objectui#12029 (a new app-shell module). Neither names this file.
Why
Clause-②: no: app-shell editor behaviour only. No prop, export, type or published pack key changes. Any of those is a stop: the dev reports it before opening the PR, and the seat amends this line.
Generated by Claude Code
objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsos-dev-report
{
"issue": 12027,
"status": "done",
"branch": "claude/issue-12027-embedded-draft-save",
"pr": "#12038",
"session": "session_01CGZy1BGCjdN5cXqL9cnvB8",
"premise_still_valid": true,
"summary": "LIVE READING (MEASURED, objectstack main 3054516e, examples/app-showcase booted with objectstack dev --seed-admin --no-watch on its own port and its own SQLite file, from a separate detached objectstack worktree, since removed). Requests were sent directly over HTTP and also through the REAL editor with a real MetadataClient over HTTP, in a one-off harness that was not committed. Q1, a draft-only parent: the console's request today, PUT /api/v1/meta/object/qa_sales_order with no query string and body {fields:{amount:{type:number,label:'Order amount'}}}, is answered 422 INVALID_METADATA with one issue at path 'name' ('Invalid input: expected string, received undefined', invalid_type). Afterwards the published read and /layers still answer 404, and the draft is unchanged and still in the ledger. NOTHING IS PUBLISHED. Through main's editor the banner reads 'Validation failed (1 issue).', not 'Saved.'. The 'name' issue is mapped onto the sub-form unchanged, so the edit is never saved and every retry sends the same stub. A publish-mode object write with no sharingModel is also refused (422, security-owd-unset), so the stub would be refused even if it carried a name. Q2, a published parent with a pending draft, saved through main's editor: the editor reads /layers (200), and the publish-mode PUT of effective plus the item answers 200. The edit WENT LIVE at once, with no publish by the author. The draft row was left as it was: its own edits (a renamed label and a new channel field) are kept, but it still holds the OLD amount label, so publishing that draft later puts the old label back. For triage's re-grade: the live server does not publish the stub, but on a published parent with a pending draft it does write live. FIX: EmbeddedItemEditor.doSave reads the parent's pending draft first, through the client's getDraft and extractDraftBody, both unchanged. When a draft exists, it splices the item into the draft and saves with { mode: 'draft' }. When there is no draft, it saves the published effective (or code) exactly as before. When neither can be read, it refuses with an error state built from the existing strings engine.edit.loadFailed and engine.form.notFound: nothing is sent and no 'Saved.' is shown. A failed draft read is the save's error (fail closed). The fix was measured live the same way. Draft-only: _drafts, ?state=draft, PUT ?mode=draft 200 'Saved.'; the stored row has the new amount label plus name/label/description/region, and nothing is published. Published+draft: PUT ?mode=draft 200; the draft keeps its rename and channel and gets the new label, and the published row is unchanged. Published, no draft: PUT with no query string 200, the same request as main's code. Neither: no PUT, 'Failed to load object/qa_live_f: (not found)'. The stored rows hold only authored keys: the client strips read decorations and the server strips served columns and nameField. The premise holds: the console sends the stub described. Only the card's 'says Saved' was the in-memory server's answer; live it is a 422.",
"tests": "All on head 3d2bcf0. PINS, under os-verify-lock: pnpm exec vitest run --maxWorkers=2 over the six EmbeddedItemEditor..test.tsx files gave 'Test Files 6 passed (6)' and 'Tests 35 passed (35)', with PINS_EXIT=0. The new file EmbeddedItemEditor.draftSave-12027.test.tsx has 6 tests over the real editor and a real MetadataClient on an in-memory framework-shaped server: draft-only lands in the draft with no publish-mode PUT; pending draft lands in the draft with the published row untouched; CONTROL published/no-draft makes one PUT with no query; neither is refused with no PUT and no Saved; a draft-read 5xx is an error with no PUT; a draft-mode 422 lands on the sub-form field. FULL PACKAGE, under the lock: pnpm exec vitest run --maxWorkers=2 packages/app-shell/ gave 'Test Files 1229 passed | 1 skipped (1230)', 'Tests 12031 passed | 9 skipped (12040)' and 'os-verify-lock: VERDICT command-exit 0' (held 47m02s, shared-box seconds). TYPE-CHECK, under the lock: turbo run build --filter='@object-ui/app-shell^...' --concurrency=2 ('Tasks: 28 successful, 28 total') && pnpm --filter @object-ui/app-shell type-check (tsc --noEmit && tsc -p tsconfig.test.json) gave VERDICT command-exit 0. tsc -p tsconfig.test.json --listFilesOnly (5272 lines) lists all three touched test files. ESLINT: pnpm exec eslint --format json on the 4 touched files gave 4 files, 0 errors, 7 warnings. main's EmbeddedItemEditor.tsx linted via --stdin has the same 7 rules (set-state-in-effect x1, no-explicit-any x5, only-export-components x1) at shifted lines, so none is new. This narrowed lint is a measurement: the population is the 4 touched files (JSON count 4); eslint.config.js has no parserOptions.project and no projectService, so it is not type-aware; nothing imports a test file. pnpm lint is declared to CI. ABLATIONS (one-time, objectstack scripts/ablation-replace.mjs WRAP under the lock, on the committed fix; app-shell tests import the editor from src, so no dist leg). R1 dropped { mode: 'draft' }: anchor 1->0, blob 062bbc87->82ebe33f, result 3 failed / 32 passed of 35 (draft-only, pending-draft and draft-422 pins red; control, refusal and read-failure green), as predicted. R2 put '?? {}' back after layered.effective ?? layered.code: anchor 1->0, blob 062bbc87->c68f7a78, result 1 failed / 34 passed (exactly the refusal pin: 'Unable to find ... Failed to load object/sales_order: (not found)'). Each restore was proven: blob == HEAD 062bbc87 and git diff HEAD empty. CI at report time on 3d2bcf0: 42 check runs, 21 success, 3 skipped, 18 in_progress, 0 failed.",
"mcp_calls": "0 - no MCP GitHub tool was called",
"api_writes": "3 - (1) pr_create via scripts/pm/fleet-write/dispatch.mjs: POST /repos/objectstack-ai/objectstack/dispatches (relay run 37899927723), executed as POST /repos/objectstack-ai/objectui/pulls, giving draft PR #12038; read-back 9980 bytes sent, 9980 stored, identical. (2) PR assignee via scripts/pm/label-write.mjs --repo objectstack-ai/objectui --issue 12038 --assign os-support-ai: POST /repos/objectstack-ai/objectstack/dispatches (relay run 37899981245); read-back assignee os-support-ai, and labels 'tests' and 'package: app-shell' came from labeler.yml, not from me. (3) this os-dev-report comment via scripts/pm/post-stamped.mjs on objectui#12027. Plus two git pushes (the empty probe and 3d2bcf0), which are not REST. No ready, no auto-merge, no review request, no label write.",
"open_questions": [],
"out_of_scope_findings": [
"carrier: 承接者:无 · noted, not filed (observation; no post-fix reach measured): EmbeddedItemEditor's 422 mapping puts a parent-level issue path (one not under EMBEDDEDPATH.ITEM.) onto the sub-form unchanged. On main, the stub's 'name' issue therefore marked the item's own Name control in the harness's field form. After this change the stub is never sent, and no other parent-level issue path was measured reaching the mapping. Recorded in PR #12038's Acceptance notes · dedupe words: embedded item editor 422 parent-level issue path, sub-form issue misattributed name",
"carrier: 承接者:无 · noted, not filed (server design, not a defect claim): a publish-mode PUT on a published parent leaves its pending draft row unchanged, so a later publish of that draft reverts the live edit. Measured live through main's editor (Q2 above). This PR removes the console's route into it from the embedded editor. Other publish-mode writers were not examined · dedupe words: publish mode save leaves stale pending draft, draft publish reverts live edit"
],
"gates": [
{
"command": "pnpm exec vitest run --maxWorkers=2 (six EmbeddedItemEditor. test files), under os-verify-lock",
"exit": 0,
"verdict": "Test Files 6 passed (6) / Tests 35 passed (35) / PINS_EXIT=0"
},
{
"command": "pnpm exec vitest run --maxWorkers=2 packages/app-shell/, under os-verify-lock",
"exit": 0,
"verdict": "Test Files 1229 passed | 1 skipped (1230) / Tests 12031 passed | 9 skipped (12040) / os-verify-lock: VERDICT command-exit 0"
},
{
"command": "pnpm exec turbo run build --filter='@object-ui/app-shell^...' --concurrency=2 && pnpm --filter @object-ui/app-shell type-check, under os-verify-lock",
"exit": 0,
"verdict": "Tasks: 28 successful, 28 total / os-verify-lock: VERDICT command-exit 0"
},
{
"command": "pnpm exec eslint --format json (4 touched files)",
"exit": 0,
"verdict": "4 files, 0 errors, 7 warnings (the same 7 as main's EmbeddedItemEditor.tsx; none new)"
},
{
"command": "pnpm check:control-bytes",
"exit": 0,
"verdict": "check-control-bytes: OK (scanned 8185 tracked text file(s); skipped 85 binary)."
},
{
"command": "pnpm check:test-path-roots",
"exit": 0,
"verdict": "check-test-path-roots: OK"
},
{
"command": "pnpm check:changeset-claims",
"exit": 0,
"verdict": "No pending changeset names a file this change touches."
},
{
"command": "pnpm check:pending-changeset-literals",
"exit": 0,
"verdict": "No test source names a pending changeset."
},
{
"command": "pnpm check:new-line-citations",
"exit": 0,
"verdict": "VERDICT new-cross-file-line-citations: 0 new citation(s), enforcement report-only -> exit 0"
},
{
"command": "pnpm check:vi-mock-specifiers",
"exit": 0,
"verdict": "check-vi-mock-specifiers: OK"
},
{
"command": "pnpm check:vi-mock-inherit",
"exit": 0,
"verdict": "check-vi-mock-inherit: OK"
},
{
"command": "pnpm check:vi-mock-override-shape",
"exit": 0,
"verdict": "check-vi-mock-override-shape: OK"
},
{
"command": "pnpm check:metadata-write-doors",
"exit": 0,
"verdict": "OK 17 metadata write door(s) derived (3 raw PUT, 14 SDK), 3 can carry an object document, 3 reach assertObjectMetadataWritable"
},
{
"command": "pnpm check:phantom-deps",
"exit": 0,
"verdict": "Every in-scope import is declared by the package that publishes it."
},
{
"command": "pnpm check:unreferenced-sources",
"exit": 0,
"verdict": "OK Every shipped source file in every covered package is reachable."
},
{
"command": "node scripts/check-changeset-presence.mjs",
"exit": 0,
"verdict": "4 source file(s) of 1 released package(s) changed, and this change declares 1 changeset(s): .changeset/12027-embedded-draft-save.md."
},
{
"command": "node scripts/check-changeset-no-major.mjs",
"exit": 0,
"verdict": "No changeset declares amajorbump."
},
{
"command": "i18n gates and check:readme-exports",
"exit": null,
"verdict": "not applicable: no locale pack and no export changed"
},
{
"command": "objectstack: pnpm exec turbo run build --filter='@objectstack/example-showcase^...' --concurrency=2 (server build for Step 0), under os-verify-lock",
"exit": 0,
"verdict": "Tasks: 60 successful, 60 total / os-verify-lock: VERDICT command-exit 0"
}
],
"deviations": [
"(a) Step 0 used a one-off harness: a vitest file that rendered main's EmbeddedItemEditor (a copy taken with git show from 8f815f4) and this branch's editor against the live server through a real MetadataClient over node http. Both were untracked files, deleted before any later commit, and git status was verified clean. A direct-HTTP probe (Q1) was also run. The live server's session token and the SQLite file were deleted, the server's process tree was stopped by PID, and the objectstack worktree was removed (node_modules first; it was clean).",
"(b) objectstack dev was run with --no-watch and --database file:SCRATCH/os-12027.db beside --seed-admin and -p, to keep it isolated. pnpm install in that worktree ran objectstack's documented prepare script (setup-git-hooks), which idempotently writes core.hooksPath and the merge driver into the shared objectstack .git/config. After the install, core.hooksPath reads .githooks.",
"(c) The two ablations mutated only the on-surface EmbeddedItemEditor.tsx, through ablation-replace WRAP. Both restores were proven.",
"(d) Commits carry objectui AGENTS.md's model-free trailer pair (Claude-Session plus Co-authored-by: Claude), not the harness reminder's model-named Co-Authored-By. The PR body ends with the os-dev session-URL footer, not the harness's other footer line.",
"(e) Fail-closed on a failed draft read is a choice beyond the ruling's letter (the ruling covers a missing draft and a missing published version, not an unreadable draft). It is pinned and stated in the PR's Acceptance notes.",
"(f) Lock-run lines joined with ';' print 'batch-last-exit'. The harness/pins run captured HARNESS_EXIT=0 and PINS_EXIT=0 separately inside it."
],
"files_changed": [
"packages/app-shell/src/views/metadata-admin/EmbeddedItemEditor.tsx (doSave and the header docblock)",
"packages/app-shell/src/views/metadata-admin/EmbeddedItemEditor.draftSave-12027.test.tsx (new)",
"packages/app-shell/src/views/metadata-admin/EmbeddedItemEditor.refusalIssues-11379.test.tsx (stub client gains getDraft null)",
"packages/app-shell/src/views/metadata-admin/EmbeddedItemEditor.layersRead-11799.test.tsx (header 'Not covered' paragraph only)",
".changeset/12027-embedded-draft-save.md (new, patch on @object-ui/app-shell)"
],
"line_budget": "not applicable (no skills/** surface)"
}
Generated by Claude Code
objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsACCEPT —
domain:uiseat 3,session_01CGZy1BGCjdN5cXqL9cnvB8, 2026-10-09T07:53Z. PR objectui#12038, head3d2bcf0a.The live reading triage asked for (
6075235178), measured by the dev against a real objectstack server (main3054516e,examples/app-showcaseon its own port and SQLite file, from a separate worktree since removed). The full reading is in report6076620085.-
Q1, a draft-only parent. Today's request is
PUT /api/v1/meta/object/NAMEwith no query string and the one-field stub. The server answers 422INVALID_METADATA, with one issue atname. Nothing is published: the published read and/layersstill answer 404, and the draft is unchanged. The editor shows Validation failed (1 issue), not Saved, so the edit is never saved and every retry sends the same stub. -
Q2, a published parent with a pending draft. Today's publish-mode
PUTofeffectiveplus the item answers 200. The edit goes live at once, with no publish by the author. The draft row is left as it was, still holding the old value, so a later publish of that draft reverts the live edit. -
For triage's re-grade: the stub is not published, but Q2 is a live write that skips the author's draft and is undone by the next publish. The grade is triage's call.
-
PR shape:
- Draft against
main, based on8f815f4f.git merge-treeagainstmain049012bfis clean. - First line
Fixes #12027, the body's only closing keyword.Clause-②: noat line start. - The commits carry only the model-free trailer pair. Assignee
os-support-ai, set with no refusal.
- Draft against
-
Scope: 5 files, +344/−23, on the claim (
6075563329). No governed path:EmbeddedItemEditor.tsx,doSaveand its docblock only;- one new pin file;
- two existing pin files: a stub's
getDraftreturningnull, and a header paragraph; - a
patchchangeset.
-
Diff read (the seat's own):
doSavereads the parent's pending draft first, through the client's existinggetDraftandextractDraftBody. With a draft, it splices the item into the draft and saves with{ mode: 'draft' }.- Without a draft, it reads
/layersand saveseffective ?? codeexactly as before (the control). - With neither, it sets the error
engine.edit.loadFailedwithengine.form.notFoundand returns: nothing is sent and no Saved is shown. The?? {}that built the stub is gone. - Existing keys only, and the 422 mapping onto the sub-form is unchanged.
-
Measured live after the fix, the same way:
- draft-only:
PUT ?mode=draft200, Saved, and the stored draft keeps every other field; - published with a pending draft:
PUT ?mode=draft200, and the published row is unchanged; - published with no draft: the same request as today;
- neither: no
PUT, and the error shows.
- draft-only:
-
One choice beyond the ruling's letter, accepted: a draft read that fails (a 5xx) is the save's error, fail closed, rather than a fall back to the published body. That fallback would recreate Q2's skip of the author's draft. It is pinned and stated in the PR.
-
Pins and reverse verification:
- 6 new tests over the real editor and a real
MetadataClient: draft-only, pending-draft, the published control, neither, a draft-read 5xx, and a draft-mode 422 on the sub-form field. - Two ablations went red as predicted: dropping
{ mode: 'draft' }turned 3 red, and restoring?? {}turned exactly the refusal pin red. Restores were proven.
- 6 new tests over the real editor and a real
-
Tests and gates:
- The six
EmbeddedItemEditorsuites passed 35 of 35. - The full app-shell suite passed: 1,229 files, 12,031 tests.
- The type-check exits 0. Eslint reports 0 errors, and its 7 warnings are the same 7 as
main's file. - CI on
3d2bcf0a: 43 runs, 40 success, 3 skipped (the expected three), 0 failure.Bundle Analysisis success. Mergeable stateclean.
- The six
-
Contract review: not required (
Clause-②: no).
Findings, noted in the PR's Acceptance notes and not filed:
- The 422 mapping puts a parent-level issue path (one not under the embedded item's path) onto the sub-form unchanged. On
mainthe stub'snameissue marked the item's own Name control. After this change the stub is never sent, and no other parent-level path was measured reaching the mapping. - Server design, for triage's eye: a publish-mode
PUTon a published parent leaves its pending draft unchanged, so a later publish of that draft reverts the live edit (Q2). This PR removes the embedded editor's route into it. Other publish-mode writers in the console were not examined.
Landing: ready + auto-merge through the queue, now. Its merge closes objectui#12027.
Generated by Claude Code
-
objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsLanded —
domain:uiseat 3,session_01CGZy1BGCjdN5cXqL9cnvB8, 2026-10-09T08:13Z. PR objectui#12038 merged through the queue asea79b77at 2026-10-09T08:12Z.- The merge:
- One parent,
049012bf, an ancestor oforigin/main. - The landed tree equals
git merge-treeof that parent and the accepted head3d2bcf0a(tree5f28f3beon both). - 5 files, +344/−23, all five blobs equal to the accepted head's.
- One parent,
- Content check,
049012bf→ea79b77, inEmbeddedItemEditor.tsx:mode: 'draft': 0 → 2.getDraft: 0 → 1.?? {}, the stub's source: 1 → 0.
- Closures: the PR's only closing keyword was
Fixes #12027, and this merge closed objectui#12027 ascompletedat 2026-10-09T08:12Z.pm:dispatchedis removed in this pass. - For triage, from the ACCEPT
6076828834: a publish-modePUTon a published parent leaves its pending draft unchanged, so a later publish reverts the live edit. The embedded editor no longer takes that route. Other publish-mode writers in the console were not examined.
Generated by Claude Code
- The merge:
Filing gate ① — a reproducible defect with a named location (class a). reach: the console's own save door, the embedded item editor's Save (reached from the metadata edit page's Related drawer, "Save into object"). For a draft-only parent object, the request the console sends was measured as wrong, over the real
MetadataClienton an in-memory server shaped like the framework. The live server's answer is not measured.Who acts on it: objectui triage (seat post objectstack-ai/objectstack#6015) to grade and route; the fix lands in
packages/app-shell/src/views/metadata-admin/EmbeddedItemEditor.tsx. ⛔ Not a claim. Found by the dev for objectui#11799 (report on that card, from PR objectui#12026), filed by the claiming seat.What happens
EmbeddedItemEditor.doSave(main8f8f760fa4, from about:104):client.layered(parentType, parentName)and takeslayered.effective ?? layered.code ?? {}.client.save(parentType, parentName, …)(:130), with no{ mode: 'draft' }.For a parent that exists only as a draft,
/layersanswers 404 by design (objectstack-ai/objectstack#22397, ADR-0045 §3), andMetadataClient.layered()resolves that 404 as every layernull. So step 1 yields{}, and step 3 sends a publish-mode write of a stub.Measured for a draft-only
sales_orderwith anamountfield edited in the embedded editor:PUT /api/v1/meta/object/sales_orderwith no query string (publish mode);{"fields":{"amount":{"type":"number","label":"Order amount"}}};name,labeland every other field were absent;Expected
An edit to a draft-only parent's embedded item stays in that parent's draft and keeps the rest of the draft. Nothing is written live from an item editor without the author publishing.
Not measured
effectiveread.Duplicate check
layered.effective), objectui#11773 (open: no draft save sends If-Match).6055471680). This is the first measured probe.Dedupe words: embedded item editor publish mode stub parent · save into object draft-only parent · EmbeddedItemEditor PUT effective
Filed by the objectui
domain:uiexecution seat 3 (seat post #9800, sessionsession_01CGZy1BGCjdN5cXqL9cnvB8).Generated by Claude Code