Skip to content

[finding] Fire-open has no specified machine reading for the adjudication tier fuse — scheduled triage rounds skip proxy-adjudication every time, while manual sessions pass via get_session #12706

Closed

Description

@os-litant

Observation (triage seat, session session_01GYwKNq9YMPW3Wg4jJs4ZpS, 2026-08-27). The pm-dispatch adjudication channel's hard gate requires the running seat's measured serving model = claude-fable-5 ("降档保险丝机器读数,⛔ 永不凭自述"), but SKILL.md specifies no fire-open step and no canonical tool for taking that machine reading. Behavior therefore diverges by session shape, observed on the seat post (#6015) briefs:

  • Every recent scheduled Routine fire records "服务模型档位无机读工具 ⇒ 代裁子轮整体跳过" and falls back to the maintainer path for all decision cards — the safe precedent, repeated round after round (including this session's own round, which did not attempt any detection at startup).
  • The manual daily-full session on 2026-08-27 (session session_01Czs5tCwMymUvzB9QCA2yhH) passed the gate via session introspection: get_session dual reading (session_context.model = claude-fable-5 AND last_served_model = claude-fable-5).

So the same seat, same skill text, same pinned-model Routine yields "gate MET" or "gate unverifiable" depending on which tools the harness happens to expose — and nothing in the skill says which reading counts or that fire-open must even attempt one.

Consequence. The proxy-adjudication channel (maintainer-approved 2026-08-26: 「代裁通道如果是 fable 可以代裁,其他接受你的建议」) is effectively dormant on every scheduled fire, even when the Routine is genuinely pinned to fable in the Routines UI, because the seat cannot prove the pin from inside the session. Adjudicable cards queue for the maintainer instead — exactly the load the channel exists to remove.

Boundary / related. Closed finding on the sibling measurement face: get_session reports the dispatching session's model, not a subagent's, so any canonical probe must state what process it measures (that finding's conclusion stands and is not re-litigated here). A fix should:

  1. Name the canonical machine reading for the tier fuse (e.g., bless the get_session dual reading when the tool is exposed, and/or add a mechanical probe usable from Routine sessions), and state its scope (main-session only).
  2. Add "attempt the tier-fuse reading" to the triage fire-open checklist, with the exact fallback wording when no reading is obtainable (current de-facto wording: skip adjudication entirely, cards take the maintainer path).
  3. Keep the fail-safe direction unchanged: unverifiable ⇒ skip, never self-report.

Provenance. Filed on maintainer instruction, 2026-08-27, in the triage seat's live session: 「你启动时会检测自己的模型是 fable 吗?如果没有,立一张skills卡片」. Deduped before filing: no open card covers the fire-open reading gap; the closed subagent-measurement finding is adjacent but distinct.

Skills-lane finding — left ungraded for the skills seat's own triage per lane rules. No claim; no assignee.

Activity

  1. added
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    on Aug 27, 2026
  2. os-litant commented on Aug 27, 2026

    @os-litant
    ContributorAuthor

    Measured data point (same session as the filing, session_01GYwKNq9YMPW3Wg4jJs4ZpS, on maintainer follow-up 「你现在能检测自己的模型吗」): a live probe was attempted this time. ToolSearch for session-introspection tools (get_session / session context / model) returned no such tool in this harness shape — only unrelated tools matched. The only reading available is the system prompt's configuration declaration (configured model claude-fable-5, fallback chain claude-opus-5[1m] → claude-opus-4-8[1m]), which the prompt itself says may differ from the serving model — i.e. self-report, inadmissible under the fuse rule.

    So the gap is now measured, not just inferred: the get_session dual-reading probe that passed the gate in the 2026-08-27 manual session is absent in at least one scheduled/remote session shape. Any canonical probe blessed by the fix must either (a) be available across session shapes, or (b) explicitly scope the adjudication channel to session shapes where the probe exists — with the documented fallback (skip, maintainer path) for the rest.


    Generated by Claude Code

  3. os-litant commented on Aug 27, 2026

    @os-litant
    ContributorAuthor

    Maintainer direction (live session 2026-08-27, same session session_01GYwKNq9YMPW3Wg4jJs4ZpS), quoted verbatim: 「所以使用 routines 已经不是最佳方案了。还是得考虑直接会话的模式」.

    This widens the card's scope from "bless a probe" to re-deciding the seat-operation transport. Two measured defects on the scheduled shape, with different blast radii:

    1. Tier fuse unverifiable (measured in this session): no session-introspection tool in the scheduled shape ⇒ the adjudication channel and any tier-gated duty can never legally run there. Affects only tier-sensitive duties.
    2. Scheduler reliability (measured 2026-08-26→27): a dead round at 18:05Z followed by ~12h of zero fires until a manual summon. Affects all scheduled duties.

    Note the Routine's core benefits (fresh session, zero local state, behavior versioned in git, idle-round cost ceiling of one query) are properties of the protocol, not the timer — the 2026-08-27 manual daily round slotted into the mutex/seat-post discipline cleanly and passed the tier gate.

    Options for the skills seat to carry into the decision:

    • A (triage seat's recommendation): layered hybrid. Keep the scheduled channel for tier-agnostic mechanical duties (hourly sweep, unlock scan, half-state healing); move tier-sensitive duties (proxy-adjudication, contract-review-tier work, director triad) wholly to maintainer-summoned direct sessions — aligned with the director seat already being manual-summon by design, and with the maintainer's periodic decision-box review cadence, so the added latency on adjudicable cards is ≈0.
    • B: full direct-session mode. Verifiable model and live interjection, but every fire then depends on a human or a long-lived session surviving container reclaim / usage walls / expiry — re-adding the operator toil the Routine pilot existed to remove.
    • C: wait for platform introspection in the scheduled shape. Outside our control; not a plan.

    Either A or B is a governance-face protocol change (SKILL.md seat-Routine principles + the adjudication-channel clause) — skills-lane PR, maintainer ruling required; this comment records direction and analysis, not a ruling.


    Generated by Claude Code

  4. os-litant commented on Aug 27, 2026

    @os-litant
    ContributorAuthor

    Tier analysis for the mechanical trio (maintainer question in the same live session: 「小时增量 sweep、解锁扫描、半标注治愈,这些需要什么档位」) — input for option A's split:

    • Half-state healing: pure label-set convergence per the state-machine vocabulary; self-correcting via the next patrol. sonnet floor suffices.
    • Unlock scan: grep Blocked-by: + verify upstream closure are mechanical; the re-verify-on-merged-ref step (did the upstream merge also fix this card?) reads diffs — opus is the safe tier, sonnet marginal.
    • Hourly incremental sweep (first-touch classify/route): reads code to find the fix landing point, assigns domain/type, grades queue vs decision-box vs close. Judgment work; the expensive error direction (a decision-worthy card slipping into pm:queue) is fenced by the human-floor list and the "unclear landing point ⇒ leave at first touch, never guess" rule, not by tier. opus — the default judgment tier.

    All three run in one session ⇒ the scheduled round needs opus, max. None of the three is behind the CONTRACT_REVIEW_TIER hard gate, so the "tier fuse unverifiable in scheduled shape" defect does not apply to them at all — which is the premise that makes option A coherent. Consequence if A is ruled: the scheduled triage Routine's fable pin becomes unnecessary (its only fable duties — proxy-adjudication and contract-review — move to direct sessions); re-pinning the Routine to opus in the Routines UI is a maintainer action and a straight fable-quota saving. Existing compensating control unchanged: governance-face work built at opus still reaches the maintainer only through a fable-tier review seat.


    Generated by Claude Code

  5. os-litant commented on Aug 27, 2026

    @os-litant
    ContributorAuthor

    Maintainer ruling (live session 2026-08-27, session session_01GYwKNq9YMPW3Wg4jJs4ZpS), quoted verbatim — supersedes the A/B/C option framing above:

    「但是 代裁、Clause-②/契约复审也是很重要的职责,也是需要定时处理的,我不希望分诊拆的这么散。我觉得分诊也和普通项目经理一样走普通的session,然后需要高级别处理的任务走 fable 子agent,然后自己默认定时1小时,除非人工要求。」

    Ruled shape:

    1. The triage seat stays whole — no splitting duties across transports. Triage runs as a normal direct session, same shape as execution PM seats.
    2. Tier-gated duties (proxy-adjudication, Clause-②/contract-review) are handled from within that session by dispatching a claude-fable-5 subagent, model passed explicitly per dispatch — the same explicit-tier-param mechanism dispatch already uses, so the gate control becomes the dispatch parameter, not session self-introspection. (The adjacent closed finding on get_session measuring the dispatching process stands; the ruled mechanism does not rely on introspection at all.)
    3. The session self-schedules at a default 1-hour cadence, overridable by explicit maintainer request.

    Implementation notes for the skills seat (protocol text still lands via a skills-lane PR; this card carries the ruling):

    • SKILL.md sections touched: 「座位 Routine 三原则」 (retire or rewrite for the triage seat), the adjudication-channel hard-gate clause (runner = fable subagent dispatched with explicit model, replacing "Routine 钉档" as the tier control), and the contract-review runner wording if it names the Routine.
    • Timer-text discipline and mutex four-readings apply unchanged — they are transport-agnostic and already survived manual sessions.
    • Operational caveat recorded honestly: a self-timed session dies with its container / usage walls; succession is by maintainer summon (「除非人工要求」), and the seat-post mutex protocol already handles succession.
    • The claude.ai Routine trig_01XhwLupWiUBp7GUEigK1RFW becomes obsolete under this ruling — disabling it in the Routines UI is a maintainer action (avoids double-firing cost; mutex would serialize correctness either way).

    Effective immediately in the current seat session per the maintainer's live authorization; codification follows via the skills lane.


    Generated by Claude Code

  6. os-litant commented on Aug 27, 2026

    @os-litant
    ContributorAuthor

    Maintainer ruling recorded — the five-piece codification package is approved whole. Director seat, 2026-08-27 (session session_01MnijPVVDakqK2J335JoJtq, tier machine-read claude-fable-5). Verbatim: 「同意,重新汇总给我解释一下新的分诊项目经理完整的工作。」 — approving the package as presented in the live Director session, which refines the 14:07Z ruling on this card with three additions the discussion produced:

    1. Triage = normal direct session, whole seat at opus (mechanical trio needs at most opus; the 14:07Z ruled shape stands).
    2. Tier-gated duties (proxy-adjudication, Clause-②/contract-review increments) run via a claude-fable-5 subagent dispatched with explicit model — unchanged from 14:07Z — plus (new) the transcript tier verification: before any verdict is adopted or any label cleared, the dispatching session greps the subagent's transcript for the per-message API-stamped model field; every verdict-producing turn must read claude-fable-5; fallback evidence ⇒ the verdict is void (redo or maintainer path). This reconciles the ruled mechanism with the downgrade-fuse doctrine — the reading measures SERVING, the dispatch param alone is configuration (fallback chains are real and measured; a fable-pinned session read back claude-opus-5 under quota pressure 2026-08-26 07:39Z).
    3. (New) The no-edit guardrail: the opus parent has exactly two legal actions on a fable subagent's verdict — adopt verbatim, or void whole (void reasons are mechanical only: tier verification failed / scope exceeded / format incomplete). ⛔ Never rewrite, trim, or "improve" the verdict content — a lower-tier node silently editing higher-tier judgment is the one real seam this design opens, and this closes it. Acceptance = evidence checklist (scope, machine-checkable citations, tier read), never substantive re-judgment; substantive backstops stay where they are (代裁清单 in every round report for the maintainer; governance faces still reach the maintainer only through a fable review seat + human merge).
    4. (New) Self-timer default = armed at round END, delay ≤55 minutes (the 1-hour prompt-cache TTL minus measured minutes-level timer jitter keeps the whole shift on one unbroken cache chain; two recorded boundaries: usage-overage drops the TTL to 5 minutes and the benefit to zero, and compaction rounds rewrite regardless — neither changes the default). Overridable by explicit maintainer request, per the 14:07Z ruling.
    5. The old scheduled Routine (trig_01XhwLupWiUBp7GUEigK1RFW) is obsolete — its UI disable is filed as its own pm:awaiting-maintainer item.

    State: finding → pm:queue in the same stroke (grading: the card now carries a complete ruling and is dispatchable protocol work; skills lane; fable — SKILL.md is on the clause-① surface). Serial constraint: .claude/skills/pm-dispatch/SKILL.md and references/lanes/director.md are held by open draft PR #12713 (#12709, awaiting the maintainer's human merge) — this card dispatches only after #12713 merges. File surface at dispatch: SKILL.md (座位 Routine 三原则 rewrite to the direct-session self-timed shape; the adjudication-channel runner clause) + references/contract-review.md (the 资格/反模式 paragraphs: subagent review becomes legal WITH transcript tier verification) + references/lanes/director.md cross-references if touched.


    Generated by Claude Code

  7. added
    pm:queueReady for the PM dispatch loop
    and removed
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Aug 27, 2026
  8. os-litant commented on Aug 27, 2026

    @os-litant
    ContributorAuthor

    Ruling increment — piece 6 approved: the chain's timed-processing split. Director seat, 2026-08-27 (session session_01MnijPVVDakqK2J335JoJtq). Maintainer, verbatim: 「同意,继续」 — approving the ownership split presented in the live session:

    • Authority and accountability stay with the Director seat (the seat's founding sentence 「负责处理 contract-review 类别的」 unbroken); timed processing moves to the triage seat's ~55-minute rounds (per the maintainer's own 「契约复审也是很重要的职责,也是需要定时处理的」).
    • Triage per round: enumerate carriers → transcript-verified fable subagent reviews the contract increment → PASS ⇒ 清标即落地 for un-governed code / the draft four-piece for governed faces → FAIL ⇒ label-flip handback → BLOCKED-on-decision ⇒ decision inbox only, ⛔ never self-ruled. Every round report carries the 复审清单 (same mandatory-audit shape as the 代裁清单).
    • Director on summon: consolidated chain inventory; processes ONLY carriers triage has explicitly parked, failed tier-verification on, or aged out — plus the BLOCKED branch inside adjudication batches.
    • Anti-double-run rule (hard): the standing processor is uniquely the triage timed round; the Director never sweeps the same carrier set in parallel — two seats clearing the same labels is a write race by construction.

    Codification scope grows accordingly: references/contract-review.md's 归属条款 rewrites alongside the 资格/反模式 paragraphs (常设 = triage timed rounds via transcript-verified fable subagent; Director = summon-time backstop + BLOCKED branch; the 2026-08-27 quotes carried); references/lanes/director.md 职责一 adjusts to the backstop framing. The five pieces recorded 2026-08-27 earlier on this card stand unchanged. Serial constraint unchanged: dispatches after PR #12713 merges.


    Generated by Claude Code

  9. os-litant commented on Aug 27, 2026

    @os-litant
    ContributorAuthor

    Claim: skills-lane PM dispatch (ruling execution; filed rulings and claim by the same seat)
    Session: session_01MnijPVVDakqK2J335JoJtq
    Branch: claude/issue-12706-triage-direct-session
    Worktree: ../objectstack-12706 (dev-created from origin/main)
    Domain: skills
    File surface: .claude/skills/pm-dispatch/SKILL.md(座位 Routine 三原则 → 直连自排形态;代裁通道 runner 条款)+ .claude/skills/pm-dispatch/references/contract-review.md(资格/反模式/归属三段)+ .claude/skills/pm-dispatch/references/lanes/director.md(职责一兜底化 + 保险丝交叉引用). Zero-headroom ratchets on all three — net 0 per file, cut ledger with surviving homes; director.md is the tight one (75/75) — STOP and report the exact shortfall rather than force a meaning-destroying cut.
    Container & model: mode:subagent, claude-fable-5 — live node scripts/pm/dispatch-gates.mjs --tier output for this surface (run this session): "Model tier — MANDATORY: claude-fable-5 … .claude/skills/pm-dispatch/SKILL.md ⇢ clause ① of the model-tiering ruling (narrowed to protocol semantics, 2026-08-20)". Multi-clause protocol-semantics change — no one-liner exit. Clause-② content limb: no (PM protocol text).
    Serial constraints cleared: PR #12713 (the prior holder of SKILL.md and director.md) MERGED 2026-08-27 ~15:10Z (pull_request.closed outcome:merged event on the subscribed PR; #12709 closed via Fixes and label-cleaned in the same pass). No other open PR holds any of the three files (single-writer check runs on the PR).
    Assignee set by this seat in the same stroke (assignee 归 PM under mode:subagent; the branch above is the dev claim's distinguishing identity).


    Generated by Claude Code

  10. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Aug 27, 2026
  11. self-assigned this
    on Aug 27, 2026
  12. os-litant commented on Aug 27, 2026

    @os-litant
    ContributorAuthor

    os-dev-report

    {
      "issue": 12706,
      "status": "done",
      "branch": "claude/issue-12706-triage-direct-session",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/12744",
      "premise_still_valid": true,
      "summary": "Codified the six 2026-08-27 rulings into the three ruled files, each at its zero-headroom ratchet ceiling (1005/48/75, net 0 per file). SKILL.md: the seat-Routine three-principles paragraph rewritten to the direct-session self-timed shape (whole seat opus; round-END self-timer, delay at most 55 minutes, cache-chain rationale plus both recorded boundaries; full ruling quote carried), with the shift-close round-open mutex/release text kept byte-verbatim in the same paragraph; the adjudication-channel clause now names the runner set at pointer altitude (triage seat's explicit-model fable subagent past per-verdict transcript verification, or the at-tier Director seat). contract-review.md: qualification machine-reading split (own session = downgrade fuse, subagent = transcript verification), ownership clause rewritten (standing uniquely = triage timed round via verified subagent; PASS/FAIL/BLOCKED endings; review roster in every round report; Director = summon backstop + BLOCKED branch; anti-double-run hard line), and the old anti-pattern paragraph rewritten as the transcript-tier-verification bullet carrying the no-edit guardrail (adopt verbatim or void whole; three mechanical void reasons). director.md: parking scope adjusted, duty one reframed as the backstop, the two supersession ledger bullets merged into one dated chain. Deviations declared: repo-scoped REST probed 403 (whole session class, gate closed) so every GitHub write went via MCP; skip-changeset applied as MCP whole-set write with comparative read-back (union held, no concurrent label stripped); beyond the two named SKILL.md clauses, four consistency touches (seat-tier-policy fable reservation, role-arg sentence, urgent-triage and daily-subround Routine-vocabulary swaps) plus three compress-in-place cuts with reference-file surviving homes are itemized in the PR body's cut ledger.",
      "tests": "All gates re-run at final HEAD 0006e0c45 through scripts/pm/os-verify-lock.sh (slot os-dev-12706; exits captured in the lock's VERDICT line before any pipe). check:pm-skill-ratchet exit 0: 'SKILL.md is 1005 lines (ceiling 1005; headroom 0)' / 'contract-review.md is 48 lines (ceiling 48; headroom 0)' / 'director.md is 75 lines (ceiling 75; headroom 0)', row pins 765/0/0 all headroom 0. check:pm-skill-id-lint exit 0: '23 file(s) clean (pattern /#[0-9]{3,}/g)'. check:skill-frame-sync exit 0: '4 copies of the decision frame are structurally isomorphic across 3 files'. check:skill-frame-freshness exit 0: 'the decision frame in this tree is current with origin/main (fetched just now)'. check:pm-governed-prose exit 0: '2 instruction surface(s) name all 5 registered governed surfaces ... and claim no others'. Derived union via node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack (9 matched families, changeset taken by the script from merge-base): check:agent-test-spelling, check:doc-authoring ('48 published skill files clean'), check:pm-governed-merges (self-test 206 assertions plus live generator certification), check:nul-bytes ('scanned 7072 text file(s) ... no raw ASCII control bytes'), and lint check:doc-formula-expressions ('22 record-scoped formula example(s) ... judged clean') — the last refused twice with PREREQUISITE NOT MET (unbuilt formula, then lint), recorded NOT MEASURED, both built, re-run exit 0. check-governed-queue-guard is CI-only: NOT MEASURED locally. No ablation: docs-only diff, no executable subject. Derivation staleness note: base is 4 commits behind origin/main; the two changed gate sources (i18n/prerelease scripts) do not cover these paths and none of the 4 commits touches a pm-dispatch file.",
      "mcp_calls": "5 — create_pull_request, pull_request_read get x2 (full body read-back to the tail; label comparative read-back), issue_write (skip-changeset whole-set write), add_issue_comment (this report). Card body plus all comments were read over the zero-quota public-repo payload channel; the repo-scoped REST probe answered 403 for the whole session class, so writes took the MCP path (channel switch declared).",
      "open_questions": [],
      "out_of_scope_findings": []
    }

    Generated by Claude Code


    Generated by Claude Code

  13. os-litant commented on Aug 27, 2026

    @os-litant
    ContributorAuthor

    ACCEPT — seat review done on the full diff (PR #12744, head 0006e0c4, 3 files, net 0 at every ceiling: 1005/48/75).

    • All six rulings codified faithfully: ① the SKILL.md seat paragraph is now 分诊席直连自排 (whole seat opus, full ruling quote verbatim) with the Shift-close releases the seat; linger mode fences the briefing's named tails (pm-dispatch protocol) #12682 mutex/release text preserved byte-verbatim around it; ② the adjudication runner set = triage's explicit-model fable subagent or the at-tier Director, stated at pointer altitude; ③ the transcript tier verification lives in contract-review.md's fuse section — per-message harness-stamped model field, every verdict-producing turn at tier, fallback evidence voids the verdict whole, and the old "constructively unmeasurable" anti-pattern is rewritten as legal exactly when verification passes (param-only control stays forbidden as configuration-not-measurement); ④ the no-edit guardrail is exact — adopt verbatim or void whole, three mechanical void reasons only, acceptance = evidence checklist never substantive re-judgment; ⑤ round-END self-timer ≤55 min with the cache-chain rationale and both recorded boundaries, maintainer-overridable; ⑥ the ownership split — standing uniquely the triage timed round (PASS/FAIL/BLOCKED endings, 复审清单 as a mandatory round-report section), Director as summon backstop (three named conditions + BLOCKED branch) with the anti-double-run hard line — lands in the 归属 clause, director.md 职责一, and the merged supersession chain (2026-08-23 clock → Director summon → 2026-08-27 timed round), every quote carried by date.
    • Consistency sweep is complete, not cosmetic: the four Routine-vocabulary touches (role-arg sentence, urgent-triage, finding daily sub-round, seat-tier policy) remove every remaining claim that triage runs as a Routine — leaving any would have shipped contradicting text. The dropped 「⛔ 永不靠重建 Routine 改行为」 prohibition was Routine-transport-specific; its surviving intent (behavior versioned in git, upgrades via skill PR) stays in the same sentence.
    • Cut ledger audited with spot-verification: the three compress-in-place cuts' surviving homes confirmed present in platform-readings.md by grep (gate-job directed-read rule at its lines 34–35, sanitizer write-side shapes at 247–252, ccusage blind spots at 312). No meaning orphaned.
    • Gates: ratchet verdicts quoted per file, id-lint 23 clean, frame-sync isomorphic, governed-prose 2×5, derived union green at head; queue guard CI-only as declared.

    Four-piece end state (same stroke): PR stays draft; review requested from os-zhuang with the draft bit passed explicitly; awaiting the maintainer's bypass direct merge — merging activates the new triage operating mode. Fixes #12706 closes this card on merge.


    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:skillsDomain lane — seat card indexed by label:pm:seat

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions