You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
This post is the single authoritative registration of the skills seat. Four-section template; the job description is versioned at .claude/skills/pm-dispatch/references/lanes/skills.md — ⛔ not copied here.
Current PM
🟢 os-steve — session session_019RfFHiRCSs3JXLK4cwcfox, assumed 2026-09-03T15:58Z, maintainer-invoked interactive session (/pm-dispatch skills). Maintainer's in-session directive this shift (verbatim, untranslated): 「前任只处理收尾任务,你可以接班」 (15:4xZ). Previous PM os-litant (session session_01LraLgQVGq8egUwfYZpbYt1, 2026-09-02T01:12Z → 2026-09-03T15:24Z): its shift is archived in body revision v22 (2026-09-03T15:24Z) and its briefing (comment 5528132029); its inherited directives (programme #14292 「审核所有的 skills,进行全面的优化。」; heavy slots = 5 from 「90分钟后,并发加到5」) carry forward. Round-open marker = takeover comment 5528395616. Round reports (中文) in chat at 16:15Z. Readings carry the UTC minute they were taken. Timers: patrols #1–#22 (2026-09-03 16:48Z → 2026-09-04 06:13Z) fired and were worked — their per-patrol notes are archived in the body revision of 2026-09-04T08:14:52Z; patrol #23 (06:50Z) was absorbed into the seat's running turn (no separate wake; its duties done 06:52–07:25Z: the PR #15073 patch round reviewed → ACCEPT 5536878505, flipped ready 07:04Z, auto-merge arm blocked by the MCP window (fourth time this shift) — retry at patrol #24; PR #15190 (#14133 family) MERGED 96b4af88 06:46:32Z → the eight cards closed by Fixes and cleaned 07:05Z, #15013 closed by hand 5537016599, #13373 / #13385 closed on the L149 + L152 evidence, #13387 / #13257 → pm:blockedBlocked-by: #15192; PR #15057 (#14869) MERGED 1bc3c092 06:49:25Z → #14869 cleaned; PR #15199 (#15179) MERGED 3933819c 07:08:22Z → #15179 cleaned, #14978 closed by hand 5537046171; objectui PR #7606 (#7601) flipped 06:58Z + armed 07:00Z, in objectui's queue; #15187 + #15209 → PR #15203 @0a8763f6 ACCEPT 5536999727 at the governed terminal, both approvers requested 07:12Z; #14899 → PR #15236 @ff0c7a56 ACCEPT 5537016483, flip waits on Lint & Repo Gates; #15191 + #15201 claimed 5537055279 / 5537056009 and dispatched 07:2xZ; objectui PR #7606 (#7601) MERGED 0d8fd7ce 07:09:49Z → #7601 cleaned 07:21Z, objectui#7605 claimed 5537133758 + dispatched 07:23Z; PR #15236 all green at 07:19Z — its flip blocked by the MCP window (fourth time, still shut at 07:24Z), retried at patrol #24; PR #15073 IS in the queue (pr-15073 ref read 07:23Z — the 06:5xZ arm enqueued it although the PR object reads auto_merge: null, the recorded platform reading); patrol #23's trigger text arrived late at 07:23Z (queued 06:50:36Z) — every duty it lists was already done, idempotently re-read; #15192 claimed 5537175855 + dispatched 07:27Z as a measurement-first flight (opus, S; the increment written and wrapped, the PR red on the ratchet by design until the maintainer sizes the raise); #15246 (services seat's footer finding, the skills seat named as reader) triaged 07:28Z → pm:blocked on #15192; objectui#7605 delivered 07:41Z → PR #7616 @8d78dbd ACCEPT 5537375216 at the governed terminal, both approvers requested 07:47Z; its dev's residues: objectui#7618 triaged into the queue behind PR #7616, a cross-lane note on objectui#7089 (5537365534)); at 07:45Z the MCP window had reset: PR #15236 (#14899) flipped ready 07:45:2xZ + auto-merge armed 07:45:40Z (read-back method: MERGE, the recorded platform reading — not re-armed); PR #15203 (#15187 + #15209) was APPROVED by os-zhuang on 0a8763f6 at 07:15Z and flipped + enqueued by the approver — pr-15203 in the queue behind pr-15073 at 07:45Z, both landing by the queue; patrol #24 (07:45Z) fired while the seat was mid-turn and its duties were done in that turn (objectui#7605 → PR #7616 ACCEPT at the governed terminal; PR #15236 flipped + armed; PR #15203 read approved + queued; seat post 07:46Z); patrol #25 (08:27Z) fired and was worked (PR #15203 (#15187 + #15209) MERGED 6530f757 08:14:18Z by the queue — both cards closed by Fixes and cleaned 08:28Z, so objectstack's governed guard now carries the unpinned predicate; PR #15073 / #15236 building in the queue, PR #15266 queued behind them (pr-15266 ref 08:27Z); PR #15269 ready, its auto-merge arm blocked by the MCP window again at 08:27Z (sixth refusal this shift) — retry at patrol #26; #15275 unruled; objectui PR #7608 / #7616 unapproved; the 07:48Z half-state sweep (run 33850071955, commit 460134af) names no card of this lane — the three H26 rows are gone with #15013 / #14978, the one H35 row is #15204, another seat's); between patrols (08:31–08:46Z): PR #15236 (#14899) MERGED 5e724a26 08:34:04Z, PR #15073 (#15061) MERGED c0d32cda 08:36:21Z, PR #15266 (#15191) MERGED 0e24b0c2 08:40:32Z — the three cards closed by Fixes and cleaned 08:43Z; PR #15269's arm refused by the MCP window again at 08:42Z (seventh); #15272 delivered 08:40Z → PR #15283 @d510d4ecACCEPT 5537969400 (08:45Z; the seat reproduced the exit-3 refusal in its uninstalled compare worktree), all green at 08:58Z → flipped ready 08:58Z + auto-merge armed 08:58:22Z (flip timer trig_01DWZfrYavnyic3AfDsgisQx fired 08:57Z); PR #15269's auto-merge armed 08:58Z at last — (method: , enabled at ), the flip-enqueued reading; both in the queue; patrol #26 (09:08Z, text delivered 09:10Z) fired and was worked (nothing landed in the window: pr-15269 and pr-15283 building in the queue behind pr-15157; #15275 unruled; objectui PR #7608 / #7616 and PR #15265 unapproved; in-flight 0 of 5); patrol #27 (09:51Z) fired and was worked (PR #15269 (#15201) MERGED 0cbd5f26 and PR #15283 (#15272) MERGED 5b09356b, both 09:28:06Z by the queue — the two cards closed by Fixes and cleaned 09:52Z; #15270 claimed 5538773085 + dispatched 09:54Z (opus, XS; the spelling-less DECLARED-NARROWER row measured and pinned; pure code); #15275 unruled; objectui PR #7608 / #7616 and PR #15265 unapproved); #15270 delivered 10:30Z → PR #15314 @9b576972ACCEPT 5539197077 (10:32Z), flip once its 10 running checks are green; patrol #28 (10:37Z) fired and was worked (PR #15314's CI still running 4 of 29 at 10:38Z; at the 10:51Z flip timer (trig_011DtyXwYUFTqxRwM6vwgf9E) 22 success + 8 skipped → flipped ready 10:52Z + auto-merge armed 10:52Z; #15275 unruled; objectui PR #7608 / #7616 and PR #15265 unapproved; in-flight 0 of 5; objectstack pm:queue empty); patrol #29 (11:24Z) fired and was worked (PR #15314 (#15270) MERGED eb40a721 11:12:23Z by the queue → #15270 cleaned 11:26Z; objectui PR #7608 (#7474) MERGED 89d6adf3 10:58:08Z and PR #7616 (#7605) MERGED 11edab88 11:00:03Z by os-zhuang after approving both 10:44Z → #7474 / #7605 cleaned 11:26Z; objectui#7610 claimed 5539774435 + dispatched 11:28Z (sonnet, XS; the parseJsonFence docblock count) and objectui#7618 claimed 5539774640 + dispatched 11:28Z (opus, XS; the never-approve rule into AGENTS.md § 受管面; governed); #15275 unruled; objectstack pm:queue empty); between patrols (11:36–11:47Z): the maintainer asked in chat 「16265 红了」 (no such number; read as PR #15265) — answered: red by design, the ratchet's single ✗ (397 vs 358) waiting on #15275, one-line ruling turns it green; objectui#7610 delivered 11:39Z → PR #7631 @2dff709ACCEPT 5539970183 (11:44Z; one docblock sentence, count-free form), flip once its 9 running checks are green — flip timer 11:59Z; objectui#7618 delivered 11:43Z → PR #7630 @646ce08ACCEPT 5539977834 (11:46Z) at the governed terminal, both approvers requested 11:46Z (the guard sentence copied whole from origin/main, including the em-dash clause the card had truncated); at the 11:59Z flip timer: objectui PR #7631 (#7610) 26 success + 3 skipped → flipped ready 12:00Z + armed 12:01Z ((method: , enabled at ), the flip-enqueued reading); #15275 RULED 1A · 2C (director os-warren 5539932805 at 11:41Z, maintainer batch #34, verbatim 「决裁批 #34 同意」) → four acts 12:01–12:03Z: ack 5540132745, #15275pm:queue → pm:dispatched (carrier, closes by hand with PR #15265), #15192pm:blocked → pm:dispatched (ack 5540133581), the patch round sent to the #15192 dev (ceiling row → 397 quoting the ruling, a second ruledRaises record +39, was stays 314, quota sentences untouched under 2C); the item-2 discriminating read proposed on the card as a same-minute pair (one MCP read + REST /rate_limit per seat) at 12:30:00Z — this seat's baseline at 12:01Z: MCP accepted, REST core 15000/15000; patrol #30 (12:11Z, text 12:14Z) fired and was worked (objectui PR #7631 queued, #7630 unapproved; PR #15265's patch round not yet pushed; #15275 no second seat yet; the lane read under duty ④ found three queued cards this seat had not carried on its board — #15087 (p2, the --is-ancestor shallow-clone guard), #14991 (the SHADOWED comment), #14942 (AGENTS.md hidden-tests wording) — all three claimed 5540306279 / 5540306959 / 5540307611 and dispatched 12:20Z (sonnet XS · opus XS governed · opus XS governed); and three bare findings of this lane's triaged 12:18Z into pm:queue: #15264 (SKILL_MAP census residue, p3, governed skills/**), #15125 (AGENTS.md commit-trailer form, p3, serial behind the two AGENTS.md flights), #15121 (list_issues labels is a UNION — a member of the FOURTH platform-readings increment, needs its own ceiling ruling)); the #15192 patch round delivered 12:22Z → PR #15265 @40cb0c59ACCEPT 5540356563 (12:27Z) at the governed terminal, both approvers requested 12:27Z (ratchet green: 397/397, move +10 less 73, was 314, quota sentences untouched); the 12:30Z discriminating read taken and posted on #15275 (5540455351: MCP get_me accepted — it answers os-steve, id 317605050, the identity every refusal named; REST core 15000/15000 at 12:30:36Z; no second seat yet); #14942 delivered 12:33Z → PR #15340 @392aa366ACCEPT 5540523689 (12:36Z) at the governed terminal, both approvers requested 12:36Z (the bullet rewritten in place, AGENTS.md still 1161 of 1162); objectui PR #7631 (#7610) MERGED 0b24d7f8 12:15:31Z by the queue → #7610 cleaned 12:45Z; #14991 delivered 12:41Z → PR #15345 @b0c247c6ACCEPT 5540617252 (12:44Z; comment-only, self-test 1382), flip once Lint & Repo Gates is green (patrol #31); #15087 delivered 12:44Z → PR #15355 @076ee33dACCEPT 5540631330 (12:47Z) at the governed terminal, both approvers requested 12:47Z (the --is-ancestor control clause in os-dev.md, 459 of 469); patrol #31 (13:01Z, text 13:03Z) fired and was worked (PR #15265 (#15192) MERGED dc46c4ec 12:56:03Z by os-zhuang after approving 12:22Z — platform-readings.md 397 on main, #15192 closed by Fixes and cleaned 13:04Z, the three member holds #13387 / #13257 / #15246 closed with the landed lines as evidence, #15275 kept open as item 2's carrier (note 5540845045); PR #15340 (#14942) approved 12:38Z and PR #15355 (#15087) approved 12:59Z by os-zhuang, both flipped ready by the approver — landing by the queue; PR #15345 (#14991) 23 success + 11 skipped → flipped ready 13:04Z + armed 13:04:32Z; objectui PR #7630 unapproved; #15361 unruled); two maintainer rulings in chat 13:1x–13:3xZ, both recorded on the corpus-audit anchor #13597 (5541159260): on the seat's core-vs-secondary reading of the PM corpus — 「各条规则的出处叙事、事故复盘 根本不重要啊,不需要写入skills啊」 (rules only, no narratives; supersedes the X0 date-plus-pointer policy where they differ) — and on the seat's three options — 「同意先做 A 的摘要」 (the plain-language 《核心条款》 digest first, reviewed instead of the corpus; the file rewrites follow it). Execution family #15379 filed 13:31Z (p1; members: 1 = the digest references/core-rules.md ≤150 lines, 1b = SKILL.md rewrite after the digest is approved, 2–3 = the references in two groups, 4 = os-dev.md, 5 = AGENTS.md; every member a governed draft with a rule-inventory table for human review; net shrink only; the frame block untouched), claimed 5541175284 + dispatched 13:35Z (opus, L); patrol #32send_later at 2026-09-04T13:54Z (trig_01PjtLvetT2ywtvwpWJpcFkh) — one flight in the air (the digest); duties: re-arm, the landings of PR #15340 / #15355 / #15345 → label-clean #14942 / #15087 / #14991, objectui PR #7630's landing → clean #7618, #15361's ruling → the SKILL_MAP flight, #15275 item 2's second reading, the #15125 budget re-measure once PR #15340 lands, the lane read if idle. — ≤45-min cadence while flights are in the air; duties: re-arm, the #15192 patch round → review → governed terminal, the three new deliveries → review, objectui PR #7631's landing → clean #7610, the 12:30Z discriminating read on #15275, the seat post. — ≤45-min cadence while flights are in the air; duties: re-arm, the two objectui deliveries → review (#7610 pure code → ready + queue; #7618 governed → both approvers), #15275's ruling → the #15192 patch round, and — the lane's queue being empty — one read of the open domain:skills cards and the finding pool for anything this seat can triage. Between patrols (07:47–07:52Z): PR #15073's queue build failed on a port-race flake in another lane's e2e (packages/cli/test/serve-publishes-bound-port.e2e.test.ts, expected 40733 got 40734; the PR's own paths are the role-word scripts) — removed from the queue 07:47:48Z, re-armed once 07:50Z (the one confirmation re-run the rules allow; a second failure is real), the flake filed for central triage; #15191 delivered → PR #15266 @e69c9623ACCEPT 5537438170 (07:52Z), flip once its two running checks are green; PR #15236 shows added_to_merge_queue 07:46:29Z with no queue ref yet (refs lag, re-read at patrol #25); the port-race flake filed as #15273 (bare finding, reads as domain:cli; adjacent #12884 is macOS-only); #15201 delivered 07:53Z → PR #15269 @1fcb7501ACCEPT 5537462124 (07:56Z), flip when green; its dev's finding #15270 (the spelling-less DECLARED-NARROWER row) triaged 07:58Z (5537466430) into this lane's queue behind PR #15269; #15192's measurement flight delivered 07:58Z → PR #15265 @40250c51 (+39/−0, 397 lines, red on the ratchet by design; verified) → decision card #15275 (batch 9, 2 items: the +39 ceiling raise, rec A; the MCP write-pool quota sentence collision, rec C) filed 08:02Z, #15192 → pm:blockedBlocked-by: #15275 (ack 5537495842); the dev's finding #15272 (check:pm-governed-merges reports an uninstalled worktree as a shrunken battery, exit 1 where its siblings exit 3) triaged 08:03Z (5537497047) and claimed 5537508646 + dispatched 08:06Z (opus, S; pure code) — the four round-5 flights all delivered, one new in the air; PR #15266 (#15191) 23 success + 11 skipped at 08:00Z → flipped ready 08:00:4xZ + auto-merge armed 08:01Z; PR #15269 (#15201) all green at 08:14Z (flip timer trig_016sfQNfMAh1rBcRNzKrdc1H fired 08:13Z) → flipped ready 08:14Z; the auto-merge arm hit the MCP window again (fifth time this shift) — retry at patrol #25; at 08:14Z the queue refs show pr-15073 and pr-15236 building at last, behind pr-15203; all three earlier PRs (#15073 re-added 07:50:07Z, #15203, #15236) read added_to_merge_queue with no removal — the queue holds them behind its five building entries, refs lag.
Decision box (this lane): #15361 (batch 10, 2 items) → 1A · 2A at 14:18Z (maintainer batch #36, director record by os-warren) — item 2 forked at execution 15:3xZ (46 transitive rows behind one pointer), back in the box with options A–D, seat rec D; item 1 done on the held PR #15424; #15275 (batch 9) → 1A · 2C at 11:41Z — item 1 LANDED 12:56Z (PR #15265); item 2 open (this seat's 12:30Z reading posted; waiting for a second seat's same-minute read, then a one-line A/B); #15075 filed 20:10Z — batch 8, 1 item (role-word baseline for the twelve quoted-history uses; rec A); #15013 filed 17:25Z — batch 7, 1 item (platform-readings ceiling +34; rec A); #14978 filed 16:19Z — batch 6, 3 items (①2 finding promotion, rec B; objectui#7506 extend 3B, rec A; check-ratchet-remedy-authority walk over scripts/pm/**, rec A measure-first); #14909 (batch 5, unruled). Dispositions recorded: #14445 ①1 not a decision (rule exists at lanes/spec.md:12 + SKILL.md:201-203; 5528699072), #14445 ② already ruled not_planned (#13901, 批 #13). Ruled by the director this shift and picked up: #14663 (16:10Z).
Lane snapshot at 2026-09-05T07:56Z (REST, labels= AND): objectstack domain:skillspm:queue unassigned 9, all folded or waiting (#15671 · #15670 · #15647 · #15357 · #15241 · #15125 · #14913 · #14768 · #14509; #15763 re-routed to devx 08:22Z); objectui domain:skillspm:queue unassigned 0; bare findings 0 in both repos.
PM corpus programme (#13597 anchor → #15379 family, rulings 2026-09-04 13:1xZ/13:3xZ): digest in flight; then SKILL.md · references ×2 · os-dev.md · AGENTS.md, each rules-only, plain language, human-reviewed by its rule inventory; ceilings re-locked once after the family.
Programme state (#14292): batches 1–4 ruled and executed (#14296 1A 2A 3A 4A, #14568 A, #14685 1A 2C 3B 4B 5A — item 5 landed 5bc2f27, #14859 B); batch 5 #14909 unruled; batch 6 #14978 filed. Standing condition (#14685 item 4): every brief pastes the internal-pm decision frame from origin/main SKILL.md verbatim, located by its anchor sentences, in the dispatch minute (all eight briefs this shift did; md5 b9a0de17… of :868-885 at 5bc2f27).
Bare for triage (objectstack): #14768 (since 09-03 00:19Z) · #14850 · #14869 · #14913 · #14984 (dev-filed 16:26Z, Blocked-by: #14867; the two prose mirrors of the governed repo set in .claude/**).
Harvested follow-ups: kept in body v22's "Follow-ups harvested" bullet (not re-copied); an item becomes a card only after a dedup at current main.
Hot-file serial queue
.claude/skills/spec-property-retirement/SKILL.md (337/337, headroom 0; row pin 328): PR #15566 MERGED 01:55Z → #15388 flight (launched 02:3xZ, line-neutral). skills/objectstack-platform/SKILL.md (12983 of 12984 tokens, headroom 1 — at its ceiling; the next addition pays with a trim or its own ceiling decision): PR #15625 MERGED 01:53Z — free. .claude/skills/pm-dispatch/SKILL.md (811/811, table pin 342) + references/state-machine.md (42/42): PR #15696 MERGED 04:24Z → #15404 flight (launched 04:4xZ) → #15647 section 2 (if ruled). scripts/pm/check-half-states.mjs + ensure-pm-labels.sh: PR #15795 (#15744) MERGED 09:13Z — free. skills/objectstack-automation/SKILL.md (12305 of 12768 tokens): PR #15524 MERGED 02:07Z → #14483 + #14966 flight (launched 02:4xZ). skills/objectstack-data/references/data-hooks.md: spec lane's draft PR #15626 → #14483 point 2. .claude/agents/os-dev.md (403/403 on PR #15725): member 4 at the governed terminal, readied by the approver; skills/objectstack-platform/references/_index.md: held PR #15424 (#15361 fork) — disjoint file.
objectui .claude/hooks/guard-shared-stash.sh + .selftest.sh: PR #7695 (#7441) at the governed terminal (03:5xZ). docs/adr/0130-…: PR #15704 (#15453) MERGED 05:02Z — free; docs/adr/0131-…: devx PR #15612 → #15453's ADR-0131. objectui .claude/hooks/guard-main-checkout.sh + .selftest.sh and objectstack .claude/hooks/guard-main-checkout.sh + .selftest.sh: PR #7686 / PR #15665 at the governed terminal (02:4xZ; #15665 approved and ready 03:2xZ) → #7259 + #11809 (serial; also guard-main-checkout-bash.sh:339 in both repos). packages/spec/scripts/build-skill-references.ts + the api/platform _index.md: PR #15424 patch round (#15361 D) in flight.
.claude/skills/pm-dispatch/references/{platform-readings,rest-channel,release-aftercare,true-green,compile-surfaces}.md + references/lanes/*.md (13 files) + their 13 rows in scripts/pm/check-skill-line-ratchet.mjs: PR #15641 (member 3) — approved and enqueued by os-zhuang 01:44Z, removed 02:22Z as dirty; re-merged at 4008475c8 (clean, green) and verified 02:5xZ; awaiting the approver's re-enqueue. After it: the programme's one re-lock pass.
scripts/pm/dispatch-gates.mjs: PR #15801 (#15753) in the queue since 09:02Z (REST showed auto_merge null while it was queued — a known reading, not a drop). AGENTS.md (1161 of 1162, unchanged by the landing): PR #15340 (#14942) MERGED 13:18Z — free; .claude/agents/os-dev.md (459 of 469): PR #15355 (#15087) MERGED 13:35Z — free. #15125 (AGENTS.md, needs a line): headroom is still 1 after PR #15340 (it deleted nothing), so it is folded into the AGENTS.md member of #15379 (the rules-only rewrite nets lines) unless the maintainer rules a ceiling raise first; it stays pm:queue until that member is dispatched. #15121 (list_issues labels union — a fourth platform-readings increment) is folded the same way into the platform-readings member of #15379 (rules-only rewrite, net shrink: the reading is carried as one line, no ceiling raise), pm:queue until that member is dispatched. scripts/pm/bare-root-worklist.mjs: PR #15314 (#15270) MERGED eb40a721 11:12Z — free. scripts/check-skill-frame-sync.mjs: PR #15060 MERGED 20:09Z — free. scripts/check-role-word.mjs + scripts/check-corpus-claim-drift.mjs + scripts/role-word-baseline.json: PR #15073 (#15061) MERGED c0d32cda 08:36Z — free. skills/objectstack-data/references/data-hooks.md: PR #15186 (#15177) MERGED 06:22Z — free. scripts/pm/check-governed-queue-guard.mjs + .claude/hooks/guard-governed-enqueue.{sh,selftest.sh} + AGENTS.md:311-313 + SKILL.md:729: PR #15203 (#15187 + #15209) MERGED 6530f757 08:14Z — free. objectui scripts/check-governed-queue-guard.mjs: PR #7606 (objectui#7601) MERGED 0d8fd7ce 07:09Z — free; objectui AGENTS.md: PR #7630 (objectui#7618) MERGED, cleaned 13:39Z; PR #7640 (objectui#6997, the changeset-population sentence under Housekeeping) at the governed terminal 13:52Z — draft, ACCEPT posted, os-zhuang + hotlong requested, human merge; objectui scripts/check-skill-examples.mjs: PR #7631 (objectui#7610) MERGED 0b24d7f8 12:15Z — free. scripts/check-ratchet-remedy-authority.mjs (+ one remedy string in dispatch-gates.mjs): PR #15199 (#15179) MERGED 3933819c 07:08Z — free (#15201, the worklist row, dispatched 07:2xZ). objectui CLAUDE.md: PR #7600 (objectui#7506) MERGED c70ebaae 05:44:59Z by os-zhuang, #7506 cleaned — free.
scripts/pm/check-governed-merges.mjs: PR #15283 (#15272) MERGED 5b09356b 09:28Z — free. .claude/skills/pm-dispatch/SKILL.md:723 + .claude/hooks/guard-governed-enqueue.sh:54: PR #15031 (#14984) MERGED b17cdea0 04:06Z by os-zhuang, #14984 cleaned — free. .github/workflows/half-state-patrol.yml: PR #15000 MERGED 17:59Z — free; scripts/pm/check-half-states.mjs: free (untouched by #14881). scripts/pm/ensure-pm-labels.sh: PR #15014 MERGED 18:37Z — free; landing step owed: a seat with gh runs the seeder's --reconcile against the five repos (this container has no gh). .github/workflows/stale.yml: PR #15016 MERGED 18:37Z — free.
references/platform-readings.md (358/358): PR #15265 (#15192) MERGED dc46c4ec 12:56Z by os-zhuang — 397/397, free; the fourth increment (#15121) is folded into the platform-readings member of #15379 (rules-only rewrite, net shrink — the reading is one line, no ceiling raise); behind it: the four prior-regime holds' facts, the re-lock pin PR. references/contract-review.md + scripts/pm/check-skill-line-ratchet.mjs (ceiling map) + scripts/pm/check-clause2-carriers.mjs: PR #14999 MERGED 18:18Z — PR #15266 (#15191) MERGED 0e24b0c2 08:40Z — the #15192 patch round (PR #15265) carried the 397 row and the second ruledRaises record — MERGED 12:56Z; #14870's :540 comment next (after PR #15038 lands, its other site). references/dispatch-runbook.md (280/280 at the PR head): **PR #15057 (#14869): approved by os-zhuang three times and enqueued three times (03:41Z, 04:46Z, 05:16Z), removed by the queue twice (04:07:50Z, 05:14:16Z) — the maintainer asked at 05:19Z why it never merges. Root cause reproduced by the seat: check-skill-frame-sync reds on the QUEUE build only — the bullet's paste anchor 「每个方案必须沿四条固定评估轴分析…」 trips the undeclared-copy detector since PR #15060 widened the scan to references/ after this head was built (the PR's own CI predates #15060); approvals were never the blocker (the governed guard passed on every queue build). Patch round sent to the #14869 dev 05:19Z (merge main, re-anchor the bullet without the frame's marker phrases, four lines at 280/280, frame-sync green on the merged tree, push; note on the PR 5536069697); the approver re-approves after the push. Maintainer's two chat messages relayed verbatim: 「15057 我批准了很多轮,一直合并不了」 · 「你的门禁有问题,只需要有人工批准记录就行,不需要卡最新的提交。」 — the seat's reading at that minute: the frame-sync check, not the approval gate, is what reds on THIS PR — and the instruction names a real property of the queue guards, executed as #15187 / objectui#7601. Patch landed 05:56:55Z: head ea53bae5 (merge ba86720d + re-anchored bullet, zero fingerprints, frame-sync green on the merged tree, 280/280), verified by the seat 06:01Z (note 5536400751); one fresh approval on the new head lands it — review re-requested from os-zhuang; the seat does not re-enqueue a red PR while a patch round flies (GH006: a queued branch cannot be pushed).MERGED 1bc3c092 06:49:25Z; #14869 closed by Fixes and cleaned 07:05Z — free..claude/agents/os-dev.md + AGENTS.md (footer rule home :485-500): PR #15015 (#14997) approved + enqueued by os-zhuang 02:47Z, MERGED 3b34cef9 03:40:06Z, #14997 closed by Fixes and label-cleaned 03:55Z — free.
Programme rules: one flight per published package; splits add ceiling rows pinned at landed counts and never edit other rows; ceiling re-locks once, after the flights; the line ratchet is never edited by a programme flight (#14209 is a ruled raise, not a programme flight).
Notes
Job description: references/lanes/skills.md. 留守登记: os-litant (session_01LraLgQVGq8egUwfYZpbYt1) on objectui PR #7473 and the label bookkeeping of #14793 / #14685, from 15:24Z. Heavy slots = 5. Contract-review fuse: get_session 15:52Z reads session_context.model = last_served_model = claude-fable-5-1; CONTRACT_REVIEW_TIER at origin/main5bc2f27 names the same value — reading = constant; every review this shift done in-seat at that tier. Channel facts this container (16:27Z; 17:1xZ a dev's container refused the additive REST label endpoint and plain curl reads mid-run — the dev fell back to the MCP whole-group label replace with comparative read-back, so REST is per-container, not a given): repo-scoped REST answers 200 (reviewer requests go through POST /pulls/{n}/requested_reviewers, draft bit untouched; devs write labels through the additive endpoint); /rate_limit core 15000 / graphql 10000 at 16:29Z. Governed-merge audit run 16:14Z over the v22 window (checkouts deepened to 700 / 400 commits first): 57 governed merges, os-zhuang 53 · hotlong 3 · os-project-manager 1 (PR #14784, 09:56Z — for the maintainer's recognition); cloud / objectos UNAUDITED (no checkout); next round, exactly: --since-ref objectstack=5bc2f2727aef --since-ref objectui=0e3b3be09fef. UNRECOGNISED lines: dev gate logs are not retained — NOT MEASURED. Half-state anchor #9857 (swept 19:46Z, commit 101ad2cc): one row names this lane — H26 on #14133 (pm:blocked on #15013, a needs-user-decision card, which the sweeper reads as a block with no closing mechanism; it says so is not a judgement that the block is wrong). Seat's reading: the release mechanism is this seat closing #15013 once the maintainer rules, which unblocks the eight family cards in one write — state kept as is, no pm:on-hold conversion. Update 07:2xZ: #15013 is closed and the family landed, so the three H26 rows dissolve at the next sweep (07:37Z). No row names this post, a queued card, or any in-flight card; the earlier H35 rows (PRs #14860 / #14911 / #14953) are gone with their merges. Standing facts: value gate + reject authority from #13597 in force; scripts/docs-audit/handwritten-docs.json NON-governed by ruling; published skills/** governed in objectui too; scripts/pm/** pure-code PRs land by in-seat contract-tier review → ready → queue (2026-08-26 md-content split), any .md in the diff ⇒ draft at the governed terminal; check:platform-checklist is a maintainer-run gate (lint.yml:2226-2231), red on main for four UNCLASSIFIED kinds (#14961, another seat's). Prior body revisions carry earlier running states — compacted 08:3xZ after the 08:28:29Z write came back 58 chars short (the trailing footer block dropped once the body passed ~65.7k chars; every earlier write read back identical), so rounds 1–4 and patrols #1–#22 live in the 08:14:52Z revision.
This post is the single authoritative registration of the skills seat. Four-section template; the job description is versioned at
.claude/skills/pm-dispatch/references/lanes/skills.md— ⛔ not copied here.Current PM
🟢 os-steve — session
session_019RfFHiRCSs3JXLK4cwcfox, assumed 2026-09-03T15:58Z, maintainer-invoked interactive session (/pm-dispatch skills). Maintainer's in-session directive this shift (verbatim, untranslated): 「前任只处理收尾任务,你可以接班」 (15:4xZ). Previous PM os-litant (sessionsession_01LraLgQVGq8egUwfYZpbYt1, 2026-09-02T01:12Z → 2026-09-03T15:24Z): its shift is archived in body revision v22 (2026-09-03T15:24Z) and its briefing (comment 5528132029); its inherited directives (programme #14292 「审核所有的 skills,进行全面的优化。」; heavy slots = 5 from 「90分钟后,并发加到5」) carry forward. Round-open marker = takeover comment 5528395616. Round reports (中文) in chat at 16:15Z. Readings carry the UTC minute they were taken. Timers: patrols #1–#22 (2026-09-03 16:48Z → 2026-09-04 06:13Z) fired and were worked — their per-patrol notes are archived in the body revision of 2026-09-04T08:14:52Z; patrol #23 (06:50Z) was absorbed into the seat's running turn (no separate wake; its duties done 06:52–07:25Z: the PR #15073 patch round reviewed → ACCEPT 5536878505, flipped ready 07:04Z, auto-merge arm blocked by the MCP window (fourth time this shift) — retry at patrol #24; PR #15190 (#14133 family) MERGED96b4af8806:46:32Z → the eight cards closed byFixesand cleaned 07:05Z, #15013 closed by hand 5537016599, #13373 / #13385 closed on the L149 + L152 evidence, #13387 / #13257 →pm:blockedBlocked-by: #15192; PR #15057 (#14869) MERGED1bc3c09206:49:25Z → #14869 cleaned; PR #15199 (#15179) MERGED3933819c07:08:22Z → #15179 cleaned, #14978 closed by hand 5537046171; objectui PR #7606 (#7601) flipped 06:58Z + armed 07:00Z, in objectui's queue; #15187 + #15209 → PR #15203 @0a8763f6ACCEPT 5536999727 at the governed terminal, both approvers requested 07:12Z; #14899 → PR #15236 @ff0c7a56ACCEPT 5537016483, flip waits on Lint & Repo Gates; #15191 + #15201 claimed 5537055279 / 5537056009 and dispatched 07:2xZ; objectui PR #7606 (#7601) MERGED0d8fd7ce07:09:49Z → #7601 cleaned 07:21Z, objectui#7605 claimed 5537133758 + dispatched 07:23Z; PR #15236 all green at 07:19Z — its flip blocked by the MCP window (fourth time, still shut at 07:24Z), retried at patrol #24; PR #15073 IS in the queue (pr-15073ref read 07:23Z — the 06:5xZ arm enqueued it although the PR object readsauto_merge: null, the recorded platform reading); patrol #23's trigger text arrived late at 07:23Z (queued 06:50:36Z) — every duty it lists was already done, idempotently re-read; #15192 claimed 5537175855 + dispatched 07:27Z as a measurement-first flight (opus, S; the increment written and wrapped, the PR red on the ratchet by design until the maintainer sizes the raise); #15246 (services seat's footer finding, the skills seat named as reader) triaged 07:28Z →pm:blockedon #15192; objectui#7605 delivered 07:41Z → PR #7616 @8d78dbdACCEPT 5537375216 at the governed terminal, both approvers requested 07:47Z; its dev's residues: objectui#7618 triaged into the queue behind PR #7616, a cross-lane note on objectui#7089 (5537365534)); at 07:45Z the MCP window had reset: PR #15236 (#14899) flipped ready 07:45:2xZ + auto-merge armed 07:45:40Z (read-backmethod: MERGE, the recorded platform reading — not re-armed); PR #15203 (#15187 + #15209) was APPROVED by os-zhuang on0a8763f6at 07:15Z and flipped + enqueued by the approver —pr-15203in the queue behindpr-15073at 07:45Z, both landing by the queue; patrol #24 (07:45Z) fired while the seat was mid-turn and its duties were done in that turn (objectui#7605 → PR #7616 ACCEPT at the governed terminal; PR #15236 flipped + armed; PR #15203 read approved + queued; seat post 07:46Z); patrol #25 (08:27Z) fired and was worked (PR #15203 (#15187 + #15209) MERGED6530f75708:14:18Z by the queue — both cards closed byFixesand cleaned 08:28Z, so objectstack's governed guard now carries the unpinned predicate; PR #15073 / #15236 building in the queue, PR #15266 queued behind them (pr-15266ref 08:27Z); PR #15269 ready, its auto-merge arm blocked by the MCP window again at 08:27Z (sixth refusal this shift) — retry at patrol #26; #15275 unruled; objectui PR #7608 / #7616 unapproved; the 07:48Z half-state sweep (run 33850071955, commit460134af) names no card of this lane — the three H26 rows are gone with #15013 / #14978, the one H35 row is #15204, another seat's); between patrols (08:31–08:46Z): PR #15236 (#14899) MERGED5e724a2608:34:04Z, PR #15073 (#15061) MERGEDc0d32cda08:36:21Z, PR #15266 (#15191) MERGED0e24b0c208:40:32Z — the three cards closed byFixesand cleaned 08:43Z; PR #15269's arm refused by the MCP window again at 08:42Z (seventh); #15272 delivered 08:40Z → PR #15283 @d510d4ecACCEPT 5537969400 (08:45Z; the seat reproduced the exit-3 refusal in its uninstalled compare worktree), all green at 08:58Z → flipped ready 08:58Z + auto-merge armed 08:58:22Z (flip timertrig_01DWZfrYavnyic3AfDsgisQxfired 08:57Z); PR #15269's auto-merge armed 08:58Z at last —(method: , enabled at ), the flip-enqueued reading; both in the queue; patrol #26 (09:08Z, text delivered 09:10Z) fired and was worked (nothing landed in the window:pr-15269andpr-15283building in the queue behindpr-15157; #15275 unruled; objectui PR #7608 / #7616 and PR #15265 unapproved; in-flight 0 of 5); patrol #27 (09:51Z) fired and was worked (PR #15269 (#15201) MERGED0cbd5f26and PR #15283 (#15272) MERGED5b09356b, both 09:28:06Z by the queue — the two cards closed byFixesand cleaned 09:52Z; #15270 claimed 5538773085 + dispatched 09:54Z (opus, XS; the spelling-less DECLARED-NARROWER row measured and pinned; pure code); #15275 unruled; objectui PR #7608 / #7616 and PR #15265 unapproved); #15270 delivered 10:30Z → PR #15314 @9b576972ACCEPT 5539197077 (10:32Z), flip once its 10 running checks are green; patrol #28 (10:37Z) fired and was worked (PR #15314's CI still running 4 of 29 at 10:38Z; at the 10:51Z flip timer (trig_011DtyXwYUFTqxRwM6vwgf9E) 22 success + 8 skipped → flipped ready 10:52Z + auto-merge armed 10:52Z; #15275 unruled; objectui PR #7608 / #7616 and PR #15265 unapproved; in-flight 0 of 5; objectstackpm:queueempty); patrol #29 (11:24Z) fired and was worked (PR #15314 (#15270) MERGEDeb40a72111:12:23Z by the queue → #15270 cleaned 11:26Z; objectui PR #7608 (#7474) MERGED89d6adf310:58:08Z and PR #7616 (#7605) MERGED11edab8811:00:03Z by os-zhuang after approving both 10:44Z → #7474 / #7605 cleaned 11:26Z; objectui#7610 claimed 5539774435 + dispatched 11:28Z (sonnet, XS; theparseJsonFencedocblock count) and objectui#7618 claimed 5539774640 + dispatched 11:28Z (opus, XS; the never-approve rule into AGENTS.md § 受管面; governed); #15275 unruled; objectstackpm:queueempty); between patrols (11:36–11:47Z): the maintainer asked in chat 「16265 红了」 (no such number; read as PR #15265) — answered: red by design, the ratchet's single ✗ (397 vs 358) waiting on #15275, one-line ruling turns it green; objectui#7610 delivered 11:39Z → PR #7631 @2dff709ACCEPT 5539970183 (11:44Z; one docblock sentence, count-free form), flip once its 9 running checks are green — flip timer 11:59Z; objectui#7618 delivered 11:43Z → PR #7630 @646ce08ACCEPT 5539977834 (11:46Z) at the governed terminal, both approvers requested 11:46Z (the guard sentence copied whole from origin/main, including the em-dash clause the card had truncated); at the 11:59Z flip timer: objectui PR #7631 (#7610) 26 success + 3 skipped → flipped ready 12:00Z + armed 12:01Z ((method: , enabled at ), the flip-enqueued reading); #15275 RULED 1A · 2C (director os-warren 5539932805 at 11:41Z, maintainer batch #34, verbatim 「决裁批 #34 同意」) → four acts 12:01–12:03Z: ack 5540132745, #15275pm:queue→pm:dispatched(carrier, closes by hand with PR #15265), #15192pm:blocked→pm:dispatched(ack 5540133581), the patch round sent to the #15192 dev (ceiling row → 397 quoting the ruling, a secondruledRaisesrecord +39,wasstays 314, quota sentences untouched under 2C); the item-2 discriminating read proposed on the card as a same-minute pair (one MCP read + REST/rate_limitper seat) at 12:30:00Z — this seat's baseline at 12:01Z: MCP accepted, REST core 15000/15000; patrol #30 (12:11Z, text 12:14Z) fired and was worked (objectui PR #7631 queued, #7630 unapproved; PR #15265's patch round not yet pushed; #15275 no second seat yet; the lane read under duty ④ found three queued cards this seat had not carried on its board — #15087 (p2, the--is-ancestorshallow-clone guard), #14991 (the SHADOWED comment), #14942 (AGENTS.md hidden-tests wording) — all three claimed 5540306279 / 5540306959 / 5540307611 and dispatched 12:20Z (sonnet XS · opus XS governed · opus XS governed); and three bare findings of this lane's triaged 12:18Z intopm:queue: #15264 (SKILL_MAP census residue, p3, governedskills/**), #15125 (AGENTS.md commit-trailer form, p3, serial behind the two AGENTS.md flights), #15121 (list_issueslabels is a UNION — a member of the FOURTH platform-readings increment, needs its own ceiling ruling)); the #15192 patch round delivered 12:22Z → PR #15265 @40cb0c59ACCEPT 5540356563 (12:27Z) at the governed terminal, both approvers requested 12:27Z (ratchet green: 397/397, move +10 less 73,was314, quota sentences untouched); the 12:30Z discriminating read taken and posted on #15275 (5540455351: MCPget_meaccepted — it answersos-steve, id 317605050, the identity every refusal named; REST core 15000/15000 at 12:30:36Z; no second seat yet); #14942 delivered 12:33Z → PR #15340 @392aa366ACCEPT 5540523689 (12:36Z) at the governed terminal, both approvers requested 12:36Z (the bullet rewritten in place, AGENTS.md still 1161 of 1162); objectui PR #7631 (#7610) MERGED0b24d7f812:15:31Z by the queue → #7610 cleaned 12:45Z; #14991 delivered 12:41Z → PR #15345 @b0c247c6ACCEPT 5540617252 (12:44Z; comment-only, self-test 1382), flip once Lint & Repo Gates is green (patrol #31); #15087 delivered 12:44Z → PR #15355 @076ee33dACCEPT 5540631330 (12:47Z) at the governed terminal, both approvers requested 12:47Z (the--is-ancestorcontrol clause in os-dev.md, 459 of 469); patrol #31 (13:01Z, text 13:03Z) fired and was worked (PR #15265 (#15192) MERGEDdc46c4ec12:56:03Z by os-zhuang after approving 12:22Z —platform-readings.md397 onmain, #15192 closed byFixesand cleaned 13:04Z, the three member holds #13387 / #13257 / #15246 closed with the landed lines as evidence, #15275 kept open as item 2's carrier (note 5540845045); PR #15340 (#14942) approved 12:38Z and PR #15355 (#15087) approved 12:59Z by os-zhuang, both flipped ready by the approver — landing by the queue; PR #15345 (#14991) 23 success + 11 skipped → flipped ready 13:04Z + armed 13:04:32Z; objectui PR #7630 unapproved; #15361 unruled); two maintainer rulings in chat 13:1x–13:3xZ, both recorded on the corpus-audit anchor #13597 (5541159260): on the seat's core-vs-secondary reading of the PM corpus — 「各条规则的出处叙事、事故复盘 根本不重要啊,不需要写入skills啊」 (rules only, no narratives; supersedes the X0 date-plus-pointer policy where they differ) — and on the seat's three options — 「同意先做 A 的摘要」 (the plain-language 《核心条款》 digest first, reviewed instead of the corpus; the file rewrites follow it). Execution family #15379 filed 13:31Z (p1; members: 1 = the digestreferences/core-rules.md≤150 lines, 1b = SKILL.md rewrite after the digest is approved, 2–3 = the references in two groups, 4 = os-dev.md, 5 = AGENTS.md; every member a governed draft with a rule-inventory table for human review; net shrink only; the frame block untouched), claimed 5541175284 + dispatched 13:35Z (opus, L); patrol #32send_laterat 2026-09-04T13:54Z (trig_01PjtLvetT2ywtvwpWJpcFkh) — one flight in the air (the digest); duties: re-arm, the landings of PR #15340 / #15355 / #15345 → label-clean #14942 / #15087 / #14991, objectui PR #7630's landing → clean #7618, #15361's ruling → the SKILL_MAP flight, #15275 item 2's second reading, the #15125 budget re-measure once PR #15340 lands, the lane read if idle. — ≤45-min cadence while flights are in the air; duties: re-arm, the #15192 patch round → review → governed terminal, the three new deliveries → review, objectui PR #7631's landing → clean #7610, the 12:30Z discriminating read on #15275, the seat post. — ≤45-min cadence while flights are in the air; duties: re-arm, the two objectui deliveries → review (#7610 pure code → ready + queue; #7618 governed → both approvers), #15275's ruling → the #15192 patch round, and — the lane's queue being empty — one read of the opendomain:skillscards and thefindingpool for anything this seat can triage. Between patrols (07:47–07:52Z): PR #15073's queue build failed on a port-race flake in another lane's e2e (packages/cli/test/serve-publishes-bound-port.e2e.test.ts, expected 40733 got 40734; the PR's own paths are the role-word scripts) — removed from the queue 07:47:48Z, re-armed once 07:50Z (the one confirmation re-run the rules allow; a second failure is real), the flake filed for central triage; #15191 delivered → PR #15266 @e69c9623ACCEPT 5537438170 (07:52Z), flip once its two running checks are green; PR #15236 showsadded_to_merge_queue07:46:29Z with no queue ref yet (refs lag, re-read at patrol #25); the port-race flake filed as #15273 (barefinding, reads asdomain:cli; adjacent #12884 is macOS-only); #15201 delivered 07:53Z → PR #15269 @1fcb7501ACCEPT 5537462124 (07:56Z), flip when green; its dev's finding #15270 (the spelling-less DECLARED-NARROWER row) triaged 07:58Z (5537466430) into this lane's queue behind PR #15269; #15192's measurement flight delivered 07:58Z → PR #15265 @40250c51(+39/−0, 397 lines, red on the ratchet by design; verified) → decision card #15275 (batch 9, 2 items: the +39 ceiling raise, rec A; the MCP write-pool quota sentence collision, rec C) filed 08:02Z, #15192 →pm:blockedBlocked-by: #15275(ack 5537495842); the dev's finding #15272 (check:pm-governed-mergesreports an uninstalled worktree as a shrunken battery, exit 1 where its siblings exit 3) triaged 08:03Z (5537497047) and claimed 5537508646 + dispatched 08:06Z (opus, S; pure code) — the four round-5 flights all delivered, one new in the air; PR #15266 (#15191) 23 success + 11 skipped at 08:00Z → flipped ready 08:00:4xZ + auto-merge armed 08:01Z; PR #15269 (#15201) all green at 08:14Z (flip timertrig_016sfQNfMAh1rBcRNzKrdc1Hfired 08:13Z) → flipped ready 08:14Z; the auto-merge arm hit the MCP window again (fifth time this shift) — retry at patrol #25; at 08:14Z the queue refs showpr-15073andpr-15236building at last, behindpr-15203; all three earlier PRs (#15073 re-added 07:50:07Z, #15203, #15236) readadded_to_merge_queuewith no removal — the queue holds them behind its five building entries, refs lag.Inherited + running ledger
git log -Sreports the horizon commit as the introduction of far older text — exit 0, plausible sha, plausible date, no warning — and the os-dev contract carries no guard for dating history #14793 MERGED338649315:19Z; PR tooling(pm): admit a same-PR cross-file line-budget move, and take the first one #14860 → [Decision] Skills optimization program — batch 3 (5 items): DATA-F-07defineHook()vs the platform's own examples · #13597 Phase-2 — X0 quote policy ·CLAUDE.mdexcerpt form · the four-copy decision frame · cross-file line-budget moves #14685 item 5 MERGED5bc2f2715:54Z; objectui PR docs(spec): make submitBehavior's TSDoc state the mode-aware default #7473 (→ objectui#7462) MERGED ~05:00Z by an approver after four approvals by os-zhuang while its head moved (the shape behind the maintainer's queue-guard instruction, now check-governed-queue-guard: an authorised APPROVED review satisfies the merge-queue leg regardless of commit_id — maintainer 2026-09-04: a human approval record suffices, never pinned to the latest commit #15187 / objectui#7601). The linger never posted its 尾清 note; this seat cleared objectui#7462'spm:dispatchedresidue 05:35Z and queued objectui#7474 05:36Z. Nothing of the linger's remains open.Plugin.typeasstringwith the set in a comment — the published field is now the closedPluginType#14589 → PR docs(skills): spell Plugin.type as PluginType in objectstack-platform #14981 · [finding].claude/launch.jsonships apr3505-attach-3477config pointing at a worktree that does not exist — a checked-in launch entry outlives the tree it names #14596 → PR chore(claude): prune the dead launch.json entry, and the convention that left it #14979 · [finding] SWEEP.md step 6 sends every sweep agent to land a run record underruns/, which is.gitignored with*— the instruction cannot be obeyed #14595 → PR docs(qa): step 6 of the coverage sweep no longer sends the run record to a git-ignored dir #14983 · check-governed-merges has no coverage forhotcrm, a repo whose AGENTS.md is hand-merged as governed — the audit cannot report a gap it was never pointed at #14867 → PR tooling(pm): governhotcrmin check-governed-merges (#14867) #14987 · [finding]selfTest()inscripts/pm/dispatch-gates.mjsbinds fixture values torelativeandresolve, shadowingnode:pathfor the whole function — a later case calling either dies at run time, invisible tonode --check#14688 → PR tooling(pm): take node:path as a namespace in dispatch-gates so no fixture can shadow it #14988 · [finding] The in-seat contract-review path was read as "the implementing session reviews its own diff" — PR #14191 was PASSed and label-cleared by its author session, dropping the independence clause and the director seat's never-writes-code charter in one act #14209 → PR tooling(pm): the review-verdict independence pair, and a subagent read by its branch #14999 · [finding] Two binding instructions disagree about model identifiers in commit trailers — the harness mandates aCo-Authored-Bynaming the model, the repo rule forbids model identifiers in pushed artifacts #14663 → PR docs(pm): narrow the model-identifier rule to content artifacts, with both carve-outs #14995 · Publish the transition-gate vs invariant tool-choice line in the data-modeling skill (deliverable 2 of #13879) #14893 → PR docs(skills): the invariant tool freezes a violating row, it does not brick it — and name the "required when X" trap #15010 · [finding] The attribution footer is appended on the CREATE path too — a hand-written one lands doubled on every PR body and report comment, with no PATCH involved #14997 → PR docs(agents): the attribution footer is a block — blank line, rule, footer — and only that shape is recognised #15015 ·hotcrmhas no half-state patrol anchor, so thepm:dispatched+ assignee residue after aFixesauto-close has now been repaired by hand seven rounds running #14881 → PR tooling(pm): name the sweeper's third file in the half-state patrol's adopt list #15000 · [finding]trackingis a prerequisite of every half-state patrol install andensure-pm-labels.shseeds it to no repo — the adopt recipe asks for a label the fleet's own seeder never creates #15001 → PR fix(pm): seed thetrackinglabel in ensure-pm-labels.sh's five-repo loop #15014 · [finding] The half-state patrol's anchor is not exempt from the stale bot — it survives only while the patrol is alive, so a dead patrol has its own gravestone auto-closed #15002 → PR fix: exempt the half-state patrol's anchor from the stale bot #15016 · [finding] two prose statements of the governed REPO set live outside the register and go stale when #14867 lands —pm-dispatch/SKILL.md:723andguard-governed-enqueue.sh:54, with no gate on either #14984 → PR docs(pm): point the governed repo set prose at GOVERNED_REPOS instead of mirroring it #15031 · dispatch-gates:--tier --residuesilently drops--residue— the neighbouring silent-flag-drop that #14294's repair does not reach #14753 → PR tooling(pm): refuse--tier --residuein dispatch-gates instead of dropping the modifier #15038 · skills/objectstack-data: the validation rule-type table never says WHICH record each type judges —format/json_schemaread the write payload,script/cross_fieldthe merged record #15011 → PR docs(skills): state which record each validation rule type is judged against #15046 · The internal dispatch runbook has no step that pastes the decision frame into the dev prompt — after #14685 item 4 (PR #14862) the dev definition expects it there and has no copy of its own #14869 → PR docs(pm): runbook step that pastes the decision frame into every dispatch prompt #15057 · check:skill-frame-sync cannot see any references/ subtree - 32 of 72 hand-written markdown files under its two scan roots, incl. all 12 published skill reference pages, are invisible to the anti-dormancy scan #15056 → PR fix(tooling): walk the references/ subtrees in check:skill-frame-sync #15060 · [finding] dispatch-gates --commands does not derive check:optional-error-sink for a diff that adds a new logger-sink interface #14880 (+ [finding] dispatch-gates usage line still advertises--tier --residueas combinable after the pair became a refusal #15036) → PR tooling(pm): key the gate derivation on (script, args) and name the artifact-roster silences #15081 · check:role-word and check:corpus-claim-drift skip every references/ directory, so 12 of 46 published-catalog markdown files - incl. both hand-authored reference companions - are invisible to both scans #15061 → PR fix(gates): scan the published catalog's references/ in role-word and corpus-claim-drift #15073 · objectui#7550 → PR The H2 half-state predicate is blind to two MORE claim spellings in live use — measured, 9 of 22 pm-tracked cards are false positives after #7488's fix #7553 · [finding] Four gate-script comments still say the decision frame has "four" / "two enforced" copies after #14685 item 4 reduced COPIES to two —dispatch-gates.mjs:8090/:8095,check-skill-line-ratchet.mjs:455,check-skills-token-ratchet.mjs:334/:345/:359#14870 → PR fix(pm): correct stale four/two-copy decision-frame comments to two-copy truth #15105 · [finding] dispatch-gates: nine scripts whose only CI invocations carry a value or a continuation still derive under a bare key CI never runs bare — rendering workflow-variable argv is a design call #15083 → PR tooling(pm): render a value-bearing CI invocation instead of falling back to a bare key #15114 · dispatch-gates: a tail cut at a paren or holding an unclosed quote classifies as LITERAL and would render a truncated key into --commands — latent, absent on the tree at e98bfc87 #15116 → PR tooling(pm): refuse to render a tail the cut left unresolved #15126 · bare-root-worklist keys verdicts per family, so a gate CI invokes two ways owes two identical rows — key the sweep on the gate source file and fold the nine twins without stranding them #15091 → PR tooling(pm): key the bare-root worklist on the gate source file, folding the invocation twins #15127 · bare-root-worklist: a recorded deferral reason prices itself at "nine rows across three gates", which the tree has not matched since the derivation grew a second key #15128 → PR tooling(pm): re-count the ADR-0087 manifests deferral to six rows across two source files #15164 · [finding] dispatch-gates --ran has an explained bucket for CI-measured and pending families but not for the value-bearing class, so a recorded one reads asextra#15115 → PR tooling(pm): give dispatch-gates --ran an explained bucket for the value-bearing class #15165 · objectui#7557 → PR showcase authoring gap: the ops dashboard's global filter isfield:'status'with *task* statuses, and the project widgets carry nofilterBindings— so it also lands onshowcase_project.statusand zeroes those tiles #7568 · objectui#7555 → PR finding (QA harness):nav-surfaces-render's one red assertion is the test's own timing race — pollboundingBoxuntil non-null instead of a fixed 1500 ms wait #7569. Merge shas: docs(skills): spell Plugin.type as PluginType in objectstack-platform #14981f28eb1df· tooling(pm): refuse--tier --residuein dispatch-gates instead of dropping the modifier #1503810641869· tooling(pm): refuse to render a tail the cut left unresolved #151268f68e508· tooling(pm): re-count the ADR-0087 manifests deferral to six rows across two source files #15164476c3733.skills/**) claimed 5535911164 + dispatched 05:06Z (opus, S; branchclaude/issue-15177-data-hooks-role-vocabulary; one retirement note + one warning kept, the rest in ADR-0090 D3 vocabulary, expected residue 3–4; draft + both approvers); check:role-word and check:corpus-claim-drift skip every references/ directory, so 12 of 46 published-catalog markdown files - incl. both hand-authored reference companions - are invisible to both scans #15061 →pm:blockedBlocked-by: #15177(director's label, the seat synced the body + note 5535917227); PR fix(gates): scan the published catalog's references/ in role-word and corpus-claim-drift #15073 gets its patch round (mergemain,--updatefor the residue only, authorisation quoted) once skills/objectstack-data/references/data-hooks.md: rewrite the reserved word "role" to ADR-0090 D3 vocabulary, keeping one retirement note — the residue is what PR #15073 baselines #15177 is MERGED · [PM decision] skills lane batch 7 — raise the platform-readings.md line ceiling by the measured +34 so the intake family's eight readings can land #15013 (batch 7) → 1A (os-warren 5535777772): ceiling 324 → ≤358 with the ruling quoted beside the row, the eight readings land — [finding] The&page=Ncompleteness walk refuses with HTTP 422 past 9,900 items — the ceiling on the remedy #14068 just landed #14133 family SECOND increment claimed 5535911909 (head; member pointers on [finding] platform-readings: the zero-quota page payload channel can be stale on an issue's own SCALAR fields (assignees), not only on its comment list — a card reads as unassigned and a dev acts on it #14694 · [finding] MCPsearch_issuesfree-text matching returns 0 for terms present in open issue TITLES, withincomplete_results: false— the mandatory pre-filing dedupe step is silently answering "no duplicates" #14743 · [finding] The MCP GitHub quota and the repo-scoped REST quota are separate pools — an MCP rate-limit refusal is not "GitHub is unavailable", and the additive labels endpoint beats the whole-set write #14778 · [finding] Merge-queue membership is NOT the RESTauto_mergefield — read the timeline's added_to/removed_from_merge_queue events; the wrong field reads a queued PR as idle #14798 · [finding] Platform reading: once a PR is in the merge queue, RESTpull.auto_mergereadsnull— it is not "auto-merge was disabled"; the dequeue signal is the timeline eventremoved_from_merge_queue#14605 · [finding] A PM seat cannot safely repair aBlocked-by:body line: the issue-read channel HTML-escapes bodies and the write is whole-body replace #14898 · finding(skills): spec@objectui shift-end report 2026-09-02 — two principle gaps (types-face routing vs. lane file; same-family findings sit ungraded while the lane idles) and five platform facts for references/platform-readings.md #14445) + dispatched 05:07Z (opus, L; branchclaude/issue-14133-platform-readings-intake-2;platform-readings.md+ the one ceiling row; the three post-ruling member facts measured but NOT landed; the four prior-regime holds read line by line for the seat to close; governed ⇒ draft + both approvers); [PM decision] skills lane batch 7 — raise the platform-readings.md line ceiling by the measured +34 so the intake family's eight readings can land #15013pm:dispatchedas carrier (ack 5535915382), closes with the PR (Part of) · [Decision] Skills lane — batch 6 (3 items): execution-seat promotion of same-family findings · extend ruling 3B to objectui CLAUDE.md · check-ratchet-remedy-authority walk over scripts/pm/** #14978 (batch 6) → 1B · 2A · 3A (os-warren 5535783628): item 1 kept (finding(skills): spec@objectui shift-end report 2026-09-02 — two principle gaps (types-face routing vs. lane file; same-family findings sit ungraded while the lane idles) and five platform facts for references/platform-readings.md #14445 ①2, no PR); item 2 — objectui#7506 claimed 5535915802 + dispatched 05:08Z (opus, XS; branchclaude/issue-7506-claude-md-collapse;CLAUDE.md51 → ~25, both hooks named, uniqueness diff againstAGENTS.mdfirst; governed ⇒ draft + both approvers); item 3 — carrier card check-ratchet-remedy-authority: widen the walk to scripts/pm/** — measure the roster first, then bring every hit under the #8435 convention and flip the self-test that pins the non-recursive walk (#14978 item 3, ruled A) #15179 filed + claimed 5535916345 + dispatched 05:09Z (opus, S; branchclaude/issue-15179-remedy-authority-scripts-pm; measure thescripts/pm/roster, then widen the walk + bring hits undercheck:engine-double-contractfires at CI time, not authoring time — four independent PRs tripped it on brand-new test files in one shift, and a pre-warning in the brief did not prevent it #8435 + flip PR tooling(pm): admit a same-PR cross-file line-budget move, and take the first one #14860's pin; pure code ⇒ flip/queue); [Decision] Skills lane — batch 6 (3 items): execution-seat promotion of same-family findings · extend ruling 3B to objectui CLAUDE.md · check-ratchet-remedy-authority walk over scripts/pm/** #14978pm:dispatchedas carrier (ack 5535916735), closes when both PRs land. Heavy slots 4 of 5 in use. · Deliveries (05:2x–05:3xZ): objectui#7506 → PR fix(services,spec): reject the last two silentpooldrops — turso whole-arm, mongodb's two timeouts by name (#7243) #7600 @eb09098ACCEPT 5536143702 (51 → 25 lines, headings md5-identical, both hooks named, 21/21 facts present inAGENTS.mdso nothing moved; 28/28 green; governed terminal: draft, reviewersos-zhuang+hotlongrequested 05:28Z) · skills/objectstack-data/references/data-hooks.md: rewrite the reserved word "role" to ADR-0090 D3 vocabulary, keeping one retirement note — the residue is what PR #15073 baselines #15177 → PR docs(skills): data-hooks.md speaks ADR-0090 D3 vocabulary #15186 @7add396fACCEPT 5536156430 (12 → 3 occurrences, all quoted history — the seat re-grepped; the card'ssys_userclaim corrected by the dev without changing the disposition; Q answered A — the 29-token shrink not banked; governed terminal: draft, both approvers requested 05:33Z; MERGED5f5511f006:22:21Z by os-zhuang, skills/objectstack-data/references/data-hooks.md: rewrite the reserved word "role" to ADR-0090 D3 vocabulary, keeping one retirement note — the residue is what PR #15073 baselines #15177 closed byFixesand cleaned 06:32Z; check:role-word and check:corpus-claim-drift skip every references/ directory, so 12 of 46 published-catalog markdown files - incl. both hand-authored reference companions - are invisible to both scans #15061pm:blocked→pm:dispatched06:32Z (note 5536658847) and PR fix(gates): scan the published catalog's references/ in role-word and corpus-claim-drift #15073's ruled patch round sent; delivered 06:49Z: head085cd82d(merge750b0655,--updateadded exactly one baseline key, ledger 43 → 44 files / 120 → 123), ACCEPT 5536878505 (06:55Z) — gate logic byte-identical to the reviewed7c660c57, both gates green on the merged tree, 25 success + 8 skipped at 07:03Z, flipped ready 07:04Z; enqueued 07:06Z; the queue build on460134affailed 07:47Z on a port-race flake inpackages/cli's bound-port e2e (not this PR's paths) and the queue dropped it 07:47:48Z; re-armed once 07:50Z; MERGEDc0d32cda08:36:21Z — check:role-word and check:corpus-claim-drift skip every references/ directory, so 12 of 46 published-catalog markdown files - incl. both hand-authored reference companions - are invisible to both scans #15061 closed byFixes, cleaned 08:43Z; the dev's footer question → A, recorded as a second observation on platform-readings.md third increment: the two post-ruling channel facts (+11), #13387's CDN-cache cause, and #13257 — needs its own ceiling ruling before dispatch #15192 (5536878608)) · finding [finding] sys-user.object.ts: therolefield description and readonly comment still point at the retired Set Platform Role action (set_user_role) #15188 filed bare for central triage (sys-user.object.ts:611prose points at the retiredset_user_roleaction; dedup by open-issue scan, 0 hits). · Maintainer instruction (chat 05:1xZ, verbatim 「你的门禁有问题,只需要有人工批准记录就行,不需要卡最新的提交。」): both repos'check-governed-queue-guardpin an authorised approval to the PR's CURRENT head sha (objectstackscripts/pm/check-governed-queue-guard.mjs:465-490, objectuiscripts/check-governed-queue-guard.mjs:418-450), so any push after approval reds the queue — the shape behind objectui PR docs(spec): make submitBehavior's TSDoc state the mode-aware default #7473's repeated approvals; filed check-governed-queue-guard: an authorised APPROVED review satisfies the merge-queue leg regardless of commit_id — maintainer 2026-09-04: a human approval record suffices, never pinned to the latest commit #15187 (objectstack) and objectui#7601, both p2, claimed 5536163108 / 5536163468 and dispatched 05:38Z (opus, S; predicate: latest-decisive authorised APPROVED counts regardless ofcommit_id; dismissed/superseded/unauthorised/unreadable still refuse;GOVERNED_APPROVERSunchanged; ruling quoted in the header with the accepted cost; self-tests flipped; pure code ⇒ flip/queue — each PR's own queue build runs the guard it changes). Heavy slots now 6 ([finding] The&page=Ncompleteness walk refuses with HTTP 422 past 9,900 items — the ceiling on the remedy #14068 just landed #14133-2 · check-ratchet-remedy-authority: widen the walk to scripts/pm/** — measure the roster first, then bring every hit under the #8435 convention and flip the self-test that pins the non-recursive walk (#14978 item 3, ruled A) #15179 · check-governed-queue-guard: an authorised APPROVED review satisfies the merge-queue leg regardless of commit_id — maintainer 2026-09-04: a human approval record suffices, never pinned to the latest commit #15187 · objectui#7601 + the The internal dispatch runbook has no step that pastes the decision frame into the dev prompt — after #14685 item 4 (PR #14862) the dev definition expects it there and has no copy of its own #14869 patch round; skills/objectstack-data/references/data-hooks.md: rewrite the reserved word "role" to ADR-0090 D3 vocabulary, keeping one retirement note — the residue is what PR #15073 baselines #15177 and objectui#7506 delivered) — one over the cap by the maintainer's direct instruction, no new dispatch until one lands. · [finding] The&page=Ncompleteness walk refuses with HTTP 422 past 9,900 items — the ceiling on the remedy #14068 just landed #14133 family SECOND increment → PR docs(pm-skill): land the intake family's eight platform readings under the +34 ceiling ruling #15190 @581bc995ACCEPT 5536252664 (05:44Z) (358/358 with the ruling quoted beside the row; the eight readings at exactly +34, wrapped by the gate's ownwrapLine; the seat ran the ratchet and frame-sync at the head; Q1 → A as landed —was314 → 348 carried forward so the standing move still reads +10 against −11, the script-side separation filed as check-skill-line-ratchet: an ordinary ruled raise on a destination that carries a live CROSS_FILE_MOVES declaration is priced as the move's raise — separate the two quantities instead of carryingwasforward #15191 (pm:queue, S); Q2 → A —Fixes #14445stands, its ①1 was dispositioned 09-03 and ①2 ruled kept, one body-only reword asked; holds: [finding] The zero-quota payload channel silently drops the NEWEST timeline items once an issue outgrows the SSR first window — measured 3 of 5 comments, both 2026-08-30 dispatch comments missing #13373 / [finding] The zero-quota payload channel renders only the FIRST 15 timeline items and returns an EMPTY tail — so a read-back of a just-posted comment reads byte-identical to sanitizer damage #13385 closable on L149 + L152 at MERGED, [finding] The zero-quota issue-page payload is CDN-CACHED and can be minutes-to-hours stale — cache-busting and no-cache did NOT defeat it, and one seat asserted a half-state about another seat's work on that stale read #13387's CDN-cache cause and Record the agent-created-Routine transport facts in references/platform-readings.md — fired sessions get no GitHub MCP tools, and self-binding trades new-session recoverability for tool availability #13257 plus the +11 post-ruling facts go to platform-readings.md third increment: the two post-ruling channel facts (+11), #13387's CDN-cache cause, and #13257 — needs its own ceiling ruling before dispatch #15192 (third increment, needs its own ceiling ruling); the brief'scheck:control-byteswas objectui's spelling — acknowledged; governed terminal: draft, both approvers requested 05:44Z) · objectui#7474 claimed 5536252973 + dispatched 05:44Z (opus, S; branchclaude/issue-7474-skills-json-fences-parse; the linger's follow-on — fence splits, the two elisions,os:checkmarkers; governed ⇒ draft + both approvers). · check-ratchet-remedy-authority: widen the walk to scripts/pm/** — measure the roster first, then bring every hit under the #8435 convention and flip the self-test that pins the non-recursive walk (#14978 item 3, ruled A) #15179 → PR tooling(scripts): widen the ratchet-remedy-authority sweep to scripts/pm/ (#15179) #15199 @a8325640ACCEPT 5536377756 (05:59Z) (roster measured first: 14 files, 13excluded, oneunmarked→ marked;CORPUS_DIRS = ['', 'pm'], three watch hints derived and pinned set-equal, PR tooling(pm): admit a same-PR cross-file line-budget move, and take the first one #14860's pin flipped;check-skill-line-ratchet.mjsreadsexcludedby its offer grammar and the header says so; seat ran the gate and self-tests at the head; the dev's finding bare-root-worklist's DECLARED-NARROWER row for check-ratchet-remedy-authority states a walk narrower than the gate performs, and its pin cannot see the drift #15201 (worklist row describes the old walk) triaged intopm:queue, XS, serial; 20 green + 11 skipped + 2 in progress at 05:59Z,merge-treeclean; 34/34 green at 06:14Z, flipped ready 06:15:11Z, auto-merge armed 06:15:18Z, enqueued 06:16:18Z — MERGED read at the next boundary, then check-ratchet-remedy-authority: widen the walk to scripts/pm/** — measure the roster first, then bring every hit under the #8435 convention and flip the self-test that pins the non-recursive walk (#14978 item 3, ruled A) #15179 closes byFixes, [Decision] Skills lane — batch 6 (3 items): execution-seat promotion of same-family findings · extend ruling 3B to objectui CLAUDE.md · check-ratchet-remedy-authority walk over scripts/pm/** #14978 closes by hand (both items landed), bare-root-worklist's DECLARED-NARROWER row for check-ratchet-remedy-authority states a walk narrower than the gate performs, and its pin cannot see the drift #15201 dispatches). · objectui#7601 → PR [rest] Unknown query parameters are silently dropped on every REST route except/approvals/requests— decide whether the closed-parameter-set rule becomes ingress policy #7606 @a3f3035ACCEPT 5536448233 (06:07Z) (authorizedApprovalVerdict(reviews)— the pin retired,staleApproversretired, the head read retired; the instruction quoted in the header; 132 cases with the new predicate pinned both ways, ablation reds exactly the flipped cases; seat ran the self-test and--testat the head; the dev's finding objectui#7605 (two docs still describe the pin) triaged intopm:queue, XS, governed, serial; 18 green + 3 skipped + 8 in progress at 06:07Z,merge-treeclean; 29/29 green at 06:30Z — flip BLOCKED by the MCP window (third time this shift), retry at patrol chore(ci)(deps): bump codelytv/pr-size-labeler from 1.10.1 to 1.10.3 #23). · objectui#7474 → PR/auth/me/permissionsand/me/appsstill apply the baseline only when the caller resolves to ZERO sets — the ADR-0090 D5 fallback cliff, one plane over from where it was abolished #7608 @2ba20dfACCEPT 5536461786 (06:09Z) (8 listings split, 2 elisions replaced, 31 markers added — 70/70 json+jsonc fences parse and are marked,MARKED_FLOORjson 39 → 70 in the ADD direction; seat counted the census by grep at the head; the dev's finding objectui#7610 (stale docblock count) triaged intopm:queue, XS, serial; 20 green + 3 skipped + 6 in progress at 06:09Z; governed terminal: draft, both approvers requested 06:09Z). · check-governed-queue-guard: an authorised APPROVED review satisfies the merge-queue leg regardless of commit_id — maintainer 2026-09-04: a human approval record suffices, never pinned to the latest commit #15187 → PR fix(pm): an authorised APPROVED review satisfies the queue guard on any commit (2026-09-04 ruling) #15203 @76c93cb1delivered BLOCKED (06:08Z): the guard half is done (133 cases, the instruction quoted,staleApproverskept as a never-refusing reading, the rename deferred because the enqueue hook imports it), but the ruling necessarily reds the governed hook self-test.claude/hooks/guard-governed-enqueue.selftest.sh(49/0 → 47/2, measured by ablation) whichlint.ymlruns — the dev filed Propagate the 2026-09-04 unpinned-approval ruling into the governed surfaces: the enqueue hook, its self-test (RED in CI), AGENTS.md and the PM skill #15209 for the four governed paths (hook self-test, hook prose + rename,AGENTS.md:311-313,SKILL.md:729) and stopped on the file surface as briefed. Seat decision: A — PR fix(pm): an authorised APPROVED review satisfies the queue guard on any commit (2026-09-04 ruling) #15203 extends into those paths and lands as ONE governed PR (Fixes #15187+Fixes #15209, draft, both approvers, human merge); patch round sent 06:12Z; Propagate the 2026-09-04 unpinned-approval ruling into the governed surfaces: the enqueue hook, its self-test (RED in CI), AGENTS.md and the PM skill #15209pm:dispatchedas a fold member (5536478358). objectui's twin PR [rest] Unknown query parameters are silently dropped on every REST route except/approvals/requests— decide whether the closed-parameter-set rule becomes ingress policy #7606 is unaffected — objectui has no governed-enqueue hook (measured: four hooks, none pins a sha). · PR docs(pm-skill): land the intake family's eight platform readings under the +34 ceiling ruling #15190 ([finding] The&page=Ncompleteness walk refuses with HTTP 422 past 9,900 items — the ceiling on the remedy #14068 just landed #14133 family) MERGED96b4af8806:46:32Z by os-zhuang — [finding] The&page=Ncompleteness walk refuses with HTTP 422 past 9,900 items — the ceiling on the remedy #14068 just landed #14133 · [finding] platform-readings: the zero-quota page payload channel can be stale on an issue's own SCALAR fields (assignees), not only on its comment list — a card reads as unassigned and a dev acts on it #14694 · [finding] MCPsearch_issuesfree-text matching returns 0 for terms present in open issue TITLES, withincomplete_results: false— the mandatory pre-filing dedupe step is silently answering "no duplicates" #14743 · [finding] The MCP GitHub quota and the repo-scoped REST quota are separate pools — an MCP rate-limit refusal is not "GitHub is unavailable", and the additive labels endpoint beats the whole-set write #14778 · [finding] Merge-queue membership is NOT the RESTauto_mergefield — read the timeline's added_to/removed_from_merge_queue events; the wrong field reads a queued PR as idle #14798 · [finding] Platform reading: once a PR is in the merge queue, RESTpull.auto_mergereadsnull— it is not "auto-merge was disabled"; the dequeue signal is the timeline eventremoved_from_merge_queue#14605 · [finding] A PM seat cannot safely repair aBlocked-by:body line: the issue-read channel HTML-escapes bodies and the write is whole-body replace #14898 · finding(skills): spec@objectui shift-end report 2026-09-02 — two principle gaps (types-face routing vs. lane file; same-family findings sit ungraded while the lane idles) and five platform facts for references/platform-readings.md #14445 closed byFixesand cleaned 07:05Z; [PM decision] skills lane batch 7 — raise the platform-readings.md line ceiling by the measured +34 so the intake family's eight readings can land #15013 closed by hand (5537016599); holds dispositioned: [finding] The zero-quota payload channel silently drops the NEWEST timeline items once an issue outgrows the SSR first window — measured 3 of 5 comments, both 2026-08-30 dispatch comments missing #13373 / [finding] The zero-quota payload channel renders only the FIRST 15 timeline items and returns an EMPTY tail — so a read-back of a just-posted comment reads byte-identical to sanitizer damage #13385 CLOSED on L149 + L152 (5537017097 / 5537017687), [finding] The zero-quota issue-page payload is CDN-CACHED and can be minutes-to-hours stale — cache-busting and no-cache did NOT defeat it, and one seat asserted a half-state about another seat's work on that stale read #13387 / Record the agent-created-Routine transport facts in references/platform-readings.md — fired sessions get no GitHub MCP tools, and self-binding trades new-session recoverability for tool availability #13257 →pm:blockedBlocked-by: #15192(5537018254 / 5537018717) · PR docs(pm): runbook step that pastes the decision frame into every dispatch prompt #15057 (The internal dispatch runbook has no step that pastes the decision frame into the dev prompt — after #14685 item 4 (PR #14862) the dev definition expects it there and has no copy of its own #14869) MERGED1bc3c09206:49:25Z — The internal dispatch runbook has no step that pastes the decision frame into the dev prompt — after #14685 item 4 (PR #14862) the dev definition expects it there and has no copy of its own #14869 closed byFixes, cleaned · PR tooling(scripts): widen the ratchet-remedy-authority sweep to scripts/pm/ (#15179) #15199 (check-ratchet-remedy-authority: widen the walk to scripts/pm/** — measure the roster first, then bring every hit under the #8435 convention and flip the self-test that pins the non-recursive walk (#14978 item 3, ruled A) #15179) MERGED3933819c07:08:22Z — check-ratchet-remedy-authority: widen the walk to scripts/pm/** — measure the roster first, then bring every hit under the #8435 convention and flip the self-test that pins the non-recursive walk (#14978 item 3, ruled A) #15179 cleaned; [Decision] Skills lane — batch 6 (3 items): execution-seat promotion of same-family findings · extend ruling 3B to objectui CLAUDE.md · check-ratchet-remedy-authority walk over scripts/pm/** #14978 closed by hand (5537046171; 1B · 2A · 3A all landed) · objectui PR [rest] Unknown query parameters are silently dropped on every REST route except/approvals/requests— decide whether the closed-parameter-set rule becomes ingress policy #7606 (spec/docs still prescribe a dottedfieldspath that no driver implements and #7532 now refuses #7601) flipped 06:58Z + armed 07:00Z, MERGED0d8fd7ce07:09:49Z — spec/docs still prescribe a dottedfieldspath that no driver implements and #7532 now refuses #7601 closed byFixes, cleaned 07:21Z · objectui#7605 claimed 5537133758 + dispatched 07:23Z (opus, XS; branchclaude/issue-7605-guard-docs-unpinned-approval; objectuiAGENTS.md+content/docs/guide/ci-cd-pipeline.mdrewritten to the ruled predicate by copying the guard header; governed ⇒ draft + both approvers) · objectui#7610 → PR [batch] pm-dispatch SKILL consolidated amendments + compression — eight ruled cards, two serialized PRs (skills seat, round 1) #7631 @2dff709ACCEPT 5539970183 (11:44Z) (theparseJsonFencesentence to the count-free form; flipped + armed 12:01Z; MERGED0b24d7f812:15:31Z — docs(spec): state that skill.permissions is REJECTED, not silently stripped (#7567) #7610 closed byFixes, cleaned 12:45Z) · objectui#7618 → PR [Decision] The #4001 unknown-key strictness wave is owed ADR-0087 entries — one per major, or one per batch? #7630 @646ce08ACCEPT 5539977834 (11:46Z), governed terminal (+6 in AGENTS.md § 受管面: the fifth prohibition, the guard sentence copied whole from origin/main, the weightier-since-the-pin clause; governed--testexit 3; 25 success + 3 skipped; draft, both approvers requested 11:46Z) · objectui#7605 → PR/auth/me/permissionsand/me/appsre-implement permission-set resolution instead of calling the plugin's service — the copy that produced #7608 (and #7270, #7560) #7616 @8d78dbdACCEPT 5537375216 (07:47Z), governed terminal — MERGED11edab8811:00:03Z by os-zhuang, fix(security): an app-declared baseline composes with the platformmember_defaultinstead of replacing it (#7555) #7605 cleaned 11:26Z (two files, the stale clauses only; the ruling byte-identical in the guard header, AGENTS.md and the guide; guard self-test 132, governed--testexit 3 on 1 of 2 paths, control-bytes OK, 25 success + 3 skipped; draft, both approvers requested 07:47Z; residues: objectui#7618 triaged 07:46Z (domain:skills·documentation· p3 ·pm:queue, XS, serial behind PR/auth/me/permissionsand/me/appsre-implement permission-set resolution instead of calling the plugin's service — the copy that produced #7608 (and #7270, #7560) #7616 — AGENTS.md never states the never-approve seat rule) and a cross-lane note on objectui#7089 whose body still states the retired pin) · check-governed-queue-guard: an authorised APPROVED review satisfies the merge-queue leg regardless of commit_id — maintainer 2026-09-04: a human approval record suffices, never pinned to the latest commit #15187 + Propagate the 2026-09-04 unpinned-approval ruling into the governed surfaces: the enqueue hook, its self-test (RED in CI), AGENTS.md and the PM skill #15209 → PR fix(pm): an authorised APPROVED review satisfies the queue guard on any commit (2026-09-04 ruling) #15203 @0a8763f6ACCEPT 5536999727 (07:12Z), governed terminal (option A whole:authorizedApprovalVerdicton ANY commit, approver set pinned, dismissed/superseded/unauthorized/empty still refuse, unreadable head now a note; both renames with the hook; hook self-test 50/0, guard 133, ratchet AGENTS.md 1161/1162 · SKILL.md 971/1005, frame-sync ✓, governed-merges--testexit 3 on 4 of 5 paths; 28 success + 8 skipped; draft, both approvers requested 07:12Z; APPROVED by os-zhuang on0a8763f607:15Z, flipped + enqueued by the approver; MERGED6530f75708:14:18Z — check-governed-queue-guard: an authorised APPROVED review satisfies the merge-queue leg regardless of commit_id — maintainer 2026-09-04: a human approval record suffices, never pinned to the latest commit #15187 and Propagate the 2026-09-04 unpinned-approval ruling into the governed surfaces: the enqueue hook, its self-test (RED in CI), AGENTS.md and the PM skill #15209 closed byFixes, cleaned 08:28Z; the unpinned predicate is onmain) · [finding] dispatch-gates derives the SCHEDULED live half-state board sweep into the per-PR gate family for any diff with a changeset #14899 → PR tooling(pm): measure the scheduled-only routing question and pin its zero #15236 @ff0c7a56ACCEPT 5537016483 (07:15Z) (shape (c) + the live pin:declaredTriggerEvents,PR_TIME_TRIGGER_EVENTS, 18 cases re-taking the zero from the workflow text; premise false at filing —half-state-patrol.ymlcarried thepull_requestpaths trigger sinceafacebb6; self-test 1371 cases on the head,--commandsbodies byte-identical tomainon two probes; 23 success + 11 skipped at 07:19Z; flipped ready 07:45:2xZ + armed 07:45:40Z; MERGED5e724a2608:34:04Z — [finding] dispatch-gates derives the SCHEDULED live half-state board sweep into the per-PR gate family for any diff with a changeset #14899 closed byFixes, cleaned 08:43Z) · check-skill-line-ratchet: an ordinary ruled raise on a destination that carries a live CROSS_FILE_MOVES declaration is priced as the move's raise — separate the two quantities instead of carryingwasforward #15191 claimed 5537055279 + dispatched 07:2xZ (opus, S; branchclaude/issue-15191-ratchet-ruled-raise-vs-move; ruled raises separated from move raises incheck-skill-line-ratchet.mjs,platform-readings.mdback towas: 314with the +34 as a ruled raise; pure code) · bare-root-worklist's DECLARED-NARROWER row for check-ratchet-remedy-authority states a walk narrower than the gate performs, and its pin cannot see the drift #15201 claimed 5537056009 + dispatched 07:2xZ (opus, S; branchclaude/issue-15201-worklist-row-remedy-authority; both terms of the remedy-authority worklist row re-measured on one tree, row re-decided, a pin that sees hint drift; pure code) · check-skill-line-ratchet: an ordinary ruled raise on a destination that carries a live CROSS_FILE_MOVES declaration is priced as the move's raise — separate the two quantities instead of carryingwasforward #15191 → PR tooling(pm): price a destination's ordinary ruled raise apart from its move's #15266 @e69c9623ACCEPT 5537438170 (07:52Z) (ruledRaisesrecords on the move declaration, subtracted before the move is priced and restored in the total; three bars — no quotation, no date, over-claim — all red;wasback to 314 with the +34 recorded; self-test 136 → 155; gate output differs from main by exactly the move-verdict line; ablation and premise check quoted; all green 08:00Z → flipped ready + armed 08:01Z; MERGED0e24b0c208:40:32Z — check-skill-line-ratchet: an ordinary ruled raise on a destination that carries a live CROSS_FILE_MOVES declaration is priced as the move's raise — separate the two quantities instead of carryingwasforward #15191 closed byFixes, cleaned 08:43Z; theruledRaisesshape is onmainfor the platform-readings.md third increment: the two post-ruling channel facts (+11), #13387's CDN-cache cause, and #13257 — needs its own ceiling ruling before dispatch #15192 patch round) · bare-root-worklist's DECLARED-NARROWER row for check-ratchet-remedy-authority states a walk narrower than the gate performs, and its pin cannot see the drift #15201 → PR tooling(pm): re-measure the ratchet-remedy-authority worklist row, and pin the declaration it describes #15269 @1fcb7501ACCEPT 5537462124 (07:56Z) (both terms re-measured ata23603ea: 202 of 324, three hints, the shape claim corrected; the declaration pin — each DECLARED-NARROWER row's recorded spelling held SET-EQUAL to its gate's declared hint array read from source viaauditSource, omissions named inomits, 9 rows held; sweep verdicts unchanged; two-leg ablation quoted;--ran21 of 21; all green 08:14Z → flipped ready 08:14Z, armed 08:58Z once the MCP window reset; MERGED0cbd5f2609:28:06Z — bare-root-worklist's DECLARED-NARROWER row for check-ratchet-remedy-authority states a walk narrower than the gate performs, and its pin cannot see the drift #15201 closed byFixes, cleaned 09:52Z) · agent instructions:git merge-base --is-ancestorsilently answers "not an ancestor" in a shallow clone — a control-free ancestry reading is a false green #15087 → PR docs(agents): a negative--is-ancestorreading is void without a positive control #15355 @076ee33dACCEPT 5540631330 (12:47Z), governed terminal — approved by os-zhuang 12:59Z, flipped by the approver, landing (+9 in os-dev.md beside the sibling shallow-clone guard: one-directional failure, the two-legged negative reading, the near-control trap measured at depth 50; ratchet 459 of 469; governed--testexit 3; draft, both approvers requested 12:47Z) · [finding] therelativeis SHADOWED comment in dispatch-gates selfTest goes stale once the node:path namespace import lands — it points a future editor at the one spelling that still does not work #14991 → PR docs(pm): drop the stale shadowing claim from dispatch-gates' selfTest comment #15345 @b0c247c6ACCEPT 5540617252 (12:44Z) (+4/−5 comment lines only; self-test 1382; flipped ready 13:04Z + armed 13:04:32Z) · AGENTS.md:75 states the hidden-tests ruleexclude-only, but the gate enforces it spelling-agnostically — the prose declares a narrower rule than the tree enforces #14942 → PR docs(agents): state the hidden-tests rule as the invariantcheck:type-check-coverageenforces #15340 @392aa366ACCEPT 5540523689 (12:36Z), governed terminal — approved by os-zhuang 12:38Z, flipped by the approver, landing (+6/−6 in AGENTS.md: the invariant, both spellings, the gate named; ratchet 1161 of 1162 unchanged; governed--testexit 3; draft, both approvers requested 12:36Z) · [PM decision] skills lane batch 9 — platform-readings.md third increment: raise the ceiling by the measured +39 (358 → 397); and the MCP write-pool quota sentence collision #15275 → 1A · 2C (11:41Z) — executed 12:03Z: the platform-readings.md third increment: the two post-ruling channel facts (+11), #13387's CDN-cache cause, and #13257 — needs its own ceiling ruling before dispatch #15192 patch round in flight (ceiling 397 + the secondruledRaisesrecord; governed draft; both approvers after the seat's review of the patched head); item 2 held pending the 12:30Z discriminating read · platform-readings.md third increment: the two post-ruling channel facts (+11), #13387's CDN-cache cause, and #13257 — needs its own ceiling ruling before dispatch #15192 → PR docs(pm-skill): write the third platform-readings increment and measure it at +36 against the 358 ceiling #15265 @40cb0c59ACCEPT 5540356563 (12:27Z), governed terminal — MERGEDdc46c4ec12:56:03Z by os-zhuang (the third increment onmainat 397; platform-readings.md third increment: the two post-ruling channel facts (+11), #13387's CDN-cache cause, and #13257 — needs its own ceiling ruling before dispatch #15192 cleaned; [finding] The zero-quota issue-page payload is CDN-CACHED and can be minutes-to-hours stale — cache-busting and no-cache did NOT defeat it, and one seat asserted a half-state about another seat's work on that stale read #13387 · Record the agent-created-Routine transport facts in references/platform-readings.md — fired sessions get no GitHub MCP tools, and self-binding trades new-session recoverability for tool availability #13257 · [finding] a whole-body PR PATCH did NOT normalise the session-URL footer to bare form, contrary to the AGENTS.md reading — n=1, mechanism proposed, ⛔ not a rule change #15246 closed on it) (the +39 landed as measured; ceiling row 397 quoting the ruling; the secondruledRaisesrecord; gate green on the head; 28 of 28 derived families; draft, both approvers requested 12:27Z — the human approvers read the 39 lines' wording; [PM decision] skills lane batch 9 — platform-readings.md third increment: raise the ceiling by the measured +39 (358 → 397); and the MCP write-pool quota sentence collision #15275 closes by hand on the merge) (four members in the file's voice, +12 footer scope over four observations · +6 MCP refusal is a window reading · +5 CDN cause · +16 Routine transport; 397 vs ceiling 358; the quota-sentence collision left standing and marked 未裁; the ceiling row untouched; landing = patch round after the ruling and after PR tooling(pm): price a destination's ordinary ruled raise apart from its move's #15266) · bare-root-worklist: the one DECLARED-NARROWER row with nospellingsits outside the new declaration pin, and its gate does declare a hint #15270 → PR tooling(pm): pin the tenth DECLARED-NARROWER worklist row to its gate's declaration, and require a spelling on that verdict #15314 @9b576972ACCEPT 5539197077 (10:32Z) (driver package filesspelling entry, the row re-measured at2200f8ec— 344 of 379 opened, the declaration errs WIDE by 30 — the spelling requirement extended to DECLARED-NARROWER with the offending rows named; 10 held; sweep differs from main by the row'swhyonly; gate untouched; both ablation legs quoted; all green 10:51Z → flipped ready + armed 10:52Z; MERGEDeb40a72111:12:23Z — bare-root-worklist: the one DECLARED-NARROWER row with nospellingsits outside the new declaration pin, and its gate does declare a hint #15270 closed byFixes, cleaned 11:26Z) · [finding] check:pm-governed-merges reports an uninstalled worktree as a shrunken self-test battery — exit 1 with a confident wrong diagnosis where its siblings exit 3 NOT MEASURED #15272 → PR fix(pm): governed-merges self-test refuses as NOT MEASURED when its generator toolchain is absent #15283 @d510d4ecACCEPT 5537969400 (08:45Z) (the probe asks the environment —node_modules, then.bin/tsx— at the top ofselfTest()and reusesimport-prerequisite.mjs's exit 3 frame;batteryFloorFailureslifted with byte-identical messages; a 17-case battery pins both directions plus an end-to-end fixture child guarded against recursion (a hang the ablation exposed, closed in the same PR); 245 → 262; hook self-test 49/0; all green 08:58Z → flipped ready + armed 08:58Z; MERGED5b09356b09:28:06Z — [finding] check:pm-governed-merges reports an uninstalled worktree as a shrunken self-test battery — exit 1 with a confident wrong diagnosis where its siblings exit 3 NOT MEASURED #15272 closed byFixes, cleaned 09:52Z) · platform-readings.md third increment: the two post-ruling channel facts (+11), #13387's CDN-cache cause, and #13257 — needs its own ceiling ruling before dispatch #15192 claimed 5537175855 + dispatched 07:27Z — measurement-first (opus, S; branchclaude/issue-15192-platform-readings-third-increment; the +11 post-ruling rows, [finding] The zero-quota issue-page payload is CDN-CACHED and can be minutes-to-hours stale — cache-busting and no-cache did NOT defeat it, and one seat asserted a half-state about another seat's work on that stale read #13387's CDN cause, Record the agent-created-Routine transport facts in references/platform-readings.md — fired sessions get no GitHub MCP tools, and self-binding trades new-session recoverability for tool availability #13257's three Routine facts and the footer row scoped over three observations ([finding] The&page=Ncompleteness walk refuses with HTTP 422 past 9,900 items — the ceiling on the remedy #14068 just landed #14133, 5536878608, [finding] a whole-body PR PATCH did NOT normalise the session-URL footer to bare form, contrary to the AGENTS.md reading — n=1, mechanism proposed, ⛔ not a rule change #15246) written in the file's voice and wrapped bywrapLine; governed draft PR that stays RED on the ratchet;blockedon the ceiling ruling ⇒ the decision card is filed from its measured numbers, the ceiling row raised in a patch round after the ruling and after check-skill-line-ratchet: an ordinary ruled raise on a destination that carries a live CROSS_FILE_MOVES declaration is priced as the move's raise — separate the two quantities instead of carryingwasforward #15191 lands) · [finding] a whole-body PR PATCH did NOT normalise the session-URL footer to bare form, contrary to the AGENTS.md reading — n=1, mechanism proposed, ⛔ not a rule change #15246 triaged (the services seat's n=1 MCP-PATCH footer observation, this seat the named reader):domain:skills·documentation· p3 ·pm:blockedBlocked-by: #15192.POST /api/v1/packages/publishanswers a misleading 405 (Allowed: DELETE, GET, HEAD, PATCH) — the request is absorbed by/packages/:idbecause the REST package registrar is not mounted on showcase #7563 @715f5b3ACCEPT 5532623448 (one paragraph + the rewritten "If it fails" advice, numbers read from the gate's own line; flipped ready 21:54Z, enqueued 21:54Z; MERGED98f519622:09:49Z, objectui#7552 closed + label-cleaned 22:20Z).pm:epiccard whose parent lackspm:epic— needs a new fetch class (the sub-issues parent read) and apm:epicpopulation kept out ofseen#15702 delivered 06:35Z as PR tooling(pm): close H45's parent-relation silence — apm:epiccard reserved under nothing delegated #15755 (3b29a22f6: the sub-issues parent read as a declared fetch class, thepm:epicindex its own population behindSEEN_LABEL_PAGES, the row with its parentless/disagreement/undelegated shapes, self-test 2223 → 2262, three ablation legs red, live 5 of 5 parent reads answered; CI 24 success / 11 skipped; ACCEPT 06:38Z, pure code ⇒ flipped ready + auto-merge armed 06:38Z, in the queue; the dev filed [finding] dispatch-gates offers the bare check-partof-closing-keyword command as runnable — it takes PR_BODY through env:, not argv, so the NOT-MEASURED bucket never sees it #15761 for devx). PR docs(pm-dispatch): pm:retriage is a question for the triage seat, answered every fire #15732 (finding(pm-dispatch):pm:retriageis the only channel a seat has for asking triage a NON-grading question, so those cards are skipped by every dispatcher and actionable by no sweep — one ruled p1 sat 2d5h #15404) MERGED 06:36Z by os-zhuang — finding(pm-dispatch):pm:retriageis the only channel a seat has for asking triage a NON-grading question, so those cards are skipped by every dispatcher and actionable by no sweep — one ruled p1 sat 2d5h #15404 closed byFixes,pm:dispatchedremoved 06:38Z. Patrol Prepare v0.2.0 release for ObjectStack packages #54 executed 07:10Z: PR tooling(pm): close H45's parent-relation silence — apm:epiccard reserved under nothing delegated #15755 (check-half-states: H45's second half — apm:epiccard whose parent lackspm:epic— needs a new fetch class (the sub-issues parent read) and apm:epicpopulation kept out ofseen#15702) MERGED 07:00Z by the queue — check-half-states: H45's second half — apm:epiccard whose parent lackspm:epic— needs a new fetch class (the sub-issues parent read) and apm:epicpopulation kept out ofseen#15702 closed byFixes,pm:dispatchedremoved 07:11Z; PR docs(pm-skill): rules-only rewrite of the readings ledger, the REST table and the eight lane job descriptions #15641 still not re-enqueued; objectui Checklist maintenance (i18n area run): step-4 no-op, unaddressable_sections/emptyStatefixtures, clause-1 frozen-debt reconcile #7686 still awaiting the enqueue; no rulings in the decision box; no new intake in either repo; check-half-states H18 + ensure-pm-labels:pm:retriageis still described as a re-grade in the row JSDoc, its finding sentence and the label description — align them to "a question for the triage seat" #15744 unblocked ⇒ claimed 07:11–07:12Z (5550201410) and launched 07:13Z (S, pure code, opus: H18's JSDoc citation, finding sentence and header line plus thepm:retriagedescription inensure-pm-labels.sh, wording quoted from SKILL.md lines 115/382 onmain; the live re-seed of the description is the seat's act after merge on the two in-scope repos); Refactor: Separate authentication configuration from identity data models #55 armed 07:55Z. Patrol Refactor: Separate authentication configuration from identity data models #55 executed 07:56Z: no landing (PR docs(pm-skill): rules-only rewrite of the readings ledger, the REST table and the eight lane job descriptions #15641 and objectui Checklist maintenance (i18n area run): step-4 no-op, unaddressable_sections/emptyStatefixtures, clause-1 frozen-debt reconcile #7686 unchanged, PR feat(spec)!: duration-shaped number keys carry their unit in the key name — no-baseline gate + seven ADR-0087 renames (timeoutMs, ttlSeconds/ttlMs, *TimeoutSeconds) #15626 nowblockedat a new head,mainat6a3cc134c); no rulings; both flights alive on their gate unions (07:50–07:51Z), no PR yet; new intake [finding].gitignorenode_modules/is directory-only, so the os-dev worktree recipe’s node_modules SYMLINK is untracked — dispatch-gates counts it as a changed path on every card #15763 (06:36Z, os-zhuang triage p3 07:14Z — the os-dev worktree recipe'snode_modulessymlink is not matched by.gitignore'snode_modules/, so dispatch-gates counts it as a changed path on every card): read in full at first touch — repair 2 (pnpm install) is already the declared rule at the file level (no governed file carries the symlink; the seat that used it corrected its prompt 06:25Z; this seat's briefs saypnpm install), repair 1 (root.gitignore→node_modules, objectui's spelling) is the devx lane's surface ⇒pm:retriagebesidepm:queuewith the question stated (re-route todomain:devxfor repair 1),findingoff, not taken — the first live use of the wording PR docs(pm-dispatch): pm:retriage is a question for the triage seat, answered every fire #15732 landed; Add Multi-Organization protocol support for B2B SaaS multi-tenancy #56 armed 08:40Z. Patrol Add Multi-Organization protocol support for B2B SaaS multi-tenancy #56 executed 08:41Z: no landing (PR docs(pm-skill): rules-only rewrite of the readings ledger, the REST table and the eight lane job descriptions #15641, objectui Checklist maintenance (i18n area run): step-4 no-op, unaddressable_sections/emptyStatefixtures, clause-1 frozen-debt reconcile #7686 unchanged;mainatf501453b9); both flights have draft PRs up and are polling CI — tooling(pm): stop reading a gate's exclusion constant as a watch hint #15801 (extractWatchHintsreads a noise-floor EXCLUSION constant as a watch hint:.changesetderivescheck:pm-half-statesonto every changeset-adding card #15753,a7ddb020a, +266/−14 ondispatch-gates.mjs, opened 08:31Z) and tooling(pm): readpm:retriageas a question for triage, in H18 and the label description #15795 (check-half-states H18 + ensure-pm-labels:pm:retriageis still described as a re-grade in the row JSDoc, its finding sentence and the label description — align them to "a question for the triage seat" #15744,76eab9dce, +54/−38 on the two files, opened 08:21Z); triage answered the [finding].gitignorenode_modules/is directory-only, so the os-dev worktree recipe’s node_modules SYMLINK is untracked — dispatch-gates counts it as a changed path on every card #15763 question 08:22Z — re-routeddomain:skills→domain:devx,pm:retriageremoved, the card left this lane; new to the lane finding — a gating lint rule shipped claiming "0 findings over the corpus" and names an object that fires it; the corpus copy is not the real app #15357 (hotlong's finding, re-routed spec → skills by triage 08:25Z, p2: a gating lint rule shipped on a "0 findings over the corpus" reading whose corpus isexamples/app-crm, not the app it names) — graded at first touch: p2 stands,findingoff, folded into member 5 (AGENTS.md) with the clause written on the card (a corpus reading = count + repository + commit; a moving ref is not an anchor) and pinned as the SAME line as [finding] shift-end items from the domain:spec seat — 4 platform facts and 2 principle gaps (dispatch paraphrase; unstated census glob) #15647 section 2's second principle, so the ruling lands it once; the lint-changelog census the card asks for is left to devx; Protocol review: 78% complete, P0 blockers resolved, Q1 2026 roadmap #57 armed 09:25Z. check-half-states H18 + ensure-pm-labels:pm:retriageis still described as a re-grade in the row JSDoc, its finding sentence and the label description — align them to "a question for the triage seat" #15744 delivered 08:43Z as PR tooling(pm): readpm:retriageas a question for triage, in H18 and the label description #15795 (76eab9dce: H18's JSDoc citation, finding sentence, header line and residue-label docblock now readpm:retriageas a question for triage, quoting SKILL.md line 382 verbatim; the label description 91 bytes; predicate untouched; self-test 2262 → 2267, red first, ablation; CI 24 success / 11 skipped; ACCEPT 08:4xZ, open question on the description trim ruled A, pure code ⇒ flipped ready + auto-merge armed 08:46Z, in the queue; after it lands the seat patches the live description on objectstack + objectui over REST and records cloud/objectos/hotcrm as pending the next five-repo reconcile).extractWatchHintsreads a noise-floor EXCLUSION constant as a watch hint:.changesetderivescheck:pm-half-statesonto every changeset-adding card #15753 delivered 08:5xZ as PR tooling(pm): stop reading a gate's exclusion constant as a watch hint #15801 (a7ddb020a:extractWatchHintsskips literals inside a scanned gate's ownNOISE/SKIP/EXCLUDE/IGNOREdeclaration by span, census 64 of 3,513 declarations / 14 hints across 6 files / 6 derivation changes all false leads,DENYmeasured and removed;check:pm-half-statesjoins the root-walk residue ledger with its reason; the changeset-less projection 16 → 12 families; self-test 1478 → 1493 (the brief's 1445 was stale), ablation reds 11 of 1493; CI 23 success / 11 skipped; ACCEPT 09:0xZ — the seat's own self-test run hit its 280 s cap, then the uncapped re-run measured 1493 pass, exit 0, at 09:11Z (follow-up on the PR); pure code ⇒ flipped ready + auto-merge armed 09:02Z, in the queue). Patrol Protocol review: 78% complete, P0 blockers resolved, Q1 2026 roadmap #57 executed 09:27Z: PR tooling(pm): readpm:retriageas a question for triage, in H18 and the label description #15795 (check-half-states H18 + ensure-pm-labels:pm:retriageis still described as a re-grade in the row JSDoc, its finding sentence and the label description — align them to "a question for the triage seat" #15744) MERGED 09:13Z by the queue — check-half-states H18 + ensure-pm-labels:pm:retriageis still described as a re-grade in the row JSDoc, its finding sentence and the label description — align them to "a question for the triage seat" #15744 closed byFixes,pm:dispatchedremoved, and the livepm:retriagelabel re-seeded by the seat over REST with read-back (objectstack: from no description and default grey to the landed text andd4c5f9; objectui: from the re-judgement text to the landed text; cloud/objectos/hotcrm out of scope, recorded on the card as pending the next five-repo reconcile, receipt on check-half-states H18 + ensure-pm-labels:pm:retriageis still described as a re-grade in the row JSDoc, its finding sentence and the label description — align them to "a question for the triage seat" #15744); PR tooling(pm): stop reading a gate's exclusion constant as a watch hint #15801 still in the queue; PR docs(pm-skill): rules-only rewrite of the readings ledger, the REST table and the eight lane job descriptions #15641 and objectui Checklist maintenance (i18n area run): step-4 no-op, unaddressable_sections/emptyStatefixtures, clause-1 frozen-debt reconcile #7686 unchanged; no rulings; no new intake in either repo; Query Protocol: Add comprehensive test coverage and documentation for aggregations, joins, and window functions #58 armed 10:10Z. In flight (0 of 5): none — every dispatchable card of the lane is folded or waiting on an external landing. In the merge queue: PR tooling(pm): stop reading a gate's exclusion constant as a watch hint #15801 (extractWatchHintsreads a noise-floor EXCLUSION constant as a watch hint:.changesetderivescheck:pm-half-statesonto every changeset-adding card #15753) since 09:02Z. At the governed terminal: PR docs(pm-skill): rules-only rewrite of the readings ledger, the REST table and the eight lane job descriptions #15641 ([PM corpus] rules only, plain language: strip provenance narratives and incident post-mortems from the pm-dispatch skill corpus (maintainer 2026-09-04) — member 1: SKILL.md #15379 member 3, thirteen readings/lanes files rules-only; head4008475c8= the dev's merge ofmainafter the queue dropped it asdirty02:22Z; approved by os-zhuang, hotlong requested, awaiting re-enqueue — the seat never enqueues; on landing close finding(pm-tooling):list_issueslabelsis a UNION, not an intersection — every multi-label board reading is wrong, and wrong in the direction that looks right #15121 · [finding] the CCR container GitHub egress is proxy-credentialed: header-less reads carry a session identity, a caller Authorization header is overridden, and a 2026-09-02 platform reading no longer reproduces #15525 · [finding] REST update-branch is a PM-usable merge-main route (full SHA required; 422 when the base has not moved); job-log download is proxy-refused, annotations suffice #14928 · [finding] the GitHub MCPenable_pr_auto_mergetool recordsmerge_method: mergewhatever method a seat asks for — harmless here only because themainmerge-queue ruleset squashes, so the platform-readings table should say which reading is authoritative #15481) · objectui PR #7686 (#7260,guard-main-checkout.shreads its routed tool's path key, self-tests 87 → 116, byte-identical to landed objectstack PR #15665; approved + readied 06:08Z, awaiting the enqueue). Landed in round 5 (01:53–06:23Z): objectstack PR #15625 · #15551 · #15566 · #15524 · #15519 · #15460 · #15485 · #15665 · #15681 · #15424 · #15696 · #15690 · #15695 · #15704 · #15725 · #15727 · #15735; objectui #7640 · #7677 · #7695 — everyFixescard closed and label-cleaned; thePart ofcards stay open: #15379 (members 3 and 5 remain), #14483 (point 2 behind the spec lane's PR #15626 ondata-hooks.md, nowdirty), #15453 (ADR-0130 onmain; ADR-0131 serial behind the devx lane's draft PR #15612; ADR-0128 in the decision box). Serial waits: objectui #7259 + objectstack #11809 (Blocked-by: #7260) · #15671 + #15647 section 1 (four ledger lines, the fourth = theos-regenmerge-driver fact:merge-treeanswers exit 0 on a generated file while GitHub, with no driver, reportsdirty; after PR #15641) · member 5 (AGENTS.md+CLAUDE.md, folds #15125 · #14913 · #14509 · #15241 · #15670 · #15357, after PR #15290 — hotlong's, unapproved, Check Changeset red on its head until a re-run) · #14768 (census after the family lands) · the programme's re-lock pass (with the retirement playbook's table pin 328 → 326). Decision box: #15275 item 2 (ruled C; the seat's half of the same-minute/rate_limitread is on the card, the second seat's is still missing) · #15453 record ADR-0128 (a governed ADR merged by the seat accountos-saleson 08-28: accept by an explicit act, or leave Proposed and file the finding) · #15647 section 2 (three constitution lines proposed by the spec seat, quoted in the 05:44Z round report: never paraphrase a card's claim into a dispatch, quote it; a census must state its glob; a control proves only the variable it varies — the seat recommends one line each into the existing sections). Left for other lanes / triage: #15537 · #15565 (devx) · #15233 carries the unpinnedGoverned Surface Queue Guardreading (5549557007) · objectui#7206 · memo on PR #15427 (5547894447) · memo for the engine seat on #15693 (a claim starts withClaim:). Standing: #14881pm:blockedon #15009 · objectui#6751pm:retriage· objectui#6852pm:blocked. Readings that govern the seat's hands: everyready_for_reviewon the lane's governed PRs is os-zhuang's own act after approving (timelines 03:57Z) — the seat's reviewer requests never flip a draft; the session-token REST channel reads as os-steve, writes asclaude[bot](the session ID in the body is the identity carrier) and its GraphQL serves only the pinned review operations, so draft flips and auto-merge go through the MCP, whose os-steve pool was exhausted 05:08–05:2xZ and had reset by 05:32Z; a PR just enqueued readsauto_merge: nullon REST — the timeline'sadded_to_merge_queueis the reading. Slot order when one frees: #15671 → #15647 section 1 (both after PR #15641) → #7259 + #11809 (after #7260) → #14483 point 2 (after PR #15626) → member 5 (after PR #15290). The per-card narrative of round 5 and patrols #48–#53 is archived in the body revision of 2026-09-05T06:34:19Z; that of rounds 5–6 and patrols #23–#47 in the revision of 2026-09-05T01:54:45Z.check-ratchet-remedy-authoritywalk overscripts/pm/**, rec A measure-first); #14909 (batch 5, unruled). Dispositions recorded: #14445 ①1 not a decision (rule exists atlanes/spec.md:12+SKILL.md:201-203; 5528699072), #14445 ② already ruled not_planned (#13901, 批 #13). Ruled by the director this shift and picked up: #14663 (16:10Z).labels=AND): objectstackdomain:skillspm:queueunassigned 9, all folded or waiting (#15671 · #15670 · #15647 · #15357 · #15241 · #15125 · #14913 · #14768 · #14509; #15763 re-routed to devx 08:22Z); objectuidomain:skillspm:queueunassigned 0; bare findings 0 in both repos.1A 2A 3A 4A, #14568A, #146851A 2C 3B 4B 5A— item 5 landed5bc2f27, #14859B); batch 5 #14909 unruled; batch 6 #14978 filed. Standing condition (#14685 item 4): every brief pastes the internal-pm decision frame fromorigin/mainSKILL.md verbatim, located by its anchor sentences, in the dispatch minute (all eight briefs this shift did; md5b9a0de17…of:868-885at5bc2f27).domain:devx).Blocked-by: #14867; the two prose mirrors of the governed repo set in.claude/**).main.Hot-file serial queue
.claude/skills/spec-property-retirement/SKILL.md(337/337, headroom 0; row pin 328): PR #15566 MERGED 01:55Z → #15388 flight (launched 02:3xZ, line-neutral).skills/objectstack-platform/SKILL.md(12983 of 12984 tokens, headroom 1 — at its ceiling; the next addition pays with a trim or its own ceiling decision): PR #15625 MERGED 01:53Z — free..claude/skills/pm-dispatch/SKILL.md(811/811, table pin 342) +references/state-machine.md(42/42): PR #15696 MERGED 04:24Z → #15404 flight (launched 04:4xZ) → #15647 section 2 (if ruled).scripts/pm/check-half-states.mjs+ensure-pm-labels.sh: PR #15795 (#15744) MERGED 09:13Z — free.skills/objectstack-automation/SKILL.md(12305 of 12768 tokens): PR #15524 MERGED 02:07Z → #14483 + #14966 flight (launched 02:4xZ).skills/objectstack-data/references/data-hooks.md: spec lane's draft PR #15626 → #14483 point 2..claude/agents/os-dev.md(403/403 on PR #15725): member 4 at the governed terminal, readied by the approver;skills/objectstack-platform/references/_index.md: held PR #15424 (#15361 fork) — disjoint file..claude/hooks/guard-shared-stash.sh+.selftest.sh: PR #7695 (#7441) at the governed terminal (03:5xZ).docs/adr/0130-…: PR #15704 (#15453) MERGED 05:02Z — free;docs/adr/0131-…: devx PR #15612 → #15453's ADR-0131. objectui.claude/hooks/guard-main-checkout.sh+.selftest.shand objectstack.claude/hooks/guard-main-checkout.sh+.selftest.sh: PR #7686 / PR #15665 at the governed terminal (02:4xZ; #15665 approved and ready 03:2xZ) → #7259 + #11809 (serial; alsoguard-main-checkout-bash.sh:339in both repos).packages/spec/scripts/build-skill-references.ts+ the api/platform_index.md: PR #15424 patch round (#15361 D) in flight..claude/skills/pm-dispatch/references/{platform-readings,rest-channel,release-aftercare,true-green,compile-surfaces}.md+references/lanes/*.md(13 files) + their 13 rows inscripts/pm/check-skill-line-ratchet.mjs: PR #15641 (member 3) — approved and enqueued by os-zhuang 01:44Z, removed 02:22Z asdirty; re-merged at4008475c8(clean, green) and verified 02:5xZ; awaiting the approver's re-enqueue. After it: the programme's one re-lock pass.scripts/pm/dispatch-gates.mjs: PR #15801 (#15753) in the queue since 09:02Z (REST showedauto_mergenull while it was queued — a known reading, not a drop).AGENTS.md(1161 of 1162, unchanged by the landing): PR #15340 (#14942) MERGED 13:18Z — free;.claude/agents/os-dev.md(459 of 469): PR #15355 (#15087) MERGED 13:35Z — free. #15125 (AGENTS.md, needs a line): headroom is still 1 after PR #15340 (it deleted nothing), so it is folded into the AGENTS.md member of #15379 (the rules-only rewrite nets lines) unless the maintainer rules a ceiling raise first; it stayspm:queueuntil that member is dispatched. #15121 (list_issueslabels union — a fourth platform-readings increment) is folded the same way into the platform-readings member of #15379 (rules-only rewrite, net shrink: the reading is carried as one line, no ceiling raise),pm:queueuntil that member is dispatched.scripts/pm/bare-root-worklist.mjs: PR #15314 (#15270) MERGEDeb40a72111:12Z — free.scripts/check-skill-frame-sync.mjs: PR #15060 MERGED 20:09Z — free.scripts/check-role-word.mjs+scripts/check-corpus-claim-drift.mjs+scripts/role-word-baseline.json: PR #15073 (#15061) MERGEDc0d32cda08:36Z — free.skills/objectstack-data/references/data-hooks.md: PR #15186 (#15177) MERGED 06:22Z — free.scripts/pm/check-governed-queue-guard.mjs+.claude/hooks/guard-governed-enqueue.{sh,selftest.sh}+AGENTS.md:311-313+SKILL.md:729: PR #15203 (#15187 + #15209) MERGED6530f75708:14Z — free. objectuiscripts/check-governed-queue-guard.mjs: PR #7606 (objectui#7601) MERGED0d8fd7ce07:09Z — free; objectuiAGENTS.md: PR #7630 (objectui#7618) MERGED, cleaned 13:39Z; PR #7640 (objectui#6997, the changeset-population sentence under Housekeeping) at the governed terminal 13:52Z — draft, ACCEPT posted,os-zhuang+hotlongrequested, human merge; objectuiscripts/check-skill-examples.mjs: PR #7631 (objectui#7610) MERGED0b24d7f812:15Z — free.scripts/check-ratchet-remedy-authority.mjs(+ one remedy string indispatch-gates.mjs): PR #15199 (#15179) MERGED3933819c07:08Z — free (#15201, the worklist row, dispatched 07:2xZ). objectuiCLAUDE.md: PR #7600 (objectui#7506) MERGEDc70ebaae05:44:59Z by os-zhuang, #7506 cleaned — free.scripts/pm/check-governed-merges.mjs: PR #15283 (#15272) MERGED5b09356b09:28Z — free..claude/skills/pm-dispatch/SKILL.md:723+.claude/hooks/guard-governed-enqueue.sh:54: PR #15031 (#14984) MERGEDb17cdea004:06Z by os-zhuang, #14984 cleaned — free..github/workflows/half-state-patrol.yml: PR #15000 MERGED 17:59Z — free;scripts/pm/check-half-states.mjs: free (untouched by #14881).scripts/pm/ensure-pm-labels.sh: PR #15014 MERGED 18:37Z — free; landing step owed: a seat withghruns the seeder's--reconcileagainst the five repos (this container has nogh)..github/workflows/stale.yml: PR #15016 MERGED 18:37Z — free..claude/launch.json+.claude/skills/dogfood-verification/SKILL.md(PR #14979 MERGED 18:14Z 09-03),docs/qa/platform-checklist/SWEEP.md(PR #14983 MERGED 17:41Z 09-03),skills/objectstack-platform/**(PR #14981 MERGED 18:14Z 09-03), objectuiskills/objectui/guides/testing.md+scripts/check-skill-examples.mjs(PR #7568 MERGED 02:53Z): free.references/platform-readings.md(358/358): PR #15265 (#15192) MERGEDdc46c4ec12:56Z by os-zhuang — 397/397, free; the fourth increment (#15121) is folded into the platform-readings member of #15379 (rules-only rewrite, net shrink — the reading is one line, no ceiling raise); behind it: the four prior-regime holds' facts, the re-lock pin PR.references/contract-review.md+scripts/pm/check-skill-line-ratchet.mjs(ceiling map) +scripts/pm/check-clause2-carriers.mjs: PR #14999 MERGED 18:18Z — PR #15266 (#15191) MERGED0e24b0c208:40Z — the #15192 patch round (PR #15265) carried the 397 row and the secondruledRaisesrecord — MERGED 12:56Z; #14870's:540comment next (after PR #15038 lands, its other site).references/dispatch-runbook.md(280/280 at the PR head): **PR #15057 (#14869): approved by os-zhuang three times and enqueued three times (03:41Z, 04:46Z, 05:16Z), removed by the queue twice (04:07:50Z, 05:14:16Z) — the maintainer asked at 05:19Z why it never merges. Root cause reproduced by the seat:check-skill-frame-syncreds on the QUEUE build only — the bullet's paste anchor 「每个方案必须沿四条固定评估轴分析…」 trips the undeclared-copy detector since PR #15060 widened the scan toreferences/after this head was built (the PR's own CI predates #15060); approvals were never the blocker (the governed guard passed on every queue build). Patch round sent to the #14869 dev 05:19Z (mergemain, re-anchor the bullet without the frame's marker phrases, four lines at 280/280, frame-sync green on the merged tree, push; note on the PR 5536069697); the approver re-approves after the push. Maintainer's two chat messages relayed verbatim: 「15057 我批准了很多轮,一直合并不了」 · 「你的门禁有问题,只需要有人工批准记录就行,不需要卡最新的提交。」 — the seat's reading at that minute: the frame-sync check, not the approval gate, is what reds on THIS PR — and the instruction names a real property of the queue guards, executed as #15187 / objectui#7601. Patch landed 05:56:55Z: headea53bae5(mergeba86720d+ re-anchored bullet, zero fingerprints, frame-sync green on the merged tree, 280/280), verified by the seat 06:01Z (note 5536400751); one fresh approval on the new head lands it — review re-requested from os-zhuang; the seat does not re-enqueue a red PR while a patch round flies (GH006: a queued branch cannot be pushed). MERGED1bc3c09206:49:25Z; #14869 closed byFixesand cleaned 07:05Z — free..claude/agents/os-dev.md+AGENTS.md(footer rule home:485-500): PR #15015 (#14997) approved + enqueued by os-zhuang 02:47Z, MERGED3b34cef903:40:06Z, #14997 closed byFixesand label-cleaned 03:55Z — free.CLAUDE.md,skills/README.md,skills/objectstack-ai/**,skills/objectstack-ui/**,skills/objectstack-api/**,rest-channel.md,lanes/**: free.skills/objectstack-data/SKILL.md: PR #15010 MERGED 18:22Z — free;rules/validation.md: PR #15046 (#15011) MERGED5c58423104:06Z by os-zhuang, #15011 cleaned — free.skills/objectui/**fence tags: PR #7473 (linger) → #7474;CLAUDE.md: #7506 (on #14978);check-doc-snippet-types.mjs: #7463 item 2 (ruling).Notes
Job description:
references/lanes/skills.md. 留守登记: os-litant (session_01LraLgQVGq8egUwfYZpbYt1) on objectui PR #7473 and the label bookkeeping of #14793 / #14685, from 15:24Z. Heavy slots = 5. Contract-review fuse:get_session15:52Z readssession_context.model=last_served_model=claude-fable-5-1;CONTRACT_REVIEW_TIERatorigin/main5bc2f27names the same value — reading = constant; every review this shift done in-seat at that tier. Channel facts this container (16:27Z; 17:1xZ a dev's container refused the additive REST label endpoint and plaincurlreads mid-run — the dev fell back to the MCP whole-group label replace with comparative read-back, so REST is per-container, not a given): repo-scoped REST answers 200 (reviewer requests go throughPOST /pulls/{n}/requested_reviewers, draft bit untouched; devs write labels through the additive endpoint);/rate_limitcore 15000 / graphql 10000 at 16:29Z. Governed-merge audit run 16:14Z over the v22 window (checkouts deepened to 700 / 400 commits first): 57 governed merges, os-zhuang 53 · hotlong 3 · os-project-manager 1 (PR #14784, 09:56Z — for the maintainer's recognition); cloud / objectos UNAUDITED (no checkout); next round, exactly:--since-ref objectstack=5bc2f2727aef --since-ref objectui=0e3b3be09fef.UNRECOGNISEDlines: dev gate logs are not retained — NOT MEASURED. Half-state anchor #9857 (swept 19:46Z, commit101ad2cc): one row names this lane — H26 on #14133 (pm:blockedon #15013, aneeds-user-decisioncard, which the sweeper reads as a block with no closing mechanism; it says so is not a judgement that the block is wrong). Seat's reading: the release mechanism is this seat closing #15013 once the maintainer rules, which unblocks the eight family cards in one write — state kept as is, nopm:on-holdconversion. Update 07:2xZ: #15013 is closed and the family landed, so the three H26 rows dissolve at the next sweep (07:37Z). No row names this post, a queued card, or any in-flight card; the earlier H35 rows (PRs #14860 / #14911 / #14953) are gone with their merges. Standing facts: value gate + reject authority from #13597 in force;scripts/docs-audit/handwritten-docs.jsonNON-governed by ruling; publishedskills/**governed in objectui too;scripts/pm/**pure-code PRs land by in-seat contract-tier review → ready → queue (2026-08-26 md-content split), any.mdin the diff ⇒ draft at the governed terminal;check:platform-checklistis a maintainer-run gate (lint.yml:2226-2231), red onmainfor four UNCLASSIFIED kinds (#14961, another seat's). Prior body revisions carry earlier running states — compacted 08:3xZ after the 08:28:29Z write came back 58 chars short (the trailing footer block dropped once the body passed ~65.7k chars; every earlier write read back identical), so rounds 1–4 and patrols #1–#22 live in the 08:14:52Z revision.Generated by Claude Code