Skip to content

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

Closed

Description

@objectstack-fleet

epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff

From a real-user walkthrough of Setup, filed on the maintainer's word: 「以上都同意,立卡」 (2026-11-05). Measured on main b7075d9908, with the console in dev mode, unless a line says otherwise. Test app scaffolded with create-objectstack@18.3.0.

Governing text: ADR-0049 enforce-or-remove. A declared capability the runtime does not honor is an implementation gap.

What a customer sees

An administrator opens 功能开关, sees 看板泳道, 实时光标, 行内评论 and AI 助手 with a Beta badge, turns one on, saves, and looks for the feature.

Measured

packages/services/service-settings/src/manifests/feature-flags.manifest.ts declares ai_enabled, kanban_swimlanes, realtime_cursors and inline_comments. A repository-wide git grep for each key finds the manifest, one settings service test, and docs, and no code that reads the value.

The console's AI panel has its own aiAssistant handling in ui/packages/app-shell/src/layout/AppHeader.tsx, so that toggle's text promises something decided elsewhere. The toggles were not switched and watched in the UI; this finding is from the code.

Expected

Remove the four toggles, and the settings page if it is left empty. A flag comes back with the feature that reads it. The maintainer agreed to this direction in the same message.

Activity

  1. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: first-touch audit · p2 · domain:server · pm:queue · 2026-11-05T02:57Z

    ⛔ Not a claim.

    • Read fresh. All four Setup feature flags (看板泳道, 实时光标, 行内评论, AI 助手) have no reader, so turning one on does nothing. That is an ADR-0049 enforce-or-remove gap, so p2.
    • Fix site: service-settings (feature-flags.manifest.ts): wire each flag or remove it, and say which per flag.

    Generated by Claude Code

  2. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-bill · session_01Utp6CYVV6fcAQrNTDQRvPb

    Claim: PM loop round 1
    Session: session_01Utp6CYVV6fcAQrNTDQRvPb (seat) · dev = project card thread session_01Utp6CZJQ8AFU2wk2a8fuhz
    Account: os-bill
    Branch: claude/project-thread-qzra6t (harness-pinned thread branch; platform exception to claude/issue-<n>-<slug>)
    Worktree: objectstack-issue-30204
    Domain: domain:server
    Seat: domain:server#5
    File surface: packages/services/service-settings/** (manifest, builtinSettingsManifests, the featureFlagsSettingsManifest export, translations, tests, README, the plugin's comment); packages/platform-objects/src/apps/setup-nav.contributions.ts (nav_settings_feature_flags) with its en/zh-CN/ja-JP/es-ES translations and source-hashes; docs/qa/platform-checklist/areas/platform-core.json (namespace count and list); packages/cli/README.md; comment-only lines in plugin-security/default-permission-sets.ts, service-datasource/admin-routes.ts, mcp/connect-ui.ts; content/docs/** pages naming these keys (not releases/**); one changeset. ⛔ packages/spec/**, ui/**, skills/**, docs/adr/**, .claude/**, AGENTS.md (stop on breach; explain in the report)
    Container & model: S–M, mode:thread, model: default tier (opus) — dispatch-gates --tier at 5fa9375e: no path-derived mandate, effort: high
    Clause-②: no (narrowing) — removes the four settable keys and the then-empty feature_flags namespace and its public export; BREAKING banner in the changeset; contract-review-tier review by the seat before the queue
    Metadata-protocol: none
    Responsibility: service-settings declares four feature_flags toggles that no code reads (seat reading at 5fa9375e) | none: saving a toggle changes nothing | every administrator who flips a flag in Setup
    Thread-read: 6648454483
    Premise: holds — the dev's measurement at 5fa9375e finds no reader of the four keys in ui/ or packages/ (AppHeader.tsx's aiAssistant is a label key; AppContent.tsx features come from /api/v1/auth/config); the cloud repo is unreadable and is said so
    Serial constraints cleared: none in this surface; the Setup nav entry goes with the page so no dead link is left.

    Order: project file server-seat5/dispatch-30204.md, delivered to the card thread. Surface widened 03:16Z on the dev's measurement (option A: remove the page, its nav entry and the texts that name it).

  3. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-bill · session_01Utp6CYVV6fcAQrNTDQRvPb
    os-dev-report

    Card thread session_01Utp6CZJQ8AFU2wk2a8fuhz · branch claude/project-thread-qzra6t · draft PR #30272 · head 1d8e7702a

    {
      "issue": 30204,
      "status": "done",
      "branch": "claude/project-thread-qzra6t",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/30272",
      "session": "session_01Utp6CZJQ8AFU2wk2a8fuhz",
      "premise_still_valid": true,
      "summary": "Premise held at 5fa9375e and again at 1d8e7702a: no code under packages/ or ui/ reads feature_flags.ai_enabled, kanban_swimlanes, realtime_cursors or inline_comments (AppHeader.tsx aiAssistant is a label key; AppContent.tsx features come from /api/v1/auth/config); the cloud repo is unreadable from here. All four removed, none wired; the page was then empty, so per the seat amendment (option A, Claim 6648715176) the feature_flags manifest, its builtinSettingsManifests entry, the featureFlagsSettingsManifest export, its four locale blocks, the Setup entry nav_settings_feature_flags with its labels and source hashes, and the texts naming it are removed. A new pin holds getManifest('feature_flags') throws UnknownNamespaceError with code SETTINGS_UNKNOWN_NAMESPACE; stored sys_setting rows and OS_FEATURE_FLAGS_* vars become inert, not cleaned up (PR body and changeset). Card assignee untouched; PR opened without assignee or review request.",
      "tests": "head 1d8e7702a (after merging origin/main): service-settings Test Files 67/67, Tests 1151/1151, typecheck exit 0; platform-objects Test Files 110/110, Tests 1514/1514, typecheck + check:test-typecheck exit 0 (os-verify-lock VERDICT command-exit 0). Pre-merge a9be523f: 1143/1143 and 1514/1514. New pin: settings-service.test.ts 'no longer serves the retired feature_flags namespace'. No ablation: the diff removes declarations and moves count pins; no tested runtime behaviour changes.",
      "gates": "dispatch-gates --commands on a9be523f: 95 derived families, 95 run, exit codes captured before any pipe; re-derived on 1d8e7702a: identical list. Final: 95 x exit 0; --ran reconciliation 95 derived / 95 run / 0 NOT-MEASURED / 0 UNRUN. First pass had check-adr-0087-registration exit 1 (changeset FROM line, fixed in a9be523f) and 3 x exit 3 (teardown-shape self-test on shallow clone, spec check:skill-examples, check:dual-build-cjs-loads without the workspace build), all exit 0 on 1d8e7702a after fetching the fixture commit and a full build (turbo 119/119). Also on 1d8e7702a: check:i18n, check:i18n-stale-fill, check:type-check-coverage, check-affected-docs, check:published-files, check-changeset-no-major, check-empty-changeset, check:nul-bytes, check-platform-checklist --changed-from origin/main: all exit 0. pnpm lint exit 0. CI check-runs on #30272: not yet read at report time.",
      "dogfood_battery": "1d8e7702a · os-verify-lock VERDICT command-exit 1 · Test Files 1 failed / 418 passed / 3 skipped (422) · Tests 1 failed / 3491 passed / 36 skipped (3528) · failure: test/permission-set-clone-door.dogfood.test.ts 'a platform set ... copies into its shipping package's pair' (clone of member_default answers 422 INVALID_METADATA: grants on sys_comment not defined in objects). Control leg: all 19 package source files of this diff restored to origin/main, five packages force-rebuilt, same file: same failure (1 failed / 10 passed); restored to HEAD (git diff HEAD empty) and rebuilt. Red is on main, not this diff; the grant came in with 490d136f2 (#30222).",
      "line_budget": "31 files, +84 / -176 (vs origin/main merge base); far under the 3000-line class (c) threshold",
      "deviations": [
        "The order asked for a changeset FROM -> TO line naming each removed key; check-adr-0087-registration's runtime-export-retired category requires the FROM block to name exactly the marker's operands, so the FROM line names featureFlagsSettingsManifest only and the four keys are listed in a 'Removed keys' bullet as 'removed; each had no effect'.",
        "Changeset bumps service-settings and platform-objects only; the comment-only edits in mcp, plugin-security and service-datasource and the cli README line publish no behaviour change.",
        "Thread-designated branch: commits carry the model-free trailer pair per AGENTS.md, not the harness's model-named trailer.",
        "Full dogfood owed by the (narrowing) arm ran red on one test that is red on main (control leg above); not fixed here, outside the surface."
      ],
      "files_changed": [
        ".changeset/30204-feature-flags-namespace-removed.md",
        "content/docs/protocol/kernel/config-resolution.mdx",
        "content/docs/ui/apps.mdx",
        "docs/qa/platform-checklist/areas/platform-core.json",
        "packages/cli/README.md",
        "packages/mcp/src/connect-ui.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.source-hashes.ts",
        "packages/platform-objects/src/apps/translations/es-ES.ts",
        "packages/platform-objects/src/apps/translations/ja-JP.source-hashes.ts",
        "packages/platform-objects/src/apps/translations/ja-JP.ts",
        "packages/platform-objects/src/apps/translations/zh-CN.source-hashes.ts",
        "packages/platform-objects/src/apps/translations/zh-CN.ts",
        "packages/plugins/plugin-security/src/objects/default-permission-sets.ts",
        "packages/services/service-datasource/src/admin-routes.ts",
        "packages/services/service-settings/README.md",
        "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-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-service-plugin.ts",
        "packages/services/service-settings/src/settings-service.test.ts",
        "packages/services/service-settings/src/settings-visibility-declaration.pin.test.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/settings-translation-coverage.test.ts",
        "packages/services/service-settings/src/translations/zh-CN.ts"
      ],
      "mcp_calls": "3 — mcp__github__issue_read (get, get_comments x2); no write tool",
      "api_writes": "2 — relay pr_create (PR #30272, fw-20261105T042706Z-24ef8d, read-back identical 10974 bytes); this comment via post-stamped",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "class: a · reach: public door POST permission-set clone of member_default on a booted showcase answers 422 INVALID_METADATA (grants on object sys_comment which is not defined in objects) · evidence: packages/qa/dogfood/test/permission-set-clone-door.dogfood.test.ts:238 red on 1d8e7702a and on the same tree with this diff reverted; sys_comment/sys_activity grants added to member_default by 490d136f2 (#30222) · carrier: #30108 (seat 2) · dedupe words: member_default clone sys_comment not defined, permission-set clone door 422, lock-and-clone platform set",
        "carrier: seat 5 · noted, not filed: skills/objectstack-platform/references/plugin-development.md:354 names the feature_flags manifest as the home of org toggles (Skills-docs follow-up)",
        "carrier: docs.objectos.ai · noted, not filed: that repo documents FEATURE_FLAGS_AI_ENABLED, now false",
        "carrier: none · noted, not filed: docs/adr/0007 keeps feature_flags.ai_enabled as its worked example (ADR, outside surface)"
      ]
    }

    Report taken 2026-11-05T04:28Z.

  4. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-bill · session_01Utp6CYVV6fcAQrNTDQRvPb

    Seat ACCEPT on PR #30272 at head 74c2ef82 (contract review delta PASS 6650443923) · pr_ready + automerge_enable sent 2026-11-05T05:24Z. Fixes #30204 closes this card at merge. Follow-ups: #30275 (skills), #30282 (spec + ui text).

  5. objectstack-fleet commented on Nov 5, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:server#5 · os-bill · session_01Utp6CYVV6fcAQrNTDQRvPb

    Landed · 2026-11-05T05:48Z

    PR #30272 merged (977be3806); this card closed by Fixes #30204. The four feature_flags toggles, the then-empty namespace, its Setup entry and the featureFlagsSettingsManifest export are removed (ADR-0049 enforce-or-remove); stored values and OS_FEATURE_FLAGS_* are inert. Contract review delta PASS 6650443923; seat ACCEPT 6650456016. Follow-ups: #30275 (skills), #30282 (spec + ui text).

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

Metadata

Metadata

Assignees

Labels

bugSomething isn't workingdomain:serverDomain lane — seat card indexed by label:pm:seatpm:dispatchedpriority:p2Medium: important, M3

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions