Skip to content

fix(service-settings)!: remove the Feature Flags page whose four toggles changed nothing - #30272

Merged
objectstack-fleet[bot] merged 6 commits into
mainfrom
claude/project-thread-qzra6t
Nov 5, 2026
Merged

objectstack-fleet[bot] merged 6 commits into
mainfrom
claude/project-thread-qzra6t

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

Requested by Bill · project thread

domain:server#5 · os-bill · session_01Utp6CYVV6fcAQrNTDQRvPb

维护者速读

  • 改了什么:Setup 里的「功能开关」页整页移除:看板泳道、实时光标、行内评论、AI 助手四个开关,连同这个设置命名空间、它的 Setup 导航入口、四语文案和对外导出 featureFlagsSettingsManifest 一起删掉。
  • 为什么改:这四个开关没有任何代码读取,管理员打开保存后什么都不会变(ADR-0049 要么兑现要么删除);四个删完页面只剩一条提示,按您「以上都同意,立卡」的方向整页移除,功能做出来时再把开关带回来。
  • 风险与回滚:已存的 sys_setting 行和 OS_FEATURE_FLAGS_* 环境变量留在原处、变成无人读取的惰性数据,不做清理;访问 /api/settings/feature_flags 现在答 404。直接 import 该导出的宿主编译会报错(changeset 写明一行修法)。回滚即撤本 PR,无数据迁移。
  • 先看:packages/services/service-settings/src/manifests/index.ts(聚合去掉一项)、packages/platform-objects/src/apps/setup-nav.contributions.ts(导航条目)、packages/services/service-settings/src/settings-service.test.ts 的新钉子 no longer serves the retired feature_flags namespace。
  • 两分钟验证:pnpm --filter @objectstack/service-settings exec vitest run src/settings-service.test.ts -t "retired feature_flags",预期 1 条通过;或在控制台 Setup → 配置分组里,预期不再出现「功能开关」。
  • 需要你做的:无,席位落地。

Fixes #30204

Clause-②: no (narrowing) — removes the four settable keys of the feature_flags settings namespace, the then-empty namespace, its Setup entry and the featureFlagsSettingsManifest export; nothing is widened
Metadata-protocol: none
Skills-docs: follow-up #30275

What changes

The card's direction, agreed by the maintainer on filing (「以上都同意,立卡」): "Remove the four toggles, and the settings page if it is left empty. A flag comes back with the feature that reads it." Triage 6648454483 asks to wire each flag or remove it and say which per flag.

Per flag: all four removed, none wired. Measured at origin/main 5fa9375e (and re-checked after merging origin/main at 1d8e770): a git grep for ai_enabled, kanban_swimlanes, realtime_cursors, inline_comments outside tests and docs hits only the manifest and the service-settings translations. No code under packages/ or ui/ reads feature_flags.* through the settings service, the settings client or an OS_FEATURE_FLAGS_* variable.

Key Default Reader found Disposition
ai_enabled false none: the console's AI panel is decided elsewhere (AppHeader.tsx's topbar.aiAssistant is a label key) removed
kanban_swimlanes false none removed
realtime_cursors false none removed
inline_comments true none removed

The console's features map (ui/packages/app-shell/src/console/AppContent.tsx) comes from /api/v1/auth/config, not from this namespace, and is untouched. The cloud repository is not readable from this seat, so a reader there is not ruled out; it is said so here and in the report.

The namespace goes too. With the four toggles gone the manifest held only a beta banner and two empty groups, so per the ruling the page is removed (seat amendment 03:16Z, Claim 6648715176):

  • @objectstack/service-settings: manifests/feature-flags.manifest.ts deleted; builtinSettingsManifests loses it (10 manifests to 9); the featureFlagsSettingsManifest export leaves src/manifests/index.ts and src/index.ts; the feature_flags block leaves the en / zh-CN / ja-JP / es-ES bundles; README's env-override example moves to ai.log_prompts, and its built-in table drops the row; the plugin option's comment names builtinSettingsManifests instead of a list.
  • @objectstack/platform-objects: the Setup entry nav_settings_feature_flags and its four locale labels and three source-hash rows are removed, so Setup leaves no link to a namespace nothing serves.
  • Texts that named it: docs/qa/platform-checklist/areas/platform-core.json (11 namespaces to 10, list and variants), packages/cli/README.md, content/docs/protocol/kernel/config-resolution.mdx (env example now OS_AI_LOG_PROMPTS), content/docs/ui/apps.mdx (Configuration group row), and comment-only lines in plugin-security/src/objects/default-permission-sets.ts, service-datasource/src/admin-routes.ts and mcp/src/connect-ui.ts.

What happens to a stored value. Nothing registers feature_flags any more, so SettingsService.getManifest('feature_flags') throws UnknownNamespaceError (SETTINGS_UNKNOWN_NAMESPACE), a read or write through the service rejects the same way, and the REST door answers 404 UNKNOWN_NAMESPACE. A sys_setting row stored under the namespace and an OS_FEATURE_FLAGS_* environment variable are left where they are and become inert: no code resolves them. They are not cleaned up; an operator may delete them at will.

The changeset carries the BREAKING banner, both declaration lines, and the ADR-0087 disposition not-required (runtime-export-retired @objectstack/service-settings#featureFlagsSettingsManifest), verified by the gate (predicates 1 to 3).

Tests

  • New pin in settings-service.test.ts, SettingsService — registry: with every built-in manifest registered and OS_FEATURE_FLAGS_AI_ENABLED=true in the env, builtinSettingsManifests carries no feature_flags, getManifest('feature_flags') throws an UnknownNamespaceError whose code is SETTINGS_UNKNOWN_NAMESPACE, and get('feature_flags', 'ai_enabled') rejects with that code.
  • Tests that used the namespace as a convenient boolean toggle now use ai.log_prompts (default false) and ai.trace_enabled (default true): env coercion, getNamespace, the option-table negative case, and envKeyOf.
  • Count pins moved deliberately, each with its reason: built-in manifests 10 to 9 in settings-visibility-declaration.pin.test.ts (96 predicates unchanged: the removed manifest declared no visible), settings-retired-workspace-noun.pin.test.ts and settings-translation-coverage.test.ts.
  • settings-branding-posture.pin.test.ts: the walled-posture listing control keeps company and localization (the namespace it also named is gone); the Setup-order control now compares against nav_settings_lifecycle, the last platform-objects entry.
  • settings-help-business-words.pin.test.ts sweeps four namespaces instead of five.
Suite readings on head 1d8e770 (after merging origin/main)
  • pnpm --filter @objectstack/service-settings test: Test Files 67 passed (67), Tests 1151 passed (1151); typecheck exit 0.
  • pnpm --filter @objectstack/platform-objects test: Test Files 110 passed (110), Tests 1514 passed (1514); typecheck and check:test-typecheck exit 0.
  • Before the merge (head a9be523): service-settings 1143/1143, platform-objects 1514/1514.
Full dogfood (owed by the narrowing arm), head 1d8e770: one red, also red with this diff reverted
  • pnpm --filter @objectstack/dogfood test under the verify lock: VERDICT command-exit 1; Test Files 1 failed, 418 passed, 3 skipped (422); Tests 1 failed, 3491 passed, 36 skipped (3528).
  • The one red: test/permission-set-clone-door.dogfood.test.ts "a platform set (the lock-and-clone rule's commonest source) copies into its shipping package's pair": the clone of member_default answers 422 INVALID_METADATA ("grants on object 'sys_comment' which is not defined in objects").
  • Control leg: every package source file of this diff restored to origin/main (19 files), the five touched packages force-rebuilt, the same file run: the same test fails the same way (1 failed, 10 passed). Restored to HEAD afterwards (git diff HEAD empty) and rebuilt. So the red is on main, not caused by this PR. The sys_comment grant on member_default came in with 490d136 (fix(plugin-security): every member reads and posts comments, and reads the activity history, of the records they can read #30222), before this branch's base.

Deviations from the order

  • Contract review 6649883787 (must-fix): docs/qa/platform-checklist/areas/platform-core.json still counted 11 open-framework namespaces in two places (the GET /api/settings step and the settings-hub-roundtrip scoring clause); both now say 10, matching the list. Fixed in 8dffea3.
  • Contract review 6649883787 (should-fix, surface widened by the seat): packages/platform-objects/src/system/sys-setting.object.ts no longer gives feature_flags as an example namespace (now mail, branding, storage); node scripts/check-i18n-bundles.mjs --write regenerated en.objects.generated.ts, and the zh-CN / ja-JP / es-ES help strings were updated by hand (merge mode keeps translated values). Fixed in 8dffea3 (source) and 74c2ef8 (bundles).
  • Test Core (1/8) red on 1d8e770 (surface widened by the seat): packages/cli/test/connect-agent-both-halves-wire.pin.test.ts pins the platform admin's Setup tree; with nav_settings_feature_flags gone it is 32 entries, not 33 (both assertions, and the comment's 24 contributions now 23). A grep of every test under packages/ and ui/ for nav_settings_feature_flags or a Setup entry total found no other pin. Fixed in 8dffea3.
  • The changeset names the export, not each removed key, on its FROM line: the ADR-0087 runtime-export-retired category reads exactly the marker's operands there. The four keys are listed in prose as removed, each with no effect.

Readings on 74c2ef8: dispatch-gates --commands 96 derived (the 95 above plus check:cli-test-child-env), 96 exit 0, --ran 0 NOT-MEASURED; pnpm lint exit 0; cli unit pins (3 files, 12 tests), platform-objects 1514/1514 + typecheck, plugin-audit / plugin-security nav tests, rest.test.ts 216/216, service-settings setup-nav-hub-parity 9/9, all pass; check:i18n and check:i18n-stale-fill exit 0.

Acceptance notes

  • docs/adr/0007-settings-manifest-and-kv-store.md still shows feature_flags.ai_enabled as its worked example; ADRs are outside this PR's surface and the example stands as the record of the decision.
  • skills/objectstack-platform/references/plugin-development.md:354 names the feature_flags manifest as the place for org-tunable toggles; skills/** is outside this PR (the Skills-docs: line above), the seat files it.
  • The docs.objectos.ai repository documents FEATURE_FLAGS_AI_ENABLED; that text is now false and lives outside this repository.
  • packages/spec tests (settings-banner-translation.test.ts, customization-package.test.ts) and the console test SettingsField.infoBanner-12671.test.tsx use feature_flags as a self-contained fixture string; none reads the removed manifest, and both trees are outside this PR.
  • docs/audits/2026-06-handwritten-docs-accuracy-followups.md:288 cites the old key as an example in a dated audit; left as history.
  • Released CHANGELOG.md entries that mention OS_FEATURE_FLAGS_AI_ENABLED are release-owned and unchanged.

Verification

Derived gates: 95 derived, 95 run, 0 NOT MEASURED

node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (31 paths vs merge base) derived 95 families; the list re-derived on head 1d8e770 is identical. Every one exits 0. The sweep ran on a9be523; after the merge, these re-ran on 1d8e770, all exit 0: check-adr-0087-registration --base origin/main (verified: runtime-export-retired @objectstack/service-settings#featureFlagsSettingsManifest), check-plugin-teardown-shape --self-test, spec check:skill-examples, check:dual-build-cjs-loads, check:i18n, check:i18n-stale-fill, check:type-check-coverage, docs-audit/check-affected-docs, check:published-files, check-changeset-no-major, check-empty-changeset, check:nul-bytes, and check-platform-checklist --changed-from origin/main (outside the derivation). --ran reconciliation: "95 derived famil(ies) accounted for — 95 run, 0 NOT-MEASURED".

Three families first exited 3 (prerequisite not met: a shallow fixture commit, an unbuilt client, an unbuilt workspace) and went green once the prerequisite was met; the first check-adr-0087-registration run was red on the changeset's FROM line and went green after the fix in a9be523.

pnpm lint: exit 0 on 1d8e770.


Generated by Claude Code

… toggles had no reader

The four toggles of the feature_flags settings namespace (ai_enabled,
kanban_swimlanes, realtime_cursors, inline_comments) were read by no code,
so saving one changed nothing (ADR-0049 enforce-or-remove). Removing them
leaves the page empty, so the namespace goes too: its manifest, the
featureFlagsSettingsManifest export, its entry in builtinSettingsManifests,
its translations, the Setup nav entry with its locale labels and source
hashes, and the texts that name it. A pin holds that the namespace is no
longer registered.

Claude-Session: https://claude.ai/code/session_01Utp6CZJQ8AFU2wk2a8fuhz
Co-authored-by: Claude <noreply@anthropic.com>
…the ADR-0087 gate reads

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

github-actions Bot commented Nov 5, 2026 •

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

This PR changes 6 package(s): @objectstack/cli, @objectstack/mcp, @objectstack/platform-objects, @objectstack/plugin-security, @objectstack/service-datasource, @objectstack/service-settings, touching 22 documentable anchor(s). ⚠️ 5 changed file(s) yielded no anchor (packages/cli/README.md, packages/mcp/src/connect-ui.ts, packages/services/service-datasource/src/admin-routes.ts, …), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files.

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

  • content/docs/ai/connect-mcp.mdx (via setup.access (literal, a string literal in readPermission))
  • content/docs/api/client-sdk.mdx (via setup.access (literal, a string literal in readPermission))
  • content/docs/data-modeling/drivers.mdx (via sys_setting (symbol, a field of const object enObjects; a field of const object esESObjects; a field of const object jaJPObjects; a field of const object zhCNObjects))
  • content/docs/deployment/cli.mdx (via sys_setting (symbol, a field of const object enObjects; a field of const object esESObjects; a field of const object jaJPObjects; a field of const object zhCNObjects), setup.access (literal, a string literal in readPermission))
  • content/docs/deployment/cloud-connection.mdx (via setup.access (literal, a string literal in readPermission))
  • content/docs/deployment/environment-variables.mdx (via sys_setting (symbol, a field of const object enObjects; a field of const object esESObjects; a field of const object jaJPObjects; a field of const object zhCNObjects))
  • content/docs/kernel/contracts/cache-service.mdx (via feature_flags (literal, a string literal in namespace))
  • content/docs/permissions/capabilities.mdx (via setup.access (literal, a string literal in readPermission))
  • content/docs/permissions/delegated-administration.mdx (via setup.access (literal, a string literal in readPermission))
  • content/docs/permissions/permission-sets.mdx (via setup.access (literal, a string literal in readPermission))
  • content/docs/permissions/system-context.mdx (via readPermission (symbol, a field of const object featureFlagsSettingsManifest), sys_setting (symbol, a field of const object enObjects; a field of const object esESObjects; a field of const object jaJPObjects; a field of const object zhCNObjects), setup.access (literal, a string literal in readPermission))
  • content/docs/protocol/kernel/config-resolution.mdx (via readPermission (symbol, a field of const object featureFlagsSettingsManifest), sys_setting (symbol, a field of const object enObjects; a field of const object esESObjects; a field of const object jaJPObjects; a field of const object zhCNObjects), writePermission (symbol, a field of const object featureFlagsSettingsManifest), setup.access (literal, a string literal in readPermission), setup.write (literal, a string literal in writePermission))
  • content/docs/ui/apps.mdx (via setup.access (literal, a string literal in readPermission))
  • content/docs/ui/audience-based-interfaces.mdx (via setup.access (literal, a string literal in readPermission))

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

  • content/docs/releases/v14.mdx (via readPermission (symbol, a field of const object featureFlagsSettingsManifest), writePermission (symbol, a field of const object featureFlagsSettingsManifest), setup.write (literal, a string literal in writePermission))
  • content/docs/releases/v17/17-3.mdx (via sys_setting (symbol, a field of const object enObjects; a field of const object esESObjects; a field of const object jaJPObjects; a field of const object zhCNObjects))
  • content/docs/releases/v17/17-5.mdx (via setup.access (literal, a string literal in readPermission))
  • content/docs/releases/v17/17-6.mdx (via setup.access (literal, a string literal in readPermission))
  • content/docs/releases/v18/18-1.mdx (via sys_setting (symbol, a field of const object enObjects; a field of const object esESObjects; a field of const object jaJPObjects; a field of const object zhCNObjects))

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
  • 5 changed file(s) yielded no anchor (packages/cli/README.md, packages/mcp/src/connect-ui.ts, packages/services/service-datasource/src/admin-routes.ts, …) — pages documenting those are invisible to this run
  • 11 name(s) were too generic to anchor anything (single lowercase words)
  • the SDK route bridge reached 61 of 219 client-bound route-ledger rows — the other 158 have no registrar path: tail to select them, so pages documenting THEIR client methods cannot appear above, on this or any run. Of those 158: 0 are remediable by widening that discovery convention (an in-repo file declares the path; the convention did not scan it); 55 are structural — on a ledger where NOT ONE row is declared in-repo, so no discovery change reaches them at any price; 103 are undecided (no in-repo declaration, on a ledger that has other in-repo registrars — absence and an unreadable spelling are not distinguishable here). The rows themselves: node scripts/docs-audit/affected-docs.mjs --bridge-coverage
  • 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 — 61 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 959c26be1f4179202b0ed42f58076190d4d590d5 → packageMentionDocs.

Which tree this was computed on

This run read content/docs from 02f084bf16ccb44db778d972e6ead6eb1bfaa291 — the merge of head 74c2ef82638a525260943246260fcd7f2fd6902a into base 959c26be1f4179202b0ed42f58076190d4d590d5, 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 02f084bf16ccb44db778d972e6ead6eb1bfaa291 && git checkout 02f084bf16ccb44db778d972e6ead6eb1bfaa291
# afterwards, rebuild it from the two parents, which stay fetchable
git fetch origin 959c26be1f4179202b0ed42f58076190d4d590d5 74c2ef82638a525260943246260fcd7f2fd6902a && git checkout -B drift-repro 959c26be1f4179202b0ed42f58076190d4d590d5 && git merge --no-ff 74c2ef82638a525260943246260fcd7f2fd6902a

node scripts/docs-audit/affected-docs.mjs --json 959c26be1f4179202b0ed42f58076190d4d590d5

⚠️ 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 959c26be1f4179202b0ed42f58076190d4d590d5 → 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#5 · os-bill · session_01Utp6CYVV6fcAQrNTDQRvPb

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 1d8e7702a7da24550c1b3f350426d8a03730a2f9
Local-runs: none
Scope: hits — packages/services/service-settings/src/index.ts, packages/services/service-settings/src/manifests/feature-flags.manifest.ts, packages/services/service-settings/src/manifests/index.ts, packages/services/service-settings/src/settings-service-plugin.ts, packages/services/service-settings/src/translations/en.ts, packages/services/service-settings/src/translations/es-ES.ts, packages/services/service-settings/src/translations/ja-JP.ts, packages/services/service-settings/src/translations/zh-CN.ts, packages/services/service-settings/src/translations/settings-translation-coverage.test.ts, packages/services/service-settings/src/settings-service.test.ts, packages/services/service-settings/src/settings-branding-posture.pin.test.ts, packages/services/service-settings/src/settings-help-business-words.pin.test.ts, packages/services/service-settings/src/settings-retired-workspace-noun.pin.test.ts, packages/services/service-settings/src/settings-visibility-declaration.pin.test.ts, packages/platform-objects/src/apps/setup-nav.contributions.ts, packages/platform-objects/src/apps/translations/en.ts, packages/platform-objects/src/apps/translations/es-ES.ts, packages/platform-objects/src/apps/translations/es-ES.source-hashes.ts, packages/platform-objects/src/apps/translations/ja-JP.ts, packages/platform-objects/src/apps/translations/ja-JP.source-hashes.ts, packages/platform-objects/src/apps/translations/zh-CN.ts, packages/platform-objects/src/apps/translations/zh-CN.source-hashes.ts, packages/plugins/plugin-security/src/objects/default-permission-sets.ts, packages/services/service-datasource/src/admin-routes.ts, packages/mcp/src/connect-ui.ts, docs/qa/platform-checklist/areas/platform-core.json + packages/services/service-settings/package.json, packages/services/service-settings/src/settings-routes.ts, packages/services/service-settings/src/settings-service.ts, packages/services/service-settings/src/settings-service.types.ts, packages/services/service-settings/src/sys-secret-orphan-report.ts, packages/plugins/plugin-security/src/upgrade-impact-report.ts, packages/cloud-connection/src/runtime-config-plugin.ts, packages/core/src/security/resolve-authz-context.ts, packages/cli/src/utils/organization-ownership-apply.ts, packages/platform-objects/src/system/sys-setting.object.ts, packages/platform-objects/src/apps/translations/{en,es-ES,ja-JP,zh-CN}.objects.generated.ts, packages/spec/src/kernel/index.ts, packages/spec/src/kernel/public-auth-features.ts, ui/apps/console/src/pages/settings/SettingsHub.tsx, ui/packages/i18n/src/locales/en.ts, ui/packages/i18n/src/locales/de.ts, docs/adr/0007-settings-manifest-and-kv-store.md, docs/adr/0049-no-unenforced-security-properties.md, docs/adr/0087-metadata-protocol-upgrade-contract.md (addendum D9), scripts/check-adr-0087-registration.mjs (readFromBlock, predicate 3), .changeset/30204-feature-flags-namespace-removed.md (read for ②). Prose faces (content/docs/**, the two README.md files) not reviewed.

Reviewed at 2026-11-05T04:42Z against card #30204 (body and comments 6648454483, 6648715176, 6649695459), PR #30272 (body, file list, net diff against merge base bb86ff96cc6e) and the check-runs on this head. Read-only: no worktree, build, test or gate run.

Check-runs on this head. Success: Governed Surface Queue Guard, Lint · ESLint, Lint · docs & code guards, Lint · scoped · tooling self-tests, Type Check · source gates, Dogfood Regression Gate, Live E2E UI, Test UI, Build Docs, Check Changeset (first run), Check Documentation Links, Flag docs affected by code changes, PR-body guards (both), Plan Test Core shards, Spec property liveness, Auto Label, Check PR Size, filter. Still pending (in_progress, no conclusion): Build Core; Check Changeset (second run — the job that carries Require an ADR-0087 disposition on a declared-breaking changeset and check-changeset-no-major); Lint · CI, release & engine gates; Lint · PM dispatch-gates; Lint · repo & tooling gates; Lint · scoped · query-options erasure; Lint · scoped · slot lookup & corpus; Test Core 1/8 through 8/8; Type Check · consumer gates; Type Check · debt ledger; Type Check · workspace. Skipped by paths filter: Lint UI, Type Check UI, Build & E2E UI, Build UI Deps, UI Published Artifacts, Dogfood Verify CLI, Temporal Conformance, the opt-in harnesses. No check-run has failed. Those pending conclusions are gate verdicts this record does not supply.

① Derived judgments

  1. Removed public export featureFlagsSettingsManifest — right. At the merge base it is reachable from @objectstack/service-settings's one published entry: package.json exports["."] maps to dist/index.d.ts / dist/index.js, generated from src/index.ts, whose line 164 re-exported the name from ./manifests/index.js (line 8 there). At head it is absent from both barrels and the declaring file is deleted. Repo-wide git grep at base and head finds no importer outside packages/services/service-settings itself (three of its own test files, all rewritten in this diff); ui/, examples/, apps/, packages/qa import nothing of it. The compiler-carried break lands only on an external host; the changeset names it.
  2. builtinSettingsManifests 10 → 9 — right, and a behaviour change on a still-exported aggregate. The plugin defaults to it (settings-service-plugin.ts:201), so every host on the default slate loses the namespace at boot. Named in the changeset's FROM line. The three count pins that read the aggregate (settings-visibility-declaration 10→9 with a reason, settings-retired-workspace-noun floor 10→9, settings-translation-coverage floor 10→9) move with it; the 96-predicate pin is unchanged because the removed manifest declared no visible.
  3. The four settable keys feature_flags.ai_enabled / kanban_swimlanes / realtime_cursors / inline_comments — removed, accept set to nothing, right. With no manifest registered, SettingsService.getManifest, get, getMany, getNamespace, set, setMany, resetNamespace all refuse through UnknownNamespaceError (code: SETTINGS_UNKNOWN_NAMESPACE, settings-service.types.ts:561); the REST door maps that class to 404 UNKNOWN_NAMESPACE on GET, PUT and action (settings-routes.ts:312, 373, 433). The changeset's wire and in-process codes match the tree. Pinned by the new test no longer serves the retired feature_flags namespace, which registers every built-in manifest with OS_FEATURE_FLAGS_AI_ENABLED=true in the env.
  4. The namespace itself — removed, right. GET /api/settings lists service.listManifests(ctx) only (settings-routes.ts:277), so the hub no longer offers it. Side effect not named anywhere: feature_flags was the only manifest with category: 'Beta' / beta: true, so the hub's Beta category disappears with it — harmless, consistent with the ruling.
  5. Setup nav entry nav_settings_feature_flags with 4 locale labels and 3 source-hash rows — removed, right. The entry carried no permission gate, so it was served to every Setup reader and pointed at a URL that now 404s; removing it with the page is what the seat amendment (option A) ordered. No remaining reference under packages/ or ui/ (source, tests, generated bundles). settings-branding-posture.pin.test.ts re-anchors its ordering control on nav_settings_lifecycle, the real last platform-objects Configuration entry at head. The platform-objects.test.ts:515 pin is a floor, not a count.
  6. Locale bundles — settingsBuiltinTranslations and the four exported locale objects lose the feature_flags block — right. service-settings carries no generated bundle, so no regeneration was owed there.
  7. OS_FEATURE_FLAGS_* environment variables and stored sys_setting rows become inert — right, and tolerated by every path that walks stored rows. upgrade-impact-report.ts:85-86, 672-681 deliberately does not judge a stored setting whose namespace no manifest registers; sys-secret-orphan-report.ts:326 classes an unknown (namespace, key) as unattributable and never throws (the manifest declared no encrypted specifier anyway); organization-ownership-apply.ts's settings-move step selects by scope = 'global', never by manifest (the manifest was scope: 'tenant'); cloud-connection/runtime-config-plugin.ts:1276 reads branding alone; resolve-authz-context.ts:3017 reads localization alone. No list-all, export or sync path resolves an arbitrary stored namespace through getManifest.

② Semver level

  • patch on @objectstack/service-settings and @objectstack/platform-objects — right. Post-Task Checklist step 3: the level follows the metadata-protocol kind alone; Metadata-protocol: none takes patch, and a breaking non-protocol change ships patch with its BREAKING banner and ADR-0087 disposition. check-changeset-no-major forbids major in any case. Both bumped packages are the two whose published behaviour moves; the comment-only edits in mcp, plugin-security, service-datasource and the cli README line publish no behaviour and need no bump (dev deviation 2, accepted).
  • Metadata-protocol: none — right. No spec key, accepted value, metadata type or authorable spelling changes; a settings key is an administrator's saved value, and the nav entry is shipped platform metadata, not an authorable key. Clause-②: no (narrowing) is present and identical on the PR body and the changeset.
  • ADR-0087 disposition not-required (runtime-export-retired @objectstack/service-settings#featureFlagsSettingsManifest) — right, judged against D9's three predicates. Predicate 1 (retired-from-entry): shown in ① item 1. Predicate 2 (no-metadata-surface): at base the operand is declared in manifests/feature-flags.manifest.ts, not a *.zod.ts, not under packages/spec/src/contracts/, not an object definition, not a Zod projection, and no metadata surface references it in code. Predicate 3 (from-operands-named): readFromBlock reads one FROM side, the code span featureFlagsSettingsManifest between FROM and TO on the body's last line — exactly the marker's operand. The "Removed keys" bullet carries no FROM/TO pair, arrow or mapping table, so it is left to the residual prescription detector; the dev reports that gate green on both local heads, and its CI verdict is the pending second Check Changeset run.
  • The dev's deviation on the FROM block (keys moved to a "Removed keys" bullet, FROM line names the export only) — forced and correct. D9 predicate 3 refuses any FROM operand the marker does not name as out of range, and a settings key is neither operand kind (package#Export or package#Type.member), so a per-key FROM line was never admissible under this category. The TO side ("drop it from the host's SettingsServicePlugin({ manifests }) list") is the one-line host fix a removal owes, and the BREAKING banner names both affected parties.

③ Boundary flags

  • PR body: "the cloud repository is not readable from this seat, so a reader there is not ruled out" — escalated to the seat. A cloud-side read of feature_flags.* through the settings client or REST would now get SETTINGS_UNKNOWN_NAMESPACE / 404 UNKNOWN_NAMESPACE. Before landing, grep objectstack-ai/cloud for feature_flags, FEATURE_FLAGS_ and featureFlagsSettingsManifest; the tree here is clean either way.
  • PR body: "Skills-docs: follow-up skills(objectstack-platform): plugin-development.md still lists a feature_flags settings manifest with ai_enabled / OS_FEATURE_FLAGS_*; PR #30272 removes that namespace #30275" for skills/objectstack-platform/references/plugin-development.md:354-356 — stated by the dev, not verified here (that issue is outside this review's inputs). The skill text still names the feature_flags manifest as the home for org-tunable toggles; skills/** is Tier H and was outside the dev's surface. The seat confirms the follow-up exists.
  • Report deviation 1 (changeset FROM block) — answered in ②: right.
  • Report deviation 2 (no bump for comment-only packages) — answered in ②: accepted.
  • Report deviation 3 (model-free trailer pair on the thread branch) — a commit-message matter, not a tree matter; noted, nothing to judge here.
  • Report deviation 4 and dogfood_battery (one red in permission-set-clone-door.dogfood.test.ts, also red with this diff reverted; attributed to 490d136 / fix(plugin-security): every member reads and posts comments, and reads the activity history, of the records they can read #30222; carrier [Decision] Every non-admin member of a new app sees "no permission" for comments and activity on records they can read #30108 seat 2) — not this PR's. The control leg the dev ran is the right shape (same file, 19 source files restored to origin/main, force-rebuilt). Escalated only as: the seat confirms the main-red is on that lane's board before this PR arms the queue (AGENTS.md main-red convention). The head's Dogfood Regression Gate check-run is green.
  • open_questions: [] — nothing to answer.
  • out_of_scope_findings — the four listed are agreed (the dogfood red; the skills reference; docs.objectos.ai's FEATURE_FLAGS_AI_ENABLED; ADR-0007's worked example). On ADR-0007: its decision is the manifest-plus-KV mechanism; Example 3 and Phase 1 item 10 use feature_flags as an instance, so removing that instance reverses no recorded decision and no amendment is owed under Prime Directive 13. Three more that the report does not list — see ④ should-fix 2, 3 and 4 (two stale packages/spec comments, the console's Settings-hub subtitle, the sys_setting.namespace field description).
  • Acceptance notes on packages/spec test fixtures and the console SettingsField.infoBanner-12671.test.tsx using feature_flags as a self-contained string — agreed: none imports the removed manifest, and each passes on its own fixture.

④ Design judgment

Judged against the card's ruling ("Remove the four toggles, and the settings page if it is left empty. A flag comes back with the feature that reads it."), ADR-0049 enforce-or-remove, and the code each hunk cites. The premise re-checked on this head: git grep for the four keys across packages/, ui/, examples/, apps/, scripts/ (source and tests, generated bundles included) finds no reader — only the new pin, the ADR-0007 example, dated audit prose, and fixture strings in spec/console tests that never touch the manifest. AppHeader.tsx's aiAssistant is a label key; the console's features map comes from /api/v1/auth/config. The ruling's second sentence is honoured: nothing was wired, all four were removed, and the then-empty page (a beta banner and two empty groups) went with them.

  • packages/services/service-settings/src/manifests/feature-flags.manifest.ts, manifests/index.ts, src/index.ts — hold. The removal is total (declaration, aggregate, barrel), leaves no re-export behind an export *, and the comment in src/index.ts now names the manifests that remain.
  • packages/services/service-settings/src/settings-service-plugin.ts — holds. The option doc now names builtinSettingsManifests instead of a list that was already stale; no behaviour change.
  • packages/services/service-settings/src/translations/*.ts and settings-translation-coverage.test.ts — hold. The en.ts header now names the manifests it mirrors; the floor moved with the aggregate.
  • packages/services/service-settings/src/settings-service.test.ts — holds. The new pin asserts the three faces of the refusal (aggregate, getManifest, get) with the retired env var set, so a re-registration or an env-only resurrection would red it. The rewritten tests keep their original purpose on ai.log_prompts (default false) and ai.trace_enabled (default true), which exist on aiSettingsManifest at head.
  • settings-branding-posture.pin.test.ts, settings-help-business-words.pin.test.ts, settings-retired-workspace-noun.pin.test.ts, settings-visibility-declaration.pin.test.ts — hold; each count moves once with its reason written beside it. The business-words header keeps OS_FEATURE_FLAGS_AI_ENABLED as a historical example of the shape the sweep refuses, under a new line saying the namespace is gone — history, not a dead pointer.
  • packages/platform-objects/src/apps/setup-nav.contributions.ts and translations/* (labels and source hashes) — hold. No dead link: the entry, its four labels and the three hashes leave together, and nothing under ui/ or packages/ names nav_settings_feature_flags.
  • packages/plugins/plugin-security/src/objects/default-permission-sets.ts — holds. Comment only; the replacement list (branding, company, localization) is exactly the set of built-in manifests declaring readPermission: 'setup.access' at head. No permission set, seed or grant names the namespace anywhere in packages/.
  • packages/services/service-datasource/src/admin-routes.ts, packages/mcp/src/connect-ui.ts — hold. Comment only; the texts no longer name a Setup page that does not exist.
  • docs/qa/platform-checklist/areas/platform-core.json — does not hold; see must-fix 1.

Must-fix

  1. docs/qa/platform-checklist/areas/platform-core.json is left self-contradictory inside the one item the diff edits. Item platform-core.settings-hub-roundtrip now says at line 788 "the 10 open-framework settings namespaces a stock boot serves: the 9 in builtinSettingsManifests", but line 796 still instructs "capture the visible manifests (the 11 open-framework namespaces above …)" and the scored clause at line 885 still reads "each of the 11 open-framework namespaces resolves GET /api/settings/:ns". A QA run scores that clause against a namespace that no longer exists. The hunk's own claim ("11 namespaces to 10, list and variants") is not what the tree says. Fix: change both 11 to 10 in that item (two numbers; check-platform-checklist does not read the prose, so nothing else moves).

Should-fix

  1. packages/spec/src/kernel/index.ts:20-22 and packages/spec/src/kernel/public-auth-features.ts:21-23 both tell the reader that live runtime toggles "live on the feature_flags settings manifest (ADR-0007, env-overridable via OS_FEATURE_FLAGS_*)" — now false, and the only in-code pointer left to the retired manifest. packages/spec/** was outside the dev's surface and this is not in the report's out_of_scope_findings; file it as a follow-up (comment-only, no artifact regeneration owed).
  2. ui/packages/i18n/src/locales/en.ts:2252 and de.ts:1825 — console.settingsHub.subtitle ("Configure your system, integrations, and feature flags."), rendered on the Settings hub header (SettingsHub.tsx:127), promises the page this PR removes. ui/ was outside the dev's surface and this is not in the report; file it as a follow-up (the SettingsHub.pageHeader-12553 test asserts the key, not the text).
  3. packages/platform-objects/src/system/sys-setting.object.ts:119 — the namespace field's description "Manifest namespace (e.g. mail, branding, feature_flags)." ships in a package this PR bumps and in the four *.objects.generated.ts bundles. Drop the retired example and regenerate with node scripts/check-i18n-bundles.mjs --write (the translated-locale strings carry the same example, so each needs its one-word edit). Low; it is an "e.g.", not a claim.

Implemented-by: claude/project-thread-qzra6t
Reviewed-by: session_01Utp6CYVV6fcAQrNTDQRvPb

VERDICT: FAIL

…cklist, the sys_setting example and the Setup tree pin

Claude-Session: https://claude.ai/code/session_01Utp6CZJQ8AFU2wk2a8fuhz
Co-authored-by: Claude <noreply@anthropic.com>
…space that exists, in every locale

Claude-Session: https://claude.ai/code/session_01Utp6CZJQ8AFU2wk2a8fuhz
Co-authored-by: Claude <noreply@anthropic.com>
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:server#5 · os-bill · session_01Utp6CYVV6fcAQrNTDQRvPb

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 74c2ef82638a525260943246260fcd7f2fd6902a
Local-runs: none
Scope: hits — docs/qa/platform-checklist/areas/platform-core.json, packages/cli/test/connect-agent-both-halves-wire.pin.test.ts, packages/platform-objects/src/system/sys-setting.object.ts, packages/platform-objects/src/apps/translations/en.objects.generated.ts, packages/platform-objects/src/apps/translations/es-ES.objects.generated.ts, packages/platform-objects/src/apps/translations/ja-JP.objects.generated.ts, packages/platform-objects/src/apps/translations/zh-CN.objects.generated.ts + packages/platform-objects/src/apps/setup-nav.contributions.ts (entry count), packages/platform-objects/src/apps/translations/{es-ES,ja-JP,zh-CN}.source-hashes.generated.ts (provenance of the hand-edited help strings), packages/services/service-settings/src/manifests/storage.manifest.ts (the new example namespace), scripts/check-i18n-stale-fill.mjs (header). The whole-diff judgments of the record on 1d8e7702a7da24550c1b3f350426d8a03730a2f9 (comment 6649883787) stand for every file this delta leaves untouched; this record re-judges the delta alone and what it makes a claim about. Prose faces not reviewed.

Delta reviewed at 2026-11-05T05:22Z: git diff 1d8e7702a7da24550c1b3f350426d8a03730a2f9 74c2ef82638a525260943246260fcd7f2fd6902a, two commits (8dffea3, 74c2ef8), 7 files, +13 / -12, no changeset change, no package source other than one field description. Read-only: nothing built, run or re-run; no GitHub write.

Check-runs on this head. Every check-run is completed except the second Check Changeset run, still in_progress (its first run on this head concluded success; that job carries Require an ADR-0087 disposition and check-changeset-no-major, and the changeset is byte-identical to the one that passed on both heads). Success: Lint & Repo Gates, TypeScript Type Check, Test Core (and all eight shards — 1/8, red on the previous head, is green), Build Core, Governed Surface Queue Guard, Test UI, Live E2E UI, Dogfood Regression Gate, Build Docs, Check Documentation Links, Flag docs affected by code changes, PR-body guards (both), Plan Test Core shards, Spec property liveness, Auto Label, Check PR Size, filter, and every Lint · and Type Check · lane. Skipped by paths filter: Lint UI, Type Check UI, Build & E2E UI, Build UI Deps, UI Published Artifacts, Dogfood Verify CLI, Temporal Conformance, the opt-in harnesses. No check-run has failed. Of the ten required contexts, seven are success and three (Lint UI, Type Check UI, Build & E2E UI) are skipped by their paths filter.

① Derived judgments

  1. Must-fix 1 of the previous record is closed. platform-core.json:796 now reads "the 10 open-framework namespaces above" and the scored clause at :885 "each of the 10 open-framework namespaces resolves GET /api/settings/:ns"; the item platform-core.settings-hub-roundtrip agrees with itself (fixture at :788, step at :796, clause at :885, variants list of 10). The only remaining "11" in the file (:762) is a dated change-record of QA run QA run · priority:P0 (23/23) · eeec88d1 · 2026-11-01 · 20 PASS / 2 PARTIAL / 1 FAIL / 0 BLOCKED / 0 NOT-RUN #28545, history by construction. Right.
  2. Should-fix 4 of the previous record is closed. sys-setting.object.ts:119 now gives mail, branding, storage; storage is a registered built-in namespace at head (storage.manifest.ts:11). en.objects.generated.ts carries the regenerated source text; the zh-CN / ja-JP / es-ES help leaves were edited by hand, which is the sanctioned path for a translated-locale value (AGENTS.md Documentation Guardrails: translated values are hand-written, editing one is fine, adding or dropping keys is drift — no key moved). None of the three *.source-hashes.generated.ts tables carries an entry for objects.sys_setting.fields.namespace.help, so the leaves are legacy-trusted translator text, not byte copies whose digest would now be stale; check:i18n and check:i18n-stale-fill are green on this head. Right.
  3. New public-surface effect: none. No export, accept set, namespace, route, permission or nav entry changes in the delta. The one shipped-string change is the sys_setting.namespace field description (help text) in @objectstack/platform-objects, already bumped patch by the standing changeset; a help-string example needs no changeset line of its own.
  4. connect-agent-both-halves-wire.pin.test.ts 33 → 32 — right, and the derivation the comment states holds on the tree. SETUP_NAV_CONTRIBUTIONS carries 23 nav_* entries at head (24 at the merge base, less nav_settings_feature_flags); 8 served groups + 23 contributions + the MCP entry = 32, on both assertions (:266, :290). This pin lives in packages/cli/test, outside the first head's surface and outside the dev's grep of count pins — it was the Test Core (1/8) red on 1d8e7702a, and it is the one pin of the Setup tree's total: a repo-wide grep of toHaveLength(32|33) and nav_settings_feature_flags over packages/**/*.test.ts and ui/**/*.test.ts(x) finds no other Setup-tree count. Test-only; @objectstack/cli publishes nothing from it and needs no bump.

② Semver level

Unchanged by the delta and still right: patch on @objectstack/service-settings and @objectstack/platform-objects, Clause-②: no (narrowing), Metadata-protocol: none, disposition not-required (runtime-export-retired @objectstack/service-settings#featureFlagsSettingsManifest) with the FROM line naming exactly that operand. The delta adds no published export, key or behaviour, so nothing in the changeset is owed a new line. The previous record's reading of ADR-0087 D9 predicates 1–3 is unaffected (the operand's base and head state did not move).

③ Boundary flags

④ Design judgment

Judged against the card's ruling and ADR-0049 as before; the delta changes no behaviour, so the question is whether each hit holds against the code it cites.

  • docs/qa/platform-checklist/areas/platform-core.json — holds. The item is internally consistent again; the Setup-destination total at :637 ("46 … recount from the payload each run") is a dated reading the file itself tells the runner to re-measure, so it is not a claim this diff falsifies.
  • packages/cli/test/connect-agent-both-halves-wire.pin.test.ts — holds. Both counts and the comment's arithmetic are what the tree serves (8 + 23 + 1); the comment names the retirement that moved the count, beside the one that moved it before, so the next reader is sent to the measurement, not to a stale number.
  • packages/platform-objects/src/system/sys-setting.object.ts and the four *.objects.generated.ts — hold. The example names a live namespace; the regeneration touched only the en leaf (rewritten from source) and the three translated leaves (hand-written values, no key added or dropped); no source-hash table claims those leaves as byte copies.

Must-fix: none. The previous record's one must-fix is closed in the tree.

Should-fix: none new. The two previous should-fix items that remain open (packages/spec/src/kernel/index.ts:20-22, packages/spec/src/kernel/public-auth-features.ts:21-23; ui/packages/i18n/src/locales/en.ts:2252, de.ts:1825) are outside this PR's surface and, per the coordinator, carried on #30282; they do not block this head.

Implemented-by: claude/project-thread-qzra6t
Reviewed-by: session_01Utp6CYVV6fcAQrNTDQRvPb

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:server#5 · os-bill · session_01Utp6CYVV6fcAQrNTDQRvPb

席位核对 · ACCEPT · head 74c2ef82 · 2026-11-05T05:23Z

Head-sha: 74c2ef8

Item Reading
Shape Ready path: base main, relay pr_create. Body: attribution, signature, ## 维护者速读, Fixes #30204; Clause-②:, Metadata-protocol: and Skills-docs: follow-up #30275 at line start; ## Deviations from the order written by the seat from the dev's draft.
Ruling 「以上都同意,立卡」: the four toggles are removed (none had a reader, ADR-0049 enforce-or-remove), and the page, left empty, is removed with its Setup entry and the featureFlagsSettingsManifest export (seat amendment 03:16Z). getManifest('feature_flags') throws UnknownNamespaceError (SETTINGS_UNKNOWN_NAMESPACE), pinned; stored sys_setting rows and OS_FEATURE_FLAGS_* become inert, said in the body.
Contract review (narrowing) CONTRACT_REVIEW_TIER FAIL at 1d8e7702a (6649883787: one must-fix, platform-core.json still said 11 at :796/:885); delta PASS at 74c2ef82 (6650443923), with the must-fix closed and nothing new. Should-fix 2/3 (spec docblocks, Settings hub subtitle) → #30282; should-fix 4 (sys_setting help example) fixed here.
Gates CI on 74c2ef82: 40 success, 14 skipped, 0 failure, 0 pending (Test Core 1/8, red on the previous head from the Setup tree count, now green). Dev: derived 96/96 exit 0, pnpm lint 0.
Declarations Clause-②: no (narrowing); changesets patch with the BREAKING banner (check-changeset-no-major), ADR-0087 runtime-export-retired disposition (the FROM line names the export; the four keys are listed as removed). Metadata-protocol: none.
Escalations Cloud repo: not readable from this seat (org code search returns objectstack only), as the body states; a cloud reader of feature_flags.* would now get 404 UNKNOWN_NAMESPACE. Main red permission-set-clone-door is #30255 (from #30222), not this PR's. skills/** → #30275.
Landing Not governed (0 of 34 paths), 285 changed lines. Tier S: seat lands, pr_ready + automerge_enable.

@objectstack-fleet
objectstack-fleet Bot marked this pull request as ready for review November 5, 2026 05:23
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Nov 5, 2026
Merged via the queue into main with commit 977be38 Nov 5, 2026
55 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/project-thread-qzra6t branch November 5, 2026 05:47
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

Development

Successfully merging this pull request may close these issues.

Feature flags: all four toggles have no reader, so turning them on does nothing

1 participant