You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Pricing page: three columns, Free / Team / Enterprise (maintainer ruling D2, 2026-10-24) — Business moves to an Enterprise contract option, Free states the AI trial and the MCP terms, Team's button goes to self-serve checkout #285
Ruling. Sam (os-zhuang), 2026-10-24T10:16Z, cloud project thread, on the commercial strategy evaluation: 「同意」 — decisions D1–D6 as recommended. D2: the public price list is three columns, Free / Team / Enterprise, on this site and in the cloud console alike; Business and Business Self-Managed are kept as contract options under Enterprise. D1: Paddle is the Merchant of Record (the page's morNote already says so). D3: MCP opens on Cloud Free with strict limits.
Cross-repo parent: objectstack-ai/cloud — the 30-day tracking card filed in the same batch (it links here).
Business reason
A visitor today sees four columns here and three in the console, and can click 「Get started」 on Business, which the console does not sell (Business self-serve was paused 2026-09-08 because most of its matrix is unbuilt). One price list is the precondition for the first self-serve customers the 90-day north star counts.
Reading at main016ac73
src/lib/pricing.ts — four plans per locale (Free, Team, Business, Enterprise); GET_STARTED = 'https://docs.objectos.ai'; Enterprise's features already carry Business Self-Managed; Free lists 「AI through MCP — bring your own model」, which the cloud does not serve on Free today (cloud#2765 gate).
Rendered by src/pages/[lang]/pricing.astro. The console's own pricing page is already three columns (cloud packages/service-tenant/src/pages/pricing.page.ts).
Wanted
Every locale: three plans. Business's line items move into Enterprise as a named contract option ("Business: SSO and AI governance on Cloud, by contract"), beside Business Self-Managed; prices for both stay stated in the billing note.
Free states what Free gets in the cloud: the daily in-app AI trial, and MCP with the limits the maintainer sets on objectstack-ai/cloud#3203. Until those numbers are ruled, Free says nothing about MCP limits — and does not claim MCP on Cloud Free before the cloud ships it.
Team's button goes to self-serve checkout once objectstack-ai/cloud#3202 (Team on Paddle) is live; until then it goes where the console's Team button goes. Enterprise keeps sales@.
The numbers stay sourced from cloud docs/design/pricing.md (the source that note in pricing.ts names).
Related open decisions here: #214 (headline price, annual discount) and #215 (where 「Get started」 goes) — this card does not decide them; it changes their column count.
Acceptance
pnpm build green; /en/pricing and /zh-Hans/pricing (and every generated locale) show three columns; no 「Get started」 on a plan the console cannot sell.
The Free column's MCP wording matches the cloud ruling once it exists.
Filing record
Category ③; reader who acts: the repo:www.objectos.ai seat dispatches. Size S.
Steps 2 and 3 wait on objectstack-ai/cloud#3203 (the MCP limits decision) and objectstack-ai/cloud#3202 (Team on Paddle); step 1 can land now.
Filed by the cloud project thread session session_01VuEorxky4ozFQEPvKH2U3V on the maintainer's order (Sam, 2026-10-24, 「同意」 to the strategy rulings D1–D6), under the cross-repo tracking card objectstack-ai/cloud#3206. ⛔ Not a claim.
Triage: lands in repo:www.objectos.ai (src/lib/pricing.ts, every locale); pm:queue, size S; rationale: maintainer direct order D2 (three columns on site and console; the console is already three). Step 1 (Business → Enterprise contract option) can be dispatched now; steps 2–3 wait on objectstack-ai/cloud#3203 and objectstack-ai/cloud#3202. This also discharges the pricing-content card owed since objectstack-ai/cloud#3125 (comment 6346577475).
Scope amendment under a newer maintainer ruling · 2026-10-26T13:24Z · session_01FMuBZmssbfQkVrKRtxNvng · ⛔ not a claim, not a dispatch.
Maintainer (Sam), 2026-10-26 13:11Z, verbatim: 「还是 ObjectStack 的运行时就叫 ObjectOS ,社区版免费,然后企业版是收费的」; at 13:18Z chose 「模型 2:ObjectOS 三版本」 on the decision card 「采用「ObjectOS 一个产品三个版本,ObjectStack 是协议与框架名」吗?」. The edition model is therefore: ObjectOS Community (the open-source runtime and Console, self-hosted, free, Apache-2.0 — today's ghcr.io/objectstack-ai/objectstack image), ObjectOS Cloud (Free / Team, as D2 rules), ObjectOS Enterprise. ObjectStack is the name of the protocol and SDK.
For this card that means one addition to item 1: the pricing page shows the three paid-side columns D2 named plus a Community column on the self-hosted side — "Community · self-hosted · free · community support · npm create objectstack@latest / Docker image", with no checkout button (its button goes to the objectstack repository or the Quickstart). D2's three columns and every other item of this card are unchanged; the Community column is the fourth column of the table or a strip above it, the seat decides. Wording for what Community includes versus what Cloud / Enterprise add is being written on the objectos repository's edition card (README + TRADEMARK, filed today, same session); copy the dividing line from there rather than inventing it here: Community = runtime, Console, permissions, audit, MCP, every protocol capability; Cloud / Enterprise add hosting and multi-environment operations, Build & Ask, SSO, commercial support.
The maintainer also asked what distinguishes objectos.ai from objectstack.ai under this model; the answer given (product site vs developer site, one blog) is a recommendation, not yet a ruling, and is not part of this amendment.
Scope note from a sibling card's review · 2026-10-26T14:33Z · session_01FMuBZmssbfQkVrKRtxNvng · ⛔ not a claim, not a dispatch.
docs.objectos.ai#338 (PR objectstack-ai/docs.objectos.ai#339) rewrote that repository's README under the edition ruling: Business and Business Self-Managed are contract options under ObjectOS Enterprise; ObjectOS Cloud lists Free · Team. The docs rate card in content/docs/resources/license.mdx still places a priced Business column under ObjectOS Cloud ($54 / AI seat) and the "which do I need" table says "ObjectOS Cloud (Free → Team → Business)". README and rate card now disagree on where Business sits.
That rate card is this card's surface, not #338's: when the pricing page lands here with its Community column, the docs rate card (plan columns and placement, numbers included) moves in the same change from the same source — one edit, no interim state. Recommended over a docs-only interim fix on the four axes: the price list must say one thing (business need), one source for plan placement and numbers (long-term), two tables edited in separate PRs drift (AI-error), no new surface or interim state (startup focus).
Claim: PM loop round 2 · 2026-10-26T15:21Z
Session: session_01FMuBZmssbfQkVrKRtxNvng (project thread; maintainer-directed — Sam, 2026-10-26 13:38Z, verbatim 「相关卡片都归你派发处理落地」; and 15:19Z 「objectos 的定价等相关页面需要修改吗」, answered: yes, this card)
Account: os-zhuang
Branch: claude/issue-285-pricing-three-editions (this repository) · claude/issue-285-license-rate-card (objectstack-ai/docs.objectos.ai, the rate card this card's scope note of 14:33Z claimed for this card)
Worktree: www.objectos.ai-issue-285 · docs.objectos.ai-issue-285
Domain: n/a (single-lane repository, label site)
Seat: maintainer-directed (no lane seat post in this repository; seat identity recorded on objectstack-ai/objectstack#24145)
File surface: src/lib/pricing.ts (every authored locale; zh-Hant derived), src/components/Pricing.astro only if a fourth column needs a layout change; in docs.objectos.ai: content/docs/resources/license.mdx (Editions table, "Cloud or self-managed", "When you might want each"; English only, numbers unchanged) — stop on breach; explain in the report
Container & model: M, mode:subagent (deviation: os-dev agent type not loaded in this project thread; general-purpose subagent under objectstack's .claude/agents/os-dev.md verbatim with each repository's AGENTS.md, same session ID, identity by branch), model: default tier (TIER_DEFAULT — objectstack's dispatch-gates refuses a sister-repo tier verdict without its checkout; neither repository declares tier globs; gate families hand-derived: www = pnpm content:lint, pnpm check, pnpm build, pnpm seo:smoke; docs = turbo type-check + build, check-positioning, check-translations, gen-zh-hant --check), effort: high
Clause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6418669515
Premise: holds (re-read on www origin/mainbf2d68a: src/lib/pricing.ts:44-121 four plans in pricingEn — Free $0, Team $20, Business $45, Enterprise Custom — mirrored in pricingZhHans:123-200, zh-Hant via toHant; :36GET_STARTED = 'https://docs.objectos.ai'; Free :59 "AI through MCP — bring your own model"; docs origin/main 1ce3fdd content/docs/resources/license.mdx Editions table still five columns with Business under ObjectOS Cloud and "When you might want each" row "ObjectOS Cloud (Free → Team → Business)")
Serial constraints cleared: open PRs here (#288 mine: Header/Base/i18n/positioning/MarketingHome + blog; #268, #279–#284, #260–#264: AGENTS.md and post folders) touch neither pricing.ts nor Pricing.astro; #209 (pm:dispatched, hotlong) owns positioning copy — pricing.ts imports positioning.*.descriptor and this card does not edit positioning.ts; decisions #214 (headline price) and #215 (where "Get started" goes) stay open and undecided — CTA targets unchanged; docs.objectos.ai #340 (pm:queue, link sweep) may touch license.mdx links — this card changes no link; cloud#3203 ruled A and shipped in cloud#3221 (MERGED 2026-10-24), so the Free MCP line can state the limits; cloud#3202 (Team on Paddle) is pm:blocked — item 3 (Team's button to checkout) stays a follow-up on that card's landing
{
"issue": 285,
"status": "done",
"branch": "claude/issue-285-pricing-three-editions (www.objectos.ai) · claude/issue-285-license-rate-card (docs.objectos.ai)",
"pr": "https://github.com/objectstack-ai/www.objectos.ai/pull/289 · https://github.com/objectstack-ai/docs.objectos.ai/pull/342",
"session": "session_01FMuBZmssbfQkVrKRtxNvng",
"premise_still_valid": true,
"summary": "www: src/lib/pricing.ts renders four cards Community · Free · Team · Enterprise in every locale (en + zh-Hans authored, zh-Hant derived): a new Community card (ObjectOS Community, Free, self-hosted, no checkout, 'Run it yourself' to objectstack.ai/docs/deployment, features = the ruled dividing line), the Business card removed and its terms folded into Enterprise's features and the billing note as a contract option beside Business Self-Managed, Free's MCP line carrying 20 requests / min and 1,000 / day per environment, intro and billing note rewritten to the three-edition model; every number, GET_STARTED and CONTACT unchanged; Pricing.astro untouched because the fourth card fits the existing grid. docs: content/docs/resources/license.mdx rate card is Community · Free · Team · Enterprise with the Community column as ruled, a paragraph under the table naming Business ($54 / mo, $45 annual) and Business Self-Managed ($540 / yr) as Enterprise contract options, 'Cloud or self-managed' = Cloud (Free / Team) + Enterprise with the two options and the full deployment nested, 'When you might want each' = ObjectOS Cloud (Free → Team) and both Business rows as Enterprise contract options; no link, number or other page changed. Draft PRs #289 (www, Fixes #285) and docs#342 (Refs) are open; premise re-confirmed on www origin/main bf2d68a and docs origin/main 1ce3fdd, both still the tips at PR time (no rebase needed).",
"tests": "www at eaa04d7, exit codes captured before any pipe: pnpm content:lint exit 0 ('content lint passed (359 files, 46 glossary terms checked)'); pnpm check exit 0 ('0 errors, 0 warnings, 0 hints'); under the lock slot issue-285 (VERDICT command-exit 0, held 131 s, waited 0 s, shared box): pnpm build exit 0 ('[build] Complete!'; share images 95 rendered for 923 pages; content lint --dist passed 498 blog pages, CJK breaks, quotation marks, 99923 internal links) and pnpm seo:smoke exit 0 ('SEO smoke test passed (914 HTML pages checked; 598 sitemap URLs against 316 noindexed pages; 5669 canonical/hreflang annotations; 17820 prose blocks language-checked; 99913 internal links redirect-checked)'). Headless Chromium on dist/ (/opt/pw-browsers/chromium) for /en/pricing/ and /zh-Hans/pricing/ at 1440x750 and 390x844: 4 cards each (Community · Free · Team · Enterprise / 社区版 · 免费版 · 团队版 · 企业版), one row at 1440 and four stacked at 390, no grid or card overflow, no horizontal scroll, CTA tops equal within a row (subgrid intact), CTAs Community 'Run it yourself' -> https://objectstack.ai/docs/deployment, Free/Team 'Get started' -> https://docs.objectos.ai (Team highlight), Enterprise 'Contact us' -> mailto:sales@; screenshots looked at; derived zh-Hant page carries 社群版 · 免費版 · 團隊版 · 企業版 (s2twp spells 社区 as 社群). docs at 6b0a9f6: gen-zh-hant --check exit 0 ('46 generated file(s) match'); check-translations exit 0 ('translations gate passed'); check-translation-ownership --actor os-zhuang exit 0 ('0 translation artifact(s) and 1 other file(s)'); check-doc-samples exit 0 ('102 pass · 10 not a spec sample · 2 opted out', spec 17.7.0; needed npm ci in .github/scripts/doc-samples first, the first run read NOT MEASURED); under the lock slot issue-285-docs (VERDICT command-exit 0, held 92 s, waited 0 s): turbo type-check --force exit 0 (1 successful), NEXT_PRIVATE_STANDALONE=true turbo build --force exit 0 (1 successful), then check-positioning exit 0 ('4 copies equal their constants; the brand is right in 667 pages and 2 llms bodies; no stale sentence in 80 English sources') and check-locale-surface exit 0. No ablation: copy-only change, no tested behaviour changed. Live sites unreachable from the container; verification is source- and build-level.",
"gates": "Local subsets hand-derived (neither repository has dispatch-gates.mjs; objectstack's refuses a sister repo, no --ran reconciliation): www = content:lint 0, check 0, build 0, seo:smoke 0, browser check 0; docs = gen-zh-hant --check 0, check-translations 0, check-translation-ownership 0, check-doc-samples 0, turbo type-check 0, turbo build 0, check-positioning 0, check-locale-surface 0. CI at report time (check-runs read via curl, not re-run): www #289 head eaa04d7 — 'Build and deploy' = success; docs #342 head 6b0a9f6 — 'Node floor' = success, 'Ownership & freshness' = success, 'build' = in_progress (not waited for).",
"dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
"mcp_calls": "0 — no MCP GitHub calls; reads via curl api.github.com (issue 285 + comments, docs comment 6418494540, pulls 289 and 342, check-runs on both heads)",
"api_writes": "3 — (1) pr_create via scripts/pm/fleet-write/dispatch.mjs for objectstack-ai/www.objectos.ai: POST /repos/objectstack-ai/objectstack/dispatches, executed by run 40350901440 as POST /repos/objectstack-ai/www.objectos.ai/pulls (+ assignees) = #289, read-back identical 5880 bytes; (2) pr_create likewise for objectstack-ai/docs.objectos.ai: run 40351142977 = #342, read-back identical 5003 bytes; (3) this os-dev-report comment via scripts/pm/post-stamped.mjs: POST /repos/objectstack-ai/www.objectos.ai/issues/285/comments. Plus 4 direct git pushes (empty-branch probe and one commit per repository) — not REST writes.",
"deviations": [
"The os-dev agent type is not loaded in this thread (claim notes it): a general-purpose subagent ran under objectstack's .claude/agents/os-dev.md and each repository's AGENTS.md, same session id, identity by branch.",
"Footer form: the dispatch order's common.md shows the bare footer for the PR body; os-dev.md prescribes the session-URL form on a created PR body, and the order's addendum says the same, so both PR bodies carry the session-URL form and this comment the bare form.",
"Both pr_create payloads omitted the labels key (the order names no labels and the relay refuses an empty list); neither PR carries a label.",
"Docs 'Cloud or self-managed': the Enterprise bullet nests three sub-bullets (Business, Business Self-Managed, full private deployment) rather than two flat bullets; the ruling asked for the two options under Enterprise and this is the reading that keeps the full-deployment text verbatim. A Business row was added to 'When you might want each' (the ruling named only the Cloud and Business Self-Managed rows) so the contract option still has a row after leaving the table.",
"Docs rate card states Business's annual-billed price ($45) beside the $54 monthly the page already stated, as the order lists both; no other figure changed.",
"The docs check-doc-samples gate reads NOT MEASURED until `npm ci --prefix .github/scripts/doc-samples` is run; it was run and the gate then passed.",
"Commits are authored as os-zhuang (the account's identity, as the #338 branch was), not the container's default git identity."
],
"open_questions": [],
"out_of_scope_findings": [
"class: none (observation, not filed) · reach: none · src/lib/pricing.ts lines 39–43 comment names cloud plan-entitlements.ts / ADR-0023 as the price source while the card names cloud docs/design/pricing.md; wording only, no number differs · dedupe: pricing source comment ADR-0023 plan-entitlements · carrier: #214 (headline price decision) or none",
"class: none (observation) · reach: none · www src/lib/home.ts and src/lib/positioning.ts still describe the Cloud/Enterprise split without the Community edition; the pricing page now does · dedupe: home positioning Community edition copy · carrier: #209 / #287 / PR #288",
"class: none (observation) · reach: none · docs license.mdx FAQ 'Can I self-host ObjectOS without paying?' says Enterprise has 'both of its options' (Business Self-Managed, full deployment); with Business on Cloud also a contract option the count is one short; outside the three sections this card names · dedupe: license FAQ both options Enterprise count · carrier: none"
]
}
merged: true, merged_at 2026-10-27T00:44:21Z by the merge queue (objectstack-fleet[bot]), head eaa04d73 (1 commit, src/lib/pricing.ts only, +49/−48). Auto-merge re-armed 2026-10-27T00:42Z after #295 gave the queue its merge_group run.
origin/main
1b74b4f7 "Merge pull request #289 …". On that tree src/lib/pricing.ts names Community 3× (the new first card, en + zh-Hans + intro), Business 4× — all inside Enterprise's features / the billing note, no Business card and no "Get started" on it — and the Free MCP line reads "20 requests / min and 1,000 / day per environment" (cloud#3203's ruling, shipped in cloud#3221).
this card only (#289Fixes #285); #214 / #215 stay open.
Status: card closed by Fixes on merge; pm:dispatched removed in this stroke. Delivered: items 1, 2 and 4, plus the Community column from the 2026-10-26 scope comment. Remainder and owner: item 3 (Team's button → self-serve checkout) waits on objectstack-ai/cloud#3202 (pm:blocked); the cloud seat that lands #3202 re-points GET_STARTED for Team in the same stroke or files the one-line site card then. Observation left on the PR: the source-of-truth comment at pricing.ts:39–43 still names plan-entitlements.ts / ADR-0023 — wording only, no number differs.
Activity
objectstack-fleet commentedon Oct 24, 2026
Filed by the cloud project thread session
session_01VuEorxky4ozFQEPvKH2U3Von the maintainer's order (Sam, 2026-10-24, 「同意」 to the strategy rulings D1–D6), under the cross-repo tracking card objectstack-ai/cloud#3206. ⛔ Not a claim.Triage: lands in
repo:www.objectos.ai(src/lib/pricing.ts, every locale);pm:queue, size S; rationale: maintainer direct order D2 (three columns on site and console; the console is already three). Step 1 (Business → Enterprise contract option) can be dispatched now; steps 2–3 wait on objectstack-ai/cloud#3203 and objectstack-ai/cloud#3202. This also discharges the pricing-content card owed since objectstack-ai/cloud#3125 (comment 6346577475).Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Scope amendment under a newer maintainer ruling · 2026-10-26T13:24Z ·
session_01FMuBZmssbfQkVrKRtxNvng· ⛔ not a claim, not a dispatch.Maintainer (Sam), 2026-10-26 13:11Z, verbatim: 「还是 ObjectStack 的运行时就叫 ObjectOS ,社区版免费,然后企业版是收费的」; at 13:18Z chose 「模型 2:ObjectOS 三版本」 on the decision card 「采用「ObjectOS 一个产品三个版本,ObjectStack 是协议与框架名」吗?」. The edition model is therefore: ObjectOS Community (the open-source runtime and Console, self-hosted, free, Apache-2.0 — today's
ghcr.io/objectstack-ai/objectstackimage), ObjectOS Cloud (Free / Team, as D2 rules), ObjectOS Enterprise. ObjectStack is the name of the protocol and SDK.For this card that means one addition to item 1: the pricing page shows the three paid-side columns D2 named plus a Community column on the self-hosted side — "Community · self-hosted · free · community support ·
npm create objectstack@latest/ Docker image", with no checkout button (its button goes to the objectstack repository or the Quickstart). D2's three columns and every other item of this card are unchanged; the Community column is the fourth column of the table or a strip above it, the seat decides. Wording for what Community includes versus what Cloud / Enterprise add is being written on the objectos repository's edition card (README + TRADEMARK, filed today, same session); copy the dividing line from there rather than inventing it here: Community = runtime, Console, permissions, audit, MCP, every protocol capability; Cloud / Enterprise add hosting and multi-environment operations, Build & Ask, SSO, commercial support.The maintainer also asked what distinguishes objectos.ai from objectstack.ai under this model; the answer given (product site vs developer site, one blog) is a recommendation, not yet a ruling, and is not part of this amendment.
Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Scope note from a sibling card's review · 2026-10-26T14:33Z ·
session_01FMuBZmssbfQkVrKRtxNvng· ⛔ not a claim, not a dispatch.docs.objectos.ai#338 (PR objectstack-ai/docs.objectos.ai#339) rewrote that repository's README under the edition ruling: Business and Business Self-Managed are contract options under ObjectOS Enterprise; ObjectOS Cloud lists Free · Team. The docs rate card in
content/docs/resources/license.mdxstill places a priced Business column under ObjectOS Cloud ($54 / AI seat) and the "which do I need" table says "ObjectOS Cloud (Free → Team → Business)". README and rate card now disagree on where Business sits.That rate card is this card's surface, not #338's: when the pricing page lands here with its Community column, the docs rate card (plan columns and placement, numbers included) moves in the same change from the same source — one edit, no interim state. Recommended over a docs-only interim fix on the four axes: the price list must say one thing (business need), one source for plan placement and numbers (long-term), two tables edited in separate PRs drift (AI-error), no new surface or interim state (startup focus).
Generated by Claude Code
objectstack-fleet commentedon Oct 26, 2026
Claim: PM loop round 2 · 2026-10-26T15:21Z
Session:
session_01FMuBZmssbfQkVrKRtxNvng(project thread; maintainer-directed — Sam, 2026-10-26 13:38Z, verbatim 「相关卡片都归你派发处理落地」; and 15:19Z 「objectos 的定价等相关页面需要修改吗」, answered: yes, this card)Account:
os-zhuangBranch:
claude/issue-285-pricing-three-editions(this repository) ·claude/issue-285-license-rate-card(objectstack-ai/docs.objectos.ai, the rate card this card's scope note of 14:33Z claimed for this card)Worktree:
www.objectos.ai-issue-285·docs.objectos.ai-issue-285Domain: n/a (single-lane repository, label
site)Seat: maintainer-directed (no lane seat post in this repository; seat identity recorded on objectstack-ai/objectstack#24145)
File surface:
src/lib/pricing.ts(every authored locale; zh-Hant derived),src/components/Pricing.astroonly if a fourth column needs a layout change; in docs.objectos.ai:content/docs/resources/license.mdx(Editions table, "Cloud or self-managed", "When you might want each"; English only, numbers unchanged) — 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 objectstack's.claude/agents/os-dev.mdverbatim with each repository's AGENTS.md, same session ID, identity by branch),model: default tier (TIER_DEFAULT — objectstack's dispatch-gates refuses a sister-repo tier verdict without its checkout; neither repository declares tier globs; gate families hand-derived: www = pnpm content:lint, pnpm check, pnpm build, pnpm seo:smoke; docs = turbo type-check + build, check-positioning, check-translations, gen-zh-hant --check),effort: highClause-②: no
Metadata-protocol: none
Responsibility: n/a — not a defect card
Thread-read: 6418669515
Premise: holds (re-read on www
origin/mainbf2d68a:src/lib/pricing.ts:44-121four plans inpricingEn— Free$0, Team$20, Business$45, EnterpriseCustom— mirrored inpricingZhHans:123-200, zh-Hant viatoHant;:36GET_STARTED = 'https://docs.objectos.ai'; Free:59"AI through MCP — bring your own model"; docsorigin/main1ce3fddcontent/docs/resources/license.mdxEditions table still five columns with Business under ObjectOS Cloud and "When you might want each" row "ObjectOS Cloud (Free → Team → Business)")Serial constraints cleared: open PRs here (#288 mine: Header/Base/i18n/positioning/MarketingHome + blog; #268, #279–#284, #260–#264: AGENTS.md and post folders) touch neither
pricing.tsnorPricing.astro; #209 (pm:dispatched, hotlong) owns positioning copy —pricing.tsimportspositioning.*.descriptorand this card does not editpositioning.ts; decisions #214 (headline price) and #215 (where "Get started" goes) stay open and undecided — CTA targets unchanged; docs.objectos.ai #340 (pm:queue, link sweep) may touchlicense.mdxlinks — this card changes no link; cloud#3203 ruled A and shipped in cloud#3221 (MERGED 2026-10-24), so the Free MCP line can state the limits; cloud#3202 (Team on Paddle) ispm:blocked— item 3 (Team's button to checkout) stays a follow-up on that card's landingobjectstack-fleet commentedon Oct 26, 2026
os-dev-report
{ "issue": 285, "status": "done", "branch": "claude/issue-285-pricing-three-editions (www.objectos.ai) · claude/issue-285-license-rate-card (docs.objectos.ai)", "pr": "https://github.com/objectstack-ai/www.objectos.ai/pull/289 · https://github.com/objectstack-ai/docs.objectos.ai/pull/342", "session": "session_01FMuBZmssbfQkVrKRtxNvng", "premise_still_valid": true, "summary": "www: src/lib/pricing.ts renders four cards Community · Free · Team · Enterprise in every locale (en + zh-Hans authored, zh-Hant derived): a new Community card (ObjectOS Community, Free, self-hosted, no checkout, 'Run it yourself' to objectstack.ai/docs/deployment, features = the ruled dividing line), the Business card removed and its terms folded into Enterprise's features and the billing note as a contract option beside Business Self-Managed, Free's MCP line carrying 20 requests / min and 1,000 / day per environment, intro and billing note rewritten to the three-edition model; every number, GET_STARTED and CONTACT unchanged; Pricing.astro untouched because the fourth card fits the existing grid. docs: content/docs/resources/license.mdx rate card is Community · Free · Team · Enterprise with the Community column as ruled, a paragraph under the table naming Business ($54 / mo, $45 annual) and Business Self-Managed ($540 / yr) as Enterprise contract options, 'Cloud or self-managed' = Cloud (Free / Team) + Enterprise with the two options and the full deployment nested, 'When you might want each' = ObjectOS Cloud (Free → Team) and both Business rows as Enterprise contract options; no link, number or other page changed. Draft PRs #289 (www, Fixes #285) and docs#342 (Refs) are open; premise re-confirmed on www origin/main bf2d68a and docs origin/main 1ce3fdd, both still the tips at PR time (no rebase needed).", "tests": "www at eaa04d7, exit codes captured before any pipe: pnpm content:lint exit 0 ('content lint passed (359 files, 46 glossary terms checked)'); pnpm check exit 0 ('0 errors, 0 warnings, 0 hints'); under the lock slot issue-285 (VERDICT command-exit 0, held 131 s, waited 0 s, shared box): pnpm build exit 0 ('[build] Complete!'; share images 95 rendered for 923 pages; content lint --dist passed 498 blog pages, CJK breaks, quotation marks, 99923 internal links) and pnpm seo:smoke exit 0 ('SEO smoke test passed (914 HTML pages checked; 598 sitemap URLs against 316 noindexed pages; 5669 canonical/hreflang annotations; 17820 prose blocks language-checked; 99913 internal links redirect-checked)'). Headless Chromium on dist/ (/opt/pw-browsers/chromium) for /en/pricing/ and /zh-Hans/pricing/ at 1440x750 and 390x844: 4 cards each (Community · Free · Team · Enterprise / 社区版 · 免费版 · 团队版 · 企业版), one row at 1440 and four stacked at 390, no grid or card overflow, no horizontal scroll, CTA tops equal within a row (subgrid intact), CTAs Community 'Run it yourself' -> https://objectstack.ai/docs/deployment, Free/Team 'Get started' -> https://docs.objectos.ai (Team highlight), Enterprise 'Contact us' -> mailto:sales@; screenshots looked at; derived zh-Hant page carries 社群版 · 免費版 · 團隊版 · 企業版 (s2twp spells 社区 as 社群). docs at 6b0a9f6: gen-zh-hant --check exit 0 ('46 generated file(s) match'); check-translations exit 0 ('translations gate passed'); check-translation-ownership --actor os-zhuang exit 0 ('0 translation artifact(s) and 1 other file(s)'); check-doc-samples exit 0 ('102 pass · 10 not a spec sample · 2 opted out', spec 17.7.0; needed npm ci in .github/scripts/doc-samples first, the first run read NOT MEASURED); under the lock slot issue-285-docs (VERDICT command-exit 0, held 92 s, waited 0 s): turbo type-check --force exit 0 (1 successful), NEXT_PRIVATE_STANDALONE=true turbo build --force exit 0 (1 successful), then check-positioning exit 0 ('4 copies equal their constants; the brand is right in 667 pages and 2 llms bodies; no stale sentence in 80 English sources') and check-locale-surface exit 0. No ablation: copy-only change, no tested behaviour changed. Live sites unreachable from the container; verification is source- and build-level.", "gates": "Local subsets hand-derived (neither repository has dispatch-gates.mjs; objectstack's refuses a sister repo, no --ran reconciliation): www = content:lint 0, check 0, build 0, seo:smoke 0, browser check 0; docs = gen-zh-hant --check 0, check-translations 0, check-translation-ownership 0, check-doc-samples 0, turbo type-check 0, turbo build 0, check-positioning 0, check-locale-surface 0. CI at report time (check-runs read via curl, not re-run): www #289 head eaa04d7 — 'Build and deploy' = success; docs #342 head 6b0a9f6 — 'Node floor' = success, 'Ownership & freshness' = success, 'build' = in_progress (not waited for).", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "0 — no MCP GitHub calls; reads via curl api.github.com (issue 285 + comments, docs comment 6418494540, pulls 289 and 342, check-runs on both heads)", "api_writes": "3 — (1) pr_create via scripts/pm/fleet-write/dispatch.mjs for objectstack-ai/www.objectos.ai: POST /repos/objectstack-ai/objectstack/dispatches, executed by run 40350901440 as POST /repos/objectstack-ai/www.objectos.ai/pulls (+ assignees) = #289, read-back identical 5880 bytes; (2) pr_create likewise for objectstack-ai/docs.objectos.ai: run 40351142977 = #342, read-back identical 5003 bytes; (3) this os-dev-report comment via scripts/pm/post-stamped.mjs: POST /repos/objectstack-ai/www.objectos.ai/issues/285/comments. Plus 4 direct git pushes (empty-branch probe and one commit per repository) — not REST writes.", "deviations": [ "The os-dev agent type is not loaded in this thread (claim notes it): a general-purpose subagent ran under objectstack's .claude/agents/os-dev.md and each repository's AGENTS.md, same session id, identity by branch.", "Footer form: the dispatch order's common.md shows the bare footer for the PR body; os-dev.md prescribes the session-URL form on a created PR body, and the order's addendum says the same, so both PR bodies carry the session-URL form and this comment the bare form.", "Both pr_create payloads omitted the labels key (the order names no labels and the relay refuses an empty list); neither PR carries a label.", "Docs 'Cloud or self-managed': the Enterprise bullet nests three sub-bullets (Business, Business Self-Managed, full private deployment) rather than two flat bullets; the ruling asked for the two options under Enterprise and this is the reading that keeps the full-deployment text verbatim. A Business row was added to 'When you might want each' (the ruling named only the Cloud and Business Self-Managed rows) so the contract option still has a row after leaving the table.", "Docs rate card states Business's annual-billed price ($45) beside the $54 monthly the page already stated, as the order lists both; no other figure changed.", "The docs check-doc-samples gate reads NOT MEASURED until `npm ci --prefix .github/scripts/doc-samples` is run; it was run and the gate then passed.", "Commits are authored as os-zhuang (the account's identity, as the #338 branch was), not the container's default git identity." ], "open_questions": [], "out_of_scope_findings": [ "class: none (observation, not filed) · reach: none · src/lib/pricing.ts lines 39–43 comment names cloud plan-entitlements.ts / ADR-0023 as the price source while the card names cloud docs/design/pricing.md; wording only, no number differs · dedupe: pricing source comment ADR-0023 plan-entitlements · carrier: #214 (headline price decision) or none", "class: none (observation) · reach: none · www src/lib/home.ts and src/lib/positioning.ts still describe the Cloud/Enterprise split without the Community edition; the pricing page now does · dedupe: home positioning Community edition copy · carrier: #209 / #287 / PR #288", "class: none (observation) · reach: none · docs license.mdx FAQ 'Can I self-host ObjectOS without paying?' says Enterprise has 'both of its options' (Business Self-Managed, full deployment); with Business on Cloud also a contract option the count is one short; outside the three sections this card names · dedupe: license FAQ both options Enterprise count · carrier: none" ] }Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
Landed · 2026-10-27T00:50Z ·
session_01FMuBZmssbfQkVrKRtxNvngmerged: true,merged_at2026-10-27T00:44:21Z by the merge queue (objectstack-fleet[bot]), headeaa04d73(1 commit,src/lib/pricing.tsonly, +49/−48). Auto-merge re-armed 2026-10-27T00:42Z after #295 gave the queue itsmerge_grouprun.origin/main1b74b4f7"Merge pull request #289 …". On that treesrc/lib/pricing.tsnames Community 3× (the new first card, en + zh-Hans + intro), Business 4× — all inside Enterprise's features / the billing note, no Business card and no "Get started" on it — and the Free MCP line reads "20 requests / min and 1,000 / day per environment" (cloud#3203's ruling, shipped in cloud#3221).c622daa(rate card incontent/docs/resources/license.mdx).closed_by_pull_requestsFixes #285); #214 / #215 stay open.Status: card closed by
Fixeson merge;pm:dispatchedremoved in this stroke. Delivered: items 1, 2 and 4, plus the Community column from the 2026-10-26 scope comment. Remainder and owner: item 3 (Team's button → self-serve checkout) waits on objectstack-ai/cloud#3202 (pm:blocked); the cloud seat that lands #3202 re-pointsGET_STARTEDfor Team in the same stroke or files the one-line site card then. Observation left on the PR: the source-of-truth comment atpricing.ts:39–43still namesplan-entitlements.ts/ ADR-0023 — wording only, no number differs.Generated by Claude Code