Skip to content

docs: SEO titles for the 67 English pages whose title tag was two words or fewer - #309

Merged
hotlong merged 1 commit into
mainfrom
claude/pm-dispatch-objectos-ju9td1
Oct 6, 2026
Merged

hotlong merged 1 commit into
mainfrom
claude/pm-dispatch-objectos-ju9td1

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #167

What

A seoTitle: frontmatter line on the 67 English pages whose built title tag read as one or two words plus the | ObjectOS suffix (measured on the built HTML at 601bb37: 67 of 79 pages). The H1, sidebar and breadcrumb keep the short title; only the title tag, og:title, twitter:title and the TechArticle JSON-LD headline change, which is what #166's mechanism was built for.

  • Each page gains exactly one line. No title, description or body line changes (git diff --numstat: 67 files, every one 1 0; every added line is a seoTitle: line).
  • Every title leads with the page's own specific term, lifted from its description and headings (an automated check confirmed each lifted term occurs in the page text before the line was written), and targets documentation intent per the [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 Option A ruling, not category head terms.
  • Rendered length on the built HTML: 52 to 60 characters including the suffix; none over 60.
  • The three duplicated titles (Approvals, Dashboards, Notifications, each used by a build/configure page and a use page) are now distinct.
  • No page keeps a one- or two-word title. The borderline candidates (Docker, Kubernetes, ObjectQL, FAQ, Glossary, Quickstart) each had a stronger, specific option in their own description, so none was kept.

Before and after, on the built HTML

Page Before After Width
content/docs/architecture.mdx Architecture ObjectOS Architecture: What Runs, Where Data Lives
content/docs/build/agents.mdx Agents ObjectOS AI Agents: Define Agents, Skills and Tools
content/docs/build/ai-builder.mdx AI Builder ObjectOS AI Builder: Build Apps from Plain-Language Chat
content/docs/build/automation/approvals.mdx Approvals ObjectOS Approval Flows: Route Records for Human Sign-off
content/docs/build/automation/index.mdx Automation ObjectOS Automation: Flows, Workflows and Approvals
content/docs/build/automation/workflows.mdx Workflows ObjectOS Workflows: Record Lifecycle as a State Machine
content/docs/build/data/formulas.mdx Formulas ObjectOS Formula Fields, Dynamic Defaults and CEL Logic
content/docs/build/data/index.mdx Data Model ObjectOS Data Model: Objects, Fields and Relationships
content/docs/build/data/relationships.mdx Relationships ObjectOS Relationships: Lookup, Master-Detail and Roll-ups
content/docs/build/data/validation-rules.mdx Validation Rules ObjectOS Validation Rules: Required, Unique and CEL Rules
content/docs/build/index.mdx Build ObjectOS Build Apps: AI Chat, Studio Forms, or Templates
content/docs/build/interface/actions.mdx Actions ObjectOS Actions: REST Endpoints, Buttons and AI Tools
content/docs/build/interface/apps.mdx Apps ObjectOS Apps: Navigation, Branding and Audience Gating
content/docs/build/interface/dashboards.mdx Dashboards ObjectOS Build Dashboards: Datasets, Widgets, Drill-down
content/docs/build/interface/forms.mdx Forms ObjectOS Forms: Create vs Edit, Sections, After Submit
content/docs/build/interface/index.mdx Interface ObjectOS Interface: Apps, Views, Forms, Dashboards, Pages
content/docs/build/interface/pages.mdx Pages ObjectOS Free-form Pages: Regions, Components, Doc Pages
content/docs/build/interface/views.mdx Views ObjectOS Views: List, Kanban, Calendar, Gantt and Form
content/docs/build/marketplace.mdx Marketplace ObjectOS Marketplace: Install and Publish Ready-made Apps
content/docs/build/packages.mdx Packages ObjectOS Packages: Create, Version, Publish and Install
content/docs/build/templates.mdx Templates ObjectOS App Templates: Forkable Helpdesk, Contracts, Todo
content/docs/configure/ai.mdx AI Service ObjectOS AI Service: Model Provider, Embedders, RAG, MCP
content/docs/configure/api-access.mdx API Access ObjectOS API Access: REST APIs, API Keys and OAuth 2.1
content/docs/configure/authentication.mdx Authentication ObjectOS Authentication: OAuth, OIDC/SSO and Device Flow
content/docs/configure/data-sources.mdx Data Sources ObjectOS Data Sources: Bind Objects to External Databases
content/docs/configure/email.mdx Email ObjectOS Transactional Email: Transports and Templates
content/docs/configure/index.mdx Administration ObjectOS Administration: Users, Access and Settings
content/docs/configure/localization.mdx Localization ObjectOS Localization: Timezone, Language and Formats
content/docs/configure/notifications.mdx Notifications ObjectOS Notification Routing, Preferences and Templates
content/docs/configure/permissions/field-level-security.mdx Field-Level Security ObjectOS Field-Level Security: Grants and API Enforcement
content/docs/configure/permissions/index.mdx Permissions ObjectOS Permission Model: Positions, Sets, Record Access
content/docs/configure/permissions/managing-access.mdx Managing Access ObjectOS Managing Access: Onboard, Change Roles, Offboard
content/docs/configure/permissions/permission-sets.mdx Permission Sets ObjectOS Permission Sets: Object, Field and System Grants
content/docs/configure/permissions/positions.mdx Positions ObjectOS Positions: Job Functions and Audience Anchors
content/docs/configure/permissions/record-access.mdx Record Access ObjectOS Record Access: Sharing Model, Rules and Shares
content/docs/configure/runtime.mdx Runtime Configuration ObjectOS Runtime Config: App Artifact, Database, Startup
content/docs/configure/storage.mdx Storage ObjectOS File Storage: Local Disk, S3, R2, MinIO, Spaces
content/docs/configure/system-settings.mdx System Settings ObjectOS System Settings: Branding, Feature Flags, Secrets
content/docs/configure/webhooks.mdx Webhooks ObjectOS Webhooks: At-least-once Delivery, HMAC, Retries
content/docs/deploy/air-gapped.mdx Air-gapped Deployment ObjectOS Air-gapped Deployment: Licence Mode and Settings
content/docs/deploy/docker.mdx Docker ObjectOS Docker: Run the Licensed Runtime Image by Digest
content/docs/deploy/index.mdx Deployment ObjectOS Deployment: Self-Managed from the Licensed Image
content/docs/deploy/kubernetes.mdx Kubernetes ObjectOS Kubernetes: Digest Pinning, Migrations, Probes
content/docs/index.mdx Introduction ObjectOS Documentation: Quickstart, Build, Deploy, Operate
content/docs/operate/audit-logs.mdx Audit Logs ObjectOS Audit Logs: Every Change, Sign-in and Event
content/docs/operate/index.mdx Operate ObjectOS Operate: Production Readiness, Backups, Upgrades
content/docs/operate/observability.mdx Observability ObjectOS Observability: Logs, Request IDs, Metrics, Errors
content/docs/operate/production.mdx Production Readiness ObjectOS Production Readiness: Hardening, Secrets, CORS
content/docs/operate/troubleshooting.mdx Troubleshooting ObjectOS Troubleshooting: Startup, Login, Permissions
content/docs/quickstart.mdx Quickstart ObjectOS Quickstart: Run ObjectStack Locally with os start
content/docs/reference/cel.mdx CEL Expressions ObjectOS CEL Expressions: Formulas, Predicates, Templates
content/docs/reference/cli.mdx CLI Reference ObjectOS CLI Reference: Every os Command and Its Flags
content/docs/reference/environment-variables.mdx Environment Variables ObjectOS Environment Variables for Self-Hosted Deployments
content/docs/reference/field-types.mdx Field Types ObjectOS Field Types: All 48 Built-in Types and Options
content/docs/reference/objectql.mdx ObjectQL ObjectOS ObjectQL: JSON Query Format, Filters and Joins
content/docs/reference/rest-api.mdx REST API ObjectOS REST API: Generated Endpoints, Auth, OpenAPI
content/docs/reference/runtime-capabilities.mdx Runtime Capabilities ObjectOS Runtime Capabilities: Base and Optional Packages
content/docs/reference/skills-cli.mdx skills CLI ObjectOS skills CLI: Install Skills into Your Coding Agent
content/docs/resources/faq.mdx FAQ ObjectOS FAQ: Setup, Multi-tenancy, Pricing and Licensing
content/docs/resources/glossary.mdx Glossary ObjectOS Glossary: Platform Terms, One Definition Each
content/docs/resources/support.mdx Support ObjectOS Support: Get Help, Report Bugs, Response Times
content/docs/use/approvals.mdx Approvals ObjectOS Approval Inbox: Submit, Review and Track Requests
content/docs/use/dashboards.mdx Dashboards ObjectOS Reading Dashboards: KPIs, Charts, Date Filters
content/docs/use/index.mdx Using ObjectOS ObjectOS User Guide: Sign In, Apps, Search and Navigation
content/docs/use/notifications.mdx Notifications ObjectOS Notification Inbox: Approvals, Digests, Muting
content/docs/use/views.mdx Using views ObjectOS Using Views: Grid, Board, Calendar and Timeline
content/docs/why.mdx Why ObjectOS ObjectOS Why ObjectOS: When to Use It and When Not To

Locales: English only, by rule

The card asked to propagate seoTitle into existing locale files. That conflicts with the repository's rules, which win:

  • AGENTS.md, Translation workflow: "You edit English. You do not edit translations. Every *.LOCALE.mdx file is a derived artifact" and "Don't hand-edit a *.LOCALE.mdx file, and don't 'just fix' one while you're in there."
  • .github/scripts/check-translation-ownership.mjs: a non-translator PR may delete a locale artifact and "never add or modify one". The gate is dormant today only because TRANSLATION_BOT_LOGIN is unset (The ownership check is inert on main until TRANSLATION_BOT_LOGIN is set #68, ruled letter A: enforce); run with the variable set, this diff still passes because it touches no locale file.
  • docs/TRANSLATION.md rule 1 and the frontmatter fidelity rule: locale frontmatter keys must match the English keys, and the translation pass is what writes them.

So this PR writes English only. The locale gap it leaves for the translation pipeline: 163 locale siblings of these pages now lack seoTitle (check-translation-output.mjs --report lists them as frontmatter: missing key(s): seoTitle; reported, not gating), and the English sha change puts them on the translation worklist as stale (zh-Hans 39 to 49, the other five 24 to 26). Translated seoTitle values must be written against local search vocabulary, and zh-Hant regenerates from zh-Hans.

Gates (worktree objectos-issue-167, commit 7b4fd19, rebased onto cec227a)

  • pnpm turbo run type-check --continue --force: exit 0 (✓ Types generated successfully, tsc clean).
  • NEXT_PRIVATE_STANDALONE=true pnpm turbo run build --force (CI shape): exit 0, ✓ Compiled successfully in 83s, ✓ Generating static pages using 3 workers (1052/1052). The 351 Failed to load dynamic font lines are the OG-card font fetch refused by the container proxy's certificate chain; the baseline build of 601bb37 prints the same 351.
  • pnpm turbo run test --force: exit 0 (all ten --self-test suites in run-self-tests.mjs green).
  • check-locale-surface.mjs: ✓ every advertised URL has a source file and every source file is advertised; both llms bodies carry every en-only page title ...
  • check-positioning.mjs: ✓ positioning: 4 copies equal their constants; the brand is right in 659 pages and 2 llms bodies; no stale sentence in 79 English sources ...
  • check-search-locales.mjs: ✓ search locales: all 8 locales answer 200, find "permissions", find every own page by its title, and find nothing for a nonce
  • check-translations.mjs: ✓ translations gate passed.
  • check-translation-output.mjs --files (CI PR scope): ✓ translation output gate passed (261 pre-existing finding(s) reported), blocking on 0 changed translations.
  • check-translation-ownership.mjs --actor 'objectstack-fleet[bot]' --files changed.txt (workflow argv, --name-status --no-renames): dormant run touches 0 translation artifact(s) and 67 other file(s); with TRANSLATION_BOT_LOGIN=objectos-translator: ✓ 67 file(s) changed, no translation artifacts touched.
  • gen-zh-hant.mjs --check: ✓ zh-Hant: 61 generated file(s) match the zh-Hans sources byte for byte.
  • Control-character scan of the 67 files: 0 hits.
  • Built-HTML measurement after: 79 pages, 0 at two words or fewer, 0 over width 60, 0 duplicate titles, all 79 carry the suffix.

Acceptance notes


Generated by Claude Code

…ds or fewer

Adds a `seoTitle:` frontmatter line to every English page whose built
`<title>` read as one or two words plus the ` | ObjectOS` suffix, so the
tab/result title carries the terms a reader searches for while the H1,
sidebar and breadcrumb keep the short noun (#166's mechanism).

- 67 pages: each gains exactly one line; no `title`, `description` or
  body line changes.
- Every title leads with the page's own specific term, lifted from its
  description and headings, and renders at 52–60 characters including the
  suffix (measured on the built HTML).
- The three duplicated titles (Approvals, Dashboards, Notifications —
  each used by a build/configure page and a use page) are now distinct.
- English only. Locale siblings are translation artifacts that a
  non-translator commit may not modify (AGENTS.md, Translation workflow;
  check-translation-ownership.mjs); the translation pass carries the new
  key over, and the output report lists the 163 siblings now missing it.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01FeA1nwBz1ohH65dvffUGKr
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

1 participant