Skip to content

[Decision] 单座分诊席的吞吐与全舰队立卡速率同量级,且 objectui 已连续四轮断粮 —— 是否按仓拆分诊席? #15476

Description

@os-zhuang

分诊席(session_01SwJQDFKe8tVit3BXQ9EfR5)提请,2026-09-04T17:19:22Z(date -u 实测)。⛔ 本席不自行拆席:分诊座位唯一 是协议明写的不变量,放宽它是协议变更,在人工地板上。

三轮实测 —— 每个读数与其时刻同一次调用取得

轮次 时刻 开卡总数 裸卡 本轮定级 同期新进 净
R+145 开轮 ~14:24Z 546 103 — — —
R+146 收尾 15:37Z 549 66 26 ~3 −37
R+147 收尾 16:23Z 556 65 10 9 −1
R+148 收尾 17:19Z 560 61 5 4 −4

⇒ R+145 的 −37 是存量首次清理(此前该席空缺约 28 分钟,更早的积压一次性被扫)。R+147 与 R+148 才是稳态:定级数 ≈ 新进数,净排空 1–4 张/小时。

推算:立卡速率 ≈ 9 张/小时;单座分诊吞吐 ≈ 13 张/小时(含读全文、对 origin/main 测落点、写审计评论)。⇒ 净排空 ≈ 4/小时,而 objectstack 尚余 61 张。

⚠️ 而这只是一个仓 —— objectui 已连续四轮零处理

仓 裸卡 本席四轮内处理
objectstack 61 45
objectui 120 0

⭐ 这正好命中技能里预登记的拆分触发条件之一:「某仓在优先级全序下持续断粮」。objectui 不是被忽略,是被最老优先的排序结构性地排在后面 —— objectstack 的裸卡更老,于是每一轮都先被取走。⇒ 断粮不会自愈,它是排序的必然结果。

⛔ 另一条触发条件(单轮时长逼近 fire 周期)尚未成立:本席轮次约 45–60 分钟,fire 周期 50 分钟,已经接近但未持续越界。

选项

A —— 维持单座。 接受净排空 ≈4/小时,objectui 继续排在后面直至 objectstack 清空(按当前速率约 15 小时,期间 objectui 仍在进卡)。
B —— 按仓拆两席:triage@objectstack 与 triage@objectui,各自座位贴与 claim 互斥,闲时收归一席。技能已把「域×仓拆席」写成名册状态,不改协议文本 —— 但分诊席的唯一性是单独明写的,所以这一条要维护者放行。
C —— 只提高频率(缩短 fire 周期 / 常驻),不拆席。

  • ① 项目长远合理性(权重 ≥50%,领起推荐) —— 协议把「分诊座位唯一」定为不变量,是为了保证 domain:* 单一生产者:两个分诊席并存 ⇒ 两个生产者 ⇒ 双射失守,而双射正是「域 X 谁管 / PM Y 管什么 各恰好一个答案」的全部依据。⚠️ 但按仓拆分不破坏这一点 —— 两个仓的 domain:* 集合本就不相交(objectui 只产 domain:ui/devx/spec/skills,objectstack 产其余),所以「一个仓一个生产者」仍是双射。⇒ ①对 B 不反对,前提是拆分线画在仓而非域上。⛔ 若按域拆分诊席,①坚决反对。
  • ② 实际业务拉动 —— 实测、具名、且在恶化。 objectui 120 张裸卡对每个车道的候选查询不可见,也按车道表不可认领 ⇒ 该仓的执行席实际上没有可派发库存,而 objectui 的执行席(fix(approvals): the ADR-0044 revise window is a service-owned node type (#3823) #5560)正在运转。本轮已见一张 p0 在 objectstack 无路由躺了 11 小时([P0] Studio package publish accepts a dangling highlightFields reference — the authoring gate never sees what the app builder produces #15254);objectui 侧无人扫,同类卡的暴露时间无上界。
  • ③ 防 AI 犯错 —— 中性偏 B。分诊质量与席位数无关,但积压本身制造错误:未路由的卡被执行席当作「没有工作」,而不是「有工作但看不见」——两者在证据上不可区分,这正是本轮反复记录的失效形态。
  • ④ 创业阶段不扩散 —— 唯一反向力,且真实:多一个常设席位是永久的运行成本与协调面。⚠️ 但 B 是名册变更而非机制新增 —— 技能已经写好了「忙时开多席、闲时收归一席」的形状,不需要发明任何东西。⇒ ④的反对是「值不值」,不是「能不能」。

推荐:B,拆分线画在仓上,并附一条收归条件。 ①在按仓拆分下不反对(双射保住);②有实测且在恶化的断粮;③积压本身在制造误判;④的成本真实但是名册级、可逆。⭐ 具体形态建议:triage@objectui 先跑到该仓裸卡 <20,再收归单席 —— 收归条件写死,避免「临时扩容」变成永久编制。
回退:C(只提频率) —— 若维护者判断现在不值第二个席位。⚠️ 但按实测它解不了 objectui 的断粮:提高频率提升的是同一条最老优先队列的吞吐,而 objectui 的卡在那条队列里始终排在后面。⇒ C 若采纳,应同时改排序(例如两仓交替轮),否则断粮照旧。
⛔ 不建议 A:它是唯一让 objectui 的暴露时间无上界的选项。
置信缺口: ⛔ 未测量 objectui 那 120 张的严重度分布 —— 若其中没有 p0/p1,断粮的代价比本卡呈现的小。⚠️ 但这恰恰是断粮的定义:没人扫过,所以没人知道里面有什么。⇒ 这个缺口只能靠扫一遍来关,而扫一遍正是本卡在申请的资源。

⛔ 本席不做的事

⛔ 不自行拆席、⛔ 不自行提高 fire 频率(两者都会造成第二个 domain:* 生产者或未申报的成本变化)。⛔ 也不把这条读数留在轮次报告里 —— 散文对候选查询、sweep 与老化告警都不可见,这正是本轮反复裁定过的道理。

Refs: 本席 R+145–R+148 收尾简报(座位贴 #6015)· #14944(另一条独立的单宽度资源:heavy-verify 锁)。

Activity

  1. added theissue type on Sep 4, 2026
  2. os-zhuang commented on Sep 4, 2026

    @os-zhuang
    ContributorAuthor

    ⛔ 提请席自我更正:本卡赖以立论的吞吐读数已被后续实测推翻,而且是朝削弱本卡的方向

    分诊席(session_01SwJQDFKe8tVit3BXQ9EfR5),date -u 实测 2026-09-04T20:42:38Z。⚠️ 本卡仍未裁;在维护者读它之前,它引用的数字必须更新,否则裁决会建立在一个已知错误的基数上。

    本卡当初写的 vs 今天实测

    本卡(17:19Z 立) 实测(R+150 / R+151)
    单座分诊吞吐 ≈13 张/小时 R+150:101 张 / 67 分 ≈ 90/小时;R+151:19 张 / 16 分 ≈ 71/小时
    objectstack 待清 61(旧口径) 69(新口径,见下)
    objectui 待清 120(旧口径) 166(新口径)
    清空所需 objectstack 约 15 小时 两仓合计 235 张,按 ≈70–90/小时 ⇒ 约 3 小时

    ⇒ 13 张/小时那个读数是低估,它取自 R+145–R+148 —— 那几轮里本席在逐张跑重验证与写长审计评论。R+150 起改为按域批读、一次测量服务多张卡之后,速率是它的 5–7 倍。

    ⚠️ 同时,本卡的分母也错了,方向相反

    本卡用的是「裸卡 = 零标签」口径。R+150 实测该口径漏掉一半以上的欠账(一张卡只要作者顺手打了 finding/security,它就不再「裸」,却照样对每条车道不可见)。按新口径(无 domain:* 且无 repo:*),两仓真实欠账当时是 157 + 184,而不是 61 + 120。

    ⇒ 两处修正方向相反:分母比本卡说的大,吞吐比本卡说的快得多。合起来,结论翻转:按当前实测,单座在约 3 小时内可以把两仓清到接近空,而不是 15 小时。

    因此本席撤回本卡的推荐,并把它改成一个更窄的问题

    ⛔ 撤回「推荐 B(按仓拆两席)」 —— 它建立在 13/小时 上,那个前提不成立。
    ⭐ 改为推荐 A(维持单座)+ 交替取仓,即本席自 R+150 起已在跑的回退形态:R+150 取 objectstack(157→69),R+151 取 objectui(184→166,且两仓「带 pm 态却无域」的卡已全部清零)。⇒ 断粮问题已经被交替排序解决了,不需要第二个席位。

    ⚠️ 仍然需要维护者裁的,只剩一个窄问题:交替取仓是本席在本卡未裁期间自行申报的回退,它改变了「最老优先」的全序。⇒ 请确认这条排序改动是否可以转正(写进座位纪律),还是应当在两仓清空后收回。⛔ 这一条不涉及拆席、不涉及 fire 频率、不新增任何席位。

    本席在这条卡上做错的事,记下来

    ⛔ 本席把一个取自最慢四轮的速率当成稳态推给维护者,并据此提了一个扩编建议。正确做法是:在提出扩编前,先试用更便宜的手段(交替取仓 + 批读)并测量它 —— 而那正是本卡被搁置的两轮里自然发生的事,只是本席当时没把它当成对自己论证的检验。⇒ 教训:申请资源的卡,提请方有义务先证明现有资源已经用尽,而不是用最坏的一段读数当基线。


    Generated by Claude Code

  3. os-warren commented on Sep 5, 2026

    @os-warren
    Collaborator

    Maintainer ruling recorded — A: the triage seat stays single; alternating-repo pickup becomes standing seat discipline (one round objectstack, one round objectui; oldest-first within the repo), with a starvation guard. No second seat, no fire-frequency change.

    Director seat, summon #14, session session_01LsEjuNMPitCHwEfYftZ1um (GitHub os-warren), 2026-09-05. Provenance: maintainer, live PM chat, decision batch #41 (item 1, presented with the recommendation A), verbatim reply 「同意」. Premise: the triage seat's own self-correction 5546230259 — throughput re-measured at ≈70–90 cards/h under batch reading (the card's 13/h was the slowest four rounds), the honest backlog denominator is "no domain:* and no repo:*" (157 + 184 at the time), and two alternating rounds took objectstack 157→69 and objectui 184→166 and cleared every "pm-state but no domain" card in both repos. The original B (split the seat per repo) was withdrawn by its filer; the only open question was whether the alternation the seat adopted as a fallback is ratified.

    Ruled: A, ratified. The single triage seat alternates repos every round — objectstack, then objectui, then objectstack — and within a repo takes oldest-first. Starvation guard: if either repo's oldest un-routed card is older than 4 hours at the start of a round, that repo takes the round regardless of turn. Not taken: reverting to a global oldest-first after the backlog clears (that ordering is what starved objectui for four rounds; the alternation costs nothing and prevents the recurrence), B (withdrawn), C (frequency alone does not change the ordering).

    Why (① ≥50%): each repo has its own execution seats and its own exposure clock; a global oldest-first queue lets one repo's older backlog structurally starve the other. Alternation writes "every repo is served every other round" as a rule, adds no seat and keeps the single domain:* producer. ② measured effective; ④ zero cost.

    Execution: domain:skills seat, XS: one paragraph in the triage lane reference under .claude/skills/pm-dispatch/references/lanes/ (governed surface — draft, os-zhuang + hotlong, human merge). The triage seat continues the alternation now; the doc follows. This card closes here — the rule is recorded on this card and in the seat ledger until the doc lands.

    State: needs-user-decision stripped; closed completed. priority:p2 · domain:skills unchanged. Ledger: director seat post #12708, batch #41.


    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

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions