Actionist Block Runtime
Four Claude lanes · first-principles framework synthesis · 27 Aug 2026
Architecture synthesis

One data plane.
Many governed blocks.

How Actionist can compose mature repositories, connectors, workflows, UI components, and industry logic into one client system without turning the database into shared mutable chaos.

The answer is not a single framework to install. It is a Postgres-centred block runtime built from established engineering disciplines: bounded contexts, microkernel plugins, ports and adapters, typed commands, stable read models, outbox events, and capability-based security.
4Claude conversations folded in
110Lovable feature surfaces itemized
1,445OpenConnector providers
4,140+Jentic OpenAPI vendor specs

What the four Claude lanes actually established

This is reconstructed from the agents' full conversation JSONLs, not merely their closing callbacks.

Connector lane · done

The connector moat is mostly catalog import

  • OpenConnector supplies 1,445 Apache-2.0 providers and a functioning OAuth/credential engine.
  • The live spike encrypted a credential, made an authenticated GitHub call, and generated Google OAuth consent.
  • Activepieces supplies mature connector and connect-account UI patterns.
  • Jentic supplies roughly 4,140 CC0 OpenAPI vendor definitions.
  • The missing Actionist layer is tenant isolation, authority, secret references, and receipts.
Lovable lane · done

Actionist is not general-purpose Lovable

  • 110 Lovable features were itemized; the narrower Actionist scope removes 19 platform responsibilities.
  • chef, sandboxd, Astryx, and Grist supplied the strongest subsystem precedents.
  • The unsolved problem is safe agent-driven construction over platform-owned Postgres.
  • TypeScript wins v1 because the liftable ecosystem is TypeScript; Rust is a later measured rewrite.
  • The first execution gate should be a two-tenant fixture with cross-tenant leakage forcing NO_SHIP.
Heavy shelf · persisted

The mature product tier was initially missed

  • Twenty demonstrates metadata-defined objects and fields.
  • NocoBase demonstrates plugin-composed business applications.
  • Cal.com demonstrates package/app separation and an installable integration registry.
  • NocoDB, Teable, Directus, and Supabase demonstrate database introspection.
  • ERPNext, Chatwoot, Plane, Formbricks, Documenso, and others supply real workflow and data-model precedents.
UI lane · active

Client taste is an active-preference-learning problem

  • Learn seven mechanical knobs: contrast, radius, shadow, border, typography, density, and chroma.
  • Learn in knob space rather than memorizing a favorite pack.
  • sequential-gallery demonstrates Bayesian sequential gallery selection.
  • choix supplies Bradley–Terry/Luce choice modelling.
  • Four alternatives plus a “none/re-roll” outside option avoids forced-choice pollution.

Open the public taste-picker demo →

The scientific and engineering frameworks

There is no credible “universal SaaS repository framework.” There is, however, a well-understood combination of frameworks that solves each fundamental constraint.

Bounded contexts

Domain-driven design says each business capability owns its data, language, invariants, and state transitions.

Microkernel

A small stable kernel loads independently versioned plugins. NocoBase and Cal.com demonstrate this shape.

Ports and adapters

Hexagonal architecture keeps imported code behind declared command, event, query, UI, file, and secret ports.

Selective CQRS

Typed commands perform writes. Stable read models serve cross-block reads. Full event sourcing is unnecessary.

Transactional outbox

A state change and its emitted event commit in one transaction, preventing silent divergence between blocks.

Capability security

Agents receive narrowly scoped abilities rather than ambient SQL, secret, or tenant authority.

Metadata-driven systems

Twenty, NocoBase, Directus, and Teable show how objects, fields, relations, views, and actions can become structured data.

Schema compatibility

Every block declares versions, migrations, dependencies, rollback, host compatibility, and evidence receipts.

Deterministic admission

Models propose composition; a non-model solver decides whether the graph is legal, secure, compatible, and recoverable.

The Actionist Block Runtime

The framework produced by those principles is a TypeScript/Postgres runtime where AI composes capabilities through contracts rather than improvising across source code and tables.

                    ACTIONIST COMPOSER
          client intent → capability graph → app plan
                              │
                    deterministic validation
                              │
        ┌─────────────────────┼─────────────────────┐
        │                     │                     │
     CRM Block           Finance Block        Support Block
        │                     │                     │
   commands/events       commands/events       commands/events
        │                     │                     │
        └────────────── Actionist Kernel ──────────┘
                              │
            tenancy · authority · jobs · receipts
             events · migrations · files · secrets
                              │
                          PostgreSQL
PostgreSQL is the shared data plane. The Block Contract is the interoperability framework.

How the shared database should work

Shared infrastructure does not mean shared mutable internals.

Kernel-owned primitives

core.tenants
core.users
core.actors
core.memberships
core.roles
core.capabilities

core.block_definitions
core.block_installations
core.block_versions
core.migrations

core.commands
core.events
core.jobs
core.receipts
core.audit_log
core.idempotency_keys

core.files
core.secret_references
core.external_accounts

Block-owned typed schemas

crm.contacts
crm.companies
crm.deals

finance.invoices
finance.payments
finance.ledger_entries

support.tickets
support.messages
support.sla_policies

Every tenant-owned row carries tenant_id. RLS comes from kernel-owned policy templates and cannot be widened by the composing agent.

Avoid the universal EAV trap. Do not force every business concept into generic entities, attributes, and relationships. Use metadata for extensibility; retain typed tables and code for financial invariants, permissions, state machines, and destructive actions.

Five port families

PortPurposeExample
CommandRequest a controlled state changefinance.issue_invoice
EventPublish a fact that already happenedcrm.deal.won
QueryExpose a stable read modelcrm.customer_summary
UIContribute pages, forms, cards, and panelssupport.ticket_panel
ResourceControl files, secrets, and external accountsconnector.gmail.account

Cross-block direct writes are prohibited. Cross-block reads use declared projections or views. A CRM block asks Finance to issue an invoice; it never inserts directly into finance.invoices.

Three ways to integrate external code

Mode 1

Native block

Adapt a bounded capability into the shared runtime. It owns a namespaced Postgres schema and Actionist ports.

Best for contacts, invoices, approvals, extraction, SLA rules, and other clean capabilities.

Mode 2

Wrapped service

The heavyweight product retains its runtime and database. An anti-corruption adapter exposes Actionist commands, events, and projections.

Best for ERPNext-, Chatwoot-, or other product-sized systems that should not be dissolved into shared tables.

Mode 3

UI / pattern block

Reuse only a surface, token pack, interaction pattern, schema idea, or generated specification. It owns no business data.

Best for 21st.dev UI, design packs, login forms, and study-only repositories.

The full packaging vocabulary should preserve: native_block, wrapped_service, generated_from_pattern, ui_only, and reference_only.

The Block Contract

The agent composes manifests and capabilities—not arbitrary source code.

{
  "id": "actionist.crm.contacts",
  "version": "1.0.0",
  "packaging_mode": "native_block",
  "database": {
    "schema": "crm",
    "migrations": []
  },
  "commands": [],
  "events": [],
  "queries": [],
  "ui_surfaces": [],
  "required_capabilities": [],
  "provided_capabilities": [],
  "dependencies": [],
  "permissions": [],
  "tenant_policy": "strict_tenant_v1",
  "rights": {},
  "evaluation": {},
  "rollback": {}
}

Before a repository becomes a block it needs pinned identity, packaging mode, typed ports, tenant policy, rights/provenance state, migrations, negative tests, receipts, rollback, and admission.

How a client app gets composed

Example request: “Leads arrive, get enriched, assigned, followed up, and invoiced after closing.”

Elicit. Capture industry, jobs, data ownership, authority, and visual preferences.
Atomize. Convert the request into lead intake, enrichment, assignment, messaging, pipeline, invoicing, and approval capabilities.
Resolve. Find admitted native blocks and wrapped services that provide those capabilities.
Plan. Generate a dependency and port graph before generating implementation code.
Validate deterministically. Check schemas, permissions, tenancy, dependencies, migrations, rights, cost, rollback, and negative paths.
Fill bounded gaps. Allow agents to configure blocks and generate narrowly scoped adapters or UI.
Evaluate. Run functional, authority, cost, recovery, and two-tenant isolation fixtures.
Admit or reject. Promote only when receipts prove every required gate.

The actual moat: authority-safe construction

The hard problem is not generating code. It is allowing an agent to build over client data while making it structurally incapable of widening access.

Agent MAY:
  invoke admitted commands
  configure allowed fields and views
  request constrained migrations
  compose declared UI surfaces

Agent MAY NOT:
  execute arbitrary production SQL
  author or weaken RLS
  grant itself capabilities
  read another tenant
  expose a new query without review
  directly access raw secrets

Schema changes use a constrained migration language. Tenant policies come from kernel-owned templates. A cross_tenant_leakage result forces NO_SHIP, regardless of every other score.

What Actionist v1 should actually use

Own this

  • A small TypeScript/Postgres kernel.
  • The Block Contract and registry.
  • Tenant policy and capability enforcement.
  • Commands, outbox events, jobs, receipts, and rollback.
  • The deterministic composition and admission solver.

Borrow these patterns

  • NocoBase for plugin composition.
  • Twenty for metadata-defined objects.
  • Cal.com for plugin/app registry structure.
  • Directus, NocoDB, and Teable for DB introspection.
  • Activepieces and OpenConnector for integrations.
  • Grist for the first synthetic data fixture.
  • DTCG for token interchange.
  • Choix/sequential-gallery for preference elicitation.
Do not fork one giant platform and rename it Actionist. Build a small kernel; adapt mature products through explicit packaging modes and contracts.

The decision to make before code

Agree the Block Contract: data ownership, commands, events, read models, authority, tenancy, migrations, rollback, packaging mode, rights, and admission evidence. Once that protocol is stable, the database host, ORM, UI framework, and imported repositories remain replaceable.