P13-R-001record 1
{
"id": "P13-R-001",
"repo": "puckeditor/puck",
"category": "schema_bounded_visual_editor",
"source_url": "https://github.com/puckeditor/puck/blob/main/packages/core/types/Fields.ts",
"observed_date": "2026-08-27",
"evidence_class": "first_party_docs",
"claim": "Puck is a React visual editor whose editable surface is defined entirely by a developer-authored Config: each component declares a closed set of typed fields, and the editor can only render/emit edits for declared fields.",
"edit_data_model": "json_tree",
"edit_ops": "insert/replace/move/reorder component; set declared prop values; slot (DropZone) nesting. ResolveDataTrigger union is exactly insert|replace|load|force|move.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "Field is a closed discriminated union (text|number|textarea|select|radio|richtext|array|object|external|custom) and props are typed to the component's declared FieldProps; an undeclared prop or an unlisted select option has no representation in ComponentData.props, so it cannot be serialized let alone rendered.",
"intent_capture": "None as a first-class concept. Data records final prop state, not why. resolveData receives a `changed` map and a `trigger` enum, which is the closest thing to machine-readable cause and is transient (not persisted in Data).",
"upgrade_safety": "Strong: data stores {type, props} referencing components by name, so the component implementation can be upgraded independently of stored content. resolveData/resolveFields let the config migrate/normalize stored props at load time (trigger:'load'), which is a real migration hook. Risk is renaming a component type, which orphans stored data.",
"license_observed": "MIT — read LICENSE body via GitHub API, 'MIT License / Copyright (c) The Puck Contributors.' Full permissive grant, no field-of-use or hosting restriction, no commercial-core carve-out found at repo root.",
"maintenance_state": "Very active; pushed_at 2026-08-27T06:55:56Z, 13,210 stars, not archived. NOTE: the older path measuredco/puck now redirects to puckeditor/puck.",
"limitations": "Bounded-ness depends entirely on config authorship discipline; a `custom` field type is an explicit escape hatch that can render arbitrary React and reintroduce unbounded editing. No persisted intent/rationale layer.",
"disposition": "top10",
"top10_rank": 1,
"top10_rationale": "Closest architectural match to Actionist's requirement: bounded ops over a composed app, denial-by-construction via a closed field union, permissions expressed in the model rather than the UI, and a load-time migration hook that preserves upgradeability. MIT verified by reading the body."
}
P13-R-002record 2
{
"id": "P13-R-002",
"repo": "puckeditor/puck",
"category": "schema_bounded_visual_editor",
"source_url": "https://github.com/puckeditor/puck/blob/main/packages/core/types/Data.tsx",
"observed_date": "2026-08-27",
"evidence_class": "first_party_docs",
"claim": "Puck expresses per-field write permission INSIDE the persisted data model, not only in editor config: BaseData carries `readOnly?: Partial<Record<keyof Props, boolean>>`, and ComponentConfig carries `permissions?: Partial<Permissions>`.",
"edit_data_model": "json_tree",
"edit_ops": "readOnly is a per-prop map on each ComponentData/RootData node; permissions is per-component-config.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "Because readOnly travels with the data node rather than living in editor UI state, a locked prop is locked for any consumer of that document, not merely hidden in one editor session. This is denial-by-construction at the document level.",
"intent_capture": "unknown — readOnly records THAT a field is locked, never why it was locked or who locked it.",
"upgrade_safety": "Per-node readOnly survives serialization, so a governed template can ship locked regions that stay locked after the composition is re-opened or re-rendered by a newer component version.",
"license_observed": "MIT — same LICENSE body as P13-R-001, read via GitHub API.",
"maintenance_state": "Active as of 2026-08-27.",
"limitations": "readOnly is advisory to writers that respect it; a direct programmatic write to the JSON bypasses it. It is a document-level contract, not cryptographic enforcement. | Second distinct Puck finding (per-field readOnly in the persisted data model). Kept as census to keep the top-10 set at exactly 10 ranked entries; its substance is carried by the rank-1 entry P13-R-001 and cited in first-principles.md as the strongest concrete instance of denial-by-construction.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-003record 3
{
"id": "P13-R-003",
"repo": "webstudio-is/webstudio",
"category": "schema_bounded_visual_editor",
"source_url": "https://github.com/webstudio-is/webstudio/blob/main/packages/sdk/src/schema/instances.ts",
"observed_date": "2026-08-27",
"evidence_class": "first_party_docs",
"claim": "Webstudio models a page as a Zod-validated instance graph: `instances` is a Map of instanceId -> instance, where every instance's children are a closed union of idChild | textChild | expressionChild.",
"edit_data_model": "json_tree",
"edit_ops": "insert/move/delete instance; set component/tag/label; edit text children; bind expression children to data sources; style edits go to a separate breakpoint/style schema.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "The instance schema is a runtime Zod parser, not just a TypeScript type. instanceChild is z.union([idChild, textChild, expressionChild]) and component is z.string().min(1); a malformed or out-of-vocabulary child shape fails parse at the boundary, so an invalid tree cannot be loaded or saved rather than merely being discouraged.",
"intent_capture": "Partial and indirect: expressionChild and the data-sources schema record that a value is BOUND to a source (a durable statement of relationship) rather than a pasted literal. That is closer to intent than any pure prop-value model, but it captures the binding, not the reason for the edit.",
"upgrade_safety": "Components are referenced by string name with a separate component-meta/prop-meta schema, so component implementations can evolve independently. Separate breakpoints/styles schemas mean theme edits do not entangle with structure edits.",
"license_observed": "AGPL-3.0 — read LICENSE body via GitHub API; body is the verbatim GNU Affero General Public License v3 preamble. AGPL network-use copyleft is a REAL constraint for a hosted client deliverable: serving a modified Webstudio over a network triggers source-provision obligations.",
"maintenance_state": "Very active; pushed_at 2026-08-27T09:18:50Z, 8,868 stars.",
"limitations": "AGPL is the blocker for embedding in a commercial hosted product without a separate arrangement. Heavier and more opinionated than Puck; assumes Webstudio's own rendering/publishing model.",
"disposition": "top10",
"top10_rank": 2,
"top10_rationale": "Best example of parse-time (not type-time) denial: a runtime schema that makes an invalid composition unloadable. Ranked below Puck strictly on licence — AGPL-3.0 verified by reading the body, and it is network-copyleft."
}
P13-R-004record 4
{
"id": "P13-R-004",
"repo": "WordPress/gutenberg",
"category": "block_document_editor",
"source_url": "https://github.com/WordPress/gutenberg/blob/trunk/docs/how-to-guides/curating-the-editor-experience/block-locking.md",
"observed_date": "2026-08-27",
"evidence_class": "first_party_docs",
"claim": "Gutenberg ships two distinct bounding mechanisms: the Block Locking API (lock move/remove per block, optionally applied to nested blocks) and contentOnly editing, which hides all design tools while leaving content editable.",
"edit_data_model": "other",
"edit_ops": "Blocks serialize to HTML comment delimiters (<!-- wp:namespace/block -->) with JSON attributes. Ops: insert/move/remove block, edit attributes, lock via a `lock` attribute, templateLock at container level.",
"out_of_bounds_representable": "unknown",
"out_of_bounds_why": "Mixed by design. contentOnly makes non-content child blocks 'hidden from list view, un-clickable on the canvas, and entirely un-editable' (doc, verbatim), which is strong denial in the editing surface. But the doc also states 'by default, users with editing access can unlock these blocks' — so it is graduated permission, not unrepresentability, and the underlying serialization is HTML that can be edited directly.",
"intent_capture": "unknown — the lock attribute records the restriction, not the reason. No rationale field.",
"upgrade_safety": "Best-in-class and battle-tested at enormous scale: the Block Deprecation API lets a block declare prior attribute shapes and migrate old serialized content forward on parse. theme.json separates design tokens from block content so a theme can be upgraded without touching posts. Block name changes are explicitly called out as breaking because the name is stored in every post.",
"license_observed": "GPL-2.0-or-later project licence with contributions dual-licensed GPL-2.0-or-later AND MPL-2.0 — read LICENSE body via GitHub API (GitHub reports NOASSERTION because of the dual structure). Project licence is GPL; the MPL half applies to contributions, so reuse of Gutenberg code in a proprietary product cannot rely on the MPL side alone.",
"maintenance_state": "Extremely active; pushed_at 2026-08-27T09:38:48Z, 11,752 stars.",
"limitations": "Deeply coupled to WordPress. Serialization is annotated HTML rather than a clean tree, so machine reasoning over a composition is harder than with JSON. Locks are unlockable by default.",
"disposition": "top10",
"top10_rank": 3,
"top10_rationale": "The only project in the census with a decade of production evidence for BOTH bounded editing (contentOnly) and forward-migration of stored content (block deprecation). contentOnly is the closest existing analogue to Actionist's content-editable-but-structure-frozen mode. Licence GPL verified by reading."
}
P13-R-005record 5
{
"id": "P13-R-005",
"repo": "prevwong/craft.js",
"category": "schema_bounded_visual_editor",
"source_url": "https://api.github.com/repos/prevwong/craft.js",
"observed_date": "2026-08-27",
"evidence_class": "first_party_docs",
"claim": "Craft.js is a framework for BUILDING page editors rather than an editor itself; it exposes per-node rules (canDrag, canDrop, canMoveIn, canMoveOut) that constrain structural operations.",
"edit_data_model": "json_tree",
"edit_ops": "drag/drop/move nodes, edit props via user-supplied settings panels; rules are predicate functions evaluated per operation.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "Rules are imperative predicates evaluated at operation time, not a schema that makes the bad state unrepresentable. The serialized node tree can hold arbitrary props; a rule that is not consulted (or a direct deserialization of hostile JSON) reinstates the out-of-bounds state.",
"intent_capture": "unknown",
"upgrade_safety": "Weak-to-moderate: serialized JSON references component names via a resolver map, so components can be swapped, but there is no built-in migration/deprecation hook comparable to Gutenberg's or Puck's resolveData.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level observation; body not read because this is not top-10).",
"maintenance_state": "STALE: pushed_at 2025-02-14T09:25:28Z — roughly 18 months without a push as of 2026-08-27, despite 8,733 stars. Not archived.",
"limitations": "Maintenance gap is the main risk. Predicate-based bounding is weaker than schema-based denial.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-006record 6
{
"id": "P13-R-006",
"repo": "GrapesJS/grapesjs",
"category": "schema_bounded_visual_editor",
"source_url": "https://github.com/GrapesJS/grapesjs/blob/dev/LICENSE",
"observed_date": "2026-08-27",
"evidence_class": "first_party_docs",
"claim": "GrapesJS is a mature web-builder framework with a component-type system where each type declares traits (editable attributes) and droppable/draggable constraints.",
"edit_data_model": "dom",
"edit_ops": "add/remove/move components, edit traits, edit styles via a style manager with configurable sectors/properties.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "The underlying model is an HTML/CSS document abstraction. Traits bound WHAT the trait panel offers, but the component model can carry arbitrary attributes and the style manager can be configured to expose any CSS property; there is no closed schema that rejects an out-of-vocabulary edit.",
"intent_capture": "unknown",
"upgrade_safety": "Weak for governed composition: output is HTML/CSS, so once exported the link back to the originating capability is lost. Good for one-shot template production, poor for upgradeable composition.",
"license_observed": "BSD-3-Clause — GitHub reports NOASSERTION, but reading the LICENSE body shows verbatim 3-clause BSD text (redistribution conditions plus the 'Neither the name GrapesJS nor the names of its contributors may be used to endorse' non-endorsement clause). Permissive; the NOASSERTION badge is a detection artefact, not a bespoke licence.",
"maintenance_state": "Active; pushed_at 2026-08-26T12:21:05Z, 26,167 stars.",
"limitations": "DOM-centric model is the wrong substrate for governed, upgradeable composition even though the project is healthy and popular.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-007record 7
{
"id": "P13-R-007",
"repo": "plasmicapp/plasmic",
"category": "schema_bounded_visual_editor",
"source_url": "https://github.com/plasmicapp/plasmic/blob/master/LICENSE",
"observed_date": "2026-08-27",
"evidence_class": "first_party_docs",
"claim": "Plasmic is a visual builder for React with a code-integration story (code components registered with a prop schema via registerComponent).",
"edit_data_model": "json_tree",
"edit_ops": "visual composition of registered code components; prop edits constrained by the registered prop meta.",
"out_of_bounds_representable": "unknown",
"out_of_bounds_why": "registerComponent declares a prop schema that bounds what the studio offers for a code component, which is real denial for that surface. But the studio itself permits free-form element/style authoring outside registered components, so bounding applies to the code-component boundary rather than to the whole document. Not verified by reading the studio's internal model.",
"intent_capture": "unknown",
"upgrade_safety": "Explicit design goal: components are referenced from the host codebase, so the codebase can evolve while the composition references stable names.",
"license_observed": "MIT at repo root — read LICENSE body via GitHub API ('The MIT License (MIT) / Copyright (c) 2021 Plasmic'), full permissive grant. CAVEAT: this is the open-source repo only; Plasmic Studio is a commercial hosted product, so the MIT grant covers the published packages, NOT the hosted studio. Per-package licences under packages/ were not individually enumerated — treat the root MIT as covering root-level code only.",
"maintenance_state": "Active; pushed_at 2026-08-27T09:35:54Z, 6,975 stars.",
"limitations": "Open-core: the repo's MIT badge does not mean the product experience is open source. This is precisely the badge-versus-body trap flagged in project instructions.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-008record 8
{
"id": "P13-R-008",
"repo": "silexlabs/Silex",
"category": "schema_bounded_visual_editor",
"source_url": "https://api.github.com/repos/silexlabs/Silex",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Silex is a free/libre static-site visual builder built on top of GrapesJS.",
"edit_data_model": "dom",
"edit_ops": "visual page composition, static site output with dynamic data support.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "Inherits GrapesJS's DOM-centric model; same reasoning as P13-R-006.",
"intent_capture": "unknown",
"upgrade_safety": "Weak — static site output.",
"license_observed": "AGPL-3.0 per GitHub API license.spdx_id (badge-level; body not read, not top-10).",
"maintenance_state": "Active; pushed_at 2026-08-26T19:44:23Z, 2,937 stars.",
"limitations": "AGPL plus DOM substrate; adds little over GrapesJS for this use case.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-009record 9
{
"id": "P13-R-009",
"repo": "givanz/Vvveb",
"category": "schema_bounded_visual_editor",
"source_url": "https://api.github.com/repos/givanz/Vvveb",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Vvveb is a PHP CMS with a bundled drag-and-drop page builder (VvvebJs).",
"edit_data_model": "dom",
"edit_ops": "drag/drop HTML components, edit via a component/property panel.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "HTML-template substrate; property panels bound the UI, not the document.",
"intent_capture": "unknown",
"upgrade_safety": "Weak — HTML templates.",
"license_observed": "AGPL-3.0 per GitHub API license.spdx_id (badge-level; body not read, not top-10).",
"maintenance_state": "Active; pushed_at 2026-08-05T19:00:23Z, 1,176 stars.",
"limitations": "PHP/CMS-coupled; not a fit for a React composition runtime.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-010record 10
{
"id": "P13-R-010",
"repo": "react-page/react-page",
"category": "schema_bounded_visual_editor",
"source_url": "https://api.github.com/repos/react-page/react-page",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "ReactPage is a customizable content editor where content is composed of plugin-defined cells; each plugin declares a controls schema for its editable data.",
"edit_data_model": "json_tree",
"edit_ops": "add/remove/move cells in a row/cell layout grid; edit plugin data via plugin-declared controls (including JSON-schema-driven auto-forms).",
"out_of_bounds_representable": false,
"out_of_bounds_why": "Plugin data is validated against a plugin-declared schema and the layout is a constrained row/cell grid rather than arbitrary nesting, so a cell cannot hold data outside its plugin's declared shape. Classified from the documented plugin/controls model rather than by reading the validator, hence evidence_class secondary.",
"intent_capture": "unknown",
"upgrade_safety": "Moderate: content references plugins by id with a version field, which supports migration in principle.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level; body not read, not top-10).",
"maintenance_state": "Moderately active; pushed_at 2026-07-28T11:52:48Z, 9,545 stars.",
"limitations": "Grid-based layout model is restrictive; smaller ecosystem than Puck for the same job.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-011record 11
{
"id": "P13-R-011",
"repo": "easyblocks/easyblocks",
"category": "schema_bounded_visual_editor",
"source_url": "https://api.github.com/repos/easyblocks/easyblocks",
"observed_date": "2026-08-27",
"evidence_class": "observed_behavior",
"claim": "Easyblocks (Shopstory's open-source no-code builder framework) is NOT resolvable at the expected GitHub path.",
"edit_data_model": "unknown",
"edit_ops": "unknown",
"out_of_bounds_representable": "unknown",
"out_of_bounds_why": "Could not observe — repository not found.",
"intent_capture": "unknown",
"upgrade_safety": "unknown",
"license_observed": "unknown — GitHub API returned HTTP 404 'Not Found' for repos/easyblocks/easyblocks on 2026-08-27.",
"maintenance_state": "UNRESOLVED/likely gone: `gh api repos/easyblocks/easyblocks` returned 404. Either renamed, deleted, or the org path differs. Not treated as evidence of abandonment without a second check.",
"limitations": "Excluded from the denominator because nothing was observed. Recorded so the gap is visible rather than silently dropped.",
"disposition": "excluded",
"top10_rank": null,
"top10_rationale": null
}
P13-R-012record 12
{
"id": "P13-R-012",
"repo": "ProseMirror/prosemirror-model",
"category": "block_document_editor",
"source_url": "https://github.com/ProseMirror/prosemirror-model/blob/master/src/schema.ts",
"observed_date": "2026-08-27",
"evidence_class": "first_party_docs",
"claim": "ProseMirror enforces a document schema at construction time: NodeType.createChecked() calls checkContent() and throws if the content violates the node's content expression; validContent() answers the same question without throwing.",
"edit_data_model": "json_tree",
"edit_ops": "All mutations are Steps (ReplaceStep, AddMarkStep, AttrStep...) applied through a Transform; each step is individually invertible and rebaseable.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "Strongest case in the census. The schema is a content EXPRESSION grammar (e.g. 'block+', 'paragraph (bullet_list|ordered_list)*') compiled to a ContentMatch state machine, plus a markSet per node type and typed attrs with required-ness. A document violating the grammar throws on createChecked rather than being constructed. The grammar is declarative and shipped with the document type, so out-of-bounds structure is genuinely unrepresentable rather than merely discouraged.",
"intent_capture": "Structurally the best substrate found: every change is a discrete Step object rather than a diff of before/after state, so the CHANGE ITSELF is a first-class value that can be named, annotated, transmitted and inverted. ProseMirror does not itself attach a rationale, but the Step model is the natural place to hang one.",
"upgrade_safety": "Strong: schema is declared separately from documents, and nodes carry typed attrs; changing a schema requires an explicit migration but the mismatch is DETECTED (parse fails loudly) rather than silently corrupting content.",
"license_observed": "MIT — verified two ways: GitHub API license.spdx_id reports MIT, and the canonical forge at code.haverbeke.berlin states the code is released under an MIT license with a LICENSE file present.",
"maintenance_state": "ACTIVE — but the GitHub repo is ARCHIVED and this is misleading. README states 'This repository has moved to https://code.haverbeke.berlin/prosemirror/prosemirror-model'. Direct fetch of that forge on 2026-08-27 shows most recent commit 'Mark version 1.25.11' dated 2026-07-11, 861 commits, 98 tags. Reading the GitHub archive flag as abandonment would be a factual error.",
"limitations": "Text-document-shaped: designed for rich text with block structure, not for a component tree with arbitrary typed props. Adapting it to app composition means encoding components as nodes, which is possible but off the grain. Now off GitHub, which complicates dependency tooling and discovery.",
"disposition": "top10",
"top10_rank": 4,
"top10_rationale": "The canonical proof that a declarative content grammar can make invalid documents unconstructible, plus the cleanest change-as-object (Step) model in the census. Both properties are directly what Actionist needs, even though the domain is text rather than app composition."
}
P13-R-013record 13
{
"id": "P13-R-013",
"repo": "ueberdosis/tiptap",
"category": "block_document_editor",
"source_url": "https://api.github.com/repos/ueberdosis/tiptap",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Tiptap is the dominant ergonomic wrapper over ProseMirror, exposing schema definition through composable Extensions and Nodes.",
"edit_data_model": "json_tree",
"edit_ops": "Commands over ProseMirror transactions; JSON document representation via getJSON().",
"out_of_bounds_representable": false,
"out_of_bounds_why": "Inherits ProseMirror's schema enforcement (P13-R-012) — an extension declares its node's content expression and attributes, and violations fail the same way.",
"intent_capture": "Inherits ProseMirror's Step model; no first-class rationale layer.",
"upgrade_safety": "Same as ProseMirror; extension-based schema composition makes incremental schema evolution more tractable.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level; body not read, not top-10). NOTE: Tiptap also sells Tiptap Pro/Cloud extensions under separate commercial terms — the MIT badge covers the open core only.",
"maintenance_state": "Very active; pushed_at 2026-08-26T14:52:53Z, 38,178 stars — the largest star count in the block-editor tier.",
"limitations": "Same text-document orientation as ProseMirror. Open-core commercial split worth checking before depending on a specific extension.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-014record 14
{
"id": "P13-R-014",
"repo": "facebook/lexical",
"category": "block_document_editor",
"source_url": "https://api.github.com/repos/facebook/lexical",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Lexical is Meta's extensible text editor framework with a node-based document model and strict node registration.",
"edit_data_model": "json_tree",
"edit_ops": "All mutations occur inside editor.update() producing a new immutable EditorState; nodes must be registered on the editor instance.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "Node classes must be explicitly registered in the editor config; deserializing JSON containing an unregistered node type fails rather than silently rendering. The registration list is a closed vocabulary per editor instance.",
"intent_capture": "unknown — EditorState snapshots are whole-state, and while updates carry tags, there is no persisted rationale.",
"upgrade_safety": "Moderate: nodes declare a version/type for serialization and importJSON/exportJSON give an explicit migration seam.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level; body not read, not top-10).",
"maintenance_state": "Very active; pushed_at 2026-08-27T04:14:05Z, 23,801 stars.",
"limitations": "Immutable whole-state snapshots make fine-grained change plans harder to express than ProseMirror Steps. Text-document oriented.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-015record 15
{
"id": "P13-R-015",
"repo": "TypeCellOS/BlockNote",
"category": "block_document_editor",
"source_url": "https://github.com/TypeCellOS/BlockNote/blob/main/LICENSE",
"observed_date": "2026-08-27",
"evidence_class": "first_party_docs",
"claim": "BlockNote is a block-based Notion-style editor built on ProseMirror/Tiptap, exposing a typed block schema with custom block definitions.",
"edit_data_model": "json_tree",
"edit_ops": "insert/update/remove/move blocks via a block-level API; typed props per block schema.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "Custom blocks are declared with a typed propSchema (each prop has a type and, for enums, an explicit values list), and the editor is instantiated with a closed blockSpecs map; a block type or prop outside that map has no representation.",
"intent_capture": "unknown",
"upgrade_safety": "Moderate; block schema is declared separately from content.",
"license_observed": "SPLIT LICENCE, verified by reading the LICENSE body — GitHub reports NOASSERTION. Body states: core source is MPL-2.0, EXCEPT 'The XL packages (source code in the packages/xl-* directories and published in NPM as @blocknote/xl-*) are licensed under the GNU General Public License Version 3 (GPL-3.0). Additionally, a commercial license is available.' This is exactly the open-core trap: an MPL headline hiding GPL-3.0 on the advanced packages.",
"maintenance_state": "Very active; pushed_at 2026-08-26T17:11:04Z, 10,122 stars.",
"limitations": "Any dependency on an @blocknote/xl-* package pulls GPL-3.0 or requires a paid commercial licence — a real cost/legal decision, not a formality.",
"disposition": "top10",
"top10_rank": 9,
"top10_rationale": "Included primarily as the census's cleanest worked example of a typed block propSchema over a ProseMirror substrate, AND as the sharpest licence lesson: the badge said nothing, the body revealed an MPL/GPL-3.0/commercial three-way split."
}
P13-R-016record 16
{
"id": "P13-R-016",
"repo": "codex-team/editor.js",
"category": "block_document_editor",
"source_url": "https://api.github.com/repos/codex-team/editor.js",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Editor.js produces clean JSON output rather than HTML: a document is an ordered array of typed blocks, each with its own data object supplied by a block tool.",
"edit_data_model": "json_tree",
"edit_ops": "insert/move/delete blocks; edit block data via tool-defined structures; sanitizer config per tool.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "Block data shape is defined by convention inside each tool with no enforced schema at the document boundary; the tools map bounds which block TYPES exist, but a block's `data` object is free-form JSON. Type vocabulary is closed, prop vocabulary is not.",
"intent_capture": "unknown",
"upgrade_safety": "Moderate: flat JSON block array with a version field is easy to migrate mechanically.",
"license_observed": "Apache-2.0 per GitHub API license.spdx_id (badge-level; body not read, not top-10).",
"maintenance_state": "Active; pushed_at 2026-08-04T11:55:32Z, 31,908 stars.",
"limitations": "Flat block list, no nesting in the core model; unenforced block data shapes.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-017record 17
{
"id": "P13-R-017",
"repo": "ianstormtaylor/slate",
"category": "block_document_editor",
"source_url": "https://api.github.com/repos/ianstormtaylor/slate",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Slate is a customizable framework for rich text editors whose document is a plain JSON tree, with constraints expressed through normalization rules rather than a declarative schema.",
"edit_data_model": "json_tree",
"edit_ops": "Operations (insert_node, remove_node, set_node, move_node, split_node...) — a small closed operation vocabulary applied to the tree.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "Slate deliberately removed its declarative schema in favour of normalizeNode, an imperative repair function that runs AFTER an invalid state is produced. Invalid states are therefore representable and transiently real; they are corrected rather than prevented. This is the instructive counterexample to ProseMirror.",
"intent_capture": "Operations are discrete objects (like ProseMirror Steps), so change is first-class, but no rationale.",
"upgrade_safety": "Weak: no declarative schema means no principled place to express a migration contract.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level; body not read, not top-10).",
"maintenance_state": "Active; pushed_at 2026-08-26T06:35:54Z, 31,748 stars.",
"limitations": "Normalize-after is architecturally the wrong posture for governed editing: it guarantees convergence, not prevention.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-018record 18
{
"id": "P13-R-018",
"repo": "udecode/plate",
"category": "block_document_editor",
"source_url": "https://github.com/udecode/plate/blob/main/LICENSE",
"observed_date": "2026-08-27",
"evidence_class": "first_party_docs",
"claim": "Plate is a plugin framework over Slate providing a large library of prebuilt editor behaviours.",
"edit_data_model": "json_tree",
"edit_ops": "Slate operations plus plugin-level transforms.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "Inherits Slate's normalize-after posture (P13-R-017).",
"intent_capture": "unknown",
"upgrade_safety": "Weak, per Slate.",
"license_observed": "MIT at root, with a per-package carve-out — read LICENSE body via GitHub API (GitHub reports NOASSERTION): 'Unless otherwise specified in a LICENSE file within an individual package directory, this license applies to all files in this repository outside of those package directories.' So the root MIT is explicitly NOT a blanket grant; individual packages may differ and must be checked per package.",
"maintenance_state": "Very active; pushed_at 2026-08-27T03:43:02Z, 16,535 stars.",
"limitations": "Root-MIT-with-exceptions is a licence pattern that requires per-package diligence before adoption.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-019record 19
{
"id": "P13-R-019",
"repo": "toeverything/blocksuite",
"category": "block_document_editor",
"source_url": "https://api.github.com/repos/toeverything/blocksuite",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "BlockSuite (the editor toolkit behind AFFiNE) models documents as CRDT-backed block trees, supporting both page and edgeless/whiteboard surfaces over one document model.",
"edit_data_model": "crdt",
"edit_ops": "block add/delete/move/update over a Yjs-backed store; schema declared per block via a block spec.",
"out_of_bounds_representable": "unknown",
"out_of_bounds_why": "Block schemas are declared and validated on registration, but the underlying Yjs store is a general-purpose CRDT map/array structure that can hold arbitrary data; the strength of the boundary depends on whether all writes go through the block-schema layer. Not verified by reading the store implementation.",
"intent_capture": "CRDT history records WHO changed WHAT and in what causal order, which is richer provenance than a plain JSON tree, but still not WHY.",
"upgrade_safety": "Moderate; block schemas are versioned, but CRDT-persisted structures are notoriously awkward to migrate.",
"license_observed": "MPL-2.0 per GitHub API license.spdx_id (badge-level; body not read, not top-10). File-level copyleft — modifications to MPL files must be shared, but it can be combined with proprietary code.",
"maintenance_state": "Very active; pushed_at 2026-08-26T18:15:59Z, 5,992 stars.",
"limitations": "Large, fast-moving, tightly coupled to AFFiNE's needs; CRDT substrate raises migration cost.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-020record 20
{
"id": "P13-R-020",
"repo": "yoopta-editor/Yoopta-Editor",
"category": "block_document_editor",
"source_url": "https://api.github.com/repos/Darginec05/Yoopta-Editor",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Yoopta-Editor is a Notion-like block editor built on Slate, packaged as composable plugins.",
"edit_data_model": "json_tree",
"edit_ops": "block-level insert/move/delete plus Slate ops within blocks.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "Slate-based; inherits normalize-after.",
"intent_capture": "unknown",
"upgrade_safety": "Weak.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level). NOTE: repo redirects from Darginec05/Yoopta-Editor to yoopta-editor/Yoopta-Editor.",
"maintenance_state": "Slowing; pushed_at 2026-05-11T14:37:43Z — about 3.5 months idle as of 2026-08-27, 3,083 stars.",
"limitations": "Smaller ecosystem; inherits Slate's weaknesses without adding schema enforcement.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-021record 21
{
"id": "P13-R-021",
"repo": "onlook-dev/onlook",
"category": "visual_editing_bridge_over_code",
"source_url": "https://github.com/onlook-dev/onlook#how-it-works",
"observed_date": "2026-08-27",
"evidence_class": "first_party_docs",
"claim": "Onlook is a visual-first editor over a REAL Next.js + Tailwind codebase. Its README documents the round trip verbatim: load code into a web container, serve it, display the preview in an iFrame, index the code, 'instrument the code in order to map elements to their place in code', and 'When the element is edited, we edit the element in our iFrame, then in code.'",
"edit_data_model": "ast",
"edit_ops": "Visual manipulation of DOM elements that is translated back into source edits; brand asset and token management; page creation/navigation.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "The system of record is the source code itself, which is Turing-complete. The visual layer constrains what the UI offers but nothing makes an out-of-bounds edit unrepresentable — the escape hatch IS the model. This is the 'unbounded fallthrough' posture from the wave-1 commercial census, in open source.",
"intent_capture": "unknown as a persisted artefact. Because edits land as source changes, the surrounding VCS commit is the only place intent could live, and it is free-text.",
"upgrade_safety": "Inverted relative to Actionist's need: because edits are written into source, a visual edit and a hand-written change are indistinguishable afterwards, so there is no governed layer left to upgrade independently. Excellent for code ownership, poor for preserved composability.",
"license_observed": "Apache-2.0 — VERIFIED BY READING LICENSE body via GitHub API; body is the verbatim Apache License Version 2.0 header and terms, with NO src/pro-style carve-out preamble of the kind found in dyad (contrast P13-R-055). Onlook does run a hosted early-access product per its README, but the repo licence itself is clean Apache-2.0.",
"maintenance_state": "Very active; pushed_at 2026-08-25T01:06:22Z, 26,566 stars — the largest OSS AI-visual-editor by stars in this census.",
"limitations": "Documents the source-of-truth question rather than answering it in Actionist's favour. Valuable as the reference implementation of code-as-truth, and as the clearest statement of what Actionist must NOT do if upgradeability matters.",
"disposition": "top10",
"top10_rank": 7,
"top10_rationale": "The best-maintained open implementation of visual editing over real code, with a first-party architecture description. Ranked mid-table because it is the strongest available evidence for the posture Actionist is deliberately rejecting — the anti-pattern is as decision-relevant as the pattern."
}
P13-R-022record 22
{
"id": "P13-R-022",
"repo": "storybookjs/storybook",
"category": "visual_editing_bridge_over_code",
"source_url": "https://github.com/storybookjs/storybook/blob/next/docs/essentials/controls.mdx",
"observed_date": "2026-08-27",
"evidence_class": "first_party_docs",
"claim": "Storybook's args/argTypes model is bounded editing in production use at very large scale: 'Storybook will automatically generate UI controls based on your args and what it can infer about your component' and argTypes further constrains each control.",
"edit_data_model": "json_tree",
"edit_ops": "Set arg values through generated controls; control type per arg is declared or inferred; args are serializable and shareable via URL.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "Args are a flat typed record keyed by the component's declared props, and argTypes pins each arg's control (select with an options list, range with min/max, boolean, etc). A value outside the declared control's domain cannot be produced through the surface, and an arg not in the component's prop vocabulary has nowhere to live.",
"intent_capture": "unknown — args capture state, and a story name is a human label for a state, not a record of why a change was made. Notably, a STORY is arguably an intent artefact: it names a meaningful configuration ('LoggedOutWithError') rather than just storing values.",
"upgrade_safety": "Strong in practice: args reference component props by name, so component internals can be refactored while stories keep working; a removed prop surfaces as a broken story, i.e. loud failure.",
"license_observed": "MIT — VERIFIED BY READING LICENSE body via GitHub API: 'The MIT License (MIT) / Copyright (c) 2024 Storybook'. Verbatim permissive MIT, no carve-out observed.",
"maintenance_state": "Extremely active; pushed_at 2026-08-27T09:33:35Z, 90,945 stars — the highest star count in the entire census.",
"limitations": "Args edit a component in isolation, not a composed application; there is no tree/structure editing, no persistence of edits as a document, and no notion of a governed composition.",
"disposition": "top10",
"top10_rank": 6,
"top10_rationale": "The most widely deployed bounded-edit surface in existence and proof that prop-schema-driven controls scale to enormous component libraries. Its arg/argType split is a directly reusable model for Actionist's per-capability editable surface, and the named-story idea is the census's closest brush with intent capture."
}
P13-R-023record 23
{
"id": "P13-R-023",
"repo": "codesandbox/sandpack",
"category": "visual_editing_bridge_over_code",
"source_url": "https://api.github.com/repos/codesandbox/sandpack",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Sandpack is a component toolkit for embedding live browser-based code execution and preview.",
"edit_data_model": "other",
"edit_ops": "Free-form code editing with live bundling and preview; file-level in-memory filesystem.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "Explicitly a free-form code editor; bounding is not a goal.",
"intent_capture": "unknown",
"upgrade_safety": "n/a — preview infrastructure rather than a composition model.",
"license_observed": "Apache-2.0 per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "STALE: pushed_at 2025-04-24T13:17:28Z — about 16 months idle as of 2026-08-27, 6,224 stars.",
"limitations": "Relevant to P13 only as preview/execution plumbing, not as an editing model. Maintenance gap matters if used as infrastructure.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-024record 24
{
"id": "P13-R-024",
"repo": "tajo/ladle",
"category": "visual_editing_bridge_over_code",
"source_url": "https://api.github.com/repos/tajo/ladle",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Ladle is a faster, lighter Storybook-compatible environment for developing and viewing stories, including controls over story args.",
"edit_data_model": "json_tree",
"edit_ops": "Arg editing via generated controls, same conceptual model as Storybook.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "Same args/argTypes bounding as Storybook (P13-R-022).",
"intent_capture": "unknown",
"upgrade_safety": "Same as Storybook.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "Moderately active; pushed_at 2026-06-28T20:32:40Z, 2,983 stars.",
"limitations": "Adds no new bounding concept beyond Storybook; smaller ecosystem.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-025record 25
{
"id": "P13-R-025",
"repo": "histoire-dev/histoire",
"category": "visual_editing_bridge_over_code",
"source_url": "https://api.github.com/repos/histoire-dev/histoire",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Histoire is a Vite-native story/component explorer for Vue and other frameworks, with controls over story state.",
"edit_data_model": "json_tree",
"edit_ops": "Control-driven editing of story state.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "Controls bound to declared story state, same family as Storybook args.",
"intent_capture": "unknown",
"upgrade_safety": "Same family as Storybook.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "Moderately active; pushed_at 2026-08-05T21:22:52Z, 3,571 stars.",
"limitations": "Vue-oriented; smaller ecosystem.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-026record 26
{
"id": "P13-R-026",
"repo": "jnsahaj/tweakcn",
"category": "design_token_theme_editor",
"source_url": "https://api.github.com/repos/jnsahaj/tweakcn",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "tweakcn is a visual theme editor for shadcn/ui that edits the design-token layer (CSS custom properties) rather than component markup, exporting a theme users paste into their app.",
"edit_data_model": "other",
"edit_ops": "Edit token values (colors, radius, typography, shadows) across light/dark modes; export as CSS variables.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "The editable surface is a FIXED, known set of shadcn token names (--background, --primary, --radius, etc). You can change a token's value but you cannot invent a new structural affordance or restyle an arbitrary element — the token vocabulary is the boundary. This is the theme/token-edit operation from Actionist's list, isolated cleanly.",
"intent_capture": "unknown",
"upgrade_safety": "Excellent and directly instructive: because edits land on token VALUES and components consume tokens by NAME, components can be upgraded independently of the theme and vice versa. The indirection is what preserves upgradeability.",
"license_observed": "Apache-2.0 — VERIFIED BY READING LICENSE body via GitHub API; verbatim Apache License Version 2.0, no carve-out preamble.",
"maintenance_state": "Active; pushed_at 2026-08-17T15:20:50Z, 10,315 stars.",
"limitations": "Scope is exactly one edit class (theme/tokens); no structural editing, no composition model, no persistence beyond exported CSS.",
"disposition": "top10",
"top10_rank": 8,
"top10_rationale": "The cleanest demonstration in the census that restricting edits to a named token vocabulary yields both bounded editing AND upgrade-safety for free. Actionist's theme/token edit class should be modelled on exactly this indirection."
}
P13-R-027record 27
{
"id": "P13-R-027",
"repo": "style-dictionary/style-dictionary",
"category": "design_token_theme_editor",
"source_url": "https://api.github.com/repos/amzn/style-dictionary",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Style Dictionary is a build system that transforms declarative design tokens into platform-specific artefacts (CSS, iOS, Android).",
"edit_data_model": "json_tree",
"edit_ops": "Token definitions are JSON; edits are token value/alias changes, then a build step.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "Tokens are a closed declared set with typed categories and alias references; there is no facility to express a non-token style change through this pipeline.",
"intent_capture": "Partial: token ALIASES ({color.brand.primary} -> {color.core.blue.500}) encode a semantic relationship, which is a durable statement of design intent rather than a raw value. This is the census's best example of intent encoded in the data model itself.",
"upgrade_safety": "Strong: the alias/reference indirection means changing a core value propagates to every semantic consumer without editing consumers.",
"license_observed": "Apache-2.0 per GitHub API license.spdx_id (badge-level). NOTE: repo redirects from amzn/style-dictionary to style-dictionary/style-dictionary — it moved out of the Amazon org.",
"maintenance_state": "Active; pushed_at 2026-08-22T01:15:20Z, 4,787 stars.",
"limitations": "Build-time tool, not an interactive editor; no live preview loop.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-028record 28
{
"id": "P13-R-028",
"repo": "tokens-studio/figma-plugin",
"category": "design_token_theme_editor",
"source_url": "https://api.github.com/repos/tokens-studio/figma-plugin",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Tokens Studio manages design tokens in Figma with sync to code repositories, implementing token sets and themes.",
"edit_data_model": "json_tree",
"edit_ops": "Token CRUD, token sets, theme composition, git sync.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "Token-vocabulary-bounded, same reasoning as Style Dictionary.",
"intent_capture": "Token sets/themes name a purpose (e.g. a brand or density theme), which carries some semantic intent.",
"upgrade_safety": "Strong via alias indirection; git sync gives a real change history.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "Active; pushed_at 2026-08-22T11:08:35Z, 1,605 stars.",
"limitations": "Figma-coupled; the design-tool half is not usable headlessly.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-029record 29
{
"id": "P13-R-029",
"repo": "chakra-ui/panda",
"category": "design_token_theme_editor",
"source_url": "https://api.github.com/repos/chakra-ui/panda",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Panda CSS is a build-time CSS-in-JS engine with a typed token/recipe system that generates a constrained style API from a config.",
"edit_data_model": "other",
"edit_ops": "Style props constrained to config-declared tokens; recipes define allowed variant combinations.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "This is a genuinely strong and under-appreciated case: Panda GENERATES TypeScript types from the token config, so a style value outside the declared token scale is a compile-time type error. Recipes declare a closed set of variants, making an undefined variant combination unrepresentable in the type system.",
"intent_capture": "Recipes name a semantic variant (size='lg', tone='danger') rather than raw values, which carries design intent in the same spirit as token aliases.",
"upgrade_safety": "Strong: consumers reference token/variant names, so the underlying values can change centrally.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "Active; pushed_at 2026-08-25T12:08:10Z, 6,163 stars.",
"limitations": "Compile-time enforcement only — it constrains developers writing code, not end users editing through a runtime UI, so it does not directly solve the runtime editor boundary.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-030record 30
{
"id": "P13-R-030",
"repo": "shadcn-ui/ui",
"category": "design_token_theme_editor",
"source_url": "https://api.github.com/repos/shadcn-ui/ui",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "shadcn/ui is a copy-in component collection plus a registry format (registry.json / registry-item schema) that describes distributable component units and their dependencies.",
"edit_data_model": "json_tree",
"edit_ops": "Registry items declare files, dependencies, and cssVars; the CLI installs them into a consuming codebase.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "Explicitly a copy-and-own model: once installed, the component source belongs to the consumer and can be edited arbitrarily. The registry bounds DISTRIBUTION, not subsequent editing.",
"intent_capture": "unknown",
"upgrade_safety": "Deliberately weak by design — copy-and-own means there is no upstream upgrade path, which is the exact trade-off Actionist's governed capabilities are meant to avoid. Instructive as a stated anti-goal.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "Extremely active; pushed_at 2026-08-26T06:28:13Z, 122,247 stars — highest star count observed in this census.",
"limitations": "Registry schema is a useful reference for describing a distributable capability, but the copy-and-own philosophy is opposite to governed upgradeability.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-031record 31
{
"id": "P13-R-031",
"repo": "sanity-io/sanity",
"category": "cms_visual_editing",
"source_url": "https://www.sanity.io/docs/http-patches",
"observed_date": "2026-08-27",
"evidence_class": "first_party_docs",
"claim": "Sanity expresses every content change as a patch drawn from a closed, enumerated vocabulary: set, setIfMissing, unset, insert (with before/after/replace positioning), inc, dec, and diffMatchPatch. First-party docs describe these as 'The valid patch types when using the direct HTTP mutations api.'",
"edit_data_model": "patch",
"edit_ops": "The seven patch types above, addressed by JSONMatch paths; patches compose into mutations alongside create/delete.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "Two independent boundaries. (1) The MUTATION vocabulary is closed — a change that is not expressible as one of the enumerated patch types cannot be submitted at all. (2) Documents are validated against a declared Sanity schema, so a patch producing a document that violates the schema is rejected. Typed ops also fail loudly rather than coercing: inc/dec 'will fail if target value is not a numeric value, or doesn't exist'.",
"intent_capture": "Partial and the best in the CMS tier: because the change is transmitted as a patch rather than as a new whole document, the SHAPE of the intent ('insert this item after that one', 'increment this') survives into the change record, instead of being flattened into a before/after diff that a reader must re-interpret.",
"upgrade_safety": "Strong: content is schema-declared and stored separately from presentation, and patches address paths rather than rewriting documents, so concurrent/independent evolution is the normal case. Docs note diff-match-patch patches 'compose well' under concurrent edits.",
"license_observed": "MIT — VERIFIED BY READING LICENSE body via GitHub API: 'MIT License / Copyright (c) 2016 - 2026 Sanity.io'. Verbatim permissive MIT, no carve-out at repo root. Scope caveat stands: this covers the OSS Studio/toolchain; Sanity's hosted Content Lake backend is a commercial service not granted by this licence.",
"maintenance_state": "Extremely active; pushed_at 2026-08-27T09:38:03Z, 6,298 stars.",
"limitations": "Bounded-ness lives in a hosted API, so the enforcement point is a service Actionist would not control. Optimistic locking via a revision id was NOT confirmed on the patches page — UNVERIFIED, would need the Mutations API reference.",
"disposition": "top10",
"top10_rank": 5,
"top10_rationale": "The strongest production example of a CLOSED MUTATION VOCABULARY — the single mechanism most directly transferable to Actionist's bounded change plans. Where Puck bounds the editable FIELDS, Sanity bounds the permitted OPERATIONS, which is the other half of the same problem."
}
P13-R-032record 32
{
"id": "P13-R-032",
"repo": "tinacms/tinacms",
"category": "cms_visual_editing",
"source_url": "https://github.com/tinacms/tinacms#readme",
"observed_date": "2026-08-27",
"evidence_class": "first_party_docs",
"claim": "TinaCMS is a git-backed headless CMS over Markdown/MDX/JSON/YAML files with an optional opt-in live preview that makes editing 'very intuitive for less-technical people' (README).",
"edit_data_model": "json_tree",
"edit_ops": "Field edits driven by a declared collection schema; changes are committed to git.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "The editing UI is generated from a declared collection/field schema, so only declared fields are editable. However the underlying files are plain Markdown/JSON in a git repo, so any out-of-band writer can produce content the schema would reject — the boundary holds at the editor, not at the store.",
"intent_capture": "Structurally notable: because every edit becomes a GIT COMMIT, there is a natural, durable place for authorship, timestamp, and a message. It is free text rather than a structured intent record, but it is the only project in the census where change provenance is a first-class, permanent artefact by default.",
"upgrade_safety": "Strong: content lives in files in the consumer's repo, schema is code, and git history gives real rollback. Content and component upgrades are independent.",
"license_observed": "Apache-2.0 — VERIFIED BY READING LICENSE body via GitHub API; verbatim Apache License Version 2.0, no carve-out preamble. Scope caveat stands: TinaCloud is a commercial hosted service; this repo is the client/toolchain.",
"maintenance_state": "Extremely active; pushed_at 2026-08-27T09:39:45Z, 13,757 stars.",
"limitations": "Document/page-content oriented rather than app-composition oriented; git-commit intent is unstructured free text.",
"disposition": "top10",
"top10_rank": 10,
"top10_rationale": "The census's best answer to 'where does an edit's provenance live' — git-backed edits give durable, attributable, revertible history for free. Combined with a schema-generated editing surface, it is the closest OSS approximation of governed editing with a real audit trail."
}
P13-R-033record 33
{
"id": "P13-R-033",
"repo": "decaporg/decap-cms",
"category": "cms_visual_editing",
"source_url": "https://api.github.com/repos/decaporg/decap-cms",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Decap CMS (formerly Netlify CMS) is a git-based CMS configured by a YAML collection/field schema.",
"edit_data_model": "json_tree",
"edit_ops": "Field edits per declared widget type; editorial workflow via git branches/PRs.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "The admin UI renders only widgets declared in config.yml, so undeclared fields are not editable; as with Tina, the underlying files remain directly writable.",
"intent_capture": "Editorial workflow maps drafts to branches and PRs, so review state is explicit — a governance signal, though still not a rationale field.",
"upgrade_safety": "Strong via git; content is files.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "Active; pushed_at 2026-08-27T09:24:56Z, 19,318 stars.",
"limitations": "Widget model is flat and dated relative to Tina; primarily page/content editing.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-034record 34
{
"id": "P13-R-034",
"repo": "payloadcms/payload",
"category": "cms_visual_editing",
"source_url": "https://api.github.com/repos/payloadcms/payload",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Payload is a code-first TypeScript CMS/app framework where collections, fields, and access control are declared in config, including a blocks field type for composed layouts.",
"edit_data_model": "json_tree",
"edit_ops": "Field edits bounded by the field config; the blocks field allows composing a page from a declared, closed list of block types; live preview supported.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "Strong case: a blocks field declares exactly which block types may appear, each with its own field schema, and Payload validates on write at the API layer. Access control is a per-field/per-operation function in the same config, so read/write permission is part of the declared model rather than UI chrome.",
"intent_capture": "Versions/drafts record change history with authorship; no rationale field.",
"upgrade_safety": "Strong: config-as-code with declared fields, plus a migrations system for schema evolution.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level; body not read, not top-10).",
"maintenance_state": "Extremely active; pushed_at 2026-08-27T04:41:29Z, 44,425 stars — the largest CMS in this census by stars.",
"limitations": "Not evaluated by reading source; classification is from the documented config model. A strong candidate that narrowly missed top-10 only because its bounding mechanism duplicates lessons already captured by Puck (declared fields) and Sanity (server-side validation).",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-035record 35
{
"id": "P13-R-035",
"repo": "storyblok/storyblok-js-client",
"category": "cms_visual_editing",
"source_url": "https://api.github.com/repos/storyblok/storyblok-js-client",
"observed_date": "2026-08-27",
"evidence_class": "observed_behavior",
"claim": "The Storyblok JS client SDK repository is ARCHIVED on GitHub.",
"edit_data_model": "unknown",
"edit_ops": "n/a — SDK client, not an editing model.",
"out_of_bounds_representable": "unknown",
"out_of_bounds_why": "Not applicable; this is a delivery-API client, and Storyblok's bounded-editing story (the component whitelist noted in the wave-1 commercial census) lives in the hosted product, not in this repo.",
"intent_capture": "unknown",
"upgrade_safety": "unknown",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "ARCHIVED: archived=true, pushed_at 2025-06-24T09:12:16Z, 135 stars.",
"limitations": "Included to close the loop on the brief's 'Storyblok SDKs' item: the OSS surface is a thin client and carries none of the whitelist enforcement that made Storyblok interesting in wave 1. That mechanism is server-side and proprietary.",
"disposition": "excluded",
"top10_rank": null,
"top10_rationale": null
}
P13-R-036record 36
{
"id": "P13-R-036",
"repo": "yjs/yjs",
"category": "edit_history_substrate",
"source_url": "https://github.com/yjs/yjs/blob/main/LICENSE",
"observed_date": "2026-08-27",
"evidence_class": "first_party_docs",
"claim": "Yjs is the most widely deployed CRDT framework for shared editing, providing shared types (Y.Map, Y.Array, Y.Text, Y.XmlFragment) with automatic conflict resolution.",
"edit_data_model": "crdt",
"edit_ops": "Type-level mutations that generate incremental updates; UndoManager provides scoped undo/redo with origin tracking.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "Yjs shared types are deliberately general-purpose containers — a Y.Map accepts arbitrary keys. It guarantees CONVERGENCE (all replicas agree) not VALIDITY (the agreed state is legal). Any schema enforcement must be layered above, and two concurrently-valid edits can merge into a jointly-invalid document. This is the central caution for CRDT-based governed editing.",
"intent_capture": "Partial: updates carry an ORIGIN that the UndoManager uses to scope undo, and transactions can be tagged, which is a real hook for attributing a change to an actor or an agent. Still not a rationale.",
"upgrade_safety": "Weak: CRDT documents accrete history and encode structure in the binary update format, so schema migration is genuinely hard.",
"license_observed": "MIT — read LICENSE body via GitHub API (GitHub reports NOASSERTION); body is 'The MIT License (MIT), Copyright (c) 2023 Kevin Jahns / RWTH Aachen University'. Verbatim MIT, no additional restrictions. The NOASSERTION badge is a detection artefact from the dual copyright block.",
"maintenance_state": "Active; pushed_at 2026-08-06T08:32:25Z, 22,705 stars.",
"limitations": "Convergence-without-validity makes Yjs alone insufficient for bounded editing; it is the transport/merge layer, and the boundary must be enforced elsewhere.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-037record 37
{
"id": "P13-R-037",
"repo": "automerge/automerge",
"category": "edit_history_substrate",
"source_url": "https://api.github.com/repos/automerge/automerge",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Automerge is a CRDT library with a strong emphasis on document history: it retains a full change graph where each change is an addressable object with actor, timestamp, dependencies, and an optional message.",
"edit_data_model": "crdt",
"edit_ops": "Mutations inside a change() block, producing a Change with metadata.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "Like Yjs, Automerge guarantees convergence rather than schema validity; documents are general JSON-like structures.",
"intent_capture": "BEST IN CENSUS for the mechanism, if not the semantics: Automerge changes carry an optional human-readable MESSAGE plus actor and dependency metadata, and the change graph is queryable. It is the only substrate here that treats 'a change' as a durable, addressable, annotatable first-class object rather than an ephemeral step between two states. Actionist's 'why was this edit made' requirement maps onto exactly this slot.",
"upgrade_safety": "Weak, same CRDT migration problem as Yjs.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level; body not read, not top-10).",
"maintenance_state": "Very active; pushed_at 2026-08-27T09:29:46Z, 6,535 stars.",
"limitations": "Message is unstructured free text, so it records a human note rather than a machine-checkable intent. Convergence-without-validity applies.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-038record 38
{
"id": "P13-R-038",
"repo": "loro-dev/loro",
"category": "edit_history_substrate",
"source_url": "https://api.github.com/repos/loro-dev/loro",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Loro is a modern Rust CRDT library with rich text, movable tree, and time-travel support, targeting local-first applications.",
"edit_data_model": "crdt",
"edit_ops": "Container mutations (map/list/movable-list/tree/text) with version-vector-addressable history and checkout/time-travel.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "General-purpose CRDT containers; convergence not validity.",
"intent_capture": "Version-addressable history enables time travel and diffing between arbitrary versions, which is strong provenance; no rationale field.",
"upgrade_safety": "Weak (CRDT migration), though the movable-tree container is notably better suited to component-tree reordering than Yjs arrays.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "Very active; pushed_at 2026-08-27T01:45:33Z, 6,077 stars.",
"limitations": "Younger and smaller ecosystem than Yjs; Rust core with bindings.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-039record 39
{
"id": "P13-R-039",
"repo": "immerjs/immer",
"category": "edit_history_substrate",
"source_url": "https://api.github.com/repos/immerjs/immer",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Immer produces immutable next-state from mutable-looking code and can emit JSON-Patch-shaped patches plus inverse patches for every produced change.",
"edit_data_model": "patch",
"edit_ops": "produceWithPatches returns [nextState, patches, inversePatches] where each patch is {op, path, value}.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "Immer records whatever mutation the producer performed; it imposes no vocabulary or schema of its own.",
"intent_capture": "Mechanically useful rather than semantic: inverse patches give exact undo for free, and the patch list is a machine-readable description of what changed at path granularity — a ready-made substrate for a change plan, but carrying no reason.",
"upgrade_safety": "n/a — a state utility, not a persistence model.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "Active; pushed_at 2026-08-19T07:57:23Z, 28,980 stars.",
"limitations": "In-memory only; patches describe structural change, not meaning.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-040record 40
{
"id": "P13-R-040",
"repo": "benjamine/jsondiffpatch",
"category": "edit_history_substrate",
"source_url": "https://api.github.com/repos/benjamine/jsondiffpatch",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "jsondiffpatch diffs and patches JSON documents, with array diffing by an object hash and reversible deltas.",
"edit_data_model": "patch",
"edit_ops": "diff, patch, unpatch, reverse over arbitrary JSON.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "Schema-agnostic by design.",
"intent_capture": "unknown — a computed diff is the weakest form of change record because the original intent has already been lost by the time the diff is derived from before/after states. This is the key contrast with ProseMirror Steps and Sanity patches, which are captured at the moment of intent.",
"upgrade_safety": "n/a",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "Moderately active; pushed_at 2026-05-14T22:54:47Z, 5,337 stars.",
"limitations": "Derived-diff model; useful for storage/undo, not for capturing meaning.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-041record 41
{
"id": "P13-R-041",
"repo": "Starcounter-Jack/JSON-Patch",
"category": "edit_history_substrate",
"source_url": "https://api.github.com/repos/Starcounter-Jack/JSON-Patch",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "fast-json-patch implements RFC 6902 JSON Patch with observe-based patch generation and validation.",
"edit_data_model": "patch",
"edit_ops": "RFC 6902 closed op set: add, remove, replace, move, copy, test.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "The OPERATION vocabulary is closed (six ops fixed by RFC 6902) but the paths and values are unconstrained, so any document state is reachable. Notably, the `test` op is a built-in precondition primitive — a patch can assert an expected current value and fail atomically, which is a ready-made optimistic-concurrency guard for change plans.",
"intent_capture": "unknown",
"upgrade_safety": "n/a",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "Slowing; pushed_at 2025-10-23T20:48:55Z — about 10 months idle as of 2026-08-27, 1,982 stars. RFC 6902 is a stable standard, so idleness matters less here.",
"limitations": "Standard-level plumbing; carries no schema or semantics.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-042record 42
{
"id": "P13-R-042",
"repo": "BuilderIO/builder",
"category": "schema_bounded_visual_editor",
"source_url": "https://github.com/BuilderIO/builder/blob/main/LICENSE",
"observed_date": "2026-08-27",
"evidence_class": "observed_behavior",
"claim": "Builder.io's open-source repo contains the multi-framework SDKs and registration APIs (registerComponent with typed inputs), NOT the visual editor itself. Critically, the styleStrictMode mechanism identified in the wave-1 commercial census is ABSENT from this repository.",
"edit_data_model": "json_tree",
"edit_ops": "Content is a JSON block tree consumed by SDKs; registerComponent declares each custom component's inputs with types, defaults and enums, bounding what the (hosted) editor may set.",
"out_of_bounds_representable": "unknown",
"out_of_bounds_why": "registerComponent's typed input list is real denial for custom components — an undeclared input has no slot in the content JSON. But the enforcement point is the hosted editor, which is not in this repo, so the boundary cannot be verified from OSS alone.",
"intent_capture": "unknown",
"upgrade_safety": "Good in principle: content references components by registered name, so implementations can evolve in the host codebase while content stays stable.",
"license_observed": "MIT — read LICENSE body via GitHub API: 'MIT License / Copyright (c) 2020 Builder.io, Inc'. Verbatim permissive MIT for the SDK repo. This MIT grant covers the SDKs ONLY; Builder.io Visual Editor is a commercial hosted product.",
"maintenance_state": "Active; pushed_at 2026-08-24T07:37:21Z, 8,808 stars.",
"limitations": "IMPORTANT NEGATIVE RESULT: GitHub code search for styleStrictMode scoped to repo:BuilderIO/builder returned total_count 0 on 2026-08-27. The graduated-permission mechanism that made Builder.io the wave-1 exemplar of posture (2) is therefore proprietary and cannot be studied in source. Same open-core trap as Composio flagged in project instructions — MIT badge over an SDK to a paid product.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-043record 43
{
"id": "P13-R-043",
"repo": "appsmithorg/appsmith",
"category": "schema_bounded_visual_editor",
"source_url": "https://api.github.com/repos/appsmithorg/appsmith",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Appsmith is a self-hostable internal-tool builder where apps are composed by dragging widgets onto a grid canvas and configuring each widget's declared properties, with data bound via JS-in-mustache expressions.",
"edit_data_model": "json_tree",
"edit_ops": "Add/remove/move/resize widgets on a grid; edit declared widget properties; bind properties to queries via {{ }} expressions — a direct analogue of Actionist's data-binding edit class.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "Widget types come from a fixed registry and each widget exposes a declared property config, so the app DSL cannot express a widget or property outside that vocabulary. The escape hatch is explicit and bounded to expression slots rather than to arbitrary structure — a good precedent for Actionist's 'explicit escape hatch' requirement.",
"intent_capture": "unknown",
"upgrade_safety": "Moderate: apps are stored as a widget DSL referencing widget types by name with a DSL version, and Appsmith runs DSL migrations on load when the version advances — a real, production-tested migration seam.",
"license_observed": "Apache-2.0 per GitHub API license.spdx_id (badge-level; body not read, not top-10). Appsmith also has a commercial edition, so per-directory carve-outs are plausible and unverified.",
"maintenance_state": "Extremely active; pushed_at 2026-08-27T07:28:08Z, 40,755 stars.",
"limitations": "Grid-canvas internal-tools model rather than a marketing/app composition model; heavy runtime.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-044record 44
{
"id": "P13-R-044",
"repo": "Budibase/budibase",
"category": "schema_bounded_visual_editor",
"source_url": "https://github.com/Budibase/budibase/blob/master/LICENSE",
"observed_date": "2026-08-27",
"evidence_class": "first_party_docs",
"claim": "Budibase is a low-code platform for building internal apps from a component tree with declared settings per component.",
"edit_data_model": "json_tree",
"edit_ops": "Compose screens from a closed component library; configure declared component settings; bind to data sources.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "Screens are a JSON component tree referencing components from a fixed manifest, each with a declared settings schema.",
"intent_capture": "unknown",
"upgrade_safety": "Moderate; component manifest is versioned.",
"license_observed": "MIXED, verified by reading the LICENSE body (GitHub reports NOASSERTION). Body states: 'Each Budibase package has its own license... You can consider Budibase to be GPLv3 licensed overall,' with the guideline 'Is this a paid feature? If yes, license the package under BSL.' So the repo is GPLv3 overall WITH Business Source License packages for paid features. The body also notes apps BUILT with Budibase do not package GPLv3 code and so are not restricted.",
"maintenance_state": "Extremely active; pushed_at 2026-08-27T09:47:07Z, 28,244 stars.",
"limitations": "GPLv3+BSL mix makes embedding infeasible without careful per-package analysis. Recorded chiefly as a licence-diligence datapoint.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-045record 45
{
"id": "P13-R-045",
"repo": "ToolJet/ToolJet",
"category": "schema_bounded_visual_editor",
"source_url": "https://api.github.com/repos/ToolJet/ToolJet",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "ToolJet is an open-source internal-tool builder with a drag-and-drop app builder over a fixed widget set.",
"edit_data_model": "json_tree",
"edit_ops": "Widget composition plus declared property/style config; query bindings.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "Fixed widget registry with declared properties, same family as Appsmith.",
"intent_capture": "unknown",
"upgrade_safety": "Moderate.",
"license_observed": "AGPL-3.0 per GitHub API license.spdx_id (badge-level). AGPL network copyleft is a real constraint for hosted commercial use.",
"maintenance_state": "Extremely active; pushed_at 2026-08-27T09:48:01Z, 40,777 stars.",
"limitations": "AGPL; adds no distinct bounding mechanism beyond Appsmith.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-046record 46
{
"id": "P13-R-046",
"repo": "frappe/builder",
"category": "schema_bounded_visual_editor",
"source_url": "https://api.github.com/repos/frappe/builder",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Frappe Builder is a visual website builder producing clean pages, built on the Frappe framework.",
"edit_data_model": "dom",
"edit_ops": "Visual block composition with style controls; publishes pages.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "Style controls expose broad CSS; DOM-shaped model.",
"intent_capture": "unknown",
"upgrade_safety": "Weak.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "Active; pushed_at 2026-08-27T08:13:16Z, 2,309 stars.",
"limitations": "Frappe-coupled; site-builder rather than composition governance.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-047record 47
{
"id": "P13-R-047",
"repo": "CoreBunch/Instatic",
"category": "schema_bounded_visual_editor",
"source_url": "https://api.github.com/repos/CoreBunch/Instatic",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Instatic is a self-hosted agentic visual CMS that outputs clean static pages, positioned against Webflow/Framer/WordPress.",
"edit_data_model": "unknown",
"edit_ops": "Visual editing with users, roles, plugins and content; static output.",
"out_of_bounds_representable": "unknown",
"out_of_bounds_why": "Not verified; the roles system implies permission-graduated editing but the data model was not read.",
"intent_capture": "unknown",
"upgrade_safety": "Weak — static page output.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "Active; pushed_at 2026-08-21T09:37:35Z, 8,260 stars.",
"limitations": "High star count for a project I could not verify architecturally; recorded honestly as largely unknown rather than inferred from its description.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-048record 48
{
"id": "P13-R-048",
"repo": "NetEase/tango",
"category": "schema_bounded_visual_editor",
"source_url": "https://api.github.com/repos/NetEase/tango",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Tango is a 'code driven low-code builder' that develops a low-code app directly on the user's own codebase — visual edits are applied as source AST transformations.",
"edit_data_model": "ast",
"edit_ops": "Visual manipulation compiled to source-code changes via AST rewriting.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "Source code is the system of record; same fallthrough posture as Onlook.",
"intent_capture": "unknown",
"upgrade_safety": "Inverted — edits dissolve into source.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "STALE: pushed_at 2024-09-10T09:04:56Z — nearly 2 years idle as of 2026-08-27, 3,128 stars.",
"limitations": "Architecturally interesting as a second code-as-truth datapoint, but effectively dormant.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-049record 49
{
"id": "P13-R-049",
"repo": "blocks/blocks",
"category": "schema_bounded_visual_editor",
"source_url": "https://api.github.com/repos/blocks/blocks",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Blocks is a JSX-based page builder that round-trips between a visual canvas and JSX source.",
"edit_data_model": "ast",
"edit_ops": "Visual composition serialized to/from JSX.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "JSX source is the model.",
"intent_capture": "unknown",
"upgrade_safety": "Weak.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "Active; pushed_at 2026-08-26T11:37:35Z, 5,091 stars.",
"limitations": "Code-as-truth posture.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-050record 50
{
"id": "P13-R-050",
"repo": "MrXujiang/h5-Dooring",
"category": "schema_bounded_visual_editor",
"source_url": "https://api.github.com/repos/MrXujiang/h5-Dooring",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "h5-Dooring is an H5 page-building platform where pages are composed from a registered component library with schema-driven property panels.",
"edit_data_model": "json_tree",
"edit_ops": "Drag components onto a canvas; edit properties via schema-generated forms; export page JSON.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "Components are registered with a property schema that drives the editing form, so the page JSON only carries declared props.",
"intent_capture": "unknown",
"upgrade_safety": "Moderate; page JSON references components by name.",
"license_observed": "GPL-3.0 per GitHub API license.spdx_id (badge-level). Copyleft — a real constraint for commercial embedding.",
"maintenance_state": "Active; pushed_at 2026-07-20, 9,983 stars.",
"limitations": "Chinese-language-first docs; GPL-3.0; H5/mobile-page oriented.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-051record 51
{
"id": "P13-R-051",
"repo": "ly525/luban-h5",
"category": "schema_bounded_visual_editor",
"source_url": "https://api.github.com/repos/ly525/luban-h5",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Luban H5 is a mobile page builder (Vue) similar in shape to h5-Dooring.",
"edit_data_model": "json_tree",
"edit_ops": "Component drag/drop with property panels.",
"out_of_bounds_representable": "unknown",
"out_of_bounds_why": "Not verified.",
"intent_capture": "unknown",
"upgrade_safety": "unknown",
"license_observed": "GPL-3.0 per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "Slowing; pushed_at 2026-01-03, 6,237 stars.",
"limitations": "GPL-3.0; not architecturally verified.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-052record 52
{
"id": "P13-R-052",
"repo": "brick-design/brick-design",
"category": "schema_bounded_visual_editor",
"source_url": "https://api.github.com/repos/brick-design/brick-design",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "brick-design is a low-code React page builder with a virtual-DOM-based schema.",
"edit_data_model": "json_tree",
"edit_ops": "Component tree composition with property configuration.",
"out_of_bounds_representable": "unknown",
"out_of_bounds_why": "Not verified.",
"intent_capture": "unknown",
"upgrade_safety": "unknown",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "DORMANT: pushed_at 2023-10-30 — nearly 3 years idle as of 2026-08-27, 5,145 stars.",
"limitations": "Dormant; excluded from serious consideration.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-053record 53
{
"id": "P13-R-053",
"repo": "HugoBlox/kit",
"category": "schema_bounded_visual_editor",
"source_url": "https://api.github.com/repos/HugoBlox/kit",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Hugo Blox builds sites by composing pages from a fixed library of 'blocks' configured in YAML front matter rather than by visual editing.",
"edit_data_model": "json_tree",
"edit_ops": "Select a block type and set its declared YAML options.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "A page is a list of blocks each keyed by a known block type with declared options; a block outside the library simply does not render. Config-file editing rather than a visual editor, but the bounding is genuine.",
"intent_capture": "unknown; content is in git so commits carry provenance.",
"upgrade_safety": "Strong in practice: blocks are supplied by an upgradable theme module while user content stays in the consumer's repo — a clean separation of governed capability from user content.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "Active; pushed_at 2026-08-04, 9,652 stars.",
"limitations": "No visual editing loop; Hugo-specific.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-054record 54
{
"id": "P13-R-054",
"repo": "givanz/VvvebJs",
"category": "schema_bounded_visual_editor",
"source_url": "https://api.github.com/repos/givanz/VvvebJs",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "VvvebJs is the standalone drag-and-drop page-builder library underlying Vvveb, with per-component property definitions.",
"edit_data_model": "dom",
"edit_ops": "Drag/drop HTML components; edit component properties from a declared list.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "HTML-document substrate; property lists bound the panel, not the document.",
"intent_capture": "unknown",
"upgrade_safety": "Weak.",
"license_observed": "Apache-2.0 per GitHub API license.spdx_id (badge-level). NOTE: differs from the AGPL-3.0 of the parent Vvveb CMS (P13-R-009) — same author, two different licences, worth knowing before reuse.",
"maintenance_state": "Active; pushed_at 2026-07-01, 8,657 stars.",
"limitations": "DOM substrate.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-055record 55
{
"id": "P13-R-055",
"repo": "dyad-sh/dyad",
"category": "ai_editor",
"source_url": "https://github.com/dyad-sh/dyad/blob/main/LICENSE",
"observed_date": "2026-08-27",
"evidence_class": "first_party_docs",
"claim": "Dyad is a local, open-source AI app builder positioned as a Lovable/v0/Bolt alternative, generating and editing a real codebase on the user's machine.",
"edit_data_model": "ast",
"edit_ops": "AI-driven source generation and editing with a preview; edits land as file changes.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "Source code is the system of record — the unbounded-fallthrough posture. There is no schema that could reject an edit.",
"intent_capture": "Partial by accident of the medium: the user's natural-language prompt IS a statement of intent and is retained in chat history, but it is not bound to the resulting diff as a structured, queryable record.",
"upgrade_safety": "Weak: generated code is owned by the user thereafter, with no governed layer to upgrade.",
"license_observed": "Apache-2.0 WITH a pro carve-out, verified by reading the LICENSE body (GitHub reports NOASSERTION): 'All content that resides under the src/pro/ directory of this repository, if that directory exists, is licensed under the license defined in src/pro/LICENSE. Content outside of the above mentioned directories... is available under the Apache 2 license.' Another open-core split hidden behind a single badge.",
"maintenance_state": "Extremely active; pushed_at 2026-08-27T09:26:34Z, 21,322 stars.",
"limitations": "Third independent instance in this census of the src/pro-style carve-out pattern (with BlockNote's xl-* and Budibase's BSL). Architecturally it is code-as-truth, so it does not solve bounded editing.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-056record 56
{
"id": "P13-R-056",
"repo": "srcbookdev/srcbook",
"category": "ai_editor",
"source_url": "https://api.github.com/repos/srcbookdev/srcbook",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Srcbook is a TypeScript notebook and AI app-builder environment.",
"edit_data_model": "ast",
"edit_ops": "AI-assisted code generation with live execution.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "Code-as-truth.",
"intent_capture": "Prompt history only.",
"upgrade_safety": "Weak.",
"license_observed": "Apache-2.0 per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "Slowing; pushed_at 2026-07-30T15:35:15Z, 3,444 stars.",
"limitations": "Notebook-shaped; not a composition editor.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-057record 57
{
"id": "P13-R-057",
"repo": "stackblitz-labs/bolt.diy",
"category": "ai_editor",
"source_url": "https://api.github.com/repos/stackblitz-labs/bolt.diy",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "bolt.diy is the community open-source version of Bolt.new, running AI full-stack app generation in the browser with WebContainers.",
"edit_data_model": "ast",
"edit_ops": "Prompt-driven file generation and editing with live preview.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "Code-as-truth; the canonical unbounded AI builder.",
"intent_capture": "Prompt history only.",
"upgrade_safety": "Weak.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "STALLING: pushed_at 2026-02-07T14:36:22Z — about 6.5 months idle as of 2026-08-27 despite 19,818 stars. Notable given the category's hype.",
"limitations": "Idle relative to its visibility; pure fallthrough posture.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-058record 58
{
"id": "P13-R-058",
"repo": "nraiden/openv0",
"category": "ai_editor",
"source_url": "https://api.github.com/repos/nraiden/openv0",
"observed_date": "2026-08-27",
"evidence_class": "observed_behavior",
"claim": "openv0 (AI-generated UI components, an open v0 analogue) is effectively dormant.",
"edit_data_model": "ast",
"edit_ops": "AI component generation with iterative refinement.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "Code-as-truth.",
"intent_capture": "Prompt history only.",
"upgrade_safety": "Weak.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level). NOTE: the brief's path raineorshine/openv0 returned HTTP 404; the resolvable repo found by search is nraiden/openv0.",
"maintenance_state": "DORMANT: pushed_at 2024-09-19T02:49:32Z — nearly 2 years idle as of 2026-08-27, 3,951 stars.",
"limitations": "Dormant; recorded to close the brief's list item honestly.",
"disposition": "excluded",
"top10_rank": null,
"top10_rationale": null
}
P13-R-059record 59
{
"id": "P13-R-059",
"repo": "e2b-dev/fragments",
"category": "ai_editor",
"source_url": "https://api.github.com/repos/e2b-dev/fragments",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Fragments is an open-source Claude-Artifacts-style app generator running generated code in E2B sandboxes.",
"edit_data_model": "ast",
"edit_ops": "Prompt-driven generation of a runnable app fragment executed in a sandbox.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "Code-as-truth; the sandbox bounds EXECUTION (a genuine security boundary) but not the shape of the edit.",
"intent_capture": "Prompt history only.",
"upgrade_safety": "Weak.",
"license_observed": "Apache-2.0 per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "Active; pushed_at 2026-08-26T18:40:18Z, 6,370 stars.",
"limitations": "Worth noting the distinction it illustrates: sandboxing bounds blast radius, which is orthogonal to bounding the edit vocabulary. Actionist needs both and they are different mechanisms.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-060record 60
{
"id": "P13-R-060",
"repo": "Nutlope/napkins",
"category": "ai_editor",
"source_url": "https://api.github.com/repos/Nutlope/napkins",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Napkins converts a wireframe/screenshot into a generated app.",
"edit_data_model": "ast",
"edit_ops": "Image-to-code generation.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "Code-as-truth, one-shot generation.",
"intent_capture": "unknown",
"upgrade_safety": "Weak.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "Slowing; pushed_at 2026-06-26T14:13:28Z, 1,477 stars.",
"limitations": "Generation demo rather than an editing loop.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-061record 61
{
"id": "P13-R-061",
"repo": "slab/quill",
"category": "block_document_editor",
"source_url": "https://api.github.com/repos/slab/quill",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Quill is a rich text editor whose document model is Delta — a flat sequence of insert/retain/delete operations with attributes.",
"edit_data_model": "patch",
"edit_ops": "Delta ops: insert, retain, delete, each optionally carrying attributes; deltas compose and invert.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "Deltas can carry arbitrary attributes; formats are configurable but the model does not reject unknown attributes structurally.",
"intent_capture": "Delta is a genuinely elegant change representation — a change and a document are the SAME type, so changes compose, invert and transform natively. No rationale layer.",
"upgrade_safety": "Moderate; flat delta is easy to migrate.",
"license_observed": "BSD-3-Clause per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "Slowing; pushed_at 2025-07-25T06:09:23Z — about 13 months idle as of 2026-08-27, 47,321 stars.",
"limitations": "Flat text model with no block nesting; idle.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-062record 62
{
"id": "P13-R-062",
"repo": "Milkdown/milkdown",
"category": "block_document_editor",
"source_url": "https://api.github.com/repos/Milkdown/milkdown",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Milkdown is a plugin-driven WYSIWYG markdown editor built on ProseMirror and Remark.",
"edit_data_model": "json_tree",
"edit_ops": "ProseMirror transactions; markdown round-trip via Remark.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "Inherits ProseMirror schema enforcement, and additionally the markdown round-trip constrains representable content to what the markdown AST can express — a second, independent narrowing.",
"intent_capture": "Inherits ProseMirror Steps.",
"upgrade_safety": "Strong: markdown as the persisted form is durable and tool-agnostic.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "Active; pushed_at 2026-08-26T15:06:41Z, 11,862 stars.",
"limitations": "Markdown-bounded, so not applicable to component composition.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-063record 63
{
"id": "P13-R-063",
"repo": "tinymce/tinymce",
"category": "block_document_editor",
"source_url": "https://github.com/tinymce/tinymce/blob/develop/LICENSE.md",
"observed_date": "2026-08-27",
"evidence_class": "first_party_docs",
"claim": "TinyMCE is a long-established rich text editor with configurable valid_elements/valid_children schema controls.",
"edit_data_model": "dom",
"edit_ops": "contentEditable DOM manipulation filtered through a configurable element/attribute whitelist.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "Notable historical precedent: valid_elements and valid_children are an explicit whitelist grammar, and content violating it is STRIPPED on set/get. This is filter-on-serialize (like Slate's normalize-after) rather than reject-on-construct (ProseMirror), but it is a genuine, decades-old production example of a declared content whitelist.",
"intent_capture": "unknown",
"upgrade_safety": "Weak: HTML string persistence.",
"license_observed": "GPL-2.0-or-later — read LICENSE body via GitHub API (GitHub reports NOASSERTION): 'Copyright (c) 2024, Ephox Corporation DBA Tiny Technologies, Inc. Licensed under the terms of GNU General Public License Version 2 or later.' Despite TinyMCE's ubiquity in commercial products, the OSS licence is copyleft; commercial use typically runs through Tiny's paid licence.",
"maintenance_state": "Active; pushed_at 2026-08-17T01:15:12Z, 16,282 stars.",
"limitations": "GPL-2.0-or-later is a significant constraint; DOM/HTML substrate.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-064record 64
{
"id": "P13-R-064",
"repo": "basecamp/trix",
"category": "block_document_editor",
"source_url": "https://api.github.com/repos/basecamp/trix",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Trix is a rich text editor that maintains its own internal document model rather than relying on contentEditable state, explicitly to avoid HTML unpredictability.",
"edit_data_model": "json_tree",
"edit_ops": "Operations against an internal document model, rendered to HTML.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "Trix's design premise is that the editor owns a constrained internal model and the DOM is merely a projection — so states not expressible in that model cannot be produced through the editor.",
"intent_capture": "unknown",
"upgrade_safety": "Moderate.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "Active; pushed_at 2026-08-21T10:40:31Z, 20,004 stars.",
"limitations": "Deliberately limited feature surface; text-document oriented.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-065record 65
{
"id": "P13-R-065",
"repo": "nhn/tui.editor",
"category": "block_document_editor",
"source_url": "https://api.github.com/repos/nhn/tui.editor",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "TOAST UI Editor is a markdown/WYSIWYG dual-mode editor.",
"edit_data_model": "json_tree",
"edit_ops": "Markdown and WYSIWYG editing over a ProseMirror-based core.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "Markdown round-trip plus ProseMirror core constrain representable content.",
"intent_capture": "unknown",
"upgrade_safety": "Strong via markdown persistence.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "DORMANT: pushed_at 2024-08-01T15:38:05Z — 2 years idle as of 2026-08-27, 18,014 stars.",
"limitations": "Dormant despite high stars — a clear case where star count is a lagging indicator.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-066record 66
{
"id": "P13-R-066",
"repo": "wangeditor-team/wangEditor",
"category": "block_document_editor",
"source_url": "https://api.github.com/repos/wangeditor-team/wangEditor",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "wangEditor is a Slate-based rich text editor popular in the Chinese ecosystem.",
"edit_data_model": "json_tree",
"edit_ops": "Slate operations.",
"out_of_bounds_representable": true,
"out_of_bounds_why": "Slate-based; normalize-after.",
"intent_capture": "unknown",
"upgrade_safety": "Weak.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "DORMANT: pushed_at 2024-10-11T07:11:30Z — nearly 2 years idle, 18,364 stars.",
"limitations": "Dormant.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-067record 67
{
"id": "P13-R-067",
"repo": "system-ui/theme-ui",
"category": "design_token_theme_editor",
"source_url": "https://api.github.com/repos/system-ui/theme-ui",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "Theme UI implements the System UI theme specification: components consume constrained scales (space, fontSizes, colors) by index/key rather than by raw value.",
"edit_data_model": "json_tree",
"edit_ops": "Theme object edits; style props resolve against theme scales.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "Style values are looked up in declared theme scales, so a spacing or colour outside the scale is not addressable through the idiomatic API — constraint by indirection, the same principle as tweakcn and Style Dictionary.",
"intent_capture": "Semantic scale keys carry design intent.",
"upgrade_safety": "Strong via the name/value indirection.",
"license_observed": "MIT per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "Slowing; pushed_at 2026-06-14T11:55:43Z, 5,397 stars.",
"limitations": "Raw CSS escape hatches remain available; React-specific.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-068record 68
{
"id": "P13-R-068",
"repo": "design-tokens/community-group",
"category": "design_token_theme_editor",
"source_url": "https://api.github.com/repos/design-tokens/community-group",
"observed_date": "2026-08-27",
"evidence_class": "secondary",
"claim": "The W3C Design Tokens Community Group maintains the DTCG format specification — a standard JSON interchange format for design tokens with typed values and aliasing.",
"edit_data_model": "json_tree",
"edit_ops": "n/a — a specification, not a tool. Defines $value, $type, and alias references.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "The spec defines a closed set of token $types with typed value shapes, so a conformant document cannot express an untyped or malformed token.",
"intent_capture": "The spec includes a $description field per token and first-class aliasing — a standardised, machine-readable slot for stating what a token MEANS. This is the nearest thing in the census to a standardised intent field, albeit only for tokens.",
"upgrade_safety": "Strong: a vendor-neutral interchange format decouples token authorship from consumption.",
"license_observed": "NOASSERTION per GitHub API — W3C Community Group deliverables are typically under the W3C Community Contributor Licensing Agreement rather than a standard OSS licence. Body not read; treat as UNVERIFIED and check before relying on it.",
"maintenance_state": "Active; pushed_at 2026-08-09T20:02:01Z, 2,103 stars.",
"limitations": "Specification only. Relevant to Actionist as the standard target format for the theme/token edit class.",
"disposition": "census",
"top10_rank": null,
"top10_rationale": null
}
P13-R-069record 69
{
"id": "P13-R-069",
"repo": "salesforce-ux/theo",
"category": "design_token_theme_editor",
"source_url": "https://api.github.com/repos/salesforce-ux/theo",
"observed_date": "2026-08-27",
"evidence_class": "observed_behavior",
"claim": "Theo, Salesforce's design-token transformation tool and a predecessor to Style Dictionary, is ARCHIVED.",
"edit_data_model": "json_tree",
"edit_ops": "Token transformation to platform formats.",
"out_of_bounds_representable": false,
"out_of_bounds_why": "Token-vocabulary bounded, but superseded.",
"intent_capture": "unknown",
"upgrade_safety": "n/a",
"license_observed": "BSD-3-Clause per GitHub API license.spdx_id (badge-level).",
"maintenance_state": "ARCHIVED: archived=true, pushed_at 2025-06-09T11:02:03Z, 1,989 stars. Superseded by Style Dictionary and DTCG.",
"limitations": "Historical only.",
"disposition": "excluded",
"top10_rank": null,
"top10_rationale": null
}
P13-R-070record 70
{
"id": "P13-R-070",
"repo": "opendesigndev/octopus",
"category": "design_file_interchange",
"source_url": "https://api.github.com/repos/opendesigndev/octopus",
"observed_date": "2026-08-27",
"evidence_class": "observed_behavior",
"claim": "The Octopus format spec remains a coherent, permissively licensed reference for design-file interchange, but it is dormant and was never adopted beyond its origin org, so it is worth reading as prior art on normalising design documents and NOT worth adopting as a live dependency.",
"edit_data_model": "json_tree",
"edit_ops": "n/a — an interchange format plus converters from Figma/Sketch/XD/Illustrator into a normalised document model.",
"out_of_bounds_representable": "unknown",
"out_of_bounds_why": "A normalised interchange schema constrains representable documents by construction, but the format targets static design documents rather than editable component compositions, so the bounding is not applicable to Actionist's edit classes.",
"intent_capture": "unknown",
"upgrade_safety": "n/a",
"license_observed": "Apache-2.0 per GitHub API license.spdx_id for opendesigndev/octopus (badge-level).",
"maintenance_state": "DORMANT, independently confirmed: opendesigndev/octopus pushed_at 2024-07-16T12:56:41Z (8 stars) and opendesigndev/open-design-engine pushed_at 2023-07-13T08:13:59Z (8 stars). Both consistent with the wave-1 finding of no 2025-2026 activity. Not re-derived beyond these two metadata calls per the brief.",
"limitations": "Very low adoption (8 stars each) alongside dormancy means the spec's value is purely as reading material on design-document normalisation.",
"disposition": "excluded",
"top10_rank": null,
"top10_rationale": null
}