docs: one positioning constant, one gate, ObjectOS as Cloud or Enterprise (PR 1 of #171) - #293
Merged
Merged
Conversation
…rame ObjectOS as Cloud or Enterprise
One constant, apps/docs/lib/positioning.ts, quotes the objectstack README
verbatim (the headline, the four promises, the ObjectOS sentence) plus the
edition clause the maintainer fixed. The site-wide meta description, the
/llms.txt summary and the index frontmatter all carry it, and a new gate,
.github/scripts/check-positioning.mjs, fails CI when a copy differs, when a
brand spelling other than ObjectOS ships, or when a retired sentence
("self-hosted runtime", "Open source, Apache-2.0", "never phones home",
"No license server") comes back. Wired after the build in ci.yml and into
the self-test runner.
Prose: the index, quickstart, why, architecture, security, FAQ, glossary,
AI-skills and extend-existing-systems pages now say what ObjectOS is the
way the README does, carry both editions (Cloud, Enterprise) in every
positioning sentence, correct the licence facts (ObjectOS is commercial;
self-managed validates its licence online, air-gapped Enterprise offline),
attribute the agent skills to ObjectStack, and adopt the README's boundary
on federation (read-only by default, early). The open `os start` path is
named as ObjectStack's runtime and linked as such.
The redirecting root leaves the sitemap, and check-locale-surface.mjs's
oracle follows (its self-test now pins the root as unexpected-url). The 41
locale siblings whose assertions the English edits reverse are deleted.
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FeA1nwBz1ohH65dvffUGKr
…expect it smoke-docs.mjs asserts the H1 of `/` and `/en/docs` after their redirects, and the same list runs post-deploy with a rollback behind it. The index page's title changed from the bare brand to "Introduction", so the two targets follow; the comment says what a pre-change version reads as. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01FeA1nwBz1ohH65dvffUGKr
Contributor
Author
维护者速读(终稿) · 2026-10-05T12:07Z改了什么
为什么改
风险与代价(含回滚)
席位意见
你要做的(一个动作)
Generated by Claude Code |
The maintainer asked why the gate was 895 lines for three rules. It now
keeps exactly those three and nothing else:
(a) the index frontmatter description, the site-wide meta description (as
the built _not-found.html carries it) and the built /llms.txt summary
line each equal POSITIONING, composed from lib/positioning.ts's own
literals and its own join line;
(b) no built HTML page and neither llms body spells the brand
"ObjectStack Protocol", "ObjectStack Documentation", "Object OS",
"objectOS" or "ObjectOs" (the build is read, so the accepted comment in
lib/i18n.ts stays out of scope);
(c) the eight stale sentences stay out of the English content/docs
sources, outside code fences and MDX comments, with the open-source
check scoped to the glossary's ObjectOS entry.
The --self-test is six inline cases, one good and one bad fixture per
rule, each bad one pinned to an exact finding count. The ci.yml step, the
run-self-tests.mjs entry and the check:positioning script are unchanged;
the runner's comment now describes the inline fixtures.
Part of #171
Co-Authored-By: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FeA1nwBz1ohH65dvffUGKr
Contributor
Author
维护者速读(更新) · 2026-10-05T13:47Z改了什么(与上一版的差别)
为什么改
风险与代价(含回滚)
席位意见
你要做的(一个动作)
Generated by Claude Code |
os-zhuang
approved these changes
Oct 5, 2026
os-zhuang
marked this pull request as ready for review
October 5, 2026 23:51
This was referenced Oct 6, 2026
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of #171 — PR 1 of two. PR 2 (the terms and privacy pages, Q3) and #167's titles follow, so this PR closes nothing.
What this does
One constant.
apps/docs/lib/positioning.tsquotes the objectstackREADME.md(lines 7-16 and 26-30 atmain) verbatim, plus the edition clause the maintainer fixed under Q1 and Q2. Three surfaces read it: the site-wide meta description (app/layout.tsx), the/llms.txtsummary line (app/llms.txt/route.ts, which also takes its# ObjectOStitle fromSITE_NAMEnow), and thedescriptionfrontmatter ofcontent/docs/index.mdx, written out because frontmatter cannot import.llms-full.txtcarried no copy and is untouched.One gate.
.github/scripts/check-positioning.mjs, aPositioningstep inci.ymlafterbuild, listed intools/ci-scripts/run-self-tests.mjs, withpnpm check:positioningat the root. Its rules are below.The prose. Nine English pages say what ObjectOS is the way the README does, carry both editions in every positioning sentence, and correct the licence facts. Every changed sentence is in the table below.
The sitemap. The redirecting root (
priority: 1in every locale) leavesapp/sitemap.ts, following www.objectos.ai'snoindexdispatch page that is filtered out of its sitemap.check-locale-surface.mjs's oracle no longer expects the root, and its self-test gains a case that pins a returning root asunexpected-url.Siblings. 41 locale files are deleted under ruling
5989567068on #256 — the list and the triggering English sentence per page are below.The canonical strings, as used
ONTOLOGY_HEADLINEONTOLOGY_PROMISEOBJECTOS_DEFINITIONOBJECTOS_EDITIONSCANONICAL.md, from rulings Q1 + Q2POSITIONINGOne substitution, declared as
CANONICAL.mdasks: T4 reads "built on ObjectStack" where the README reads "built on this stack". Inside the README the phrase has a referent; on this site it has none. The module's header says the same so nobody corrects it back. T3 (the pills) is not used: every page that needs the four promises spells them out as the four bold bullet heads onwhy.mdx, and the paragraph form already carries each claim once.The gate's rules
node .github/scripts/check-positioning.mjs(gate) ·--self-test(37 fixture cases; every one of the 16 rules fires and the baseline is silent).(a) The copies agree with the constant
positioning-source— the four literals parse out oflib/positioning.tsand the module imports nothing (it sits on the root layout, so an import ships in every bundle).index-description—index.mdxfrontmatterdescriptionis byte-equal toPOSITIONING.layout-description—app/layout.tsximportsPOSITIONINGfrom@/lib/positioningand its metadatadescription:reads it.llms-summary-source—app/llms.txt/route.tsimportsPOSITIONING.llms-summary-built— the built/llms.txtsummary line is> POSITIONING. This also pins the composition: the gate joins the four literals with single spaces and the shipped line proves the module did the same.index-meta-built— the built English index page'sdescriptionandog:descriptionarePOSITIONING.(b) One brand spelling in shipped output (the 2026-09-08 mandate)
site-name—lib/source.tsdeclaresSITE_NAME = 'ObjectOS'.title-suffix— every built docs page's title ends with| ObjectOS.og-site-name— every built docs page'sog:site_nameisObjectOS.llms-title— the built/llms.txtopens with# ObjectOS.brand-spelling— no built page and neitherllmsbody carriesObject OS,Object-OS,ObjectOs,Objectos,OBJECTOS,objectOS,ObjectStack ProtocolorObjectStack Documentation. Case-sensitive, so the host and the package scope are not hits.(c) A stale sentence does not come back — over the English sources under
content/docs/, outside fences and MDX comments, paragraph by paragraph so a wrapped sentence is still one sentencestale-self-hosted— "ObjectOS is a self-hosted runtime".stale-open-source— a paragraph calling ObjectOS "Open source, Apache-2.0" without naming ObjectStack (the glossary shape; the licence page's contrast names both and stays silent).stale-phones-home— "never phones home", "does not call home" and kin; a question ("Does ObjectOS phone home?") is not a claim.stale-license-server— "No license server.", "No license check.", "does not check a license server"; the lowercase list form about the open runtime ("no seats, no usage tier, no license server") stays silent.build-missing—apps/docs/.next/server/appabsent, or holding no docs page: a failure, never a skip.Why (a) and (b) read the build and (c) reads the sources: the mandate is about shipped output, and
lib/i18n.ts:4still says "ObjectStack Documentation" in a code comment the ruling on #171 re-measured and accepted, so a source scan would cry wolf there. (c) stops atcontent/docs/on purpose:app/[lang]/privacy/page.tsx:20still says "The runtime does not phone home" and is PR 2's file; a gate red onmainuntil a held PR lands is a gate someone disables. PR 2 should widenSTALE_SOURCE_DIRStoapps/docs/appwhen it corrects that copy.Measured on this tree: green on 632 built docs pages, both
llmsbodies and 79 English sources.Every changed sentence
path:lineis the line in this PR. Table cells that were themselves table rows are quoted with their pipes escaped.content/docs/index.mdx:2title: ObjectOStitle: Introduction:3POSITIONING(the four strings above):6-12:14-19:21:23-27npm i -g @objectstack/cli/os startcode block, then: Open http://localhost:3000 and you have a working ObjectOS with its UI and Account portal, an audit log, and a SQLite database — zero configuration, zero scaffolding.npm i -g @objectstack/cli && os startboots it with a SQLite database and no configuration — see Quickstart:29:37-38:44:45:46:58:60-63:72:74-77:94content/docs/quickstart.mdx(the two transcribed blocks, the17.5.0pins, the two declaration paragraphs and the port paragraph are byte-identical):3:6-13:15-16:20:71-74:109-114http://localhost:3000/api/v1/mcp— point Claude Code or any MCP client at it). On ObjectOS, once you're signed in, open the AI assistant (top-right sparkle icon) and describe what you need::127-128:278-280dist/objectstack.jsonis what you ship to production — mount it on a running ObjectOS container and that becomes your app.content/docs/why.mdx:11-15:17-34:45-46:54:56:57:67-69:79:81:84:91:97:98:106:108:131-133git.git.:137-141:145-149pnpm devor a single Docker container with SQLite. The largest in production today serves tens of thousands of internal users across multiple regions with Postgres + S3 + Redis. Both are the same software.:151-153npx @objectstack/cli init my-appand decide in 5 minutes. If it's not for you, you've burned 5 minutes.npx @objectstack/cli init my-app, and decide in 5 minutes. If it's not for you, you've burned 5 minutes.content/docs/architecture.mdx:6-8:26-28:64-68:79-82:105-106:112:135content/docs/reference/security.mdx:11-16:20-23:34-38:140:167-171content/docs/resources/faq.mdx:9-11npm i -g @objectstack/cli && os start— then open http://localhost:3000.npm i -g @objectstack/cli && os startand open http://localhost:3000.:15-17:20-22:25-28:163-164content/docs/resources/glossary.mdx:39-50:88:151-156:166-170@objectstack/*npm packages), the runtime (ObjectOS), the optional cloud service, and the marketplace. Sometimes called "the platform."@objectstack/*npm packages and the runtime image. ObjectOS is the commercial runtime environment built on it; the two are different products under different licences.content/docs/build/ai-skills.mdx:3:11-13content/docs/extend-existing-systems.mdx:3:9-10:12-21:29-31readOnlydatasource, or a read-only database user — and enable writes deliberately.:36-38:41:48readOnlycapability, or a read-only database user — and enable writes deliberately, per object, once you trust the model.:51:78-79:81:85-92:99Code and repo files
apps/docs/app/layout.tsx:18description: 'Customer-hosted runtime for ObjectStack applications. Private, compliant, yours.'description: POSITIONINGapps/docs/app/llms.txt/route.ts:19-25SUMMARY= "ObjectStack is the open target format and runtime for AI-written enterprise software; ObjectOS is the commercial production platform where teams build, review, deploy, and operate ObjectStack applications." ·TITLE = 'ObjectOS'SUMMARY = POSITIONING·TITLE = SITE_NAMEapps/docs/app/sitemap.ts:14-21{ path: '', priority: 1, locales: i18n.languages }.github/scripts/check-locale-surface.mjsexpectedSitemapUrls,BASE_URLS, one case)unexpected-url.github/scripts/smoke-docs.mjs:151-152h1: /^ObjectOS$/ifor/and/en/docsh1: /^Introduction$/i— the index H1 changed by the ruling, and this script also runs post-deploy with a rollback behind it.github/scripts/smoke-docs.mjs:431README.md:5Locale siblings deleted (ruling
5989567068)Deleted when the English edit removes or reverses an assertion the sibling still makes;
zh-Hansandzh-Hantgo together. 41 files.indexquickstartwhyresources/glossaryresources/faqreference/securitydeexisted)Left alone, by the "pure reframing or wording" half of the ruling:
build/ai-skills(the change is who ships the skills, not what they do), andarchitectureandextend-existing-systemshave no siblings.gen-zh-hant.mjs --checkis green on the pruned set;check-translations.mjsreports the removed pages as missing, which is non-blocking by design.Verification on this tree
pnpm turbo run type-checkandpnpm turbo run build --forcefor@objectos/docs: green.pnpm turbo run test --force: 9 self-tests passed, includingcheck-positioning.mjs --self-test(37 cases, 16 rules),check-locale-surface.mjs --self-test(29 cases, with the new root case firingunexpected-url) andsmoke-docs.mjs --self-test.node .github/scripts/check-positioning.mjs: green — 632 built docs pages, bothllmsbodies, 79 English sources.node .github/scripts/check-locale-surface.mjs: green against the rebuilt sitemap (no root entry, nopriority 1).gen-zh-hant.mjs --check: 65 generated files match.check-translations.mjs: gate passed.git diff --name-status --no-renames origin/main...HEAD): 41 translation artifacts deleted, none added or modified — exit 0 withTRANSLATION_BOT_LOGINunset and with it set. Output gate on the changed list: passed./docs,/docs/quickstart,/docs/why,/docs/resources/glossary; all four render with the expected title, H1 and meta description. Paths are in the report on [Decision] What does docs.objectos.ai target — the root URL is a redirect, the index title is "ObjectOS | ObjectOS", and the brand is spelled three ways #171.Acceptance notes
reference/security.mdx"Supply chain" still says pre-built images are published fromgithub.com/objectstack-ai/objectoswith reproducible provenance, whileREADME.mdsays the product source is not in this repository anddeploy/index.mdxsays the Self-Managed image is licensed and private. Outside this card's rows; listed in the report as a finding for the seat.resources/license.mdxalso sells Business Self-Managed (single node). Where a page lists entry points, this PR says "ObjectOS Enterprise (or Business Self-Managed)"; the positioning sentence itself stays verbatim.app/[lang]/privacy/page.tsx:20("self-hosted ObjectOS deployment … does not phone home") is PR 2's copy and is the reason rule (c) stops atcontent/docs/.Generated by Claude Code