openpencil/crates
Fini 2ca873346c fix(mcp): default omitted effect fields instead of dropping the whole node
ShadowBody deserializes with five required fields, so a model omitting
just spread lost the entire node — and every child line that named it as
a parent cascaded into 'Insert parent not found' (a measured 19-line,
whole-card silent loss). Effects are now normalized before the strict
parse: identity defaults for offsets/blur/spread, alias folding for the
common synonyms, a lone effect object wrapped into the array, numeric
strings coerced, and glow/drop-shadow spellings canonicalized. Truly
unknown effect kinds still fail the node — inventing an effect the model
did not ask for would be worse than dropping one. The modify path's
parser reuses the same normalizer so the two lanes cannot drift.

Claude-Session: https://claude.ai/code/session_01FqKQqNj8exYwopGDpYUU7x
2026-07-28 22:12:36 +08:00
..
op-acp fix(editor): async hygiene — safe block_on, bounded acp channels, thread teardown 2026-07-26 13:19:34 +08:00
op-ai feat(agent): surface a quality credential after generation 2026-07-28 00:29:39 +08:00
op-ai-skills fix(ai): point the latin line-height tiers at the cjk rules 2026-07-28 00:29:39 +08:00
op-auth-bridge refactor: dedupe cross-crate code and converge hardcoded literals 2026-07-26 11:24:22 +08:00
op-cli refactor: typed error enums across the whole workspace 2026-07-27 21:09:06 +08:00
op-codegen refactor: typed error enums across the whole workspace 2026-07-27 21:09:06 +08:00
op-config-store test(desktop): keep persistence tests out of the real user config 2026-07-28 00:29:39 +08:00
op-design-lint refactor: final 800-line sweep across editor, mcp, services, and tool crates 2026-07-26 22:34:37 +08:00
op-editor-core fix(editor): route escape through the color-variable popup on native too 2026-07-28 00:36:35 +08:00
op-editor-host-core feat(agent): surface a quality credential after generation 2026-07-28 00:29:39 +08:00
op-editor-ui fix(editor): route escape through the color-variable popup on native too 2026-07-28 00:36:35 +08:00
op-figma refactor: typed error enums across the whole workspace 2026-07-27 21:09:06 +08:00
op-git
op-host-desktop fix(ci): satisfy the fmt gate and the version-literal fixture rule 2026-07-28 00:56:22 +08:00
op-host-native fix(renderer): register pan-cache strips to the layer anchor and refresh on decode 2026-07-28 22:11:36 +08:00
op-host-services fix(ci): satisfy the fmt gate and the version-literal fixture rule 2026-07-28 00:56:22 +08:00
op-host-web fix(web): import the scroll helper the popover wheel path uses 2026-07-28 00:49:57 +08:00
op-host-web-server refactor: dedupe cross-crate code and converge hardcoded literals 2026-07-26 11:24:22 +08:00
op-html refactor: typed error enums across the whole workspace 2026-07-27 21:09:06 +08:00
op-i18n feat(i18n): complete locale coverage for batch export and match-ratio keys 2026-07-28 00:49:57 +08:00
op-mcp fix(mcp): default omitted effect fields instead of dropping the whole node 2026-07-28 22:12:36 +08:00
op-opmerge
op-orchestrator fix(mcp): default omitted effect fields instead of dropping the whole node 2026-07-28 22:12:36 +08:00
op-pen-loader fix(canvas): adopt stack semantics for layout:none and retire the flow bandaid 2026-07-28 22:11:59 +08:00
op-process-io
op-rpc-transport refactor: typed error enums across the whole workspace 2026-07-27 21:09:06 +08:00
op-smoke feat(agent): surface a quality credential after generation 2026-07-28 00:29:39 +08:00
op-util refactor: dedupe cross-crate code and converge hardcoded literals 2026-07-26 11:24:22 +08:00
op-web-sdk refactor: typed error enums across the whole workspace 2026-07-27 21:09:06 +08:00
CLAUDE.md docs: refresh image-fill popover description and add the gl-host test invariant 2026-07-28 00:29:39 +08:00