Skip to content

docs(skills): drop the removed feature_flags settings manifest from plugin-development - #30726

Draft
objectstack-fleet[bot] wants to merge 2 commits into
mainfrom
claude/project-thread-c57y86
Draft

objectstack-fleet[bot] wants to merge 2 commits into
mainfrom
claude/project-thread-c57y86

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Requested by Elon · project thread
Fixes #30275
Clause-②: no
Metadata-protocol: none

维护者速读

  • 改了什么:objectstack-platform 技能包的插件开发参考页里,删掉「feature_flags 设置清单(ai_enabled / beta_*、OS_FEATURE_FLAGS_*)」这条,改成现行答案:插件需要组织级开关时,自己声明一份设置清单并注册到 settings 服务。
  • 为什么改:该命名空间已从设置服务移除,读它会被拒、那些环境变量不起作用;客户的 AI 照旧文档写代码或指导管理员会做无用功。
  • 风险与回滚:只改一条文档与一个 changeset,运行时零改动;回滚即 revert 本 PR。
  • 先看:① skills/objectstack-platform/references/plugin-development.md 的「Feature Flags」节第一条;② .changeset/30275-plugin-dev-feature-flags-bullet.md。
  • 两分钟验证:node scripts/check-skills-token-ratchet.mjs | grep plugin-development,预期 3125 tokens(上限 3137),且 git grep -n feature_flags -- skills/ 无输出。
  • 需要你做的:批准合并(skills/** 属 Tier H,需人合)。

What changes

  • skills/objectstack-platform/references/plugin-development.md, section "Feature Flags": the bullet teaching a feature_flags settings manifest (ai_enabled / beta_* toggles, env overrides via OS_FEATURE_FLAGS_*) is replaced by the live answer: there is no shared flags namespace; a plugin that needs an org toggle declares its own SettingsManifest and registers it on the settings service (ADR-0007 cascade). The next bullet (PUBLIC_AUTH_FEATURES, the deployment-level capability flags) is unchanged.
  • .changeset/30275-plugin-dev-feature-flags-bullet.md: '@objectstack/skills': patch, with both declaration lines.

Why

PR #30272 (#30204) removed the feature_flags namespace from @objectstack/service-settings. On origin/main badf24df, builtinSettingsManifests no longer lists it, and settings-service.test.ts pins getManifest('feature_flags') to SETTINGS_UNKNOWN_NAMESPACE with OS_FEATURE_FLAGS_AI_ENABLED set and inert. A customer agent reading the old bullet would write checks against a namespace that is refused, or tell an administrator to set an env var that does nothing.

The replacement is read off main code: SettingsManifest is re-exported from @objectstack/service-settings "so plugin authors only need one import" (src/index.ts), SettingsServicePlugin registers its service under 'settings' (settings-service-plugin.ts), and SettingsService.registerManifest(manifest) is a public method (settings-service.ts).

Tests

Docs-only change in the published skills bundle; no code or test changed.

Size readings (node scripts/check-skills-token-ratchet.mjs, both on this tree):

  • references/plugin-development.md: 359 → 358 lines, 3137 → 3125 tokens (ceiling 3137, unchanged).
  • Package objectstack-platform, all SKILL.md: unchanged (no SKILL.md touched).
  • Whole shipped bundle: 226234 → 226222 tokens.

Acceptance notes

Verification

Local gates on head 997decb3 (after merging origin/main): the 43 families node scripts/pm/dispatch-gates.mjs --commands derives from this diff, plus pnpm lint (exit 0). --ran reconciliation: 43 derived, 41 run green, 2 NOT MEASURED, 0 unrun.

NOT MEASURED (declared narrowing): check:dual-build-cjs-loads and check:lean-entry-closure exit 3 (prerequisite: built dist/ for every package). They judge build output, which a Markdown edit and a changeset cannot move; no whole-tree build was run for an S docs card, and CI runs them on a built tree.

Gate exit codes (head 997decb)
node scripts/check-adr-0087-registration.mjs --base origin/main :: exit 0
node scripts/check-adr-0087-registration.mjs --self-test :: exit 0
node scripts/check-changeset-no-major.mjs --base origin/main :: exit 0
node scripts/check-closing-keyword-parity.mjs :: exit 0
node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0
node scripts/check-comment-mask-corpus.mjs :: exit 0
node scripts/check-doc-route-spelling.mjs --advisory :: exit 0
node scripts/check-doc-route-spelling.mjs --self-test :: exit 0
node scripts/check-dts-emitted.mjs --self-test :: exit 0
node scripts/check-empty-changeset.mjs --base origin/main :: exit 0
node scripts/check-empty-changeset.mjs --self-test :: exit 0
node scripts/check-skills-token-ratchet.mjs :: exit 0
node scripts/check-skills-token-ratchet.mjs --self-test :: exit 0
node scripts/ci/assert-turbo-remote-cache.mjs --self-test :: exit 0
node scripts/ci/plan-test-core-shards.mjs --self-test :: exit 0
node scripts/ci/prune-turbo-cache.mjs --self-test :: exit 0
node scripts/pm/release-rehearsal-clone.mjs --self-test :: exit 0
node scripts/release-pending-publish.mjs --self-test :: exit 0
pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 0
pnpm --filter @objectstack/spec run check:skill-refs :: exit 0
pnpm check:agent-test-spelling :: exit 0
pnpm check:changeset-gate-self-tests :: exit 0
pnpm check:ci-filter-parity :: exit 0
pnpm check:closed-ceremony-text :: exit 0
pnpm check:corpus-claim-drift :: exit 0
pnpm check:cross-package-test-inputs :: exit 0
pnpm check:doc-authoring :: exit 0
pnpm check:driver-memory-census :: exit 0
pnpm check:dts-closure :: exit 0
pnpm check:dual-build-cjs-loads :: exit 3
pnpm check:gitlink-declared :: exit 0
pnpm check:lean-entry-closure :: exit 3
pnpm check:nul-bytes :: exit 0
pnpm check:pm-governed-merges :: exit 0
pnpm check:pm-skill-id-lint :: exit 0
pnpm check:published-files :: exit 0
pnpm check:refd-timer-probe :: exit 0
pnpm check:role-word :: exit 0
pnpm check:skill-compatibility :: exit 0
pnpm check:skill-frame-sync :: exit 0
pnpm check:skill-identifier-liveness :: exit 0
pnpm check:sourcemap-no-sources-content :: exit 0
pnpm check:watch-hint-literal :: exit 0
pnpm lint :: exit 0
Token ratchet (head 997decb)
check-skills-token-ratchet: skills/objectstack-platform/references/plugin-development.md is 3125 tokens (ceiling 3137; headroom 12).
check-skills-token-ratchet: 57 authored bundle file(s) within their ceilings; 10 generator-owned file(s) and 29 eval fixture(s) measured, not ratcheted.

Generated by Claude Code

…lugin-development

The objectstack-platform plugin-development reference still taught a
`feature_flags` settings manifest (`ai_enabled` / `beta_*`,
`OS_FEATURE_FLAGS_*`). service-settings no longer serves that namespace,
so the bullet now gives the live answer: a plugin that needs an org
toggle declares its own SettingsManifest and registers it on the
`settings` service.

Co-authored-by: Claude <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_016WV4d1cT65NsbTucMW55wZ
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface labels Nov 5, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · os-elon-musk · session_016WV4d1mkgEris4MHHLjtnk

Contract-review-claim: session_016WV4d1mkgEris4MHHLjtnk · head 997decb · 2026-11-05T23:38Z

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · os-elon-musk · session_016WV4d1mkgEris4MHHLjtnk

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 997decb3e4e1abd6f71533f246585e3497e2c31b
Local-runs: none
Scope: hits skills/objectstack-platform/references/plugin-development.md + .changeset/30275-plugin-dev-feature-flags-bullet.md; cited on origin/main: packages/services/service-settings/src/index.ts, src/settings-service.ts, src/settings-service-plugin.ts, src/settings-service.types.ts, src/settings-service.test.ts, src/manifests/index.ts, README.md, packages/spec/src/kernel/public-auth-features.ts, docs/adr/0007-settings-manifest-and-kv-store.md, packages/skills/package.json, skills/objectstack-platform/evals/config-plugins-ops.json, AGENTS.md

① Derived judgments

  • Net diff against current main (git diff origin/main...997decb3): exactly two files, +12/-3; git log origin/main..997decb3 is the one docs commit 677b6cb2 plus the merge 997decb3, and the merge carries nothing of its own (the three-dot diff is identical to the PR file list). Correct.
  • Removed claim: the feature_flags manifest / ai_enabled / beta_* / OS_FEATURE_FLAGS_* bullet (old L354-356). On main that namespace is gone: manifests/index.ts:4-16,29 lists no feature-flags manifest and no featureFlagsSettingsManifest export; settings-service.test.ts:44-60 pins getManifest('feature_flags') to { code: 'SETTINGS_UNKNOWN_NAMESPACE' } with OS_FEATURE_FLAGS_AI_ENABLED: 'true' in env and svc.get('feature_flags','ai_enabled') rejecting (env var inert). PR fix(service-settings)!: remove the Feature Flags page whose four toggles changed nothing #30272 (merged 2026-11-05T05:47Z) removed src/manifests/feature-flags.manifest.ts and the index.ts export. Removal is correct.
  • New claim "no shared flags namespace exists": true on main (manifests/index.ts:29 aggregate; settings-service.test.ts:51 asserts builtinSettingsManifests does not contain feature_flags).
  • New claim "declares its own SettingsManifest": SettingsManifest is a type re-export from @objectstack/service-settings "so plugin authors only need one import" (src/index.ts:179-182), source @objectstack/spec/system. Correct name.
  • New claim "registers it on the settings service": SettingsServicePlugin declares providesServices = ['settings'] (settings-service-plugin.ts:180) and calls ctx.registerService('settings', this.service) (:264); SettingsService.registerManifest(manifest: SettingsManifest): void is a public class method (settings-service.ts:1246) and is the documented plugin API (README.md:12,18: kernel.getService('settings') → registerManifest(manifest)). The reference page already teaches ctx.getService(...) (head L103, L240, L268), so the sentence is coherent with the page. Correct.
  • "(ADR-0007 cascade)": docs/adr/0007-settings-manifest-and-kv-store.md:77,98 documents the one-resolver env > tenant > user layering with env highest; the word "cascade" is the old bullet's wording kept, a fair paraphrase. Env override for a plugin's own manifest is generic: envKeyOf(namespace,key) → OS_${NAMESPACE}_${KEY} (settings-service.types.ts:643-646), used at settings-service.ts:1393, so the implied cascade holds for any registered namespace. The new text makes no OS_* claim of its own. Correct.
  • Neighbouring bullet (PUBLIC_AUTH_FEATURES, head L356-358) is byte-unchanged and still true: export const PUBLIC_AUTH_FEATURES at packages/spec/src/kernel/public-auth-features.ts:95, requiresFeature lowering documented at :30,304. The bullet's kernel/public-auth-features.ts path is a pre-existing short form of packages/spec/src/kernel/…, not touched by this PR.
  • Acceptance 1 met (bullet replaced with the live answer, deployment capability left to the next bullet). Acceptance 2: git grep -i 'feature_flags|OS_FEATURE_FLAGS|ai_enabled' over skills/ at head returns nothing (exit 1); the package's only eval skills/objectstack-platform/evals/config-plugins-ops.json does not mention them, and no eval in any package prompts for feature flags (grep flag|toggle over skills/*/evals/** hits only unrelated automation/UI evals). Acceptance 3: fix(service-settings)!: remove the Feature Flags page whose four toggles changed nothing #30272 is merged and head's text differs from main only by this hunk. Dev's "skills/** grep hits only that bullet" claim verified (on main: plugin-development.md:354,356 only).
  • Stale feature_flags mentions remain on main outside skills/** (docs/adr/0007…:230,334, docs/adr/0028…:227, docs/adr/0128…:55, content/docs/releases/v9.mdx:93) — outside this card's file surface (dispatch: skills/** only, ⛔ packages/**), ADRs are historical records; not a finding against this PR.

② Semver level

'@objectstack/skills': patch (.changeset/30275-plugin-dev-feature-flags-bullet.md:2), package exists at packages/skills/package.json. Docs-only edit to a shipped skills reference: patch is the correct level per AGENTS.md:1019-1020 (published package → patch, never skip-changeset). Changeset body carries line-initial Clause-②: no and Metadata-protocol: none (lines 7-8, verified with cat -A), consistent with the PR body (Fixes #30275 / Clause-②: no / Metadata-protocol: none, lines 3-5). Metadata-protocol: none re-derives correctly: nothing under packages/spec/** or any metadata-author-facing key changes. "Check Changeset" check-run: success.

③ Boundary flags

  • Dev deviation (relay pr_create HTTP 500 ×3 on 677b6cb2, then merged origin/main and retried → PR docs(skills): drop the removed feature_flags settings manifest from plugin-development #30726 on 997decb3): answered — the merge commit adds no content of its own (①, first bullet); judged on the net diff only.
  • Dev open_questions: none. NOT MEASURED check:dual-build-cjs-loads / check:lean-entry-closure (need built dist): acceptable narrowing for a Markdown + changeset diff; CI covers them.
  • File-surface pins respected: no SKILL.md, no packages/**, no evals/config-plugins-ops.json touched (PR file list: 2 files).
  • Token ratchet: dev reports 3137→3125 (ceiling 3137 unchanged), not re-run here (read-only); the diff is net −1 line / shorter text, so the ratchet cannot have moved up; Lint · docs & code guards will confirm.
  • PR author user.login = objectstack-fleet[bot]: no external author to name. PR is draft; skills/** is Tier H (AGENTS.md:271-275): landing waits on the maintainer.
  • Head check-runs at 2026-11-05T23:41Z: 0 failed; 9 still in_progress (Test Core 1/8 & 2/8, Lint ×3, Type Check ×4); all completed runs success or skipped. Clause ② of the landing gate ("all green") is not yet satisfiable — record stands, the landing seat must re-read check-runs before enqueue.

④ Design judgment

skills/objectstack-platform/references/plugin-development.md (hunk L354-355): the replacement teaches exactly what a customer agent must do — declare a SettingsManifest, register it on the settings service — using names that resolve on main (①), without inventing an OS_* promise, and leaves the deployment-capability case to the unchanged PUBLIC_AUTH_FEATURES bullet, matching card acceptance 1. The section header's framing ("live toggle surfaces are runtime configuration") still holds for both bullets. Token-negative. No must-fix.

.changeset/30275-plugin-dev-feature-flags-bullet.md: level, declarations and summary correct (②). No must-fix.

should-fix 1 (optional, not blocking): the bullet could name the entry point in one phrase (ctx.getService('settings').registerManifest(...)) so a reader need not infer the method from the service name; README.md:18 is the source. Headroom is 12 tokens, so only if it fits the ratchet.

Implemented-by: claude/project-thread-c57y86
Reviewed-by: session_016WV4d1mkgEris4MHHLjtnk

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

domain:skills#1 · os-elon-musk · session_016WV4d1mkgEris4MHHLjtnk

维护者速读

  • 改了什么:objectstack-platform 插件开发参考页删掉已不存在的 feature_flags 设置清单(ai_enabled / beta_* / OS_FEATURE_FLAGS_*),改成现行做法:插件需要组织级开关时,自己声明 SettingsManifest 并注册到 settings 服务。
  • 为什么改:PR fix(service-settings)!: remove the Feature Flags page whose four toggles changed nothing #30272 已删除该命名空间,getManifest('feature_flags') 现在会被拒;旧文本会让 AI 写出针对不存在命名空间的检查,或让管理员设一个无效的环境变量。
  • 风险与回滚:一处技能文档 + changeset,不动代码;回滚即 revert 本 PR。
  • 先看:skills/objectstack-platform/references/plugin-development.md 第 354–355 行。
  • 两分钟验证:git grep -i feature_flags -- skills/ 应为空。
  • 需要你做的:批准并合并(skills/** 为 Tier H)。契约复核 PASS 评论 6672499661,Head-sha 997decb3e4e1abd6f71533f246585e3497e2c31b。
  • 席位意见:可合。复核的可选建议(点名 registerManifest(...) 入口)没有做,不值得为它再推一次。

席位核对 — ACCEPT · head 997decb

  • 形态:2 文件 +12/−3(参考页一条 + 根 changeset '@objectstack/skills': patch);head 含一次合并 main(无冲突,不带自身内容)。governed skills/**(Tier H)。Fixes #30275,draft,目标 main,作者 objectstack-fleet[bot]。
  • 契约:Clause-② no,Metadata-protocol none,与认领 6671821447 一致。
  • 前提实测:dev 报告 6672413230;新句子的每个名字都对 service-settings 源码与 README 核过(复核记录 ①)。evals 无 feature_flags 提示,未改。
  • 门禁 check-runs:head 上 41 个,28 success,13 skipped,0 红。
  • 接受的偏差:无;token 3137→3125,上限未抬。
  • 范围外去向:docs/adr/** 与 content/docs/releases/v9.mdx 仍有历史提及,属历史记录,不立卡。
  • 落地条款:Tier H,等 governed 审批人批准;批准后席位经中继 pr_ready + automerge_enable,合并后核 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 已关、摘 pm:dispatched。

@objectstack-fleet objectstack-fleet Bot added the pm:awaiting-merge PR only: landing waits on the maintainer's own review and merge (SKILL.md 复核 ②); never on an issue label Nov 5, 2026
@os-zhuang
os-zhuang marked this pull request as ready for review November 6, 2026 01:44
@os-zhuang
os-zhuang enabled auto-merge November 6, 2026 01:44
@os-zhuang
os-zhuang added this pull request to the merge queue Nov 6, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to Branch Protection failures Nov 6, 2026
You're not authorized to push to this branch. Visit "About protected branches" for more information.
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Nov 6, 2026
@github-merge-queue
github-merge-queue Bot removed this pull request from the merge queue due to failed status checks Nov 6, 2026
@objectstack-fleet
objectstack-fleet Bot marked this pull request as draft November 6, 2026 02:32

This branch has not been deployed

No deployments
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 pm:awaiting-merge PR only: landing waits on the maintainer's own review and merge (SKILL.md 复核 ②); never on an issue size/s tooling Fix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

Projects

None yet

1 participant