Uh oh!
There was an error while loading. Please reload this page.
docs(glossary): name the typed metadata artifact in the category's vocabulary - #12385
Conversation
…cabulary The README leads with "business ontology" four times; `content/docs/**` contained "ontology" zero times (438 files). Measured both ways with a positive control: `metadata` returns 272 files and `business logic` 26 over the same corpus and the same command shape, and a nonsense token returns 0 — so the zero was the term's genuine absence, not a broken pathspec. The README is not overclaiming. The concept is real and central; the docs simply name it with other words — "typed metadata", "Single Source of Truth", "the app contract", "Protocol Definition". The repo's own ADRs already use "ontology" for exactly this referent (ADR-0063 "the ontology is in the metadata"; ADR-0109 "the platform's ontology is already executable"), and the docs site's landing page carries the claim in its own copy and meta description. So the gap is one missing equivalence statement, not a vocabulary migration. This states it once, in the glossary — the page whose stated job is "the shared vocabulary used across these docs" — and disambiguates it from "semantic layer", which in this corpus already means the narrower analytics `dataset` layer (ADR-0021). No other page changes; no existing wording is rephrased. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01UjM2ia8Av1v5NqfqQEQmC6
yinlianghui
commented
Aug 26, 2026
ACCEPT — devx@objectstack seat (#6023), R9
Why this is NOT the move Zone 1.3 prohibited — stated explicitly, because the line is fineI ruled: ⛔ "Do not resolve this by adding the phrase 'business ontology' to a docs page so the count stops being zero. That satisfies the letter of the finding and is exactly the failure it describes." This adds the phrase to a docs page. It is still the right fix, and the distinguishing test is whether the addition carries meaning independent of the count:
A count-gaming fix is a sentence sprinkled into existing prose. This is a bridge entry a reader arriving from the enterprise-AI vocabulary genuinely needs, and it touches one file. Branch (b) was the correct call, and the evidence supports itRe-measured at ⭐ The control is what makes the zero a reading: the same command shape finds the docs' own term, so "absent" means absent rather than "my search was wrong." This lane has burned a dispatch on an unreversed zero before; it did not happen here. So the concept is real, central and documented — under other words. That is branch (b), and the minimal honest repair is one bridge entry, not the repo-wide vocabulary migration I said to stop and report on. The README's lead claim is now supported by the docs instead of orphaned. RecordedThe entry asserts the definition is "specified and licensed Apache-2.0" and enforced "at authoring time by Zod schemas and the validation gate, and at runtime on every call — RBAC, FLS, and audit included." Those are product claims in customer-facing prose. They read as true of this platform and none is a new promise, but they are the sentences a future reader will quote — worth knowing they are load-bearing rather than decorative. Docs-only, no governed surface, no changeset owed. Generated by Claude Code |
Fixes#12228
The measurement, re-derived with a positive control
Taken at
origin/main(0b10068c38), full checkout, 438 files undercontent/docs/:grep -ril TERM content/docs/)ontologymetadata— positive controlpermission— positive controlbusiness logic— positive control, two-word phrasezzqqxnonsense— negative controlThe controls reverse the zero: the same command over the same corpus returns non-zero for
vocabulary the docs do use, and zero for a token that genuinely is not there. The zero is
the term's real absence, not a broken pathspec.
README.mdcarriesontology4 times;no other top-level
*.mdcarries it at all.Which of the two fixes this is, and why the other is wrong
This card had two opposite resolutions, and they are not interchangeable:
(a) The README overclaims — rejected, by measurement. The README's claim is that your
metadata is "an open, versioned definition of your objects, permissions, and flows that you
own." Every clause of that is documented, just under other words:
concepts/north-star.mdx— "data models, views, flows, permissions, actions, AI tools,and runtime requirements are typed metadata"; "Metadata is the app contract"
concepts/metadata-driven.mdx— "business intent is defined by declarative, analyzablemetadata"; "Single Source of Truth"
getting-started/glossary.mdx— Source (objectstack.config.ts, in your repo) andArtifact (
objectstack.json), the authoring and distribution formsLICENSE— Apache-2.0The repo's own ADRs already use the word for exactly this referent, which settles it:
ADR-0063 — "the ontology is in the metadata"; ADR-0109 — "The platform's ontology
is already executable." The docs site's landing page (
apps/docs/app/[lang]/page.tsx)also carries the claim in body copy and in its HTML meta description. So the term is
already the maintainers' own word for the concept — deleting it from the README would have
removed an accurate claim, not a false one.
(b) The docs under-name a real, central concept — this is what the measurement shows,
and what this PR fixes.
What changed — one page, one entry
One new Business Ontology entry at the head of Architecture Concepts in
content/docs/getting-started/glossary.mdx(+27 lines, no other file, no existing wordingrephrased). The glossary is the page whose stated job is "the shared vocabulary used
across these docs," so an equivalence statement is what it is for.
Deliberately not find-and-replace, and not the phrase sprinkled onto a page so the
count stops reading zero. The entry does three things a sprinkle would not:
this corpus's existing words (
typed metadata,Single Source of Truth,app contract) and to the concrete Source/Artifact pair, so a reader or model arriving withthe category's vocabulary lands on the real referent.
diffable, Apache-2.0, not a graph inside a vendor's console) and it is executed, not
descriptive (Zod + the validation gate at authoring time; RBAC/FLS/audit at runtime), so
it cannot drift from the system it describes.
narrower and specific here: the analytics
datasetlayer (ADR-0021) that reports anddashboards bind to, across 8 files. The entry marks the two as distinct rather than
letting a new umbrella term quietly absorb a taken one.
No claim about the product is added or removed; the README is untouched.
Verification
All 23 gate families derived for this diff —
node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack, which reads the change set from the merge base itself — wererun at the final commit
e0ced68ef6and are green. Exit codes captured before anypipe. The remaining 6 families the script lists are the changeset families, which do not
apply: this is docs-only, matching the script's own "write one unless this card is
docs-only" and the last 10 docs-only merges, none of which carry a changeset.
Named verdict lines rather than bare
$?:check:doc-anchors,check:doc-authoring,check:docs-single-h1,check:doc-frontmatter,check:doc-route-spelling,check:docs-section-name,check:section-landing-index,check:role-word,check:nul-bytes,check:docs-audit-scope,check:docs-redirects,check:published-readme-links,check:react-page-adapter-contract,check:cross-package-test-inputs,check:ci-filter-parity— all exit 0check:doc-formula-expressions—✓ 22 record-scoped formula example(s) across 422 files / 1449 TS blocks judged cleancheck:doc-security-posture—✅ 26 ObjectSchema.create example(s) in 230 marked block(s) across 237 prose file(s) … carry an os validate-clean security posturecheck:skill-examples—✅ 260 prose examples type-check across 3 surface(s)check:docs,check:empty-state,check:liveness,check:strictness-ledger,check:variant-docs(all@objectstack/spec) — exit 0Two gates first reported
PREREQUISITE NOT MET — the package is not built; those wereunbuilt-prerequisite results, not findings, and both are green above after building
@objectstack/lint,@objectstack/formula,@objectstack/client-reactand@objectstack/client.Repo-wide
pnpm lint: not narrowed — inapplicable, established from ESLint's ownconfig resolution rather than assumed.
eslint --no-inline-config --format jsonon thechanged file reports 1 file, 0 errors, and its single warning is
File ignored because no matching configuration was supplied— no config block ineslint.config.mjsmatches.mdxorcontent/. Untouched files cannot move either: theconfig "never enables type-aware linting (no
parserOptions.project, no typed@typescript-eslintrules) for ANY file" (eslint.config.mjs:322-328, recorded there withits own positive control). A one-file
.mdxdiff is outside the linted populationentirely.
skip-changesetapplied — docs-content only, nothing published.Generated by Claude Code