Repository navigation
Description
Filing gate ③: a maintainer-directed task. Maintainer (Sam, os-zhuang), 2026-10-26: chose 「模型 2:ObjectOS 三版本」 (13:18Z) — ObjectOS is one product in three editions (Community / Cloud / Enterprise), ObjectStack the protocol and SDK; asked 「objectstack.ai 官网和 www.objectos.ai 官网不是很奇怪,区别是什么」 (13:19Z); on the answer (product site vs developer site, one blog, cross-linked navigation) wrote 「同意」 and 「立卡派发」 (13:24Z). Business reason: objectstack.ai and www.objectos.ai open with the same hero and both sell; the developer who lands here needs docs and a start command, the buyer needs the other site. Reader: the devx seat dispatches one dev; file surface apps/docs/app/[lang]/page.tsx (the landing), the docs layout's header / footer navigation, apps/docs/app/[lang]/blog/** and the site's redirects. Dedupe: issue search "docs site homepage hero objectstack.ai landing developer portal" → 5 hits, none open on this: #17351 (closed: count claims dropped from the homepage), #12239 (closed: homepage), #22240 (closed: compare / when-to-use pages — stay, they are developer content). Session session_01FMuBZmssbfQkVrKRtxNvng; siblings: objectstack-ai/www.objectos.ai (the product-site half, filed today), objectstack-ai/docs.objectos.ai#338 (edition model), #26136 (hosted-product name), #26129 (root README).
Roles, as agreed
www.objectos.ai is the product site (hero, editions, pricing, Build & Ask, blog); objectstack.ai is the developer site (protocol, SDK, CLI, docs, "Build with Claude Code"). Precedent: frappeframework.com beside frappe.io.
Scope
- Landing (
apps/docs/app/[lang]/page.tsx): the hero becomes one line of positioning — "ObjectStack is the open protocol and SDK that ObjectOS is built on: one typed business ontology, and the database, API, Console and MCP tools derive from it." — followed by the start command (npm create objectstack@latest), the docs entry points (Getting started · Concepts · Spec · CLI · Build with Claude Code) and the GitHub link. The current sections "The idea / The loop / The gates / The vocabulary" either shrink to a four-link row into the docs pages that carry them, or move into a docs page; the dev proposes which in the PR. - "Run it" strip: three editions in one row — ObjectOS Community (this repository's runtime image, self-hosted, free), ObjectOS Cloud, ObjectOS Enterprise — linking www.objectos.ai; replaces the footer sentence "Rather build & ask online? Try ObjectOS".
- Navigation: header gets "Product → objectos.ai"; the footer labels the two sites by role.
- Blog: www.objectos.ai becomes the one blog. Posts under
apps/docs/app/[lang]/blog/**(at least "the-ontology-is-the-software") get permanent redirects to their imported counterparts once the www card lands (Blocked-by-style sequencing inside the card: the redirect commit waits for the www PR; the rest does not). Until then the posts stay served. - Not in this card: the docs content itself, the README (docs(readme): slim the root README to a reader's page — contributor detail moves to CONTRIBUTING.md, the stale Console-source and ROADMAP lines go, one architecture figure, LICENSING.md names ui/ as MIT #26129), positioning copy (unchanged: the slogan and the four-verb line live on in the product site and the README).
Premises (re-check before dispatch)
- P1 —
grep -c "ontology is the software" apps/docs/app/[lang]/page.tsx≥ 1. - P2 —
ls apps/docs/app/[lang]/bloglists the posts to redirect;curl -s https://objectstack.ai/blog/the-ontology-is-the-software -o /dev/null -w '%{http_code}'→ 200. - P3 — the header component has no link to objectos.ai besides the footer sentence (grep
objectos.aiunderapps/docs).
Acceptance
pnpm docs:buildgreen; the landing renders the one-line positioning, the start command, the docs entry points and the "Run it" strip; Lighthouse / link check unchanged.- No changeset (docs site only).
维护者速读
按你 13:24 的「同意」「立卡派发」:objectstack.ai 改成开发者站。首页不再是和 objectos.ai 相同的营销 hero,而是一行定位 + 开始命令 + 文档入口;加一条「运行它:ObjectOS Community / Cloud / Enterprise」指向 objectos.ai;博客文章在 www 那边导入后做跳转。文档内容本身不动。
Activity
objectstack-fleet commentedon Oct 26, 2026
Filing audit · 2026-10-26T13:35Z ·
session_01FMuBZmssbfQkVrKRtxNvng· ⛔ not a claim, not a dispatch.Triage: lands in
apps/docs/**(the objectstack.ai site →domain:devx,area:devpath); rationale: filing gate ③, the maintainer's 「同意」 / 「立卡派发」 of 2026-10-26 13:24Z on the product-site / developer-site split quoted in the body;priority:p2as a maintainer-directed task. Labels at filing are the filer's suggestion; the triage seat grades. The product-site half is objectstack-ai/www.objectos.ai#286; scope item 4 (blog redirects) waits for #286's import, items 1–3 do not. Siblings: objectstack-ai/docs.objectos.ai#338 (edition model), #26136 (hosted-product name + Powered-by mark), #26129 (root README).Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Claim: PM loop round 1 · 2026-10-26T13:57Z
Session:
session_01FMuBZmssbfQkVrKRtxNvng(project thread; maintainer-directed — Sam, 2026-10-26 13:38Z, verbatim 「相关卡片都归你派发处理落地」)Account:
os-zhuangBranch:
claude/issue-26140-objectstack-ai-developer-siteWorktree:
objectstack-issue-26140Domain:
domain:devxSeat: maintainer-directed (no lane seat post; seat identity recorded on objectstack#24145)
File surface:
apps/docs/app/[lang]/page.tsx,apps/docs/lib/layout.shared.tsx,apps/docs/lib/site.ts,apps/docs/next.config.*(redirects),apps/docs/messages/**or the i18n file the landing copy lives in,content/blog/*.mdx(the four posts: redirect targets, removal only after the product site serves them) — stop on breach; explain in the reportContainer & model: M,
mode:subagent(deviation:os-devagent type not loaded in this project thread; general-purpose subagent under.claude/agents/os-dev.mdverbatim, same session ID, identity by branch),model: default tier (TIER_DEFAULT — dispatch-gates --tier --repo objectstack-ai/objectstack apps/docs/… content/blog/… at d1ea2363: "no path-derived mandate"),effort: highClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6417345842
Premise: holds (re-read on
origin/maind1ea236:apps/docs/app/[lang]/page.tsxcarriesHOME_TITLE = 'The ontology is the software'and the hero prose, 3 hits;apps/docs/lib/layout.shared.tsx:16ESSAY_URL = '/blog/the-ontology-is-the-software';content/blog/holds 4 posts — context-window-is-the-constraint, metadata-driven-architecture, protocol-first-development, the-ontology-is-the-software; the live sites are unreachable from this container, so the reading is source-level)Serial constraints cleared: www.objectos.ai#286 (this session, dispatched in the same round) imports the four posts under their original slugs — the redirects in this card land only after that PR merges (landing order enforced by the seat, not the dev); no open objectstack PR touches
apps/docs/**orcontent/blog/**(36 open PRs read 2026-10-26 13:45Z); PR #26148 (README) is disjointGenerated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
os-dev-report
{ "issue": 26140, "status": "done", "branch": "claude/issue-26140-objectstack-ai-developer-site", "pr": "https://github.com/objectstack-ai/objectstack/pull/26165", "session": "session_01FMuBZmssbfQkVrKRtxNvng", "premise_still_valid": true, "summary": "Premises re-read on origin/main a335f1de (P1: 'ontology is the software' in page.tsx, 3 hits; P2: content/blog holds the four posts and app/[lang]/blog/[[...slug]] renders them, live site unreachable so source-level; P3: the only objectos.ai link under apps/docs was the closing 'Try ObjectOS' sentence). The landing (apps/docs/app/[lang]/page.tsx) now renders the slogan as a kicker, the one positioning line as the heading/title/description/OG/JSON-LD, the start command block (npm create objectstack@latest my-app / cd my-app / npx os dev --ui), five docs entry points (Getting started, Concepts, Spec, CLI, Build with Claude Code), the GitHub link, a four-link row (idea -> /docs/concepts/ontology, loop -> /docs/getting-started/build-with-claude-code, gates -> /docs/getting-started/how-ai-development-works, vocabulary -> /docs/capabilities; all four pages exist, none kept in compact form), the 'Run it' strip (ObjectOS Community -> /docs/deployment/self-hosting; Cloud and Enterprise -> https://www.objectos.ai) and a footer line labelling both sites by role. Header gains 'Product' (external, PRODUCT_SITE_URL); the product-site origin is declared once in redirects.mjs and re-exported. Second commit fb85c546 adds blogRedirects: /blog and /en/blog -> https://www.objectos.ai/en/blog/, each of the four posts at /blog/SLUG and /en/blog/SLUG -> https://www.objectos.ai/en/blog/SLUG/ (308); mdx sources and the blog route stay. The orphaned apps/docs/components/youtube-embed.tsx was removed. Draft PR #26165 opened with assignee os-zhuang and label skip-changeset; its body states the dependency on www.objectos.ai#286 and that the seat sequences the landing.", "tests": "Head fb85c546 for every reading. (1) closure build under the lock: `pnpm --filter '@objectstack/docs^...' build` -> `VERDICT command-exit 0 · held the lock 111s`. (2) `pnpm --filter @objectstack/docs typecheck` (fumadocs-mdx && next typegen && tsc --noEmit) under the lock -> `✓ Types generated successfully`, `VERDICT command-exit 0 · held the lock 9s · waited 121s` (first attempt: `VERDICT queue-timeout (exit 99) · never acquired · waited 540s`, holder pid 7892 = the sibling's cli/console closure build; NOT MEASURED on that attempt, resumed under the same slot). (3) `pnpm --filter @objectstack/docs build` (= pnpm docs:build) under the lock -> `✓ Compiled successfully in 3.8min`, `✓ Generating static pages using 2 workers (1287/1287) in 68s`, `VERDICT command-exit 0 · held the lock 435s`; git status clean afterwards. (4) built app via `next start` on port 20378, curl `%{http_code} %{redirect_url}`: /blog -> 308 https://www.objectos.ai/en/blog/; /blog/the-ontology-is-the-software -> 308 https://www.objectos.ai/en/blog/the-ontology-is-the-software/; /en/blog/the-ontology-is-the-software -> same 308 (no proxy 307 hop); the other three posts and /en/blog -> 308 to their counterparts; /blog/not-a-post -> 404; /docs/guides/cheatsheets/quick-reference -> 308 /docs/getting-started/quick-reference (pre-existing). .next/routes-manifest.json: 10 redirects with destination on objectos.ai. Served `/` (50396 bytes): grep -c positioning sentence 10, `npm create objectstack@latest my-app` 3, `npx os dev --ui` 3, `ObjectOS Community`/`Cloud`/`Enterprise` 3 each, `Run it` 2, `Developer docs & protocol` 1, `Product, editions & blog` 1, the Product nav entry text 1, document title `The open protocol and SDK ObjectOS is built on | ObjectStack`. Server stopped by PID (21634, cwd apps/docs); port probe afterwards 000. (5) `npx eslint --no-inline-config` on page.tsx, layout.shared.tsx, redirects.mjs -> exit 0. No unit test suite exists for apps/docs (no `test` script); no behaviour pinned by a test changed, so no ablation.", "gates": "Derived: `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` at fb85c546 -> 31 commands; each run via eval with `status=$?` captured before any pipe into ran.list -> all 31 `exit 0` (check-closing-keyword-parity, check-comment-mask-corpus, check-doc-frontmatter, check-docs-nav-label, check-keyed-text-bounds, check-position-name-fold-loaders, check-registry-log-declared, check-rest-log-spy-declared, check-undeclared-dep-imports each with --self-test; pnpm check:docs-locale-catch-all, check:docs-redirects (`98 entries -- 95 page destination(s) resolved ... 0 outside the /docs route space`), check:driver-memory-census, check:gitlink-declared, check:logger-receiver-detach, check:nul-bytes, check:org-identifier, check:page-declaration-shape, check:published-files, check:published-readme-links (`29 docs-site page(s) resolved (0 via redirect)`), check:refd-timer-probe, check:test-source-alias, check:tier-file-adoption, check:watch-hint-literal). `--ran` reconciliation: `31 derived, 31 run, 0 NOT-MEASURED, 0 UNRUN` (exit 0). CI on PR #26165 at report time (check-runs on fb85c546): success — Check Changeset, filter, Part-of PR must not also close its card, No other open PR may claim the same issue, The card this PR closes must claim this branch; in_progress — Build Docs, Test Core, Dogfood Regression Gate, Lint · ESLint, Lint · docs & code guards, Lint · repo & tooling gates, Lint · CI release & engine gates, Lint · PM dispatch-gates, Lint · scoped (3), Type Check · workspace / source gates / consumer gates / debt ledger, Governed Surface Queue Guard, Check PR Size, Check Documentation Links, No other open PR may claim the same single-writer path; skipped — Build Core, Test Core shards, UI lanes, Temporal Conformance, Dogfood Verify CLI (path filters). Not re-run locally: repo-wide `pnpm lint`, Test Core, Build Core, lychee link check, the Build Docs CI job. Local-only families (check:dev-prereqs, check:skill-frame-freshness) not derived and not run: packages/spec build touched only as the docs closure, no four-axis file touched.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "0 — no MCP GitHub calls; all GitHub reads via curl to api.github.com, all writes via scripts/pm/", "api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (fleet-write pr_create -> PR #26165, run 40340657259 success, read-back identical 9161/9161 bytes); POST /repos/objectstack-ai/objectstack/issues/26140/comments (this os-dev-report via post-stamped). git push x2 landed (probe + commits; a third attempt was refused locally by the pre-push hook before reaching the remote).", "deviations": [ "Commit trailers: common.md and the harness reminder prescribe a co-author trailer that names the model; os-dev.md (『trailer pair 一律 model-free』) and the pre-push hook `check:commit-card-trailers` require the model-free pair. os-dev.md wins: both commits were reworded to the model-free `Co-authored-by: Claude` + noreply address pair plus the Claude-Session trailer before their first successful push (the refused push never reached the remote; no history rewrite).", "PR-body footer: common.md gives the bare `claude.ai/code` form for both surfaces; os-dev.md and AGENTS.md give the session-URL form for PR bodies. os-dev.md wins: the PR body carries `_Generated by [Claude Code](https://claude.ai/code/session_01FMuBZmssbfQkVrKRtxNvng)_`; the comment carries the bare form.", "File surface extended by one deletion: apps/docs/components/youtube-embed.tsx (not on the claim's list) — its only consumer was the hero this card retires, so leaving it would land dead code; declared in the PR body.", "Verify lock: the first typecheck attempt timed out in the queue (exit 99, waited 540s; holder pid 7892 = the sibling's `turbo run build --filter=@objectstack/cli^... --filter=@object-ui/console^...`); read as NOT MEASURED, resumed under OS_VERIFY_LOCK_SLOT=issue-26140 and measured on the second attempt.", "Preview-server teardown: killing the recorded `npx next start` pid left its `next-server` child alive; the child was identified by cwd under /proc (pid 21634, cwd apps/docs of this worktree) and stopped by that PID — no name-based kill; port confirmed closed.", "Live sites unreachable from the container: P2's `curl https://objectstack.ai/blog/... -> 200` could not be measured; the blog route and the four sources were verified at source level and in the built app instead." ], "open_questions": [ { "question": "Should the header keep `Why` (-> /blog/the-ontology-is-the-software) and `Blog` (-> /blog) once both resolve off-site through the new redirects?", "options": [ "A keep both as site-relative links through the redirect until the blog-removal follow-up (as landed in this PR)", "B drop `Blog` now and re-point `Why` to the product-site URL directly in this PR" ], "recommendation": "A, because (实际业务需求) the essay is still the developer's 'why' and the redirect is the measured mechanism that keeps every existing link alive; (长远合理性) the follow-up that deletes the route and sources is the natural place to re-point the nav in one move; (防 AI 犯错) one relative URL constant (ESSAY_URL) with one redirect owner beats two spellings of the destination living in two repos; (创业阶段不扩散) B widens this card into nav redesign the ruling did not ask for." } ], "out_of_scope_findings": [ "class: none (observation, no card) · reach: n/a · app/sitemap.ts keeps listing /blog and the four posts (derived from the blog loader) — after this PR lands those entries answer 308 to another host; they vanish with the blog-removal follow-up (route + content/blog). carrier: the blog-removal follow-up PR (no card yet; noted in Acceptance notes) · dedupe: sitemap blog redirect objectos follow-up", "class: none (dead entry, no card) · reach: n/a · apps/docs/app/[lang]/layout.tsx LANGUAGE_NAMES carries `cn: '中文'` while lib/i18n.ts declares only `en` — unreachable by construction. carrier: none · noted in Acceptance notes only", "class: none (follow-up, no card) · the blog-removal follow-up after redirects are measured on production: delete app/[lang]/blog/**, content/blog/*.mdx, the blog loader in lib/source.ts, the sitemap entries, and re-point/drop the `Why`/`Blog` nav entries; check-doc-frontmatter's content/blog high-water mark will need its ledger moved in that PR. carrier: the devx seat · dedupe: blog removal content/blog route sitemap frontmatter high-water" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
Landed · 2026-10-27T01:04Z ·
session_01FMuBZmssbfQkVrKRtxNvngmerged: true,merged_at2026-10-27T01:03:00Z by the merge queue, headfb85c546(unchanged since the ACCEPT, 6418892176), squash61c07986. Flipped ready + auto-merge at 2026-10-27T00:48Z (relayfw-20261027T004811Z),added_to_merge_queueat 2026-10-27T00:47:59Z, one queue round, no dequeue. Held until www.objectos.ai#288 merged at 2026-10-27T00:44:05Z, per the ACCEPT's clause 6, so no redirect answers into a 404.origin/main61c07986"docs(site): objectstack.ai becomes the developer site … (#26165)". On that tree:apps/docs/redirects.mjsexportsPRODUCT_SITE_ORIGINandblogRedirects(/blogand the four moved slugs under both path prefixes →https://www.objectos.ai/en/blog/…/);apps/docs/lib/layout.shared.tsxreadsPRODUCT_SITE_URL(2 uses: navProductentry + export);apps/docs/app/[lang]/page.tsxnamesObjectOS Community/Cloud/Enterprisein the "Run it" strip and carriesnpm create objectstack@latest;apps/docs/components/youtube-embed.tsxis gone.content/blog/<slug>/index.mdxfor all four slugs is on www.objectos.aimain(657a634d, #288's merge).closed_by_pull_requestsFixes #26140); #26129 (devx seat 2's README card) untouched.Status: card closed by
Fixeson merge;pm:dispatchedremoved in this stroke;domain:devx/area:devpath/priority:p2stay. Delivered: the developer-site landing (one-line positioning, start command, five docs entry points, four-link row, "Run it" strip, two-site footer), theProductnav entry, and the permanent blog redirects to the product site. Remainder and owner: deleting the blog route and sources here (app/[lang]/blog/**,content/blog/*.mdx, the blog loader and its sitemap entries, re-pointingWhy) is a devx follow-up card, filed by this seat once the redirects are measured on production; until then the sources stay and the sitemap lists redirecting URLs, as the PR's Acceptance notes record.Generated by Claude Code