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.
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.
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.
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
Port
Purpose
Example
Command
Request a controlled state change
finance.issue_invoice
Event
Publish a fact that already happened
crm.deal.won
Query
Expose a stable read model
crm.customer_summary
UI
Contribute pages, forms, cards, and panels
support.ticket_panel
Resource
Control files, secrets, and external accounts
connector.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.
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.
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.