Skip to content

Non-blog copy sweep beyond #209: retired token figures, old descriptors, the "works on your existing systems" overclaim, no README agent path, templated capability FAQs, an authoring placeholder heading #222

Closed

Description

@objectstack-fleet

Found by the seat's site-wide audit of www.objectos.ai on 2026-10-06 (main @ 53764e0). Priority: P1. #209's update sweep already covers the token tiles on product-tour/platform and the one-liner in agent-developer.ts/forward-deployed-engineers.ts. This card covers the non-blog pages the sweep list does not, so the two can land as separate PRs. Rulings in force (#209): token figures retired; ObjectOS described with src/lib/positioning.ts; the agent CTA is the README path (npm create objectstack@latest, then point a coding agent at it, then npx os dev --ui).

Findings

1. Retired token figures outside the sweep list

  • content/pages/en/ai.ts:17,39
  • agent-developer.ts:16-18,43 (the sweep only covers its one-liner)
  • forward-deployed-engineers.ts:16-18,75,101
  • glossary application-metadata.ts:13: "roughly 150k tokens" / 「15 万 token」

The zh mirrors carry the same figures.

2. Old descriptors

  • platform.ts:139: "open-source ObjectStack target format and runtime".
  • product-tour.ts:96: "ObjectOS gives teams a production platform".
  • content/home.ts:185: "For AI-written enterprise software".
  • glossary ui.ts:33 and src/lib/i18n.ts:151.
  • Fix: use positioning[locale].descriptor and the other canonical strings.

3. "Works on top of your existing systems" with no limit

  • home.ts:186,193: "Extend systems without replacing them".
  • product-tour.ts:94,100: "without replacing systems of record".
  • data-modeling.ts:18: "Existing databases federate without migration".
  • src/lib/clusters.ts:45, the legacy-modernization and manufacturing clusters, and the cluster template.
  • objectstack README:83 and objectos extend-existing-systems.mdx:18 say this is read-only by default and early.
  • Fix: carry that limit wherever the claim appears.

4. No README agent path on non-blog pages

  • npm create objectstack@latest and npx os dev --ui appear on no non-blog page, and nothing links to the objectstack docs.
  • agent-developer.ts:13 and mcp.ts:14 point at the docs.objectos.ai root. product-tour's "Point your agent at ObjectStack" leads to agent-developer, which leads to that root.
  • agent-developer.ts describes an invented rule file instead of the AGENTS.md the scaffolder actually writes.
  • This breaks AGENTS.md rule 8 and the CTA ruling.

5. Capability pages that repeat each other

  • Eight pages are titled "ObjectOS …".
  • Every FAQ answers "Yes… ships in the open-source ObjectStack console".
  • All end on "Compare editions and pricing".
  • None says what ObjectOS adds over the open runtime.
  • The self-hosted-ai cluster never separates free ObjectStack from licensed self-managed ObjectOS, and it has no product CTA.

6. Placeholder and copy slips

  • The heading "Questions this page should answer" reads like an authoring brief (src/lib/content-pages/ui.ts:43, en and zh, on all 15 pages).
  • On security, 5 section kickers repeat their headings word for word.
  • "View the AI security model" points to /agent-developer/ (home.ts:205).
  • automation.ts:12 shows "¥100k" on an en page.
  • customer-stories.ts:16 says "5 patterns" next to a 4-row table.
  • Three claims have no source: forward-deployed-engineers.ts:94 ("Platform-native assistants only"), and platform.ts:17,115 ("25+" runtime services, "16+" admin surfaces). Source them or drop them.
  • The security page's blog CTA differs between en and zh (SecurityPage.astro:13-16).

7. Plan details

  • The AI and platform tables omit the Free plan's AI trial and Business Self-Managed (ai.ts:105-107, platform.ts:144).
  • Trust center puts SSO under Enterprise, while pricing puts it on Business (trust-center.ts:80).
  • Pricing's contact address is support@; the licence page uses sales@ (pricing.ts:33).
  • llms.txt's pricing line omits Business Self-Managed and still carries the old FDE and agent-developer descriptions.

Done looks like

Surface

content/pages/{en,zh-Hans}/*.ts, content/home.ts, content/glossary/**, src/lib/{i18n,clusters,cluster-i18n,content-pages/ui}.ts, src/components/SecurityPage.astro, and src/pages/llms.txt.ts or its data.

Order

After the images card. The blog-side sweep in #209 runs separately.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    Older wording found by the #209 post sweep, carried here · 2026-10-06T12:23Z

    The post-side sweep (staged for #209 item 3) changed only the claims in its scope. It left these nearby phrasings for this card's copy sweep, which should decide each against the canonical strings in src/lib/positioning.ts, in every locale:

    • ai-ontology-open-protocol:145 and :180, all locales: "ObjectOS adds the commercial production experience".
    • self-hosted-ai-app-platform, a section heading in all locales: "the optional ObjectOS operations layer".
    • extend-existing-systems-with-ai, description and TL;DR: "Connect ObjectOS to the database you already run". This assumes a reachable database, which means a self-managed deployment. Scope it per E1, or state that assumption.

    These live in posts, not pages. Include them here so the remaining positioning wording is fixed in one PR.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop, repo:www.objectos.ai seat
    Session: session_01FeA1nwBz1ohH65dvffUGKr
    Account: hotlong (the seat's linked user, as GET /user answers it; always the card's assignee)
    Branch: claude/pm-dispatch-objectos-ju9td1, the session's one designated push branch for this repo. This card is staged on the local wave-1 stack stack/www-wave1, because it follows #209's sweep and #216's fact fixes. At push time only this card's own commits are replayed (rebase --onto), after wave 1 and wave 2.
    Worktree: www-issue-222
    Domain: n/a (single-lane repo)
    Seat: repo:www.objectos.ai (objectstack-ai/objectstack#12224)
    File surface:

    • the non-blog page copy the card names: content/pages/**, content/home.ts, the glossary entries, src/lib/{clusters,i18n}.ts, src/lib/content-pages/ui.ts, SecurityPage.astro's CTA strings, and the llms.txt source;
    • the 3 posts named in the carried-items comment, in all locales;
    • zh-Hant regenerated.

    Stay out of:

    Stop on breach and explain in the report.
    Container & model: M, mode:subagent, model: CONTRACT_REVIEW_TIER, reason: the maintainer's instruction on 2026-10-05 that positioning copy is dispatched at the ceiling tier.
    Clause-②: no
    Thread-read: 6016151393
    Serial constraints cleared: no. Pushes are serial on the one branch: wave 1, then wave 2, then this card, then #223.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report

    {
      "issue": 222,
      "status": "staged",
      "branch": "staged/issue-222",
      "worktree": "/home/user/www-issue-222",
      "base_sha": "7f69d97df5e82a4fb9098693142169f4c41860df",
      "final_commit": "b69e532b08b7f6bf88249c902494f2345c74d8dd",
      "commits": [
        "4ace01a site: non-blog copy sweep — retire token figures, canonical ObjectOS strings, scope the existing-systems claim, README agent path, per-page edition answers",
        "b69e532 content(blog): carried positioning wording in three posts, every locale"
      ],
      "pr": null,
      "pr_body_draft": "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/pr-body.md",
      "session": "session_01FeA1nwBz1ohH65dvffUGKr",
      "premise_still_valid": true,
      "summary": "Items 1–7 of #222 and the three carried post phrasings are fixed in en and zh-Hans (zh-Hant derived at build for pages, regenerated for posts) and in ja/de/es/fr/ko wherever the same string exists (home.ts kicker, capability card, closing copy, AI link; security.ts kickers and CTA; cluster-i18n templates; the three posts). Token figures are gone from every non-blog source; ObjectOS is described only with positioning[locale]; every existing-systems claim carries the README limit (federation read-only by default, early, writes opt-in per object); agent-developer carries the README path (npm create objectstack@latest, the scaffolder's AGENTS.md, npx os dev --ui) and platform/mcp/ai/home point at it; the six capability pages each name the open runtime, say concretely what ObjectOS adds (AI Builder tools, pending-action approval, ask-your-data, AI governance from Business, Business Self-Managed / Enterprise delivery — all from docs.objectos.ai license, ai-builder, configure/ai), answer a page-specific FAQ instead of the templated one, and open on a page-specific CTA; the self-hosted-ai cluster separates the free framework from licensed self-managed ObjectOS and names the product path; the FAQ heading, security kickers, home AI-link label, $100k, the fifth story row, the three unsourced figures and the plan-detail mismatches (SSO on Business per the pricing page, SCIM on Enterprise per the licence page; sales@ per the licence page; llms.txt lists every delivery) are done. Two commits on staged/issue-222, not pushed, no PR, worktree kept, per the staged-mode instruction.",
      "files_changed": [
        "content/blog/ai-ontology-open-protocol/index.de.mdx",
        "content/blog/ai-ontology-open-protocol/index.es.mdx",
        "content/blog/ai-ontology-open-protocol/index.fr.mdx",
        "content/blog/ai-ontology-open-protocol/index.ja.mdx",
        "content/blog/ai-ontology-open-protocol/index.ko.mdx",
        "content/blog/ai-ontology-open-protocol/index.mdx",
        "content/blog/ai-ontology-open-protocol/index.zh-Hans.mdx",
        "content/blog/ai-ontology-open-protocol/index.zh-Hant.mdx",
        "content/blog/extend-existing-systems-with-ai/index.de.mdx",
        "content/blog/extend-existing-systems-with-ai/index.es.mdx",
        "content/blog/extend-existing-systems-with-ai/index.fr.mdx",
        "content/blog/extend-existing-systems-with-ai/index.ja.mdx",
        "content/blog/extend-existing-systems-with-ai/index.ko.mdx",
        "content/blog/extend-existing-systems-with-ai/index.mdx",
        "content/blog/extend-existing-systems-with-ai/index.zh-Hans.mdx",
        "content/blog/extend-existing-systems-with-ai/index.zh-Hant.mdx",
        "content/blog/self-hosted-ai-app-platform/index.de.mdx",
        "content/blog/self-hosted-ai-app-platform/index.es.mdx",
        "content/blog/self-hosted-ai-app-platform/index.fr.mdx",
        "content/blog/self-hosted-ai-app-platform/index.ja.mdx",
        "content/blog/self-hosted-ai-app-platform/index.ko.mdx",
        "content/blog/self-hosted-ai-app-platform/index.mdx",
        "content/blog/self-hosted-ai-app-platform/index.zh-Hans.mdx",
        "content/blog/self-hosted-ai-app-platform/index.zh-Hant.mdx",
        "content/glossary/en/application-metadata.ts",
        "content/glossary/zh-Hans/application-metadata.ts",
        "content/pages/en/agent-developer.ts",
        "content/pages/en/ai.ts",
        "content/pages/en/analytics.ts",
        "content/pages/en/app-ui.ts",
        "content/pages/en/approvals.ts",
        "content/pages/en/automation.ts",
        "content/pages/en/customer-stories.ts",
        "content/pages/en/data-modeling.ts",
        "content/pages/en/forward-deployed-engineers.ts",
        "content/pages/en/mcp.ts",
        "content/pages/en/permissions.ts",
        "content/pages/en/platform.ts",
        "content/pages/en/product-tour.ts",
        "content/pages/en/trust-center.ts",
        "content/pages/zh-Hans/agent-developer.ts",
        "content/pages/zh-Hans/ai.ts",
        "content/pages/zh-Hans/analytics.ts",
        "content/pages/zh-Hans/app-ui.ts",
        "content/pages/zh-Hans/approvals.ts",
        "content/pages/zh-Hans/automation.ts",
        "content/pages/zh-Hans/customer-stories.ts",
        "content/pages/zh-Hans/data-modeling.ts",
        "content/pages/zh-Hans/forward-deployed-engineers.ts",
        "content/pages/zh-Hans/mcp.ts",
        "content/pages/zh-Hans/permissions.ts",
        "content/pages/zh-Hans/platform.ts",
        "content/pages/zh-Hans/product-tour.ts",
        "content/pages/zh-Hans/trust-center.ts",
        "src/components/SecurityPage.astro",
        "src/content-pages/ui.ts",
        "src/glossary/ui.ts",
        "src/lib/cluster-i18n.ts",
        "src/lib/clusters.ts",
        "src/lib/home.ts",
        "src/lib/i18n.ts",
        "src/lib/pricing.ts",
        "src/lib/security.ts",
        "src/lib/terms.ts",
        "src/pages/llms.txt.ts"
      ],
      "before_after": {
        "note": "The complete quoted before → after table with a source per row is the PR body draft (pr_body_draft); an auto-extracted 310-row table from the diff is at scratchpad/issue-222/before-after.md. Key rows follow; zh-Hans mirrors every row.",
        "sources": {
          "S0": "src/lib/positioning.ts (README T1/T2/T4, descriptor, E1)",
          "S1": "objectstack README @ origin/main 6befe19c: Try it in five minutes; the 12-row capability table; MCP on by default; the four gates; apps small enough for AI to hold whole / examples/app-crm loads end-to-end; Apache-2.0; os compile artifact; Console renders, Studio authors",
          "S3": "README What we mean by ontology + docs.objectos.ai extend-existing-systems: federating an external datasource is read-only by default and early; readOnly datasource or read-only DB user first, writes enabled deliberately per object; expect the read path to be the mature one",
          "S4": "docs.objectos.ai resources/license: editions table, Cloud or self-managed, The open-source alternative, contact sales → sales@objectstack.ai",
          "S5": "docs.objectos.ai build/ai-builder: packages/objects/fields/actions/flows from chat; tool list; pending-action queue with diff; ai:approve scoping; audit with conversation id",
          "S6": "this site's pricing page: Business lists SSO / SAML",
          "S7": "docs.objectos.ai configure/ai: MCP server is open framework, on by default; in-product AI runtime ships with ObjectOS"
        },
        "item1": [
          "ai/agent-developer/FDE/platform/product-tour tiles: under-150k / under-100k / about-50k tokens → Held whole (apps small enough for AI to hold whole — the bundled CRM loads end-to-end), 4 gates, AGENTS.md, 1 definition, 1 artifact, Apache-2.0 [S1]",
          "ai.ts build copy: 'A complete CRM is under 150k tokens: … under 100k … about 50k' → 'The definition stays small enough for an agent to hold whole: the objectstack README's bundled CRM — objects, views, a dashboard, a lead-conversion flow, permission sets, actions, translations — loads end-to-end and refactors in one change.' [S1]",
          "glossary application-metadata: 'fits in roughly 150k tokens' → 'stays small enough for AI to hold whole — the objectstack README's bundled CRM, objects through translations, loads end-to-end' [S1]"
        ],
        "item2": [
          "product-tour: 'ObjectOS gives teams a production platform for operating apps built on it' → 'ObjectOS is the commercial runtime environment built on ObjectStack, where teams run and operate the apps built on that model' [S0]",
          "platform FAQ: 'part of the open-source ObjectStack target format and runtime' → 'part of open-source ObjectStack, Apache-2.0: the protocol, kernel, CLI, production runtime, Console UI, and MCP server, with no feature gate between development and production' [S4]",
          "agent-developer lead: 'ObjectStack is the open target format and runtime for AI-written enterprise software…' → T2 + 'The agent is the writer and you are the reviewer: the scaffolder writes an AGENTS.md…' [S0,S1]",
          "FDE description/lead/FAQ: 'optional commercial production platform' → the descriptor, with the licence page's list of what clients buy [S0,S4]",
          "home kicker ×7 locales: 'For AI-written enterprise software' → positioning[locale].t1 [S0]",
          "glossary heading: 'The vocabulary of AI-written enterprise software.' → 'The vocabulary of an executable business ontology.' [S0]",
          "i18n articlesLead + terms.ts topic description: 'AI-written enterprise software' → 'executable business ontologies' [S0]"
        ],
        "item3": [
          "home card ×7 locales: 'Extend systems without replacing them — Add APIs, permissions, workflows, and intelligence on top of databases, ERP, CRM, and custom systems.' → 'Extend what already runs — read-only first — Federate a database you already run as an external datasource and model its tables as objects. Federation is read-only by default and early: the system of record keeps writing the rows, and writes are enabled deliberately, per object.' [S3]",
          "home closing ×7: 'Connect one existing system' → 'Federate one database you already run — read-only by default' [S3]",
          "product-tour: 'Add an object layer without replacing systems of record' → '… beside systems of record — read-only by default'; item 'without forcing a rip-and-replace migration' → 'a readOnly datasource or a read-only database user to start … writes are enabled deliberately, per object, once you trust the model' [S3]",
          "data-modeling: metric 'In place — Existing databases federate without migration' → 'Read-only first — … read-only by default, writes opt-in, and early'; description, datasource-sync item, table row and FAQ carry the same limit [S3]",
          "clusters.ts ai-native capability, legacy lead/definition/capability/FAQ, manufacturing capability/FAQ: each 'connect existing systems' claim now says read-only by default, early, writes per object [S3]",
          "cluster-i18n templates ×6 locales (capability 4, FAQ 3): same limit [S3]"
        ],
        "item4": [
          "agent-developer artifact: invented six-line rule file → 'The README path — Three commands, and your agent has the rules' with npm create objectstack@latest my-app, the README's support-desk prompt, npx os dev --ui; body explains the scaffolder writes AGENTS.md [S1]",
          "agent-developer primary: 'Read the docs' → docs root ⇒ 'Follow the README path' → github.com/objectstack-ai/objectstack#try-it-in-five-minutes [S1]",
          "ai.ts 'Agent writes source files': adds npm create objectstack@latest, AGENTS.md, npx os dev --ui [S1]",
          "mcp.ts: primary 'Compare editions and pricing' → 'Read the MCP docs' (docs/configure/mcp); secondary docs root → 'Point your agent at ObjectStack' (/agent-developer/) [S7]",
          "platform.ts: primary → 'Point your agent at ObjectStack'; secondary → 'Compare editions and pricing'",
          "home aiLink ×7: 'View the AI security model' → 'Point your agent at ObjectStack' (label now matches the existing /agent-developer/ href; href is markup, held out)"
        ],
        "item5": [
          "titles: 'ObjectOS Data Modeling/App Interfaces/Automation/Approvals/Permissions/Analytics: …' → the capability name without the brand prefix (slugs unchanged)",
          "leads: 'In ObjectOS that is …' → 'On the open-source ObjectStack runtime that is … and on ObjectOS the in-app AI Builder drafts/registers the same objects/views/flows from a plain-language request' (analytics: 'the ask-your-data assistant answers them in chat, inside the same permissions'); permissions: 'ObjectOS never does' → 'The ObjectStack runtime never does' [S4,S5]",
          "FAQ ×6: 'Is X in the open-source ObjectStack? Yes…' → 'What is open source here, and what does ObjectOS add?' with a per-page answer: data-modeling (AI Builder tools create packages/objects, add/modify/delete fields, queued for approval), app-ui (registers views e.g. a kanban grouped by status), automation (drafts flows and actions; AI governance from Business), approvals (pending-action queue with the diff; Setup Administrators hold approve by default; audit with the conversation), permissions (AI governance from Business; ai:approve scopable per package), analytics (ask your data from the same datasets; audited/guardrailed from Business) [S4,S5]",
          "CTAs: nine 'Compare editions and pricing' primaries → docs deep links (build/data, build/interface, build/automation/flows, build/automation/approvals, configure/permissions, build/interface/dashboards, configure/mcp) or the agent path; pricing stays the primary on ai.ts and the secondary on platform.ts",
          "platform ai-native copy: 'ObjectOS adds the in-app AI and production experience for teams.' → 'ObjectOS, the commercial runtime environment built on ObjectStack, adds the in-app AI Builder and Ask on top of that open mechanism, with AI governance from Business and hosted or self-managed delivery.' [S0,S4]",
          "self-hosted-ai cluster: definition and capability 1 separate the free Apache-2.0 framework from licensed self-managed ObjectOS (Business Self-Managed / Enterprise); new FAQ 'Is self-hosting free, and what does ObjectOS add?' (en in clusters.ts, zh-Hans via an EXTRA_FAQ hook in cluster-i18n.ts) with the licence page's answer, E1's export clause and the README path as the product CTA in text [S4,S0,S1]",
          "content-pages/ui.ts FAQ heading on all 15 pages: 'Questions this page should answer' / '这一页应该回答的问题' → 'Frequently asked questions' / '常见问题'"
        ],
        "item6": [
          "security kickers ×7 locales: eyebrow = h2 text → new aiKicker/residencyKicker/permissionKicker/deploymentKicker/faqKicker ('How agents act', 'Where data lives', 'Who may do what', 'Where it runs', 'FAQ' + translations); SecurityPage.astro prints the kicker field in the existing eyebrow element",
          "security blog CTA: en/ja/de/es/fr/ko linked extend-existing-systems-with-ai, zh linked the security-boundaries post → one target everywhere (ai-agent-business-data-security-boundaries, published in all eight locales); labels follow",
          "automation (en): ¥100k → $100k in four places",
          "customer-stories table: 4 rows under '5 patterns' → fifth row 'Employee service — Policy, Request, Approval, Employee — Employee-data visibility, request routing, policy answers'",
          "platform '25+ runtime services' → '12 — Typed primitives in the runtime vocabulary…' (README table has 12 rows; no public page counts services) [S1]",
          "platform '16+ open-source ObjectStack admin surfaces' → 'The open-source Console renders the real app and Studio authors the same metadata visually — …' (no public count) [S1]",
          "FDE table 'Platform-native assistants only' → 'Set by the vendor's roadmap' / 'Open MCP, on by default — Claude, Cursor, local models' [S1]"
        ],
        "item7": [
          "ai.ts table: already lists Cloud Free's AI taste and Business (Cloud or Self-Managed) on the stack from #216 — unchanged",
          "platform FAQ 'Can it run in our own infrastructure?': adds Business Self-Managed (licensed single node, in-app AI on your infrastructure, bring your own model or key) beside the free runtime and Enterprise [S4]",
          "trust-center identity row: 'SSO, SCIM, admin roles, session policy mapping' under the Enterprise packet → 'Project identity and permission metadata; SSO / SAML from ObjectOS Business' / 'SCIM and identity lifecycle, admin roles, session policy mapping' — canonical: pricing page puts SSO / SAML on Business, licence page gates SCIM on Enterprise and does not gate SSO [S4,S6]",
          "pricing.ts Enterprise contact: support@objectstack.ai → sales@objectstack.ai — canonical: the licence page says contact sales → sales@ three times (Enterprise, Runtime Subscription, OEM); support@ is the refund-policy billing address [S4]",
          "llms.txt pricing line: 'Open-source ObjectStack and ObjectOS Cloud and Enterprise plans.' → 'Open-source ObjectStack, the ObjectOS Cloud plans (Free, Team, Business), Business Self-Managed, and ObjectOS Enterprise.'; the FDE and agent-developer lines pick up the new page descriptions [S4]"
        ],
        "carried_posts": [
          "ai-ontology-open-protocol :145 ×7 locales: 'ObjectOS adds the commercial production experience around the same application — …' → 'ObjectOS, the commercial runtime environment built on ObjectStack, adds browser-based Build and Ask, … around the same application — …' [S0]; the :180 sentence already carried the canonical form on the stack after #209's sweep, so only :145 moved",
          "self-hosted-ai-app-platform heading ×7: 'ObjectStack Runtime and the Optional ObjectOS Layer' → 'The ObjectStack Runtime, and ObjectOS Built on It' (+ translations) [S0]",
          "extend-existing-systems-with-ai description + opening claim ×7: 'Connect ObjectOS to the database you already run' → 'On self-managed ObjectOS (Enterprise), connect the database you already run — read-only by default —'; the TL;DR / one-sentence paragraph states the assumption (a self-managed ObjectOS deployment, on your own infrastructure, where the database is reachable) [S0 E1, S3]; de/es/fr descriptions shortened to ≤230 chars; `updated: 2026-10-06T10:00:00+08:00` already present on all three posts from the stack, not moved"
        ]
      },
      "grep_proofs": {
        "scope": "non-blog sources: content/pages content/glossary src/lib src/content-pages src/glossary src/components src/pages (*.ts, *.astro), every locale",
        "retired_token_figures": "regex 150k|LT100k|~50k|约 50k|100k tokens|50k tokens|15 万 token|150k-token|roughly 150k (LT spelled for the sanitizer) → hits=0. A broader 'tokens?\\b' grep finds only a post slug (business-app-in-16k-tokens), 'token spend' and 'OAuth tokens' — not figures.",
        "old_descriptors": "regex open-source ObjectStack target format and runtime|open target format and runtime|open-source target format and runtime|production platform|commercial production|AI-written enterprise software|面向 AI 所写企业软件|商业生产平台|生产平台|目标格式与运行时|目标格式和运行时|AI 编写的企业软件, positioning.ts's own comment excluded → hits=0",
        "carried_post_phrasings": "regex commercial production experience|optional ObjectOS|optionale ObjectOS|ObjectOS opcional|ObjectOS optionnelle|任意の ObjectOS|선택형 ObjectOS|可选的 ObjectOS|可選的 ObjectOS|商业生产体验|商業生產體驗|Connect ObjectOS to the database you already run over the three posts, all eight files each → hits=0",
        "item6_7_strings": "regex Questions this page should answer|这一页应该回答的问题|¥100k|'25+'|16+ open-source|16+ 个开源|Platform-native|仅平台自带|support@objectstack over content/pages, src/content-pages, pricing.ts, llms.txt.ts → hits=0",
        "built_output": "dist/, 49 non-blog pages per locale × 8 locales: old descriptors hits=0; item-6 strings hits=0; retired-figure regex matches 31 non-blog HTML files, all of them the business-app-in-16k-tokens post card (title 'A Complete CRM Under 150k' + its description) rendered on three glossary term pages and the locale homes via article cards — blog content under #209's sweep, untouched here"
      },
      "tests": "pnpm content:lint → '✓ content lint passed (339 files, 44 glossary terms checked)'; pnpm content:lint --published → same line; pnpm check (under os-verify-lock, slot www-issue-222) → 'Result (143 files): 0 errors, 0 warnings, 0 hints' · 'VERDICT command-exit 0 · held the lock 13s · waited 314s'; pnpm build (under the lock) → '✓ zh-Hant: generated 46', '✓ content lint passed', '[build] Complete!', '✓ content lint --dist passed (478 built blog pages checked)', '✓ content lint --dist links passed (89519 internal links in 880 built pages resolve to built files)' · 'VERDICT command-exit 0 · held the lock 80s · waited 0s'; pnpm seo:smoke → 'SEO smoke test passed (870 HTML pages checked)'; pnpm svg:lint → 'svg-text-fit: OK — no text box crosses the shape under it … (112 SVGs, 2244 text boxes, tolerance 2px, 1 allowlisted)'; control-byte scan of changed files → 0; all logs under scratchpad/issue-222/*.log. NOT MEASURED: live reachability of the docs.objectos.ai deep links and the README anchor's docs links (the container proxy answers 403 for docs.objectos.ai and objectstack.ai; github.com answers 200) — the /docs/PATH mapping follows the repo's existing security link and the objectos content/docs tree at origin/main 5d2f837.",
      "screenshots": {
        "how": "Playwright 1.56.1 (/opt/node22/lib/node_modules/playwright) + /opt/pw-browsers/chromium against astro preview on 127.0.0.1:4777 (started and stopped by PID inside one foreground call); lazy images scrolled into view; full-page PNGs at 1440×750 and 390×844; horizontal-overflow probe (document scrollWidth vs innerWidth, plus any element past the right edge) at 1366×625, 1440×750, 1512×830, 1920×945, 390×844, 360×800",
        "result": "60 probes (5 pages × 2 locales × 6 viewports): 0 overflow, all HTTP 200; artifact code blocks extend past the viewport inside their own scroll box at 390/360 (pre-existing, scrollable); the 20 screenshots were looked at — long metric labels ('Read-only first', '先只读'), the new headings and the security kickers fit; nothing wraps mid-word; no copy was shortened for layout and no CSS touched",
        "files": [
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots/en-agent-developer-1440.png",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots/en-agent-developer-390.png",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots/en-data-modeling-1440.png",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots/en-data-modeling-390.png",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots/en-home-1440.png",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots/en-home-390.png",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots/en-product-tour-1440.png",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots/en-product-tour-390.png",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots/en-security-1440.png",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots/en-security-390.png",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots/zh-Hans-agent-developer-1440.png",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots/zh-Hans-agent-developer-390.png",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots/zh-Hans-data-modeling-1440.png",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots/zh-Hans-data-modeling-390.png",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots/zh-Hans-home-1440.png",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots/zh-Hans-home-390.png",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots/zh-Hans-product-tour-1440.png",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots/zh-Hans-product-tour-390.png",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots/zh-Hans-security-1440.png",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots/zh-Hans-security-390.png"
        ],
        "probe": "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots/probe.json",
        "script": "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots.mjs"
      },
      "deviations": [
        "SecurityPage.astro: five bound-expression swaps (eyebrow prints the new kicker field instead of the h2 text) and the blogSlug constant collapsed to one slug. No element, attribute, class or CSS changed; #218's delta on this file is its style block (line 142+), so no overlap. Flagging because the hold-out names markup — if the seat reads this as markup, drop these two hunks and items 6a/6h stay open.",
        "src/lib/terms.ts: one line outside the claimed file list (topic-hub description carried 'AI-written enterprise software'); edited so the old-descriptor proof reads zero.",
        "src/lib/cluster-i18n.ts: a small EXTRA_FAQ hook (per-cluster, per-locale FAQ appended after the template FAQ) so zh-Hans gets the self-hosted separation; ja/de/es/fr/ko keep the generic template FAQ (no authored separation there — the string did not exist in those locales).",
        "Item 1 includes the product-tour/platform tiles and the agent-developer/FDE one-liners that #209 listed: the #209 sweep merged on the stack is blog-only (commits ddddcbb, b92f833), so without them the grep proof could not read zero.",
        "Six capability page titles drop the 'ObjectOS ' prefix; slugs unchanged, so no redirect is needed (rename check: none).",
        "Nine hero primary CTAs changed from 'Compare editions and pricing' to docs deep links or the agent path; these are not the signup / 'Start' targets held for #215. Reachability of the docs deep links NOT MEASURED (proxy 403); paths derived from the objectos docs tree.",
        "Home AI-link href (MarketingHome.astro) and a cluster CTA slot (ClusterPage.astro) are markup and were not added; the label was changed and the product path is in the self-hosted FAQ text instead.",
        "Replay note: #224 (wave 2) edits extend-existing-systems-with-ai lines 35–37 in de/es/fr/ja/ko; this card edits lines 3 and 22 of the same files — separate hunks, but the replay should expect adjacent changes there.",
        "The dist-side token grep is not zero (31 files) because one blog post's title/description is rendered through article cards on glossary and home pages; that post is #209's scope and was left alone (see open_questions)."
      ],
      "mcp_calls": "0 — no MCP GitHub tool used",
      "api_writes": "1 — one repository_dispatch through scripts/pm/fleet-write (POST /repos/objectstack-ai/objectstack/dispatches) carrying one `comment` op → POST /repos/objectstack-ai/www.objectos.ai/issues/222/comments (this report). No git push, no PR, no labels (staged mode). Reads: 2 × gh api GET (issue 222, its comments).",
      "open_questions": [
        {
          "question": "The business-app-in-16k-tokens post's title ('How Many Tokens Is a Business App? A Complete CRM Under 150k') and description still carry the retired figures and are rendered on three glossary term pages and the locale home pages as article cards, so a dist-side grep of non-blog pages cannot read zero while the post stands. The post was left alone by #209's sweep (its premise is the figure) and is not in this card's scope.",
          "options": [
            "A keep the post as is and accept the card rendering (the figure is the post's own measured claim, attributed to it)",
            "B retitle/redescribe the post under the #209 ruling in the blog-side sweep",
            "C drop the post from the glossary articleSlugs and the latest-insights rail (hides it, does not fix it)"
          ],
          "recommendation": "A, because the ruling retired the figure as a product descriptor on pages, and a post reporting its own measurement is a different thing; B is the blog sweep's call, not this card's."
        },
        {
          "question": "Are the SecurityPage.astro expression swaps acceptable under the layout/CSS/markup hold-out (#223, #220, #218)?",
          "options": [
            "A keep them (five expression swaps + one constant, no element/CSS change)",
            "B drop the two hunks and leave items 6a and 6h for #223"
          ],
          "recommendation": "A, because the hold-out protects layout work from conflicts and these hunks touch neither layout nor #218's region of the file; a swap of which copy field an existing element prints is copy."
        }
      ],
      "out_of_scope_findings": [
        "class: b · reach: public page /en/approvals/ states 'the change lands in the same approvals inbox as a compact diff' for AI-proposed changes, while docs.objectos.ai build/ai-builder describes a separate pending-action queue (GET /api/v1/ai/pending-actions, approve/reject with diff) — the www claim may overstate the shared inbox; Seam: spec:docs ai-builder HITL section → consumer: www content/pages/en/approvals.ts ai-gate items · dedupe words: approvals inbox pending-action queue AI Builder diff · carrier: the repo:www seat on the next approvals-page pass · noted, not filed",
        "observation · forward-deployed-engineers.ts FAQ 'Foundry remains stronger for massive-scale data federation and analytics pipelines' is an unsourced competitor claim (AGENTS.md rule 7 territory); not flagged by the card · carrier: none · noted, not filed",
        "observation · www AGENTS.md Positioning still phrases the product as 'the target format and runtime for AI-written enterprise software', the descriptor #209 retired on pages; the repo's own author instructions lag the ruling · carrier: whoever next edits www AGENTS.md · noted, not filed",
        "observation · ja/de/es/fr/ko cluster pages share one generic template per locale (cluster-i18n.ts), so the self-hosted-ai separation exists only in en and zh-Hans there · carrier: none · noted, not filed"
      ]
    }

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report-addendum

    {
      "issue": 222,
      "report": "os-dev-report-addendum",
      "status": "staged",
      "branch": "staged/issue-222",
      "worktree": "/home/user/www-issue-222",
      "base_sha": "7f69d97df5e82a4fb9098693142169f4c41860df",
      "previous_tip": "b69e532b08b7f6bf88249c902494f2345c74d8dd",
      "final_commit": "dee44d2be0551ad3ffee66129d1e762903c25ecc",
      "commits": [
        "4ace01a site: non-blog copy sweep — …",
        "b69e532 content(blog): carried positioning wording in three posts, every locale",
        "dee44d2 site(approvals): AI metadata changes are their own reviewed path, not the record-approvals inbox"
      ],
      "pr": null,
      "pr_body_draft": "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/pr-body.md",
      "session": "session_01FeA1nwBz1ohH65dvffUGKr",
      "premise_still_valid": true,
      "answers_applied": {
        "Q1": "A — business-app-in-16k-tokens stays; the PR body's grep-proof note now says the 31 dist hits are that post's card and that a post's own measurement stays, as the #209 sweep recorded.",
        "Q2": "A — the SecurityPage.astro expression swaps and the collapsed blogSlug constant stay."
      },
      "summary": "Added the seat's review fix in this card: the approvals page (en, zh-Hans; zh-Hant derived), the approval-workflow glossary entry (en, zh-Hans) and llms.txt no longer say AI-proposed structural changes ride the same queue / the same approvals inbox as record approvals. The record-approvals inbox is described as the open-source console's (Apache-2.0); the AI Builder's metadata changes are described as their own reviewed path on ObjectOS — a pending-action queue separate from record approvals, the proposed diff shown before Approve, ai:approve held by Setup Administrators by default and scopable per package, every approve or reject audited with the originating conversation. The section at :133 keeps 'people and AI are both reviewed before anything ships' without claiming one shared queue. Every non-blog locale source was grepped for the same claim: the glossary entry and llms.txt were the only other carriers and are fixed; no blog post carries it, so there is no post-side finding. One commit, dee44d2, on staged/issue-222; not pushed, no PR, worktree kept.",
      "source": "objectos origin/main 5d2f837 content/docs/build/ai-builder.mdx:67-91 ('Human-in-the-Loop approval'): metadata-mutating tool calls route through a pending-action queue (/api/v1/ai/pending-actions); approvers see the proposed diff; ai:approve is held by Setup Administrator by default and can be scoped per package in a permission set; every approve/reject lands in sys_audit_log with the originating conversation id; it ships with ObjectOS (in-app AI Builder), not the open-source console. Record approvals: docs.objectos.ai resources/license (Console UI is Apache-2.0).",
      "files_changed": [
        "content/pages/en/approvals.ts",
        "content/pages/zh-Hans/approvals.ts",
        "content/glossary/en/approval-workflow.ts",
        "content/glossary/zh-Hans/approval-workflow.ts",
        "src/pages/llms.txt.ts"
      ],
      "before_after": [
        "approvals.ts :8 description: '… escalation, and record locking — the same queue that gates AI-written structural changes before they ship.' → '… escalation, and record locking in the open-source console — and, on ObjectOS, a separate reviewed path for the AI Builder's metadata changes: a pending-action queue with the diff, its own approve permission, and an audit entry.' [ai-builder.mdx 67–91; license]",
        "approvals.ts :12 lead: 'The schema change an AI just proposed rides the exact same queue.' → 'A schema change the ObjectOS AI Builder just proposed waits the same way — in its own pending-action queue, where an approver reads the diff before it goes live.' [ai-builder.mdx 67–75]",
        "approvals.ts :133 title: 'The same queue that reviews people reviews AI' → 'People and AI are both reviewed before anything ships'",
        "approvals.ts :135 copy: '… structural changes from an agent do not ship — they queue.' → '… a structural change from an agent does not ship — it waits for a person. On the open runtime that is your git diff; on ObjectOS it is the AI Builder's pending-action queue.' [ai-builder.mdx 67–69]",
        "approvals.ts :139 'Structural changes queue': 'When an agent proposes new objects, fields, flows, or permission changes, the change lands in the same approvals inbox as a compact diff.' → 'When the ObjectOS AI Builder proposes new packages, objects, fields, actions, or flows, the change lands in a pending-action queue — separate from record approvals — where approvers see the proposed diff before clicking Approve; every approve or reject lands in the audit log with the originating conversation.' [ai-builder.mdx 7–9, 67–75, 89–91]",
        "approvals.ts :143 'The diff is the request': + 'Approving is its own permission, ai:approve: Setup Administrators hold it by default, and a permission set can scope it per package.' [ai-builder.mdx 77–87]",
        "approvals.ts :158 table: 'The approval queue in front of deployment' → 'The AI Builder's pending-action queue, in front of deployment' [ai-builder.mdx 67]",
        "approvals.ts :167 checklist: 'AI-proposed structural changes cannot bypass the queue.' → 'AI-proposed structural changes cannot bypass review — the pending-action queue on ObjectOS, the git diff on the open runtime.' [ai-builder.mdx 67]",
        "zh-Hans approvals.ts :8 :12 :133 :135 :139 :143 :158 :167: '…也要过同一个队列' / '走的也是这同一个队列' / '审人的队列,同样审 AI' / '它们排队' / '落入同一个审批收件箱' / '部署之前的那道审批队列' / '无法绕过队列' → '…都在开源控制台里;在 ObjectOS 上,AI Builder 的元数据变更另走一条受审路径:带 diff 的待审动作队列、独立的批准权限与审计记录' / 'ObjectOS AI Builder 刚提议的 schema 变更也同样要等——在它自己的待审动作队列里,审批人读完 diff 才会生效' / '人和 AI 都要过审,才有东西上线' / '它要等人。在开源运行时上,等的是你的 git diff;在 ObjectOS 上,等的是 AI Builder 的待审动作队列' / '落入一个独立于记录审批的待审动作队列,审批人在点击批准前看到提议的 diff;每一次批准或驳回都连同发起它的对话写入审计日志' + '批准是一项独立权限 ai:approve:默认只有 Setup Administrator 持有,也可以在权限集里按包限定范围' / 'AI Builder 的待审动作队列,横在部署之前' / '无法绕过审阅——ObjectOS 上是待审动作队列,开源运行时上是 git diff' [same]",
        "glossary approval-workflow.ts :13 en/zh-Hans: 'This is also the queue that AI-proposed structural changes land in — the diff itself becomes the request —' / '这也是 AI 提出的结构性变更所进入的同一个队列——那份 diff 本身就是请求——' → 'AI-proposed structural changes get a reviewed path of their own: on ObjectOS the AI Builder's metadata changes wait in a pending-action queue where the diff itself is the request and approving is its own permission, ai:approve —' / 'AI 提出的结构性变更另有一条受审路径:在 ObjectOS 上,AI Builder 的元数据变更在待审动作队列里等人,那份 diff 本身就是请求,批准是一项独立权限 ai:approve——' [ai-builder.mdx 67–87]",
        "src/pages/llms.txt.ts :84: 'and a structural change routes to the same approval queue a human change would.' → 'and a structural change it proposes waits for a person too: on open-source ObjectStack as a git diff, on ObjectOS in the AI Builder's pending-action queue, where an approver reads the diff and approving is its own permission.' [ai-builder.mdx 67–87]"
      ],
      "grep_proofs": {
        "non_blog_sources": "regex same (approvals? )?(inbox|queue)|exact same queue|same approval queue|rides the (exact )?same queue|过同一个队列|同一个(审批)?(队列|收件箱)|同一(审批)?(队列|收件箱)|所进入的同一个 over content/pages content/glossary src/lib src/content-pages src/glossary src/components src/pages, all locales → hits=0 (before the fix: approvals en :8 :12 :133 :139, zh-Hans :8 :12 :139, glossary approval-workflow en/zh :13, llms.txt.ts :84)",
        "built_output": "dist/, non-blog HTML, all 8 locales, regex same approvals inbox|same queue|same approval queue|同一个审批收件箱|同一個審批收件箱|同一个队列|同一個隊列|所进入的同一个|所進入的同一個 → hits=0; new wording present: 'pending-action queue' ×3 on /en/approvals/, '待审动作队列' ×3 on /zh-Hans/approvals/, the zh-Hant derivation ×3, 'pending-action queue' ×2 in llms.txt, 'ai:approve' on both glossary pages",
        "blog_posts": "regex over content/blog → 0 files; nothing to report as a post-side finding"
      },
      "tests": "pnpm content:lint → '✓ content lint passed (339 files, 44 glossary terms checked)'; pnpm content:lint --published → same; pnpm check (os-verify-lock, slot www-issue-222) → 'Result (143 files): 0 errors, 0 warnings, 0 hints' · 'VERDICT command-exit 0 · held the lock 21s · waited 0s'; pnpm build (lock) → '[build] Complete!', '✓ content lint --dist passed (478 built blog pages checked)', '✓ content lint --dist links passed (89519 internal links in 880 built pages resolve to built files)' · 'VERDICT command-exit 0 · held the lock 102s · waited 0s'; pnpm seo:smoke → 'SEO smoke test passed (870 HTML pages checked)'. Logs: scratchpad/issue-222/{content-lint-default-2,content-lint-published-2,check-2,build-2,seo-smoke-2}.log",
      "screenshots": {
        "how": "same Playwright/Chromium probe as the main report, astro preview on 127.0.0.1:4778 (started and stopped by PID in one foreground call), approvals page only, en + zh-Hans, full-page PNGs at 1440×750 and 390×844, overflow probe at the six AGENTS.md viewports",
        "result": "12 probes, 0 overflow, all 200; looked at: the retitled section 'People and AI are both reviewed before anything ships' / '人和 AI 都要过审,才有东西上线' and the longer 'Structural changes queue' card fit at both widths; the code block scrolls in its own box at 390 as before",
        "files": [
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots-approvals/en-approvals-1440.png",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots-approvals/en-approvals-390.png",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots-approvals/zh-Hans-approvals-1440.png",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots-approvals/zh-Hans-approvals-390.png"
        ],
        "probe": "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/shots-approvals/probe.json"
      },
      "deviations": [
        "None beyond the main report; the fix stayed inside the five files above. The approvals page's 'Sensitive actions gated' item (runtime actions requiring sign-off) was left as is — that one is the flow approval path and is correct."
      ],
      "mcp_calls": "0",
      "api_writes": "2 total for this card — the main report comment (relay run 37485538160) and this addendum (one repository_dispatch carrying one `comment` op → POST /repos/objectstack-ai/www.objectos.ai/issues/222/comments). No git push, no PR, no labels.",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  5. objectstack-fleet commented on Oct 6, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report-addendum

    {
      "issue": 222,
      "report": "os-dev-report-addendum",
      "status": "staged",
      "branch": "lin/issue-222",
      "worktree": "/home/user/www-lin",
      "previous_tip": "922605d (lin/issue-222 = wave 1 + #218–#227 + the three #222 commits replayed)",
      "final_commit": "3a531e1f8ea22622f2567f5829d6c02debfc8751",
      "commit": "3a531e1 site(security): localize the FAQ kicker in ja, de, es, fr and ko",
      "pr": null,
      "pr_body_draft": "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/pr-body.md",
      "session": "session_01FeA1nwBz1ohH65dvffUGKr",
      "premise_still_valid": true,
      "summary": "One commit on lin/issue-222 for the #219 × #222 side effect: #219's securityEnglishFields marks any field equal to the English value as lang=\"en\", and #222 had set faqKicker: 'FAQ' in ja, de, es, fr and ko, so each of those security pages rendered one English eyebrow. The kicker is now localized per the site's own FAQ wording (es keeps the cluster label 'Preguntas frecuentes'; ja 'よくある質問', de 'Häufige Fragen', fr 'Questions fréquentes', ko '자주 묻는 질문'). A field-by-field comparison of the five locale blocks against en finds faqKicker as the only equal string, so the other four kickers needed nothing. Not pushed, no PR.",
      "files_changed": [
        "src/lib/security.ts"
      ],
      "before_after": [
        "security.ts ja faqKicker: 'FAQ' → 'よくある質問'",
        "security.ts de faqKicker: 'FAQ' → 'Häufige Fragen'",
        "security.ts es faqKicker: 'FAQ' → 'Preguntas frecuentes' (cluster-i18n.ts es label faq)",
        "security.ts fr faqKicker: 'FAQ' → 'Questions fréquentes'",
        "security.ts ko faqKicker: 'FAQ' → '자주 묻는 질문'"
      ],
      "built_html_check": {
        "baseline": "dist built from 922605d (timestamp 17:02 after the 17:00 commit; carries the dee44d2 wording and #219's lang attrs), snapshotted before the rebuild: de/es/fr/ja/ko /security/ each had 1 eyebrow with lang=\"en\" (the FAQ kicker), meta robots 'noindex, nofollow', canonical https://www.objectos.ai/en/security/",
        "after_3a531e1": "de 0 / es 0 / fr 0 / ja 0 / ko 0 eyebrows with lang=\"en\" (total 0 across the five pages); meta robots and link canonical byte-identical to the baseline on all five — the pages still inherit other English parts (metrics, tables, steps, FAQ bodies), so their fallback status is unchanged by design",
        "files": [
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/lin/security-baseline-922605d.txt",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/lin/security-check-3a531e1.txt"
        ]
      },
      "tests": "pnpm check (os-verify-lock, slot www-issue-222) → 'Result (152 files): 0 errors, 0 warnings, 0 hints' · 'VERDICT command-exit 0 · held the lock 12s · waited 0s'; pnpm build (lock) → '[build] Complete!', '✓ share images: 87 rendered', '✓ content lint --dist passed (478 built blog pages checked)', '✓ content lint --dist CJK line breaks passed (880 built pages …)', '✓ content lint --dist quotation marks passed (880 built pages, 11926 curly marks …)', '✓ content lint --dist links passed (93151 internal links in 880 built pages resolve to built files)' · 'VERDICT command-exit 0 · held the lock 97s · waited 0s'; pnpm seo:smoke → 'SEO smoke test passed (870 HTML pages checked; 569 sitemap URLs against 301 noindexed pages; 5424 canonical/hreflang annotations; 15865 prose blocks language-checked; 93141 internal links redirect-checked)'. Logs: scratchpad/issue-222/lin/{check,build,seo-smoke}.log",
      "screenshots": {
        "how": "same Playwright/Chromium probe, astro preview on 127.0.0.1:4779 (started and stopped by PID in one foreground call), /de/security/ and /ja/security/, full-page PNGs at 1440×750 and 390×844, overflow probe at the six AGENTS.md viewports",
        "result": "12 probes, 0 overflow, all 200; looked at: the FAQ section now opens on 'HÄUFIGE FRAGEN' / 'よくある質問' above the unchanged heading, nothing else moved",
        "files": [
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/lin/shots/de-security-1440.png",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/lin/shots/de-security-390.png",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/lin/shots/ja-security-1440.png",
          "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/lin/shots/ja-security-390.png"
        ],
        "probe": "/tmp/claude-0/-home-user/2224823d-3484-535e-94a5-c071ba6af395/scratchpad/issue-222/lin/shots/probe.json"
      },
      "deviations": [
        "None. Work done only in /home/user/www-lin on lin/issue-222; staged/issue-222 untouched; no stash."
      ],
      "mcp_calls": "0",
      "api_writes": "3 total for this card — two earlier relay comments and this addendum (one repository_dispatch carrying one `comment` op → POST /repos/objectstack-ai/www.objectos.ai/issues/222/comments). No git push, no PR, no labels.",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 15, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed and live · 2026-10-15T12:43Z


    Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions