Every change Wellknown observed on this MCP server, newest first, with what it was before and what it became. Tool-surface changes carry the definition diff. Nothing here is edited after the fact.
Changed the definition of "create_project", "get_schema_reference" and "update_schema"
⟨90 unchanged words⟩ FIELDS (DON'T define): id, created_at, updated_at, row_version 4. USERS: NEVER create users/customers/employees tables with ⟨122 unchanged words⟩
⟨62 unchanged words⟩ derived from other columns), __constraints__ (composite uniqueness, checked at commit when deferrable), __audit__ (append-only audit log), __admin_write__ ⟨6 unchanged words⟩ user foreign keys are attributed on create,andreading many rows in one request with <field>__in=a,b,c (the values separated by commas only), deleting the rows a filter names with expected_count, and writes that state the row_version they read (If-Match on a route, if_version in a batch).
⟨93 unchanged words⟩ " • DON'T define: id, created_at, updated_at, row_version • NEVER create users/customers/employees tables (use app_users) ⟨85 unchanged words⟩
Changed the definition of "create_project", "get_schema_reference" and "update_schema"
⟨90 unchanged words⟩ FIELDS (DON'T define): id, created_at, updated_at, row_version 4. USERS: NEVER create users/customers/employees tables with ⟨122 unchanged words⟩
⟨62 unchanged words⟩ derived from other columns), __constraints__ (composite uniqueness, checked at commit when deferrable), __audit__ (append-only audit log), __admin_write__ ⟨6 unchanged words⟩ user foreign keys are attributed on create,andreading many rows in one request with <field>__in=a,b,c (the values separated by commas only
Added "delete_module", "deploy_destructive", "deploy_module" and 11 more; changed the definition of "bulk_create_graph_nodes", "bulk_create_graph_relationships", "create_graph_node" and 18 more (50 tools before, 64 now)
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
Added "delete_module", "deploy_destructive", "deploy_module" and 11 more; changed the definition of "bulk_create_graph_nodes", "bulk_create_graph_relationships", "create_graph_node" and 18 more (50 tools before, 64 now)
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
Added "patch_schema"; changed the definition of "get_schema" and "update_schema" (49 tools before, 50 now)
⟨113 unchanged words⟩ null when no deployed schema is on record. A LARGE SCHEMA: pass tables or fields to read only the part you are about to change — the answer's 'version' is the whole schema's either way, so a slice is enough to patch it with patch_schema(expected_version=...).
{"properties":{"fields":{"description":"Read only these fields, each written 'table.field' (e.g. [\"parameters.is_clock\"]); their table's own keys come with them.","items":{"type":"string"},"type":"array"},"project_id":{"description":"Project ID (UUID)","type":"string"},"tables":{"description":"Read only these tables, whole (e.g. [\"parameters\"]). A table the schema does not hold is refused.","items":{"type":"string"},"type":"array"}},"required":["project_id"],"type":"object"}
Added "patch_schema"; changed the definition of "get_schema" and "update_schema" (49 tools before, 50 now)
⟨113 unchanged words⟩ null when no deployed schema is on record. A LARGE SCHEMA: pass tables or fields to read only the part you are about to change — the answer's 'version' is the whole schema's either way, so a slice is enough to patch it with patch_schema(expected_version=...).
{"properties":{"fields":{"description":"Read only these fields, each written 'table.field' (e.g. [\"parameters.is_clock\"]); their table's own keys come with them.","items":{"type":"string"},"type":"array"},"project_id":{"description":"Project ID (UUID)","type":"string"},"tables":{"description":"Read only these tables, whole (e.g. [\"parameters\"]). A table the schema does not hold is refused.","items":{"type":"string"},"type":"array"}},"required":["project_id"],"type":"object"}
Changed the definition of "get_schema_reference"
⟨73 unchanged words⟩ __admin_write__ (a table only admins write),andhow user foreign keys are attributed oncreate.create, and reading many rows in one request with <field>__in=a,b,c (the values separated by commas only).
Changed the definition of "get_schema_reference"
⟨73 unchanged words⟩ __admin_write__ (a table only admins write),andhow user foreign keys are attributed oncreate.create, and reading many rows in one request with <field>__in=a,b,c (the values separated by commas only).
Added "list_project_jobs" (48 tools before, 49 now)
List Project Jobs — List a project's jobs, newest first: every create, deploy, promotion, rollback, resource change and module operation, each with its status, error, failure_side and when it started and ended. A job's record is kept for the life of the project, so this is how to find out what an operation did when you no longer have its job_id (after an interruption, or in a later session): the first job of the job_type you want is the latest. Read older jobs a page at a time with offset; a page shorter than limit is the last.
Added "list_project_jobs" (48 tools before, 49 now)
List Project Jobs — List a project's jobs, newest first: every create, deploy, promotion, rollback, resource change and module operation, each with its status, error, failure_side and when it started and ended. A job's record is kept for the life of the project, so this is how to find out what an operation did when you no longer have its job_id (after an interruption, or in a later session): the first job of the job_type you want is the latest. Read older jobs a page at a time with offset; a page shorter than limit is the last.
Changed the definition of "get_job_status"
⟨55 unchanged words⟩ 15 minutes. If status is 'failed', readerror first:failure_sideanand errorthat:starts'customer'withmeans'RationalBlokstheplatformproject'serror'inputfailedisinside
Changed the definition of "get_job_status"
⟨55 unchanged words⟩ 15 minutes. If status is 'failed', readerror first:failure_sideanand errorthat:starts'customer'withmeans'RationalBlokstheplatformproject'serror'inputfailedisinside
Changed the definition of "update_schema"
⟨20 unchanged words⟩ format (no 'fields' nesting) • string:MUSTmax_lengthhave(defaultmax_length255) • decimal:MUST haveprecision + scale (default 10, 2) • Use "datetime" NOT "timestamp" • ⟨134 unchanged words⟩
Changed the definition of "create_graph_project", "create_project", "delete_graph_project" and 11 more
⟨256 unchanged words⟩ use get_job_status with returned job_id to monitor deployment. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
⟨301 unchanged words⟩ use get_job_status with returned job_id to monitor deployment. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
Changed the definition of "create_graph_project", "create_project", "delete_graph_project" and 10 more
⟨256 unchanged words⟩ use get_job_status with returned job_id to monitor deployment. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
⟨301 unchanged words⟩ use get_job_status with returned job_id to monitor deployment. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
Certificate recorded, valid to 2026-12-10
Authorization not required
Certificate recorded, valid to 2026-12-10
Authorization not required
First tool surface recorded: 48 tools (server version 0.13.0)
https://mcp.rationalbloks.com (mcp_streamable_http) — from mcp_registry
Changed the definition of "create_graph_project", "create_project", "deploy_graph_production" and 7 more
⟨46 unchanged words⟩ id here.","type":"string"},"description":{"description":"Optional project description","type":"string"},"name":{"description":"Project name","type ⟨25 unchanged words⟩
⟨104 unchanged words⟩ tables with email/password ✅ USE built-in app_users tableExample: { "employee_profiles": { "user_id": ⟨17 unchanged words⟩ to enable "only see your own data"
Changed the definition of "get_project_info"
⟨67 unchanged words⟩ This is almost always a schema format issue. RETURNS THE LIVE API URL: staging.url and production.url carry the deployed base URL for each environment (append /docs for the interactive OpenAPI docs); github.url is the generated repository. create_project does NOT return a URL, so this is the tool to call once get_job_status reports the deployment finished.
First tool surface recorded: 48 tools (server version 0.11.0)
Showing the latest 24 events. The API returns up to 500 and filters by kind: ?kind=tool_surface_changed
⟨93 unchanged words⟩ " • DON'T define: id, created_at, updated_at, row_version • NEVER create users/customers/employees tables (use app_users) ⟨85 unchanged words⟩
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
⟨88 unchanged words⟩ ONE_TO_ONE, ONE_TO_MANY, MANY_TO_ONE, MANY_TO_MANY HIERARCHICAL NODES:Nestentities inside parent entities to createnesttypeanhierarchies. Childentityentitiesinsideinheritits parentlabels automatically. Example: { "nodes":entity{ "Animal":(beside{"description": "Base animal entity","flat_labels":and["LivingThing"], "schema": { "name": {"type":)"string",to"required":createtrue}, "habitat":a{"type":"string"} }, "Dog": { "description":hierarchy;"Athedogchild(inheritsAnimalthelabels)", "flat_labels":parent's["Pet"], "schema"labels:{"breedAnimal": {"typedescription": "string...", "required": true}, "trainedschema": {"type": "boolean"} } } }...},"relationships":{"OWNSDog": {"fromdescription": "Person...","to":"Animal", "cardinalityschema":"ONE_TO_MANY"{...}}} RULES: 1. "nodes" key is REQUIRED ⟨55 unchanged words⟩ (id, created_at, updated_at) are NOT needed8. Use get_graph_template_schemas FIRST to see valid examplesWORKFLOW: 1.Useget_graph_template_schemas FIRST to see valid examples 2.Createcreate_graph_projectschemawithfollowingathecluster_idrulesfromabovelist_clusters 3.Call this tool 4. Monitor with get_job_status (2-5 min deployment) After creation, usePoll get_job_status with the returned job_idto monitor(2-5deployment.minutes) While RationalBloks is being updated, the call ⟨14 unchanged words⟩
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
Create a new RationalBloks project (a PostgreSQL REST API) from a JSONschema.schema, on one of your resource pools. ⚠️ CRITICAL RULES - READ BEFORE CREATING SCHEMA: 1. FLAT FORMAT (REQUIRED): ✅ CORRECT: {users"orders": {stringdecimal",max_length"precision":25510, "scale": 2}}} ❌ WRONG: {users"orders": {"fieldstype: "string"}...}}}DONOT— never nest under 'fields'key!2.FIELDEVERYTYPEfieldREQUIREMENTShas a "type":•string:(MUST have"max_length" (e.g.),max_length:text,255) •integer, decimal:MUST have "precision" and "scale"(e.g.,precision: 10, scale: 2)•,datetime:boolean,Useuuid,"date, datetime"(NOT "timestamp"•),ALLjson,fieldsand the PostgreSQL arrays uuid_array, integer_array, text_array, float_array (GIN-indexed:MUST@>havecontains,"type"<@propertycontained_by, && overlaps) 3. AUTOMATIC FIELDS (DON'T define):•id(uuid,primary key) •created_at(datetime) •, updated_at(datetime)4.USER AUTHENTICATIONUSERS:❌NEVER create"users", "customers", "employees"users/customers/employees tables withemail/password ✅emailUSEorbuilt-inpassword. Link to the built-in app_users tableExample:{ "employee_profiles":{"user_id": {type:"uuidtype", foreign_key: "app_users.iduuid",required: true},"departmentforeign_key":{type:"stringapp_users.id", max_length: 100}}} 5. AUTHORIZATION: Add user_id → app_users.id to enable."onlyAseetableyourwithownsuchdata" Example:a{ "orders": { "user_id": {type: "uuid",fieldforeign_key:is"app_users.id"}, "total"owner-scoped:{type:each"decimal",userprecision:sees10,theirscale:own2} } }rows.6.5. FIELD OPTIONS:•required: true/false •, unique: true/false •, default: any value •, enum: ["val1","val2"] •foreign_key:("table.id"AVAILABLE TYPES: string, text, integer),decimal,on_deleteboolean(cascade,uuidset_null,daterestrict,datetimeno_action),jsonnullable,uuid_arrayindex,integer_arraydescription,text_arraywrite_only,float_array Array types store PostgreSQL native arrays with automatic GIN indexing:computed.• uuid_array: UUID[] — for sets ofAdvancedreferencesfeatures (e.g., tensor coordinates) • integer_array: BIGINT[] — for dimension indices, integer sets • text_array: TEXT[] — for tags, categories__policy__,label sets • float_array: DOUBLE PRECISION[] — for weightcomputedvectorscolumns,scores GIN-indexed operators: @> (contains)__constraints__,<@ (contained_by__audit__), &&:(overlaps)get_schema_reference. BACKEND ENGINE: •python(defaultbackend_type):FastAPI backend —"python"mature(FastAPI,full-featured •default) or "rust:" (Axumbackend —: faster cold starts, lower memory, high performance). WORKFLOW: 1.Useget_template_schemas FIRST to see valid examples 2.Createcreate_projectschemawithfollowingaALLcluster_idrulesfromabovelist_clusters 3.Call this tool (optionally choose backend_type: "python"Pollorget_job_status"rust") 4.withMonitorthewithreturnedget_job_statusjob_id (2-5min deploymentminutes)After creation, use get_job_status with4.returnedget_project_infojob_idgivestothemonitorlivedeployment.URL While RationalBloks is being updated, the call ⟨14 unchanged words⟩
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
⟨13 unchanged words⟩ own credentials and database. Requires paid plan. Adeployplan that drops data is refused,untilnamingyoueverypasstable,confirm_destructive=truefield,afterentityreviewingortherelationshipplan.it would drop, and every field whose type change rounds or cuts its values (a decimal with a smaller scale or turned integer, a datetime turned date): deploy_destructive applies it, a tool of its own so a client asks before it runs. One operation runs on a project at a ⟨44 unchanged words⟩
{"properties":{"confirm_destructive":{"description":"Set true only after reviewing the plan: a deploy that drops tables, columns, entities, relationships or fields is refused without it","type":"boolean"},"project_id":{"description":"Project ID (UUID) ⟨6 unchanged words⟩
{"destructiveHint":truefalse,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
Deploy a graphprojectproject's saved schema to the staging environment. This triggers: (1) ⟨39 unchanged words⟩ minutes. Use get_graph_project_info to verify deployment succeeded. Adeployplan that drops data is refused,untilnamingyoueverypasstable,confirm_destructive=truefield,afterentityreviewingortherelationshipplan.it would drop, and every field whose type change rounds or cuts its values (a decimal with a smaller scale or turned integer, a datetime turned date): deploy_destructive applies it, a tool of its own so a client asks before it runs. One operation runs on a project at a ⟨44 unchanged words⟩
{"properties":{"confirm_destructive":{"description":"Set true only after reviewing the plan: a deploy that drops tables, columns, entities, relationships or fields is refused without it","type":"boolean"},"project_id":{"description":"Project ID (UUID) ⟨6 unchanged words⟩
{"destructiveHint":truefalse,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
Promote staging to production (requires a paid plan): production's database migrates from the schema it runs to the one staging runs, and production runs staging's build. With staging unchanged since the last promotion, it rebuilds production with no schema change. The operation is ASYNCHRONOUS: poll the returned job_id with get_job_status. Adeployplan that drops data is refused,untilnamingyoueverypasstable,confirm_destructive=truefield,afterentityreviewingortherelationshipplan.it would drop, and every field whose type change rounds or cuts its values (a decimal with a smaller scale or turned integer, a datetime turned date): deploy_destructive applies it, a tool of its own so a client asks before it runs. One operation runs on a project at a ⟨44 unchanged words⟩
{"properties":{"confirm_destructive":{"description":"Set true only after reviewing the plan: a deploy that drops tables, columns, entities, relationships or fields is refused without it","type":"boolean"},"project_id":{"description":"Project ID (UUID) ⟨6 unchanged words⟩
{"destructiveHint":truefalse,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
Deploy aprojectproject's saved schema to the staging environment. This triggers: (1) ⟨96 unchanged words⟩ get_project_info to see if the deployment succeeded. Adeployplan that drops data is refused,untilnamingyoueverypasstable,confirm_destructive=truefield,afterentityreviewingortherelationshipplan.it would drop, and every field whose type change rounds or cuts its values (a decimal with a smaller scale or turned integer, a datetime turned date): deploy_destructive applies it, a tool of its own so a client asks before it runs. One operation runs on a project at a ⟨44 unchanged words⟩
{"properties":{"confirm_destructive":{"description":"Set true only after reviewing the plan: a deploy that drops tables, columns, entities, relationships or fields is refused without it","type":"boolean"},"project_id":{"description":"Project ID (UUID) ⟨6 unchanged words⟩
{"destructiveHint":truefalse,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
⟨5 unchanged words⟩ job (a create, deploy, promotion, rollback, deletion ordeletionmodule operation). STATUS VALUES: pending (queued), processing ⟨30 unchanged words⟩ a deploy can take up to 15 minutes. A module job names its module_code, and a completed module build's result names the image it built (its commit). If status is 'failed', read failure_side and ⟨54 unchanged words⟩
{"properties":{"job_id":{"description":"Job IDreturnedafromcreate,deploymentdeploy,operationspromotion, rollback, deletion or module operation answered","type":"string"}},"required": ⟨3 unchanged words⟩
Change PART of a project's schema without dropping any of it (saves to database, does NOT deploy). ⟨64 unchanged words⟩ rules as create_project • {"op": "drop_table", "table": "clocks"} • {"op": "rename_table", "table": "clocks", "to ⟨12 unchanged words⟩ ": 64}} • {"op": "drop_field", "table": "parameters", "field": "is_clock"} • {"op": "rename_field", "table": "parameters", "field ⟨28 unchanged words⟩ true}} __policy__, __constraints__, __audit__, __admin_write__ Dropping a table or field is drop_schema_items, a tool of its own. ALL OR NOTHING: an operation that cannot be ⟨59 unchanged words⟩ 'version' (the schema's version after the change).You never need to read the whole schema back to see what you did.WORKFLOW: 1. get_schema with tables/fields to read ⟨5 unchanged words⟩ (its 'version' is the whole schema's) 2.patch_schemapreview_schema_change withdry_run=truethe operations: check 'diff' and 'plan' 3. patch_schema with ⟨7 unchanged words⟩ refused if someone else saved meanwhile) 4. deploy_staging(confirm_destructive=true when the plan drops data), then get_job_status
{"properties":{"dry_run":{"description":"Save nothing: answer what the operations did, the diff and the migration plan a deploy would run.","type":"boolean"},"expected_version":{"description":"The 'version' a get_schema ⟨60 unchanged words⟩
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
{"destructiveHint":false,"idempotentHint":true,"openWorldHint":truefalse,"readOnlyHint":false}
UpdateReplace a graph project's WHOLE schema (saves to database, does NOT deploy). DESTRUCTIVE: an entity, relationship or field the schema leaves out is deleted by the next deploy. ⚠️ Follow ALL rules from create_graph_project: • ⟨55 unchanged words⟩ Entity names should be PascalCase WORKFLOW: 1.Useget_graph_schema to see the current schema2.Modify following all rules 3. Call update_graph_schema(saves only) 4. Callitsdeploy_graph_staging'version'topinsapplythechangessave)5.2.Monitorpreview_schema_change withget_job_status DRY RUN: pass dry_run=truethetonewpreviewschema:whatchecka'diff'deployandWOULD'plan' 3.changeupdate_graph_schema (renames, deletions) withoutpasssaving. NOTE:expected_versionThistoonlybesavesrefusedtheifschema.someoneYouelseMUSTsavedcallmeanwhile) 4. deploy_graph_stagingafterwards,tothendeploy.get_job_status
{"properties":{"dry_runexpected_version":{"description":"PreviewThethe'version'plannedamigrationget_graph_schema read answered. The save is refused (renames/deletions409)without savingwhenorthedeploying.savedNothingschemaischangedapplied.since.","type":"booleanstring"},"project_id":{"description":"Project ID ⟨5 unchanged words⟩
{"destructiveHint":falsetrue,"idempotentHint":true,"openWorldHint":truefalse,"readOnlyHint":false}
UpdateReplace a project's WHOLE schema (saves to database, does NOT deploy).⚠️CRITICALDESTRUCTIVE: a table or field the schema leaves out is dropped by the next deploy. For a new data model or a template. To change part of a schema use patch_schema, and drop_schema_items to drop; sending back a large schema to change one field risks changing something else on the way. ⚠️ Follow ALL rules from create_project: • FLAT format ⟨50 unchanged words⟩ add required field without default to existing tables• Safe: {new_field: {type: "string", max_length: 100, required: false}}WORKFLOW: 1.Useget_schema to see the current schema2.Modify following ALL rules 3.(optional) Call update_schema with dry_run=trueitsto'version'previewpins themigration first 4. Call update_schema (saves onlysave)5. Call deploy_staging to apply changes 6.2.Monitorpreview_schema_change withget_job_status CHANGING PART OF A SCHEMA: use patch_schema. This tool replacestheWHOLE schema, so it is for anewdata model or a template; sending back a largeschemato change:onecheckfield'diff'risksandchanging'plan'something else on the way. DRY3.RUN:update_schema (passdry_run=trueexpected_version tosavebenothingrefusedandifreadsomeonebackelse'diff'saved—meanwhile) 4.everydeploy_staging,propertythenthisget_job_status A schemachanges inthesaved one, sodeployanwouldaccidentallyrefusechangedisdescription,refuseddefaulthere,enum or computed case shows up —and'plan', thenothingmigrationisasaved.deployThewouldanswerthencarriesrun'diff',with destructive steps flagged. NOTE: Without dry_run this only'plan'savesand theschema. You MUST call deploy_staging afterwards to applynewchanges.'version'.
{"properties":{"dry_run":{"description":"Save nothing: answer the property-level diff against the saved schema and the migration plan a deploy would run.","type":"boolean"},"expected_version":{"description":"The 'version' a get_schema ⟨36 unchanged words⟩ FLAT format (table_name → field_name → properties).— the WHOLE schema. Every field MUST have a 'type' property.", ⟨7 unchanged words⟩
{"destructiveHint":falsetrue,"idempotentHint":true,"openWorldHint":truefalse,"readOnlyHint":false}
Delete Module — Remove a module: its pods stop and it leaves the project and its CORS origins. DESTRUCTIVE. One operation runs on a module at a time, and none beside an operation on its project: the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
Deploy a Plan That Drops Data — Deploy a plan that drops data, of a relational or a graph project. DESTRUCTIVE: the tables, fields, entities or relationships the plan drops lose their data. environment 'staging' deploys the saved schema, 'production' promotes staging. Use it only after a deploy tool (deploy_staging, deploy_production, deploy_graph_staging, deploy_graph_production) refused the plan, naming its drops, and those drops are intended. The operation is ASYNCHRONOUS: poll the returned job_id with get_job_status. One operation runs on a project at a time: while another runs, the call is refused and the refusal names…
Deploy Module — Deploy a new module from a GitHub repository onto the project's resource pool: a frontblok module is a Vite frontend, a logicblok module a backend built from its Dockerfile that serves port 8000 with GET /health. Its job clones the repository (the default branch head, or git_ref), builds it and serves it at the module_url the answer names; the project's CORS origins take the module in. A private repository needs the RationalBloks GitHub App installed on it. The operation is ASYNCHRONOUS: poll the returned job_id with get_job_status. While RationalBloks is being updated, the call is refused wi…
Drop Tables or Fields — Drop tables or fields from a project's saved schema (saves to database, does NOT deploy). DESTRUCTIVE: the next deploy drops their data. OPERATIONS (applied in order and all together): • {"op": "drop_table", "table": "clocks"} • {"op": "drop_field", "table": "parameters", "field": "is_clock"} A drop that cannot be applied (a table or field that is not there, a schema the deploy would refuse, such as a field another reads) refuses them all, naming it, and nothing is saved. The answer carries 'applied', 'diff', 'plan' and the new 'version'. WORKFLOW: 1. preview_schema_change with the same op…
Freeze Module — Stop a module's pods (scale to 0), remembering how many it ran; unfreeze_module starts them again. Freezing a frozen module changes nothing. One operation runs on a module at a time, and none beside an operation on its project: the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
List Modules — List a project's modules and what each runs: module_id (what every module tool takes), name, type (frontblok or logicblok), repository, url, staging_status (not_deployed, deploying, deployed, failed), deployed_at, image (the image of its last successful build, named by the commit it built: <name>:<short sha>-<build time>), replicas (live pods: 0 when frozen, null while the pool is not reporting), CPU and memory, and env_var_names (the names of its environment variables, never their values).
Preview Schema Change — Preview a schema change, saving nothing: the one way to see what a change would do before it is saved. Pass ONE of: • operations: the operations patch_schema or drop_schema_items would apply (relational projects) • schema: a whole schema in place of the saved one (relational or graph projects) ANSWER: 'applied' (for operations), 'diff' (every property saving it would change, by path), 'summary' and 'plan' (the migration the next deploy would then run, every table, field, entity or relationship it drops named), and 'version' (the saved schema's: pass it as expected_version to the save that f…
Redeploy Module — Rebuild a module from its repository's default branch head and roll it out, keeping its pod count. Its data and settings are untouched; the project's API (staging and production) and its backend modules restart to take the module's CORS origin. The operation is ASYNCHRONOUS: poll the returned job_id with get_job_status, whose result names the image built (its commit); list_modules shows it once done. One operation runs on a module at a time, and none beside an operation on its project: the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is …
Redeploy Project — Rebuild and roll out a project's staging environment from the schema it runs, with NO schema change, for a relational or a graph project: the current platform release, the project's settings (email, admin users) and its environment take effect. Refused (409) when the saved schema holds changes the last deploy did not apply (deploy_staging deploys those) or when nothing was deployed yet; a save that lands meanwhile is refused rather than deployed. deploy_production rebuilds production the same way when staging runs what production runs. The operation is ASYNCHRONOUS: poll the returned job_id w…
Scale Module — Run 1 or 2 pods of a module (freeze_module stops it). One operation runs on a module at a time, and none beside an operation on its project: the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
Set Module Environment — Set a module's environment variables: {NAME: value} sets one, {NAME: null} removes one, and every variable not named is kept. A backend module restarts to take them; a frontend module rebuilds (they are build arguments). Values are stored encrypted and never returned: the answer and list_modules name the variables only. DESTRUCTIVE: a value replaced or removed cannot be read back. CORS_ORIGINS, DEPLOY_* and GITHUB_TOKEN are the platform's. The operation is a job: poll the returned job_id with get_job_status. One operation runs on a module at a time, and none beside an operation on its project…
Set Module Resources — Set a module's CPU and memory and rebuild it so its pods take them. The allocation is checked against the resource pool's capacity first; a refused one is restored. The operation is ASYNCHRONOUS: poll the returned job_id with get_job_status. One operation runs on a module at a time, and none beside an operation on its project: the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
Unfreeze Module — Start a frozen module's pods again, as many as it ran before the freeze. A running module is left as it is. One operation runs on a module at a time, and none beside an operation on its project: the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
Update Module — Rename a module, or point it at another GitHub repository, which its next redeploy builds. Pass module_name, github_repo_url or both. One operation runs on a module at a time, and none beside an operation on its project: the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
⟨88 unchanged words⟩ ONE_TO_ONE, ONE_TO_MANY, MANY_TO_ONE, MANY_TO_MANY HIERARCHICAL NODES:Nestentities inside parent entities to createnesttypeanhierarchies. Childentityentitiesinsideinheritits parentlabels automatically. Example: { "nodes":entity{ "Animal":(beside{"description": "Base animal entity","flat_labels":and["LivingThing"], "schema": { "name": {"type":)"string",to"required":createtrue}, "habitat":a{"type":"string"} }, "Dog": { "description":hierarchy;"Athedogchild(inheritsAnimalthelabels)", "flat_labels":parent's["Pet"], "schema"labels:{"breedAnimal": {"typedescription": "string...", "required": true}, "trainedschema": {"type": "boolean"} } } }...},"relationships":{"OWNSDog": {"fromdescription": "Person...","to":"Animal", "cardinalityschema":"ONE_TO_MANY"{...}}} RULES: 1. "nodes" key is REQUIRED ⟨55 unchanged words⟩ (id, created_at, updated_at) are NOT needed8. Use get_graph_template_schemas FIRST to see valid examplesWORKFLOW: 1.Useget_graph_template_schemas FIRST to see valid examples 2.Createcreate_graph_projectschemawithfollowingathecluster_idrulesfromabovelist_clusters 3.Call this tool 4. Monitor with get_job_status (2-5 min deployment) After creation, usePoll get_job_status with the returned job_idto monitor(2-5deployment.minutes) While RationalBloks is being updated, the call ⟨14 unchanged words⟩
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
Create a new RationalBloks project (a PostgreSQL REST API) from a JSONschema.schema, on one of your resource pools. ⚠️ CRITICAL RULES - READ BEFORE CREATING SCHEMA: 1. FLAT FORMAT (REQUIRED): ✅ CORRECT: {users"orders": {stringdecimal",max_length"precision":25510, "scale": 2}}} ❌ WRONG: {users"orders": {"fieldstype: "string"}...}}}DONOT— never nest under 'fields'key!2.FIELDEVERYTYPEfieldREQUIREMENTShas a "type":•string:(MUST have"max_length" (e.g.),max_length:text,255) •integer, decimal:MUST have "precision" and "scale"(e.g.,precision: 10, scale: 2)•,datetime:boolean,Useuuid,"date, datetime"(NOT "timestamp"•),ALLjson,fieldsand the PostgreSQL arrays uuid_array, integer_array, text_array, float_array (GIN-indexed:MUST@>havecontains,"type"<@propertycontained_by, && overlaps) 3. AUTOMATIC FIELDS (DON'T define):•id(uuid,primary key) •created_at(datetime) •, updated_at(datetime)4.USER AUTHENTICATIONUSERS:❌NEVER create"users", "customers", "employees"users/customers/employees tables withemail/password ✅emailUSEorbuilt-inpassword. Link to the built-in app_users tableExample:{ "employee_profiles":{"user_id": {type:"uuidtype", foreign_key: "app_users.iduuid",required: true},"departmentforeign_key":{type:"stringapp_users.id", max_length: 100}}} 5. AUTHORIZATION: Add user_id → app_users.id to enable."onlyAseetableyourwithownsuchdata" Example:a{ "orders": { "user_id": {type: "uuid",fieldforeign_key:is"app_users.id"}, "total"owner-scoped:{type:each"decimal",userprecision:sees10,theirscale:own2} } }rows.6.5. FIELD OPTIONS:•required: true/false •, unique: true/false •, default: any value •, enum: ["val1","val2"] •foreign_key:("table.id"AVAILABLE TYPES: string, text, integer),decimal,on_deleteboolean(cascade,uuidset_null,daterestrict,datetimeno_action),jsonnullable,uuid_arrayindex,integer_arraydescription,text_arraywrite_only,float_array Array types store PostgreSQL native arrays with automatic GIN indexing:computed.• uuid_array: UUID[] — for sets ofAdvancedreferencesfeatures (e.g., tensor coordinates) • integer_array: BIGINT[] — for dimension indices, integer sets • text_array: TEXT[] — for tags, categories__policy__,label sets • float_array: DOUBLE PRECISION[] — for weightcomputedvectorscolumns,scores GIN-indexed operators: @> (contains)__constraints__,<@ (contained_by__audit__), &&:(overlaps)get_schema_reference. BACKEND ENGINE: •python(defaultbackend_type):FastAPI backend —"python"mature(FastAPI,full-featured •default) or "rust:" (Axumbackend —: faster cold starts, lower memory, high performance). WORKFLOW: 1.Useget_template_schemas FIRST to see valid examples 2.Createcreate_projectschemawithfollowingaALLcluster_idrulesfromabovelist_clusters 3.Call this tool (optionally choose backend_type: "python"Pollorget_job_status"rust") 4.withMonitorthewithreturnedget_job_statusjob_id (2-5min deploymentminutes)After creation, use get_job_status with4.returnedget_project_infojob_idgivestothemonitorlivedeployment.URL While RationalBloks is being updated, the call ⟨14 unchanged words⟩
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
⟨13 unchanged words⟩ own credentials and database. Requires paid plan. Adeployplan that drops data is refused,untilnamingyoueverypasstable,confirm_destructive=truefield,afterentityreviewingortherelationshipplan.it would drop, and every field whose type change rounds or cuts its values (a decimal with a smaller scale or turned integer, a datetime turned date): deploy_destructive applies it, a tool of its own so a client asks before it runs. One operation runs on a project at a ⟨44 unchanged words⟩
{"properties":{"confirm_destructive":{"description":"Set true only after reviewing the plan: a deploy that drops tables, columns, entities, relationships or fields is refused without it","type":"boolean"},"project_id":{"description":"Project ID (UUID) ⟨6 unchanged words⟩
{"destructiveHint":truefalse,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
Deploy a graphprojectproject's saved schema to the staging environment. This triggers: (1) ⟨39 unchanged words⟩ minutes. Use get_graph_project_info to verify deployment succeeded. Adeployplan that drops data is refused,untilnamingyoueverypasstable,confirm_destructive=truefield,afterentityreviewingortherelationshipplan.it would drop, and every field whose type change rounds or cuts its values (a decimal with a smaller scale or turned integer, a datetime turned date): deploy_destructive applies it, a tool of its own so a client asks before it runs. One operation runs on a project at a ⟨44 unchanged words⟩
{"properties":{"confirm_destructive":{"description":"Set true only after reviewing the plan: a deploy that drops tables, columns, entities, relationships or fields is refused without it","type":"boolean"},"project_id":{"description":"Project ID (UUID) ⟨6 unchanged words⟩
{"destructiveHint":truefalse,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
Promote staging to production (requires a paid plan): production's database migrates from the schema it runs to the one staging runs, and production runs staging's build. With staging unchanged since the last promotion, it rebuilds production with no schema change. The operation is ASYNCHRONOUS: poll the returned job_id with get_job_status. Adeployplan that drops data is refused,untilnamingyoueverypasstable,confirm_destructive=truefield,afterentityreviewingortherelationshipplan.it would drop, and every field whose type change rounds or cuts its values (a decimal with a smaller scale or turned integer, a datetime turned date): deploy_destructive applies it, a tool of its own so a client asks before it runs. One operation runs on a project at a ⟨44 unchanged words⟩
{"properties":{"confirm_destructive":{"description":"Set true only after reviewing the plan: a deploy that drops tables, columns, entities, relationships or fields is refused without it","type":"boolean"},"project_id":{"description":"Project ID (UUID) ⟨6 unchanged words⟩
{"destructiveHint":truefalse,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
Deploy aprojectproject's saved schema to the staging environment. This triggers: (1) ⟨96 unchanged words⟩ get_project_info to see if the deployment succeeded. Adeployplan that drops data is refused,untilnamingyoueverypasstable,confirm_destructive=truefield,afterentityreviewingortherelationshipplan.it would drop, and every field whose type change rounds or cuts its values (a decimal with a smaller scale or turned integer, a datetime turned date): deploy_destructive applies it, a tool of its own so a client asks before it runs. One operation runs on a project at a ⟨44 unchanged words⟩
{"properties":{"confirm_destructive":{"description":"Set true only after reviewing the plan: a deploy that drops tables, columns, entities, relationships or fields is refused without it","type":"boolean"},"project_id":{"description":"Project ID (UUID) ⟨6 unchanged words⟩
{"destructiveHint":truefalse,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
⟨5 unchanged words⟩ job (a create, deploy, promotion, rollback, deletion ordeletionmodule operation). STATUS VALUES: pending (queued), processing ⟨30 unchanged words⟩ a deploy can take up to 15 minutes. A module job names its module_code, and a completed module build's result names the image it built (its commit). If status is 'failed', read failure_side and ⟨54 unchanged words⟩
{"properties":{"job_id":{"description":"Job IDreturnedafromcreate,deploymentdeploy,operationspromotion, rollback, deletion or module operation answered","type":"string"}},"required": ⟨3 unchanged words⟩
Change PART of a project's schema without dropping any of it (saves to database, does NOT deploy). ⟨64 unchanged words⟩ rules as create_project • {"op": "drop_table", "table": "clocks"} • {"op": "rename_table", "table": "clocks", "to ⟨12 unchanged words⟩ ": 64}} • {"op": "drop_field", "table": "parameters", "field": "is_clock"} • {"op": "rename_field", "table": "parameters", "field ⟨28 unchanged words⟩ true}} __policy__, __constraints__, __audit__, __admin_write__ Dropping a table or field is drop_schema_items, a tool of its own. ALL OR NOTHING: an operation that cannot be ⟨59 unchanged words⟩ 'version' (the schema's version after the change).You never need to read the whole schema back to see what you did.WORKFLOW: 1. get_schema with tables/fields to read ⟨5 unchanged words⟩ (its 'version' is the whole schema's) 2.patch_schemapreview_schema_change withdry_run=truethe operations: check 'diff' and 'plan' 3. patch_schema with ⟨7 unchanged words⟩ refused if someone else saved meanwhile) 4. deploy_staging(confirm_destructive=true when the plan drops data), then get_job_status
{"properties":{"dry_run":{"description":"Save nothing: answer what the operations did, the diff and the migration plan a deploy would run.","type":"boolean"},"expected_version":{"description":"The 'version' a get_schema ⟨60 unchanged words⟩
{"destructiveHint":false,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
{"destructiveHint":true,"idempotentHint":false,"openWorldHint":truefalse,"readOnlyHint":false}
{"destructiveHint":false,"idempotentHint":true,"openWorldHint":truefalse,"readOnlyHint":false}
UpdateReplace a graph project's WHOLE schema (saves to database, does NOT deploy). DESTRUCTIVE: an entity, relationship or field the schema leaves out is deleted by the next deploy. ⚠️ Follow ALL rules from create_graph_project: • ⟨55 unchanged words⟩ Entity names should be PascalCase WORKFLOW: 1.Useget_graph_schema to see the current schema2.Modify following all rules 3. Call update_graph_schema(saves only) 4. Callitsdeploy_graph_staging'version'topinsapplythechangessave)5.2.Monitorpreview_schema_change withget_job_status DRY RUN: pass dry_run=truethetonewpreviewschema:whatchecka'diff'deployandWOULD'plan' 3.changeupdate_graph_schema (renames, deletions) withoutpasssaving. NOTE:expected_versionThistoonlybesavesrefusedtheifschema.someoneYouelseMUSTsavedcallmeanwhile) 4. deploy_graph_stagingafterwards,tothendeploy.get_job_status
{"properties":{"dry_runexpected_version":{"description":"PreviewThethe'version'plannedamigrationget_graph_schema read answered. The save is refused (renames/deletions409)without savingwhenorthedeploying.savedNothingschemaischangedapplied.since.","type":"booleanstring"},"project_id":{"description":"Project ID ⟨5 unchanged words⟩
{"destructiveHint":falsetrue,"idempotentHint":true,"openWorldHint":truefalse,"readOnlyHint":false}
UpdateReplace a project's WHOLE schema (saves to database, does NOT deploy).⚠️CRITICALDESTRUCTIVE: a table or field the schema leaves out is dropped by the next deploy. For a new data model or a template. To change part of a schema use patch_schema, and drop_schema_items to drop; sending back a large schema to change one field risks changing something else on the way. ⚠️ Follow ALL rules from create_project: • FLAT format ⟨50 unchanged words⟩ add required field without default to existing tables• Safe: {new_field: {type: "string", max_length: 100, required: false}}WORKFLOW: 1.Useget_schema to see the current schema2.Modify following ALL rules 3.(optional) Call update_schema with dry_run=trueitsto'version'previewpins themigration first 4. Call update_schema (saves onlysave)5. Call deploy_staging to apply changes 6.2.Monitorpreview_schema_change withget_job_status CHANGING PART OF A SCHEMA: use patch_schema. This tool replacestheWHOLE schema, so it is for anewdata model or a template; sending back a largeschemato change:onecheckfield'diff'risksandchanging'plan'something else on the way. DRY3.RUN:update_schema (passdry_run=trueexpected_version tosavebenothingrefusedandifreadsomeonebackelse'diff'saved—meanwhile) 4.everydeploy_staging,propertythenthisget_job_status A schemachanges inthesaved one, sodeployanwouldaccidentallyrefusechangedisdescription,refuseddefaulthere,enum or computed case shows up —and'plan', thenothingmigrationisasaved.deployThewouldanswerthencarriesrun'diff',with destructive steps flagged. NOTE: Without dry_run this only'plan'savesand theschema. You MUST call deploy_staging afterwards to applynewchanges.'version'.
{"properties":{"dry_run":{"description":"Save nothing: answer the property-level diff against the saved schema and the migration plan a deploy would run.","type":"boolean"},"expected_version":{"description":"The 'version' a get_schema ⟨36 unchanged words⟩ FLAT format (table_name → field_name → properties).— the WHOLE schema. Every field MUST have a 'type' property.", ⟨7 unchanged words⟩
{"destructiveHint":falsetrue,"idempotentHint":true,"openWorldHint":truefalse,"readOnlyHint":false}
Delete Module — Remove a module: its pods stop and it leaves the project and its CORS origins. DESTRUCTIVE. One operation runs on a module at a time, and none beside an operation on its project: the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
Deploy a Plan That Drops Data — Deploy a plan that drops data, of a relational or a graph project. DESTRUCTIVE: the tables, fields, entities or relationships the plan drops lose their data. environment 'staging' deploys the saved schema, 'production' promotes staging. Use it only after a deploy tool (deploy_staging, deploy_production, deploy_graph_staging, deploy_graph_production) refused the plan, naming its drops, and those drops are intended. The operation is ASYNCHRONOUS: poll the returned job_id with get_job_status. One operation runs on a project at a time: while another runs, the call is refused and the refusal names…
Deploy Module — Deploy a new module from a GitHub repository onto the project's resource pool: a frontblok module is a Vite frontend, a logicblok module a backend built from its Dockerfile that serves port 8000 with GET /health. Its job clones the repository (the default branch head, or git_ref), builds it and serves it at the module_url the answer names; the project's CORS origins take the module in. A private repository needs the RationalBloks GitHub App installed on it. The operation is ASYNCHRONOUS: poll the returned job_id with get_job_status. While RationalBloks is being updated, the call is refused wi…
Drop Tables or Fields — Drop tables or fields from a project's saved schema (saves to database, does NOT deploy). DESTRUCTIVE: the next deploy drops their data. OPERATIONS (applied in order and all together): • {"op": "drop_table", "table": "clocks"} • {"op": "drop_field", "table": "parameters", "field": "is_clock"} A drop that cannot be applied (a table or field that is not there, a schema the deploy would refuse, such as a field another reads) refuses them all, naming it, and nothing is saved. The answer carries 'applied', 'diff', 'plan' and the new 'version'. WORKFLOW: 1. preview_schema_change with the same op…
Freeze Module — Stop a module's pods (scale to 0), remembering how many it ran; unfreeze_module starts them again. Freezing a frozen module changes nothing. One operation runs on a module at a time, and none beside an operation on its project: the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
List Modules — List a project's modules and what each runs: module_id (what every module tool takes), name, type (frontblok or logicblok), repository, url, staging_status (not_deployed, deploying, deployed, failed), deployed_at, image (the image of its last successful build, named by the commit it built: <name>:<short sha>-<build time>), replicas (live pods: 0 when frozen, null while the pool is not reporting), CPU and memory, and env_var_names (the names of its environment variables, never their values).
Preview Schema Change — Preview a schema change, saving nothing: the one way to see what a change would do before it is saved. Pass ONE of: • operations: the operations patch_schema or drop_schema_items would apply (relational projects) • schema: a whole schema in place of the saved one (relational or graph projects) ANSWER: 'applied' (for operations), 'diff' (every property saving it would change, by path), 'summary' and 'plan' (the migration the next deploy would then run, every table, field, entity or relationship it drops named), and 'version' (the saved schema's: pass it as expected_version to the save that f…
Redeploy Module — Rebuild a module from its repository's default branch head and roll it out, keeping its pod count. Its data and settings are untouched; the project's API (staging and production) and its backend modules restart to take the module's CORS origin. The operation is ASYNCHRONOUS: poll the returned job_id with get_job_status, whose result names the image built (its commit); list_modules shows it once done. One operation runs on a module at a time, and none beside an operation on its project: the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is …
Redeploy Project — Rebuild and roll out a project's staging environment from the schema it runs, with NO schema change, for a relational or a graph project: the current platform release, the project's settings (email, admin users) and its environment take effect. Refused (409) when the saved schema holds changes the last deploy did not apply (deploy_staging deploys those) or when nothing was deployed yet; a save that lands meanwhile is refused rather than deployed. deploy_production rebuilds production the same way when staging runs what production runs. The operation is ASYNCHRONOUS: poll the returned job_id w…
Scale Module — Run 1 or 2 pods of a module (freeze_module stops it). One operation runs on a module at a time, and none beside an operation on its project: the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
Set Module Environment — Set a module's environment variables: {NAME: value} sets one, {NAME: null} removes one, and every variable not named is kept. A backend module restarts to take them; a frontend module rebuilds (they are build arguments). Values are stored encrypted and never returned: the answer and list_modules name the variables only. DESTRUCTIVE: a value replaced or removed cannot be read back. CORS_ORIGINS, DEPLOY_* and GITHUB_TOKEN are the platform's. The operation is a job: poll the returned job_id with get_job_status. One operation runs on a module at a time, and none beside an operation on its project…
Set Module Resources — Set a module's CPU and memory and rebuild it so its pods take them. The allocation is checked against the resource pool's capacity first; a refused one is restored. The operation is ASYNCHRONOUS: poll the returned job_id with get_job_status. One operation runs on a module at a time, and none beside an operation on its project: the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
Unfreeze Module — Start a frozen module's pods again, as many as it ran before the freeze. A running module is left as it is. One operation runs on a module at a time, and none beside an operation on its project: the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
Update Module — Rename a module, or point it at another GitHub repository, which its next redeploy builds. Pass module_name, github_repo_url or both. One operation runs on a module at a time, and none beside an operation on its project: the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
⟨119 unchanged words⟩ deploy_staging to apply changes 6. Monitor with get_job_status CHANGING PART OF A SCHEMA: use patch_schema. This tool replaces the WHOLE schema, so it is for a new data model or a template; sending back a large schema to change one field risks changing something else on the way. DRY RUN: pass dry_run=true topreviewsavewhatnothingaanddeployreadWOULDbackchange'diff' —renames,everydrops,propertycreatesthis—schema changeswithoutinsavingtheorsaveddeployingone,anything.soTheanresponseaccidentallyflagschangeddestructivedescription,operationsdefault,(droppedenum or computed case shows up —tables/columns)andso'plan',youthecanmigrationreviewabeforedeployapplying.would then run, with destructive steps flagged. NOTE: Without dry_run this only saves the ⟨9 unchanged words⟩
{"properties":{"dry_run":{"description":"PreviewSave nothing: answer theplannedproperty-level diff against the saved schema and the migration plan a deploy would run.","type":"boolean"},"expected_version":{"description":"The 'version' a get_schema read answered. The save is refused (renames/drops/creates409)withoutwhensavingtheorsaveddeploying.schemaNothingchangedissince,applied.so two editors never overwrite each other silently.","type":"booleanstring"},"project_id":{"description":"Project ID ⟨31 unchanged words⟩
Patch Schema — Change PART of a project's schema (saves to database, does NOT deploy). Send only the change. The server applies it to the saved schema, in order and all together, and keeps every table and field it does not touch — including their identity, so a rename stays a rename and the column keeps its data. OPERATIONS (each one small object, applied in the order given): • {"op": "add_table", "table": "clocks", "definition": {...}} new table, same FLAT rules as create_project • {"op": "drop_table", "table": "clocks"} • {"op": "rename_table", "table": "clocks", "to": "timers"} • {"op": "add_field…
⟨119 unchanged words⟩ deploy_staging to apply changes 6. Monitor with get_job_status CHANGING PART OF A SCHEMA: use patch_schema. This tool replaces the WHOLE schema, so it is for a new data model or a template; sending back a large schema to change one field risks changing something else on the way. DRY RUN: pass dry_run=true topreviewsavewhatnothingaanddeployreadWOULDbackchange'diff' —renames,everydrops,propertycreatesthis—schema changeswithoutinsavingtheorsaveddeployingone,anything.soTheanresponseaccidentallyflagschangeddestructivedescription,operationsdefault,(droppedenum or computed case shows up —tables/columns)andso'plan',youthecanmigrationreviewabeforedeployapplying.would then run, with destructive steps flagged. NOTE: Without dry_run this only saves the ⟨9 unchanged words⟩
{"properties":{"dry_run":{"description":"PreviewSave nothing: answer theplannedproperty-level diff against the saved schema and the migration plan a deploy would run.","type":"boolean"},"expected_version":{"description":"The 'version' a get_schema read answered. The save is refused (renames/drops/creates409)withoutwhensavingtheorsaveddeploying.schemaNothingchangedissince,applied.so two editors never overwrite each other silently.","type":"booleanstring"},"project_id":{"description":"Project ID ⟨31 unchanged words⟩
Patch Schema — Change PART of a project's schema (saves to database, does NOT deploy). Send only the change. The server applies it to the saved schema, in order and all together, and keeps every table and field it does not touch — including their identity, so a rename stays a rename and the column keeps its data. OPERATIONS (each one small object, applied in the order given): • {"op": "add_table", "table": "clocks", "definition": {...}} new table, same FLAT rules as create_project • {"op": "drop_table", "table": "clocks"} • {"op": "rename_table", "table": "clocks", "to": "timers"} • {"op": "add_field…
⟨7 unchanged words⟩ , K8s deployments, Neo4j database, and credentials). It runs as a job: poll the returned job_id with get_job_status until it is completed. One operation runs on a project at a time: while another runs, the call is refused and the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
Delete a project (removes GitHub repo, K8s deployments, and database). It runs as a job: poll the returned job_id with get_job_status until it is completed. One operation runs on a project at a time: while another runs, the call is refused and the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.⟨27 unchanged words⟩ until you pass confirm_destructive=true after reviewing the plan. One operation runs on a project at a time: while another runs, the call is refused and the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
⟨64 unchanged words⟩ until you pass confirm_destructive=true after reviewing the plan. One operation runs on a project at a time: while another runs, the call is refused and the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
⟨14 unchanged words⟩ until you pass confirm_destructive=true after reviewing the plan. One operation runs on a project at a time: while another runs, the call is refused and the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
⟨49 unchanged words⟩ depending on schema complexity. If deployment fails, read the job's error first: one that starts with 'RationalBloks platform error' is the platform's, not the schema's. Otherwise check: (1) Schema format is FLAT ( ⟨39 unchanged words⟩ until you pass confirm_destructive=true after reviewing the plan. One operation runs on a project at a time: while another runs, the call is refused and the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
⟨25 unchanged words⟩ — a different format than relational flat-table schemas. The response also says whether this saved schema is the deployed one: saved_schema_deployed is true when the last deploy applied it, false when it was saved after the last deploy (undeployed_changes then lists what deploying it would change), and null when no deployed schema is on record.
Check the status of adeploymentjobjob.(a create, deploy, promotion, rollback or deletion). STATUS VALUES: pending (jobqueued),runningprocessing (deploymentin progress), completed (success),failedfailed.(deploymentCallfailed).itTIMELINEuntil the status is completed or failed:Typicaleverydeploymentjobtakesends,2-5sinceminutes.aIfjobstatuswhose server stopped is'running'failedforwithin>10about three minutes,checkandget_project_infoafordeploydetailedcanpodtakestatus.up to 15 minutes. If status is 'failed', read error first: an error that starts with 'RationalBloks platform error' failed inside the platform, so nothing in the schema causes or fixes it (report it); any other failure is the project's: use get_project_info to see deployment errors and check ⟨9 unchanged words⟩
⟨69 unchanged words⟩ {table_name: {field_name: {type, properties}}}. The response also says whether this saved schema is the deployed one: saved_schema_deployed is true when the last deploy applied it, false when it was saved after the last deploy (undeployed_changes then lists what deploying it would change), and null when no deployed schema is on record.
⟨44 unchanged words⟩ API will be redeployed with the old schema. One operation runs on a project at a time: while another runs, the call is refused and the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
⟨48 unchanged words⟩ is useful when a schema change breaks deployment. One operation runs on a project at a time: while another runs, the call is refused and the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
⟨20 unchanged words⟩ format (no 'fields' nesting) • string:MUSTmax_lengthhave(defaultmax_length255) • decimal:MUST haveprecision + scale (default 10, 2) • Use "datetime" NOT "timestamp" • ⟨134 unchanged words⟩
⟨7 unchanged words⟩ , K8s deployments, Neo4j database, and credentials). It runs as a job: poll the returned job_id with get_job_status until it is completed. One operation runs on a project at a time: while another runs, the call is refused and the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
Delete a project (removes GitHub repo, K8s deployments, and database). It runs as a job: poll the returned job_id with get_job_status until it is completed. One operation runs on a project at a time: while another runs, the call is refused and the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.⟨27 unchanged words⟩ until you pass confirm_destructive=true after reviewing the plan. One operation runs on a project at a time: while another runs, the call is refused and the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
⟨64 unchanged words⟩ until you pass confirm_destructive=true after reviewing the plan. One operation runs on a project at a time: while another runs, the call is refused and the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
⟨14 unchanged words⟩ until you pass confirm_destructive=true after reviewing the plan. One operation runs on a project at a time: while another runs, the call is refused and the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
⟨49 unchanged words⟩ depending on schema complexity. If deployment fails, read the job's error first: one that starts with 'RationalBloks platform error' is the platform's, not the schema's. Otherwise check: (1) Schema format is FLAT ( ⟨39 unchanged words⟩ until you pass confirm_destructive=true after reviewing the plan. One operation runs on a project at a time: while another runs, the call is refused and the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
⟨25 unchanged words⟩ — a different format than relational flat-table schemas. The response also says whether this saved schema is the deployed one: saved_schema_deployed is true when the last deploy applied it, false when it was saved after the last deploy (undeployed_changes then lists what deploying it would change), and null when no deployed schema is on record.
Check the status of adeploymentjobjob.(a create, deploy, promotion, rollback or deletion). STATUS VALUES: pending (jobqueued),runningprocessing (deploymentin progress), completed (success),failedfailed.(deploymentCallfailed).itTIMELINEuntil the status is completed or failed:Typicaleverydeploymentjobtakesends,2-5sinceminutes.aIfjobstatuswhose server stopped is'running'failedforwithin>10about three minutes,checkandget_project_infoafordeploydetailedcanpodtakestatus.up to 15 minutes. If status is 'failed', read error first: an error that starts with 'RationalBloks platform error' failed inside the platform, so nothing in the schema causes or fixes it (report it); any other failure is the project's: use get_project_info to see deployment errors and check ⟨9 unchanged words⟩
⟨69 unchanged words⟩ {table_name: {field_name: {type, properties}}}. The response also says whether this saved schema is the deployed one: saved_schema_deployed is true when the last deploy applied it, false when it was saved after the last deploy (undeployed_changes then lists what deploying it would change), and null when no deployed schema is on record.
⟨44 unchanged words⟩ API will be redeployed with the old schema. One operation runs on a project at a time: while another runs, the call is refused and the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
⟨48 unchanged words⟩ is useful when a schema change breaks deployment. One operation runs on a project at a time: while another runs, the call is refused and the refusal names the running job; wait for it with get_job_status, then call again. While RationalBloks is being updated, the call is refused with 'RationalBloks is being updated': call it again in a few minutes.
⟨64 unchanged words⟩ id here.","type":"string"},"description":{"description":"Optional project description","type":"string"},"name":{"description":"Project name","type ⟨35 unchanged words⟩
⟨12 unchanged words⟩ its own credentials and database. Requires paid plan. A deploy that drops data is refused until you pass confirm_destructive=true after reviewing the plan.
{"properties":{"confirm_destructive":{"description":"Set true only after reviewing the plan: a deploy that drops tables, columns, entities, relationships or fields is refused without it","type":"boolean"},"project_id":{"description":"Project ID (UUID) ⟨6 unchanged words⟩
{"destructiveHint":falsetrue,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false}
⟨49 unchanged words⟩ 2-5 minutes. Use get_graph_project_info to verify deployment succeeded. A deploy that drops data is refused until you pass confirm_destructive=true after reviewing the plan.
{"properties":{"confirm_destructive":{"description":"Set true only after reviewing the plan: a deploy that drops tables, columns, entities, relationships or fields is refused without it","type":"boolean"},"project_id":{"description":"Project ID (UUID) ⟨6 unchanged words⟩
{"destructiveHint":falsetrue,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false}
Promote staging to production (requires paid plan) A deploy that drops data is refused until you pass confirm_destructive=true after reviewing the plan.{"properties":{"confirm_destructive":{"description":"Set true only after reviewing the plan: a deploy that drops tables, columns, entities, relationships or fields is refused without it","type":"boolean"},"project_id":{"description":"Project ID (UUID) ⟨6 unchanged words⟩
{"destructiveHint":falsetrue,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false}
⟨86 unchanged words⟩ Use get_project_info to see if the deployment succeeded. A deploy that drops data is refused until you pass confirm_destructive=true after reviewing the plan.
{"properties":{"confirm_destructive":{"description":"Set true only after reviewing the plan: a deploy that drops tables, columns, entities, relationships or fields is refused without it","type":"boolean"},"project_id":{"description":"Project ID (UUID) ⟨6 unchanged words⟩
{"destructiveHint":falsetrue,"idempotentHint":false,"openWorldHint":true,"readOnlyHint":false}
⟨43 unchanged words⟩ ), and hierarchical entity nesting. Available templates: Start from Scratch (hierarchy, flat labels, every field type), Social Network (userspeople,postsorganizations, content, follows), Knowledge Graph (topicstopic hierarchy, articles, authors, concepts), Product Catalog (products, categories, suppliers, reviews).You can useEachtheseentry'stemplates'schema'directlygoeswithto create_graph_projector modify themasforisyourorneeds.adapted. TIP: Study these templates to understand the ⟨8 unchanged words⟩
⟨68 unchanged words⟩ uniqueness), __audit__ (append-only audit log), __admin_write__ (a table only admins write), and how user foreign keys are attributed on create.
⟨43 unchanged words⟩ for field naming and types. Available templates:E-commerceStart from Scratch (products,everyorders,fieldcustomerstype), TeamcollaborationCollaboration (projectsworkspaces,taskschannels,usersmessages, tasks),GeneralE-CommercepurposeStoretemplates.(customerYouprofiles,canproducts,useorderstheseandtemplatestheirdirectlylinewithitems, reviews, shipments). Each entry's 'schema' goes to create_project as is ormodifyadapted;themitsfor'tables'yournotesneeds.say how each table is authorized. TIP: Study these templates to understand the ⟨7 unchanged words⟩
⟨99 unchanged words⟩ deploy_graph_staging to apply changes 5. Monitor with get_job_status DRY RUN: pass dry_run=true to preview what a deploy WOULD change (renames, deletions) without saving. NOTE: This only saves the schema. You MUST ⟨5 unchanged words⟩
{"properties":{"dry_run":{"description":"Preview the planned migration (renames/deletions) without saving or deploying. Nothing is applied.","type":"boolean"},"project_id":{"description":"Project ID (UUID) ⟨20 unchanged words⟩