Repository navigation
governance: lower the human-merge line threshold from 5,000 to 3,000 changed lines (HUMAN_MERGE_LINE_THRESHOLD), per the maintainer's 2026-10-09 ruling #22451
Description
Activity
objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsTriage: first grade,
priority:p2·domain:skills·tooling·pm:queue(maintainer-directed: admitted to the queue under the queue rule's own exception). One more site to change:dispatch-gates.mjs:26400Triage seat (objectstack-wide, seat post #6015) ·
session_01AavokzJ5DndAwitDXvKy4U· 2026-10-09T10:02Z. ⛔ Not a claim, ⛔ not a dispatch.Triage: the constant and the self-tests live in
scripts/pm/, and the rule lines live in.claude/skills/pm-dispatch/**andAGENTS.md. That puts the card indomain:skills. It carries a maintainer ruling with the letter given. ⛔ No decision is owed.-
Why p2: the ruling takes effect when this lands. Until then, a pull request between 3,001 and 5,000 changed lines still auto-merges, against the maintainer's 2026-10-09 words. Nothing is unsafe for a user, so it is not p1.
-
The site list misses one pin. Read on
main2b61f2d9d,scripts/pm/dispatch-gates.mjs:26400:- it pins
HUMAN_MERGE_LINE_THRESHOLD === 5000(test name 「…and it is the ruled 5000」); - it probes
additions: 5001.
Move only the constant and that self-test goes red. Lines
:467(the import),:13145and:26392–:26396read the constant and follow it unchanged. - it pins
-
The freeze (ruling 208, 「
dispatch-gates.mjs冻结,只在它喂的 workflow 坏了时碰」): that one pin is the only edit this card makes in the file.- The constant move breaks it, so this is the freeze's own exception.
- The letter that moves it is the maintainer's threshold ruling quoted in the body.
- ⛔ Nothing else in the file changes: no rewording, no other pin, no [finding] dispatch-gates --tier's Clause-② note says a card that "changes contract accept/reject behaviour" owes a contract review and is spec-lane work; execution-duties.md's Clause-② is widening only, so a narrowing card has two answers #22167 note. That last one waits on [Decision] lift the ruling-208 freeze on scripts/pm/dispatch-gates.mjs for exactly the roster-as-data split (W3 of the skills-lane diet program; carries the Clause-② note remainder), or keep it frozen #22453's letter.
-
Every literal copy of the number (
git grepoverscripts/,.claude/,.github/andAGENTS.md):- the body's sites;
check-governed-merges.mjs's further pins at:5984–:5985,:5993,:6053,:6097–:6099,:6166and:6174. Their5001and5000probes move to3001and3000where they test the line, and stay where they test parsing;dispatch-gates.mjs:26400above.
The PR body lists each site with the value it now states. A
git grep -n -E '\b500[01]\b|5,000'over the files the PR touches shows only the quoted maintainer words and parse-only probes. -
Landing: Tier H (
AGENTS.md) plus Tier S (.claude/**). That means the maintainer's APPROVED review, then the owning seat, as the body says.
-
- addedpriority:p2Medium: important, M3Medium: important, M3
on Oct 9, 2026 objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsClaim: PM loop round 3
Session:session_01JmWtcHfGbC4ncw4GFKWuRA
Account:os-elon-musk(the seat's linked user asGET /useranswers it; always the card's assignee)
Branch:claude/issue-22451-human-merge-threshold-3000
Worktree:objectstack-issue-22451
Domain:domain:skills
Seat:domain:skills#1
File surface:scripts/pm/check-governed-merges.mjs(HUMAN_MERGE_LINE_THRESHOLD = 5000→3000at line 1105, declared once; the header prose that states the number at 189, 195 and 1102; the self-test pins and fixture subjects the card and the triage list — the ruled default, exactly 3,000 under / 3,001 over, the5001/5000probes that test the line move, the ones that test parsing stay; the earlier maintainer quotes stay verbatim with the 2026-10-09 words added beside them),scripts/pm/check-governed-queue-guard.mjs(the stated value at 336, the printed guidance at 1863 and 1907–1908, the pins at 3459–3460 and 3547),scripts/pm/check-skill-line-ratchet.mjs(324–325, the sentence describing the rule line),scripts/pm/dispatch-gates.mjsONLY at line 26400 (the pinHUMAN_MERGE_LINE_THRESHOLD === 5000with itsadditions: 5001probe → 3000 / 3001; ⛔ FROZEN under ruling 208 R6 otherwise — the constant move breaks that pin, so this one edit is the freeze's own exception; ⛔ no rewording, no other pin, no #22167 note, which waits on #22453),.claude/skills/pm-dispatch/SKILL.mdline 186 and.claude/skills/pm-dispatch/references/landing-operations.mdline 58 (both at their ceilings, 319/319 with the widest-row pin 342 and 101/101: the digit changes in place, 0 net lines, ⛔ no re-wrap), andAGENTS.mdline 510 (Tier H: the number in place). Pin: agit grep -n -E '\b500[01]\b|5,000'over the files the PR touches shows only the quoted maintainer words and parse-only probes;check-governed-merges.mjs --self-test,check-governed-queue-guard.mjs --self-test,check-skill-line-ratchet.mjsand thecheck:pm-dispatch-gatesbattery green on the head. The PR body carries the measurement the card asks for: merged pull requests of the last 30 days whose changed lines fell in 3,001–5,000, listed by number. Tier H (AGENTS.md) plus Tier S (.claude/**): the PR stays draft with the four-piece set and the maintainer merges it. Stop on breach; explain in the report.
Container & model:S,mode:subagent,model: CONTRACT_REVIEW_TIER(MANDATORY:dispatch-gates --tier --repo objectstack-ai/objectstack⇢ '.claude/skills/pm-dispatch/SKILL.md' — clause ① of the model-tiering ruling (narrowed to protocol semantics, 2026-08-20): the PM dispatch skill MAIN file is the lane's own operating protocol and a wrong edit propagates to every later dispatch; the one-line-class mechanical exit is not taken: seven files, some fifteen sites and a measurement, judged from the card content)
Clause-②: no
Responsibility: n/a — not a defect card (a maintainer ruling recorded for execution: 「这种大额改动就应该人工审核,我还是建议5000行的人工审核门槛降到 3000,立卡。」, filed by the director seat)
Thread-read: 6078716461
Serial constraints cleared: the two skill files were last touched today by this seat's own landed PRs (#22458d87dff67onSKILL.md, #22457587bd969onlanding-operations.md) — both MERGED, nothing in flight on them;AGENTS.mdlast touched9bdbd766(2026-10-01); the threescripts/pmgate scripts1db5322b/da93a8b3/f151ef2c,dispatch-gates.mjs5ff7cbe3(2026-10-08); no open PR touchesAGENTS.md,.claude/**orscripts/pm/**except this seat's PR #22460 (fleet-write/*,rest-channel.md— file-disjoint; 10 open PRs' file lists read at 2026-10-09T12:07Z); this round's sibling #22454 (PR #22475,skills/objectstack-automation/**) is file-disjoint; #22167's--tiernote stays out (waits on #22453); verify lock reads LOCKED at the reading — the dev takes the lock protocol asos-verify-lock.shprescribes; the lane holds no open p1. Readings at 2026-10-09T12:07Z.objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsos-dev-report
{ "issue": 22451, "status": "done", "branch": "claude/issue-22451-human-merge-threshold-3000", "pr": "https://github.com/objectstack-ai/objectstack/pull/22490", "head": "cfff9b1ade9e9afef16b796bb51ccca41d5f5a46", "session": "session_01JmWtcHfGbC4ncw4GFKWuRA — subagent of the dispatching seat; the relay derived the same id from the container", "premise_still_valid": true, "summary": "HUMAN_MERGE_LINE_THRESHOLD moves 5000 → 3000, still declared once at scripts/pm/check-governed-merges.mjs:1115 (every code reader follows the import: sizeVerdict, the sweep's words, the queue guard, dispatch-gates). The 2026-10-09 words 「这种大额改动就应该人工审核,我还是建议5000行的人工审核门槛降到 3000,立卡。」 are added verbatim beside the 2026-09-18 and 2026-09-27 quotes (kept verbatim) in both gate headers, the docblock and the queue guard's printed REFUSED guidance; the self-test pins on the line (ruled default, exactly-3000 under, 3001 over, the lift's unchanged threshold, the --test/--json runs, the fixture subjects #3000/#3001) move; parse-only probes stay; dispatch-gates.mjs changes at the one pin :26400 only. SKILL.md:186, landing-operations.md:58 and AGENTS.md:510 carry the digit in place (319/319 · 342-byte widest row, 101/101, 1108 lines). Premise verified on origin/main f66c440d: the card's line numbers matched exactly; objectui carries no copy (grep on 5ad8183: 0 hits). 30-day census: 2,606 merges, 2,579 at or under 3,000, 16 in 3,001–5,000 (the added population, listed by number in the PR body), 11 over 5,000. Draft PR #22490 open, never flipped; Tier H + Tier S.", "tests": "node scripts/pm/check-governed-merges.mjs --self-test → '✓ check-governed-merges --self-test: 476 assertions' (exit 0 via pnpm check:pm-governed-merges in the ledger); node scripts/pm/check-governed-queue-guard.mjs --self-test → '✓ check-governed-queue-guard self-test: 296 cases pass' (exit 0); pnpm check:pm-skill-ratchet → SKILL.md 319/319 headroom 0, landing-operations.md 101/101 (exit 0); pnpm check:pm-skill-id-lint → '34 file(s) clean' (exit 0); pnpm check:pm-governed-prose → '2 instruction surface(s) name all 6 registered governed surfaces' (exit 0); pnpm check:nul-bytes → 'OK (scanned 10459 text file(s))' (exit 0); pnpm check:pm-dispatch-gates on cfff9b1a → '✓ dispatch-gates self-test: 2011 cases pass. … the battery took 1080.2s on this box.' exit 0 captured to a file. Literal pin: git grep -E '\\b500[01]\\b|5,000' over the 7 touched files = 23 hits, all quoted rulings, parse-only probes (:6003 string '5001', :6107/:6109 flag parsing, :6196 half pair) or one '15,000' substring artifact. Ablation (throwaway detached worktree at cfff9b1a, scripts/ablation-replace.mjs, anchor x1→x0, blob 6d8be7178d5f→717e33fc3d6d, on-disk counts verified; restore proven blob==HEAD and git diff HEAD empty after each leg): constant alone back to 5000 → merges self-test exit 1 with 5 failures (the five line pins), queue guard exit 0 (pins no number of its own, by its own :3659 pin), dispatch-gates --self-test exit 1 with '1 of 2011 case(s) failed' = the :26400 pin. Direction as expected: red exactly where the number binds.", "gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack on cfff9b1a (stderr: 'gate list derived from the tree of objectstack-ai/objectstack at commit cfff9b1a'; 7 paths three-dot off merge base f66c440de): 45 commands; every one run as printed with the exit captured before any pipe; --ran → 'Run reconciliation — 45 derived, 45 run, 0 NOT-MEASURED, 0 UNRUN' exit 0. One prerequisite refusal on the first pass: pnpm --filter @objectstack/lint run check:doc-formula-expressions exit 3 PREREQUISITE NOT MET (formula/lint not built) — not a measurement; the prescribed build ran under the verify lock (os-verify-lock VERDICT command-exit 0, held 186s, waited 0s) and the gate re-ran exit 0 (the record). No package build/test/typecheck owed (no workspace package touched); pnpm lint is CI's. CI status on #22490: in_progress / not read — the PM reads convergence.", "line_budget": ".claude/skills/pm-dispatch/SKILL.md 319 → 319 (widest row 342 B → 342 B; line 186 is 110 B before and after); references/landing-operations.md 101 → 101; AGENTS.md 1108 → 1108; skills/** untouched (no token/line readings owed); scripts: check-governed-merges.mjs +40/−30, check-governed-queue-guard.mjs +9/−3, check-skill-line-ratchet.mjs +4/−3, dispatch-gates.mjs +1/−1.", "deviations": [ "Killed by the 5-hour usage wall at about 13:07Z, right after the label stroke's read-back; resumed at about 14:05Z from the on-disk ledger and redid nothing: battery exit 0 was already on disk, ran.list 45/45 already reconciled, PR #22490 already carried the census table and the battery seconds, labels and assignee already read back; only this report comment remained.", "PM hypothesis 2 (move the constant first, repair what reds) was executed as one coherent edit set and then measured the other way round by the mutation leg; same information, reported as a measurement in the PR body.", "The first battery run was launched bare under nohup, so its exit was never captured although it printed '2011 cases pass'; it was re-run on the same head with the exit written to a file — that re-run is the record (1080.2s).", "A build of @objectstack/spec + formula + lint ran under the verify lock as the prerequisite of one derived gate (the only lock-bound run); dist/ artefacts are local only.", "dispatch-gates.mjs:26400 — the pin's own words changed by the digit only ('the ruled 5000' → 'the ruled 3000') on the same line as the === and the probe; nothing else in the frozen file; no --tier note.", "check-governed-queue-guard.mjs:3463 — the pin 'quoting-both-rulings' renamed 'quoting-all-three-rulings' and extended with a third includes, so the new printed words are pinned like the earlier two; case count unchanged (296).", "check-skill-line-ratchet.mjs:325-328 — a ceiling-ledger code comment re-wrapped 3 → 4 lines (a .mjs file, no ceiling); it names the lowered line without restating the old figure so the literal pin stays clean.", "Fixture PR-number mnemonics in check-governed-merges.mjs (#5000/#5001 → #3000/#3001) moved with their five readers — synthetic repo, named for the line the commit stands at.", "Commit trailer pair is the model-free form AGENTS.md prescribes (Claude-Session + Co-authored-by: Claude); the harness reminder's model-named Co-Authored-By form was not used — reported, not adopted.", "Two git pushes (the empty-branch probe, then the one commit); no force-push. The relay's --session flag was not passed; it derived session_01JmWtcHfGbC4ncw4GFKWuRA from the container, matching the dispatch.", "The 'documentation' label on PR #22490 was set by another actor (the path labeler) — not mine, left alone." ], "files_changed": [ "scripts/pm/check-governed-merges.mjs (+40/−30)", "scripts/pm/check-governed-queue-guard.mjs (+9/−3)", "scripts/pm/check-skill-line-ratchet.mjs (+4/−3)", "scripts/pm/dispatch-gates.mjs (+1/−1)", ".claude/skills/pm-dispatch/SKILL.md (+1/−1)", ".claude/skills/pm-dispatch/references/landing-operations.md (+1/−1)", "AGENTS.md (+1/−1)" ], "mcp_calls": "0 — no MCP GitHub tool called; reads were gh api GET only (issue 22451, comments 6080574997 and 6078716461, rate_limit, pulls list 27 pages, pulls/{n} x2606, pulls/22490 x2, issues/22451/comments x1; one gh api graphql probe answered 403 'not available from Claude Code sessions' — a refused read, not a write).", "api_writes": "4 REST writes landed as objectstack-fleet[bot] through 3 relay dispatches (POST /repos/objectstack-ai/objectstack/dispatches x3): [1] pr_create → POST /repos/objectstack-ai/objectstack/pulls (#22490, run 37934449181, 23480 bytes stored identical); [2] label-write stroke → POST /repos/objectstack-ai/objectstack/issues/22490/labels (skip-changeset) + POST …/issues/22490/assignees (os-elon-musk) (run 37934569530, read back matching); [3] this os-dev-report → POST /repos/objectstack-ai/objectstack/issues/22451/comments via post-stamped. Plus 2 git pushes of the branch (not REST). No PATCH, no MCP, no bare curl.", "open_questions": [], "out_of_scope_findings": [] }
Generated by Claude Code
objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsACCEPT — PR #22490 (head
cfff9b1a), Tier H + Tier S, the four-piece set posted, landing on the maintainer's APPROVED — skills seat 1,session_01JmWtcHfGbC4ncw4GFKWuRA, 2026-10-09T14:09ZVerified on GitHub and on the fetched branch, not on the report: a draft PR against
main, first lineFixes #22451(the only closing keyword in the body), 7 files (+57/−40):HUMAN_MERGE_LINE_THRESHOLD5,000 → 3,000 declared once (check-governed-merges.mjs:1115), the five line pins and the fixture subjects moved with it, the three maintainer rulings quoted verbatim (the 2026-10-09 words added beside the earlier two in both gate headers, the docblock and the queue guard's printed guidance, its pin extended to all three),dispatch-gates.mjschanged at the one pin only,SKILL.md:186/landing-operations.md:58/AGENTS.md:510in place with 319 / 101 / 1108 lines unchanged; the literal pin over the seven files leaves only quoted rulings and parse-only probes. The card's measurement is in the PR body (2,606 merges in 30 days; 16 between 3,001 and 5,000, listed). Self-tests per the report: merges 476 assertions, queue guard 296 cases, ratchet / id-lint / governed-prose / nul-bytes green, thecheck:pm-dispatch-gatesbattery 2,011 cases in 1,080.2 s on this head; the gate union pinned tocfff9b1a(45 families,--ran45/45, all exit 0 after the doc-formula prerequisite build); one ablation red exactly where the number binds. CI on the head at this write: 35 check runs, every onesuccessorskipped;mergeable_stateclean.mcp_calls0;api_writes3 relay strokes (pr_create, label-write, the report 6082535728) —skip-changesetand the assignee read back. Commit authored byobjectstack-fleet[bot]. The usage wall killed the dev after the label stroke and the revival redid nothing (the ledger on disk carried the battery exit and the reconciliation) — accepted as listed in the review record.Contract review PASS in seat at tier: 6082600302. Landing: Tier H (
AGENTS.md) plus Tier S — the four-piece set is posted in this act (this ACCEPT, the review record,needs-user-decision+ 维护者速读 on the PR, review requested fromos-zhuangandhotlongthrough the relay); on an authorized APPROVED the seat lands unless the approver already did; close-out is the seat's either way. The ruling takes effect on landing: from then a pull request over 3,000 changed lines takes the four-piece terminal set.objectstack-fleet commented
on Oct 9, 2026 ContributorAuthorMore actionsLanded — PR #22490 MERGED by the approver, card closed by
Fixes— skills seat 1,session_01JmWtcHfGbC4ncw4GFKWuRA, 2026-10-09T14:46ZTwo readings, taken together: PR #22490 reads
merged: trueat 2026-10-09T14:44Z (commit6212cc6cf2a41d3d2775d8939d8260f3ca7da64f, merged through the merge queue afteros-zhuang's APPROVED 2026-10-09T14:14Z — review 5471248214 — and their own ready flip and enqueue two seconds later; thirty minutes in the queue), and that commit is an ancestor oforigin/mainas fetched in this act — a single-parent squash commit (the queue's own method). The seven files are byte-identical to the PR headcfff9b1a;origin/mainnow declaresHUMAN_MERGE_LINE_THRESHOLD = 3000once, and the maintainer's 2026-10-09 words stand beside the two earlier rulings in both gate headers, the docblock and the queue guard's printed guidance. The ruling is in force from this commit: a pull request over 3,000 changed lines (additions + deletions, generated files included) takes the four-piece terminal set — an authorized APPROVED and the owning seat, or a human merge — with no Tier S exception.Tier H + Tier S landing by the maintainer's authorized approval on this seat's four-piece set (contract review PASS 6082600302, ACCEPT 6082611344, 维护者速读 6082619472, review requested from both authorized approvers). The card closed
completedbyFixes;pm:dispatchedand the assignee are stripped in this act, and so is the PR'sneeds-user-decision. Timings: claim → draft PR 12 min; the usage wall between the PR and the report (killed 13:07Z, revived 14:03Z, report 14:05Z); four-piece set → APPROVED 3 min; APPROVED → MERGED 30 min. The next card on the same file, #22478 (the roster-as-data split), mergesorigin/mainbehind this landing before its PR. Nothing else is owed on this card.
Filing gate: a maintainer ruling, recorded for execution. Filed by the director seat (summon #35,
session_01VYToj6PQehTEKNrjGM9akg, GitHubos-zhuang; written asobjectstack-fleet[bot]via the relay), on the maintainer's words in the session chat, verbatim: 「这种大额改动就应该人工审核,我还是建议5000行的人工审核门槛降到 3000,立卡。」 ⛔ Not a decision card: the letter is given. ⛔ Not a claim; triage grades and routes it.The ruling
The human-merge line threshold moves from 5,000 to 3,000 changed lines (
additions + deletions, generated files included). A pull request whose changed lines exceed 3,000 lands the way a Tier H surface does: an authorized APPROVED review (os-zhuangorhotlong) and then the owning seat, or a human merge. The predicate stays strictly greater: exactly 3,000 is under, 3,001 is over. Nothing else about the rule changes: the four-piece terminal set, no Tier S exception, generated files included, the per-repo coverage ofGOVERNED_REPOS.Lineage: 2026-09-18 「修改代码量超过某个行数(比如5000)就应该人工审核」; 2026-09-27 「所以阈值写死成 5000 行 , 维护者已经批准了就是可以合并。」 (objectstack#20153); 2026-10-09 the words above. The occasion was PR #22215 (7,802 + 756 changed lines, the protocol 17 → 18 bump), which the maintainer approved at its size; the maintainer's reading is that changes of that class need a human review, and the line that triggers one moves down.
Where the number lives (read on
origin/main440bed63e7)scripts/pm/check-governed-merges.mjs:1105:export const HUMAN_MERGE_LINE_THRESHOLD = 5000;, declared once; the predicate, the words it prints,dispatch-gates.mjs's dispatch-time reading and the self-test read it from here (:1098–:1104: "moving it is one word from the maintainer and one edit").:5979(the ruled default is 5000),:5982–:5983(exactly 5,000 is under),:6052,:6172, and the fixture subjects at:6330/:6358.scripts/pm/check-governed-queue-guard.mjs:336(states 5,000 as the declared value), its printed guidance at:1863and:1907–:1908, its pins at:3459–:3460and:3547. These quote the earlier rulings verbatim; the quotes stay, the stated value changes.scripts/pm/check-skill-line-ratchet.mjs:324–:325(describes the rule line)..claude/skills/pm-dispatch/SKILL.md:187and.claude/skills/pm-dispatch/references/landing-operations.md:58(Tier S,.claude/**).AGENTS.md:510(Tier H).objectui and cloud carry no copy of the number in their governance files (grep on both
main: 0 hits);GOVERNED_REPOScovers them from this script.Acceptance
HUMAN_MERGE_LINE_THRESHOLD = 3000, still declared once; every reader above reads it from there; the self-test pins move with it (exactly 3,000 under, 3,001 over, the ruled default 3,000). The earlier maintainer quotes stay verbatim, with the 2026-10-09 words added beside them.landing-operations.md,AGENTS.md:510and the queue guard's printed guidance say 3,000.check-governed-merges.mjs --self-test,check-governed-queue-guard.mjs --self-testandcheck-skill-line-ratchet.mjsgreen.Clause-②: no(no published surface). The PR touches Tier H (AGENTS.md) and Tier S (.claude/**), so it waits on the maintainer's APPROVED review and then lands by the owning seat.Not this card
Dedupe: 115 open objectstack issues scanned (titles and bodies) for
5000,5,000,人工审核门槛,review threshold,line threshold: no card on the threshold; the hits are seat posts. GitHub search is unavailable in this session (repo-scoped proxy).Dedupe words:
HUMAN_MERGE_LINE_THRESHOLD 3000·human-merge line threshold lowered·changed lines exceed 3,000Generated by Claude Code