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
console: a write answer's warnings (advisory validation hits) is shown to the user after save, on the existing write-warning channel #12107
Restart when: a published @objectstack/spec release that objectui installs carries the warnings key on CreateDataResponseSchema / UpdateDataResponseSchema (objectstack-ai/objectstack#22726). It stays pm:on-hold until then: objectui types its answers from the installed spec.
Read on objectui maince991bd70f
packages/data-objectstack/src/index.tsWriteWarningEvent (about :2328) and app-shell/src/providers/writeWarningToast.ts already carry droppedFields to a toast. warnings rides the same channel.
Done when
After a save whose answer carries warnings, the user sees each message, through the same toast channel droppedFields uses.
The read is additive: an answer without the key shows nothing new. That also holds against a runtime that predates the key.
#22726 landed as objectstack 490cb6d9fa (PR #22749).
That commit is an ancestor of @objectstack/spec@18.0.0-next.1's tag commit 0c52e43075. There, packages/spec/src/api/protocol.zod.ts:2267 declares warnings: z.array(ValidateDataIssueSchema).optional().
Claim: PM loop round 2 (priority:p3; unlocked by the triage seat's scan 6213835356)
Session: session_01XVp19E1MYUTFM3dnkwz8gB
Account: baozhoutao (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-12107-write-answer-warnings
Worktree: objectui-issue-12107
Domain: domain:ui
Seat: domain:ui#2
File surface: packages/data-objectstack/src/index.ts (the WriteWarningEvent shape and the create/update emit sites only); packages/app-shell/src/providers/writeWarningToast.ts; packages/i18n/src/locales/*.ts (new keys only, if the toast needs a heading); tests beside each; one .changeset/12107-*.md (stop on breach; explain in the report). ⛔ Not apps/console/src/components/FormPage.tsx or packages/app-shell/src/views/RecordFormPage.tsx (seat 1's objectui#12654 surface).
Container & model: S, mode:subagent, model: opus (default tier; dispatch-gates --tier --repo objectstack-ai/objectui reads no path-derived mandate for these paths)
Clause-②: yes (provisional: an optional warnings member on the exported WriteWarningEvent of @object-ui/data-objectstack widens a published type, so the dev reports the measured shape and a contract-tier review is owed before the queue; if the dev measures that no published type changes, the PR line says no)
Responsibility: n/a — not a defect card (additive read of a key the installed spec declares)
Thread-read: 6213835356
Serial constraints cleared: no open PR touches packages/data-objectstack/src/index.ts or writeWarningToast.ts. Scanned all open objectui PRs' file lists just now; the only near hit is objectui#12663's FormPage.sharedWidgets-10179.test.tsx, which is outside this surface.
Claimed at: 2026-10-16T13:42Z
os-dev-report
{
"issue": 12107,
"status": "done",
"branch": "claude/issue-12107-write-answer-warnings",
"pr": "#12709",
"session": "session_01XVp19E1MYUTFM3dnkwz8gB",
"premise_still_valid": true,
"dispatch_md5": "6d7a33a161e92d7b6b27accb2715948e (prompt12107.txt as read)",
"summary": "WriteWarningEvent (data-objectstack) gains optional warnings?: ValidateDataIssue[] typed from @objectstack/spec/api; the single-record create/update emit site (notifyDroppedFields) parses the answer's warnings through ValidateDataIssueSchema.safeParse and widens the measured gate only by 'or warnings non-empty' (droppedFields stays required, [] when the event exists only for warnings). app-shell emitWriteWarning keeps the stripped-fields toast unchanged and shows warnings in their OWN toast on the same sink (two toasts, not one combined: the stripped title says fields did not take effect, which misdescribes an advisory hit), each distinct message verbatim, one per line, under one new key detail.writeWarningsTitle added to all ten packs. A1 measured: WriteWarningEvent is exported from the package's only entry, so Clause-② yes; changeset minor data-objectstack, patch app-shell + i18n. Installed spec is 18.0.0-next.2 (lockfile moved past next.1; key present). Field label not prefixed to messages (ruling allows, does not require).",
"tests": "HEAD 849e0cf (git rev-parse --short HEAD after last commit). Closure build pnpm --filter '@object-ui/app-shell^...' build: VERDICT command-exit 0. type-check data-objectstack/app-shell/i18n: VERDICT command-exit 0; --listFiles counts both new test files in the checked programs (1/1). vitest --maxWorkers=1: onWriteWarning.test.ts 18 passed; writeWarningToast.test.ts 19 passed. Package dirs under lock: packages/data-objectstack/ 94 files / 1164 passed; packages/i18n/ 83 files / 1321 passed, 13 skipped. packages/app-shell/ whole dir NOT MEASURED, reason: serial run printed no file result in 22 min, stopped by my PID; declared narrowing to packages/app-shell/src/providers/ + product-neutral-renderer.ratchet.test.ts: 26 files / 274 passed; rest of app-shell declared to CI. Ablation (after commit, ablation-replace.mjs, src-resolved: data-objectstack has no dist in the worktree so the alias reads src): anchor 'const warnings = readWriteWarnings(result);' x1->x0, blob c113f4ec3cb5->892eb72f9058; 7 failed | 30 passed (both create pins, both update pins, both both-present controls, parse pin red; no-key controls green: expected direction); restore blob == HEAD c113f4ec3cb5 and git diff HEAD empty. Lint narrowed to 14 changed .ts files (eslint --format json count 14; inline config on as package lint scripts): 0 errors, 0 warnings on added lines; with --no-inline-config 4 errors, all pre-existing eslint-disabled console.debug lines in index.ts not in this diff; invariance: eslint.config.js declares no type-aware parserOptions, so the diff cannot move verdicts on untouched files. 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, i18n-designer-parity, control-bytes all exit 0; check-hand-rolled-comment-mask 0; check-changeset-fixed 0; check-changeset-presence 0; check:new-line-citations 0 new. check:spec-floors not run (not in this order's list). CI: in_progress, not awaited.",
"gates": {
"build-closure": 0,
"type-check(3 pkgs)": 0,
"vitest targeted": 0,
"vitest data-objectstack dir": 0,
"vitest i18n dir": 0,
"vitest app-shell dir": "NOT MEASURED (narrowed: providers/ + ratchet = 0)",
"lint narrowed": 0,
"check-battery(15)": 0,
"check-hand-rolled-comment-mask": 0,
"check-changeset-fixed": 0,
"check-changeset-presence": 0,
"check:new-line-citations": 0
},
"files_changed": [
"packages/data-objectstack/src/index.ts",
"packages/data-objectstack/src/onWriteWarning.test.ts",
"packages/app-shell/src/providers/writeWarningToast.ts",
"packages/app-shell/src/providers/writeWarningToast.test.ts",
"packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts",
".changeset/12107-write-answer-warnings.md"
],
"deviations": [
"app-shell whole-package vitest replaced by a declared narrowing (see tests)",
"no labels written: objectui, dispatch named none",
"toast pattern for (d): two toasts, stripped one unchanged"
],
"mcp_calls": "0 — no MCP GitHub tools called",
"api_writes": "5 — git push x4 (empty-branch probe + 3 commits; not REST); 1 fleet-write relay stroke pr_create (POST /repos/objectstack-ai/objectstack/dispatches -> relay POST /repos/objectstack-ai/objectui/pulls + POST /repos//issues/12709/assignees); 1 fleet-write relay stroke comment (this report, POST /repos//issues/12107/comments)",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none (承接者:无) · batchTransaction (notifyBatchDroppedFields) does not read a per-op warnings key; not measured whether the cross-object batch answer carries one · noted in PR Acceptance notes, not filed",
"carrier: none (承接者:无) · an advisory entry the spec schema refuses (e.g. a severity a later runtime adds) is dropped by safeParse, no skew arm · noted in PR Acceptance notes, not filed"
]
}
PR #12709 merged through the merge queue as 6757a93, which is on main. The squash commit's message names no model.
Verified by content:
The five data-objectstack and app-shell files and the changeset on origin/main are blob-identical to the accepted head 849e0cf.
The ten locale packs differ by blob only because other PRs edited those packs on main in the meantime. The squash commit's patch (6757a93^1..6757a93) matches the PR's own patch line for line.
15 files, +335 / −14.
What landed:
After a single-record create or update whose answer carries warnings, the user sees each advisory message, as the server wrote it, in a "Saved — with warnings" toast. That toast sits on the same channel as the stripped-fields toast, which is unchanged.
An answer without the key shows nothing new.
WriteWarningEvent gains an optional warnings member, released as a minor of @object-ui/data-objectstack.
Acceptance notes, recorded in the ACCEPT and not filed: an unknown future severity value fails the parse, which has no reach today; batch answers declare no warnings.
pm:dispatched leaves with this note. The card closed completed on merge.
Activity
objectstack-fleet commentedon Oct 16, 2026
Unlock scan:
pm:on-hold→pm:queue· the release this card waits on is installed · triage seat ·session_01AavokzJ5DndAwitDXvKy4U· 2026-10-16T10:48ZTriage seat (objectstack-wide, seat post objectstack-ai/objectstack#6015). ⛔ Not a claim, ⛔ not a dispatch.
Restart when:asks for a published@objectstack/specthat objectui installs carryingwarningsonCreateDataResponseSchema/UpdateDataResponseSchema(validation: aseverity: 'warning'rule's hit is only logged — the data write answer carries nowarnings, so no client can show the advisory #13889 calls UI-level objectstack#22726).490cb6d9fa(PR #22749).@objectstack/spec@18.0.0-next.1's tag commit0c52e43075. There,packages/spec/src/api/protocol.zod.ts:2267declareswarnings: z.array(ValidateDataIssueSchema).optional().main8a8bcf3dde'spnpm-lock.yamlresolves@objectstack/spec@18.0.0-next.1.mainreads a write answer'swarnings.objectstack-fleet commentedon Oct 16, 2026
Claim: PM loop round 2 (
priority:p3; unlocked by the triage seat's scan6213835356)Session:
session_01XVp19E1MYUTFM3dnkwz8gBAccount:
baozhoutao(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-12107-write-answer-warningsWorktree:
objectui-issue-12107Domain:
domain:uiSeat:
domain:ui#2File surface:
packages/data-objectstack/src/index.ts(theWriteWarningEventshape and the create/update emit sites only);packages/app-shell/src/providers/writeWarningToast.ts;packages/i18n/src/locales/*.ts(new keys only, if the toast needs a heading); tests beside each; one.changeset/12107-*.md(stop on breach; explain in the report). ⛔ Notapps/console/src/components/FormPage.tsxorpackages/app-shell/src/views/RecordFormPage.tsx(seat 1's objectui#12654 surface).Container & model:
S,mode:subagent,model: opus(default tier;dispatch-gates --tier --repo objectstack-ai/objectuireads no path-derived mandate for these paths)Clause-②: yes (provisional: an optional
warningsmember on the exportedWriteWarningEventof@object-ui/data-objectstackwidens a published type, so the dev reports the measured shape and a contract-tier review is owed before the queue; if the dev measures that no published type changes, the PR line says no)Responsibility:
n/a — not a defect card (additive read of a key the installed spec declares)Thread-read: 6213835356
Serial constraints cleared: no open PR touches
packages/data-objectstack/src/index.tsorwriteWarningToast.ts. Scanned all open objectui PRs' file lists just now; the only near hit is objectui#12663'sFormPage.sharedWidgets-10179.test.tsx, which is outside this surface.Claimed at: 2026-10-16T13:42Z
objectstack-fleet commentedon Oct 16, 2026
os-dev-report
{
"issue": 12107,
"status": "done",
"branch": "claude/issue-12107-write-answer-warnings",
"pr": "#12709",
"session": "session_01XVp19E1MYUTFM3dnkwz8gB",
"premise_still_valid": true,
"dispatch_md5": "6d7a33a161e92d7b6b27accb2715948e (prompt12107.txt as read)",
"summary": "WriteWarningEvent (data-objectstack) gains optional
warnings?: ValidateDataIssue[]typed from @objectstack/spec/api; the single-record create/update emit site (notifyDroppedFields) parses the answer'swarningsthrough ValidateDataIssueSchema.safeParse and widens the measured gate only by 'or warnings non-empty' (droppedFields stays required, [] when the event exists only for warnings). app-shell emitWriteWarning keeps the stripped-fields toast unchanged and shows warnings in their OWN toast on the same sink (two toasts, not one combined: the stripped title says fields did not take effect, which misdescribes an advisory hit), each distinct message verbatim, one per line, under one new key detail.writeWarningsTitle added to all ten packs. A1 measured: WriteWarningEvent is exported from the package's only entry, so Clause-② yes; changeset minor data-objectstack, patch app-shell + i18n. Installed spec is 18.0.0-next.2 (lockfile moved past next.1; key present). Field label not prefixed to messages (ruling allows, does not require).","tests": "HEAD 849e0cf (git rev-parse --short HEAD after last commit). Closure build pnpm --filter '@object-ui/app-shell^...' build: VERDICT command-exit 0. type-check data-objectstack/app-shell/i18n: VERDICT command-exit 0; --listFiles counts both new test files in the checked programs (1/1). vitest --maxWorkers=1: onWriteWarning.test.ts 18 passed; writeWarningToast.test.ts 19 passed. Package dirs under lock: packages/data-objectstack/ 94 files / 1164 passed; packages/i18n/ 83 files / 1321 passed, 13 skipped. packages/app-shell/ whole dir NOT MEASURED, reason: serial run printed no file result in 22 min, stopped by my PID; declared narrowing to packages/app-shell/src/providers/ + product-neutral-renderer.ratchet.test.ts: 26 files / 274 passed; rest of app-shell declared to CI. Ablation (after commit, ablation-replace.mjs, src-resolved: data-objectstack has no dist in the worktree so the alias reads src): anchor 'const warnings = readWriteWarnings(result);' x1->x0, blob c113f4ec3cb5->892eb72f9058; 7 failed | 30 passed (both create pins, both update pins, both both-present controls, parse pin red; no-key controls green: expected direction); restore blob == HEAD c113f4ec3cb5 and git diff HEAD empty. Lint narrowed to 14 changed .ts files (eslint --format json count 14; inline config on as package lint scripts): 0 errors, 0 warnings on added lines; with --no-inline-config 4 errors, all pre-existing eslint-disabled console.debug lines in index.ts not in this diff; invariance: eslint.config.js declares no type-aware parserOptions, so the diff cannot move verdicts on untouched files. 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, i18n-designer-parity, control-bytes all exit 0; check-hand-rolled-comment-mask 0; check-changeset-fixed 0; check-changeset-presence 0; check:new-line-citations 0 new. check:spec-floors not run (not in this order's list). CI: in_progress, not awaited.",
"gates": {
"build-closure": 0,
"type-check(3 pkgs)": 0,
"vitest targeted": 0,
"vitest data-objectstack dir": 0,
"vitest i18n dir": 0,
"vitest app-shell dir": "NOT MEASURED (narrowed: providers/ + ratchet = 0)",
"lint narrowed": 0,
"check-battery(15)": 0,
"check-hand-rolled-comment-mask": 0,
"check-changeset-fixed": 0,
"check-changeset-presence": 0,
"check:new-line-citations": 0
},
"files_changed": [
"packages/data-objectstack/src/index.ts",
"packages/data-objectstack/src/onWriteWarning.test.ts",
"packages/app-shell/src/providers/writeWarningToast.ts",
"packages/app-shell/src/providers/writeWarningToast.test.ts",
"packages/i18n/src/locales/{ar,de,en,es,fr,ja,ko,pt,ru,zh}.ts",
".changeset/12107-write-answer-warnings.md"
],
"deviations": [
"app-shell whole-package vitest replaced by a declared narrowing (see tests)",
"no labels written: objectui, dispatch named none",
"toast pattern for (d): two toasts, stripped one unchanged"
],
"mcp_calls": "0 — no MCP GitHub tools called",
"api_writes": "5 — git push x4 (empty-branch probe + 3 commits; not REST); 1 fleet-write relay stroke pr_create (POST /repos/objectstack-ai/objectstack/dispatches -> relay POST /repos/objectstack-ai/objectui/pulls + POST /repos//issues/12709/assignees); 1 fleet-write relay stroke comment (this report, POST /repos//issues/12107/comments)",
"open_questions": [],
"out_of_scope_findings": [
"carrier: none (承接者:无) · batchTransaction (notifyBatchDroppedFields) does not read a per-op warnings key; not measured whether the cross-object batch answer carries one · noted in PR Acceptance notes, not filed",
"carrier: none (承接者:无) · an advisory entry the spec schema refuses (e.g. a severity a later runtime adds) is dropped by safeParse, no skew arm · noted in PR Acceptance notes, not filed"
]
}
Generated by Claude Code
objectstack-fleet commentedon Oct 16, 2026
Landed ·
domain:uiseat 2 ·session_01XVp19E1MYUTFM3dnkwz8gB· 2026-10-16T14:50ZPR #12709 merged through the merge queue as
6757a93, which is onmain. The squash commit's message names no model.Verified by content:
origin/mainare blob-identical to the accepted head849e0cf.mainin the meantime. The squash commit's patch (6757a93^1..6757a93) matches the PR's own patch line for line.What landed:
warnings, the user sees each advisory message, as the server wrote it, in a "Saved — with warnings" toast. That toast sits on the same channel as the stripped-fields toast, which is unchanged.WriteWarningEventgains an optionalwarningsmember, released as aminorof@object-ui/data-objectstack.Acceptance notes, recorded in the ACCEPT and not filed: an unknown future
severityvalue fails the parse, which has no reach today; batch answers declare nowarnings.pm:dispatchedleaves with this note. The card closedcompletedon merge.Generated by Claude Code