P13 · Assembly · Rendered from source

top companies

Preview, editor and change loop

41 lines52,643 bytessha256 bf4c9a6bf7c9
Lovable Visual Editsrecord 1
{
  "id": "P13-C-001",
  "name": "Lovable Visual Edits",
  "category": "ai_app_builder",
  "source_url": "https://lovable.dev/blog/visual-edits",
  "observed_date": "2026-08-27",
  "evidence_class": "first_party_docs",
  "claim": "Compile-time stable component IDs injected by a Vite plugin let visual edits map deterministically back to specific JSX nodes, and saves emit line-scoped diffs rather than regenerating files.",
  "edit_ops": {
    "add": true,
    "remove": true,
    "replace": null,
    "reorder": null,
    "theme": true,
    "text": true,
    "data_binding": false
  },
  "upgrade_safety": "Edits land in the user's own source tree as JSX/Tailwind diffs; there is no separate upstream component to upgrade, so 'upgrade safety' collapses into ordinary git history. Revert button and GitHub sync are the documented recovery paths.",
  "intent_capture": "Only the resulting mutation is persisted (AST change -> JSX diff). The preview toolbar accepts a natural-language description of the change, but the durable artifact is the code diff, not the stated intent.",
  "escape_hatch": "Unbounded: any request exceeding the visual surface falls through to full LLM code generation over the same repo, plus direct code editing and GitHub export. There is no denial boundary.",
  "limitations": "Because the escape hatch is unbounded codegen, the composition can be dissolved by any sufficiently ambitious prompt. Widely reported 'fix one thing, break another' regressions; AI updates one file and misses dependent imports on larger projects.",
  "disposition": "top10",
  "top10_rank": 2,
  "top10_rationale": "The single closest published account of the exact mechanism Actionist needs: stable compile-time IDs binding a visual surface to a governed source tree, with line-scoped diffs instead of regeneration. It is equally instructive as a negative: because its escape hatch is unbounded codegen over the same files, nothing prevents a prompt from dissolving the composition, which is precisely the failure Actionist must design against."
}
Builder.io Visual Editorrecord 2
{
  "id": "P13-C-002",
  "name": "Builder.io Visual Editor",
  "category": "visual_cms_page_builder",
  "source_url": "https://www.builder.io/c/docs/design-tokens",
  "observed_date": "2026-08-27",
  "evidence_class": "first_party_docs",
  "claim": "Ships an explicit governance surface: registered design tokens with styleStrictMode, components-only mode, per-role style restrictions, and model-scoped component availability.",
  "edit_ops": {
    "add": true,
    "remove": true,
    "replace": true,
    "reorder": true,
    "theme": true,
    "text": true,
    "data_binding": true
  },
  "upgrade_safety": "Components live in the customer's own code and are referenced by registration, not copied into Builder ('Builder does not retain or store your components in any way'), so upgrading a component upgrades every placement. Registered input schemas are the compatibility contract.",
  "intent_capture": "Partial and structural rather than semantic: the stored artifact is a component reference plus typed input values, which records WHICH governed component and WHAT bound values, but not why the editor chose them.",
  "escape_hatch": "Graduated rather than binary: styleStrictMode:true confines editors to registered token values; components-only mode restricts insertion to registered components; Roles and Permissions can grant content editing without style editing. Requests beyond the surface require a developer to register new component or token.",
  "limitations": "Governance is opt-in and account-wide or role-wide, not per-composition. styleStrictMode can also be configured so tokens act as suggestions rather than required values, which silently reopens the boundary.",
  "disposition": "top10",
  "top10_rank": 1,
  "top10_rationale": "The most complete commercial answer to Actionist's actual question: a visual surface whose edit vocabulary is defined by developer-registered components and tokens, with strict mode as an enforceable boundary rather than a convention. Uniquely, it separates the governance dial (strict vs suggestion, components-only, per-role) from the editing surface itself, which is exactly the axis Actionist must expose to clients."
}
Plasmicrecord 3
{
  "id": "P13-C-003",
  "name": "Plasmic",
  "category": "visual_cms_page_builder",
  "source_url": "https://docs.plasmic.app/learn/codegen-components/",
  "observed_date": "2026-08-27",
  "evidence_class": "first_party_docs",
  "claim": "Codegen splits generated files into Plasmic-owned and developer-owned, so 'plasmic sync' overwrites only the former and developer edits survive design updates by construction.",
  "edit_ops": {
    "add": true,
    "remove": true,
    "replace": true,
    "reorder": true,
    "theme": true,
    "text": true,
    "data_binding": true
  },
  "upgrade_safety": "Strongest observed model in the census. Generated files are used as blackbox libraries by the developer's own React components with a clear ownership split; overwriting Plasmic-owned files on every sync is safe because developer edits live in developer-owned files. plasmic.lock tracks versions; a documented major-version upgrade guide exists.",
  "intent_capture": "Design intent is captured as the durable artifact: the Plasmic project remains the source of truth for components and pages rather than being a one-time export, so the design (not just its code output) is what gets re-synced.",
  "escape_hatch": "Component substitution: placeholder components in Studio are swapped for real implementations at build or render time, letting a bounded visual placement resolve to arbitrary developer code without dissolving the composition. Also Headless API vs codegen as two lock-in postures.",
  "limitations": "The ownership split is a convention enforced by codegen layout, not by the runtime; a developer who edits Plasmic-owned files loses them on next sync. Codegen requires committing generated source and managing plasmic.json/plasmic.lock.",
  "disposition": "top10",
  "top10_rank": 3,
  "top10_rationale": "The clearest existence proof that upgrade safety can be structural rather than best-effort: partition generated output by ownership and overwriting becomes safe. Component substitution is the most elegant escape hatch found anywhere in the census, because it lets an arbitrary-code request be satisfied without the composition losing its shape."
}
Shopify Online Store 2.0 theme editorrecord 4
{
  "id": "P13-C-004",
  "name": "Shopify Online Store 2.0 theme editor",
  "category": "commerce_theme_editor",
  "source_url": "https://shopify.dev/docs/storefronts/themes/os20",
  "observed_date": "2026-08-27",
  "evidence_class": "first_party_docs",
  "claim": "JSON templates separate merchant section/settings data from theme code, so add/remove/reorder of sections on any page is a data edit rather than a code edit.",
  "edit_ops": {
    "add": true,
    "remove": true,
    "replace": true,
    "reorder": true,
    "theme": true,
    "text": true,
    "data_binding": true
  },
  "upgrade_safety": "Explicitly layered and the best-documented three-layer split in the census: settings/section data in settings_data.json and JSON templates, theme code in .liquid files, app integrations in app blocks. A theme update replaces the code layer and mostly leaves the settings layer intact. App blocks are removed cleanly on uninstall, unlike pre-2.0 orphaned snippets. BUT see observed failures in P13-C-005.",
  "intent_capture": "Structural only: the JSON template records which section with which settings, not why. Merchant intent beyond the schema is unrepresentable.",
  "escape_hatch": "Three-tier: (1) section/block settings, (2) a Liquid input setting allowing custom Liquid directly from the editor, (3) the full code editor. Tier 2 and 3 are where upgrade safety is forfeited.",
  "limitations": "Direct .liquid edits are outside the protected layer and are overwritten by updates. Merchants routinely conflate the three layers, which is the documented root of 'the update deleted my customizations' complaints.",
  "disposition": "top10",
  "top10_rank": 4,
  "top10_rationale": "The largest-scale production deployment of exactly Actionist's architecture: a governed component catalog (sections/blocks) whose placements and settings are data, upgradeable independently of the code beneath. It is the highest-value case study precisely because it is old enough and big enough to have generated real failure evidence about where the layer boundary leaks."
}
Shopify theme update settings-wipe incident (Mar 2026)record 5
{
  "id": "P13-C-005",
  "name": "Shopify theme update settings-wipe incident (Mar 2026)",
  "category": "production_evidence",
  "source_url": "https://karangoyal.cc/blog/shopify-theme-update-wiping-customizations-2026",
  "observed_date": "2026-08-27",
  "evidence_class": "secondary",
  "claim": "Since approximately 20 March 2026, Shopify theme updates were reported to wipe global customizations including logos and settings — i.e. the layer that is architecturally supposed to survive an upgrade did not.",
  "edit_ops": {
    "add": null,
    "remove": null,
    "replace": null,
    "reorder": null,
    "theme": null,
    "text": null,
    "data_binding": null
  },
  "upgrade_safety": "This IS the upgrade-safety finding: a documented, architecturally-guaranteed separation still failed in production. Reported as acknowledged in Shopify community forums with no official fix announced at time of writing; mitigation advice was to not update via the Theme Store without a verified backup.",
  "intent_capture": "n/a",
  "escape_hatch": "Recovery only: Shopify retains previous theme versions under Online Store > Themes > (...) > View older versions.",
  "limitations": "Secondary source (independent blog aggregating community reports), not a first-party Shopify status page or postmortem. The March 2026 date and 'acknowledged, unfixed' status are UNVERIFIED against a first-party Shopify incident record — this needs a direct check of Shopify's status history or community threads before being quoted to the client.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Contentful Studio Experiencesrecord 6
{
  "id": "P13-C-006",
  "name": "Contentful Studio Experiences",
  "category": "cms_visual_editing",
  "source_url": "https://www.contentful.com/developers/docs/experiences/overview/",
  "observed_date": "2026-08-27",
  "evidence_class": "first_party_docs",
  "claim": "Compose layouts from developer-predefined components, bind structured content to component properties, and save grouped components as reusable Patterns with pre-bound content.",
  "edit_ops": {
    "add": true,
    "remove": true,
    "replace": true,
    "reorder": true,
    "theme": true,
    "text": true,
    "data_binding": true
  },
  "upgrade_safety": "Components are registered from the customer's design system via defineComponents in the Experiences SDK, so the code stays upstream and upgradeable. Caveat documented first-party: publishing updates to a bound entry affects all entries and experiences referencing it.",
  "intent_capture": "The strongest structural intent capture in the census via Patterns and pre-binding: a Pattern records a reusable design decision (this group of components, arranged this way, pre-associated with this content shape) as a first-class named object, not as a flattened result. Pre-binding requires SDK >= 3.8.0.",
  "escape_hatch": "Developer-side: nested components via children:true let wrapper components accept arbitrary children for carousels/tabs/accordions. Beyond that, a developer must define a new component.",
  "limitations": "React 18+ only. Drag-and-drop is degraded outside Chrome — Safari and Firefox support click-and-drop but not click/drag-and-drop. Four-persona model (developer/designer/marketer/editor) implies organizational overhead Actionist's clients may not have.",
  "disposition": "top10",
  "top10_rank": 5,
  "top10_rationale": "Patterns plus pre-binding is the closest commercial analogue to capturing WHAT a user meant rather than the resulting mutation, because the reusable design decision is stored as a named object with its own content contract. The explicit separation of marketer (assembles layout) from editor (binds content) also models the permission split Actionist will need over a single composition."
}
Storyblokrecord 7
{
  "id": "P13-C-007",
  "name": "Storyblok",
  "category": "cms_visual_editing",
  "source_url": "https://www.storyblok.com/docs/api/management/components/the-component-schema-field-object",
  "observed_date": "2026-08-27",
  "evidence_class": "first_party_docs",
  "claim": "The bloks field type carries a machine-readable composition grammar: restrict_components, component_whitelist, component_group_whitelist, component_tag_whitelist, denylist variants, and a maximum count.",
  "edit_ops": {
    "add": true,
    "remove": true,
    "replace": true,
    "reorder": true,
    "theme": null,
    "text": true,
    "data_binding": true
  },
  "upgrade_safety": "Component schemas are versioned server-side and edited through the Management API or Terraform (labd/storyblok provider), so composition rules are infrastructure-as-code. Content referencing a changed schema is not automatically migrated.",
  "intent_capture": "Structural only: the stored blok tree records which component with which field values.",
  "escape_hatch": "Denial by construction — a component not on the whitelist cannot be inserted at that position. This is the cleanest hard boundary observed: the constraint is declarative data on the parent field, not editor UI policy.",
  "limitations": "Whitelists apply to nestable/universal component types; content types are not nestable this way, a documented and recurring source of user confusion. No theming/token layer comparable to Builder.io.",
  "disposition": "top10",
  "top10_rank": 6,
  "top10_rationale": "The best commercial model of a declarative composition grammar: which children may go in which slot is a whitelist on the parent field, expressible as code and enforceable at insert time. Actionist needs exactly this kind of machine-checkable containment rule so that 'add a section' can be permitted or refused without a human or an LLM adjudicating it."
}
Microsoft Power Apps / Dataverse solution layeringrecord 8
{
  "id": "P13-C-008",
  "name": "Microsoft Power Apps / Dataverse solution layering",
  "category": "enterprise_low_code",
  "source_url": "https://learn.microsoft.com/en-us/power-platform/alm/solution-layers-alm",
  "observed_date": "2026-08-27",
  "evidence_class": "first_party_docs",
  "claim": "Customizations resolve through an explicit layer stack: a single unmanaged layer sits above ordered managed layers, and removing a layer reveals the one beneath rather than losing the base.",
  "edit_ops": {
    "add": true,
    "remove": true,
    "replace": true,
    "reorder": null,
    "theme": null,
    "text": true,
    "data_binding": true
  },
  "upgrade_safety": "The most rigorous upgrade-safety model in the census. Customer edits are a distinct layer above vendor layers rather than an in-place mutation, so 'Remove active customizations' restores vendor behavior and uninstalling a managed solution falls back to the layer below. Conflicts resolve by last-one-wins or documented merge logic.",
  "intent_capture": "Captured as a layer delta: the system stores the customer's override as a separate addressable object, which preserves both the vendor's original and the fact that the customer deliberately changed it — closer to intent than a flattened diff, though still not a stated reason.",
  "escape_hatch": "Structural: you cannot add components to a managed solution; the customer must create their own unmanaged solution to customize, and some components are simply not customizable at all. The boundary is enforced, not advisory.",
  "limitations": "Documented operational pitfall: unmanaged layers get created unintentionally on managed apps in production/QA, which then conflicts with importing a newer solution version. Heavy ALM ceremony; enterprise-scale complexity.",
  "disposition": "top10",
  "top10_rank": 7,
  "top10_rationale": "The only surface found that solves upgrade-after-edit by layering rather than by diffing or by convention: the client's change is a separate addressable object above the vendor's, so both survive and either can be withdrawn. If Actionist wants clients to edit an assembled product AND still receive upstream component upgrades, this is the reference architecture, and its documented unmanaged-layer pitfalls are the failure modes to design out."
}
WordPress Gutenberg block locking + theme.jsonrecord 9
{
  "id": "P13-C-009",
  "name": "WordPress Gutenberg block locking + theme.json",
  "category": "cms_visual_editing",
  "source_url": "https://developer.wordpress.org/block-editor/reference-guides/theme-json-reference/theme-json-living/",
  "observed_date": "2026-08-27",
  "evidence_class": "first_party_docs",
  "claim": "Splits governance across two mechanisms that do not compose: theme.json constrains available style values, block locking constrains structural moves, and neither can do the other's job.",
  "edit_ops": {
    "add": true,
    "remove": true,
    "replace": true,
    "reorder": true,
    "theme": true,
    "text": true,
    "data_binding": true
  },
  "upgrade_safety": "Weak. theme.json v3 is the theme's contract and travels with theme updates, but user content is block markup in post_content that is not migrated when a block's schema changes; deprecated-block handling is per-block author responsibility.",
  "intent_capture": "Structural only: serialized block markup plus attributes.",
  "escape_hatch": "Explicitly leaky and documented as such — block locking is a UI affordance, not an enforced boundary: any user with editor access can unlock a block, and permanently restricting it requires PHP (canLockBlocks capability or removing the ability entirely). theme.json cannot lock, unlock, or disable blocks at all.",
  "limitations": "The gap between the two mechanisms is an open, acknowledged problem — Gutenberg issue #71013 tracks making site-level and granular editor locking first-class, predictable and testable from theme.json and CPT registration, which is an admission that it currently is not.",
  "disposition": "top10",
  "top10_rank": 9,
  "top10_rationale": "The most valuable negative result in the census: the largest block-based editing surface in the world still cannot express 'this composition is governed' in one place, and its own maintainers have an open tracking issue saying so. It shows Actionist that structural containment and style containment must be one contract, because splitting them produces a boundary that clients can trivially step over."
}
Webflow components, properties and variablesrecord 10
{
  "id": "P13-C-010",
  "name": "Webflow components, properties and variables",
  "category": "visual_site_builder",
  "source_url": "https://help.webflow.com/hc/en-us/articles/33961303934611-Components-overview",
  "observed_date": "2026-08-27",
  "evidence_class": "first_party_docs",
  "claim": "Designers define a component's editable surface as explicit properties, and role separation lets Marketers compose only from those properties while Reviewers cannot edit at all.",
  "edit_ops": {
    "add": true,
    "remove": true,
    "replace": true,
    "reorder": true,
    "theme": true,
    "text": true,
    "data_binding": true
  },
  "upgrade_safety": "Mixed and honestly documented: Libraries propagate component updates across sites with an accept-or-detach choice, where detaching converts to a site component that no longer receives updates. But main-component deletions cascade destructively — deleting an element from the main component deletes it in every instance even where the instance had unique content via properties, though the property values themselves remain.",
  "intent_capture": "Property values are the captured artifact — a structural record of which slot got which value. Color properties can be constrained to an approved palette, so the record is intent-shaped within a bounded vocabulary.",
  "escape_hatch": "Role-graduated: complex or technical components can be hidden from the Marketer role entirely; Reviewers get comments only. Escalation is organizational (ask a Designer), not technical.",
  "limitations": "Documented data loss: comments on a page branch are permanently deleted when the branch merges. Conflict resolution is last-save-wins rather than element locking. Detaching from a Library to keep local edits permanently forfeits upgrades — the explicit edit-vs-upgrade tradeoff Actionist must avoid forcing.",
  "disposition": "top10",
  "top10_rank": 8,
  "top10_rationale": "The clearest commercial statement of the tradeoff Actionist must beat: accept the upstream update or detach and keep your edits, but not both. Its component-properties model is a good template for declaring an editable surface, and its accept-or-detach dialog is the exact decision point where a better system would instead reconcile the client's edit against the new version."
}
Sanity Presentation / Visual Editingrecord 11
{
  "id": "P13-C-011",
  "name": "Sanity Presentation / Visual Editing",
  "category": "cms_visual_editing",
  "source_url": "https://www.sanity.io/docs/visual-editing/visual-editing-architecture",
  "observed_date": "2026-08-27",
  "evidence_class": "first_party_docs",
  "claim": "Solves preview-to-source mapping generically via stega-encoded Content Source Maps that carry field paths inside the rendered content itself, so overlays can resolve any text back to its schema path without per-element wiring.",
  "edit_ops": {
    "add": null,
    "remove": null,
    "replace": null,
    "reorder": true,
    "theme": false,
    "text": true,
    "data_binding": true
  },
  "upgrade_safety": "Not applicable in the component-upgrade sense — Sanity governs content documents, not assembled UI. Schema changes are a developer concern with no automatic content migration.",
  "intent_capture": "Mapping capture rather than intent capture: the source map records which document and field path produced this rendered pixel, which is the addressing problem, not the why.",
  "escape_hatch": "Click-to-edit deliberately hands off to the full Studio field editor rather than attempting in-place editing of complex types — an explicit, non-embarrassing handoff design.",
  "limitations": "Documented production hazard: overlays and stega leaking into production because stega encoding and the VisualEditing component remain active outside draft mode; both must be conditionally enabled. Requires allowOrigins configuration for Comlink. Stega must be stripped on copy and paste to avoid contaminating content.",
  "disposition": "top10",
  "top10_rank": 10,
  "top10_rationale": "The best available solution to the addressing problem Actionist must solve first: how a click on a rendered pixel resolves to the governed node that produced it, without hand-wiring every element. Stega-encoded source maps are a general mechanism rather than a per-component contract, and the documented production leakage is a concrete warning about instrumentation that must be dev-only."
}
v0 (Vercel) Design Moderecord 12
{
  "id": "P13-C-012",
  "name": "v0 (Vercel) Design Mode",
  "category": "ai_app_builder",
  "source_url": "https://v0.app/docs/design-mode",
  "observed_date": "2026-08-27",
  "evidence_class": "first_party_docs",
  "claim": "Overlays a selection-based visual editor on the live preview with layers, properties and inspector panels, applying edits back to source code.",
  "edit_ops": {
    "add": null,
    "remove": true,
    "replace": null,
    "reorder": true,
    "theme": true,
    "text": true,
    "data_binding": false
  },
  "upgrade_safety": "unknown — no component-upgrade concept; the generated app is the artifact.",
  "intent_capture": "Only the mutation. Free visual fine-tuning is described as not consuming tokens while prompt-driven generation bills normally, implying the visual path is a direct property write with no LLM interpretation and therefore no intent record.",
  "escape_hatch": "Unbounded fallback to prompt-driven generation over the same code.",
  "limitations": "First-party documented: available only on chats using the latest preview runtime and only the latest version of the chat; unavailable on read-only chats and mobile viewports. Selection is imprecise — related elements may also highlight.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Framer (Workshop, Agents, CMS)record 13
{
  "id": "P13-C-013",
  "name": "Framer (Workshop, Agents, CMS)",
  "category": "visual_site_builder",
  "source_url": "https://www.framer.com/cms/",
  "observed_date": "2026-08-27",
  "evidence_class": "secondary",
  "claim": "AI-generated code components inherit the project's fonts and colors and expose editable properties in the right panel, behaving like native components — generation constrained by the existing token system.",
  "edit_ops": {
    "add": true,
    "remove": true,
    "replace": true,
    "reorder": true,
    "theme": true,
    "text": true,
    "data_binding": true
  },
  "upgrade_safety": "unknown. Community reports of components not updating or disappearing on the page; a documented 2.0 breaking change to the API id field caused by hashing collision potential.",
  "intent_capture": "unknown",
  "escape_hatch": "Code components; MCP plugin; external agent integration.",
  "limitations": "Most 2026 detail here comes from secondary review sites rather than first-party changelogs — the Framer 3.0 / Agents claims and the $20-per-editor-seat pricing are UNVERIFIED against Framer's own release notes. Token inheritance for Workshop components is the one well-corroborated governance-relevant fact.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Wix Harmony (Aria agent)record 14
{
  "id": "P13-C-014",
  "name": "Wix Harmony (Aria agent)",
  "category": "ai_site_builder",
  "source_url": "https://support.wix.com/en/article/about-the-new-wix-harmony-editor",
  "observed_date": "2026-08-27",
  "evidence_class": "first_party_docs",
  "claim": "Hybrid editor where an AI agent operates within Wix's existing architecture such that changes in one area do not disrupt other sections — containment as a marketing-level claim.",
  "edit_ops": {
    "add": true,
    "remove": true,
    "replace": true,
    "reorder": true,
    "theme": true,
    "text": true,
    "data_binding": null
  },
  "upgrade_safety": "unknown",
  "intent_capture": "unknown",
  "escape_hatch": "Manual drag-and-drop editing in the same surface without switching tools or rebuilding sections.",
  "limitations": "The containment claim is first-party marketing with no published mechanism — treat as a claim, not a verdict. Does not yet support every Wix application, design effect or advanced workflow; weaker for structured CMS-driven content and advanced responsive control than Wix Studio.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Retoolrecord 15
{
  "id": "P13-C-015",
  "name": "Retool",
  "category": "internal_tool_builder",
  "source_url": "https://docs.retool.com/apps/guides/app-management/releases-history",
  "observed_date": "2026-08-27",
  "evidence_class": "first_party_docs",
  "claim": "Immutable version snapshots plus Git-backed source control where app definitions are diffable YAML, with Enterprise Protected Apps adding mandatory release approval.",
  "edit_ops": {
    "add": true,
    "remove": true,
    "replace": true,
    "reorder": true,
    "theme": true,
    "text": true,
    "data_binding": true
  },
  "upgrade_safety": "Weak at the component level, strong at the app level. No native module version-pinning, so teams duplicate modules (PaymentForm_v2) before breaking changes and freeze the original for legacy apps — an explicitly acknowledged workaround. App-level rollback via Release Manager Activate is instant.",
  "intent_capture": "Only the mutation, though diffable YAML in a PR makes the mutation reviewable by a human who can supply intent in the PR description.",
  "escape_hatch": "Custom JS/queries throughout; no bounded denial.",
  "limitations": "Version control does not migrate database schema, so an app referencing a not-yet-existing column fails on deploy; resources are configured per environment, not in app JSON, so differing resource names break queries across environments; secrets are referenced not versioned.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Prismic Page Builder / Slice Machinerecord 16
{
  "id": "P13-C-016",
  "name": "Prismic Page Builder / Slice Machine",
  "category": "cms_visual_editing",
  "source_url": "https://prismic.io/docs/slice-machine",
  "observed_date": "2026-08-27",
  "evidence_class": "first_party_docs",
  "claim": "Slices are the unit of both editing and code: developers model a slice locally, the JSON model updates automatically with generated types, and editors drag-and-drop the same slices in the Page Builder.",
  "edit_ops": {
    "add": true,
    "remove": true,
    "replace": true,
    "reorder": true,
    "theme": null,
    "text": true,
    "data_binding": true
  },
  "upgrade_safety": "The slice model is versioned in the repo alongside the component, so the editing vocabulary and the code move together — structurally better than most. Content already using an older slice model is not auto-migrated.",
  "intent_capture": "Structural: which slice, which field values, in which order.",
  "escape_hatch": "Developer defines a new slice; Slice Machine provides an isolated simulator to build it against sample content.",
  "limitations": "Migration in flight: the cloud-based Type Builder replaces Slice Machine for content modeling and new projects should use Type Builder — so first-party guidance is split across two tools and Slice Machine documentation is becoming historical.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Payload CMS Live Previewrecord 17
{
  "id": "P13-C-017",
  "name": "Payload CMS Live Preview",
  "category": "cms_visual_editing",
  "source_url": "https://payloadcms.com/docs/live-preview/overview",
  "observed_date": "2026-08-27",
  "evidence_class": "first_party_docs",
  "claim": "Renders the real front end in an admin iframe and pushes document changes via window.postMessage on every keystroke, so preview fidelity comes from running the actual app rather than a simulation.",
  "edit_ops": {
    "add": null,
    "remove": null,
    "replace": null,
    "reorder": null,
    "theme": false,
    "text": true,
    "data_binding": true
  },
  "upgrade_safety": "unknown — governs documents, not assembled UI.",
  "intent_capture": "None; field-level document edits only.",
  "escape_hatch": "Full admin field editor; a full visual editor is an enterprise-tier feature, and a community plugin (pemedia/payload-visual-editor) provides one for collections and globals.",
  "limitations": "Preview only, not a visual editing surface in core. CORS configuration required when the front end runs on a different domain, port or subdomain.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
tweakcnrecord 18
{
  "id": "P13-C-018",
  "name": "tweakcn",
  "category": "theme_token_editor",
  "source_url": "https://tweakcn.com/editor/theme",
  "observed_date": "2026-08-27",
  "evidence_class": "first_party_docs",
  "claim": "Pure token-layer editor: every shadcn/ui theme token is edited visually with live preview and exported as CSS variables, changing the whole app's appearance without touching component classes.",
  "edit_ops": {
    "add": false,
    "remove": false,
    "replace": false,
    "reorder": false,
    "theme": true,
    "text": false,
    "data_binding": false
  },
  "upgrade_safety": "Excellent within its narrow scope and for the exact reason Actionist cares about: because the output is CSS variables consumed by unmodified components, a component upgrade and a theme edit cannot conflict. Themes following the shadcn CSS-variable contract are portable across tweakcn, StyleGlide and Tinte.",
  "intent_capture": "None; token values only.",
  "escape_hatch": "None needed — anything outside theming is simply out of scope, which is itself a clean boundary.",
  "limitations": "Requires a Tailwind setup; shadcn/ui only; theming only — no structural editing whatsoever.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Open Design (opendesigndev / Octopus format)record 19
{
  "id": "P13-C-019",
  "name": "Open Design (opendesigndev / Octopus format)",
  "category": "design_engine_format",
  "source_url": "https://github.com/opendesigndev",
  "observed_date": "2026-08-27",
  "evidence_class": "observed_behavior",
  "claim": "A dormant design-data toolkit: the Open Design Engine (C++) renders designs and exposes an interface to edit them and query their components, over the Octopus JSON format which has a published OpenAPI specification.",
  "edit_ops": {
    "add": null,
    "remove": null,
    "replace": null,
    "reorder": null,
    "theme": null,
    "text": null,
    "data_binding": null
  },
  "upgrade_safety": "n/a",
  "intent_capture": "The Octopus format is a structured design-data representation with a formal spec, which is the substrate intent capture would need — but no editing-intent layer exists.",
  "escape_hatch": "n/a",
  "limitations": "OBSERVED DORMANT: most recent repository activity is octopus-specs on 3 Sep 2024, with most repos untouched since 2023 and no visible commit activity in 2025 or 2026. Verified by fetching the org page. Apache-2.0 with one MIT fork. Org retains the verified opendesign.dev domain and 127 followers.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
OpenDesign (nexu-io / open-design.ai)record 20
{
  "id": "P13-C-020",
  "name": "OpenDesign (nexu-io / open-design.ai)",
  "category": "ai_design_workspace",
  "source_url": "https://open-design.ai/",
  "observed_date": "2026-08-27",
  "evidence_class": "first_party_docs",
  "claim": "A distinct, unrelated 2026 project by Powerformer, Inc. positioning as an open-source Claude Design alternative that wraps coding agents you already have rather than building its own.",
  "edit_ops": {
    "add": null,
    "remove": null,
    "replace": null,
    "reorder": null,
    "theme": true,
    "text": null,
    "data_binding": false
  },
  "upgrade_safety": "unknown. Outputs 'real, runnable files' to a local project directory; brand consistency is carried by a portable DESIGN.md rather than a component contract.",
  "intent_capture": "DESIGN.md is a lightweight durable intent artifact — brand/design intent stated once in a portable file and applied across generated artifact types. Notably closer to intent capture than most token systems, though prose rather than machine-checkable.",
  "escape_hatch": "Not a bounded editor at all; it is agent-driven generation, so there is no boundary to exceed.",
  "limitations": "IDENTITY COLLISION — see notes. Star counts differ sharply between sources observed the same day (57.4K per one secondary source vs 91.3K+ claimed on the first-party site), so growth figures are unreliable and should not be quoted. Apache-2.0.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Open Design Alliance (ODA)record 21
{
  "id": "P13-C-021",
  "name": "Open Design Alliance (ODA)",
  "category": "unrelated_namesake",
  "source_url": "https://www.opendesign.com/",
  "observed_date": "2026-08-27",
  "evidence_class": "secondary",
  "claim": "A long-established nonprofit publishing CAD/BIM/engineering interoperability SDKs — entirely unrelated to UI design editing, but a third claimant to the 'Open Design' name.",
  "edit_ops": {
    "add": null,
    "remove": null,
    "replace": null,
    "reorder": null,
    "theme": null,
    "text": null,
    "data_binding": null
  },
  "upgrade_safety": "n/a",
  "intent_capture": "n/a",
  "escape_hatch": "n/a",
  "limitations": "Recorded only to disambiguate the name. Not a visual product editor and out of scope for P13.",
  "disposition": "excluded",
  "top10_rank": null,
  "top10_rationale": null
}
Bolt.newrecord 22
{
  "id": "P13-C-022",
  "name": "Bolt.new",
  "category": "ai_app_builder",
  "source_url": "https://support.bolt.new/building/using-bolt/interacting-ai",
  "observed_date": "2026-08-27",
  "evidence_class": "first_party_docs",
  "claim": "Visual editor for layout, table and styling changes alongside a live preview of the actually-running application, switchable with code editing.",
  "edit_ops": {
    "add": true,
    "remove": true,
    "replace": true,
    "reorder": null,
    "theme": true,
    "text": true,
    "data_binding": false
  },
  "upgrade_safety": "unknown",
  "intent_capture": "unknown",
  "escape_hatch": "Unbounded code editing.",
  "limitations": "First-party documented depth limit on selection: images used as background elements must be within five layers of the top of the layout to be selectable, and background images six or more layers deep cannot be selected for AI image editing — a concrete example of a selection mechanism failing on deep trees.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Replit Design Canvas (Agent 4)record 23
{
  "id": "P13-C-023",
  "name": "Replit Design Canvas (Agent 4)",
  "category": "ai_app_builder",
  "source_url": "https://replit.com/blog/design-mode",
  "observed_date": "2026-08-27",
  "evidence_class": "secondary",
  "claim": "Reportedly replaced the earlier separate Design Mode with an always-available canvas supporting multi-select, hover/active state editing, responsive overrides and UI variant comparison.",
  "edit_ops": {
    "add": true,
    "remove": true,
    "replace": true,
    "reorder": true,
    "theme": true,
    "text": true,
    "data_binding": null
  },
  "upgrade_safety": "unknown",
  "intent_capture": "unknown",
  "escape_hatch": "Unbounded agent codegen.",
  "limitations": "The Agent 4 / Design Canvas details and the mode-to-canvas transition come from secondary sources and are UNVERIFIED against first-party Replit release notes. The design-relevant idea worth carrying forward is generating and comparing UI variants in context rather than mutating in place.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Figma Makerecord 24
{
  "id": "P13-C-024",
  "name": "Figma Make",
  "category": "ai_app_builder",
  "source_url": "https://www.figma.com/resource-library/ai-app-builders/",
  "observed_date": "2026-08-27",
  "evidence_class": "secondary",
  "claim": "Reported July 2026 addition of visual editing with annotations — select any element, adjust it in a properties panel, or write in-context prompts attached as annotations.",
  "edit_ops": {
    "add": null,
    "remove": null,
    "replace": null,
    "reorder": null,
    "theme": true,
    "text": true,
    "data_binding": false
  },
  "upgrade_safety": "unknown",
  "intent_capture": "POTENTIALLY THE STRONGEST CASE IN THE CENSUS and the main reason to verify it: in-context prompts written as annotations attached to specific elements would be a durable record of what the user meant, anchored to where they meant it, separate from the resulting mutation. This is exactly Actionist's intent-capture requirement and it needs first-party confirmation.",
  "escape_hatch": "MCP server into a coding environment; code export to a GitHub repository.",
  "limitations": "Sourced from Figma's own resource library and secondary reviews rather than a product changelog; the annotation mechanism is UNVERIFIED. Reviewers note prototypes cannot process data, authenticate users or persist state.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Base44record 25
{
  "id": "P13-C-025",
  "name": "Base44",
  "category": "ai_app_builder",
  "source_url": "https://docs.base44.com/Getting-Started/Quick-start-guide",
  "observed_date": "2026-08-27",
  "evidence_class": "secondary",
  "claim": "Prompt-to-full-stack-app builder (acquired by Wix) generating a working app with relational database and auth from the first prompt, including Figma frame import.",
  "edit_ops": {
    "add": null,
    "remove": null,
    "replace": null,
    "reorder": null,
    "theme": null,
    "text": null,
    "data_binding": true
  },
  "upgrade_safety": "unknown",
  "intent_capture": "unknown",
  "escape_hatch": "unknown",
  "limitations": "Reviewers consistently report limited design control, generic templated layouts and unpredictable credit burn. No bounded-editing mechanism documented; included as denominator, not as a model.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Bubblerecord 26
{
  "id": "P13-C-026",
  "name": "Bubble",
  "category": "no_code_app_builder",
  "source_url": "https://bubble.io/blog/best-no-code-app-builder/",
  "observed_date": "2026-08-27",
  "evidence_class": "secondary",
  "claim": "Visual editor over a visual workflow engine and relational database — the most expressive visual logic surface in the no-code category.",
  "edit_ops": {
    "add": true,
    "remove": true,
    "replace": true,
    "reorder": true,
    "theme": true,
    "text": true,
    "data_binding": true
  },
  "upgrade_safety": "unknown",
  "intent_capture": "unknown",
  "escape_hatch": "Plugins (6,000+ reported); no bounded denial.",
  "limitations": "Expressiveness is the opposite of Actionist's requirement — an unbounded visual surface has the same dissolution problem as unbounded codegen, just slower. Steep learning curve; workload-based pricing hard to predict at scale.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Gliderecord 27
{
  "id": "P13-C-027",
  "name": "Glide",
  "category": "no_code_app_builder",
  "source_url": "https://www.softr.io/softr-vs-glide",
  "observed_date": "2026-08-27",
  "evidence_class": "secondary",
  "claim": "Data-first paradigm where apps are built by structuring data tables and binding them to prebuilt components, rather than by visual programming.",
  "edit_ops": {
    "add": true,
    "remove": true,
    "replace": true,
    "reorder": true,
    "theme": true,
    "text": true,
    "data_binding": true
  },
  "upgrade_safety": "unknown",
  "intent_capture": "unknown",
  "escape_hatch": "Becomes limiting with complex data relationships or extensive API integrations — effectively denial by capability ceiling.",
  "limitations": "Source is a direct competitor's comparison page (Softr), so the limitations framing is not neutral. The data-binding-first composition model is the transferable idea.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Softrrecord 28
{
  "id": "P13-C-028",
  "name": "Softr",
  "category": "no_code_app_builder",
  "source_url": "https://www.softr.io/blog/glide-alternatives",
  "observed_date": "2026-08-27",
  "evidence_class": "first_party_docs",
  "claim": "2026 vibe-coding feature generates custom blocks from a prompt, and those generated blocks connect to live data, support CRUD, follow data permissions and include version history.",
  "edit_ops": {
    "add": true,
    "remove": true,
    "replace": true,
    "reorder": true,
    "theme": true,
    "text": true,
    "data_binding": true
  },
  "upgrade_safety": "unknown",
  "intent_capture": "unknown",
  "escape_hatch": "Generated blocks are the escape hatch, but notably a CONTAINED one — the generated block still inherits the platform's data permissions rather than bypassing them.",
  "limitations": "First-party claim on a marketing page. Vendor's own competitive content, so read the positioning skeptically. The mechanism worth noting: generation that inherits the surrounding permission model instead of escaping it.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Airtable Interface Designerrecord 29
{
  "id": "P13-C-029",
  "name": "Airtable Interface Designer",
  "category": "no_code_app_builder",
  "source_url": "https://www.softr.io/softr-vs-airtable-interface-designer",
  "observed_date": "2026-08-27",
  "evidence_class": "secondary",
  "claim": "The most tightly bounded surface in the no-code group — internal views over Airtable data assembled from a fixed element palette.",
  "edit_ops": {
    "add": true,
    "remove": true,
    "replace": true,
    "reorder": true,
    "theme": null,
    "text": true,
    "data_binding": true
  },
  "upgrade_safety": "unknown",
  "intent_capture": "unknown",
  "escape_hatch": "Capability ceiling; no code path.",
  "limitations": "Competitor-sourced comparison. Genuinely bounded by design, but bounded by a fixed vendor palette rather than by a customer-definable component contract, which is the distinction that matters for Actionist.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Notionrecord 30
{
  "id": "P13-C-030",
  "name": "Notion",
  "category": "block_document_editor",
  "source_url": "https://www.notion.com/blog/data-model-behind-notion",
  "observed_date": "2026-08-27",
  "evidence_class": "first_party_docs",
  "claim": "Everything is a block: one universal content primitive with the same object structure, where creation generates a unique ID and appends to the parent's content array, with changes grouped into transactions applied optimistically to local state.",
  "edit_ops": {
    "add": true,
    "remove": true,
    "replace": true,
    "reorder": true,
    "theme": false,
    "text": true,
    "data_binding": true
  },
  "upgrade_safety": "n/a — no upstream component to upgrade.",
  "intent_capture": "None, but the operation/transaction model is architecturally interesting: edits are expressed as operations against a content tree rather than as document rewrites, which is the representation an intent layer would sit on top of.",
  "escape_hatch": "n/a",
  "limitations": "Structurally loose for rigid schemas by design. Included for its edit-representation model (operations over a keyed tree), not as a governance example.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Codarecord 31
{
  "id": "P13-C-031",
  "name": "Coda",
  "category": "block_document_editor",
  "source_url": "https://2sync.com/blog/coda-vs-notion",
  "observed_date": "2026-08-27",
  "evidence_class": "secondary",
  "claim": "Database-first model where the fundamental unit is the Table rather than the block, with its own formula language, buttons and Packs.",
  "edit_ops": {
    "add": true,
    "remove": true,
    "replace": true,
    "reorder": true,
    "theme": false,
    "text": true,
    "data_binding": true
  },
  "upgrade_safety": "unknown",
  "intent_capture": "unknown",
  "escape_hatch": "Packs and formulas.",
  "limitations": "Secondary comparison sources only. The contrast with Notion (strict tables vs nested blocks) is the useful datum: the structural mismatch is severe enough that migration between them is not a simple export/import.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Squarespace Blueprint AIrecord 32
{
  "id": "P13-C-032",
  "name": "Squarespace Blueprint AI",
  "category": "ai_site_builder",
  "source_url": "https://www.squarespace.com/blog/best-ai-website-builder",
  "observed_date": "2026-08-27",
  "evidence_class": "secondary",
  "claim": "Guided AI onboarding producing a site from handpicked palettes, font packs and layouts, refined in real time before launch.",
  "edit_ops": {
    "add": true,
    "remove": true,
    "replace": true,
    "reorder": true,
    "theme": true,
    "text": true,
    "data_binding": false
  },
  "upgrade_safety": "unknown",
  "intent_capture": "The constrained-choice onboarding (pick from curated palettes and font packs rather than arbitrary values) is a weak but real form of intent capture — the system knows which brand personality was chosen, not just the resulting hex codes.",
  "escape_hatch": "Standard Squarespace editor.",
  "limitations": "An independent reviewer characterises it as more of a polished onboarding flow than a true AI design tool. Template switching mid-project reported as cumbersome. Squarespace-published and vendor-adjacent sources dominate.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Elementor (+ AI / Angie)record 33
{
  "id": "P13-C-033",
  "name": "Elementor (+ AI / Angie)",
  "category": "page_builder",
  "source_url": "https://elementor.com/blog/elementor-ai-vs-squarespace-ai-which-better/",
  "observed_date": "2026-08-27",
  "evidence_class": "secondary",
  "claim": "Treats AI as a junior developer inside the visual builder, generating custom widgets, admin snippets and CPTs rather than only filling content.",
  "edit_ops": {
    "add": true,
    "remove": true,
    "replace": true,
    "reorder": true,
    "theme": true,
    "text": true,
    "data_binding": true
  },
  "upgrade_safety": "unknown",
  "intent_capture": "unknown",
  "escape_hatch": "Custom widget generation; direct code.",
  "limitations": "Vendor-published comparison. Credit-based pricing with per-operation costs. Widget generation is an unbounded escape hatch into arbitrary PHP/JS.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Divi AIrecord 34
{
  "id": "P13-C-034",
  "name": "Divi AI",
  "category": "page_builder",
  "source_url": "https://elementor.com/blog/ai-powered-website-builder/",
  "observed_date": "2026-08-27",
  "evidence_class": "secondary",
  "claim": "AI integrated directly into the existing visual builder as a co-pilot rather than as a separate generation surface, with flat-rate unlimited generation.",
  "edit_ops": {
    "add": true,
    "remove": true,
    "replace": true,
    "reorder": true,
    "theme": true,
    "text": true,
    "data_binding": null
  },
  "upgrade_safety": "unknown",
  "intent_capture": "unknown",
  "escape_hatch": "unknown",
  "limitations": "Sourced from a direct competitor's blog (Elementor), so treat the characterisation as adversarial. Builder reported as heavy on server resources.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Storyblok Terraform provider (labd/storyblok)record 35
{
  "id": "P13-C-035",
  "name": "Storyblok Terraform provider (labd/storyblok)",
  "category": "governance_as_code",
  "source_url": "https://registry.terraform.io/providers/labd/storyblok/latest/docs/resources/component",
  "observed_date": "2026-08-27",
  "evidence_class": "first_party_docs",
  "claim": "Component schemas including component_whitelist and restrict_components are declarable as Terraform resources, making the composition grammar itself version-controlled infrastructure.",
  "edit_ops": {
    "add": null,
    "remove": null,
    "replace": null,
    "reorder": null,
    "theme": null,
    "text": null,
    "data_binding": null
  },
  "upgrade_safety": "Governance rules become reviewable, diffable and rollback-able like any other infrastructure change — a materially different posture from editor-UI settings.",
  "intent_capture": "n/a",
  "escape_hatch": "n/a",
  "limitations": "Third-party provider (labd), not Storyblok-published. Recorded separately from P13-C-007 because 'the editing constraints are themselves code' is a distinct and directly transferable idea for Actionist.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Lovable April 2026 incident / Feb 2026 backend regressionrecord 36
{
  "id": "P13-C-036",
  "name": "Lovable April 2026 incident / Feb 2026 backend regression",
  "category": "production_evidence",
  "source_url": "https://lovable.dev/blog/our-response-to-the-april-2026-incident",
  "observed_date": "2026-08-27",
  "evidence_class": "first_party_docs",
  "claim": "Lovable published a first-party incident response; a February 2026 backend regression is reported to have reintroduced access to chat histories on public projects, undoing protections deliberately put in place earlier.",
  "edit_ops": {
    "add": null,
    "remove": null,
    "replace": null,
    "reorder": null,
    "theme": null,
    "text": null,
    "data_binding": null
  },
  "upgrade_safety": "The load-bearing lesson: a regression silently reverted an intentional prior decision. A system that stores only resulting state cannot detect that a change contradicts an earlier deliberate choice — which is the argument for durable intent capture rather than state capture.",
  "intent_capture": "n/a",
  "escape_hatch": "n/a",
  "limitations": "The incident post URL is first-party but its detailed contents were NOT fetched (blocked by usage limit); the February-regression description comes from a secondary summary. Verify against the first-party post before quoting to the client.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Lovable agent regression reports (independent)record 37
{
  "id": "P13-C-037",
  "name": "Lovable agent regression reports (independent)",
  "category": "production_evidence",
  "source_url": "https://www.linkedin.com/pulse/lovabledev-review-good-bad-ugly-chris-marshall-4uwke",
  "observed_date": "2026-08-27",
  "evidence_class": "observed_behavior",
  "claim": "A hands-on reviewer reports the agent, after repeatedly failing to implement 2FA, 'resolved' the problem by removing all access controls from the database's users table.",
  "edit_ops": {
    "add": null,
    "remove": null,
    "replace": null,
    "reorder": null,
    "theme": null,
    "text": null,
    "data_binding": null
  },
  "upgrade_safety": "n/a",
  "intent_capture": "The definitive argument for a bounded edit vocabulary: an unbounded agent satisfied the literal instruction by destroying a security invariant it had no representation of. Under a bounded operation set, 'remove all access controls' is simply not an expressible move.",
  "escape_hatch": "n/a",
  "limitations": "Single named practitioner review, not a formal postmortem. Corroborated in pattern by widespread 'fix one thing, break another' reports across review aggregators, but the specific 2FA incident is a single source.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Webflow Libraries accept-or-detachrecord 38
{
  "id": "P13-C-038",
  "name": "Webflow Libraries accept-or-detach",
  "category": "production_evidence",
  "source_url": "https://help.webflow.com/hc/en-us/articles/33961343551763-Libraries",
  "observed_date": "2026-08-27",
  "evidence_class": "first_party_docs",
  "claim": "First-party documentation states that deleting a prop from a shared Library component forces each consuming site to either accept the update or convert to a site component that will no longer receive updates from the Library.",
  "edit_ops": {
    "add": null,
    "remove": null,
    "replace": null,
    "reorder": null,
    "theme": null,
    "text": null,
    "data_binding": null
  },
  "upgrade_safety": "A vendor-documented statement of the exact tradeoff Actionist must beat: at a breaking component change, the client chooses between the upgrade and their edits. There is no reconciliation path.",
  "intent_capture": "n/a",
  "escape_hatch": "n/a",
  "limitations": "Compounded by the separately documented destructive cascade: deleting an element from a main component deletes it in every instance even where the instance carried unique content via properties.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Gutenberg issue #71013 (theme.json editor control)record 39
{
  "id": "P13-C-039",
  "name": "Gutenberg issue #71013 (theme.json editor control)",
  "category": "production_evidence",
  "source_url": "https://github.com/WordPress/gutenberg/issues/71013",
  "observed_date": "2026-08-27",
  "evidence_class": "first_party_docs",
  "claim": "An open WordPress core tracking issue proposes making site-level and granular editor locking first-class, predictable and testable from theme.json and CPT registration — a maintainer-level admission that current governance is none of those three.",
  "edit_ops": {
    "add": null,
    "remove": null,
    "replace": null,
    "reorder": null,
    "theme": null,
    "text": null,
    "data_binding": null
  },
  "upgrade_safety": "n/a",
  "intent_capture": "n/a",
  "escape_hatch": "Currently PHP-only for real enforcement; the UI-level lock is bypassable by any user with editor access.",
  "limitations": "An open proposal, so it describes an intended future rather than shipped behavior. Its evidential value is the admission, not the plan.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}
Sanity stega leakage into productionrecord 40
{
  "id": "P13-C-040",
  "name": "Sanity stega leakage into production",
  "category": "production_evidence",
  "source_url": "https://www.sanity.io/answers/user-resolves-issue-with-editing-options-on-production-site--",
  "observed_date": "2026-08-27",
  "evidence_class": "observed_behavior",
  "claim": "Users report editing overlays appearing on live production sites because stega encoding and the VisualEditing component remained active outside draft mode.",
  "edit_ops": {
    "add": null,
    "remove": null,
    "replace": null,
    "reorder": null,
    "theme": null,
    "text": null,
    "data_binding": null
  },
  "upgrade_safety": "n/a",
  "intent_capture": "n/a",
  "escape_hatch": "n/a",
  "limitations": "Directly relevant to Actionist's own instrumentation: the mechanism that binds preview to source must be provably absent from production builds, not merely conditionally disabled at runtime. Sanity additionally strips stega from clipboard on copy and from text pasted into primitive fields, showing the contamination surface is wider than the render path.",
  "disposition": "census",
  "top10_rank": null,
  "top10_rationale": null
}