@diviops/mcp-server 1.5.9 → 1.5.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -64,7 +64,7 @@ The skill enforces the Divi block format, the design system, and the response co
64
64
 
65
65
  ## Tools at a glance
66
66
 
67
- The server exposes **70 tools** across the categories below. Each category links to representative tools; the full table lives in [server-reference.md](../docs/server-reference.md).
67
+ The server exposes **73 tools** across the categories below. Each category links to representative tools; the full table lives in [server-reference.md](../docs/server-reference.md).
68
68
 
69
69
  | Category | Use case | Tool prefixes |
70
70
  |----------|----------|---------------|
@@ -0,0 +1,197 @@
1
+ {
2
+ "schema_version": "1.0.0",
3
+ "generated_at": "2026-05-19",
4
+ "purpose": "Capture-priority backlog for cells in verified-attrs.json whose EFFECTIVE evidence (min(pattern, cell)) is below VB_PRESET_STORAGE_VERIFIED (4). Each entry names what specifically needs a VB-roundtrip capture to upgrade. Sorted by likely real-world authoring importance (heuristic: Phase 1 modules first; Tier 1 universal decorations before Tier 2 pattern families before Tier 3 unique attrs; group-preset bindings before inline-only).",
5
+ "heuristic_note": "'Likely importance' favors cells that would unblock the most preset-driven authoring once captured. The 4 Phase 1 modules (divi/section, divi/heading, divi/text, divi/button) carry most of the real-world authoring weight; cells outside those modules are lower-priority until customer / dogfooding pressure surfaces them.",
6
+ "items": [
7
+ {
8
+ "priority": 1,
9
+ "module": "divi/heading",
10
+ "wrapper": "module",
11
+ "pattern_family": "module.decoration.background",
12
+ "current_effective_evidence": "SCHEMA_OBSERVED",
13
+ "blocker": "Pattern is VB_PRESET_STORAGE_VERIFIED (round-4-section.json) but applicability[divi/heading].cell_evidence_level is SCHEMA_OBSERVED. Need a divi/heading module-preset capture that emits module.decoration.background.desktop.value.color to lift the cell.",
14
+ "capture_target": "module-preset on divi/heading with module.decoration.background.desktop.value.color set via VB",
15
+ "value_to_authoring": "high (heading-with-background is a common pattern for accent / callout headings)",
16
+ "notes": "Should be captured on divi5-clean.local per reference_substrate_roles."
17
+ },
18
+ {
19
+ "priority": 1,
20
+ "module": "divi/text",
21
+ "wrapper": "module",
22
+ "pattern_family": "module.decoration.background",
23
+ "current_effective_evidence": "SCHEMA_OBSERVED",
24
+ "blocker": "Same as divi/heading row: pattern verified, cell not.",
25
+ "capture_target": "module-preset on divi/text with module.decoration.background.desktop.value.color",
26
+ "value_to_authoring": "medium",
27
+ "notes": ""
28
+ },
29
+ {
30
+ "priority": 1,
31
+ "module": "divi/heading",
32
+ "wrapper": "module",
33
+ "pattern_family": "module.decoration.spacing",
34
+ "current_effective_evidence": "SCHEMA_OBSERVED",
35
+ "blocker": "Pattern verified on section. Need a divi/heading module-preset with module.decoration.spacing.padding to confirm padding-widget atomicity holds on heading too.",
36
+ "capture_target": "module-preset on divi/heading with module.decoration.spacing.padding (touch top + bottom only) to confirm 4-corner + 2-sync emission rule cross-module",
37
+ "value_to_authoring": "high",
38
+ "notes": "Also covers margin axis if user touches both."
39
+ },
40
+ {
41
+ "priority": 1,
42
+ "module": "divi/text",
43
+ "wrapper": "module",
44
+ "pattern_family": "module.decoration.spacing",
45
+ "current_effective_evidence": "SCHEMA_OBSERVED",
46
+ "blocker": "Same as divi/heading row.",
47
+ "capture_target": "module-preset on divi/text with module.decoration.spacing.padding",
48
+ "value_to_authoring": "medium",
49
+ "notes": ""
50
+ },
51
+ {
52
+ "priority": 1,
53
+ "module": "divi/button",
54
+ "wrapper": "module",
55
+ "pattern_family": "module.decoration.spacing",
56
+ "current_effective_evidence": "SCHEMA_OBSERVED",
57
+ "blocker": "Pattern verified. Button-module padding is canonically authored on module.decoration.spacing (Button exception); cell needs its own VB roundtrip to upgrade.",
58
+ "capture_target": "module-preset on divi/button with module.decoration.spacing.padding",
59
+ "value_to_authoring": "high (button padding is core to button design system)",
60
+ "notes": "Pair with hover-padding-gate test (per workaround A1) — capture should include the bypass corner if A1 still applies."
61
+ },
62
+ {
63
+ "priority": 2,
64
+ "module": "divi/heading",
65
+ "wrapper": "module",
66
+ "pattern_family": "module.decoration.border",
67
+ "current_effective_evidence": "SCHEMA_OBSERVED",
68
+ "blocker": "Pattern verified on button (outlined). Need a divi/heading module-preset with module.decoration.border.{radius, styles.all.*} to confirm shape on heading.",
69
+ "capture_target": "module-preset on divi/heading with border.radius + border.styles.all.{width, color}",
70
+ "value_to_authoring": "medium",
71
+ "notes": ""
72
+ },
73
+ {
74
+ "priority": 2,
75
+ "module": "divi/section",
76
+ "wrapper": "module",
77
+ "pattern_family": "module.decoration.border",
78
+ "current_effective_evidence": "SCHEMA_OBSERVED",
79
+ "blocker": "Same.",
80
+ "capture_target": "module-preset on divi/section with module.decoration.border.*",
81
+ "value_to_authoring": "medium",
82
+ "notes": ""
83
+ },
84
+ {
85
+ "priority": 2,
86
+ "pattern_family": "divi/spacing",
87
+ "current_effective_evidence": "SCHEMA_OBSERVED",
88
+ "blocker": "Pattern-level evidence is bucket existence only (presets.md group-bucket inventory). No Phase 1 capture of a divi/spacing GROUP-preset (not module-preset spacing) exists; the round-4-section capture stores spacing under module.decoration.spacing as module-preset attrs, not as a divi/spacing group preset. Need a dedicated divi/spacing group-preset capture for each {module.decoration.spacing, title.decoration.spacing, content.decoration.spacing} slot.",
89
+ "capture_targets": [
90
+ "divi/spacing group preset bound to module.decoration.spacing on a divi/section",
91
+ "divi/spacing group preset bound to title.decoration.spacing on a divi/heading",
92
+ "divi/spacing group preset bound to content.decoration.spacing on a divi/text"
93
+ ],
94
+ "value_to_authoring": "very high (Composable Settings spacing presets are the entire preset-driven authoring story for spacing)",
95
+ "notes": "These captures lift the pattern_evidence_level for divi/spacing from SCHEMA_OBSERVED to VB_PRESET_STORAGE_VERIFIED in addition to lifting each cell."
96
+ },
97
+ {
98
+ "priority": 2,
99
+ "pattern_family": "divi/font (Pattern B)",
100
+ "module": "divi/text",
101
+ "wrapper": "content",
102
+ "current_effective_evidence": "UNVERIFIED",
103
+ "blocker_note": "Cell missing entirely from registry — divi/text + Pattern B is not yet enumerated as an applicability cell.",
104
+ "blocker": "Pattern B Heading cell exists but Pattern B body-text cell does not. round-2 _meta explicitly defers Pattern B body-text capture 'unless heading-vs-body shape divergence surfaces a body-specific need'.",
105
+ "capture_target": "divi/font-body group preset with locally-uploaded font (e.g. Sora 700) on divi/text content wrapper",
106
+ "value_to_authoring": "low (EU-GDPR sites need it, but Pattern A covers majority)",
107
+ "notes": ""
108
+ },
109
+ {
110
+ "priority": 2,
111
+ "pattern_family": "divi/button.font (Pattern B)",
112
+ "module": "divi/button",
113
+ "wrapper": "button",
114
+ "current_effective_evidence": "UNVERIFIED",
115
+ "blocker_note": "No Pattern B button capture exists; cell is absent from registry.",
116
+ "blocker": "Pattern A button font verified; Pattern B button font has no capture.",
117
+ "capture_target": "divi/button group preset using local-hosted font on the button wrapper",
118
+ "value_to_authoring": "low (EU-GDPR niche)",
119
+ "notes": ""
120
+ },
121
+ {
122
+ "priority": 3,
123
+ "module": "divi/blurb",
124
+ "wrapper": "title",
125
+ "pattern_family": "divi/font",
126
+ "current_effective_evidence": "SCHEMA_OBSERVED",
127
+ "blocker": "Pattern A divi/font verified on divi/heading. Wrapper inferred from module-formats.md Font Family B; not VB-roundtripped on divi/blurb specifically.",
128
+ "capture_target": "divi/font group preset bound to blurb's title element",
129
+ "value_to_authoring": "medium",
130
+ "notes": "Same capture also lights up bodyFont cell for blurb content if both are exercised."
131
+ },
132
+ {
133
+ "priority": 3,
134
+ "module": "divi/testimonial",
135
+ "wrapper": "author",
136
+ "pattern_family": "divi/font",
137
+ "current_effective_evidence": "SCHEMA_OBSERVED",
138
+ "blocker": "Testimonial exposes author, jobTitle, company variants — each a separate cell.",
139
+ "capture_target": "divi/font group preset on testimonial.author + .jobTitle + .company",
140
+ "value_to_authoring": "low",
141
+ "notes": ""
142
+ },
143
+ {
144
+ "priority": 3,
145
+ "module": "divi/accordion-item",
146
+ "wrapper": "title",
147
+ "pattern_family": "divi/font",
148
+ "current_effective_evidence": "SCHEMA_OBSERVED",
149
+ "blocker": "Wrapper inferred from module-formats.md.",
150
+ "capture_target": "divi/font group preset on accordion-item title",
151
+ "value_to_authoring": "low",
152
+ "notes": ""
153
+ },
154
+ {
155
+ "priority": 3,
156
+ "module": "divi/slide",
157
+ "wrapper": "title",
158
+ "pattern_family": "divi/font",
159
+ "current_effective_evidence": "SCHEMA_OBSERVED",
160
+ "blocker": "Wrapper inferred.",
161
+ "capture_target": "divi/font group preset on slide.title",
162
+ "value_to_authoring": "low",
163
+ "notes": ""
164
+ },
165
+ {
166
+ "priority": 3,
167
+ "module": "divi/number-counter",
168
+ "wrapper": "title",
169
+ "pattern_family": "divi/font",
170
+ "current_effective_evidence": "SCHEMA_OBSERVED",
171
+ "blocker": "Wrapper inferred.",
172
+ "capture_target": "divi/font group preset on number-counter.title (number wrapper too)",
173
+ "value_to_authoring": "low",
174
+ "notes": ""
175
+ },
176
+ {
177
+ "priority": 3,
178
+ "module": "divi/image",
179
+ "wrapper": "image",
180
+ "pattern_family": "module.decoration.border",
181
+ "current_effective_evidence": "SCHEMA_OBSERVED",
182
+ "blocker": "Image exception: border lives on image.decoration.border, not module.decoration.border. Also: border-radius from preset alone does not render on image — must reinforce inline per module-formats.md image-specific quirk.",
183
+ "capture_target": "module-preset on divi/image with image.decoration.border AND inline-reinforced radius; capture should document the preset-only-radius-doesnt-render gotcha",
184
+ "value_to_authoring": "medium",
185
+ "notes": "Cross-reference workaround A1-style discipline (capture the bug too)."
186
+ },
187
+ {
188
+ "priority": 4,
189
+ "pattern_family": "module.decoration.sizing",
190
+ "current_effective_evidence": "SCHEMA_OBSERVED",
191
+ "blocker": "Pattern itself only SCHEMA_OBSERVED (no Phase 1 capture); no module cell can rise above SCHEMA_OBSERVED until a sizing capture lands.",
192
+ "capture_target": "module-preset on divi/column with sizing.flexType, parent row in display:'flex' mode — confirm 24-unit-grid emission and parent-prereq",
193
+ "value_to_authoring": "medium (column-sizing is fundamental but mostly authored inline, not via presets)",
194
+ "notes": "Same capture session could exercise divi/group and divi/section sizing too."
195
+ }
196
+ ]
197
+ }
@@ -0,0 +1,663 @@
1
+ {
2
+ "schema_version": "1.0.0",
3
+ "registry_version": "1.0.0",
4
+ "generated_at": "2026-05-19",
5
+ "evidence_level_ordering": {
6
+ "UNVERIFIED": 0,
7
+ "SCHEMA_OBSERVED": 1,
8
+ "RUNTIME_VERIFIED": 2,
9
+ "VB_ROUNDTRIP_VERIFIED": 3,
10
+ "VB_PRESET_STORAGE_VERIFIED": 4,
11
+ "CROSS_VERSION_STABLE": 5
12
+ },
13
+ "effective_evidence_rule": "min(pattern_evidence_level, applicability[<module>].cell_evidence_level). Missing applicability[<module>] = UNVERIFIED (0).",
14
+ "write_emitter_threshold": "VB_PRESET_STORAGE_VERIFIED (>=4) at the EFFECTIVE level. SCHEMA_OBSERVED + caveat is allowed for non-mutating audit output only.",
15
+ "notes": [
16
+ "Tier 1 = shared decorations (background, spacing, border, sizing, ...). Carry pattern_evidence_level + per-module applicability[<module>].cell_evidence_level. Applicability is explicitly enumerated; never implicitly inherited.",
17
+ "Tier 2 = pattern families used by some modules (divi/font, divi/font-body, divi/button group). Carry pattern + per-module wrapper. Same explicit-enumeration rule.",
18
+ "Tier 3 = module-specific unique attrs. Per-module cell-level only.",
19
+ "Group-preset routing fields (group_name + group_id) appear per applicability cell on preset_type:group entries because shared buckets (e.g. divi/spacing) have constant groupName across modules but divergent groupId per use.",
20
+ "styleAttrs shorthand contract: capture files may use shorthand strings (e.g. 'byte-identical to attrs'); treat semantically as deepClone(attrs). Do not rewrite captures.",
21
+ "Day-one allowlist is a DERIVED QUERY at Track 4 CLI runtime: filter entries whose effective evidence (min rule above) is >= VB_PRESET_STORAGE_VERIFIED. No separate allowlist artifact ships.",
22
+ "Pattern A (Google Fonts: separate family + weight) and Pattern B (local-hosted: weight encoded in family string) are distinct entries; write emitter MUST NOT vouch one with the other's evidence.",
23
+ "Sources point to durable locations only: committed files in this repo (docs/, .claude/skills/) or stable URLs. .oaris/drafts/ paths are forbidden."
24
+ ],
25
+ "tier1": [
26
+ {
27
+ "pattern_family": "module.decoration.background",
28
+ "pattern_evidence_level": "VB_PRESET_STORAGE_VERIFIED",
29
+ "pattern_evidence_source": "docs/verification/evidence/canonical-shape-dumps-2026-05-18/round-4-section.json",
30
+ "pattern_divi_version": "5.5.2",
31
+ "pattern_verified_at": "2026-05-18",
32
+ "canonical_shape_note": "module.decoration.background.desktop.value.color holds a color literal or $variable() token. Hover at desktop.hover.color (NO 'value' wrapper between hover and color, per reference_canonical_hover_state_shape).",
33
+ "applicability": {
34
+ "divi/section": {
35
+ "wrapper": "module",
36
+ "preset_type": "module",
37
+ "cell_evidence_level": "VB_PRESET_STORAGE_VERIFIED",
38
+ "cell_divi_version": "5.5.2",
39
+ "verified_at": "2026-05-18",
40
+ "source": "docs/verification/evidence/canonical-shape-dumps-2026-05-18/round-4-section.json",
41
+ "preset_map_key": "module.decoration.background__color",
42
+ "state": "desktop.value",
43
+ "caveats": []
44
+ },
45
+ "divi/heading": {
46
+ "wrapper": "module",
47
+ "preset_type": "module",
48
+ "cell_evidence_level": "SCHEMA_OBSERVED",
49
+ "cell_divi_version": "5.5.2",
50
+ "verified_at": "2026-05-19",
51
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#tier-1--common-decoration-all-modules",
52
+ "caveats": ["Tier 1 documented as universally applicable in module-formats.md; no module-specific VB capture for divi/heading on this wrapper yet"]
53
+ },
54
+ "divi/text": {
55
+ "wrapper": "module",
56
+ "preset_type": "module",
57
+ "cell_evidence_level": "SCHEMA_OBSERVED",
58
+ "cell_divi_version": "5.5.2",
59
+ "verified_at": "2026-05-19",
60
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#tier-1--common-decoration-all-modules",
61
+ "caveats": []
62
+ },
63
+ "divi/button": {
64
+ "wrapper": "module",
65
+ "preset_type": "module",
66
+ "cell_evidence_level": "SCHEMA_OBSERVED",
67
+ "cell_divi_version": "5.5.2",
68
+ "verified_at": "2026-05-19",
69
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#button-vb-verified-2026-03-31-for-511-schema-audited-2026-04-12-",
70
+ "caveats": ["Button background is canonically authored at button.decoration.background (Tier 2 button group), not module.decoration.background; module-level background works only when intentionally targeting the surrounding wrapper"]
71
+ }
72
+ }
73
+ },
74
+ {
75
+ "pattern_family": "module.decoration.spacing",
76
+ "pattern_evidence_level": "VB_PRESET_STORAGE_VERIFIED",
77
+ "pattern_evidence_source": "docs/verification/evidence/canonical-shape-dumps-2026-05-18/round-4-section.json",
78
+ "pattern_divi_version": "5.5.2",
79
+ "pattern_verified_at": "2026-05-18",
80
+ "canonical_shape_note": "module.decoration.spacing.desktop.value.padding = {top, right, bottom, left, syncVertical, syncHorizontal}. Composable-widget atomicity: touching any padding sub-field emits all four corner keys plus both sync toggles, per feedback_vb_preset_emits_on_touch + round-4-section-not-touch-discriminator.json.",
81
+ "applicability": {
82
+ "divi/section": {
83
+ "wrapper": "module",
84
+ "preset_type": "module",
85
+ "cell_evidence_level": "VB_PRESET_STORAGE_VERIFIED",
86
+ "cell_divi_version": "5.5.2",
87
+ "verified_at": "2026-05-18",
88
+ "source": "docs/verification/evidence/canonical-shape-dumps-2026-05-18/round-4-section.json",
89
+ "preset_map_key": "module.decoration.spacing__padding",
90
+ "state": "desktop.value",
91
+ "caveats": ["Padding widget emits all 4 corners + 2 sync flags atomically on any sub-touch; do NOT emit partial subset"]
92
+ },
93
+ "divi/heading": {
94
+ "wrapper": "module",
95
+ "preset_type": "module",
96
+ "cell_evidence_level": "SCHEMA_OBSERVED",
97
+ "cell_divi_version": "5.5.2",
98
+ "verified_at": "2026-05-19",
99
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#tier-1--common-decoration-all-modules",
100
+ "caveats": []
101
+ },
102
+ "divi/text": {
103
+ "wrapper": "module",
104
+ "preset_type": "module",
105
+ "cell_evidence_level": "SCHEMA_OBSERVED",
106
+ "cell_divi_version": "5.5.2",
107
+ "verified_at": "2026-05-19",
108
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#tier-1--common-decoration-all-modules",
109
+ "caveats": []
110
+ },
111
+ "divi/button": {
112
+ "wrapper": "module",
113
+ "preset_type": "module",
114
+ "cell_evidence_level": "SCHEMA_OBSERVED",
115
+ "cell_divi_version": "5.5.2",
116
+ "verified_at": "2026-05-19",
117
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#button-vb-verified-2026-03-31-for-511-schema-audited-2026-04-12-",
118
+ "caveats": ["Button-module padding lives on module.decoration.spacing per Button exception, NOT button.decoration.spacing (which is VB-hidden / non-functional). See module-formats.md."]
119
+ },
120
+ "divi/row": {
121
+ "wrapper": "module",
122
+ "preset_type": "module",
123
+ "cell_evidence_level": "SCHEMA_OBSERVED",
124
+ "cell_divi_version": "5.5.2",
125
+ "verified_at": "2026-05-19",
126
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#tier-1--common-decoration-all-modules",
127
+ "caveats": []
128
+ },
129
+ "divi/column": {
130
+ "wrapper": "module",
131
+ "preset_type": "module",
132
+ "cell_evidence_level": "SCHEMA_OBSERVED",
133
+ "cell_divi_version": "5.5.2",
134
+ "verified_at": "2026-05-19",
135
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#tier-1--common-decoration-all-modules",
136
+ "caveats": []
137
+ },
138
+ "divi/group": {
139
+ "wrapper": "module",
140
+ "preset_type": "module",
141
+ "cell_evidence_level": "SCHEMA_OBSERVED",
142
+ "cell_divi_version": "5.5.2",
143
+ "verified_at": "2026-05-19",
144
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#tier-1--common-decoration-all-modules",
145
+ "caveats": []
146
+ }
147
+ }
148
+ },
149
+ {
150
+ "pattern_family": "module.decoration.border",
151
+ "pattern_evidence_level": "VB_PRESET_STORAGE_VERIFIED",
152
+ "pattern_evidence_source": "docs/verification/evidence/canonical-shape-dumps-2026-05-18/round-4-button-outlined-canonical.json",
153
+ "pattern_divi_version": "5.5.2",
154
+ "pattern_verified_at": "2026-05-19",
155
+ "canonical_shape_note": "border.desktop.value.{radius, styles.all.{width, style, color}}. radius vocabulary canonical: {topLeft, topRight, bottomLeft, bottomRight, sync}. styles.all.style is per-side string ('solid', 'dashed', ...) — VB emits styles.all.width + styles.all.color when user touches Width + Color; emits styles.all.style only when user touches the Style dropdown (per round-4-button-outlined-canonical user_did_NOT_touch_fields).",
156
+ "applicability": {
157
+ "divi/button": {
158
+ "wrapper": "button",
159
+ "preset_type": "group",
160
+ "group_name": "divi/button",
161
+ "group_id": "button",
162
+ "cell_evidence_level": "VB_PRESET_STORAGE_VERIFIED",
163
+ "cell_divi_version": "5.5.2",
164
+ "verified_at": "2026-05-19",
165
+ "source": "docs/verification/evidence/canonical-shape-dumps-2026-05-18/round-4-button-outlined-canonical.json",
166
+ "preset_map_key": "button.decoration.border__styles",
167
+ "state": "desktop.value",
168
+ "caveats": ["Outlined-button canonical shape; radius capture is at round-3-button-canonical-complete.json with sync='on'"]
169
+ },
170
+ "divi/section": {
171
+ "wrapper": "module",
172
+ "preset_type": "module",
173
+ "cell_evidence_level": "SCHEMA_OBSERVED",
174
+ "cell_divi_version": "5.5.2",
175
+ "verified_at": "2026-05-19",
176
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#tier-1--common-decoration-all-modules",
177
+ "caveats": []
178
+ },
179
+ "divi/heading": {
180
+ "wrapper": "module",
181
+ "preset_type": "module",
182
+ "cell_evidence_level": "SCHEMA_OBSERVED",
183
+ "cell_divi_version": "5.5.2",
184
+ "verified_at": "2026-05-19",
185
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#tier-1--common-decoration-all-modules",
186
+ "caveats": []
187
+ },
188
+ "divi/text": {
189
+ "wrapper": "module",
190
+ "preset_type": "module",
191
+ "cell_evidence_level": "SCHEMA_OBSERVED",
192
+ "cell_divi_version": "5.5.2",
193
+ "verified_at": "2026-05-19",
194
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#tier-1--common-decoration-all-modules",
195
+ "caveats": []
196
+ },
197
+ "divi/image": {
198
+ "wrapper": "image",
199
+ "preset_type": "module",
200
+ "cell_evidence_level": "SCHEMA_OBSERVED",
201
+ "cell_divi_version": "5.5.2",
202
+ "verified_at": "2026-05-19",
203
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#image-vb-verified-2026-03-19-schema-audited-2026-04-12--exception",
204
+ "caveats": ["Image-module exception: border lives on image.decoration.border, NOT module.decoration.border. Border radius from preset alone does not render — reinforce inline per module-formats.md image-specific quirk."]
205
+ }
206
+ }
207
+ },
208
+ {
209
+ "pattern_family": "module.decoration.sizing",
210
+ "pattern_evidence_level": "SCHEMA_OBSERVED",
211
+ "pattern_evidence_source": ".claude/skills/divi-5-builder/references/module-formats.md#tier-1--common-decoration-all-modules",
212
+ "pattern_divi_version": "5.5.2",
213
+ "pattern_verified_at": "2026-05-19",
214
+ "canonical_shape_note": "sizing.desktop.value.{maxWidth, width, flexType, alignment, alignSelf, minHeight, height}. flexType uses 24-unit grid ('8_24', '12_24'). flexType requires parent row display:'flex' per module-formats.md Column section. No Phase 1 capture for sizing yet; pattern remains SCHEMA_OBSERVED until a VB-roundtrip lands.",
215
+ "applicability": {
216
+ "divi/column": {
217
+ "wrapper": "module",
218
+ "preset_type": "module",
219
+ "cell_evidence_level": "SCHEMA_OBSERVED",
220
+ "cell_divi_version": "5.5.2",
221
+ "verified_at": "2026-05-19",
222
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#column-vb-verified-2026-03-19-flex-pipeline-reverified-2026-05-09-against-divi-541-",
223
+ "caveats": ["flexType requires parent row display:'flex'; on block-display rows Divi emits the legacy et_pb_column_N_M class and ignores flexType (intentional Divi behavior, not a bug)"]
224
+ },
225
+ "divi/group": {
226
+ "wrapper": "module",
227
+ "preset_type": "module",
228
+ "cell_evidence_level": "SCHEMA_OBSERVED",
229
+ "cell_divi_version": "5.5.2",
230
+ "verified_at": "2026-05-19",
231
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#group-vb-verified-2026-03-21-",
232
+ "caveats": []
233
+ },
234
+ "divi/section": {
235
+ "wrapper": "module",
236
+ "preset_type": "module",
237
+ "cell_evidence_level": "SCHEMA_OBSERVED",
238
+ "cell_divi_version": "5.5.2",
239
+ "verified_at": "2026-05-19",
240
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#tier-1--common-decoration-all-modules",
241
+ "caveats": []
242
+ }
243
+ }
244
+ }
245
+ ],
246
+ "tier2": [
247
+ {
248
+ "pattern_family": "divi/font",
249
+ "pattern_variant": "google_fonts_pattern_a",
250
+ "pattern_evidence_level": "VB_PRESET_STORAGE_VERIFIED",
251
+ "pattern_evidence_source": "docs/verification/evidence/canonical-shape-dumps-2026-05-18/round-1a-heading-h1-pattern-a-google.json",
252
+ "pattern_divi_version": "5.5.2",
253
+ "pattern_verified_at": "2026-05-18",
254
+ "canonical_shape_note": "Pattern A (Google Fonts CDN): separate {family: 'Inter', weight: '700', size, color} keys at <wrapper>.decoration.font.font.desktop.value.*. weight is a numeric-string ('100' to '900'). See reference_local_hosted_fonts_eu_pattern.",
255
+ "co_attrs": ["weight", "size", "color"],
256
+ "family_value_format": "plain_family_name",
257
+ "applicability": {
258
+ "divi/heading": {
259
+ "wrapper": "title",
260
+ "preset_type": "group",
261
+ "group_name": "divi/font",
262
+ "group_id": "designTitleText",
263
+ "cell_evidence_level": "VB_PRESET_STORAGE_VERIFIED",
264
+ "cell_divi_version": "5.5.2",
265
+ "verified_at": "2026-05-18",
266
+ "source": "docs/verification/evidence/canonical-shape-dumps-2026-05-18/round-1a-heading-h1-pattern-a-google.json",
267
+ "preset_map_key": "title.decoration.font.font__family",
268
+ "state": "desktop.value",
269
+ "caveats": []
270
+ },
271
+ "divi/blurb": {
272
+ "wrapper": "title",
273
+ "preset_type": "group",
274
+ "group_name": "divi/font",
275
+ "group_id": "designTitleText",
276
+ "cell_evidence_level": "SCHEMA_OBSERVED",
277
+ "cell_divi_version": "5.5.2",
278
+ "verified_at": "2026-05-19",
279
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#tier-2--pattern-families",
280
+ "caveats": ["Wrapper inferred from module-formats.md Font Family B; not VB-roundtripped on divi/blurb specifically"]
281
+ },
282
+ "divi/number-counter": {
283
+ "wrapper": "title",
284
+ "preset_type": "group",
285
+ "group_name": "divi/font",
286
+ "group_id": "designTitleText",
287
+ "cell_evidence_level": "SCHEMA_OBSERVED",
288
+ "cell_divi_version": "5.5.2",
289
+ "verified_at": "2026-05-19",
290
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#tier-2--pattern-families",
291
+ "caveats": []
292
+ },
293
+ "divi/testimonial": {
294
+ "wrapper": "author",
295
+ "preset_type": "group",
296
+ "group_name": "divi/font",
297
+ "group_id": "designTitleText",
298
+ "cell_evidence_level": "SCHEMA_OBSERVED",
299
+ "cell_divi_version": "5.5.2",
300
+ "verified_at": "2026-05-19",
301
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#tier-2--pattern-families",
302
+ "caveats": ["Testimonial also exposes jobTitle and company variants; each is a separate cell"]
303
+ },
304
+ "divi/accordion-item": {
305
+ "wrapper": "title",
306
+ "preset_type": "group",
307
+ "group_name": "divi/font",
308
+ "group_id": "designTitleText",
309
+ "cell_evidence_level": "SCHEMA_OBSERVED",
310
+ "cell_divi_version": "5.5.2",
311
+ "verified_at": "2026-05-19",
312
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#tier-2--pattern-families",
313
+ "caveats": []
314
+ },
315
+ "divi/slide": {
316
+ "wrapper": "title",
317
+ "preset_type": "group",
318
+ "group_name": "divi/font",
319
+ "group_id": "designTitleText",
320
+ "cell_evidence_level": "SCHEMA_OBSERVED",
321
+ "cell_divi_version": "5.5.2",
322
+ "verified_at": "2026-05-19",
323
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#tier-2--pattern-families",
324
+ "caveats": []
325
+ }
326
+ }
327
+ },
328
+ {
329
+ "pattern_family": "divi/font",
330
+ "pattern_variant": "local_hosted_pattern_b",
331
+ "pattern_evidence_level": "VB_PRESET_STORAGE_VERIFIED",
332
+ "pattern_evidence_source": "docs/verification/evidence/canonical-shape-dumps-2026-05-18/round-1b-heading-h1-pattern-b-local.json",
333
+ "pattern_divi_version": "5.5.2",
334
+ "pattern_verified_at": "2026-05-18",
335
+ "canonical_shape_note": "Pattern B (local-hosted, EU-GDPR via divi-oafontz plugin + et_uploaded_fonts): {family: 'Sora 700', size, color} — weight is ENCODED in family string; NO separate 'weight' key. Pattern A vs Pattern B are NOT interchangeable evidence for write emitters. Reference: reference_local_hosted_fonts_eu_pattern.",
336
+ "co_attrs": ["size", "color"],
337
+ "family_value_format": "weight_encoded_in_family_string",
338
+ "applicability": {
339
+ "divi/heading": {
340
+ "wrapper": "title",
341
+ "preset_type": "group",
342
+ "group_name": "divi/font",
343
+ "group_id": "designTitleText",
344
+ "cell_evidence_level": "VB_PRESET_STORAGE_VERIFIED",
345
+ "cell_divi_version": "5.5.2",
346
+ "verified_at": "2026-05-18",
347
+ "source": "docs/verification/evidence/canonical-shape-dumps-2026-05-18/round-1b-heading-h1-pattern-b-local.json",
348
+ "preset_map_key": "title.decoration.font.font__family",
349
+ "state": "desktop.value",
350
+ "caveats": ["User did NOT touch the weight picker; Pattern B's encoding lives in the family string itself"]
351
+ }
352
+ }
353
+ },
354
+ {
355
+ "pattern_family": "divi/font-body",
356
+ "pattern_variant": "google_fonts_pattern_a",
357
+ "pattern_evidence_level": "VB_PRESET_STORAGE_VERIFIED",
358
+ "pattern_evidence_source": "docs/verification/evidence/canonical-shape-dumps-2026-05-18/round-2-body-text-pattern-a.json",
359
+ "pattern_divi_version": "5.5.2",
360
+ "pattern_verified_at": "2026-05-18",
361
+ "canonical_shape_note": "Pattern A on body-text family. Wrapper chain: content.decoration.bodyFont.body.font.desktop.value.{family, weight, color, size}. bodyFont.link.font.desktop.value.color for link state. Pattern B for body-text deferred unless heading-vs-body shape divergence surfaces a body-specific need (per round-2 _meta).",
362
+ "co_attrs": ["weight", "size", "color"],
363
+ "family_value_format": "plain_family_name",
364
+ "applicability": {
365
+ "divi/text": {
366
+ "wrapper": "content",
367
+ "preset_type": "group",
368
+ "group_name": "divi/font-body",
369
+ "group_id": "designText",
370
+ "cell_evidence_level": "VB_PRESET_STORAGE_VERIFIED",
371
+ "cell_divi_version": "5.5.2",
372
+ "verified_at": "2026-05-18",
373
+ "source": "docs/verification/evidence/canonical-shape-dumps-2026-05-18/round-2-body-text-pattern-a.json",
374
+ "preset_map_key": "content.decoration.bodyFont.body.font__family",
375
+ "state": "desktop.value",
376
+ "caveats": []
377
+ },
378
+ "divi/testimonial": {
379
+ "wrapper": "content",
380
+ "preset_type": "group",
381
+ "group_name": "divi/font-body",
382
+ "group_id": "designText",
383
+ "cell_evidence_level": "SCHEMA_OBSERVED",
384
+ "cell_divi_version": "5.5.2",
385
+ "verified_at": "2026-05-19",
386
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#tier-2--pattern-families",
387
+ "caveats": []
388
+ },
389
+ "divi/accordion-item": {
390
+ "wrapper": "content",
391
+ "preset_type": "group",
392
+ "group_name": "divi/font-body",
393
+ "group_id": "designText",
394
+ "cell_evidence_level": "SCHEMA_OBSERVED",
395
+ "cell_divi_version": "5.5.2",
396
+ "verified_at": "2026-05-19",
397
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#tier-2--pattern-families",
398
+ "caveats": []
399
+ },
400
+ "divi/slide": {
401
+ "wrapper": "content",
402
+ "preset_type": "group",
403
+ "group_name": "divi/font-body",
404
+ "group_id": "designText",
405
+ "cell_evidence_level": "SCHEMA_OBSERVED",
406
+ "cell_divi_version": "5.5.2",
407
+ "verified_at": "2026-05-19",
408
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#tier-2--pattern-families",
409
+ "caveats": []
410
+ },
411
+ "divi/blurb": {
412
+ "wrapper": "content",
413
+ "preset_type": "group",
414
+ "group_name": "divi/font-body",
415
+ "group_id": "designText",
416
+ "cell_evidence_level": "SCHEMA_OBSERVED",
417
+ "cell_divi_version": "5.5.2",
418
+ "verified_at": "2026-05-19",
419
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#tier-2--pattern-families",
420
+ "caveats": []
421
+ }
422
+ }
423
+ },
424
+ {
425
+ "pattern_family": "divi/button.background",
426
+ "pattern_evidence_level": "VB_PRESET_STORAGE_VERIFIED",
427
+ "pattern_evidence_source": "docs/verification/evidence/canonical-shape-dumps-2026-05-18/round-3-button-canonical-complete.json",
428
+ "pattern_divi_version": "5.5.2",
429
+ "pattern_verified_at": "2026-05-18",
430
+ "canonical_shape_note": "button.decoration.background.desktop.{value.color, hover.color}. NOTE: hover wrapper omits 'value' (per reference_canonical_hover_state_shape — Divi 5.5.x hover is one wrapper shallower than desktop). Phase 2 CLI must emit hover.color (NOT hover.value.color).",
431
+ "applicability": {
432
+ "divi/button": {
433
+ "wrapper": "button",
434
+ "preset_type": "group",
435
+ "group_name": "divi/button",
436
+ "group_id": "button",
437
+ "cell_evidence_level": "VB_PRESET_STORAGE_VERIFIED",
438
+ "cell_divi_version": "5.5.2",
439
+ "verified_at": "2026-05-18",
440
+ "source": "docs/verification/evidence/canonical-shape-dumps-2026-05-18/round-3-button-canonical-complete.json",
441
+ "preset_map_key": "button.decoration.background__color",
442
+ "state": "desktop.value + desktop.hover",
443
+ "caveats": []
444
+ }
445
+ }
446
+ },
447
+ {
448
+ "pattern_family": "divi/button.border",
449
+ "pattern_evidence_level": "VB_PRESET_STORAGE_VERIFIED",
450
+ "pattern_evidence_source": "docs/verification/evidence/canonical-shape-dumps-2026-05-18/round-3-button-canonical-complete.json",
451
+ "pattern_divi_version": "5.5.2",
452
+ "pattern_verified_at": "2026-05-18",
453
+ "canonical_shape_note": "button.decoration.border.desktop.value.radius = {topLeft, topRight, bottomLeft, bottomRight, sync}. Outlined-button styles.all.{width, color} captured at round-4-button-outlined-canonical.json. radius vocabulary differs from current MCP shape ({top,right,bottom,left,syncCorners}) — migration question deferred per F2 of round-3 findings.",
454
+ "applicability": {
455
+ "divi/button": {
456
+ "wrapper": "button",
457
+ "preset_type": "group",
458
+ "group_name": "divi/button",
459
+ "group_id": "button",
460
+ "cell_evidence_level": "VB_PRESET_STORAGE_VERIFIED",
461
+ "cell_divi_version": "5.5.2",
462
+ "verified_at": "2026-05-18",
463
+ "source": "docs/verification/evidence/canonical-shape-dumps-2026-05-18/round-3-button-canonical-complete.json",
464
+ "preset_map_key": "button.decoration.border__radius",
465
+ "state": "desktop.value",
466
+ "caveats": ["Canonical radius vocabulary is {topLeft, topRight, bottomLeft, bottomRight, sync} — NOT {top,right,bottom,left,syncCorners}. Current MCP shape diverges; migration question deferred per round-3 finding F2."]
467
+ }
468
+ }
469
+ },
470
+ {
471
+ "pattern_family": "divi/button.font",
472
+ "pattern_variant": "google_fonts_pattern_a",
473
+ "pattern_evidence_level": "VB_PRESET_STORAGE_VERIFIED",
474
+ "pattern_evidence_source": "docs/verification/evidence/canonical-shape-dumps-2026-05-18/round-3-button-canonical-complete.json",
475
+ "pattern_divi_version": "5.5.2",
476
+ "pattern_verified_at": "2026-05-18",
477
+ "canonical_shape_note": "button.decoration.font.font.desktop.value.{family, weight, color}. Pattern A only at present; Pattern B button capture deferred to backlog. button.decoration.font.font is Font Family B (double-nested).",
478
+ "co_attrs": ["weight", "color"],
479
+ "family_value_format": "plain_family_name",
480
+ "applicability": {
481
+ "divi/button": {
482
+ "wrapper": "button",
483
+ "preset_type": "group",
484
+ "group_name": "divi/button",
485
+ "group_id": "button",
486
+ "cell_evidence_level": "VB_PRESET_STORAGE_VERIFIED",
487
+ "cell_divi_version": "5.5.2",
488
+ "verified_at": "2026-05-18",
489
+ "source": "docs/verification/evidence/canonical-shape-dumps-2026-05-18/round-3-button-canonical-complete.json",
490
+ "preset_map_key": "button.decoration.font.font__family",
491
+ "state": "desktop.value",
492
+ "caveats": []
493
+ }
494
+ }
495
+ },
496
+ {
497
+ "pattern_family": "divi/spacing",
498
+ "pattern_evidence_level": "SCHEMA_OBSERVED",
499
+ "pattern_evidence_source": ".claude/skills/divi-5-builder/references/presets.md#known-group-bucket-inventory-vb-verified-2026-05-04",
500
+ "pattern_divi_version": "5.5.2",
501
+ "pattern_verified_at": "2026-05-19",
502
+ "canonical_shape_note": "Composable Settings spacing bucket — module-level AND inner-element-level share this bucket. groupId uses dotted attribute path (5.4.0+): module.decoration.spacing, title.decoration.spacing, content.decoration.spacing. Pattern observed as bucket existence (presets.md group-bucket inventory) but no Phase 1 dedicated spacing-group-preset capture yet; promote to VB_PRESET_STORAGE_VERIFIED once a divi/spacing group-preset capture lands.",
503
+ "applicability": {
504
+ "divi/heading": {
505
+ "wrapper": "title",
506
+ "preset_type": "group",
507
+ "group_name": "divi/spacing",
508
+ "group_id": "title.decoration.spacing",
509
+ "cell_evidence_level": "SCHEMA_OBSERVED",
510
+ "cell_divi_version": "5.5.2",
511
+ "verified_at": "2026-05-19",
512
+ "source": ".claude/skills/divi-5-builder/references/presets.md#known-group-bucket-inventory-vb-verified-2026-05-04",
513
+ "caveats": ["divi/spacing group bucket VB-confirmed (5.4.0); per-module title-spacing cell needs its own roundtrip"]
514
+ },
515
+ "divi/text": {
516
+ "wrapper": "content",
517
+ "preset_type": "group",
518
+ "group_name": "divi/spacing",
519
+ "group_id": "content.decoration.spacing",
520
+ "cell_evidence_level": "SCHEMA_OBSERVED",
521
+ "cell_divi_version": "5.5.2",
522
+ "verified_at": "2026-05-19",
523
+ "source": ".claude/skills/divi-5-builder/references/presets.md#known-group-bucket-inventory-vb-verified-2026-05-04",
524
+ "caveats": []
525
+ },
526
+ "divi/section": {
527
+ "wrapper": "module",
528
+ "preset_type": "group",
529
+ "group_name": "divi/spacing",
530
+ "group_id": "module.decoration.spacing",
531
+ "cell_evidence_level": "SCHEMA_OBSERVED",
532
+ "cell_divi_version": "5.5.2",
533
+ "verified_at": "2026-05-19",
534
+ "source": ".claude/skills/divi-5-builder/references/presets.md#known-group-bucket-inventory-vb-verified-2026-05-04",
535
+ "caveats": []
536
+ },
537
+ "divi/button": {
538
+ "wrapper": "module",
539
+ "preset_type": "group",
540
+ "group_name": "divi/spacing",
541
+ "group_id": "module.decoration.spacing",
542
+ "cell_evidence_level": "SCHEMA_OBSERVED",
543
+ "cell_divi_version": "5.5.2",
544
+ "verified_at": "2026-05-19",
545
+ "source": ".claude/skills/divi-5-builder/references/presets.md#known-group-bucket-inventory-vb-verified-2026-05-04",
546
+ "caveats": ["Button padding is canonically authored on module.decoration.spacing per Button exception (NOT button.decoration.spacing which is VB-hidden)"]
547
+ }
548
+ }
549
+ }
550
+ ],
551
+ "tier3": [
552
+ {
553
+ "module": "divi/button",
554
+ "attr_path": "button.innerContent.desktop.value",
555
+ "shape": "{text: string, linkUrl: string}",
556
+ "preset_type": "inline",
557
+ "evidence_level": "SCHEMA_OBSERVED",
558
+ "divi_version": "5.5.2",
559
+ "verified_at": "2026-05-19",
560
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#button-vb-verified-2026-03-31-for-511-schema-audited-2026-04-12-",
561
+ "status": "documented",
562
+ "caveats": ["innerContent is per-instance, not normally preset-authored; the Phase 1 captures focus on preset shape so this cell remains SCHEMA_OBSERVED for now"]
563
+ },
564
+ {
565
+ "module": "divi/text",
566
+ "attr_path": "content.innerContent.desktop.value",
567
+ "shape": "HTML string (unicode-escaped, e.g. '\\u003cp\\u003eBody\\u003c/p\\u003e')",
568
+ "preset_type": "inline",
569
+ "evidence_level": "SCHEMA_OBSERVED",
570
+ "divi_version": "5.5.2",
571
+ "verified_at": "2026-05-19",
572
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#text-vb-verified-2026-03-19-schema-audited-2026-04-12-",
573
+ "status": "documented",
574
+ "caveats": []
575
+ },
576
+ {
577
+ "module": "divi/heading",
578
+ "attr_path": "title.innerContent.desktop.value",
579
+ "shape": "plain string",
580
+ "preset_type": "inline",
581
+ "evidence_level": "SCHEMA_OBSERVED",
582
+ "divi_version": "5.5.2",
583
+ "verified_at": "2026-05-19",
584
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#heading-vb-verified-2026-03-19-schema-audited-2026-04-12-",
585
+ "status": "documented",
586
+ "caveats": []
587
+ },
588
+ {
589
+ "module": "divi/heading",
590
+ "attr_path": "title.decoration.font.font.desktop.value.headingLevel",
591
+ "shape": "string enum 'h1'..'h6'",
592
+ "preset_type": "module",
593
+ "evidence_level": "SCHEMA_OBSERVED",
594
+ "divi_version": "5.5.2",
595
+ "verified_at": "2026-05-19",
596
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#tier-2--pattern-families",
597
+ "status": "documented",
598
+ "caveats": ["headingLevel is a structural-only field — preset's styleAttrs strip it per presets.md storage-format notes"]
599
+ },
600
+ {
601
+ "module": "divi/image",
602
+ "attr_path": "image.innerContent.desktop.value",
603
+ "shape": "{src, id, alt, linkUrl, linkTarget} OR separate sub-items per schema",
604
+ "preset_type": "inline",
605
+ "evidence_level": "SCHEMA_OBSERVED",
606
+ "divi_version": "5.5.2",
607
+ "verified_at": "2026-05-19",
608
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#image-vb-verified-2026-03-19-schema-audited-2026-04-12--exception",
609
+ "status": "documented",
610
+ "caveats": ["Combined form appears to work in practice; VB round-trip test pending per module-formats.md drift candidate note"]
611
+ },
612
+ {
613
+ "module": "divi/icon",
614
+ "attr_path": "icon.innerContent.desktop.value",
615
+ "shape": "{unicode, type: 'fa'|'divi', weight: '400'|'900', url?: string}",
616
+ "preset_type": "inline",
617
+ "evidence_level": "SCHEMA_OBSERVED",
618
+ "divi_version": "5.5.2",
619
+ "verified_at": "2026-05-19",
620
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#icon-vb-verified-2026-03-19-schema-audited-2026-04-12-",
621
+ "status": "documented",
622
+ "caveats": []
623
+ },
624
+ {
625
+ "module": "divi/section",
626
+ "attr_path": "module.advanced.dividers.{top,bottom}.desktop.value",
627
+ "shape": "{style, height, color, repeat, flip[], arrangement}",
628
+ "preset_type": "module",
629
+ "evidence_level": "SCHEMA_OBSERVED",
630
+ "divi_version": "5.5.2",
631
+ "verified_at": "2026-05-19",
632
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#dividers-section-only-vb-verified-2026-03-23",
633
+ "status": "documented",
634
+ "caveats": ["Section only; Row/Column/Group do not support dividers"]
635
+ },
636
+ {
637
+ "module": "divi/column",
638
+ "attr_path": "module.decoration.sizing.desktop.value.flexType",
639
+ "shape": "24-unit grid string enum ('1_24'..'24_24'; '8_24'=1/3, '12_24'=1/2)",
640
+ "preset_type": "module",
641
+ "evidence_level": "SCHEMA_OBSERVED",
642
+ "divi_version": "5.5.2",
643
+ "verified_at": "2026-05-19",
644
+ "source": ".claude/skills/divi-5-builder/references/module-formats.md#column-vb-verified-2026-03-19-flex-pipeline-reverified-2026-05-09-against-divi-541-",
645
+ "status": "documented",
646
+ "caveats": ["Requires parent row display:'flex'; otherwise Divi emits legacy et_pb_column_N_M and ignores flexType (intentional Divi behavior)"]
647
+ }
648
+ ],
649
+ "patterns_index": {
650
+ "fonts": {
651
+ "pattern_a_google_cdn": {
652
+ "discriminator_capture": "docs/verification/evidence/canonical-shape-dumps-2026-05-18/round-1a-heading-h1-pattern-a-google.json",
653
+ "shape_note": "separate family + weight + size + color keys",
654
+ "co_attrs": ["family", "weight", "size", "color"]
655
+ },
656
+ "pattern_b_local_hosted": {
657
+ "discriminator_capture": "docs/verification/evidence/canonical-shape-dumps-2026-05-18/round-1b-heading-h1-pattern-b-local.json",
658
+ "shape_note": "family encodes weight ('Sora 700'); NO separate weight key — Pattern B requires divi-oafontz local-font setup",
659
+ "co_attrs": ["family", "size", "color"]
660
+ }
661
+ }
662
+ }
663
+ }
package/dist/index.js CHANGED
@@ -316,7 +316,7 @@ registerPluginTool("diviops_schema_get_settings", {
316
316
  };
317
317
  });
318
318
  registerPluginTool("diviops_global_color_list", {
319
- description: "Get the global color palette defined in Divi. Returns all global colors that can be referenced by modules. Returns the standardized envelope { ok, data?, error: { code, message, hint? } }.",
319
+ description: "Get the global color palette defined in Divi. Returns `{ colors, customizer }` — `colors` is the user-defined palette stored under `et_divi.et_global_data.global_colors` (read via the #719 priority-ordered probe); `customizer` surfaces the five WP-customizer-bound defaults (gcid-primary-color / gcid-secondary-color / gcid-heading-color / gcid-body-color / gcid-link-color) sourced from `\\ET\\Builder\\Packages\\GlobalData\\GlobalData::$customizer_colors`. Top-level `_meta.source_path` + `_meta.probed_paths` document which storage path yielded the user palette; `_meta.customizer_source` describes the customizer-bound default surface. Returns the standardized envelope { ok, data?, error: { code, message, hint? } }.",
320
320
  annotations: { idempotentHint: true },
321
321
  _meta: { idempotent: "true" },
322
322
  }, async () => {
@@ -327,6 +327,18 @@ registerPluginTool("diviops_global_color_list", {
327
327
  ],
328
328
  };
329
329
  });
330
+ registerPluginTool("diviops_global_color_audit_storage", {
331
+ description: "Audit the global_colors STORAGE LOCATION landscape (#719 contract). Aggregates entries across all candidate paths for the global_colors surface with per-entry provenance via `_meta.entry_sources = { <id>: { path, provenance } }`. Provenance vocabulary: `et_divi_nested` (canonical 5.x — `et_divi.et_global_data.global_colors`), `top_level` (hypothetical standalone option, not observed on tested 5.5.x substrates), `wp_customizer` (the five WP-customizer-bound defaults — gcid-primary-color / gcid-secondary-color / gcid-heading-color / gcid-body-color / gcid-link-color, sourced from GlobalData::$customizer_colors). Warnings: `id_collision` (same id across two paths). The user palette overrides customizer defaults when both present (matches Divi's render-side behavior at GlobalData::get_global_colors). Returns the standardized envelope { ok, data?, error: { code, message, hint? } }.",
332
+ annotations: { idempotentHint: true },
333
+ _meta: { idempotent: "true" },
334
+ }, async () => {
335
+ const result = await wp.requestEnveloped("/global-color/audit-storage");
336
+ return {
337
+ content: [
338
+ { type: "text", text: serializeEnvelope(result, "diviops_global_color_audit_storage") },
339
+ ],
340
+ };
341
+ });
330
342
  registerPluginTool("diviops_global_color_create", {
331
343
  description: "Add a new global color to Divi's palette. The plugin mints a fresh `gcid-<uuid>` ID (the server forwards the color entry without an id and the WP-side handler generates one) and writes to the et_global_data option in the canonical Divi shape `{color, folder, label, lastUpdated, status, usedInPosts}`. The color appears in the VB color picker after save and can be referenced via `$variable({type:color,value:{name:gcid-...}})$` tokens. Note: Divi's AI Agent bundle has a Zod schema gap that drops `label` on its own writes — our PHP path goes around that bug by writing directly to the option. CONCURRENCY: this is a read-modify-write on a single WP option with no conflict detection. If a Visual Builder session holds stale global data, its next save can clobber colors written here in the interim. Coordinate writes when VB sessions are active, or have the user reload VB after MCP color writes. Returns the standardized envelope { ok, data?, error: { code, message, hint? } }; input-shape rejections (non-CSS color value, missing required `color` for a new entry) return code 'invalid_input' with `error.data` documenting the failed field." +
332
344
  DRY_RUN_DESC_SUFFIX,
@@ -443,7 +455,7 @@ registerPluginTool("diviops_global_color_delete", {
443
455
  return { content: [{ type: "text", text: serializeEnvelope(result, "diviops_global_color_delete") }] };
444
456
  });
445
457
  registerPluginTool("diviops_global_font_list", {
446
- description: "List the DiviOps-managed global fonts registered under `et_global_data.global_fonts`. ALWAYS returns the normalized shape `{ count: number, fonts: { <gfid>: <record>, ... } }` — even on empty substrates (count:0, fonts:{}), never bare `false`. Distinct from the variable-manager font tokens (`gvid-*` under `et_global_data.global_variables.fonts`, surfaced via `diviops_variable_list({type:\"fonts\"})`) — `global_font_*` is the DiviOps-controlled font catalog presets bind to via canonical `gfid-` slugs. Returns the standardized envelope { ok, data?, error: { code, message, hint? } }.",
458
+ description: "List the DiviOps-managed global fonts registered under `et_divi.et_global_data.global_fonts` (gfid-* Google catalog) AND the local-hosted Pattern B fonts registered under `et_uploaded_fonts` (per #719 AC #9). Returns `{ count, fonts, uploaded_count, uploaded_fonts }` — both maps always emitted as JSON objects (consistent shape across empty/populated substrates). Top-level `_meta.sources` discriminates the two surfaces with `provenance: \"gfid_catalog\"` vs `provenance: \"uploaded_local\"`. Distinct from the variable-manager font tokens (`gvid-*` under `et_global_data.global_variables.fonts`, surfaced via `diviops_variable_list({type:\"fonts\"})`) — `global_font_*` is the DiviOps-controlled font catalog presets bind to via canonical `gfid-` slugs. Returns the standardized envelope { ok, data?, error: { code, message, hint? } }.",
447
459
  annotations: { idempotentHint: true },
448
460
  _meta: { idempotent: "true" },
449
461
  }, async () => {
@@ -454,6 +466,18 @@ registerPluginTool("diviops_global_font_list", {
454
466
  ],
455
467
  };
456
468
  });
469
+ registerPluginTool("diviops_global_font_audit_storage", {
470
+ description: "Audit the global_fonts STORAGE LOCATION landscape (#719 contract). Aggregates entries across the gfid-* catalog (`et_divi.et_global_data.global_fonts`) AND the local-hosted `et_uploaded_fonts` Pattern B surface with per-entry provenance via `_meta.entry_sources = { <id>: { path, provenance } }`. Provenance vocabulary: `gfid_catalog` (Google CDN canonical), `uploaded_local` (file-uploaded local-hosted fonts per `reference_local_hosted_fonts_eu_pattern`). Warnings: `id_collision` (same id in both — upstream contract violation since the two surfaces are key-namespace-disjoint by convention). Returns the standardized envelope { ok, data?, error: { code, message, hint? } }.",
471
+ annotations: { idempotentHint: true },
472
+ _meta: { idempotent: "true" },
473
+ }, async () => {
474
+ const result = await wp.requestEnveloped("/global-font/audit-storage");
475
+ return {
476
+ content: [
477
+ { type: "text", text: serializeEnvelope(result, "diviops_global_font_audit_storage") },
478
+ ],
479
+ };
480
+ });
457
481
  registerPluginTool("diviops_global_font_create", {
458
482
  description: "Create a new global font in DiviOps's registry under `et_global_data.global_fonts`. Mints a fresh `gfid-<uuid>` if `id` is omitted; otherwise uses the supplied id (must match `gfid-[0-9a-z-]{1,80}`; auto-prefixes `gfid-` if missing). Strict create — collision on existing id returns `conflict` (HTTP 409) with `error.data = { id, existing }`; use diviops_global_font_update to modify an existing record. Stored shape: `{ family, source, weights[], subsets[], label, fallback, status, lastUpdated }`. Required: `family` (CSS family name, e.g. \"Sora\") + `source` (one of `google`/`system`/`custom`). Distinct from `diviops_variable_create({type:\"fonts\"})` which writes `gvid-*` font tokens to the variable manager — `global_font_*` is the DiviOps catalog presets bind via `gfid-` slugs. Returns the standardized envelope { ok, data?, error: { code, message, hint? } }; input-shape rejections (malformed id, invalid source enum, non-array weights/subsets, missing required `family`/`source` for a new entry) collapse onto `invalid_input` with structured `error.data`." +
459
483
  DRY_RUN_DESC_SUFFIX,
@@ -1244,6 +1268,18 @@ registerPluginTool("diviops_preset_audit", {
1244
1268
  ],
1245
1269
  };
1246
1270
  });
1271
+ registerPluginTool("diviops_preset_audit_storage", {
1272
+ description: "Audit the D5 preset STORAGE LOCATION landscape (#719 contract). Distinct from `diviops_preset_audit` (which audits preset CONTENT — usage refs, orphans, defaults). Aggregates entries across the canonical top-level `et_divi_builder_global_presets_d5` and the legacy nested `et_divi.builder_global_presets_d5` scratchpad on upgraded substrates, with per-entry provenance via `_meta.entry_sources = { <id>: { path, provenance } }`. Provenance vocabulary: `d5_top_level` (canonical), `d5_nested_scratchpad` (upgrade artifact), `legacy_d4_ng` (D4-era `et_divi_builder_global_presets_ng` store — OUT-OF-BAND per the banner, surfaced via entry_sources only, NEVER merged into the D5 aggregate). Warnings: `id_collision` (same id across D5 paths, same top-level shape), `shape_inconsistency` (same id, divergent top-level keys), `ng_non_empty` (legacy D4 store contains content; surface for inventory). Use this to diagnose substrate state before/after upgrades — agents do NOT auto-migrate; surfacing state is the contract. Returns the standardized envelope { ok, data?, error: { code, message, hint? } }; the routing-provenance fields sit on top-level `_meta`.",
1273
+ annotations: { idempotentHint: true },
1274
+ _meta: { idempotent: "true" },
1275
+ }, async () => {
1276
+ const result = await wp.requestEnveloped("/preset/audit-storage");
1277
+ return {
1278
+ content: [
1279
+ { type: "text", text: serializeEnvelope(result, "diviops_preset_audit_storage") },
1280
+ ],
1281
+ };
1282
+ });
1247
1283
  registerPluginTool("diviops_preset_cleanup", {
1248
1284
  description: 'Clean up presets. Default: remove spam presets. Optional: dedup=true to also remove duplicates, action="rename_strip_prefix" with prefix to strip a name prefix, or action="remove_orphans" with scope="spam"|"all" to remove unreferenced presets. Use dry_run: true (default) to preview. Returns the standardized envelope { ok, data?, error: { code, message, hint? } }. Note: dry_run currently returns the route-specific summary shape rather than the standardized `data.plan = { summary, changes[] }` shape used by tools introduced after the dry_run convention was generalized; plan-shape standardization is tracked separately for the pre-existing dry_run wave.',
1249
1285
  inputSchema: {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@diviops/mcp-server",
3
- "version": "1.5.9",
3
+ "version": "1.5.10",
4
4
  "description": "MCP server exposing Divi 5 Visual Builder as tools for Claude",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",
@@ -10,6 +10,8 @@
10
10
  "files": [
11
11
  "dist",
12
12
  "templates",
13
+ "data/verified-attrs.json",
14
+ "data/verified-attrs-backlog.json",
13
15
  "README.md"
14
16
  ],
15
17
  "scripts": {