Skip to content

fix(service-settings): translate Data Lifecycle settings; AI & Knowledge help in business words - #28139

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/project-thread-kwainq
Oct 30, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/project-thread-kwainq

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

domain:server#4 · os-elon-musk · session_016WV4d1Np3hU7RQnA13YZcL

Fixes #28064
Fixes #28069

What changes

#28064: the Data Lifecycle settings page is translated

  • settings.lifecycle is added to the zh-CN, ja-JP and es-ES files of settingsBuiltinTranslations (packages/services/service-settings/src/translations/). It covers the title, the description, and each key's label and help (enabled, retention_overrides, quotas, quota_defaults, growth_alert_rows).
    • The titles match the Setup sidebar entry (数据生命周期 / データライフサイクル / Ciclo de vida de los datos).
    • The field terms follow the object lifecycle forms already shipped (保留期 / 保持期間 / retención, 生命周期类别 / ライフサイクルクラス / clase de ciclo de vida).
    • JSON examples inside the help stay as written.
    • en keeps falling back to the manifest literals, as it does for sms.
  • The coverage test declares the lifecycle namespace instead of refusing it. settings-translation-coverage.test.ts now checks every manifest whose copy this bundle carries: the bundled manifests plus a named list of hosted platform manifests.
    • A hosted manifest is one that another package registers into the same hub and that ships no bundle of its own. Today the list holds objectql's lifecycleSettingsManifest.
    • A hosted manifest gets the same full coverage check as a bundled one, and its namespace counts as declared for the no-undeclared-copy check.
    • A new test pins that the list contains lifecycle and that no namespace is declared twice.
  • The parity pin loses its exception. setup-nav-hub-parity.test.ts drops HUB_UNTRANSLATED. Its per-locale test is now "every hub page carries a translated title", so the sidebar-vs-hub label comparison also runs for Data Lifecycle.
  • The translations/index.ts docblock names the hosted namespace.

#28069: AI & Embedder and Knowledge help is in business words

This applies the treatment #28063 gave Authentication / Feature Flags / Mail. The manifest literals (the English fallback) and the en / zh-CN / ja-JP / es-ES packs change together:

  • API keys and gateway model. The OpenAI / Anthropic / Google API keys and the gateway model read "used instead of the key (model) set in the server configuration". Before, they read "Forwarded as OPENAI_API_KEY" (and ANTHROPIC_API_KEY, GOOGLE_GENERATIVE_AI_API_KEY, AI_GATEWAY_MODEL). The settings manifest has no per-field docs-link slot, so, as in fix(service-settings): Settings help in business words; Country is a picker that shows names and stores the code #28063, the env var names leave the help entirely. They stay in the code comment beside the Reset action and in the deployment docs.
  • Record traces says it keeps a record of each AI request and its response, so a conversation can be inspected and replayed. It no longer names sys_ai_trace.
  • Batch size is "chunks sent to the embedding provider in one request". It no longer says embed().
  • Knowledge help:
    • Indexing defaults: "a value set on a knowledge source itself wins over these defaults" (no KnowledgeSource.adapterConfig).
    • Over-fetch multiplier is described by its effect (no topK × overFetch, no "JS-side").
    • The RAGFlow default dataset says "knowledge source".
    • The Turso group no longer says "tenant's primary libSQL connection".
    • Enforce RLS on search no longer names IDataEngine (manifest and zh-CN).
  • Code spans around model examples (provider/model, openai/gpt-4o, default) become plain text or quotes. The examples stay, because they are what the administrator types.
  • settings-help-business-words.pin.test.ts now sweeps ai and knowledge as well as auth, feature_flags and mail. It adds teeth cases for the strings settings: AI & Embedder and Knowledge help still name env vars, sys_ai_trace and code calls (#27521 row 2 remainder) #28069 was filed for, plus a negative case showing that model examples are not flagged.

No key, default, option or validation changes in either part. packages/objectql is untouched. There are two patch changesets for @objectstack/service-settings.

Why

#28064: Setup → All Settings → Data Lifecycle read English under zh-CN, ja-JP and es-ES: the card title, its description and every field. Every other settings page and the sidebar entry for this page were translated.

  • The page comes from objectql's lifecycleSettingsManifest, and no bundle carried settings.lifecycle.*.
  • The built-in settings bundle is where every other settings page's copy lives, but its coverage test refused any namespace that no bundled manifest declares.
  • This PR widens that rule by naming the manifest, not by adding a bare exception.

#28069: the help under AI & Embedder and Knowledge read like code comments in all four languages. It named env vars, the trace object, a code call and a config path that an administrator can neither see nor change from this page. Triage ruled that the help says what the setting does in business words. It is the remainder of #27521 row 2, whose other pages #28063 fixed.

Verification

All readings are against the worktree at origin/main 8cb8c7f4 plus the two commits (273efdc1, b4c0a258).

Check Before After
setup-nav-hub-parity.test.ts with the exception list emptied 3 failed / 6 passed (9): zh-CN, ja-JP, es-ES each expected [ 'lifecycle' ] to deeply equal [] 9 / 9 passed
settings-translation-coverage.test.ts, new test with the lifecycle entries removed n/a 3 failed / 41 passed (44): zh-CN/ja-JP/es-ES covers settings.lifecycle
Old coverage test with the new lifecycle entries 3 failed / 37 passed (40): undeclared namespace:lifecycle n/a (rule replaced)
settings-help-business-words.pin.test.ts sweeping ai and knowledge, against the old help 10 failed / 20 passed (30): the manifest and all four packs, for both namespaces, e.g. ai.keys.openai_api_key.help → env var or error code: OPENAI_API_KEY, ai.trace_enabled.description → … sys_ai_trace, knowledge.indexing.description → camelCase code identifier: adapterConfig 30 / 30 passed
@objectstack/service-settings pnpm test n/a 65 files, 1076 / 1076 passed
@objectstack/service-settings pnpm typecheck n/a exit 0
eslint on the changed .ts files n/a exit 0
check:adr-0087-registration, check:changeset-fixed, check:empty-changeset, check:doc-authoring, check:cross-package-test-inputs n/a all exit 0
check-commit-card-trailers --range origin/main..HEAD n/a exit 0 (2 commits)

No test outside service-settings pinned the old AI or Knowledge help: git grep for each replaced phrase finds only released CHANGELOG.md entries.

维护者速读

Clause-②: no
Metadata-protocol: none

🤖 Generated with Claude Code

https://claude.ai/code/session_016WV4d1Np3hU7RQnA13YZcL

…d locale

The Data Lifecycle page is objectql's lifecycleSettingsManifest, and no
bundle carried a settings.lifecycle entry, so its hub card and every field
read English under zh-CN, ja-JP and es-ES.

- Add settings.lifecycle (title, description, each key's label and help)
  to the zh-CN, ja-JP and es-ES settings bundles, in the terms the Setup
  sidebar and the object lifecycle forms already use.
- The coverage test now checks every manifest whose copy the bundle
  carries: the bundled slate plus the hosted platform manifests another
  package registers into the same hub (objectql's lifecycle), so the
  lifecycle namespace is declared, not exempted.
- The Setup/hub parity test drops HUB_UNTRANSLATED: every hub page must
  carry a translated title in each shipped locale.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WV4d1Np3hU7RQnA13YZcL
…ords

The help on Setup -> Settings -> AI & Embedder and Knowledge named the
env vars a saved key or model stands in for, the trace object, the
embedding call and the knowledge source's config path, in en, zh-CN,
ja-JP and es-ES.

- Rewrite those strings in the manifests (the English fallback) and in
  the four packs the way the Authentication / Feature Flags / Mail help
  was rewritten: a saved key or gateway model is used instead of the one
  in the server configuration; traces, batch size, indexing defaults and
  over-fetch say what they do. Code spans around model examples become
  plain text; the examples stay.
- The business-words pin now sweeps the ai and knowledge namespaces too,
  with teeth cases for the strings this was filed for.

No key, default, option or validation changes.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WV4d1Np3hU7RQnA13YZcL
@github-actions github-actions Bot added size/m documentation Improvements or additions to documentation tests tooling labels Oct 30, 2026
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 1 package(s): @objectstack/service-settings, touching 2 documentable anchor(s). ⚠️ 1 changed file(s) yielded no anchor (packages/services/service-settings/src/translations/index.ts), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files.

2 hand-written doc(s) NAME something this change touched and may need an implementation-accuracy re-verification:

  • content/docs/data-modeling/objects.mdx (via expireAfter (literal, a string literal in settings), maxAge (literal, a string literal in settings))
  • content/docs/deployment/production-readiness.mdx (via maxAge (literal, a string literal in settings))

⛔ 1 release-owned page(s) also name something this change touched. These are read-only:

  • content/docs/releases/v17/17-5.mdx (via expireAfter (literal, a string literal in settings))

content/docs/releases/ is RELEASE-OWNED (AGENTS.md "Documentation Guardrails"): release
notes are written centrally at release time, and a code PR that edits them is the exact PR
that guardrail exists to stop. They are still audited — read-only. If one of them is actually
wrong, file an issue or open a dedicated docs-only PR; do not edit it here.

What this run could not see
  • 1 changed file(s) yielded no anchor (packages/services/service-settings/src/translations/index.ts) — pages documenting those are invisible to this run
  • 2 name(s) were too generic to anchor anything (single lowercase words)
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 9 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 121d1a5ffbf716bf1c3fc56e17f6eafe9fff804d → packageMentionDocs.

Which tree this was computed on

This run read content/docs from 4c8b92bba4dc8c897f9e6025c7309e65c03c3868 — the merge of head 66e91af7948cb2eb3f1ee00569c5f6e3e7ae3a1f into base 121d1a5ffbf716bf1c3fc56e17f6eafe9fff804d, which is what actions/checkout gives a pull_request run. Not the PR head.

A worktree cut from an older main holds a different content/docs, so re-deriving there can legitimately return a different list — that is a different tree, not a wrong row. To answer on the same tree:

# while this PR is open — GitHub drops the merge commit once it closes
git fetch origin 4c8b92bba4dc8c897f9e6025c7309e65c03c3868 && git checkout 4c8b92bba4dc8c897f9e6025c7309e65c03c3868
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 121d1a5ffbf716bf1c3fc56e17f6eafe9fff804d 66e91af7948cb2eb3f1ee00569c5f6e3e7ae3a1f && git checkout -B drift-repro 121d1a5ffbf716bf1c3fc56e17f6eafe9fff804d && git merge --no-ff 66e91af7948cb2eb3f1ee00569c5f6e3e7ae3a1f

node scripts/docs-audit/affected-docs.mjs --json 121d1a5ffbf716bf1c3fc56e17f6eafe9fff804d

⚠️ That checkout carried uncommitted changes, so the commit above does not fully identify what was read.

Advisory only, and a precision-first one (#9192): a page is listed because it names a
symbol, wire route or SDK method this diff touched — not because it mentions a changed
package. Each row says which anchor put it there, so a wrong row is reportable rather than
merely annoying. To re-verify, run the docs-accuracy-audit workflow scoped to these files:
node scripts/docs-audit/affected-docs.mjs 121d1a5ffbf716bf1c3fc56e17f6eafe9fff804d → pass the list as
args.docs, on the commit named under Which tree this was computed on.

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:server#4 · os-elon-musk · session_016WV4d1Np3hU7RQnA13YZcL

维护者速读

  • 改了什么:①「数据生命周期」设置页在 zh-CN / ja-JP / es-ES 补上标题、描述和 5 个字段的翻译,对齐测试去掉 HUB_UNTRANSLATED 例外(i18n: the Data Lifecycle settings page reads English in every locale (no settings.lifecycle.* translations) #28064);②「AI 与嵌入」「知识库」的帮助文字改成业务用语,四个语言同步,不再出现环境变量名和内部名(settings: AI & Embedder and Knowledge help still name env vars, sys_ai_trace and code calls (#27521 row 2 remainder) #28069)。
  • 为什么改:生命周期页在三种语言下全是英文,侧栏却已翻译;AI/知识库帮助像代码注释,管理员看不懂。
  • 风险与回滚:Clause-②: no;只改翻译、帮助文字和测试,没改键名、默认值或校验,没动 objectql。两个提交各对应一张卡,可分别还原。
  • 先看:service-settings/src/translations/settings-translation-coverage.test.ts("托管清单"规则)、setup-nav-hub-parity.test.ts、settings-help-business-words.pin.test.ts。
  • 两分钟验证:pnpm --filter @objectstack/service-settings exec vitest run src/setup-nav-hub-parity.test.ts src/settings-help-business-words.pin.test.ts src/translations,全绿。
  • 需要你做的:无(非受管;不欠契约复审;席位按本任落地授权落地)。

席位意见:ACCEPT。

席位核对

Head-sha: 66e91af7948cb2eb3f1ee00569c5f6e3e7ae3a1f

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review October 30, 2026 14:07
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 30, 2026
Merged via the queue into main with commit 57faf5d Oct 30, 2026
49 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-kwainq branch October 30, 2026 14:26
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/m tests tooling

Projects

None yet

1 participant