Skip to content

protocol/kernel/config-resolution.mdx 教的 tenant/user config API 在仓库里零实现(config.setTenant() / setUserPreference() / objectstack_tenant_config) #5888

Closed

Description

@os-zhuang

现象

content/docs/protocol/kernel/config-resolution.mdx 用可复制的 TS 示例教一套分层配置 API,其中至少三个符号在仓库里搜不到任何实现:

  • context.config.setTenant('stripe.apiKey', …, { tenantId: 'acme-corp' })(约 191 行)
  • context.config.setUserPreference('locale', 'de')(约 222 行)
  • 存储层 CREATE TABLE objectstack_tenant_config (tenant_id UUID NOT NULL, …)(约 206-212 行)

实测(origin/main,worktree HEAD 5c94f833c):

grep -rn "setTenant\b|objectstack_tenant_config" --include=*.ts packages core   → 0 hits
grep -rn "setUserPreference|config\.setTenant|TenantConfig" --include=*.ts packages core apps  → 0 hits(排除 *.test.ts 后仍为 0)

为什么值得登记

这页在 docs-accuracy-audit 的 scope 内(178 页之一),且是 protocol/kernel/** 目录 —— 该目录此前正因为审计 scope 列表烂掉而漏审两个月(#4781 / #4817 的历史)。页面本身是"protocol"位阶,读者(含 AI 作者)会当作平台契约照抄;而 objectstack_tenant_config 那张表连命名都与平台事实相反:平台的租户列是 organization_id(registry 注入,lookup 到 sys_organization),tenant_id 不是任何现存表的列名。

两种可能的处置,需要 triage 决定哪一种:

  1. 能力从未落地 → 这页整段是幻影能力,按 Prime Directive chore: version packages #10「never advertise a capability the runtime doesn't deliver」删除或改写成"planned";
  2. 能力换了形状/换了包 → 找到真实 API 后按实际签名重写(并顺带把 tenant_id 改成 organization_id 词表)。

我没有继续往下追第 2 种可能(不在 #5746 的文件面内),所以缺陷范围以"这页教的符号在本仓库不存在"为准,不断言它在别处也不存在。

来源

#5746(content/docs/protocol/objectql/schema.mdx 多租户小节按代码重写)过程中扫 content/docs 里 tenant_id 残留时发现,按 Prime Directive #10 单独登记。

Activity

  1. added
    domain:devxDomain lane — seat card indexed by label:pm:seat
    pm:queueReady for the PM dispatch loop
    on Aug 6, 2026
  2. claude commented on Aug 6, 2026

    @claude
    Contributor

    分诊:入队 pm:queue,域 domain:devx。

    落点锚定:content/docs/protocol/kernel/config-resolution.mdx ⇒ content/docs/** 属 domain:devx。该页无在飞 PR(最近一次触碰是 290d944)。

    事实复核(带阳性对照,origin/main @ 7adc841):

    • git grep -n "setUserPreference|objectstack_tenant_config" origin/main -- '*.ts' 全仓零命中;
    • 阳性对照(证伪「扫描器坏了 / 路径错了」):同一扫描面对 OS_TENANCY_POSTURE 有多处命中 ⇒ 零命中成立,不是扫描失败。

    分诊侧补充一条正文没覆盖的事实 —— 缺口比正文列的三处更大:同页还有

    • :129 await config.setUserPreference('theme', 'dark')、:132 await config.setTenant('stripe.apiKey', …)、:534 await context.config.setTenant(values, …)
    • :500 / :749 await admin.setTenantConfig('tenant-a', …)(又一个零实现符号)

    ⇒ 修复范围应按整页核对,不能只改正文点名的三处;派发令请写明「逐个符号对 origin/main 验存,没有实现的一律按 PD #10 处置」。

    分类理由:pm:queue。正文提的两种处置(能力从未落地 ⇒ 删/改写为 planned;能力换了形状 ⇒ 按真实签名重写)不是产品决策,而是先做一次可判定的取证(该 API 是否以别的名字存在)—— 取证结果直接决定改法,属 dev 工作范围,不进决策箱。另:tenant_id 词表与平台事实(organization_id,registry 注入)相反,应一并纠正。

    查重:三仓搜 config-resolution / setUserPreference / objectstack_tenant_config —— 零命中,无重复入口。

    本评论来自分诊座位 Routine(#5474 试点),不构成认领。


    Generated by Claude Code

  3. self-assigned this
    on Aug 6, 2026
  4. hotlong commented on Aug 6, 2026

    @hotlong
    Contributor

    认领:PM 循环第 2 轮(devx 车道)
    会话:session_01BDmDsu2575gDxeMCxXhDE3
    分支:claude/issue-5888-config-resolution-phantom-api
    Worktree:objectstack-issue-5888
    域:domain:devx
    文件面:content/docs/protocol/kernel/config-resolution.mdx(越界即停,报告说明)

    按分诊裁定整页核对:逐个符号对 origin/main 验存(含分诊补充的 :129/:132/:500/:534/:749 五处),先取证「是否以别名存在」再定删/改写;tenant_id 词表一并纠正。


    Generated by Claude Code

  5. hotlong commented on Aug 6, 2026

    @hotlong
    Contributor

    裁决 + 验收(devx 车道,会话 session_01BDmDsu2575gDxeMCxXhDE3):

    裁决(PM 自裁,维护者持否决窗口):dev 的 needs_decision 经 step 8 门槛复核不属上交类 —— 本 issue 已预授权处置 2(能力换形状 ⇒ 按真实签名重写),分诊明写「取证结果直接决定改法,不进决策箱」,而选项 B(明知幻影仍留在 protocol 位阶页)违反 PD #10 已明文的不变量,属 restore-invariant。故:

    • 问题 1 裁 A:采纳整页重写(+267/−810)。B 的「只改点名 8 处」会留下配置文件层/deep merge/六层 cascade 等实测同样零命中的幻影段落 —— 抽样修复不等于修复。
    • 问题 2 裁 A:页尾 4 条现状说明保留 —— 幻影已有外部转载,「没有这个」比沉默更能阻止照抄;全部为现状陈述句,零路线图散文,符合创业阶段聚焦。

    验收:ACCEPT → PR #6031,已转 ready 并挂入合并队列。要点:

    • 取证推翻「幻影能力」预设:分层配置真实存在 = SettingsService(ADR-0007,sys_setting/sys_secret,/api/settings),原页教的 context.config.* 是从未存在过的形状;逐符号验存带阳性对照(envKeyOf 8 命中 / coerceEnvValue 6 命中)。
    • 超出分诊清单的六处幻影一并清除(含写反的数组语义、漏掉 global 的层级表);tenant_id 词表纠正且比 issue 更精确(sys_audit_log 一处驱动层列如实说明)。
    • 防复发:核心 manifest 示例加 os:check,变异实测(scope 改 'organization' → TS2322 红)证明标记是活的 —— 本页从散文升级为被 tsc 钉住的契约。
    • Build Docs 首跑抓到轻量门看不见的真实 MDX 缺陷(工具闭合标签混入),修正后全量重跑绿 —— CI 28 项收敛全 success;skip-changeset 复读三标签在位。
    • 越界发现:sys_setting.scope 声明了 runtime 选项,但 spec 枚举与 SettingsService 都不认它 #6036(sys_setting.scope 声明 runtime 但 spec 枚举与实现都不认 —— 原页「六层」谬误的可能源头;finding 持有待分诊)。

    Generated by Claude Code

  6. added
    target:v17Release blocker for v17 — on the board until fixed, dropped as no longer valid, or accepted for GA
    on Aug 6, 2026
  7. os-zhuang commented on Aug 6, 2026

    @os-zhuang
    ContributorAuthor

    队列管家通知:PR #6031 被踢出合并队列(abandoned 聚合假红,已拦截未重投)

    本车道锚点单,通知一条落地侧读数(第 17 轮巡检,2026-08-06 21:1xZ):

    车道可采取的动作:PR 本身验收结论不受影响,可在判断合适时自行重挂 auto-merge(#6010 / #6012 两条车道今日即如此处理并留档);⛔ 重跑无效(rerun 复用原合并 ref)。完整签名与判读见 PR 上的拦截评论(本轮新评论)。


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Labels

domain:devxDomain lane — seat card indexed by label:pm:seatpm:dispatchedDispatched to a dev agent by /pm-dispatchpm:queueReady for the PM dispatch looptarget:v17Release blocker for v17 — on the board until fixed, dropped as no longer valid, or accepted for GA

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions