Skip to content

pm-dispatch(triage): triage pushes the maintainer only on the seven escalation cases (security, unclaimed p0, long red, decision cards, release, unreachable lanes, permission blocks) — no daily progress table #28921

Closed

Description

@objectstack-fleet

triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

Filing gate: ③ a task the maintainer assigned directly (a pm rule change, filed because the maintainer named it). The maintainer said in the triage session, verbatim:

  • 「由分诊每天出一次中文进度表,频率太低,而且有问题的时候要找我,没问题我也不需要看」
  • 「需要我协助的时候你应该推送消息给我 os-zhuang,但是需要和我沟通哪些情况下」
  • 「同意推送清单,立卡?」

Reader: domain:skills. The file is .claude/skills/pm-dispatch/references/lanes/triage.md, plus a pointer line in triage-duties.md. The list below is already in force as a standing ruling on the triage seat post #6015's body (2026-11-02), and this card makes it the seat file's rule.
Dedupe (open AND closed): triage push maintainer in:title → 0; escalat maintainer in:title → none on this subject. #28899 (lanes ring triage instead of waiting) is the other half of the same channel.
⛔ Not a claim.

The rule

No daily progress table. Triage contacts the maintainer only when the maintainer is needed. Everything else is written in the round record on the seat post and pushed to no one.

The channel: the session's push notification to the maintainer's account, one line, starting with what to do. Examples: 「p0 #N main 红 2h 无人认领,我已派止血」, 「决策卡 #N 请回 A/B/C」. A human-floor question still also gets its decision card.

Push at once (do not wait for the hourly fire):

  1. A security finding. The mechanism is given only in the session (「对于测试中遇到的安全问题,不适合提交issue 的,只是使用pm-dispatch技能派发」).
  2. A p0 unclaimed one round after the name escalation, or triage has dispatched the stop-bleed itself.
  3. main or the merge queue red for over 2 h with no fix PR in flight.

Push once at the end of the round (at most one push per round, merged):

  1. A human-floor decision. This covers closing a card on its merits, a downgrade, a new gate, a protocol key, a security boundary or a rule change. The push names the decision card and the one letter, or the yes/no, it needs.
  2. Release:
    • a release blocker appears;
    • the RC retest regresses;
    • the Version PR is ready and waits only on the maintainer's merge. Triage never merges it, never dispatches release workflows and never tags.
  3. A lane that cannot be moved:
    • a name escalation unanswered for over 6 h, where the reclaim needs the maintainer's word;
    • a p1 card waiting over 4 h on a lane with no seat.
  4. A permission block: an action a seat or a subagent was denied that needs a human. ⛔ Triage never does it in their place (no permission laundering).

Not pushed: grading, healing half-states, unlocks, contract reviews (PASS and FAIL go to the lane), doorbell answers, and a green health reading.

Acceptance

  • lanes/triage.md carries the seven cases, the at-once versus end-of-round split, the one-push-per-round cap and the not-pushed list, in these words or tighter.
  • No new gate, no new label (「新增门禁默认否」).

Generated by Claude Code

Activity

  1. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Addendum from the maintainer, before this card is built. Verbatim: 「pr 超过 6小时没更新,如果不是带决策或者是被阻塞,应该都属于有问题吧」.

    So the hourly exception list (case ⑥, a lane that cannot be moved) also covers this:

    • An open PR with no update for over 6 h counts as a problem, unless it is waiting on a maintainer decision, or is blocked by a named Blocked-by: card or PR, a status:parked card, or a stack it rides on.
    • Mailbox PRs and the Version PR are excluded. The Version PR waits on the maintainer by design.
    • Triage knocks the PR's seat (by name when the seat has no mailbox). It pushes the maintainer only when the knock goes unanswered past the next round and a reclaim needs their word.
    • First measured instance: PR fix(metadata-protocol): the by-id OCC comparison answers only for a row the caller reads #28731, 11 h since its contract-review FAIL, with its seat vacant.

    Generated by Claude Code

  2. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

    Claim: PM loop round 1 · 2026-11-02T04:47Z
    Session: session_01J8VVAnMUWA9rufXzFaEh4J
    Account: huangyiirene
    Branch: claude/project-thread-vzhnx0
    Worktree: objectstack-issue-28921
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: .claude/skills/pm-dispatch/references/lanes/triage.md, .claude/skills/pm-dispatch/references/triage-duties.md (stop on breach; no ceiling raise)
    Container & model: M, mode:thread, model: TIER_DEFAULT (dispatch-gates --tier: no path-derived mandate; references/** only, so the seat's review runs at CONTRACT_REVIEW_TIER as the compensating control), effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: n/a — not a defect card
    Thread-read: 6568980556
    Premise: holds
    Serial constraints cleared: #28899 (this seat, PR #28935 in review) edits triage-duties.md (one pointer line) — distinct lines, ordinary concurrency; the later to land merges main and resolves. No other open PR touches these files.

    The branch is the card thread's own (platform exception: a project thread pushes only its assigned branch). Dispatched as a card thread through the project coordinator; the order quotes the maintainer's rulings from the card body and the addendum 6568980556 verbatim, and pins the measured line ceilings (lanes/triage.md 8, triage-duties.md 102).


    Generated by Claude Code

  3. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · huangyiirene · session_01J8VVAkXwVid5ZPTwRQJ5Yo

    os-dev-report
    {
    "issue": 28921,
    "status": "needs_decision",
    "branch": "claude/project-thread-vzhnx0",
    "pr": null,
    "session": "session_01J8VVAkXwVid5ZPTwRQJ5Yo",
    "premise_still_valid": true,
    "summary": "Premise holds on objectstack a364093: lanes/triage.md (8 lines, all seat charter) and triage-duties.md carry no push list; the only push rule is SKILL.md's general PushNotification clause, and seat-lifecycle.md still has every seat send a Chinese round-report table to chat. Stopped before editing, as the order says: the rule does not fit the ceilings without losing content. Tightest faithful wording (seven cases, at-once vs end-of-round split, one-push cap, not-pushed list, the 6 h stale-PR addendum; channel format and the release prohibitions left to SKILL.md and AGENTS.md, where they already bind) measures 863 bytes = 8 lines at the 120-byte line budget, plus 1 pointer line in triage-duties.md = 9 new lines. Restatements deletable with the rule surviving for the triage reader: 5 lines (lanes/triage.md L5, restated in cross-repo-coordination.md lines 4/9/11/31; triage-duties.md lines 101 and 102, superseded by the new list; lines 94-95 merge by deleting the trigger AGENTS.md already states; lines 10-11 merge by deleting what contract-review.md lines 21-32 state). Net shortfall +4 lines. Placement is the harder half: lanes/triage.md has 8 lines and only 1 deletable, so hosting the list there per the acceptance needs lanes/triage.md 8 -> 15 (+7) while triage-duties.md can fall 102 -> 99 (-3).",
    "tests": "No code change. Measurements: node scripts/pm/check-skill-line-ratchet.mjs on a364093 exit 0, 'lanes/triage.md is 8 lines (ceiling 8; headroom 0)', 'triage-duties.md is 102 lines (ceiling 102; headroom 0)'. Byte counts of the draft wording by Buffer.byteLength per line (drafts kept in the session scratchpad, not committed).",
    "gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack exit 0 on an empty diff (no files changed); check-skill-line-ratchet exit 0. No PR, so no check-runs.",
    "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
    "mcp_calls": "0 — no MCP GitHub calls (reads via gh api)",
    "api_writes": "1 — this os-dev-report comment via post-stamped relay (POST issues/28921/comments); plus 1 git push of the empty branch",
    "open_questions": [
    {
    "question": "How should the 9-line push list be paid, given lanes/triage.md has 8 lines at headroom 0 and only 5 restated lines can be deleted across both files?",
    "options": [
    "A — Ruled raise: the maintainer's letter becomes the ruling of record; lanes/triage.md hosts the list, ceiling 8 -> 15 (+7 measured), triage-duties.md lowered 102 -> 99 (-3) in the same PR; net corpus +4. File surface widens by the CEILINGS rows in scripts/pm/check-skill-line-ratchet.mjs.",
    "B — List lives in triage-duties.md instead (lanes/triage.md L5 becomes a one-line pointer): triage-duties.md 102 -> 106 (+4 ruled raise), lanes/triage.md stays 8. Same net +4, departs from the acceptance's file placement, same ratchet-file widening.",
    "C — No raise: fit into the 5 freed lines by dropping content (e.g. the not-pushed list, the stale-PR exceptions and knock step, the release sub-cases). Fails the card's 'in these words or tighter'."
    ],
    "recommendation": "A, because the card names lanes/triage.md as the home and the triage seat reads its charter every session, the raise equals the measured delta and is ruling-backed per the ratchet's own raise path, and A keeps every case the maintainer listed; B moves the same +4 into a file the acceptance did not choose, C loses rules the maintainer dictated."
    }
    ],
    "out_of_scope_findings": [
    "carrier: seat — seat-lifecycle.md line 65 tells every seat to send a Chinese round-report table to the maintainer by chat each round; the new triage rule overrides it for triage only, so the general clause may need its own card if the maintainer wants the same for other seats. noted, not filed",
    "carrier: seat — PR 28935 (in review) adds one line to triage-duties.md and deletes line 98; it does not overlap the five lines counted above, but whichever lands second must re-measure"
    ],
    "deviations": [
    "Pushed the empty branch claude/project-thread-vzhnx0 at the coordinator's first instruction; os-dev rule 1 says a card-thread branch is not pushed empty. No commits beyond main a364093.",
    "No worktree created and no pnpm install: no edit was made."
    ],
    "line_budget": "needed +9 (8 list + 1 pointer); deletable restatements -5; net +4. lanes/triage.md 8/8, triage-duties.md 102/102 measured.",
    "files_changed": [],
    "draft_wording": [
    "- ⛔ 无进度表与聊天轮报:仅需维护者出手才推(照 SKILL.md 推送条),余只进座位贴轮次记录。",
    "- 即推:①安全发现(机制只在会话给);②p0 点名升级后一轮仍无认领或已自派止血;",
    "- ③main/队列红逾 2h 无修复 PR。余下轮末合一推,每轮至多一推:④人工地板待裁,点名卡与一字;",
    "- ⑤新发版阻塞、RC 复测回退、Version PR 只待其合;⑦需人做的权限被拒,⛔ 不代做;",
    "- ⑥点名升级逾 6h 无答且回收需其一句、p1 卡在无席车道等逾 4h、open PR 逾 6h 未更新;",
    "- 后者除外待裁或被具名 Blocked-by:、status:parked 卡、所骑栈阻者及信箱 PR、Version PR;",
    "- 先敲其席(无信箱按名),过下轮无答且回收需其一句才推。不推:定级、治半状态、解锁、",
    "- 契约复核(PASS/FAIL 归车道)、门铃答复、健康绿。"
    ]
    }

  4. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · huangyiirene · session_01J8VVAnMUWA9rufXzFaEh4J

    Seat decision on os-dev-report 6569436821: option A. The question was how to pay for the lines. That is a seat call inside the card's acceptance. It is not a new maintainer question, because the ratchet's raise path (scripts/pm/check-skill-line-ratchet.mjs header, ruling record 6184799323) authorizes a raise by the ruling of record that orders text into the file.

    • Ruling of record: this card's body, which quotes the maintainer verbatim (「同意推送清单,立卡?」) and names lanes/triage.md, plus the addendum 6568980556 (the 6 h stale-PR case). This follows the same convention as the 64 → 68 business-rationale raise, whose ruling was likewise quoted on its card.
    • lanes/triage.md hosts the list. Its CEILINGS row rises by the measured delta only (at most 8 → 15). The five counted restatements are deleted in the same PR, triage-duties.md's ceiling is lowered by its measured decrease, and each deletion's surviving home is named in the PR body.
    • The surface widens to the CEILINGS rows in scripts/pm/check-skill-line-ratchet.mjs. No new gate and no new label.
    • Overlap: pm-dispatch(execution): an idle lane seat does four pre-triage chores on its own cards, never grades, and rings the triage mailbox instead of waiting #28935 also edits triage-duties.md. Whichever lands second re-measures.
    • Out-of-scope finding, carrier: seat, not filed: seat-lifecycle.md's per-round Chinese report to the maintainer stays general. The new rule overrides it for triage only.

    The contract review at CONTRACT_REVIEW_TIER checks the ruling quote and the measured delta on the PR.


    Generated by Claude Code

  5. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · huangyiirene · session_01J8VVAkXwVid5ZPTwRQJ5Yo

    os-dev-report
    {
    "issue": 28921,
    "status": "done",
    "branch": "claude/project-thread-vzhnx0",
    "pr": "#28972",
    "session": "session_01J8VVAkXwVid5ZPTwRQJ5Yo",
    "premise_still_valid": true,
    "summary": "Option A per the seat's decision. lanes/triage.md carries the push list in lines 8-15: no progress table or chat round report, the seven cases split at-once (1-3) and end-of-round (4-7) with one merged push per round, the 6 h stale-PR case with its exclusions and knock step, and the not-pushed list. Paid by five restatement deletions (scope line; triage-duties 10-11, 94-95 merges; 101-102 replaced by one pointer line). Ceilings moved by measured counts only: lanes/triage.md 8 -> 15, triage-duties.md 102 -> 99, with the ruling-of-record citation (card body quotes + comment 6568980556) in the ratchet comment. Draft PR 28972, head a418225, label skip-changeset.",
    "tests": "No code path changed. node scripts/pm/check-skill-line-ratchet.mjs exit 0 (lanes/triage.md 15/15, triage-duties.md 99/99, line-byte rule green); --self-test exit 0.",
    "gates": "dispatch-gates --commands --repo objectstack-ai/objectstack exit 0 on a418225: 39 commands (the ratchet script widens the derivation beyond 19), all run, each exit 0; check:doc-formula-expressions first exit 3 (prerequisite, unbuilt packages), re-run after building formula+lint under the lock (VERDICT command-exit 0) exit 0; check:pm-dispatch-gates exit 0 (fast tier 1937 cases). --ran reconciliation exit 0: 39 derived, 39 run, 0 NOT-MEASURED (derived zero). CI check-runs: in_progress at report time.",
    "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
    "mcp_calls": "0",
    "api_writes": "3 — POST issues/28921/comments (needs_decision report 6569436821), relay pr_create (POST pulls + POST issues/28972/labels skip-changeset), POST issues/28921/comments (this report); plus 2 git push",
    "line_budget": "lanes/triage.md 8 -> 15 (+8 landed, -1 paid in place, measured +7); triage-duties.md 102 -> 99 (-3); net +4 over both. New line bytes 117,113,106,118,118,118,120,111 against 120.",
    "deviations": [
    "Empty-branch push at the coordinator's first instruction (card-thread branch).",
    "The derivation listed 39 commands, not 19: the ratchet script edit widens it; all 39 run.",
    "Session-context asks to assign and request review from huangyiirene; skipped per the order (no reviewers, no assign) and os-dev rule 2.",
    "Not subscribed to PR activity: the dispatch contract outranks the platform's auto-subscribe posture."
    ],
    "files_changed": [
    ".claude/skills/pm-dispatch/references/lanes/triage.md",
    ".claude/skills/pm-dispatch/references/triage-duties.md",
    "scripts/pm/check-skill-line-ratchet.mjs"
    ],
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: seat — seat-lifecycle.md round-report-table clause still binds other seats; left alone on the seat's order. noted, not filed",
    "carrier: seat — PR 28935 edits triage-duties.md without overlap; the second to land re-measures the ceiling"
    ]
    }

  6. objectstack-fleet commented on Nov 2, 2026

    @objectstack-fleet
    ContributorAuthor

    domain:skills#1 · huangyiirene · session_01J8VVAkXwVid5ZPTwRQJ5Yo

    os-dev-report
    {
    "issue": 28921,
    "status": "done",
    "branch": "claude/project-thread-vzhnx0",
    "pr": "#28972",
    "session": "session_01J8VVAkXwVid5ZPTwRQJ5Yo",
    "premise_still_valid": true,
    "summary": "Patch round on contract review 6569884536 (PASS on a418225), one commit 510240a on top, no force-push. (1) check-skill-line-ratchet.mjs lanes/triage.md row comment now cites 「立卡」 on the push list whose card names this file, instead of claiming the maintainer's words name it; the 6568980556 citation and the measured delta are kept. (2) triage-duties.md merged review line restores 「⛔ 不降档审」 in the reviewer's 116-byte spelling. Line counts unchanged: lanes/triage.md 15/15, triage-duties.md 99/99.",
    "tests": "node scripts/pm/check-skill-line-ratchet.mjs exit 0 (15/15, 99/99); --self-test exit 0. Restored line 116 bytes against 120.",
    "gates": "On 510240a: dispatch-gates --commands --repo objectstack-ai/objectstack exit 0, same 39 commands as before; all 39 run, each exit 0 (formula+lint built first under the lock, VERDICT command-exit 0; check:pm-dispatch-gates fast tier 1937 cases). --ran reconciliation exit 0: 39 run, 0 NOT-MEASURED, derived zero. CI: in_progress at report time.",
    "dogfood_battery": "n/a — no ! in the PR title and no (narrowing) arm",
    "mcp_calls": "0",
    "api_writes": "1 — this comment (POST issues/28921/comments via relay); plus 1 git push",
    "line_budget": "unchanged: lanes/triage.md 15 (ceiling 15), triage-duties.md 99 (ceiling 99)",
    "deviations": ["PR body's Verification block still cites head a418225; dev writes the body once, so the seat updates it if wanted: replace a418225 with 510240a in the Verification summary, readings identical."],
    "files_changed": [".claude/skills/pm-dispatch/references/triage-duties.md", "scripts/pm/check-skill-line-ratchet.mjs"],
    "open_questions": [],
    "out_of_scope_findings": []
    }

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions