Skip to content

content(blog): executable ontology vs knowledge ontology — post 2 of the positioning wave (slot 2026-10-20) - #244

Open
objectstack-fleet[bot] wants to merge 7 commits into
mainfrom
claude/pm-dispatch-objectos-ju9td1-issue-228
Open

objectstack-fleet[bot] wants to merge 7 commits into
mainfrom
claude/pm-dispatch-objectos-ju9td1-issue-228

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #228

Post 2 of the positioning wave ruled on #209, slot Tuesday 2026-10-20. Merge on the slot day only: the charter says "merge time is publish time".

Re-slot. The post was slotted for Tue 10-13. Post 1 missed 10-08 and landed on 10-15 as #212, so the wave slipped one week. Commit e2a55f1 moves the post's date to 2026-10-20 and moves the sibling's updated to 2026-10-20T10:00:00+08:00 in all eight locales. 11 lines change. Gates on that commit all exit 0: content:lint, check, build (891 pages, tree clean) and seo:smoke. Built JSON-LD gives datePublished 2026-10-20 for the post and dateModified 2026-10-20T02:00Z for the sibling.

Branch. This branch holds six commits from the staged lin/issue-228, replayed onto main @ a7bd4af+1174309. The replay is patch-equal to lin/post-base..lin/issue-228, with byte-identical diffs. Head c3538ab. The staged SHAs quoted below are the pre-replay commits.

Known follow-up. A seat fixup re-dates the stack's updated lines to their real landing day, 2026-10-15, and lands later today. This PR moves the same sibling updated lines to 10-20, so after that fixup the branch takes main with a merge commit that keeps 10-20.

The post

content/blog/executable-ontology-vs-knowledge-ontology/ — Executable Ontology vs Knowledge Ontology: Why "No Inheritance, No Axioms, No Reasoner" Is the Point (the ruled title, kept whole). date: 2026-10-13, no updated, topic: app-building, audience: developer. Locales: en, zh-Hans, zh-Hant (generated by pnpm gen:zh-hant, never hand-edited).

  • Angle. The second of the pillar post's three negations, argued in full: a knowledge ontology (OWL 2 / RDF) is built to be reasoned over; an executable business ontology is built to be validated, reviewed and run. The three refusals are what make a definition checkable and a diff reviewable.

  • Ownable concept. A reader for every key: a key you can write has a runtime reader, or it is removed. The one figure is ADR-0049's own, quoted: the audit "found that roughly half of all spec properties are dead".

  • Proof artifact (before/after, measured). The abstract key on the object schema, parsed through three published @objectstack/spec releases with the same object (scratchpad/issue-228/scripts/probe-abstract.mjs, logs probe-v15.log, probe-v16.log, probe-v161.log, probe-v17.log):

    version (npm publish date) ObjectSchema.create() ObjectSchema.safeParse()
    15.1.1 (2026-07-17) accepts, abstract: true kept accepts, abstract: true kept
    16.0.0 (2026-07-21) throws, naming the removal accepts, abstract silently stripped
    17.7.0 (2026-10-06) throws, naming the removal rejects, unrecognized_keys, with the prescription
  • Honesty section. Steelmans OWL/knowledge graphs; states plainly what the executable ontology does not do (no reasoning, no open-world inference, no schema-level inheritance, no entity resolution) and that "validated" is only as true as the validators (the ledger is standing maintenance, not a finished state).

  • ObjectOS appears once, as T4 (T4_STANDALONE) + E1 verbatim from src/lib/positioning.ts.

  • CTA: npm create objectstack@latest my-app && cd my-app, a coding agent, npx os dev --ui. os start appears 0 times.

  • No token figures. No competitor claims. OWL is cited to the W3C OWL 2 Primer by name only.

Every factual claim and its source (objectstack origin/main = 8caa131e52717ef35fe71742d758f10b8f2b77ee)

Claim in the post Source
"no inheritance, no axioms, no reasoner — validated rather than reasoned over"; the whole "What we mean by ontology" paragraph (quoted in a blockquote) README.md:79-89, line-exact :82-83
T1 / T2 / T3 / T4 / E1 src/lib/positioning.ts (this repo); README.md:7-16, :26-30
"OWL, RDF and knowledge graphs describe a domain, carry class inheritance and axioms, and are reasoned over…"; "The abstract key was removed from the spec for exactly that reason (ADR-0049)" content/docs/concepts/ontology.mdx:44-48
pipeline line objectstack.config.ts -> objectstack.json -> … ontology.mdx:61-63
"Nothing is reasoned over at runtime: what runs is what was validated." ontology.mdx:69-70
"Lookups and master-detail links between objects" (the only relation kinds) ontology.mdx:21
derives / enforces ontology.mdx:65-69
os validate "rejects metadata that type-checks but would fail silently at runtime: dangling bindings, bad CEL predicates, missing security posture" README.md:174
"an agent's errors become located, corrective text it can read and fix itself" README.md:179
the typed gate "in the editor" README.md:173; object.zod.ts:2646 (NoExcessObjectKeys)
audit "found that roughly half of all spec properties are dead" docs/adr/0049-no-unenforced-security-properties.md:7
the three states, "parsed, unmarked, unenforced", "enforce-or-remove gate" (blockquote) ADR-0049 :25-34
"worse than absent … false sense of compliance" ADR-0049 :21-23
"Removal is preferred over marking when there is no committed roadmap…" ADR-0049 :91-92
the repo "cites this ADR as the enforce-or-remove policy for spec-property retirement generally" ADR-0049 :162-164
"Authoring them is a false affordance — especially dangerous for AI-authored metadata."; abstract in the verified-dead object set objectstack#2377 (public issue body)
tombstone text (abstract was removed … Remove the key.) packages/spec/src/data/object.zod.ts:1538-1541; :1694-1696
"tags/active/abstract REMOVED (#2377) — tombstoned in UNKNOWN_KEY_GUIDANCE" packages/spec/liveness/README.md:958
unknown keys used to be "discarded by Zod's default .strip() … vanished with no error, no warning, and a green tsc" (#1535) object.zod.ts:1446-1450; objectstack#1535
"Until this shape was closed these were dropped silently on the PARSE path — …" the measured 17.7.0 message; object.zod.ts:1676-1679
changelog: "object tags/active/abstract: ObjectSchema.create() now throws a located error naming the removal. None gated anything at runtime — remove them." (16.0.0) packages/spec/CHANGELOG.md:98572-98573 (under ## 16.0.0 at :98195)
15.1.1 declaration abstract: z.boolean().optional().default(false).describe("Is abstract base object (cannot be instantiated)") @objectstack/spec@15.1.1 dist/data/index.js:3239 (published package)
15.1.1 Studio object form boolean field, help text "Abstract base (cannot be instantiated)" @objectstack/spec@15.1.1 dist/data/index.js:5794
15.1.1 ledger entry (status dead, no runtime reader, authorHint) @objectstack/spec@15.1.1 liveness/object.json:224-229
publish dates 2026-07-17 / 2026-07-21 / 2026-10-06 npm view @objectstack/spec time
the measured outcomes per version probe-v15.log, probe-v16.log, probe-v17.log in the scratchpad
OWL 2: classes, properties, axioms (subclass, disjointness, cardinality, property chains), reasoner, open-world assumption W3C OWL 2 Primer (linked; standard, not a competitor)

Assets (six SVGs, all pass svg:lint)

cover-en.svg / cover.svg (1200×675), two-pipelines-en.svg / two-pipelines.svg (1200×660), abstract-before-after-en.svg / abstract-before-after.svg (1200×620). English set for en; Chinese set for zh-Hans/zh-Hant. Each diagram adds information the cover does not carry (the two pipelines; the three-release timeline with ADR-0049's three states). Text fills chosen for AA on every fill they sit on: #173a36, #256a5e, #52655f, #7a5a2c; measured in Chromium with each SVG opened as its own document, lowest ratio 5.68:1 (AA needs 4.5:1).

Two build-side lessons, recorded in the commits: Astro's vendored image-size validates an SVG over its first 1,000 bytes, so a root aria-label longer than that fails astro build with NoImageMetadata — the two timeline diagrams now keep a short aria-label and carry the full description in title and desc elements; and seo:smoke judges every prose block against its nearest lang, so the two English source quotations in the zh post are blockquote elements carrying lang=en.

Also in this PR: enterprise-ontology-race-open-vs-closed (update, not retire)

Every locale (en, zh-Hans, ja, de, es, fr, ko; zh-Hant regenerated). The title, description and TL;DR no longer name the contested layer "the business semantic layer"; they name the business definition layer — house vocabulary (glossary definition-layer; AGENTS.md rule 1's "definition layer vs runtime layer"), chosen at review over "business ontology" because that collides with post 5's planned title (#231). Each locale uses its existing rendering of the term consistently in the title, the TL;DR and the race-section line (zh also its closing line): 业务定义层 · 業務定義層 · Geschäftsdefinitionsschicht · capa de definición del negocio · couche de définition du métier · 비즈니스 정의 계층. The TL;DR and race line say which of the five entrants shipped an ontology by name (Microsoft Fabric IQ, Palantir Foundry) and which a semantic layer (Snowflake, Google Looker, Databricks Unity Catalog), matching the post's own table. updated: 2026-10-13T10:00:00+08:00 on all 8 files (the publish day, per review); date and slug unchanged; tags unchanged (the post still discusses semantic layers). Descriptions kept ≤ 230 chars (en 218, de 226, es 224, fr 228).

locale before → after (title)
en Who Owns the Business Semantic Layer? → Who Owns the Business Definition Layer?
zh-Hans 谁拥有业务语义层 → 谁拥有业务定义层
ja 業務セマンティックレイヤーは誰が所有すべきか → 業務定義層は誰が所有すべきか
de die semantische Geschäftsschicht → die Geschäftsdefinitionsschicht
es la capa semántica del negocio → la capa de definición del negocio
fr la couche sémantique du métier → la couche de définition du métier
ko 비즈니스 의미 계층 → 비즈니스 정의 계층

Gates on 835f9b5 (through scripts/pm/os-verify-lock.sh, slot www-228, lock held 141 s, waited 0 s, shared-box seconds; the same six were green on 680bfd8 before the fixup)

  • pnpm content:lint → exit 0 — ✓ content lint passed (350 files, 44 glossary terms checked); advisories on the new post, verbatim: Date is in the future: Tue Oct 13 2026 (now Oct 20 after the re-slot) 00:00:00 GMT+0000 (Coordinated Universal Time) ×3 (en, zh-Hans, zh-Hant — expected for a slot-day post, date unchanged); Title is 100 columns wide (100 chars); search results show about 60, so the end is cut (the ruled title, kept); Description is 222 columns wide (222 chars); on the sibling post, verbatim: Updated is in the future: 2026-10-13 ×8 (one per locale file — expected, the publish-day value chosen at review).
  • pnpm content:lint --published → exit 0 — same line.
  • pnpm check → exit 0 — Result (152 files): 0 errors, 0 warnings, 0 hints.
  • pnpm build → exit 0 — ✓ zh-Hant: generated 48, kept 0 hand-maintained; svg-text-fit: OK … (124 SVGs, 2661 text boxes …); [build] 891 page(s) built in 82.33s; ✓ content lint --dist passed (489 built blog pages checked); CJK line breaks, quotation marks and 94,469 internal links all pass; tree clean afterwards.
  • pnpm seo:smoke → exit 0 — SEO smoke test passed (881 HTML pages checked; … 16525 prose blocks language-checked; 94459 internal links redirect-checked).
  • pnpm svg:lint → exit 0 — svg-text-fit: OK.

Browser check (astro preview on dist/, Playwright 1.56.1 Chromium at /opt/pw-browsers/chromium; the full run on 680bfd8, the sibling re-take on 835f9b5)

scratchpad/issue-228/scripts/shots.mjs: the article in en and zh-Hans at 1366×625, 1440×750, 1512×830, 1920×945, 390×844 and 360×800, light and dark; the updated post in en and zh-Hans at 1440 and 390; the en blog list at 1440 and 390; each served SVG at native size as its own document. 182/182 assertions: HTTP 200, documentElement.scrollWidth equals the viewport and no element past it outside a scroll container, the cover renders, both diagrams render, no repeated image, the Updated line reads Updated Oct 7, 2026 / 更新于 2026年10月7日, the new post is the first card of the Latest section, every SVG text AA. Element crops (scripts/crops.mjs) of every table, code block, blockquote and diagram at 1440 and 360 were looked at: tables wrap at 360, code blocks scroll sideways (the #213 design), the lang="en" quotes render as ordinary blockquotes in both schemes.

Sibling re-take on 835f9b5 (scripts/sib-shots.mjs, scratchpad/issue-228/shots-sibling/): en and zh-Hans at 1440×750 and 390×844, fold and full page, 20/20 assertions — HTTP 200, no overflow, cover renders, the H1 is the new title in both languages, the Updated line reads Updated Oct 13, 2026 / 更新于 2026年10月13日 (datetime 2026-10-13); the built en page carries the new meta description and dateModified 2026-10-13T02:00:00.000Z. Looked at: all four folds and both full pages.

Acceptance notes


🤖 Generated with Claude Code

https://claude.ai/code/session_01FeA1nwBz1ohH65dvffUGKr

🤖 Generated with Claude Code

https://claude.ai/code/session_01FeA1nwBz1ohH65dvffUGKr

…the positioning wave (slot 2026-10-13)

New post content/blog/executable-ontology-vs-knowledge-ontology/ in en and
zh-Hans (zh-Hant generated by gen-zh-hant), date 2026-10-13, no updated.
It argues the second negation of the pillar post in full: a knowledge
ontology is built to be reasoned over, an executable business ontology to
be validated and run, and the README's "no inheritance, no axioms, no
reasoner" is what makes a definition checkable and a diff reviewable. The
proof artifact is the ADR-0049 retirement of the object `abstract` key,
measured on the published @objectstack/spec 15.1.1, 16.0.0 and 17.7.0:
parsed and kept, then refused by create() while parse() still stripped,
then refused on both paths with the prescription "Remove the key."

Six SVGs: cover-en/cover, two-pipelines(-en), abstract-before-after(-en);
all pass svg-text-fit, text fills chosen for >= 4.5:1 on their fills.

Also in this PR: enterprise-ontology-race-open-vs-closed, every locale —
the title, description and TL;DR no longer name the contested layer "the
business semantic layer"; they name the business ontology (the README's
term) and say which of the five entrants shipped an ontology by name and
which a semantic layer; the race-section line and the zh closing line
match. updated set to 2026-10-07T10:00:00+08:00; date and slug unchanged.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FeA1nwBz1ohH65dvffUGKr
Astro's vendored image-size validates an SVG with a regex over the first
1,000 bytes only; the two abstract-before-after diagrams carried an
aria-label longer than that, so the root tag never closed inside the
window and `astro build` failed with NoImageMetadata. The root now holds a
one-sentence aria-label (306 / 304 bytes) and the full description moved
into <title>/<desc>, referenced by aria-labelledby. Text-fit gate and the
metadata probe both pass on all six SVGs.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FeA1nwBz1ohH65dvffUGKr
…s lang="en"

seo:smoke judges every prose block in <main> against its nearest lang; the
README paragraph and the ADR-0049 three-state rule are quoted verbatim in
English inside the zh-Hans post (quoted, never paraphrased), so each
blockquote now carries lang="en". zh-Hant regenerated.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FeA1nwBz1ohH65dvffUGKr
… its box

The 校验 sub line cleared its box by 6px at native size; svg-text-fit passed
but the charter asks a fix to leave room, so two glyphs are dropped and the
clearance is now 55px.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FeA1nwBz1ohH65dvffUGKr
…dated = the publish day

Coordinator review of #228: "Who Owns the Business Ontology?" collides
with post 5's planned title (#231), so enterprise-ontology-race-open-vs-closed
is retitled in all 8 locales to "Open vs. Closed Enterprise Ontologies: Who
Owns the Business Definition Layer?", using each locale's existing rendering
of the glossary term definition-layer (业务定义层 · 業務定義層 ·
Geschäftsdefinitionsschicht · capa de definición del negocio · couche de
définition du métier · 비즈니스 정의 계층) consistently in the title, the
TL;DR and the race-section line (zh also its closing line). Descriptions
unchanged. updated moves to 2026-10-13T10:00:00+08:00, the day the change
publishes; zh-Hant regenerated.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FeA1nwBz1ohH65dvffUGKr
The positioning wave slipped by one week. Post 1 missed its Thursday
2026-10-08 slot and is being re-slotted to Thursday 2026-10-15, so post 2
cannot keep Tuesday 2026-10-13 without either going live ahead of post 1
or leaving the cadence's one-post-per-slot order. Per the Publishing
cadence rules (two slots a week, one post per slot, an agent's `date` is
its planned slot), post 2 moves to the next Tuesday slot, 2026-10-20.

This post is unpublished, so its `date` may change; the forward-only rule
covers posts that are already live.

- executable-ontology-vs-knowledge-ontology: `date` 2026-10-13 -> 2026-10-20
  (en, zh-Hans; zh-Hant regenerated with `pnpm gen:zh-hant`).
- enterprise-ontology-race-open-vs-closed: the back-link revision's
  `updated` 2026-10-13T10:00 -> 2026-10-20T10:00 (+08:00) in all eight
  locales, so the sibling's revision lands on the same day as the post it
  links to. `updated` stays >= that post's `date` (2026-06-16).

No other changes: no `2026-10-13` remains in content/, and the post
bodies carry no prose reference to the old slot date.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FeA1nwBz1ohH65dvffUGKr
main (#254) moved the sweep's updated lines to 2026-10-15, the day the
sweep went live. This post sets the same lines on its back-linked
posts to its own slot day, which is later, so this side wins. main changed
nothing else in these files since the branch point.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FeA1nwBz1ohH65dvffUGKr
This was referenced Oct 15, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Post (slot Tue 2026-10-13): Executable Ontology vs Knowledge Ontology: Why "No Inheritance, No Axioms, No Reasoner" Is the Point

2 participants