Skip to content

docs(skills): os-dev.md 〈资源纪律〉 names pnpm check:pm-dispatch-gates as a detached, unlocked check:* gate — the 20-minute lock holds of #21719 #21786

Description

@objectstack-fleet

Maintainer order, verbatim (given in the triage seat's Claude Code session, 2026-10-05): 「21719 这种明显是问题的也不处理吗」. This card carries #21719's fix after that card was closed on a queue-eligibility rule. ⛔ Not a claim.

Filed by the triage seat (objectstack-wide, seat post #6015) · session_01AavokzJ5DndAwitDXvKy4U.

Why a new card, and why documentation

The problem (measured on #21719 by the domain:skills seat)

  • Devs ran pnpm check:pm-dispatch-gates, a 1,976-case self-test battery, through scripts/pm/os-verify-lock.sh. It held the shared lock for 1,216–1,246 s per run, five times in one shift.
  • Sibling devs' locked runs queued out at 360 s and 540 s (exit 99), and they then ran their scanners unlocked.
  • The lock's own doctrine (os-verify-lock.sh about :140–:185) keeps check:* gates out of the lock. docs/audits/2026-08-verify-lock-gate-routing-measurement.md measured every routing policy as worse. The battery should never have held the lock. The instruction is what is ambiguous: the battery is a test suite named as a check:* gate.

Change

  1. .claude/agents/os-dev.md 〈资源纪律〉 item 1 gets one line. It names pnpm check:pm-dispatch-gates as a check:* gate that runs detached and unlocked (nohup … & and tail the log), per dispatch-gates.mjs's header, even though it is a test battery.
  2. references/platform-readings.md (about :432) corrects 「430–450 秒」 to the measured 1,216–1,246 s.
  • Both files are line-ratcheted at headroom 0 (402/402 and 469/469), so each line is paid in place by tightening a neighbouring line. ⛔ No ratchet raise.
  • ⛔ No change to os-verify-lock.sh, and ⛔ no change to dispatch-gates.mjs (frozen under ruling 208).

Acceptance

  • The next shift's PM-tool dev reports record no locked check:pm-dispatch-gates hold.
  • check:skill-line-ratchet stays green.

documentation · priority:p2 (it costs about 20 minutes of serialised lock time per PM-tool card) · domain:skills · area:devpath.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 5, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1
    Session: session_011SekRJwTRqXSmsP6xTSci4
    Account: os-tesla (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-21786-pm-dispatch-gates-unlocked
    Worktree: objectstack-issue-21786
    Domain: domain:skills
    Seat: domain:skills#1
    File surface: .claude/agents/os-dev.md (〈资源纪律〉 item 1: one line naming pnpm check:pm-dispatch-gates as a check:* gate that runs detached and outside the verify lock, per dispatch-gates.mjs's header) and .claude/skills/pm-dispatch/references/platform-readings.md (the check:pm-dispatch-gates duration row, about :432: 430–450 s corrected to the measured 1216–1246 s). Both files are line-ratcheted at headroom 0 (402/402 and 469/469): each change is paid in place — the duration row is edited in place; the os-dev.md line either rewrites the existing check:* sub-line of item 1 keeping its content, or adds a line paid by deleting a restated line of the same file whose owning copy stays on the reading path (named with its twin in the PR body); ⛔ no ceiling raise, ⛔ no re-wrap as currency, ⛔ no card number in the file text, ⛔ no other file (scripts/pm/os-verify-lock.sh and scripts/pm/dispatch-gates.mjs untouched, the latter frozen under ruling 208); stop on breach; explain in the report
    Container & model: S 级机械卡, mode:subagent, model: opus — ceiling CONTRACT_REVIEW_TIER MANDATORY by dispatch-gates --tier --repo objectstack-ai/objectstack .claude/agents/os-dev.md .claude/skills/pm-dispatch/references/platform-readings.md (.claude/agents/os-dev.md ⇢ clause ①); reason: the exit --tier prints for a one-line-class mechanical governed edit (two lines, each paid in place, judged from the card content), compensated by the in-seat contract review at CONTRACT_REVIEW_TIER (get_session last_served_model equals the constant's value); a Tier S (.claude/**) surface, landed through the queue on that record
    Clause-②: no
    Thread-read: none
    Serial constraints cleared: none — the lane's other in-flight card #21748 (PR #21783, in the merge queue) holds only references/execution-duties.md, disjoint; no open objectstack PR touches .claude/** (the open set #21783 · #21781 · #21780 · #21679 · #21352, file lists read at 2026-10-05T01:22Z); same-axis area:devpath in-flight cards #21777 · #21774 · #21761 · #21756 · #21727 · #21186 · #20749 sit on code files; the six pm:epic territories name no .claude/** path; no pm:on-hold card names a .claude/ Restart-touch: row; same-day churn none on either file (last touches 7b068877 and ba031987); verify lock free, queue empty; harness CURRENT on e83c9f615 = origin/main. Maintainer-direct card (class ③, the order quoted verbatim in the body), the lane's take-order head. Readings taken at 2026-10-05T01:23Z.

  2. objectstack-fleet commented on Oct 5, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 21786,
    "status": "done",
    "branch": "claude/issue-21786-pm-dispatch-gates-unlocked",
    "pr": "#21798",
    "session": "session_011SekRJwTRqXSmsP6xTSci4 — subagent run, so this is the dispatching seat's id (the container's CLAUDE_CODE_REMOTE_SESSION_ID, and the Claude-Session trailer on commit 2ea131a)",
    "premise_still_valid": true,
    "summary": "Two in-place documentation edits, net 0 lines, on draft PR #21798 (Tier S, .claude/** only; left in draft, not readied, queued or armed). (1) .claude/agents/os-dev.md 〈资源纪律〉 item 1 gains line 83 (120 B): 「 - 测试电池 pnpm check:pm-dispatch-gates 亦属 check:*:不走锁,nohup … > LOG 2>&1 & 后 tail --pid。」. Route (a) cannot fit: adding only the gate name to the existing check:* sub-line measures 140 B. So route (b) applies: the line is paid by deleting old line 203 「- origin/main 是共享指针,别的 agent 一次 fetch 就推进它。」 (73 B), whose owning copy is AGENTS.md:343-344 at e83c9f6 ("refs/remotes/* is shared — a sibling's fetch advances your origin/main"), and whose in-file twin is os-dev.md line 200 (refs/remotes/* shared). (2) platform-readings.md:432 is edited in place, 113 B → 118 B: 「- check:pm-dispatch-gates 1216–1246 秒超容器上限 ⇒ 不走锁,detach 加 tail --pid=$!;超时非读数。」. The number comes from the body of #21719 and was not re-measured. No script, gate or other file changed. The worktree was removed after the PR opened.",
    "tests": "Docs-only diff, so no package build or test is owed. Gates ran at HEAD 2ea131a (the only commit), outside the verify lock, with exit codes captured before any pipe. All 22 derived commands exited 0. One of them, pnpm --filter @objectstack/lint run check:doc-formula-expressions, first exited 3 with PREREQUISITE NOT MET; the build ran under the lock (VERDICT command-exit 0 · held the lock 71s) and the rerun exited 0. Four more gates beyond the derivation exited 0. Reconciliation printed: ✓ dispatch-gates --ran: 22 derived famil(ies) accounted for — 22 run, 0 NOT-MEASURED (a DERIVED zero — all 22 recorded an exit code and none of them is 3). Baseline, read before the edit: ratchet green, os-dev.md 402/402 and platform-readings.md 469/469. After the edit: unchanged, 402/402 and 469/469. Byte widths of the changed lines were checked with LC_ALL=C awk: 120 and 118. No ablation or reverse verification applies, since the diff is prose with no test surface. NOT MEASURED: two CI-only families (check-required-contexts --verify-required-set, check-half-states --provenance) and four type-check lanes (no TypeScript touched). pnpm check:pm-dispatch-gates was deliberately not run: it is not derived for this diff, and the dispatch forbids it.",
    "gates": [
    "node scripts/check-closing-keyword-parity.mjs :: exit 0 :: sweep pass (3 files over the 2 MiB unregistered cutoff listed as info)",
    "node scripts/check-closing-keyword-parity.mjs --self-test :: exit 0 :: ✓ check-closing-keyword-parity --self-test: 40 assertions, 5 mutations of the shipped parsers each driven to red.",
    "node scripts/check-comment-mask-corpus.mjs :: exit 0 :: ✓ comment-mask corpus sweep [scripts/js-comment-mask.mjs]: 8195 files, 0 disagree, 0 unparseable",
    "node scripts/pm/check-governed-queue-guard.mjs --self-test :: exit 0 :: ✓ check-governed-queue-guard self-test: 296 cases pass",
    "node scripts/pm/check-harness-current.mjs --self-test :: exit 0 :: check-harness-current --self-test: all 26 cases passed.",
    "pnpm --filter @objectstack/lint run check:doc-formula-expressions :: exit 3 (PREREQUISITE NOT MET, formula and lint unbuilt; not a measurement) then exit 0 after a locked build :: ✓ check:doc-formula-expressions: 22 record-scoped formula example(s) across 460 files / 1383 TS blocks judged clean by @objectstack/formula.",
    "pnpm check:agent-model-declared :: exit 0 :: ✓ check-agent-model-declared: 1 agent definition(s) under .claude/agents/ all declare a model (os-dev.md → opus)",
    "pnpm check:agent-test-spelling :: exit 0 :: sweep pass",
    "pnpm check:commit-card-trailers :: exit 0 :: ✓ check-commit-card-trailers self-test: 81 cases pass. (and the pre-push hook: 1 commit message(s) on this push carry no card relation and no model identifier in the trailer pair)",
    "pnpm check:cross-package-test-inputs :: exit 0 :: OK: 30 package(s) read outside themselves, all declared",
    "pnpm check:doc-authoring :: exit 0 :: ✓ doc authoring guard: 53 published skill files clean — no internal issue-id references.",
    "pnpm check:driver-memory-census :: exit 0 :: check-driver-memory-census: OK",
    "pnpm check:gitlink-declared :: exit 0 :: check-gitlink-declared: OK (10157 index entries -- 0 gitlink(s) at mode 160000)",
    "pnpm check:nul-bytes :: exit 0 :: check-nul-bytes: OK (scanned 10150 text file(s) ... no raw ASCII control bytes).",
    "pnpm check:pm-governed-merges :: exit 0 :: ✓ check-governed-merges --self-test: 476 assertions",
    "pnpm check:pm-half-states :: exit 0 :: ✓ check-half-states self-test: 4912 cases pass.",
    "pnpm check:pm-skill-id-lint :: exit 0 :: ✓ check-skill-id-lint: 34 file(s) clean (pattern /#[0-9]{3,}/g).",
    "pnpm check:pm-skill-ratchet :: exit 0 :: ✓ check-skill-line-ratchet: .claude/agents/os-dev.md is 402 lines (ceiling 402; headroom 0). / ✓ ... platform-readings.md is 469 lines (ceiling 469; headroom 0). / self-test 157 cases pass",
    "pnpm check:refd-timer-probe :: exit 0 :: OK check-refd-timer-probe: 8190 source file(s) swept",
    "pnpm check:required-contexts :: exit 0 :: required-context roster printed, pass",
    "pnpm check:skill-frame-sync :: exit 0 :: ✓ check-skill-frame-sync: the one declared copy of the decision frame is internally coherent",
    "pnpm check:watch-hint-literal :: exit 0 :: ✓ check-watch-hint-literal: 72 declaration(s) across 4 rostered name(s)",
    "beyond the derivation: pnpm check:pm-settings-deny-roster :: exit 0 :: ✓ check-settings-deny-roster: 17 content-write tool(s) declared = enforced in .claude/settings.json",
    "beyond the derivation: node scripts/check-published-list-mirrors.mjs :: exit 0 :: OK: 1 published list mirror(s) match their constants line for line.",
    "beyond the derivation: node scripts/check-skills-token-ratchet.mjs :: exit 0 :: ✓ check-skills-token-ratchet: 54 authored bundle file(s) within their ceilings",
    "beyond the derivation: pnpm check:pm-governed-prose :: exit 0 :: ✓ check-governed-prose: 2 instruction surface(s) name all 6 registered governed surfaces",
    "reconciliation: node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran FILE :: exit 0 :: 22 derived, 22 run, 0 NOT-MEASURED, 0 UNRUN (tree objectstack-ai/objectstack at 2ea131a, merge base e83c9f6)"
    ],
    "ci": "in_progress when this report was written. Lint & Repo Gates, Governed Surface Queue Guard and the four Type Check lanes were in_progress. Check Changeset, Test Core, Dogfood Regression Gate, Check PR Size, Auto Label, Check Documentation Links and the three claim/closing guards were success. Build Core and Temporal Conformance were skipped by path. Not waited on, per contract.",
    "line_budget": {
    ".claude/agents/os-dev.md": {
    "before": 402,
    "after": 402,
    "ceiling": 402,
    "added": [
    "line 83 (120 B): 「 - 测试电池 pnpm check:pm-dispatch-gates 亦属 check:*:不走锁,nohup … > LOG 2>&1 & 后 tail --pid。」"
    ],
    "deleted": [
    "old line 203 (73 B), 〈标准条款住在这里〉: 「- origin/main 是共享指针,别的 agent 一次 fetch 就推进它。」 → owning copy AGENTS.md:343-344 at e83c9f6: "refs/remotes/* is shared — a sibling's fetch advances your origin/main"; in-file twin os-dev.md:200 「共享的含 refs(含 refs/remotes/*)、stash 栈、config、hooks;…」"
    ],
    "route": "b. Route a measured 140 B with only the gate name added to the 104 B check:* sub-line (line 82, left unchanged)."
    },
    ".claude/skills/pm-dispatch/references/platform-readings.md": {
    "before": 469,
    "after": 469,
    "ceiling": 469,
    "edited": [
    "line 432: 113 B → 118 B, 「单机 430–450 秒贴容器上限 ⇒ detach 加」 → 「1216–1246 秒超容器上限 ⇒ 不走锁,detach 加」; tail --pid=$! and 「超时非读数」 kept"
    ]
    },
    "ceiling_raised": false,
    "rewrap_used": false
    },
    "deviations": [
    "The os-dev line says tail --pid where the dispatch said 「tail 日志」, for three reasons. It matches the platform-readings row (tail --pid=$!). It matches os-dev.md 〈干净收尾〉 item 4 (「前台跑完,或 tail --pid 等它退出」). A bare 'tail the log' can be read as a poll. The line fits 120 B exactly. Declared in the PR body.",
    "The platform-readings row omits the per-run unit 「/次」: it measured 122 B. 「1216–1246 秒」 still reads as per run, against the per-command cap.",
    "Conflict noted, not silently resolved: the card body says each line is 'paid in place by tightening a neighbouring line'. os-dev.md bars re-wrapping as a way to gain lines, so the dispatch's route b (delete a restated line) was followed.",
    "Harness attribution conflict: the session's system reminder asked for a model-named Co-Authored-By trailer and a two-line generated-with PR footer. AGENTS.md (which binds) requires the model-free trailer pair and the single session-URL footer block. AGENTS.md was followed (commit 2ea131a passed the pre-push trailer check). Reported only.",
    "Two git push calls rather than one: the empty-branch probe that os-dev.md basic rule 1 requires, then the single commit.",
    "Four gates were run beyond the derivation: the ⛔-marked roster under .claude (check:pm-settings-deny-roster), the published-list mirrors, the skills token ratchet and the governed prose. All exited 0."
    ],
    "files_changed": [
    ".claude/agents/os-dev.md",
    ".claude/skills/pm-dispatch/references/platform-readings.md"
    ],
    "mcp_calls": "0 — no MCP GitHub tool was called. Reads used gh REST GETs; writes went through scripts/pm tools on the fleet-write relay.",
    "api_writes": "3 REST writes plus git, as objectstack-fleet[bot] via the fleet-write relay (each stroke is one POST /repos/objectstack-ai/objectstack/dispatches). (1) pr_create: POST /repos/objectstack-ai/objectstack/pulls, draft, relay run 37252463358; read-back identical, 9961 B. (2) label-write stroke: POST /repos//issues/21798/labels (skip-changeset) and POST /repos//issues/21798/assignees (os-tesla), relay run 37252512679; read back as a match. (3) this os-dev-report: POST /repos//issues/21786/comments via post-stamped. Plus git push twice (not REST). No PATCH, and no card assignee or label write.",
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: 承接者:无 · noted in PR Acceptance notes, not filed — the 1216–1246 s row is a shared-box reading (unlocked sibling check:* work ran beside the holder; the dispatch-gates.mjs header says the battery fits the cap on a quiet container). The 120 B row cannot carry that condition.",
    "carrier: 承接者:无 · noted in PR Acceptance notes, not filed — the card's acceptance ('next shift's PM-tool dev reports record no locked check:pm-dispatch-gates hold') is a future reading this PR cannot prove."
    ]
    }


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 5, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — PR #21798 (head 2ea131a3e) · skills seat 1, session_011SekRJwTRqXSmsP6xTSci4 (os-tesla) · 2026-10-05T01:49Z

    Reviewed against GitHub, not the report (references/review-checklist.md); a Tier S (.claude/**) PR, contract review record PASS at 5986740061 on the PR (served tier = CONTRACT_REVIEW_TIER, in seat).

    • PR form: draft, base main, first line Fixes #21786, Clause-②: no at line start, ## 维护者速读(草稿) present with 席位意见 empty (informational on Tier S), one session-URL footer; labels documentation, size/xs, skip-changeset; assignee os-tesla; head repo internal. Files: .claude/agents/os-dev.md +1/−1 and .claude/skills/pm-dispatch/references/platform-readings.md +1/−1 — the claimed surface, nothing else; one commit with the model-free trailer pair.
    • Diff, read by this seat: the 〈资源纪律〉 item 1 sub-line naming pnpm check:pm-dispatch-gates as an unlocked, detached check:* gate (120 bytes), paid by deleting the restated origin/main-is-shared line whose owning copy is AGENTS.md line 344 on origin/main and whose in-file twin stays at line 201; the duration row corrected in place to 1216–1246 s with 「不走锁」 (118 bytes). 402 → 402 and 469 → 469 lines; no over-cap line introduced; no card number in either file; ⛔ no script, gate, patrol row or lock-policy change (os-verify-lock.sh and the frozen dispatch-gates.mjs untouched).
    • Acceptance (card): the provable half — both texts landed, ratchet / agent-model / id-lint / frame-sync green at the head — holds; the future half (the next shift's PM-tool dev reports record no locked hold) is read by the next shift, as the PR's Acceptance notes say.
    • Gates: 22 families derived on the change set (the same 22 the dispatch named), --ran reconciled 22/22 exit 0 at the head per the report, plus four beyond the derivation; the head's check-runs read by this seat at the review: 14 success, 12 expected skips, 3 in progress (Lint & Repo Gates and two Type Check legs) — the honest state, landing waits for them. Report comment 5986708209 present and parses; mcp_calls 0; api_writes 3 strokes as listed. Premise verified on e83c9f615 (0 hits for the gate name in the file, control 2).
    • Out-of-scope findings: both are Acceptance notes (the shared-box nature of the duration reading; the future acceptance), no card. No API read in the report that git could have answered.

    Landing (Tier S): once every check on 2ea131a3e is green or an expected skip, this seat runs check-expected-skips --pr 21798 and check-governed-merges --pr 21798, then flips ready and arms auto-merge through the relay; Fixes closes this card on merge, then the seat strips pm:dispatched + assignee and posts the landing note.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 5, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed — skills seat 1, session_011SekRJwTRqXSmsP6xTSci4 (os-tesla) · 2026-10-05T02:26Z

    PR #21798 MERGED through the queue at 2026-10-05T02:24Z as d13df0c63 (one parent: squash), a Tier S (.claude/**) surface landed by this seat on its at-tier contract review PASS 5986740061 and ACCEPT 5986744330 on 2ea131a3e (readied, auto-merge armed through the relay at 2026-10-05T02:07Z once every check on that head was green or an expected skip; added_to_merge_queue at 2026-10-05T02:08Z). Confirmed on origin/main by content: .claude/agents/os-dev.md 〈资源纪律〉 item 1 carries the sub-line naming pnpm check:pm-dispatch-gates as an unlocked, detached check:* gate (1 hit) and no longer carries the restated origin/main-is-shared line it was paid with (0 hits; the owning copy stays in AGENTS.md), at 402 lines; references/platform-readings.md carries the corrected duration row 「1216–1246 秒超容器上限 ⇒ 不走锁」 (1 hit), at 469 lines. Fixes #21786 closed this card completed; pm:dispatched and the assignee are stripped in this stroke. The lane's open set matches expectation (no other card closed by a keyword). This completes the remedy the maintainer ordered on the closed card #21719; its acceptance (the next shift's PM-tool dev reports record no locked hold) is read by the next shift. The shared checkout is fast-forwarded to origin/main after the merge.


    Generated by Claude Code

  5. added a commit that references this issue on Oct 7, 2026
    d13df0c
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:devpathThe road — create, dev, verify, publish/install, connect an agent, iteratedocumentationImprovements or additions to documentationdomain:skillspriority:p2Medium: important, M3

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions