Skip to content

docs: publish 'The Ontology Is the Software' on the blog, add a Blog entry to the docs nav and home, point README's 'Read why' at it, and bridge the two 2024 posts #21838

Closed

Description

@objectstack-fleet

立卡门类别 ③ — 维护者直派的任务 (maintainer-directed task).

Maintainer ruling (verbatim, untranslated)

新的项目定位,是否建议写一篇深度的blog,而且目前 blog 官网是否应该在主页加上链接 https://objectstack.ai/blog

先把文章草稿写出来

同意,派发

Given in session https://claude.ai/code/session_011hRnra93sK5Q2gTYYTbdJR on 2026-10-05. The maintainer reviewed the draft, ruled that analyst (consulting-firm) opinions are not cited, and approved the text below for publication. The article is approved copy: land it byte-exact apart from what MDX compilation itself forces, and list any such edit in the report.

Why

The slogan now leads the README, the docs landing page, the glossary and the concepts pages (#21574, #21586), but the argument behind it has no long-form home. The README's "You own it" quote still sends readers to a post on the commercial site. The blog at /blog exists (three posts, index sorted newest first, in the sitemap) and nothing links to it: the shared nav has only the title and the GitHub link, the home page's buttons are Get started, Docs, GitHub and YouTube, and the closing card links the external post. This card publishes the defining essay on objectstack.ai/blog and gives the blog its entry points.

Part A. The post

Create content/blog/the-ontology-is-the-software.mdx with exactly the content in the fenced block at the end of this card (frontmatter included). The same bytes sit in this container at /tmp/claude-0/-home-user-objectstack/1ddacfa2-cbe3-50df-b1b3-5e4cbf5ac646/scratchpad/blog/the-ontology-is-the-software.mdx (sha256 prefix e760438e91b318fd); the fenced block is the authority if the two ever differ. Frontmatter fields are the ones the blog page reads: title, description, author, date, tags. Keep date 2026-10-05; if the PR lands on a later day, set date to the landing day so the index order and the JSON-LD datePublished are honest. The index sorts newest first, so the post must appear first at /blog.

Part B. Entry points

B1. Shared nav, apps/docs/lib/layout.shared.tsx: add a Blog item to baseOptions so every page's header carries it. fumadocs-ui 16.14.4 BaseLayoutProps takes links (LinkItemType); verify the exact shape against the installed d.ts under apps/docs/node_modules/fumadocs-ui/dist/layouts/shared/ before writing, and confirm which layouts consume baseOptions. If the home page renders its own header rather than the fumadocs layout, add a Blog link to the home hero's button row (apps/docs/app/[lang]/page.tsx, the row that holds Get started, Docs, GitHub, YouTube) so the home page also carries the entry.

B2. Home closing card, apps/docs/app/[lang]/page.tsx around line 453: the "Read why" link currently points at https://www.objectos.ai/en/blog/ai-ontology-open-protocol/. Point it at /blog/the-ontology-is-the-software and adjust the sentence so it reads as a pointer to the essay. Do not leave the external post linked from the home page.

B3. README.md, the blockquote under "You own it": the "Read why" link currently points at the same objectos.ai post. Point it at https://objectstack.ai/blog/the-ontology-is-the-software. Nothing else in the README changes.

Part C. Bridge the two 2024 posts

content/blog/metadata-driven-architecture.mdx and content/blog/protocol-first-development.mdx predate the slogan and keep the vocabulary of their time. Add one italic editor's note as the first body paragraph of each, right after the frontmatter, and change nothing else in them:

  • metadata-driven-architecture.mdx: Editor's note, October 2026: this post predates the project's current positioning, the ontology is the software, and uses the metadata-driven vocabulary of its time. Read it as the lineage; the current statement is The Ontology Is the Software.
  • protocol-first-development.mdx: Editor's note, October 2026: this post predates the project's current positioning, the ontology is the software, and argues the protocol-first half of it. Read it as the lineage; the current statement is The Ontology Is the Software.

Guardrails for the author

  • Docs only. No packages/** change, never content/docs/references/** (generated), content/docs/releases/** (release-owned) or any CHANGELOG.md. No binary files.
  • The article is approved copy. No rewording, no added citations, no analyst or consulting-firm quotes (the maintainer ruled them out), no model identifiers. The four facts it already states stay as written: no inheritance, axioms or reasoner; not a semantic layer; projections are not ontology; code moves into the runtime.
  • MDX: the article uses plain Markdown and fenced code only. If the MDX compiler rejects anything, make the minimal edit and name it in the report with the compiler's message.
  • The docs build (pnpm --filter @objectstack/docs build) and the doc gates must stay green; derive the gate list with scripts/pm/dispatch-gates.mjs from the real change set. scripts/docs-audit/handwritten-docs.json lists content/docs only today (0 entries under content/blog); run check:docs-audit-scope and register the post only if that gate asks for it.
  • The README and home links target a page that goes live when the docs site deploys from main; docs: positioning follow-up: home title, cover re-render, README on the four promises, Business Ontology page #21591 landed a README link of the same kind with check:published-readme-links green. Run that gate and report its reading; do not rewrite the link to work around it.
  • Changeset: nothing publishes; skip-changeset applies once packages/** is confirmed untouched.

Non-goals

  • A Chinese version of the essay (published elsewhere by the maintainer).
  • A separate post on how the platform is built by an AI fleet.
  • The GitHub repository description and the 90-second video (out of git).

Who acts

domain:devx lane, this seat, one os-dev dispatch at the default tier (the copy is supplied; the work is wiring and two editor's notes), one docs-only draft PR. Precedent on the same files: #21586 landed by #21591 earlier (README, page.tsx), base for this work is origin/main at 088428f.

Duplicate check (2026-10-05, open and closed)

The post, byte-exact

---
title: "The Ontology Is the Software"
description: "Enterprise software has changed its interface three times and its user never. Agents are the first new user in forty years, and what they need is not an API but an ontology — one the runtime can run, AI can write, agents can operate, and the enterprise owns."
author: ObjectStack Team
date: 2026-10-05
tags: [ai, ontology, architecture, positioning, agents]
---

Enterprise software has changed its interface three times. Terminals and forms,
where people adapted to the software. Web and mobile, where the software adapted
to people. And now a conversation box, where the software seems to disappear
into language. Through all three, one thing never changed: the user was a
person. The API was written for a programmer, the documentation for a reader,
the audit log for an auditor.

That is the part that changes now, and it changes more than the interface ever
did. The first user of the next generation of enterprise software is an agent.
Objects are tools. Actions are tools. Permissions decide what an agent may call,
and audit records what it did. A conversation box is only the place where a
person talks to *their* agent; what the agent then talks to is the enterprise.

So the question is not what the next interface looks like. It is what an
enterprise has to be, so that an agent can read it, run it, and be stopped by
it. Our answer is a single sentence that now opens this project's README:

> **The ontology is the software.** One executable business ontology. AI writes
> it, the runtime runs it, agents operate it, you own it.

This post is the long form of that sentence: what we mean by the word, why code
recedes, why this is possible now and was not five years ago, which mechanisms
back each of the four promises, what the ontology is *not*, and what we have not
figured out.

## What an enterprise actually wants to say

Strip any business application down to what the business meant by it, and you
get one sentence with five parts: *what we have, how it relates, what can be
done to it, who may do it, and what happens when.*

- **What we have** — the objects and their fields. A ticket has a subject, a
  priority, a status, a due date.
- **How it relates** — lookups and master-detail links. A ticket belongs to an
  account; a line item belongs to an order.
- **What can be done** — actions. *Resolve* a ticket; *convert* a lead.
- **Who may do it** — permissions. Role-based access, row-level and field-level
  security, sharing rules.
- **What happens when** — flows. A record trigger, a scheduled job, an approval
  chain, a workflow state machine.

That sentence is the enterprise's **business ontology**. For forty years it has
been translated into code: the same "phone number is required" intent restated as
a database constraint, an ORM annotation, a form validator, and a line in the
API documentation, four places that drift independently. The codebase is not the
business; it is the business's translation into the only form a computer could
run.

Here is the same sentence written once, as ObjectStack reads it:

```ts
import { ObjectSchema, Field } from '@objectstack/spec/data';

export const Ticket = ObjectSchema.create({
  name: 'support_desk_ticket',
  label: 'Ticket',
  sharingModel: 'private',
  fields: {
    subject: Field.text({ label: 'Subject', required: true, searchable: true }),
    status: Field.select({
      label: 'Status',
      required: true,
      options: [
        { label: 'Open', value: 'open', default: true },
        { label: 'Resolved', value: 'resolved' },
      ],
    }),
    due_date: Field.date({ label: 'Due Date' }),
  },
});
```

The moment that object exists, its table exists, its REST endpoint exists, its
list and form views exist, and its MCP tool exists. Nobody writes the
controller. The ontology is not a design document that a codebase then
implements. It is the thing that runs.

Two boundaries keep the word honest, and we state them every time we use it.
First, the ontology core is those five things plus the agent and tool
definitions an app ships with. Views, dashboards, apps, and translations are
authored in metadata too, but they are **projections** of the core, not part of
it: change the core and the projections follow; delete a projection and the
business it showed is unchanged. Second, this is an **executable** ontology, not
a knowledge-representation one. There is no class inheritance, no axioms, no
reasoner. The definition is validated, then run.

## Why code recedes

Code is the ontology's translation. For as long as translation had to be done by
hand, the translation *was* the product: the thing you hired for, the thing you
maintained, the thing that rotted. Three things follow once the translation can
be skipped.

**The ontology becomes the asset and the code becomes a derivative.** A runtime
that executes the definition directly, or a toolchain that generates the
derivatives on demand, turns the codebase into something you no longer hand-
write, the way nobody hand-writes assembly. Code does not disappear. It moves
*into the runtime*: the driver that maps an object to a Postgres table, the
server that mounts the endpoint, the enforcement of a permission on every call.
What remains in the application itself is small and declared: hooks and action
bodies, CEL expressions in formulas and predicates, constrained JSX for custom
pages that is parsed into a UI tree and never executed as code.

**The whole system becomes small enough to be held.** The bundled example CRM in
this repository — accounts, contacts, leads, opportunities, activities, views, a
dashboard, a lead-conversion flow, permission sets, actions, translations — is
31 files and roughly sixteen thousand tokens. That is the whole application, not
a module of it. An agent can load it end to end, answer *what breaks if I change
this*, and refactor across data, API, UI, and permissions in a single change.
We wrote about why that number is the one that matters in
[The Constraint Isn't Typing Speed. It's the Context Window.](/blog/context-window-is-the-constraint)
This post is its successor: once the system fits, the question becomes what the
system *is*.

**The definition becomes checkable in a way code never was.** A codebase can
only be run. A definition can be validated: `os validate` parses every CEL
predicate, checks that each `record.field` resolves, verifies every widget
binding, and refuses a missing security posture, with a located, corrective
message an agent can read and fix. Most AI mistakes in metadata type-check and
then fail silently at runtime; a gate that rejects them at authoring time is
what makes "AI writes it" survivable.

## Why now

None of this was possible five years ago, and three conditions had to mature at
the same time.

1. **Models read and write structured definitions.** A language model that can
   author a typed, validated schema from a sentence of business language, and
   fix its own located errors, turns "AI writes it" from a demo into a loop.
2. **The context window holds an enterprise's ontology.** When the definition
   of a whole business system fits in one window, the agent is no longer
   grepping and hoping. It reasons about the whole.
3. **Agents can operate the definition directly.** The Model Context Protocol
   gave agents a standard way to call tools. An ontology whose objects and
   actions *are* tools is what makes that call mean something.

Andrej Karpathy's framing of the third generation of software is that the
context window is the program. For enterprise software, we think the program is
the ontology, and the context window is where it is read.

## Four promises, four mechanisms

The slogan is a stance. The descriptor under it is a set of promises, and each
promise is a mechanism you can inspect in this repository.

### The runtime runs it

From the compiled artifact the runtime **derives** the database schema on an
interchangeable driver, a generated REST and realtime API, server-driven UI for
the Console, and an MCP server. And it **enforces** the definition on every
call: RBAC, row-level and field-level security, sharing, and audit apply to a
REST request, a Console click, and an agent's tool call alike. Nothing is
reasoned over at runtime. What runs is what was validated.

### AI writes it

The scaffolder installs the AI skills bundle and writes an `AGENTS.md`, so a
coding agent starts with the protocol's rules loaded rather than with generic
"write me some TypeScript" priors. The agent writes the definition. Four gates
stand between it and production: strict TypeScript and Zod catch shape errors
in the editor; `os validate` catches the mistakes that type-check and would fail
silently; a human approves a small, readable diff in the Console; and the
runtime's governance means that even a wrong app stays inside the fence. The
division of labor is deliberate: the agent handles the mechanical, error-prone
surface, and the person handles the one question no schema can check, *did it
build the thing I meant?*

### Agents operate it

Because the app is typed metadata, the runtime serves it as an MCP server, on by
default. Point any MCP client at it and an agent can inspect and operate the
app, under the same permissions and row-level security as a human. Objects are
exposed automatically; actions opt in with `ai: { exposed: true }`. An agent's
reach is exactly what the ontology says it is, which is the only kind of agent
an enterprise can afford to let loose. An agent needs an ontology; a tool
surface that is not one is a liability, and a chat box bolted onto a REST API
is the most common way to build one.

### You own it

The ontology lives in your repository as ordinary TypeScript, versioned in your
VCS, reviewable as a diff, compiled into a checksummed artifact, specified and
licensed Apache-2.0. Change the runtime, change the model, change the vendor,
and the definition comes with you. The conversation boxes will converge; the
agents will multiply; the one thing an enterprise truly owns, and only needs to
own, is this definition. The more specific your business is, the less of it any
model has seen, and the more the ontology is worth. That is also the strongest
reason not to let anyone else hold it.

## What it is not

The word "ontology" carries two thousand years of philosophy and thirty years of
knowledge engineering, and most of what the enterprise-AI market means by it
today is something else. Being precise is what keeps the claim defensible.

**Not a knowledge ontology.** In Gruber's 1993 definition an ontology is "an
explicit specification of a conceptualization"; in OWL and RDF it carries class
hierarchies and axioms and is reasoned over by an inference engine. Guarino's
1998 program of *ontology-driven information systems* put ontologies at the
center of system design, but as a description to design against, not a thing to
run. ObjectStack's ontology describes nothing in general. It is one business's
application, defined precisely enough to execute, and the `abstract` key was
removed from the spec for exactly that reason.

**Not the industry's semantic layer.** Palantir's Ontology, and the semantic
layers now being built into Databricks, Snowflake, and their peers, map
existing systems onto business concepts so that an agent can reason about them.
They are read-mostly, and the systems they describe live elsewhere. Our ontology
*is* the system; federating an external datasource into it is possible,
read-only by default, and early.

**Not Salesforce's metadata, either, though that is the closest ancestor.**
Weissman and Bobrowski's 2009 paper on the Force.com multitenant architecture
described a compiled runtime kernel executing per-tenant metadata, and it worked
at scale. What it was not: an open format, a thing you could take with you, or a
thing written for an agent to read. Each of the four lineages above holds one or
two of the four promises. Holding all four in one definition is the position
this project occupies.

## What we have not figured out

A positioning statement that admits no open problems is marketing. These are
ours.

**The size ceiling.** "Small enough to hold whole" is a measured fact for a
CRM and an argument for an enterprise. Context windows grow, and the core versus
projection split bounds what an agent must load, but an ontology with hundreds
of objects will test the claim. We would rather state the limit than hide it.

**Responsibility.** When an agent acts inside the fence and the outcome is still
wrong, the fence did its job and someone is still accountable. Our working rule
is that reversible actions go to agents and irreversible ones stay with people,
and that the boundary is written into the definition, not left to judgment at
runtime. It is a rule, not a solution.

**Interoperability.** One enterprise, one ontology is the easy case. Two
enterprises whose agents need to transact is where an open protocol stops being
a principle and becomes infrastructure. The format is open; the shared
vocabulary is not yet there.

**Classification is power.** Who gets to define what a "customer" is was a
philosophical question for two millennia and is a departmental one in every
company. Making the ontology explicit does not settle that argument. It moves it
into a diff, where at least it can be seen.

## Where this leaves the stack

Everything in this repository is the open stack: protocol, microkernel, SDK,
CLI, and the production runtime, Apache-2.0 with no open-core asterisks. You
build and ask with Claude Code or any coding agent; the agent writes the
ontology in your repo and operates the running app over MCP. The same loop,
hosted, is [ObjectOS](https://www.objectos.ai).

Start with one object:

```bash
npm create objectstack@latest my-app && cd my-app
```

Describe the business in plain language, let the agent write the definition, run
`npm run validate`, open the Console, and then connect an agent:

```bash
claude mcp add --transport http my-app http://localhost:3000/api/v1/mcp
```

What you will have is not an app that AI happened to write. It is an ontology
the runtime runs, AI can write, agents can operate, and you own. The ontology is
the software.

---

*Further reading.* Thomas R. Gruber, "A Translation Approach to Portable
Ontology Specifications" (1993). Nicola Guarino, "Formal Ontology and
Information Systems" (FOIS 1998). Craig D. Weissman and Steve Bobrowski, "The
Design of the Force.com Multitenant Internet Application Development Platform"
(SIGMOD 2009). In this documentation: [Business Ontology](/docs/concepts/ontology),
[How AI Development Works](/docs/getting-started/how-ai-development-works),
[Connect an MCP Client](/docs/ai/connect-mcp).

Generated by Claude Code

Activity

  1. added
    documentationImprovements or additions to documentation
    pm:queueReady for the PM dispatch loop
    domain:devxDomain lane — seat card indexed by label:pm:seat
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Oct 5, 2026
  2. objectstack-fleet commented on Oct 5, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_011hRnra93sK5Q2gTYYTbdJR
    Account: hotlong (the seat's linked user as GET /user answers it; the card's assignee; the maintainer's own session, dispatching on the maintainer's direct instruction)
    Branch: claude/issue-21838-ontology-blog-post (cut from origin/main 8832655af2)
    Worktree: objectstack-issue-21838
    Domain: domain:devx
    Seat: domain:devx#2
    File surface: content/blog/the-ontology-is-the-software.mdx (new); content/blog/metadata-driven-architecture.mdx and content/blog/protocol-first-development.mdx (one editor's-note paragraph each); apps/docs/lib/layout.shared.tsx (Blog nav item); apps/docs/app/[lang]/page.tsx (closing-card link, and the hero button row only if the home page does not consume the shared nav); README.md (the one "Read why" link under "You own it"); scripts/docs-audit/handwritten-docs.json only if check:docs-audit-scope demands it. ⛔ No packages/, no content/docs/references/, no content/docs/releases/**, no CHANGELOG.md, no binaries. Stop on a breach and explain it in the report.
    Container & model: M (one new post of approved copy, two notes, three link edits, one docs build), mode:subagent, model: opus (the default judgment tier; this card's --tier run printed no path-derived mandate, "floor sonnet · default opus · ceiling fable")
    Clause-②: no
    Thread-read: none
    Serial constraints cleared: board read at 2026-10-05T07:35Z. Open PRs at the read are #21832 and #21813, neither touching content/blog, apps/docs or README.md. #21586 (same README and page.tsx surfaces) is closed, landed as d2e687f on main, so the branch starts from a main that already carries it. No other devx claim is in flight on these files.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 5, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 21838,
    "status": "done",
    "branch": "claude/issue-21838-ontology-blog-post",
    "pr": "#21843",
    "session": "session_011hRnra93sK5Q2gTYYTbdJR",
    "premise_still_valid": true,
    "summary": "Part A: content/blog/the-ontology-is-the-software.mdx landed byte-exact from the card's fenced block; MDX compiled with no edit. Part C: the card's two editor's notes added verbatim as the first body line of each 2024 post (+1 line each, nothing else). Part B: Blog link added to baseOptions().links (shape read from fumadocs-ui 16.14.4 shared/index.d.ts; consumed by DocsLayout and by HomeLayout on home and on both blog branches, so the hero button row is untouched); home closing card now reads 'Read the long form:' linking /blog/the-ontology-is-the-software (the objectos.ai post is no longer linked from home); README 'Read why' now targets https://objectstack.ai/blog/the-ontology-is-the-software. Draft PR #21843 opened, labelled skip-changeset, assigned hotlong; CI in_progress at report time (not awaited).",
    "post_sha256": {
    "card_fenced_block": "e760438e91b318fd854606ecb897c06b841c3af3c864846671bc8dfdb697631c",
    "scratch_copy": "e760438e91b318fd854606ecb897c06b841c3af3c864846671bc8dfdb697631c",
    "committed_blob_at_HEAD": "e760438e91b318fd854606ecb897c06b841c3af3c864846671bc8dfdb697631c",
    "result": "all three equal"
    },
    "mdx_forced_edits": "none: the docs build compiled the post unchanged, so there is no compiler message to report",
    "files_changed": [
    "README.md (+1/-1)",
    "apps/docs/app/[lang]/page.tsx (+5/-5)",
    "apps/docs/lib/layout.shared.tsx (+3)",
    "content/blog/metadata-driven-architecture.mdx (+1)",
    "content/blog/protocol-first-development.mdx (+1)",
    "content/blog/the-ontology-is-the-software.mdx (+288, new)"
    ],
    "packages_changed": 0,
    "head": "92eda4bde9fe161a45c5dad3fbc85d0901231151",
    "base": "8832655af282e88046dc699747c4930fa94bd361",
    "gates": [
    "node scripts/check-ci-filter-parity.mjs :: exit 0",
    "node scripts/check-closing-keyword-parity.mjs :: exit 0",
    "node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0",
    "node scripts/check-comment-mask-corpus.mjs :: exit 0",
    "node scripts/check-doc-frontmatter.mjs :: exit 0",
    "node scripts/check-doc-frontmatter.mjs --self-test :: exit 0",
    "node scripts/check-docs-nav-label.mjs :: exit 0",
    "node scripts/check-docs-nav-label.mjs --self-test :: exit 0",
    "node scripts/check-keyed-text-bounds.mjs :: exit 0",
    "node scripts/check-keyed-text-bounds.mjs --self-test :: exit 0",
    "node scripts/check-registry-log-declared.mjs :: exit 0",
    "node scripts/check-registry-log-declared.mjs --self-test :: exit 0",
    "node scripts/check-rest-log-spy-declared.mjs :: exit 0",
    "node scripts/check-rest-log-spy-declared.mjs --self-test :: exit 0",
    "node scripts/check-undeclared-dep-imports.mjs :: exit 0",
    "node scripts/check-undeclared-dep-imports.mjs --self-test :: exit 0",
    "pnpm check:cross-package-test-inputs :: exit 0",
    "pnpm check:doc-anchors :: exit 0",
    "pnpm check:doc-authoring :: exit 0",
    "pnpm check:docs-locale-catch-all :: exit 0",
    "pnpm check:driver-memory-census :: exit 0",
    "pnpm check:gitlink-declared :: exit 0",
    "pnpm check:logger-receiver-detach :: exit 0",
    "pnpm check:nul-bytes :: exit 0",
    "pnpm check:org-identifier :: exit 0",
    "pnpm check:page-declaration-shape :: exit 0",
    "pnpm check:published-files :: exit 0",
    "pnpm check:refd-timer-probe :: exit 0",
    "pnpm check:test-source-alias :: exit 0",
    "pnpm check:tier-file-adoption :: exit 0",
    "pnpm check:watch-hint-literal :: exit 0",
    "pnpm check:docs-single-h1 :: exit 0",
    "pnpm check:published-readme-links :: exit 0",
    "pnpm check:docs-redirects :: exit 0",
    "pnpm check:docs-audit-scope :: exit 0",
    "node scripts/check-doc-route-spelling.mjs --advisory :: exit 0",
    "node scripts/check-section-landing-index.mjs :: exit 0",
    "pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0 (first run exit 3 PREREQUISITE NOT MET, @objectstack/lint and @objectstack/formula unbuilt: NOT MEASURED; re-run after the lint+formula build)",
    "pnpm check:docs-transcript-drift :: exit 0 (first run exit 3 PREREQUISITE NOT MET, @objectstack/lint and @objectstack/formula unbuilt: NOT MEASURED; re-run after the lint+formula build)",
    "pnpm --filter @objectstack/lint run check:doc-security-posture :: exit 0 (first run exit 3 PREREQUISITE NOT MET, @objectstack/lint and @objectstack/formula unbuilt: NOT MEASURED; re-run after the lint+formula build)",
    "pnpm --filter '@objectstack/docs^...' build (verify lock) :: exit 0 :: os-verify-lock: VERDICT command-exit 0 · held the lock 91s",
    "pnpm --filter @objectstack/docs build (verify lock) :: exit 0 :: os-verify-lock: VERDICT command-exit 0 · held the lock 153s (2m33s); route list includes /en/blog/the-ontology-is-the-software; tree clean after (gen:schema/gen:docs wrote nothing tracked)",
    "pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint --concurrency=2 (verify lock) :: exit 0 :: os-verify-lock: VERDICT command-exit 0 · held the lock 92s; Tasks 4 successful",
    "pnpm --filter @objectstack/docs typecheck (verify lock) :: exit 0 :: os-verify-lock: VERDICT command-exit 0 · held the lock 5s; tsc --noEmit --listFiles lists both touched TSX among 1252 files",
    "eslint --no-inline-config --format json apps/docs/lib/layout.shared.tsx apps/docs/app/[lang]/page.tsx :: exit 0 :: 2 files, 0 errors, 0 warnings (eslint v10.11.0)",
    "node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran ran.txt :: exit 0 :: 32 derived famil(ies) accounted for — 32 run, 0 NOT-MEASURED (a DERIVED zero — all 32 recorded an exit code and none of them is 3)"
    ],
    "tests": "All readings at HEAD 92eda4b. No unit tests apply (docs-only; apps/docs has no test files). Docs build VERDICT command-exit 0. next start on a random high port (PID recorded, process group killed after, port confirmed down): GET /blog 200 with h2 order [The Ontology Is the Software, The Constraint Isn't Typing Speed..., Protocol-First Development..., The Architecture of Metadata-Driven Systems...]; post page 200, one h1, seven h2, JSON-LD datePublished 2026-10-05T00:00:00.000Z. Prerendered HTML: href=/blog Blog anchor in the header of en.html and of each post page and in the docs sidebar; essay link in en.html (1) and in each 2024 post (1); ai-ontology-open-protocol occurrences in en.html 0. eslint narrowing evidence: (1) population read from eslint's own config via ESLint.calculateConfigForFile/isPathIgnored: both files in population, not ignored, 3 enabled rules each; (2) file count from --format json: 2 files, 0 errors, 0 warnings; (3) invariance: parserOptions.project and projectService read back null for both files, so type-aware linting is off and per-file verdicts cannot move for untouched files; README/MDX are outside eslint's files globs. Gate readings: check:published-readme-links '221 outbound link(s) across 101 published markdown file(s): 0 root-relative, 0 non-canonical origin(s), 27 docs-site page(s) resolved (0 via redirect), 1 anchor(s) verified, 144/144 relative target(s) found in the tree.' (link not rewritten); check:docs-audit-scope '198 hand-written doc(s)' in sync, no blog registration asked, handwritten-docs.json untouched; check-doc-frontmatter 'content/blog (blogSchema, floor 1): 4 page(s) parse'.",
    "deviations": [
    "Commit trailers use the model-free pair from AGENTS.md (Claude-Session + Co-authored-by: Claude), and the PR footer uses the AGENTS.md session-URL form. The harness reminder's model-named Co-Authored-By trailer and emoji footer were not used, per that reminder's own precedence clause.",
    "The docs build ran as a detached shell with its PID recorded, inside the verify lock, and was waited on in the foreground with tail --pid until it exited (exit file read, 0). No watcher was left behind.",
    "Three lint-package gates first exited 3 (prerequisite: lint and formula unbuilt). They are recorded as NOT MEASURED for that run, then re-run green after building those two packages under the lock."
    ],
    "mcp_calls": "0",
    "api_writes": "3 relay dispatches (POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]), carrying 4 REST writes: POST /repos/objectstack-ai/objectstack/pulls (pr_create, draft, run 37280513684, body read back 6959/6959 bytes identical); POST /repos//issues/21843/labels (skip-changeset) and POST /repos//issues/21843/assignees (hotlong) in one label-write stroke (run 37280579804, read-back MATCHES: size/m, skip-changeset; hotlong); POST /repos//issues/21838/comments (this os-dev-report). Plus git push x4 (branch probe and 3 commits), not REST.",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: 承接者:无 · noted in PR Acceptance notes, not filed · check:published-readme-links classifies https://objectstack.ai/blog/* as docs-host-other and never resolves it, by design (self-test 'A3 SILENT on the canonical host outside /docs'), so its green says nothing about the README blog link; the target was evidenced instead by the build route list and a 200 from next start · dedupe words: published-readme-links blog docs-host-other unresolved",
    "carrier: 承接者:无 · noted in PR Acceptance notes, not filed · prose drift: scripts/check-doc-frontmatter.mjs header says content/blog 'holds 3 pages today' and the blog route's postGraph comment says 'all three current posts'; both still hold in substance (floor 1 is not a ratchet; all four authors are ObjectStack Team) · dedupe words: content/blog page count comment drift"
    ],
    "cleanup": "next server process group killed (port answered 000 after); worktree node_modules removed and git worktree remove succeeded with no --force; no process from the worktree remains",
    "ci_at_report": "in_progress (33 check runs: 14 success, 10 skipped, 9 in_progress incl. Lint & Repo Gates and Build Docs; no failure). Not awaited, per contract."
    }

  4. objectstack-fleet commented on Oct 5, 2026

    @objectstack-fleet
    ContributorAuthor

    Review: ACCEPT — PR #21843 at head 92eda4bd

    Seat domain:devx#2 · session_011hRnra93sK5Q2gTYYTbdJR · reviewed against GitHub and the fetched branch at 2026-10-05T08:00Z, not against the report.

    PR shape. Draft, base main, body opens Fixes #21838, Clause-②: no at line start, session-URL footer. Labels documentation · size/m · skip-changeset; assignee matches the card. 6 files, +299 / −6, three commits with model-free trailers. node scripts/pm/check-governed-merges.mjs --pr 21843: 0 of 6 paths governed, 305 changed lines.

    Scope and changeset. Docs only: content/blog/**, apps/docs/**, one README line. No packages/**, no content/docs/references/**, no content/docs/releases/**, no CHANGELOG, no binaries. skip-changeset holds. No file outside the card's named surface; scripts/docs-audit/handwritten-docs.json untouched because check:docs-audit-scope asked for nothing.

    The post. content/blog/the-ontology-is-the-software.mdx on the branch hashes to the maintainer-approved draft: sha256 prefix e760438e91b318fd on the committed blob, the card's fenced block and the container copy. No MDX-forced edit (the build compiled it unchanged). Frontmatter carries title, description, author, date 2026-10-05, tags. Analyst citations absent, as ruled; the four facts stand as written.

    Prose checked sentence by sentence.

    • Editor's notes: both are the card's Part C text, verbatim, one added line each right after the frontmatter; nothing else in either 2024 post moved.
    • README: exactly one change, the "Read why" link under "You own it" now targets https://objectstack.ai/blog/the-ontology-is-the-software.
    • Home closing card (page.tsx): the external objectos.ai anchor is gone; the sentence now ends "Read the long form:" followed by a next/link to /blog/the-ontology-is-the-software with the essay title as link text. The slogan and the positioning sentence are untouched.
    • Shared nav (layout.shared.tsx): links: [{ text: 'Blog', url: '/blog', active: 'nested-url' }], shape read from the installed fumadocs-ui 16.14.4 d.ts; baseOptions() is spread by DocsLayout and by HomeLayout on home and both blog branches, so the hero button row rightly stays as is.

    Verification readings (dev's, pinned to head 92eda4bd). Docs build VERDICT command-exit 0, route list includes /en/blog/the-ontology-is-the-software; next start on a random port: /blog 200 with the new post first, post page 200 with one h1 and seven h2 and JSON-LD datePublished 2026-10-05; Blog anchor present in the prerendered header of home, each post page and the docs sidebar; essay link in home and both 2024 posts; 0 occurrences of the objectos.ai post in built home. 32 derived gate families run and reconciled, plus 8 named doc gates, all exit 0; three first exit 3 PREREQUISITE NOT MET recorded as NOT MEASURED and re-run green after building lint and formula. Narrowed eslint on the two TSX files with the three required pieces. mcp_calls 0; 3 relay strokes through scripts/pm.

    Acceptance notes, read. (1) check:published-readme-links is silent by design on canonical-host paths outside /docs, so its green does not vouch for the README blog link; the route list and the 200 do. Accepted; nothing to file. (2) Two code comments still say "three posts" (check-doc-frontmatter.mjs header, the blog route's postGraph comment); substance unchanged (floor 1, all authors ObjectStack Team), prose drift only, carrier none, not filed.

    CI at acceptance (head 92eda4bd). TypeScript Type Check, Build Docs, Dogfood Regression Gate, Governed Surface Queue Guard, Test Core 2–6/6 success; Lint & Repo Gates and Test Core 1/6 in progress; Build Core, Temporal Conformance, Console Pin Gate, Dogfood shards expected skips (docs-only path filter). Landing (ready + auto-merge through the queue) follows once every check on this head is green. If the queue lands this after 2026-10-05, the post's date stays as the day the maintainer approved the copy; the card's "set it to the landing day" clause is a seat decision at landing, and the index order is unaffected either way.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 5, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed: PR #21843 → 5b2d189e28, verified on origin/main by content at 2026-10-05T08:45Z.

    • Every surface on main is blob-identical to the landing head 92eda4bd: content/blog/the-ontology-is-the-software.mdx bc84e8d9e6 (sha256 prefix e760438e91b318fd, the maintainer-approved draft, unchanged), README.md ebf55269c5, apps/docs/app/[lang]/page.tsx 8b234be41e, apps/docs/lib/layout.shared.tsx 5def0c6d4a, content/blog/metadata-driven-architecture.mdx 9042460938, content/blog/protocol-first-development.mdx b199b75f2c.
    • On main: the shared nav carries Blog → /blog; the home closing card links /blog/the-ontology-is-the-software and no longer links the objectos.ai post; README's "Read why" targets https://objectstack.ai/blog/the-ontology-is-the-software; both 2024 posts open with their editor's note.
    • Queue build green (CI, Lint & Type Check, Spec Liveness, Governed Surface Guard, Closing-Target Claim Guard); merged by the queue at 08:44Z after waiting behind one PR. No rework round. Changeset: none, skip-changeset, packages/** untouched.
    • The post goes live at objectstack.ai/blog/the-ontology-is-the-software when the docs site deploys from this main; the README link resolves from then on.

    pm:dispatched removed with this comment. Seat domain:devx#2 · session_011hRnra93sK5Q2gTYYTbdJR


    Generated by Claude Code

  6. added a commit that references this issue on Oct 7, 2026
    5b2d189
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Labels

documentationImprovements or additions to documentationdomain:devxDomain lane — seat card indexed by label:pm:seat

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions