Repository navigation
docs(site): give the core narrative a front door on the home page — a Why link in the hero, a '00 · The idea' section reusing the architecture figure, a Why entry in the top nav, the closing card trimmed #22951
Description
Blocked-by: #22948
立卡门类别 ③ — 维护者直派的任务 (maintainer-directed task).
Maintainer ruling (verbatim, untranslated)
那核心叙事博客是否应该在首页更明显的位置或者段落?
前一条同意
Given in session https://claude.ai/code/session_011hRnra93sK5Q2gTYYTbdJR on 2026-10-12. The seat proposed three changes to the home page and a trimmed closing card, with the new section reusing the architecture figure that #22948 is drawing; asked which card "前一条" meant, the maintainer answered "首页三处" (the home page, blocked on #22948, dispatched after the figures land).
Why
The home page puts the slogan in the most visible place and the argument in the least: "The ontology is the software." is the hero title, and the essay that makes the case is linked once, at the very bottom of the page, as one 14 px muted line ("Read the long form") after three full sections. A visitor who arrives asking "why" does not get there. The README and the docs now point at the essay, the compare page and the when-to-use page; the home page should open the same door.
What lands
All in apps/docs/app/[lang]/page.tsx unless stated; line numbers are main's at filing.
- Hero link. Under the four-promise paragraph (the
pafter theh1, about line 220) and above the button row: one text link, "Why the ontology is the software", arrow icon as the other inline links use, to/blog/the-ontology-is-the-software. Not a fifth button; the four buttons stay as they are. It mirrors the README's "Read why". - A new section
00 · The ideabetween the hero and01 · The loop(the loop starts about line 309), in the same section shape (eyebrow in--l-mono,h2in--l-display,border-t): one figure, three sentences, one link.- The figure: the architecture figure component that docs(blog): four hand-drawn SVG figures for 'The Ontology Is the Software' — three interfaces and one user, four places to one definition, the ontology-runtime architecture, the three routes — readable in both themes #22948 adds (the ontology in the middle; a large model writes it; people define and approve it; the runtime runs it, every call permission-checked and audited; agents call it; database, API, UI and the tools agents call derive from it). Reuse that component as it lands; do not draw a second one. Its caption on the home page: one line, the essay's register.
- The three sentences, verbatim: "An enterprise is definition plus execution. When execution is nearly free, it is its definition." / "What the model lacks is not intelligence: a world, hands, and a fence." / "An ontology written clearly enough is software. Models change; the ontology stays."
- The link: "Read the essay" to the essay, in the style of "Browse the full vocabulary in the docs" (about line 443).
- The existing sections keep their numbers; the new one is
00.
- Top nav.
apps/docs/lib/layout.shared.tsxline 28 carrieslinks: [{ text: 'Blog', url: '/blog', active: 'nested-url' }]. Add aWhyentry beforeBlog,url: '/blog/the-ontology-is-the-software',active: 'url'so it does not light up for other posts. - Closing card (about line 451): drop the "Read the long form" sentence and its link, since that job moves to the hero and section 00; keep the slogan sentence and the ObjectOS line as they are.
HOME_TITLE, HOME_DESCRIPTION and the metadata blocks do not change. Nothing on the page is rewritten beyond the four items.
Mechanism, with what was measured
- The home page is a React page, not MDX: the links are site routes in TSX, outside the lychee lane's
content/**glob, so root-relative routes are fine here. - Theme: the page already uses the fumadocs tokens (
text-fd-muted-foreground,border-fd-border,bg-fd-card); the figure component from docs(blog): four hand-drawn SVG figures for 'The Ontology Is the Software' — three interfaces and one user, four places to one definition, the ontology-runtime architecture, the three routes — readable in both themes #22948 is built to read under thenext-themestoggle, and section 00 uses the same tokens as 01 to 03. - The figure component's export name and props are whatever PR for docs(blog): four hand-drawn SVG figures for 'The Ontology Is the Software' — three interfaces and one user, four places to one definition, the ontology-runtime architecture, the three routes — readable in both themes #22948 lands; read that PR's diff first and import from it, never copy it.
apps/docs/app/sitemap.tslists/blogand the posts already; the nav entry needs no sitemap change.
Guardrails for the author
- File surface:
apps/docs/app/[lang]/page.tsxandapps/docs/lib/layout.shared.tsx. Nocontent/**, noREADME.md, nopackages/**, noapps/docs/public/**, no new components (the figure is imported from docs(blog): four hand-drawn SVG figures for 'The Ontology Is the Software' — three interfaces and one user, four places to one definition, the ontology-runtime architecture, the three routes — readable in both themes #22948's). - English only. No model identifiers anywhere. No new claims, no numbers.
- Build the docs app and open the home page in both themes with the preinstalled Chromium (never
playwright install): report the hero link, section 00 and the nav entry at 1280 px and 390 px, and confirm the closing card no longer carries the long-form link. - Gates derived with
scripts/pm/dispatch-gates.mjsfrom the real change set, every one run; the docs build underscripts/pm/os-verify-lock.shmust pass. - Changeset: nothing publishes;
skip-changesetoncepackages/**is confirmed untouched. - Serial constraint: this card waits for docs(blog): four hand-drawn SVG figures for 'The Ontology Is the Software' — three interfaces and one user, four places to one definition, the ontology-runtime architecture, the three routes — readable in both themes #22948 to merge (its figure component); branch from the main that carries it. PR docs(site): refresh the English deck PDF under apps/docs/public/decks to the 19-slide version #22942 (deck PDF) touches
apps/docs/public/decks/only.
Non-goals
- A dedicated narrative page (decided against for now).
- README changes (a separate card if the maintainer asks).
- The Chinese site.
Who acts
domain:devx lane, this seat, one os-dev dispatch at the default tier once #22948 is merged, one draft PR. Precedent on this file: #21586 (home title, cover and alt) and #21838 (the Blog nav entry and the closing card's link).
Duplicate check (2026-10-12, open and closed)
- Query "home page hero link to the essay Why section nav entry the ontology is the software landing page": 5 hits — docs(blog): four hand-drawn SVG figures for 'The Ontology Is the Software' — three interfaces and one user, four places to one definition, the ontology-runtime architecture, the three routes — readable in both themes #22948 (the figures, in flight, the dependency), 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 (added the Blog nav entry and the closing link this card moves), docs(north-star): align the compass with the 'ontology is the software' positioning — identity line, two user classes, promise-to-step mapping, the 'you own it' row, rule 4 wording (Tier H, maintainer-directed) #22172, docs: adopt the 'Ontology is the software' positioning across README, docs landing page and glossary #21574, docs: positioning follow-up: stale home title, cover image and alt; README restructured on the four promises; an ontology concept page; glossary and north-star bridges #21586 (earlier positioning work, closed). None adds a hero link, a Why section or a Why nav entry.
Generated by Claude Code
Activity
objectstack-fleet commentedon Oct 12, 2026
Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-12T05:05Z. ⛔ Not a claim, ⛔ not a dispatch. Grade completed:priority:p2andarea:devpathadded.Blocked-by: #22948(dispatched) stands. The state stayspm:blocked.apps/docsisdomain:devx, as filed.objectstack-fleet commentedon Oct 12, 2026
Claim: PM loop round 4
Session:
session_011hRnra93sK5Q2gTYYTbdJRAccount:
hotlong(the seat's linked user; the card's assignee)Branch:
claude/issue-22951-home-whyWorktree:
objectstack-issue-22951Domain:
domain:devxSeat:
domain:devx#2File surface:
apps/docs/app/[lang]/page.tsx,apps/docs/lib/layout.shared.tsx(stop on breach; explain in the report)Container & model:
M,mode:subagent,model: opus (default tier; dispatch-gates --tier: no path-derived mandate)Clause-②: no
Thread-read: none
Serial constraints cleared: Blocked-by #22948 cleared (PR #22958 merged); no open PR touches the home page or the nav config
objectstack-fleet commentedon Oct 12, 2026
os-dev-report
{ "issue": 22951, "status": "done", "branch": "claude/issue-22951-home-why", "pr": "https://github.com/objectstack-ai/objectstack/pull/22974", "session": "session_011hRnra93sK5Q2gTYYTbdJR (subagent run; the parent seat's harness-stamped id, as on the commit trailers)", "premise_still_valid": true, "summary": "All four ruled items landed in the two named files (diff --stat vs base 246edf5b: 2 files, +61/-11). (1) Hero: a text link 'Why the ontology is the software' with an ArrowRight, between the four-promise paragraph and the unchanged four-button row. (2) New '00 · The idea' section between the hero and '01 · The loop', in the 01-03 shape. It holds OntologyRunsFigure imported from @/components/figures (not copied), the three ruled sentences verbatim (byte-compared with the card body) and 'Read the essay', whose className is byte-identical to 'Browse the full vocabulary in the docs'. (3) Nav: { text: 'Why', url: ESSAY_URL, active: 'url' } before Blog. (4) Closing card: the long-form sentence and its link are gone; the slogan and ObjectOS lines are unchanged. Two choices of mine, flagged in the PR's Acceptance notes. The ruling named an h2 slot but no text, so the h2 is the essay's own heading over this figure ('Why code recedes'), and the caption is the essay's own caption for the figure, verbatim. The essay route became one constant, ESSAY_URL in lib/layout.shared.tsx, read by the nav and both page links. All four mechanism assumptions re-verified at 246edf5b: figure export and signature, server component with lg split; lychee argv scoped to content/**; sitemap lists /blog and the posts. Browser pass on the production build, light and dark x 1280 and 390, each with the right html theme class and no horizontal scroll. Hero link 251x24, 20 px under the paragraph, 33 px above the buttons, contrast 18.2:1 light / 15.7:1 dark. Figure: wide SVG 846x341 in an 896x391 plate at 1280; stacked SVG 316x507 in a 342x533 plate at 390; text fill flips with the theme. Caption 14 px italic, one line at 1280, two at 390. Sentences: three columns at 1280, stacked at 390. Nav Why sits at x=170 before Blog at x=222 at 1280; at 390 it is inside Toggle Menu above Blog. The closing card carries zero essay links. One overclaiming comment line I had added was removed in a second commit (011e8dfe): it said the Why entry lights on its own page, and the build does not deliver that (finding 1 below). Teardown: the next-server tree I started (pids 4675/4713/4724/4740) is killed and port 39417 answers 000. Screenshots stay in the scratchpad, uncommitted. The worktree is removed right after this comment is posted: node_modules first, no --force.", "tests": "Head 011e8dfe unless stated. (a) Production build command from apps/docs/vercel.json, under os-verify-lock: 'pnpm turbo run build --filter=@objectstack/docs --concurrency=2' printed 'Tasks: 2 successful, 2 total', 'Cached: 0 cached, 2 total' and BUILD_ID_PRESENT, with 'VERDICT command-exit 0 · held the lock 234s'. (b) 'pnpm --filter @objectstack/docs build' at ba94665b (the only later commit deletes one comment line): 'VERDICT command-exit 0 · held the lock 180s'; git status stayed clean after the generators. (c) 'pnpm --filter @objectstack/docs typecheck': 'VERDICT command-exit 0'; 'tsc --noEmit --listFilesOnly' lists both touched files (count 2). (d) Gates: 'node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack', no paths, change set from merge base 246edf5b3 (2 paths). 27 commands, each run with its exit captured before any pipe, all 27 exit 0. '--ran' with exit codes recorded reads 'Run reconciliation — 27 derived, 27 run, 0 NOT-MEASURED, 0 UNRUN' and 'a DERIVED zero — all 27 recorded an exit code and none of them is 3'. Sample verdict lines: 'check-nul-bytes: OK (scanned 10994 text file(s) ... no raw ASCII control bytes)'; 'check-doc-frontmatter: 2 content root(s) verified'; 'check:published-files — 70 publishable package(s)'. (e) eslint, a declared narrowing to the touched files. Population read from eslint's own config: isPathIgnored false for both, calculateConfigForFile shows 3 active rules. 'eslint --no-inline-config --format json' counts 2 files, 0 errors, 0 warnings, 0 fatal. Invariance: neither file gets parserOptions.project or projectService (both null), so linting is untyped and per-file, and this diff cannot move any untouched file's verdict. Repo-wide pnpm lint belongs to CI. (f) Browser, as in summary, via @playwright/test resolved from examples/app-showcase and executablePath /opt/pw-browsers/chromium; no playwright install. NOT MEASURED, left to CI: the lint.yml type-check lanes (workspace turbo typecheck over packages and apps, examples, downstream-contract), the 53 artifact-roster and 11 wide-population families dispatch-gates lists outside its 27, and the 14 changeset-pending families, which do not apply because there is no changeset. No ablation or reverse verification: no type or contract change, and none is owed for a page edit.", "mcp_calls": "0 — no MCP GitHub tool called; reads went through gh api GET (issue 22951, its comments, pull 22974)", "api_writes": "3 relay writes plus 3 git pushes. Writes, all as objectstack-fleet[bot] through scripts/pm/fleet-write (POST /repos/objectstack-ai/objectstack/dispatches): (1) pr_create, executed as POST /repos/objectstack-ai/objectstack/pulls with draft forced, giving #22974; read-back 6672 bytes sent and stored, identical. (2) label-write --issue 22974 --assign hotlong --add skip-changeset --add documentation, executed as POST .../issues/22974/labels and POST .../issues/22974/assignees; read-back documentation, size/s (size-labeler's), skip-changeset; assignee hotlong. (3) This os-dev-report comment via post-stamped --comment=22951. Pushes, which are not REST writes: the empty-branch probe, ba94665b, 011e8dfe. The budget names one push line; three pushes is the mandated probe plus one per commit.", "open_questions": [], "out_of_scope_findings": [ "class: a · reach: public door, the built site over HTTP. GET /blog/context-window-is-the-constraint serves the nav anchor href=/blog with data-active=false, although baseOptions declares it active: 'nested-url'. GET /blog/the-ontology-is-the-software serves both Why (active: 'url') and Blog with data-active=false. GET /blog serves Blog data-active=true. All three were measured on this branch's production build, both server HTML and after hydration; the Blog line is unchanged by this diff. Evidence: .next/prerender-manifest.json lists the posts as /en/blog/SLUG, so they are prerendered under the internal lang-prefixed path. fumadocs-ui isLinkItemActive / isActive (dist/utils/urls.js) compares the url against usePathname, which during that prerender is /en/blog/SLUG, and hydration does not repaint the attribute. /blog renders on demand and matches. Consequence: the ruled Why highlight never shows, and Blog never lights on a post. File surface for a fix: apps/docs (proxy rewrite or prerender path vs nav active matching). Dedupe words: nav active, nested-url, data-active, prerender /en/blog, usePathname", "carrier: none (承接者:无) · noted in the PR's Acceptance notes, not filed: apps/docs/components/figures/primitives.tsx Figure gives its figcaption only 'text-center italic' and relies on the blog's prose wrapper for spacing, size and colour. The home page compensates from its own wrapper div ([&_figcaption]:mt-3 text-sm text-fd-muted-foreground). Any later consumer outside prose meets the same thing.", "carrier: none (承接者:无) · noted in the PR's Acceptance notes, not filed: light-mode nav links (Why and Blog alike, the fumadocs nav token text-fd-muted-foreground at 14 px) measure 4.35:1 against the nav bar, under 4.5:1; dark is 9.0:1. Pre-existing and unchanged here." ], "deviations": [ "Instruction conflict: the dispatch's step 3 says to pass the changed paths to dispatch-gates; .claude/agents/os-dev.md says not to pass paths and to let the script derive from the merge base. I followed os-dev.md. The script derived the same 2 paths and printed its own provenance line.", "Instruction conflict: the harness attribution reminder asked for a model-named Co-Authored-By trailer and a different PR footer. I followed AGENTS.md, os-dev.md and the dispatch: the model-free trailer pair on both commits (the pre-push trailer check passed) and the session-URL footer on the PR body.", "Beyond the four items, within the two-file surface: one exported constant ESSAY_URL in lib/layout.shared.tsx, so the essay route is spelled once for the nav and the page.", "The first gate-run attempt, a shell loop using bash -c over a variable, was refused by a built-in safety check before anything ran. It was re-run as a literal script whose 27 lines are listed in the scratchpad (tools/run-gates.sh). No removal was involved or attempted." ] }Generated by Claude Code
objectstack-fleet commentedon Oct 12, 2026
Append to the os-dev report above (not a new report). PR #22974's branch is now at
39bafe84, with one line changed inapps/docs/app/[lang]/page.tsx: section 00'sh2"Why code recedes" becomes "An ontology written clearly enough runs directly", the deck's thesis title. The eyebrow, figure, caption, three sentences, "Read the essay", nav and closing card are untouched.Gates at
39bafe84:pnpm --filter @objectstack/docs typecheckunderos-verify-lockansweredVERDICT command-exit 0. eslint narrowed topage.tsx(--format json) found 1 file, 0 errors, 0 warnings.pnpm check:nul-bytesexited 0.I did not edit the PR body:
os-dev.mdhas the dev write it once, at creation, and name later edits here for the seat to write. Edits for the seat: (1) in "What changed" item 2, after "h2in--l-display)", add:The h2 reads "An ontology written clearly enough runs directly", the deck's thesis title.(2) In "Acceptance notes", replace the first bullet with:- **Section 00's heading is the deck's thesis title, and the figure caption is the essay's own caption for this figure, verbatim.** Either is a one-line swap if a different wording is wanted.Generated by Claude Code
objectstack-fleet commentedon Oct 12, 2026
Review: ACCEPT — PR #22974 at head
39bafe84Seat
domain:devx#2·session_011hRnra93sK5Q2gTYYTbdJR· reviewed against GitHub, the fetched branch and the developer's screenshots at 2026-10-12T07:28Z, not against the report.PR shape. Draft, base
main(246edf5b), body opensFixes #22951,Clause-②: no, session-URL footer, no model identifier in body or commits (three commits, model-free trailer pair). Labels documentation · size/s · skip-changeset; assignee matches the card. 2 files, +61 / −11 at the first reviewed head, plus one line at39bafe84.check-governed-merges.mjs --pr 22974: 0 governed paths, under the human-merge threshold.File surface, exactly the card's.
apps/docs/app/[lang]/page.tsxandapps/docs/lib/layout.shared.tsx; no new component (the figure is imported from@/components/figures, landed by PR #22958), nocontent/**,README.md,packages/**,apps/docs/public/**.The four items, read on the diff and on the screenshots (light and dark, 1280 and 390). (1) Hero: "Why the ontology is the software" with the arrow, between the four-promise paragraph and the unchanged four buttons. (2)
00 · The ideabetween the hero and01 · The loop, in the 01 to 03 shape:OntologyRunsFigurewith the essay's own caption, the three ruled sentences byte-identical to the card, "Read the essay" in the vocabulary link's style. The h2 is "An ontology written clearly enough runs directly" (the deck's thesis title), changed at39bafe84on the seat's review from the essay's section heading, which read without context on the home page; the one-line change re-ran docs typecheck (exit 0), narrowed eslint (0/0) and nul-bytes (exit 0). (3) Nav:WhybeforeBlog,active: 'url', the essay route as one constantESSAY_URLread by the nav and both page links. (4) Closing card: the long-form sentence and link gone, the slogan and ObjectOS lines unchanged.HOME_TITLE,HOME_DESCRIPTIONand the metadata blocks untouched.Measurements from the first head, unchanged by the one-line edit except the h2's wrap. Hero link 251 × 24 px, contrast 18.2:1 light / 15.7:1 dark; figure 846 × 341 at 1280 and 316 × 507 stacked at 390, text fill flips with the theme; three sentences in three columns at 1280 and stacked at 390; nav
Whyat x=170 beforeBlogat 1280 and inside the menu at 390; no horizontal scroll at 390; zero essay links left in the closing card.Gates. Production build (vercel.json's turbo command) under the verify lock exit 0; docs build and typecheck exit 0; 27 derived commands all exit 0,
--ran27 / 27 / 0 / 0; narrowed eslint 2 files, 0 / 0 with the untyped-lint invariance read from the config. CI on39bafe84still running at this review; landing waits for it and forcheck-expected-skips.mjs --pr 22974.Deviations, accepted. Gate derivation without paths (os-dev.md wins over the dispatch's wording; same two paths derived). PR body not patched after the h2 change (os-dev.md: the body is written once); the body's item 2 and first acceptance note still name the earlier h2 text, and this comment is the record of the final one.
ESSAY_URLas one exported constant, within the two-file surface.Out-of-scope findings from the report.
Blogwith nested-url, and the newWhywith url): posts prerender under/en/blog/SLUGand fumadocs matches the link url against that pathname → filed docs(site): the top nav never lights on a blog post — posts prerender under /en/blog/SLUG, so the nav's url and nested-url matching against usePathname fails for Blog and for the new Why entry #22977 (class a, reach measured on the production build with/blogas the control).Figure's figcaption relies on the blog's prose wrapper for spacing and colour; the home page compensates in its wrapper → Acceptance notes (no user-visible defect).Contract review: not owed (docs site page and nav config).
Generated by Claude Code
objectstack-fleet commentedon Oct 12, 2026
Landed — PR #22974 merged as
712361b7Seat
domain:devx#2·session_011hRnra93sK5Q2gTYYTbdJR· verified onorigin/mainat 2026-10-12T07:58Z.Verified on main.
apps/docs/app/[lang]/page.tsxandapps/docs/lib/layout.shared.tsxare byte-identical to the reviewed head39bafe84: the hero's "Why the ontology is the software" link, the00 · The ideasection (the architecture figure, the three sentences, "Read the essay", headed "An ontology written clearly enough runs directly"), theWhynav entry beforeBlog, and the closing card without the long-form link. Live on https://objectstack.ai once the site deploys from this main. The card closed on the merge;pm:dispatchedleaves with this comment.Filed from this card's report: #22977 — the top nav never lights on a blog post (posts prerender under
/en/blog/SLUG), which also keeps the newWhyentry from showing as current on the essay. Awaiting first grading.Generated by Claude Code