ObjectStackObjectStack

Solution Blueprint

Solution Blueprint protocol schemas

Solution Blueprint Schema (ADR-0033 §4 — plan-first authoring)

The structured-output target an AI agent emits for a high-level goal

("build me a project-management system") instead of transcribing a field

list. It is a simplified proposal shape — deliberately lighter than the

full ObjectSchema / ViewSchema / DashboardSchema.

The apply_blueprint tool expands each entry into a proper metadata body

and stages it as a draft (so the per-type Zod schema still validates the

real artifact at write time).

The blueprint is never persisted on its own: the agent presents it for

conversational confirmation/edit (cheap), and only on human approval does it

batch-draft. This is the safety valve for low-specificity input.

Source: packages/spec/src/ai/solution-blueprint.zod.ts

TypeScript Usage

import { BlueprintApp, BlueprintDashboard, BlueprintField, BlueprintNavItem, BlueprintObject, BlueprintSeed, BlueprintView, BlueprintWidgetCondition, SolutionBlueprint, SolutionBlueprintStrict } from '@objectstack/spec/ai';
import type { BlueprintApp, BlueprintDashboard, BlueprintField, BlueprintNavItem, BlueprintObject, BlueprintSeed, BlueprintView, BlueprintWidgetCondition, SolutionBlueprint, SolutionBlueprintStrict } from '@objectstack/spec/ai';

// Validate data
const result = BlueprintApp.parse(data);

BlueprintApp

Properties

PropertyTypeRequiredDescription
namestringApp machine name (snake_case)
labelstringoptionalApp display label
iconstringoptionalLucide icon for the App Launcher
navObject[]optionalNavigation entries; omit to auto-surface every created object and dashboard

BlueprintDashboard

Properties

PropertyTypeRequiredDescription
namestringDashboard machine name (snake_case)
labelstringoptionalHuman-readable dashboard label
widgetsObject[]optionalWidgets to place on the dashboard

BlueprintField

Properties

PropertyTypeRequiredDescription
namestringField machine name (snake_case)
labelstringoptionalHuman-readable field label
typeEnum<'text' | 'textarea' | 'email' | 'url' | 'phone' | 'password' | 'secret' | 'markdown' | 'html' | 'richtext' | 'number' | 'currency' | 'percent' | 'date' | 'datetime' | 'time' | 'boolean' | 'toggle' | 'select' | 'multiselect' | 'radio' | 'checkboxes' | 'lookup' | 'master_detail' | 'tree' | 'user' | 'image' | 'file' | 'avatar' | 'video' | 'audio' | 'formula' | 'summary' | 'autonumber' | 'composite' | 'repeater' | 'record' | 'location' | 'address' | 'code' | 'json' | 'color' | 'rating' | 'slider' | 'signature' | 'qrcode' | 'progress' | 'tags' | 'vector'>Field data type
requiredbooleanoptionalWhether the field is required
referencestringoptionalTarget object name for lookup / master_detail relationship fields
optionsObject[]optionalChoices for select / multiselect / radio fields

BlueprintNavItem

Properties

PropertyTypeRequiredDescription
typeEnum<'object' | 'dashboard'>What this nav entry opens
targetstringObject or dashboard machine name to surface (snake_case)
labelstringoptionalNav entry label (defaults to the target label/name)
iconstringoptionalLucide icon name for the nav entry

BlueprintObject

Properties

PropertyTypeRequiredDescription
namestringObject machine name (snake_case)
labelstringoptionalHuman-readable singular label
descriptionstringoptionalWhat this object represents
fieldsObject[]Fields to create on the object
nameFieldstringoptionalThe record title field — which field holds the human-readable name shown on cards, lookup chips, breadcrumbs and search (ADR-0079). Set it to the object's text label field (e.g. "product_name"). For a numbered entity (invoice/ticket), set it to a formula field that composes number + name (e.g. "{order_no} · {customer}"). Omitting it lets the platform auto-pick a text field, but declaring it is strongly preferred.

BlueprintSeed

Properties

PropertyTypeRequiredDescription
objectstringTarget object name (snake_case)
recordsRecord<string, any>[]Rows to seed

BlueprintView

Properties

PropertyTypeRequiredDescription
objectstringObject this view displays (snake_case)
namestringView machine name (snake_case)
labelstringoptionalHuman-readable view label
typeEnum<'list' | 'form' | 'kanban' | 'calendar' | 'gallery' | 'gantt'>View kind. Pick the surface that fits the data: "gallery" for a visual card/cover browse when the user asks for a 画廊/相册/卡片墙/封面/海报/图集 (a gallery / card wall / cover / poster grid) or the object has an image/avatar/file field worth showing as a card cover; "gantt" for a 甘特图/时间线/排期 (timeline / schedule) when the object has BOTH a start and an end date field; "kanban" for a board grouped by a status/select field; "calendar" for a single-date schedule; "form" for a record editor; else "list".
columnsstring[]optionalField names shown as columns (in order). For a gallery, INCLUDE the image/avatar/file field (it becomes the card cover); for a gantt, INCLUDE the start date column before the end date column.
groupBystringoptionalREQUIRED for kanban views: the select/status field whose options become the board columns (e.g. "stage", "status"). Without it a kanban renders as a plain list. Optional for gantt (groups leaf tasks into summary rows).

BlueprintWidgetCondition

Properties

PropertyTypeRequiredDescription
fieldstringField on the widget object to filter by (e.g. "stock_quantity", "status")
opEnum<'lt' | 'lte' | 'gt' | 'gte' | 'eq' | 'ne'>Comparison operator
valuenumber | string | booleanComparison value (e.g. 10, "open")

SolutionBlueprint

Properties

PropertyTypeRequiredDescription
summarystringOne-line description of the proposed solution
assumptionsstring[]Design assumptions made from the underspecified goal
questionsstring[]optionalAt most 1-2 structure-deciding questions to confirm before building
objectsObject[]Objects (tables) to create
viewsObject[]optionalViews to create
dashboardsObject[]optionalDashboards to create
appObjectoptionalThe navigation shell (app) that surfaces the created objects/dashboards to end users
seedDataObject[]optionalSuggested seed data (reported, not auto-applied in Phase C)

SolutionBlueprintStrict

Properties

PropertyTypeRequiredDescription
summarystringOne-line description of the proposed solution
assumptionsstring[]Design assumptions made from the underspecified goal
questionsstring[] | nullAt most 1-2 structure-deciding questions to confirm before building, or null
objectsObject[]Objects (tables) to create
viewsObject[] | nullViews to create, or null
dashboardsObject[] | nullDashboards to create, or null
appObject | nullThe navigation shell (app) that surfaces the created objects/dashboards, or null

On this page