Skip to content

docs(pm-dispatch): triage-duties — a measured fleet-velocity cost is a third tooling entry door; the p2/p3 not_planned rule takes only a card with none of the three - #23482

Merged
objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-23478-tooling-velocity-entry-door
Oct 14, 2026
Merged

objectstack-fleet[bot] merged 2 commits into
mainfrom
claude/issue-23478-tooling-velocity-entry-door

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 14, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #23478

Clause-②: no

The tooling entry bar in .claude/skills/pm-dispatch/references/triage-duties.md gains the third door the maintainer asked for: a measured cost to the fleet's development speed (a false red or a false green on correct sources, repeated re-runs, review rounds lost to one cause), with the instance named on the card. The lane-P0/P1 not_planned rule now takes only a tooling card that has none of the three doors. The execution seats' candidate query in references/execution-duties.md:10 names the same three doors, so a card admitted through the new door is one a seat can pick up (the seat's ruling A on the dev's open question, comment 6168685565 on the card, which amended the claim's file surface). Two files, text only; triage-duties.md still 120/120 lines, execution-duties.md still 183/183.

Authority

Filing gate ③, the maintainer's direct order in the triage seat's session, 2026-10-14, verbatim and in order:

  1. 「23470 ,导致误报红,会耽误车队开发啊,影响车队开发速度 的问题也是问题。」
  2. 「所以你的分诊规则是不是应该要立卡修改」

The rule is recorded on #6015 (comment 6167942500) and triage already applies it: #23470 was reopened at p2 (comment 6167908930) and #23156 at p2 (comment 6167924044). Both are the rule's live instances; this PR does not touch them. It puts the rule in the text every seat reads.

Every touched line, before and after

Line numbers are main at 1baf976cf9 → this head. The file is the same blob (4c7bbc5657) at the dispatch's reading 9063727487, so the card's :33/:34/:61 hold. Bytes are LC_ALL=C awk '{print length($0)}'.

  • :11 deleted (78 B), the payment, see below:
    「- 从不更新的卡不入窗;老化欠账归半状态巡查不归小时轮。」
  • :34 → :33 amended (106 → 117 B)
    • before: 「- tooling 入 pm:queue 仅当首行带 Unblocks: #N(open 产品卡)或点名所护的已发布面。」
    • after: 「- tooling 入 pm:queue 仅凭三门之一:首行带 Unblocks: #N(open 产品卡)或点名所护的已发布面;」
  • :34 added (113 B), the third door:
    「- 或实测拖慢车队开发:正确源上假红/假绿、反复重跑、同因丢复核轮;卡须具名实例。」
  • :60 amended (112 → 109 B)
    • before: 「- 「无则关」= 首触即关 not_planned,带理由与入队两条件,⛔ 不定 p3、不 hold;下行同此。」
    • after: 「- 「无则关」= 首触即关 not_planned,带理由与入队三门,⛔ 不定 p3、不 hold;下行同此。」
  • :61 amended (113 → 110 B)
    • before: 「- 所入车道队列 P0/P1 开着(= 未派发,在飞不算)时,无解锁对象的 p2/p3 tooling 卡同样关。」
    • after: 「- 所入车道队列 P0/P1 开着(= 未派发,在飞不算)时,三门皆无的 p2/p3 tooling 卡同样关。」

Why each:

  • :33: 「仅当」 becomes 「仅凭三门之一:」, which names the count so :60 and :61 can say 「三门」. Its full stop becomes ; so the sentence runs on into the new line, as :41→:42 and :91→:92 already do. Doors one and two are unchanged byte for byte, and 「首行带」 still governs both.
  • New :34: the third door. 「实测」 plus 「卡须具名实例」 is "measured, not asserted: the card names the instance", as tooling: check:type-check-debt's --re-measure runs a full workspace turbo build outside the shared verify lock, rewriting dist/ under a locked test run in the same tree (a false red) #23470 names its three re-runs. 「假红/假绿」 is the corpus's own spelling (reading-discipline.md:20, filing-gate.md:46-47, os-dev.md). No version number and no card number in it.
  • :60 was not among the three lines the card named. It is amended because it would read false otherwise: 「入队两条件」 are the two doors. The ruling that wrote the line calls them "the two reopen conditions from item 1": the Unblocks: line and the named surface. Left alone, it would hand every not_planned card two ways back in while the bar has three. Same file, same mechanism.
  • :61: 「无解锁对象的」 (no Unblocks: target) becomes 「三门皆无的」, so a card admitted through any door is not taken by it. Visible effect: it also stops taking a p2/p3 card admitted through door two (a named published surface) with no Unblocks: line, which the old wording did take. The card asks for exactly this: the rule applies "only [to] the cards that have none of the three doors". Shorter than before by 3 B.
  • :32 (「⛔ 工具/门禁修复不由此进」) is unchanged and still true. A tooling fix enters pm:queue only through a door, never through the defect definition.

The second commit: execution-duties.md:10, in place

  • :10 amended (119 → 119 B; 「两行皆无」 → 「三门皆无」, 12 B for 12 B)
    • before: 「- 候选 = open、未 assign、无 needs-user-decision、无 pm:retriage;⛔ 排除两行皆无的 tooling 卡。」
    • after: 「- 候选 = open、未 assign、无 needs-user-decision、无 pm:retriage;⛔ 排除三门皆无的 tooling 卡。」

Why: the query named the two doors the entry bar had, so a card admitted through the third door would reach pm:queue and still be dropped from every seat's candidates. SKILL.md:113 names this query as one of the label's three readers (候选查询排除). The seat ruled that the consumer line is this card's (comment 6168685565: a rule that admits a card no seat can pick up does not do what the maintainer said) and amended the claim's file surface to this one line. No other line of the file moves; the CEILINGS row is unchanged. This section and the line-budget row below were written by the seat: the dev's session ended on an API error after pushing commit 89cd6cb98e and before it could patch this body or post its report.

The payment: :11 restates :8

:8 reads 「两级盘点:小时轮以 since 窗口读增量,锚 = 座位贴上一份收班简报的时间戳。」 A since read returns only cards whose updated_at falls inside the window. So a never-updated card is outside it (:11's first clause), and old debt is not the hourly round's (:11's second clause). Two lines already say where old debt does land: :10, in this file (「每日一 fire 跑全仓全量对账」), and dispatch-runbook.md:17 (「机械年龄告警在半状态巡查脚本」). dispatch-runbook.md:70-71 spells the since read itself.

Two other candidates were measured and not used:

  • :59 (「清单项三态定级(…)与定级判据见 references/filing-gate.md。」): its parenthetical restates filing-gate.md:43-45. But it is this file's only pointer to that file's 〈定级判据〉 section: :40 names only the 〈立卡门〉 contents, and reading-discipline.md:13 names 〈读数判据〉. Deleting it would orphan the grading reader, so it is not a pure restatement.
  • :56 (the type no-backfill rule) is stated nowhere else. SKILL.md:118's 「⛔ 不回填存量」 is the area:* row's, not type's.

No script anchors on :11. A git grep of its two clauses over the repo hits only this file. The scripts that name triage-duties anchor elsewhere: label-write.mjs pins RECLAIM_AFTER_HOURS = 12 (:83), and check-half-states.mjs quotes :10 in prose. Both self-tests are green below.

Line budget

  • triage-duties.md: 120 → 120 lines. Ceiling 120, headroom 0; the CEILINGS row is unchanged.
  • execution-duties.md: 183 → 183 lines, one line amended in place (119 → 119 B). Ceiling 183, headroom 0; the CEILINGS row is unchanged.
  • Bytes: 12,176 → 12,216 (+40). Every line is at most 120 B.
  • Section bytes: the door costs +119 B over :33-:34 and :60-:61; the deleted :11 refunds 79 B.

What does not change, and the text does not read otherwise

Acceptance notes

  1. execution-duties.md:10 was raised by the dev's report as an open question (A: this PR, B: a separate card, C: leave it) and ruled A by the seat (comment 6168685565); it is the second commit above, no longer an open item.
  2. Outside this card's surface, measured, and not touched — scripts/pm/ensure-pm-labels.sh:278-297: two texts still describe two doors. One is the tooling label's description, "enters pm:queue only with Unblocks: or a named surface", at the 100-character label cap. The other is the comment naming the half-state reader: "a tooling card open in pm:queue with neither line is a half-state". scripts/** is outside this surface.

Gates

On the head 89cd6cb98e the evidence is the farm's: the check-runs read by the seat at landing (Lint & Repo Gates, which runs check:pm-skill-ratchet over both files, Lint · PM dispatch-gates, TypeScript Type Check and Governed Surface Queue Guard among them). The local battery below ran at 0c808f946e (the first commit); the second commit changed one line in place in a file the same ratchet and id-lint cover, and no local run was made on it — the dev's session ended before it could.

Local, at 0c808f946e

The list comes from node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: 19 commands. Each exit code was captured before any pipe.

  • 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/pm/check-harness-current.mjs --self-test: exit 0
  • pnpm --filter @objectstack/lint run check:doc-formula-expressions: the first run exited 3 (PREREQUISITE NOT MET: @objectstack/formula and @objectstack/lint were not built, so nothing was measured). Both were built under os-verify-lock.sh (VERDICT command-exit 0), and the re-run exited 0.
  • pnpm check:agent-test-spelling: 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:gitlink-declared: exit 0
  • pnpm check:nul-bytes: exit 0
  • pnpm check:pm-governed-merges: exit 0
  • pnpm check:pm-half-states: exit 0 (4916 self-test cases)
  • pnpm check:pm-label-write: exit 0 (134 cases; the RECLAIM_AFTER_HOURS text pin holds)
  • pnpm check:pm-skill-id-lint: exit 0 (87 files clean)
  • pnpm check:pm-skill-ratchet: exit 0. It reports triage-duties.md is 120 lines (ceiling 120; headroom 0).
  • pnpm check:refd-timer-probe: exit 0
  • pnpm check:skill-frame-sync: exit 0
  • pnpm check:watch-hint-literal: exit 0

The acceptance-named gates were also run individually:

  • pnpm -s check:pm-skill-ratchet: exit 0
  • node scripts/pm/check-skill-line-ratchet.mjs --self-test: exit 0 (157 cases)
  • pnpm check:pm-skill-id-lint: exit 0
  • pnpm check:pm-governed-prose: exit 0

Reconciliation: dispatch-gates.mjs --ran reports "19 derived, 19 run, 0 NOT-MEASURED, 0 UNRUN" (exit 0). The control-byte self-scan of the file found no match.

There was no ablation: the diff is prose, and no tested behaviour changed. The CI check-runs are for the seat to read on this head.

维护者速读(草稿)

改了什么:分诊规则里,工具卡(门禁、脚本、技能、席位协议)进开发队列,原来只有两扇门:写明它解锁哪张产品卡,或点名它保护哪个已发布面。现在加第三扇门:实测拖慢了车队开发,即正确的代码上误报红或误报绿、反复重跑、同一原因丢掉复核轮。卡上必须写出具体实例,不凭一句断言。另一条规则是「车道里有未派发的 P0/P1 时,p2/p3 工具卡一律关」,现在改为只关三扇门都没有的卡。

为什么改:您说「影响车队开发速度的问题也是问题」。按旧文本,23470 第一次分诊就被关了,23156 也一样。23470 是类型检查门禁在锁外重建,导致测试误报红;23156 是构建过文档的检出上,四个测试误报红。分诊席已按您的话把这两张重开;这次是把规则写进每个席位都读的文本。

风险与代价(含回滚):文件仍守 120 行上限,靠删一行重复表述付账。那行讲的是「since 窗口读不到从不更新的卡」,第 8 行与 dispatch-runbook 里已经说过。风险是进队的工具卡会多一些,所以第三扇门要求具名的实测实例。「新增门禁默认否」、dispatch-gates 冻结、只报告的仪器首触即关,三条都不变。执行席的候选查询(execution-duties.md 第 10 行)原来写「两行皆无的工具卡排除」,第三扇门进来的卡会被漏掉;席位裁定在同一 PR 里同步改为「三门皆无」(卡上评论 6168685565),第二个提交就是这一处。回滚:revert 这两个提交。

席位意见:

你要做的:不用动手。本 PR 只改 .claude/** 两个文件,由席位达档复核后落地。


Generated by Claude Code

…a third tooling entry door; the p2/p3 close takes only a card with none of the three

The tooling entry bar gains a third door beside Unblocks and a named
published surface: a measured cost to the fleet's development speed
(false red / false green on correct sources, repeated re-runs, review
rounds lost to one cause), with the instance named on the card. The
first-touch close carries the three doors, and the lane-P0/P1 close
takes only a tooling card that has none of them. Paid by deleting the
since-window restatement line, so the file stays at its ceiling.

Claude-Session: https://claude.ai/code/session_013zGKMG1cRedVzWtqGGGZW9
Co-authored-by: Claude <noreply@anthropic.com>
…tooling card with none of the three entry doors

The execution seat's candidate query named the two doors the triage
entry bar had ("two lines"), so a card admitted through the third door
(a measured fleet-velocity cost) would reach pm:queue and still be
dropped from every seat's candidates. The query now names the same
three doors. In place, 12 B for 12 B; the file stays 183 lines.

Claude-Session: https://claude.ai/code/session_013zGKMG1cRedVzWtqGGGZW9
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/s and removed size/xs labels Oct 14, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: 89cd6cb98eb6e0e1fc397b282835d2cf16c3126c
Local-runs: none

Reviewed in seat by the dispatching skills seat (served tier read from get_session last_served_model this fire, equal to the constant's value), on the PR diff (two files, +5/−5, two commits on 1baf976cf9; check-governed-merges: .claude/** ×2 governed, Tier S), card #23478 (filing gate ③ — the maintainer's two sentences, quoted on the card and in the PR body; the triage seat's rule record 6167942500 on #6015 and its two applications 6167908930 / 6167924044; the seat's claim 6168105529 and its amendment 6168685565 ruling the dev's open question A), the dev's report 6168549532 (first head 0c808f946e), both files as they stand on the head (read raw: triage-duties.md 120 lines, execution-duties.md 183 lines), their homes on main (dispatch-runbook.md:17, triage-duties.md L8/L10, SKILL.md:113, instrument-discipline.md:8,10) and the head's check-runs. The governed face is the triage seat's entry bar and the execution seats' candidate query — the texts that decide which tooling cards reach a dev; the judgment is whether the third door says what the maintainer ordered, whether the two consumers of the bar (L60–61 and execution-duties.md:10) now read the same three doors, and whether the one line paid with was a restatement. Written 2026-10-14T13:21Z. This PR is Fixes #23478.

① Derived judgments

② Semver level

None owed: .claude/** ships in no package; skip-changeset on the PR is correct.

③ Boundary flags

  • Seat flag — the dev's session ended on a platform API error (an organisation-side 403 on the subagent's model, not a refusal of any action) after pushing commit 89cd6cb98e and before patching the PR body or posting the second report. The seat patched the PR body through the relay (issue_patch, read back byte-identical): the second commit's before/after, its line-budget row, the ruling's citation, and the 维护者速读 sentence; the local gate battery in the body is the dev's run on 0c808f946e, and the head's evidence is the farm's check-runs (Lint & Repo Gates runs the ratchet and id-lint over both files). Disclosed here and in the seat record; no code or repo file was written by the seat.
  • Dev flag — L60 amended beyond the card's three named lines (above). Accepted as required by the change.
  • Dev flag — the door line differs from the seat's guide spelling (the seat's 「须具名实例,不凭断言」 measured 127 B; the landed 113 B carries 「实测」 and 「卡须具名实例」). Accepted — the seat's spelling was a budget, not a dictate.
  • Dev flag — branch cut from origin/main 1baf976cf9 rather than the dispatch's 9063727487; both files the same blobs at both. Accepted.
  • Dev flag — AGENTS.md's model-free trailers on both commits and the single session-URL footer on the body. Accepted.
  • Observation (dev; carrier: this seat, noted on the PR and the card, not filed): scripts/pm/ensure-pm-labels.sh:278–297 — the tooling label's GitHub description ("enters pm:queue only with Unblocks: or a named surface", at the 100-character cap) and the comment beside it still describe two doors. scripts/**, no door of its own today; it rides the next tooling card that touches the label script, or the maintainer's word.
  • open_questions: none (the one asked was ruled, 6168685565, veto window to triage and the maintainer still open until the merge).

Implemented-by: claude/issue-23478-tooling-velocity-entry-door
Reviewed-by: session_013zGKMG1cRedVzWtqGGGZW9

VERDICT: PASS


Generated by Claude Code

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

席位核对 · PR #23482 at 89cd6cb98e (Fixes #23478) — Tier S, landing by the seat; the card closes at the merge

Skills seat 1 (session_013zGKMG1cRedVzWtqGGGZW9, huangyiirene), written 2026-10-14T13:21Z. Report 6168549532 (first head) read; the second head has no dev report — the dev's session ended on a platform API error after the push — so everything below is verified on GitHub and the tree, not on a report.

  1. 形态: draft PR against main; line 1 Fixes #23478 is the body's only closing keyword (tooling: check:type-check-debt's --re-measure runs a full workspace turbo build outside the shared verify lock, rewriting dist/ under a locked test run in the same tree (a false red) #23470, spec tests: four repo-project tree walks read the gitignored content/docs/protocol-upgrade/ that the docs build writes, so a checkout that has built the docs runs them red on the generated 18.md #23156, finding(pm,objectui): objectui's check-changeset-no-major.mjs has no LEVEL axis, so a Clause-②: yes PR with a patch changeset passes objectui CI #23239, finding(pm): dispatch-gates.mjs derives gates only for its own tree, so objectui-lane dispatches hand-derive their gate list, and this shift's list missed the CI Type Check pre-tsc battery #23240, finding(pm): lanes/ui.md lets the ui seat claim a Spec Main Shape Gate red on main as a stop-bleed, while objectui's workflow header makes that red domain:devx's main-red, so the two texts name different owners #23241, [PM seat] triage (objectstack-wide) — 🟢 Routine · session_01AavokzJ5DndAwitDXvKy4U · trig_01NcnCtMS2tH46nUg1a5TaMJ (hourly) · state = body + the round records newer than it #6015, pm-dispatch filing-gate: codify the maintainer's protocol-first grading rule — every metadata-protocol change, and every REST/data door narrowing, is p1 + target:v18 in every lane #23431 are named with no closing verb); Clause-②: no at line start; two files, +5/−5, two commits on 1baf976cf9; skip-changeset (nothing published); check-governed-merges → .claude/** ×2 governed, Tier S; assignee huangyiirene; the body patched by the seat through the relay for the second commit (read back byte-identical), disclosed in the body itself and in the ## Contract review above.
  2. 前提实测: the maintainer's two sentences are on the card and the [PM seat] triage (objectstack-wide) — 🟢 Routine · session_01AavokzJ5DndAwitDXvKy4U · trig_01NcnCtMS2tH46nUg1a5TaMJ (hourly) · state = body + the round records newer than it #6015 record (6167942500) with its two applications (tooling: check:type-check-debt's --re-measure runs a full workspace turbo build outside the shared verify lock, rewriting dist/ under a locked test run in the same tree (a false red) #23470 6167908930, spec tests: four repo-project tree walks read the gitignored content/docs/protocol-upgrade/ that the docs build writes, so a checkout that has built the docs runs them red on the generated 18.md #23156 6167924044 — both p2, pm:dispatched in their lanes); both files read raw at the head: triage-duties.md 120 lines (L33 117 B, L34 113 B, L60 109 B, L61 110 B, old L11 gone), execution-duties.md 183 lines (L10 119 B, 「三门皆无」); the deleted line's homes (triage-duties.md L8/L10, dispatch-runbook.md:17) and the unchanged rules (instrument-discipline.md:8,10, L62, SKILL.md:113) re-read on main. Judged line by line in the ## Contract review PASS record above for this head.
  3. 门禁 check-runs: 34 runs on 89cd6cb98e, read 2026-10-14T13:17Z — by newest run per name 25 success, 9 skipped, none failing or in progress; Lint & Repo Gates (the ratchet reading 120/120 and 183/183, id-lint over both files), Lint · PM dispatch-gates, TypeScript Type Check and Governed Surface Queue Guard success; every skipped name is on the expected-skips roster (scripts/pm/check-expected-skips.mjs, read from source on main). The dev's local battery (19 derived families, exit 0, --ran 19/19, the acceptance-named gates and the two reader self-tests exit 0) ran on the first head 0c808f946e; the second commit (one line in place) has only the farm's evidence, which is these check-runs.
  4. 接受的偏差: L60 amended beyond the card's three named lines (it would read false otherwise); the door line's spelling differs from the seat's 127-B guide (113 B landed); branch cut from 1baf976cf9 (same blobs); the second commit's local gates were not run — the dev's session ended on an API error after the push; the PR body for that commit was written by the seat; AGENTS.md's model-free trailers.
  5. 范围外去向: the dev's open question (execution-duties.md:10) was ruled A by the seat (6168685565) and is the second commit — veto window to the filing seat (triage) and the maintainer open until the merge. scripts/pm/ensure-pm-labels.sh:278–297 (the tooling label's two-door description and comment) — carrier: this seat, noted on the PR and in the claim amendment, not filed (scripts/**, no door of its own).
  6. 落地条款: Tier S — PASS record on this head, every check green, roster-expected skips ⇒ the seat flips pr_ready, reads mergeable_state until it settles, then arms automerge_enable as a second relay stroke; MERGED is confirmed from the queue ref and origin/main; Fixes #23478 closes the card at the merge, then pm:dispatched leaves it with a probe-table landing comment and the card gets its ACCEPT → pointer to this record. From that merge a tooling card with a measured fleet-velocity cost enters pm:queue and every seat's candidate list. This is the seat's last landing of the shift: the maintainer's 「当前任务处理完,合并后就下班」 — the seat signs off after the merge.

Generated by Claude Code

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/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

2 participants