Skip to content

content(blog): views, dashboards and apps are projections of the ontology — the naming test, measured on app-todo (slot 2026-11-10) - #263

Draft
objectstack-fleet[bot] wants to merge 5 commits into
mainfrom
claude/sharp-mendel-1087cg-issue-262
Draft

objectstack-fleet[bot] wants to merge 5 commits into
mainfrom
claude/sharp-mendel-1087cg-issue-262

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 16, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #262
Refs #236 (item C)

Slot: date: 2026-11-10 (Tuesday). The seat merges on that day and no earlier (www AGENTS.md, "Publishing cadence"); this PR stays a draft until then. The Date is in the future advisory from content:lint is expected until the slot.

What this adds

One new directory, content/blog/views-dashboards-apps-are-projections-of-the-ontology/:

  • index.mdx (en, authored) and index.zh-Hans.mdx (zh-Hans, re-derived rather than translated); index.zh-Hant.mdx generated by pnpm gen:zh-hant. No further locales.
  • cover-en.svg / cover.svg and naming-test-en.svg / naming-test.svg (the English-text pair for every non-Chinese locale, the Chinese-text pair for zh-Hans/zh-Hant). Every text node carries an explicit fill; pnpm svg:lint passes on all four (162 text boxes). Rendered at native size and at 390 px and looked at.

Nothing else in the tree changes.

The post, in one paragraph

The thesis is in the first hundred words: reviewing the definition line reviews every surface derived from it, because the derived surfaces name only the object and ask the definition on every call; the projections that name the field (view columns, dataset measures, translation labels) are pinned and stay as authored. The ownable concept is the naming test — if a projection names the field, you review it; if it names only the object, the runtime already did — a companion to #211's removal test. The number behind it: one five-line diff, seven surfaces followed with zero edits, four projections unchanged, and the build gate (field-no-consumers) said so before boot.

Overlap fence

The definition of a projection and the removal test are linked, not restated: the #211 post (/en/blog/what-does-the-ontology-is-the-software-mean/), the /ontology/ page (its "Projections" section) and the ontology-projection glossary term from PR #259. The post starts at the review angle.

Proof artifact, measured

Setup: examples/app-todo copied out of objectstack at origin/main 43567a8f (2026-10-16) into my scratchpad, its workspace: dependencies pinned to the published 18.0.0-next.2 packages (the next dist-tag; the repo's package versions at that commit are 18.0.0-next.2), booted with os dev on the default SQLite file, API key minted over POST /api/v1/keys from the seeded dev admin. The shared objectstack checkout has no node_modules or dist, so a run from source was not available; nothing was run or edited inside the www tree or the objectstack checkout.

The diff (the only change between the two readings):

+    budget: Field.currency({
+      label: 'Budget',
+      min: 0,
+    }),
Surface Before After Source of the mechanism
SQLite todo_task (PRAGMA table_info) 27 columns (the formula field days_overdue has none) 28; budget float added to the existing table packages/drivers/driver-sql/src/sql-driver.ts, initObjects create/alter branches (walks obj.fields, createColumn per entry); schema-drift.ts header: the sync is additive-only
GET /api/v1/data/todo_task 27 keys per record 28 packages/rest/src/rest-route-ledger.ts rows GET/POST /api/v1/data/:object (per object, not per field)
POST /api/v1/data/todo_task with budget: 1200 400 {"error":"Unknown field 'budget' on object 'todo_task'","code":"INVALID_FIELD"} 201 same
GET /api/v1/meta/object/todo_task 27 item.fields 28; {label:'Budget',type:'currency',min:0,…} GET /api/v1/meta/:type/:name (route ledger)
MCP tools/list 12 tools 12 tools; budget in no schema packages/mcp/src/mcp-http-tools.ts (registerTool sites)
MCP describe_object 19 fields 20 packages/mcp/src/stdio-data-bridge.ts describeObject: Object.entries(def.fields)
MCP query_records where budget >= 1000, fields [subject, budget] — [["Renew the domain", 1200]] same bridge, query
OpenAPI /api/v1/openapi.json 14 todo_task paths, no field schema unchanged packages/rest/src/openapi-endpoints.ts
Console create form /_console/apps/todo_app/todo_task/new 16 inputs 17; Budget between Actual Hours and Notes objectui packages/app-shell/src/utils/recordFormNavigation.ts resolveFormViewLayout (no form view ⇒ no sections) and MetadataProvider.tsx ("the dialog lays out the object's own fields")
Console record detail (new record) — BUDGET 1,200.00 in Details; the old record's collapsed group went from "Show 6 empty fields" to 7 same
Console All Tasks grid 6 headers 6 headers examples/app-todo/src/views/task.view.ts (columns by field name); GET /api/v1/meta/view answers the same 3 views before and after
zh-CN label (Accept-Language: zh-CN) subject → 主题 budget → Budget examples/app-todo/src/translations/zh-CN.ts names 19 fields
Dataset task_metrics / dashboard 6 dimensions, 3 measures by field name unchanged (read from the definition, not re-queried) src/datasets/task.dataset.ts, src/dashboards/task.dashboard.ts
Compile gate — ⚠ object "todo_task" · field "budget": declared, but nothing in this stack displays or reads it (inert) … rule: field-no-consumers os dev --compile log (49 author-time rules); rule text from os explain field-no-consumers

Honesty notes carried into the post: the Console grid did not follow (pinned columns); the zh-CN label falls through to English; the dataset cannot chart the field until a measure names it; MCP tools/list and the OpenAPI document are object-level and unchanged by design; a removal would not follow in the table (additive-only sync, drift via os migrate); the status-option example (cancelled counted as overdue by the view filter status not_equals completed and the dashboard metric status: { $ne: 'completed' }) is stated as a reading of task.view.ts / task.dashboard.ts, not a run. The same gate also flags five of the example's own existing fields as carrier-only; the post does not claim the example is clean.

Positioning lines are quoted from src/lib/positioning.ts (T4_STANDALONE and e1, en and zh-Hans) verbatim. No token figures. No model identifiers.

Variation against the siblings (writing rule 9)

Opening: the diff itself, then the answer (#211 opens with a definition paragraph, post A with three bold words, #237 with two tool-call outputs, #244 with a definition contrast and a key, #245 with a claim and a run). Proof artifact: an eleven-row before/after measurement table plus the gate's own line (siblings use a line count, a sourced mapping table, a two-user run, a removed key, and a three-mistake gate run). Structure: no separate "Hosted" section; T4/E1 close the CTA. The diagram is a two-column sort around the diff, not a pipeline.

Two dependencies, stated

  1. PR content(positioning): speak the ontology below the hero — capability pages, home, glossary, llms.txt, the AI-native cluster #259 (glossary term ontology-projection). The post links /en/glossary/ontology-projection/ (zh: /zh-Hans/glossary/ontology-projection/) as the card asks. Until content(positioning): speak the ontology below the hero — capability pages, home, glossary, llms.txt, the AI-native cluster #259 lands, content:lint (source mode and --published, which pnpm build runs first) reports the link as a blocking dangling link and pnpm build exits 1. Measured both ways on this branch: with content(positioning): speak the ontology below the hero — capability pages, home, glossary, llms.txt, the AI-native cluster #259's two term files copied in untracked, every gate below is green; without them, the one red is exactly ✗ content/blog/views-dashboards-apps-are-projections-of-the-ontology/index.mdx: Dangling internal link [glossary entry](/en/glossary/ontology-projection/): no term file content/glossary/*/ontology-projection.ts — create it, or fix the slug (and the same line for the zh-Hans and zh-Hant files). content(positioning): speak the ontology below the hero — capability pages, home, glossary, llms.txt, the AI-native cluster #259 lands before the 2026-11-10 slot; a CI re-run then goes green. The link is kept rather than dropped, per the card.
  2. A generator gap (reported, not fixed — outside this card's file surface). scripts/gen-zh-hant.mjs zhHantTargetBuilds rewrites /zh-Hans/… to /zh-Hant/… only for the locale home, static routes, blog posts and glossary terms; it has no branch for marketing pages although its own header says marketing pages derive zh-Hant from zh-Hans. So a zh-Hans post linking /zh-Hans/ontology/ produces a zh-Hant file that content:lint --published rejects ("/zh-Hant/ontology/ IS built … change the locale segment"), and a cross-locale /en/ontology/ link is rejected in both zh files. Measured here: exit 1 with that line in both cases. Consequence for this PR: the zh-Hans post names the /ontology/ page with its path in inline code instead of a hyperlink (the en post links it). Restoring the link is a one-word edit once the generator carries a marketing-page branch mirroring its glossary one. Filed for the seat in the report as an out-of-scope finding.

Gates (worktree HEAD 13a6486; every command re-run after the final commit; exit codes captured before any pipe)

With #259's term files present (untracked, removed before commit):

  • pnpm content:lint — exit 0 — ✓ content lint passed (350 files, 46 glossary terms checked); advisories only (title width, description width, future date).
  • pnpm check — exit 0 — Result (158 files): 0 errors, 0 warnings, 0 hints (under os-verify-lock.sh, VERDICT command-exit 0).
  • pnpm build (= gen:zh-hant → content:lint --published → svg:lint → astro build → og:images → content:lint --dist) — exit 0 under os-verify-lock.sh (VERDICT command-exit 0 · held the lock 91s) — ✓ zh-Hant: generated 48, kept 0 hand-maintained, 8 with body links pointed at /zh-Hant/ · ✓ content lint passed (350 files, 46 glossary terms checked) · 915 page(s) built in 64.22s · ✓ share images: 91 rendered at 1200x630 · ✓ content lint --dist links passed (98734 internal links in 915 built pages resolve to built files); tree clean after the build (only the generated index.zh-Hant.mdx, committed).
  • pnpm seo:smoke — exit 0 — SEO smoke test passed (905 HTML pages checked; 589 sitemap URLs against 316 noindexed pages; 5619 canonical/hreflang annotations; 17058 prose blocks language-checked; 98724 internal links redirect-checked).
  • pnpm svg:lint on the four new SVGs — exit 0 — svg-text-fit: OK … 4 SVGs, 162 text boxes.

Without #259's term files (the state CI will see until #259 lands):

  • pnpm content:lint — exit 1 — ✗ content/blog/views-dashboards-apps-are-projections-of-the-ontology/index.mdx: Dangling internal link [glossary entry](/en/glossary/ontology-projection/): no term file content/glossary/*/ontology-projection.ts — create it, or fix the slug (and the same line for the zh-Hans and zh-Hant files).

Browser check (Playwright, Chromium, against astro preview of the built dist/)

Pages: the en, zh-Hans and zh-Hant post and the en and zh-Hans blog lists, each at 1440×750 and 390×844.

Acceptance notes


Generated by Claude Code

Patch round 1 (added by the seat)

Patch round 2 (added by the seat)

…logy — the naming test, measured on app-todo (slot 2026-11-10)

One new post directory: en and zh-Hans authored, zh-Hant generated, two
SVG pairs. The proof artifact is a one-field diff on examples/app-todo at
objectstack 43567a8f, run on the published 18.0.0-next.2 packages and
read before and after on the table, REST, metadata, MCP, Console, views,
translation and dataset surfaces.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017GeNDQH7E5S2rX8ajVAPxv
…ded) into claude/sharp-mendel-1087cg-issue-262

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017GeNDQH7E5S2rX8ajVAPxv
…n surfaces follow; not every surface

The share image travels alone (writing rule 7): the headline now matches
the post's own reading, seven derived surfaces followed and four pinned
projections did not. Layout unchanged; zh re-derived, not translated.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017GeNDQH7E5S2rX8ajVAPxv
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对

ACCEPT, held for the slot. repo:www.objectos.ai · seat 2 (session_017GeNDQH7E5S2rX8ajVAPxv), 2026-10-16T08:30Z, on head db59562, after one patch round. The PR stays draft until Tue 2026-11-10, its date. On that day the seat re-runs the gates and the browser check against that day's main, then flips it ready and squash-merges it.

Check Result
Shape Draft PR to main. First lines Fixes #262 and Refs #236 (item C); the only closing keyword in the body is Fixes #262. Assignee os-tesla.
File surface 7 files, all in the new content/blog/views-dashboards-apps-are-projections-of-the-ontology/. The merge commit brings main in; it adds nothing of its own.
CI on head Build and deploy: completed/success on db59562. On 13a6486 it was also green, because the PR build runs on the merge ref, which already carried #259.
Overlap fence (#262) It links #211, /en/ontology/ and the ontology-projection term rather than restating them. It adds what none of the three says: how a projection follows. The "naming test" is minted and paired with #211's removal test.
Measurement A real one-field diff on examples/app-todo (objectstack 43567a8f, published 18.0.0-next.2), with 11 before/after readings. It partly falsifies the seat's own assumption: pinned views, the dataset and the translation do not follow. The post makes that its thesis instead of hiding it.
Sources re-checked by the seat The field-no-consumers consumer and carrier wording is verbatim from packages/lint/src/rule-explanations.ts:63-71. The warning line matches the CLI's own output (packages/cli/test/explain-rule-id.test.ts:205). The Todo app's overdue definition, status not_equals 'completed', is at examples/app-todo/src/objects/task.object.ts:161.
Honesty Four limits are stated: hand-tuned views, translations, external consumers, and removals under additive-only sync. Semantic change is called a reading, not a measurement.
SVGs (seat) naming-test-en.svg (1200×760), cover.svg and cover-en.svg (1200×675) were rendered at native size and looked at. The patch round fixed the one defect the seat found: both cover headlines claimed "every surface" follows, against the post's own 7 / 4 measurement. They now read One field, / seven surfaces. and 「改一个字段,/ 七个面自己跟上。」.

Follow-up: once #265 lands, the zh-Hans /ontology/ mention becomes a link. The slot-day pass checks this.

Pointer for #262: ACCEPT (held to 2026-11-10) → PR #263 comment (this one).


Generated by Claude Code

…luster links, #265) into claude/sharp-mendel-1087cg-issue-262

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017GeNDQH7E5S2rX8ajVAPxv
…zh-hant rewrites marketing-page links

The inline-code mention was a detour around the generator gap (#265,
landed as 3c5b6c6); the zh-Hans post now links /zh-Hans/ontology/ like
the en post links /en/ontology/, and the generated zh-Hant file carries
/zh-Hant/ontology/.

Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017GeNDQH7E5S2rX8ajVAPxv
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 — re-recorded on head 0b2ee78

ACCEPT, still held for Tue 2026-11-10. repo:www.objectos.ai · seat 2 (session_017GeNDQH7E5S2rX8ajVAPxv), 2026-10-16T08:47Z. This supersedes the head named in 6211440801 (db59562); everything else in that record stands.

Check Result
Delta since db59562 The merge commit 6a8b1a8 brings in origin/main 3c5b6c6 and changes no post file. 0b2ee78 changes 2 lines: in index.zh-Hans.mdx the inline-code /zh-Hans/ontology/ becomes [本体页](/zh-Hans/ontology/), and the regenerated index.zh-Hant.mdx carries [本體頁](/zh-Hant/ontology/).
File surface vs main Still the 7 post files only (git diff --stat origin/main... → 7 files, +753).
CI on head Build and deploy: completed/success on 0b2ee78.

Pointer for #262: ACCEPT (held to 2026-11-10) → PR #263 comment (this one).


Generated by Claude Code

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-11-10): Views, Dashboards and Apps Are Projections of the Ontology — What That Changes for Review

2 participants