Skip to content

Commit 231f535

Browse files
committed
Merge remote-tracking branch 'origin/main' into claude/issue-21489-job-bodies
2 parents eb5e876 + 901e7cf commit 231f535

14 files changed

Lines changed: 1157 additions & 101 deletions
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
---
2+
'@objectstack/rest': patch
3+
---
4+
5+
Public forms on a walled tenancy posture: a form whose object is walled by an organization column is no longer offered to anonymous visitors. An anonymous submission carries no organization, and on a walled posture an insert into such an object without one is refused, so the form used to render and then answer `500 ERR_SYSTEM_WRITE_ORGANIZATION_REQUIRED` on every submit. Both anonymous form endpoints (`GET /forms/:slug` and `POST /forms/:slug/submit`) now answer it exactly as they answer a withdrawn form (`404 FORM_NOT_FOUND`), so an anonymous caller learns nothing about the deployment's tenancy. The administrator's read of the form (`GET /meta/view/:name`) states why in `_diagnostics.warnings`, located at the form's `sharing`, with the remedy: if the object's rows belong to no organization, declare `tenancy: { enabled: false }` on it. Forms bound to tenancy-disabled objects, and single-posture deployments, are unchanged.
6+
7+
Clause-②: no
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
---
2+
"@objectstack/cloud-connection": patch
3+
---
4+
5+
An install-local uninstall (`DELETE /api/v1/marketplace/install-local/:manifestId`) now withdraws the package from the running kernel
6+
7+
Clause-②: no
8+
9+
- The DELETE used to remove the ledger entry and run the uninstall cleanups, but it left the package registered in the running kernel until the next restart. So another package's hot install re-ran the declared-permission seeding over the uninstalled package too. Its permission set came back as a package-managed row, and that row survived the restart as an orphan that an administrator could grant.
10+
- After the ledger entry is removed, the door now calls `SchemaRegistry.uninstallPackage`, the same verb the protocol's own uninstall uses, on the same registry. It does this before the cleanups run. The package's objects answer 404 straight away, not only after a restart, and no reader of the registered packages counts it again. A reinstall of the same package in the same process registers it again.
11+
- If the registry refuses the withdrawal, for example because another package extends an object this package owns, the uninstall still succeeds and the cleanups still run. The refusal is reported as a failed `registry.uninstallPackage` entry in `cleanups`. The operator log carries the cause and the remedy.
12+
- The response `note` no longer says the kernel cannot unregister a package in place. The request and response keys are unchanged.

‎README.md‎

Lines changed: 26 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -4,17 +4,25 @@
44
![TypeScript](https://img.shields.io/badge/TypeScript-5.x-blue.svg)
55
[![Docs](https://img.shields.io/badge/docs-objectstack.ai-0a0a0a.svg)](https://objectstack.ai/docs)
66

7-
> ## Apps small enough for AI to hold whole.
7+
> ## The ontology is the software.
8+
>
9+
> **One executable business ontology.** AI writes it, the runtime runs it, agents
10+
> operate it, you own it.
11+
>
12+
> 本体即软件。一份可执行的业务本体。AI 写,运行时跑,Agent 用,归你所有。
813
>
914
> ObjectStack turns the whole app — data model, UI, workflows, permissions —
10-
> into typed metadata that fits in a single context window. Agents read it
11-
> whole, reason it whole, refactor it whole.
15+
> into typed metadata that fits in a single context window: apps small enough
16+
> for AI to hold whole. Agents read it whole, reason it whole, refactor it whole.
1217
>
1318
> That metadata is your **business ontology** — an open, versioned definition of
14-
> your objects, permissions, and flows that you own, not code scattered across a
15-
> framework. Strict TypeScript, Zod schemas, and a validation gate catch the
16-
> agent's mistakes at authoring time; the runtime derives the database, REST API,
17-
> UI, and MCP server, and enforces permissions and audit on every call.
19+
> your objects, relations, actions, permissions, flows, and agent and tool
20+
> definitions that you own, not code scattered across a framework. It is
21+
> executable, not a knowledge-representation ontology: no inheritance, no
22+
> axioms, no reasoner. Strict TypeScript, Zod schemas, and a validation gate
23+
> catch the agent's mistakes at authoring time; the runtime derives the
24+
> database, REST API, UI, and MCP server, and enforces permissions and audit on
25+
> every call.
1826
1927
`Fits in an agent's context` · `Typed, validated, governed` · `Self-host anywhere` · Apache-2.0
2028

@@ -152,7 +160,7 @@ The reason this works is the same reason TypeScript was the right host language:
152160
**an agent's errors become located, corrective text it can read and fix itself**,
153161
in seconds — instead of a silent runtime failure nobody traces back.
154162

155-
The other half is size. The bundled example CRM — [`examples/app-crm`](./examples/app-crm):
163+
The other half is size: apps small enough for AI to hold whole. The bundled example CRM — [`examples/app-crm`](./examples/app-crm):
156164
objects, views, a dashboard, a lead-conversion flow, permission sets, actions,
157165
translations — is small enough for an agent to load end-to-end, reason about
158166
every dependency, and refactor across data, API, UI, and permissions in one
@@ -163,9 +171,18 @@ hoping. Measure it yourself:
163171
find examples/app-crm/src -name '*.ts' -not -name '*.test.ts' | xargs cat | wc -l
164172
```
165173

166-
> Your objects, permissions, and flows are your business ontology — and the
174+
> The ontology is the software. Your objects, relations, actions, permissions,
175+
> flows, and agent and tool definitions are your business ontology — and the
167176
> definition layer of the AI era should be an open protocol you own.
168177
> [Read why](https://www.objectos.ai/en/blog/ai-ontology-open-protocol/).
178+
>
179+
> What that does and does not mean: the ontology is *executable*, so it is
180+
> validated rather than reasoned over — there is no object inheritance, no
181+
> axioms and no reasoner. It is not a semantic layer over your existing systems
182+
> (federating an external datasource is read-only by default and early). Views,
183+
> dashboards, apps, and translations are projections of the ontology, not part
184+
> of it. And code does not disappear: it moves into the runtime — hooks, action
185+
> bodies, CEL, and constrained JSX.
169186
170187
## Your app is AI-operable, for free
171188

‎apps/docs/app/[lang]/page.tsx‎

Lines changed: 17 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,7 @@ const mono = IBM_Plex_Mono({
3333

3434
const HOME_TITLE = 'Metadata framework for AI-written apps';
3535
const HOME_DESCRIPTION =
36-
'ObjectStack turns the whole app — data model, UI, workflows, permissions — into typed metadata that fits in a single context window.';
36+
'One executable business ontology. AI writes it, the runtime runs it, agents operate it, you own it. The whole app — data model, UI, workflows, permissions — is typed metadata small enough for AI to hold whole.';
3737

3838
/**
3939
* The homepage's metadata. Its social card is the shared hero cover,
@@ -212,15 +212,16 @@ export default function HomePage() {
212212
className="mx-auto mt-5 max-w-3xl text-[2.6rem]/[1.06] font-bold tracking-tight text-balance md:text-6xl/[1.04]"
213213
style={{ fontFamily: 'var(--l-display)' }}
214214
>
215-
Apps small enough{' '}
215+
The ontology{' '}
216216
<span className="block bg-gradient-to-r from-indigo-500 to-purple-500 bg-clip-text text-transparent dark:from-indigo-400 dark:to-purple-400">
217-
for AI to hold whole.
217+
is the software.
218218
</span>
219219
</h1>
220220
<p className="mx-auto mt-6 max-w-2xl text-lg text-fd-muted-foreground text-pretty">
221-
ObjectStack turns the whole app — data model, UI, workflows, permissions — into
222-
typed metadata that fits in a single context window. Agents read it whole, reason
223-
it whole, refactor it whole.
221+
One executable business ontology. AI writes it, the runtime runs it, agents operate
222+
it, you own it. The whole app — data model, UI, workflows, permissions — is typed
223+
metadata small enough for AI to hold whole: agents read it whole, reason it whole,
224+
refactor it whole.
224225
</p>
225226
<div className="mt-8 flex flex-wrap items-center justify-center gap-3">
226227
<Link
@@ -294,10 +295,12 @@ export default function HomePage() {
294295
{/* ── what that metadata is, in prose ──────────────────── */}
295296
<section className="relative mx-auto w-full max-w-5xl px-6 pt-12 md:pt-14">
296297
<p className="text-base text-fd-muted-foreground text-pretty">
297-
That metadata is your business ontology — an open, versioned definition you own.
298-
Strict TypeScript, Zod schemas, and a validation gate catch the agent&apos;s mistakes
299-
at authoring time, and the runtime derives the database, REST API, UI, and MCP
300-
server — permissions and audit enforced on every call.
298+
That metadata is your business ontology — an open, versioned definition of your
299+
objects, relations, actions, permissions, flows, and agent and tool definitions that
300+
you own. It is executable, not a knowledge-representation ontology: no inheritance,
301+
no axioms, no reasoner. Strict TypeScript, Zod schemas, and a validation gate catch
302+
the agent&apos;s mistakes at authoring time, and the runtime derives the database,
303+
REST API, UI, and MCP server — permissions and audit enforced on every call.
301304
</p>
302305
</section>
303306

@@ -447,8 +450,10 @@ export default function HomePage() {
447450
<section className="relative mx-auto w-full max-w-6xl px-6 pt-8 pb-20 md:pb-28">
448451
<div className="rounded-xl border border-fd-border bg-fd-card/60 px-6 py-8 text-center md:px-10">
449452
<p className="mx-auto max-w-2xl text-sm text-fd-muted-foreground text-pretty">
450-
Your objects, permissions, and flows are your business ontology — the definition
451-
layer of the AI era should be an open protocol you own.{' '}
453+
The ontology is the software. Your objects, relations, actions, permissions, and
454+
flows are your business ontology — views, dashboards, apps, and translations are
455+
projections of it, and the definition layer of the AI era should be an open
456+
protocol you own.{' '}
452457
<a
453458
href="https://www.objectos.ai/en/blog/ai-ontology-open-protocol/"
454459
className="inline-flex items-center gap-1 font-medium text-fd-foreground underline underline-offset-4 transition-colors hover:text-fd-primary"

‎content/docs/concepts/index.mdx‎

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -94,6 +94,11 @@ From this single definition, ObjectStack automatically:
9494
2. **The API is a Consequence** — REST endpoints appear automatically from object definitions
9595
3. **The Schema is the Application** — Your entire business logic lives in metadata files
9696

97+
In the enterprise-AI vocabulary, the ontology is the software: the core (objects,
98+
relations, actions, permissions, flows, agent and tool definitions) is what the runtime
99+
executes, and views, dashboards, apps, and translations are projections of it. See
100+
[Business Ontology](/docs/getting-started/glossary#business-ontology).
101+
97102
### When to Use Metadata-Driven
98103

99104
✅ **Great for:** CRUD apps, SaaS platforms, admin panels, rapid prototyping, multi-tenant systems

‎content/docs/concepts/metadata-driven.mdx‎

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,14 @@ Your entire business logic lives in:
151151

152152
The Kernel simply **interprets** these definitions.
153153

154+
In the enterprise-AI vocabulary, the ontology is the software. The ontology core is
155+
objects, relations, actions, permissions, flows, and agent and tool definitions; views,
156+
dashboards, apps, and translations are projections of it, not ontology. The ontology is
157+
executable, so it is validated rather than reasoned over — there is no inheritance, no
158+
axioms and no reasoner — and code does not disappear, it moves into the runtime (hooks,
159+
action bodies, CEL, constrained JSX). See
160+
[Business Ontology](/docs/getting-started/glossary#business-ontology).
161+
154162
### 4. The Tool Surface is Generated
155163

156164
**Traditional:** Every AI tool is manually described and wired to custom queries

‎content/docs/getting-started/glossary.mdx‎

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -91,8 +91,20 @@ arrived from that vocabulary, this is the term's referent here: the **Source** y
9191
which the runtime derives the database schema, REST API, UI, and MCP server. See
9292
[Metadata-Driven Development](/docs/concepts/metadata-driven).
9393

94-
The word is worth stating explicitly because ObjectStack's differs from the hosted
95-
ontologies the category otherwise means by it, on two points:
94+
The slogan this reduces to is **the ontology is the software**, and the word is worth
95+
stating explicitly because ObjectStack's differs from what the term otherwise means, in
96+
two directions.
97+
98+
**Against a knowledge ontology** (OWL, RDF, a knowledge graph): a knowledge ontology
99+
*describes* a domain, is read-only to the systems that consult it, and is *reasoned over*
100+
by an inference engine. An executable ontology *defines* the app, is *run* by the
101+
runtime, and is *validated* rather than reasoned. ObjectStack has no object inheritance,
102+
no axioms and no reasoner (the `abstract` key was removed from the spec for exactly that
103+
reason, ADR-0049), and it is not a semantic layer over your existing systems —
104+
federating an external datasource is read-only by default and early (see
105+
[External Datasources](/docs/data-modeling/external-datasources)).
106+
107+
**Against a hosted ontology** (a graph held inside a vendor's system), on two points:
96108

97109
* **You own the definition.** It lives in your repository as ordinary TypeScript,
98110
versioned in your VCS and reviewable as a diff, in a format specified and licensed
@@ -104,6 +116,12 @@ ontologies the category otherwise means by it, on two points:
104116
of behaviour implemented somewhere else, so it cannot drift from the system it
105117
describes.
106118

119+
**Core and projections.** The ontology core is objects, relations, actions,
120+
permissions, flows, and agent and tool definitions. Views, dashboards, apps, and
121+
translations are *projections* of that core — authored in metadata too, but not
122+
ontology. And code does not disappear: it moves into the runtime, as hooks, action
123+
bodies, CEL expressions, and constrained JSX.
124+
107125
Distinct from **semantic layer**, which in these docs means the narrower analytics
108126
`dataset` layer (ADR-0021) that reports and dashboards bind to — see
109127
[Analytics & Datasets](/docs/data-modeling/analytics).

0 commit comments

Comments
 (0)