Repository navigation
content(blog): When Should You Not Use an Executable Business Ontology? - #264
Conversation
…y? (slot 2026-11-05) One new post directory. en and zh-Hans authored (the Chinese re-derived from the same sources), zh-Hant generated by pnpm gen:zh-hant. Five workloads that are not a fit today, each with a scenario, the alternative and its case, the cost of choosing wrong and the deciding fact with its source; two further concessions from the comparison page; a sourced decision table and a ten-question self-check. Cover and self-check diagram as zh / en SVG pairs with an explicit fill on every text node. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017GeNDQH7E5S2rX8ajVAPxv
…or's 1000-byte window Astro's SVG metadata probe validates the root tag inside the first 1000 bytes; the long aria-label pushed it past that and the build failed with NoImageMetadata. The long description moves into a desc element and the aria-label is one sentence. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017GeNDQH7E5S2rX8ajVAPxv
…without sideways scroll The layout gives every column a 104px floor, so a four-column table scrolls at 390px; merging the fit verdict with the alternative keeps all four facets in three columns, and the sources move to short file names with a legend line. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017GeNDQH7E5S2rX8ajVAPxv
席位核对ACCEPT, held for the slot.
The dev's open question (zh-Hans links to Pointer for #261: Generated by Claude Code |
…keting-page link rewrite Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017GeNDQH7E5S2rX8ajVAPxv
…ogy pages The generator now rewrites a single-segment /zh-Hans/ link to a marketing page into /zh-Hant/, so the two links withheld in the first round come back: the comparison page where the post says it goes further than it, and the ontology page as the next thing to hand the agent. zh-Hant regenerated. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017GeNDQH7E5S2rX8ajVAPxv
席位核对 — re-recorded on head
|
| Check | Result |
|---|---|
Delta since f9955fa |
The merge commit 4e02c30 brings in origin/main 3c5b6c6 and changes no post file. 9f18a2f changes 2 lines in each zh file: zh-Hans gains [对比页](/zh-Hans/compare/) and [定义本身是什么](/zh-Hans/ontology/), and the regenerated zh-Hant carries [對比頁](/zh-Hant/compare/) and [定義本身是什麼](/zh-Hant/ontology/). This is the option-A follow-up named in the first record, done before the slot. |
File surface vs main |
Still the 7 post files only (git diff --stat origin/main... → 7 files, +762). |
| CI on head | Build and deploy: completed/success on 9f18a2f. |
Pointer for #261: ACCEPT (held to 2026-11-05) → PR #264 comment (this one).
Generated by Claude Code
Co-Authored-By: Claude <noreply@anthropic.com>
… @objectstack/cli@18.2.0 Publish-day prep for the when-not-to-use post. Every cited line was re-read at the release tag @objectstack/cli@18.2.0 (npm `latest` on 2026-10-28). Two README facts moved: the driver package table now lives in CONTRIBUTING.md (the README keeps its five-store Datasources row), and the ObjectOS paragraph was reworded; the post's ObjectOS section now carries the three-edition clause verbatim from src/lib/positioning.ts. Everything else holds unchanged. Source labels in the body and the four SVGs now read "tag @objectstack/cli@18.2.0, read 2026-10-28"; zh-Hant regenerated with pnpm gen:zh-hant. Co-Authored-By: Claude <noreply@anthropic.com>
… post Faithful translations of the corrected English post. title, description and tags are translated; date, topic, audience and status match en; no updated. Each locale quotes its own positioning strings verbatim from src/lib/positioning.ts (T2, T4 and the three-edition E1). Verbatim doc quotes stay English under span lang="en" with a translation alongside, following the executable-ontology-vs-knowledge-ontology backfills. Links go same-locale where the target exists (security page, the definition post) and to /en/ otherwise. Non-Chinese locales use the *-en.svg assets. Co-Authored-By: Claude <noreply@anthropic.com>
Fixes #261
Refs #236 (item B)
Published 2026-10-28 (Wed) by the publishing seat (maintainer rulings on #267: Mon/Wed/Fri cadence, ruling 「18.1 A」 order, house bar = npm
lateston the proof day). Re-dated, re-sourced on tag@objectstack/cli@18.2.0, and backfilled to all eight locales on publish day; see the addendum below.What this adds
One new directory,
content/blog/when-not-to-use-an-executable-business-ontology/:index.mdx(en, authored) andindex.zh-Hans.mdx(re-derived from the same sources, not translated);index.zh-Hant.mdxgenerated bypnpm gen:zh-hant. No further locales.cover.svg/cover-en.svg(1200×675) and the body diagramself-check.svg/self-check-en.svg(1200×760): zh / en pairs, an explicitfillattribute on every text node and no stylesheet; every text/background pair measured at or above 4.77:1 (WCAG AA);pnpm svg:lintOK on 148 text boxes.The thesis is in the first paragraph: five workloads, named by the ObjectStack docs themselves, each with a better tool. The ownable concept is the six-kind test (is the hard part of the workload one of the six kinds the concepts page defines?). Each non-fit gets the same four beats: a concrete scenario, what to use instead and why that is the right call (the steelman), the cost of choosing wrong, and the deciding fact with its source. Two further concessions from
compare.mdxfollow (reasoning over heterogeneous data; ecosystem maturity). Proof artifact: a decision table (workload → fit today? and what to use instead → the deciding fact, every row sourced) and a ten-question self-check (five exclusions, then the page's five questions, quoted). The product appears only as the subject of its limits; the "point your agent at ObjectStack" CTA is confined to the last section, for the cases that passed. Positioning lines are quoted fromsrc/lib/positioning.ts: T2 verbatim in both locales, T4 standalone and E1 in the ObjectOS section. No token figures.Overlap fence: the site's
/en/compare/page is linked from the English post and not restated; the post goes further with scenarios, costs and the self-check. Variation against #211, #244, #245, #237 and PR #260: the opening is a five-item short answer rather than a definition, a refused key, a transcript or three definitions; the structure is five scenario sections on a fixed four-beat rhythm; the proof artifact is a decision table plus a self-check rather than a measured run or a mapping table; the bundled-CRM measurement is not repeated.Every factual claim, with its objectstack source
All sources read at objectstack
origin/main43567a8fon 2026-10-16.content/docs/concepts/when-to-use.mdxabstractremoved under ADR-0049; constrained JSX "is parsed into a server-driven UI tree, never executed as code"content/docs/concepts/ontology.mdxcontent/docs/concepts/compare.mdx, "Where the others are stronger"README.md, the "The runtime runs it" table and the Drivers section of the package directoryexternal.allowWrites: trueon the datasource andexternal.writable: trueon the object; "With either gate off, insert/update/delete on the federated object is rejected";schemaMode: 'external'forbids DDL and a schema mismatch fails bootcontent/docs/data-modeling/external-datasources.mdx, theschemaModetable and the writes section (lines 249–256)assertWriteAllowedruns at the top of the engine'sinsertandupdatepackages/objectql/src/engine.ts:8551, called at:14646and:15825objectis described as "Base object name"content/docs/data-modeling/analytics.mdx;packages/spec/src/ui/dataset.zod.ts:389ActionTypeisscript, url, modal, flow, api, form; ascriptaction's handler runs with the app's full data authority and the boundary is at invoke timepackages/spec/src/ui/action.zod.ts:561;content/docs/ai/actions-as-tools.mdx, the trusted-code calloutcontent/docs/getting-started/glossary.mdx, the TCK entrysrc/lib/security.ts:170(the security page FAQ)content/pages/en/compare.ts, FAQ "Is ObjectStack a semantic layer?"The scenarios (a manufacturer, a bank, a retailer, a logistics company, a hospital group) are illustrative and carry no figures.
Gates, all on HEAD
f9955fa, exit codes captured before any pipepnpm content:lint→ exit 0:✓ content lint passed (350 files, 44 glossary terms checked); the threeDate is in the future: Thu Nov 05 2026advisories are the slot.pnpm content:lint --published→ exit 0, the same verdict line.pnpm svg:linton the four new SVGs → exit 0:svg-text-fit: OK — no text box crosses the shape under it or runs under a shape painted over it, and no drop shadow is cut off by its filter region (4 SVGs, 148 text boxes, 0 filtered elements, tolerance 2px, 0 allowlisted).pnpm check→ exit 0:Result (158 files): 0 errors, 0 warnings, 0 hints.pnpm build→ exit 0, through the shared verify lock (VERDICT command-exit 0, held 102s on a shared box):907 page(s) built;✓ share images: 91 rendered at 1200x630;✓ content lint --dist passed (489 built blog pages checked);✓ content lint --dist CJK line breaks passed (907 built pages, 344 in zh/ja, 0 segment breaks between CJK characters);✓ content lint --dist quotation marks passed (907 built pages, 12650 curly marks, 0 pointing the wrong way or left open);✓ content lint --dist links passed (97929 internal links in 907 built pages resolve to built files).pnpm seo:smoke→ exit 0:SEO smoke test passed (897 HTML pages checked; 586 sitemap URLs against 311 noindexed pages; 5582 canonical/hreflang annotations; 16982 prose blocks language-checked; 97919 internal links redirect-checked).Browser check
Playwright library with the preinstalled Chromium, against
astro previewon the builtdist; every server stopped by its PID..cover×1, no body reference); two images per page (cover and self-check), each scrolled into view anddecode()d; no horizontal page overflow at 390.Deviations and notes
/compare/or/ontology/pages. Linking/zh-Hans/compare/is refused by the gates as they stand:scripts/gen-zh-hant.mjsleaves a single-segment marketing-page link in the generated zh-Hant file untouched (it prints "no provable Traditional build"), andpnpm content:lintthen fails that file with a blockingCross-locale internal link … /zh-Hant/compare/ IS built; linking/en/compare/from zh-Hans fails the same rule the other way. No existing zh-Hans post links any marketing or cluster page, so this is the first collision. The zh-Hans text names the page without a link and points at the objectstack concept pages instead; the English post links/en/compare/,/en/ontology/and/en/security/. The generator fix is one condition (rewrite/zh-Hans/SLUG/whencontent/pages/zh-Hans/SLUG.tsorcontent/pages/en/SLUG.tsexists, the way it already proves blog posts) and is outside this PR's file surface; reported to the seat in the dev report.aria-labelfailed the build withNoImageMetadata. The long description now lives in adescelement, and the MDX alt text carries it as well.dateis the slot; noupdated. No label writes from this seat.Acceptance notes
date, so it heads the blog list from the slot day and sits lower until then.Generated by Claude Code
Patch round 1 (added by the seat)
9f18a2f:f9955fa+ a merge oforigin/main3c5b6c6(4e02c30; gen-zh-hant never rewrites a /zh-Hans/ link to a marketing page, so a zh-Hans post that links /zh-Hans/ontology/ failspnpm build(content-lint cross-locale rule) #265's generator fix, PR fix(gen-zh-hant): rewrite /zh-Hans/ links to marketing pages and clusters #266) + the zh-Hans link restore.[对比页](/zh-Hans/compare/)and[定义本身是什么](/zh-Hans/ontology/), and the generated zh-Hant file carries/zh-Hant/compare/and/zh-Hant/ontology/.9f18a2f: all exit 0;build915 pages, 98827 internal links resolve;seo:smoke905 HTML pages. CIBuild and deploy: success. The article's 13 links per locale all answered 200 inastro preview.Publish-day addendum (2026-10-28, branch
lin/pub-264→ three commits on top of the seat-2 branch after mergingorigin/mainat1b74b4f)Re-source on
@objectstack/cli@18.2.0(npmlateston 2026-10-28, tag commit27f38ada) vs. the 2026-10-16 read at43567a8fEvery cited file was re-read at the tag.
when-to-use.mdx,compare.mdx,ontology.mdxandglossary.mdxare byte-identical to the 10-16 read;external-datasources.mdx,analytics.mdx,dataset.zod.ts,action.zod.ts,engine.tsandREADME.mdchanged, and only two README facts moved a claim:CONTRIBUTING.md#package-directory); its own Datasources row reads "PostgreSQL, MySQL, SQLite, MongoDB, or in-memory". The deciding fact in section 3 and the decision-table row now say: README lists five datasources; the package directory inCONTRIBUTING.mdadds Turso and SQLite in WebAssembly. The conclusion (no lake format, no columnar engine, no object-storage driver; dataset binds to an object) is unchanged. Sources paragraph names README andCONTRIBUTING.mdat the repository root.src/lib/positioning.ts(whichorigin/mainupdated on 2026-10-26). T2 and T4 are quoted verbatim frompositioning.tsas before.Unchanged at the tag, verified line by line: the five "Not a fit today" quotes and the "a day's work" / "no tool helps yet" lines (when-to-use); "start where you are", "server-driven from metadata…", "years of production use…" (compare); six kinds, "no object inheritance, no axioms and no reasoner",
abstractremoved under ADR-0049, "parsed into a server-driven UI tree, never executed as code" (ontology); TCK "planned" / "no TCK program or certification mechanism in the codebase today" (glossary); dataset = "a base object, the relationships to include, and the declared dimensions and measures" (analytics);object: 'Base object name'(dataset.zod.tsline 585);ActionType = z.enum(['script','url','modal','flow','api','form'])(action.zod.tsline 584);assertWriteAllowedat the top ofinsert(line 15158) andupdate(line 16478) before defaults, hooks and validation; "with either gate off, insert/update/delete on the federated object is rejected",allowWrites+writable,schemaMode: 'external'fails boot on mismatch (external-datasources); the 12-row capability table, MCP server "on by default", federation "early" (README / when-to-use / compare). The 18.2.0 additions (duration measures,nullLabel, flow actions inonSuccess.navigate) touch nothing the post claims.Source labels in the body (lines 20 and 96 in en, their zh siblings) and in the four SVG footers now read "tag
@objectstack/cli@18.2.0, read 2026-10-28". No "17.7", "43567a8f" or "2026-10-16" remains in the post directory.Re-date
date: 2026-10-28in every locale file. The branch touches no other post, so there was no back-linkedupdated:to move. zh-Hant regenerated withpnpm gen:zh-hant(not hand-edited).Locales added
index.ja.mdx,index.ko.mdx,index.de.mdx,index.es.mdx,index.fr.mdx: translations of the corrected en.title/description/tagstranslated (descriptions 74 / 82 / 200 / 193 / 211 JS chars);date,topic,audience,statusidentical to en; noupdated;cover: ./cover-en.svgand./self-check-en.svg. T2, T4 and E1 are each locale'spositioning.tsentry byte-for-byte (checked by script across all seven locales). Verbatim doc quotes stay English underspan lang="en"with a translation in parentheses, the shape of theexecutable-ontology-vs-knowledge-ontologybackfills. Links:/LOCALE/security/and/LOCALE/blog/what-does-the-ontology-is-the-software-mean/(targets exist);/en/compare/,/en/ontology/,/en/blog/how-to-move-an-internal-system-to-metadata/,/en/blog/how-to-point-your-agent-at-objectstack/(no same-locale target).Gates (all on the final head
6e6e4c8)pnpm content:lint→ exit 0 (383 files; only non-blocking width notes).pnpm checkunderos-verify-lock.shslotwww-pub-264→VERDICT command-exit 0; astro check 160 files, 0 errors / 0 warnings / 0 hints.pnpm buildunder the lock →VERDICT command-exit 0; svg-text-fit OK (148 SVGs, 3442 text boxes);content lint --distpassed (522 built blog pages, links, CJK breaks, quotation marks).git statusclean after the build.pnpm seo:smoke→ exit 0 (938 HTML pages; 5919 canonical/hreflang annotations; 19083 prose blocks language-checked).dist/on :49407, the post in all 8 locales plus/en/blog/and/zh-Hans/blog/, at 1366×625, 1440×750, 1512×830, 1920×945, 390×844, 360×800, light and dark = 120 page loads, 0 failures: HTTP 200, no horizontal overflow, every image loaded after scrolling lazy images into view, 8 hreflang + x-default, no literal**in main, the post first in "Latest Articles" on both indexes withdatetime="2026-10-28". The four changed SVGs rendered at native size, light and dark; footers legible, within the canvas. Shots in the scratchpadwww/shots-pub-264/; looked at en and zh-Hans at 1440 and 390, de at 390, ko at 360 dark, and both blog lists.Noted, not changed
src/lib/positioning.tsdocuments T4 as "byte-for-byte the README … lines 26–30"; the README at 18.2.0 (and currentorigin/main) no longer contains that sentence, having replaced the paragraph with the Community/Cloud/Enterprise wording. The post keeps T4 as the site's positioning string per the localization rule; whetherpositioning.tsshould follow the README is a positioning-owner question, not this post's.