Skip to content

chore(governance): the human-merge line threshold is 3,000 changed lines (HUMAN_MERGE_LINE_THRESHOLD), per the maintainer's 2026-10-09 ruling - #22490

Merged
os-zhuang merged 1 commit into
mainfrom
claude/issue-22451-human-merge-threshold-3000
Oct 9, 2026
Merged

os-zhuang merged 1 commit into
mainfrom
claude/issue-22451-human-merge-threshold-3000

Conversation

@objectstack-fleet

Copy link
Copy Markdown
Contributor

Fixes #22451
Clause-②: no

Summary

The maintainer, 2026-10-09, verbatim and untranslated: 「这种大额改动就应该人工审核,我还是建议5000行的人工审核门槛降到 3000,立卡。」

HUMAN_MERGE_LINE_THRESHOLD moves from 5000 to 3000 changed lines (additions + deletions, generated files included). It stays declared ONCE, in scripts/pm/check-governed-merges.mjs; 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 of GOVERNED_REPOS. The earlier maintainer quotes (2026-09-18 and 2026-09-27) stay verbatim everywhere they were; the 2026-10-09 words are added beside them, verbatim. No ADR records the number (git grep over docs/adr/** and docs/NORTH-STAR.md: zero hits on the threshold), so no ADR amendment is owed.

Lineage recorded on the card: 2026-09-18 「修改代码量超过某个行数(比如5000)就应该人工审核」; 2026-09-27 「所以阈值写死成 5000 行 , 维护者已经批准了就是可以合并。」; 2026-10-09 the words above. PR #22215 (the occasion) is unaffected: no retroactive review of anything already approved or merged.

Notation in this body: the greater-than sign is spelled [over] wherever a source line carries it, because the platform's body sanitizer eats angle-bracket-shaped fragments.

Every edit: site → old → new (file:line as on this head, cfff9b1a)

site old new
scripts/pm/check-governed-merges.mjs:183 — header section title (maintainer ruling, 2026-09-18) (maintainer ruling, 2026-09-18; the line, 2026-10-09)
…check-governed-merges.mjs:189-191 — header (the 2026-09-18 quote alone) the 2026-10-09 words added beside it, verbatim
…check-governed-merges.mjs:193 — header prose exceeds 5,000 exceeds 3,000
…check-governed-merges.mjs:198-201 — header prose 「比如」 makes 5,000 the ruled DEFAULT, declared once as … 「比如」 made the 2026-09-18 figure the ruled DEFAULT; the 2026-10-09 word lowered it to 3,000. It is declared once as …
…check-governed-merges.mjs:1102-1114 — docblock on the declaration the 2026-09-18 ruling as the ruled default; 5,000 changed lines is under the threshold, 5,001 is over adds the 2026-10-09 words verbatim; 3,000 changed lines is under the threshold, 3,001 is over
…check-governed-merges.mjs:1115 — the ONE declaration export const HUMAN_MERGE_LINE_THRESHOLD = 5000; export const HUMAN_MERGE_LINE_THRESHOLD = 3000;
…check-governed-merges.mjs:5989 — self-test pin, the ruled default the-threshold-is-the-ruled-default-5000-declared-once, === 5000 the-threshold-is-the-ruled-3000-of-2026-10-09-declared-once, === 3000
…check-governed-merges.mjs:5992-5993 — pin, exactly at the line exactly-5000-changed-lines-is-UNDER-the-threshold, changedLines === 5000 exactly-3000…, changedLines === 3000
…check-governed-merges.mjs:5994-5995 — pin, one over 5001-changed-lines-is-OVER-it…, changedLines === 5001 3001-changed-lines-is-OVER-it…, changedLines === 3001
…check-governed-merges.mjs:6062-6063 — pin, threshold unchanged by the lift threshold === 5000, additions: 5000 (twice) threshold === 3000, additions: 3000 (twice)
…check-governed-merges.mjs:6176 — pin name, --test over the line --test-with-5001-changed-lines-on-an-ordinary-path-exits-3-and-says-HUMAN-MERGE --test-with-3001-changed-lines-… (the run itself hands in String(HUMAN_MERGE_LINE_THRESHOLD) + 1 deletion)
…check-governed-merges.mjs:6182 — pin name, --test exactly at and-exactly-5000-exits-0-the-threshold-is-strictly-greater and-exactly-3000-exits-0-…
…check-governed-merges.mjs:6184, :6189 — pin, --json over the line '--additions', '5001', changedLines === 5001 '--additions', '3001', changedLines === 3001
…check-governed-merges.mjs:6340, :6344, :6368-6369, :6381-6382, :6390 — fixture commit subjects and every reader of them (#5000) / (#5001); PR #5001 / PR #5000; pr === 5001 (#3000) / (#3001); PR #3001 / PR #3000; pr === 3001 — the fixture's PR numbers are mnemonics for the line the commit stands at (lines(LINE) and lines(LINE + 1), LINE = HUMAN_MERGE_LINE_THRESHOLD)
…check-governed-merges.mjs:6717 — self-test summary line the ruled 5,000 declared once the ruled line, 3,000 since the maintainer's 2026-10-09 word, declared once
scripts/pm/check-governed-queue-guard.mjs:335-338 — header (the 2026-09-18 quote alone) the 2026-10-09 words added beside it, verbatim
…check-governed-queue-guard.mjs:340 — header prose HUMAN_MERGE_LINE_THRESHOLD (5,000) is declared there ONCE HUMAN_MERGE_LINE_THRESHOLD (3,000) is declared there ONCE
…check-governed-queue-guard.mjs:1913 — printed REFUSED guidance the 2026-09-18 and 2026-09-27 rulings listed the 2026-10-09 words listed beside them, verbatim
…check-governed-queue-guard.mjs:3463-3466 — pin on that guidance …quoting-both-rulings-untranslated…, two includes …quoting-all-three-rulings-untranslated…, a third includes on the 2026-10-09 words
scripts/pm/check-skill-line-ratchet.mjs:325-328 — ceiling-ledger comment describing the rule line a PR over 5,000 changed lines (additions + deletions, generated files included) a PR over the human-merge line (3,000 changed lines since the maintainer's 2026-10-09 word; additions + deletions, generated files included)
scripts/pm/dispatch-gates.mjs:26400 — the ONE pin (FROZEN file; the constant move breaks this pin, the freeze's own exception) …and it is the ruled 5000, HUMAN_MERGE_LINE_THRESHOLD === 5000, additions: 5001 …and it is the ruled 3000, === 3000, additions: 3001 — nothing else in the file: no rewording, no other pin, no --tier note
.claude/skills/pm-dispatch/SKILL.md:186 — the rule line 改动 [over]5000 行(含生成物)同换终局四件套,⛔ 无 Tier S 例外;读数 = PR additions+deletions。 改动 [over]3000 行… — the digit in place: 319/319 lines, widest row 342 bytes, 0 net lines, no re-wrap
.claude/skills/pm-dispatch/references/landing-operations.md:58 [over]5000 行(含生成物)照 Tier H。 [over]3000 行(含生成物)照 Tier H。 — the digit in place: 101/101 lines, 0 net lines
AGENTS.md:510 — Multi-agent discipline §7 (c) changed lines exceed 5,000 changed lines exceed 3,000 — in place, 1108 lines before and after

Readers that follow the constant unchanged (PM hypothesis 1, measured on this head)

git grep -n HUMAN_MERGE_LINE_THRESHOLD — every code reader reads the one declaration: check-governed-merges.mjs sizeVerdict :1582 / :1585 / :1591, the sweep's printed words :3377 / :3383, the self-test :5990-5991, :6012, :6175, :6181, :6251; check-governed-queue-guard.mjs import :499, printed CLEAR line :1880, :3269, and its own pin :3659 (this-file-declares-NO-threshold-of-its-own); dispatch-gates.mjs import :467, :13145, :26392-26396, :26594, :28568. objectui and cloud carry no copy (the card's reading; GOVERNED_REPOS covers them from this script).

The literal pin over the seven touched files

git grep -n -E '\b500[01]\b|5,000' on cfff9b1a over the seven files: 23 hits, every one a quoted maintainer ruling, a parse-only probe, or one regex artifact —

  • quoted rulings, verbatim and untouched: check-governed-merges.mjs:187 (2026-09-18), :191 and :1106 (2026-10-09, the words added), :260 (2026-09-27), :1103 (the 「比如5000」 fragment the docblock always quoted); check-governed-queue-guard.mjs:333, :337, :392, :1867, :1911, :1912, :1913, :3464, :3465, :3466, :3553; check-skill-line-ratchet.mjs:324 (the 2026-09-18 quote);
  • parse-only probes, unchanged on purpose: check-governed-merges.mjs:6003 (a string '5001' is NOT MEASURED), :6107 / :6109 (--additions 5000 --deletions 1 parse as the pair with the CALLER as source), :6196 (half a pair, --additions 5001 alone, is refused);
  • one regex artifact: check-skill-line-ratchet.mjs:779 — 15,000 (the authenticated REST quota) contains 5,000 as a substring; not the threshold, untouched.

No prose restatement outside a quote carries the old figure any more.

The measurement the card asks for: merged pull requests of the last 30 days between 3,001 and 5,000 changed lines

Window and filter, stated exactly. Repository objectstack-ai/objectstack only. Window: merged_at in [2026-09-09T12:16:51Z, 2026-10-09T12:16:51Z] (30 days back from the reading, taken at 2026-10-09T12:16:51Z). Source: GET /repos/objectstack-ai/objectstack/pulls?state=closed&sort=updated&direction=desc&per_page=100, paged until a page's oldest updated_at fell before the window start (27 pages, 2,700 closed pull requests read; a merge inside the window implies updated_at at or after it, so no later page can hold one); then one GET /repos/objectstack-ai/objectstack/pulls/{n} per candidate for additions / deletions (the list object omits them). Changed lines = additions + deletions as GitHub reports them, generated files included — the same number the predicate reads. ⛔ This is a reading of one window in one repository, not a claim about every pull request ever merged; objectui and cloud are not in it.

  • candidates (merged inside the window): 2606; sized: 2606; per-PR reads that failed: 0
  • at or under 3,000 changed lines (unaffected by the move): 2579
  • 3,001–5,000 changed lines — the population the new line adds: 16 (≈ 0.5 per day; 0.6% of the window's merges)
  • over 5,000 changed lines (already on the human-merge line before this change): 11 — 19024, 18971, 17076, 20639, 21352, 20125, 19803, 18638, 17372, 22002, 21084
PR changed lines +additions / −deletions files merged (UTC) title
19728 4882 +4813 / −69 22 2026-09-24 feat(formula,objectql): read one hop through a lookup in a validation predicate
21222 4307 +1066 / −3241 46 2026-10-01 feat(spec,rest,lint)!: retire the form field's publicPicker and the anonymous lo…
19921 4220 +730 / −3490 40 2026-09-24 fix(sdui-manifest): one producer from objectui's built tree; retire the declarat…
19738 3761 +1962 / −1799 25 2026-09-23 docs(skills): split the four over-500-line SKILL.md into routing + references, T…
21377 3646 +3557 / −89 36 2026-10-02 feat(automation): a flow's credentials live in a write-only channel on the secre…
20236 3581 +2427 / −1154 14 2026-09-27 fix(runtime,rest): the dispatcher /meta item reads ask the per-caller read gate …
21946 3567 +3560 / −7 6 2026-10-06 ci(merge-queue): name a no-runner red as infra:no-runner, with a once-per-head r…
19737 3460 +405 / −3055 22 2026-09-23 pm: retire the needs:contract-review label from the tree (ruling B step ③)
17454 3380 +2171 / −1209 45 2026-09-12 feat(auth)!: adopt better-auth's account-issuer rollback — drop sys_account.issu…
17334 3368 +3315 / −53 44 2026-09-10 fix(triggers,spec,service-automation)!: a time-triggered flow declares its actin…
22193 3320 +1750 / −1570 56 2026-10-08 feat(spec)!: a page gains an optional print declaration and a linted printable b…
19725 3227 +3156 / −71 12 2026-09-22 feat(pm): fleet-write relay — closed op table, validator, executor, seat-side di…
20532 3122 +2419 / −703 76 2026-09-29 fix(spec): shard the generated liveness and strictness counts so PRs moving diff…
20903 3090 +1960 / −1130 51 2026-09-30 feat(spec)!: connector-attached sync leaves the connector — syncConfig / fieldMa…
18198 3071 +2632 / −439 48 2026-09-16 feat(types,triggers,service-automation,runtime,cli,spec,lint)!: package-authored…
20194 3044 +970 / −2074 46 2026-09-27 feat(spec)!: retire the export-job API family, IExportService and ScheduleState …

(PR numbers are written as plain digits on purpose: titles in this repository begin with fix/chore/…, and a closing keyword beside a #-reference would make the platform close that card on merge.)

Gates: the derived union, every exit captured before any pipe, reconciled with --ran on head cfff9b1a

Derivation: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack on cfff9b1a — its first stderr line names the tree ("gate list derived from the tree of 'objectstack-ai/objectstack' at commit cfff9b1"), the change set is 7 path(s) three-dot off merge base f66c440de of origin/main (committed 7, working tree 0, untracked 0). 45 commands derived. Each ran as printed, eval "$cmd" ... ; status=$? before any pipe, recorded as cmd :: exit N; the battery ran to completion on the final head with its exit captured to a file (pnpm check:pm-dispatch-gates: ✓ dispatch-gates self-test: 2011 cases pass. — 1080.2s on this box; an earlier bare nohup run on the same head also printed 2011 cases pass but its exit was never captured, so it is not the record).

Reconciliation (node scripts/pm/dispatch-gates.mjs --ran ran.list, exit 0): Run reconciliation — 45 derived, 45 run, 0 NOT-MEASURED, 0 UNRUN. · ✓ dispatch-gates --ran: 45 derived famil(ies) accounted for — 45 run, 0 NOT-MEASURED (a DERIVED zero — all 45 recorded an exit code and none of them is 3).

# command exit
1 node scripts/check-ci-filter-parity.mjs 0
2 node scripts/check-closing-keyword-parity.mjs 0
3 node scripts/check-closing-keyword-parity.mjs --self-test 0
4 node scripts/check-comment-mask-corpus.mjs 0
5 node scripts/check-declaration-mirrors.mjs 0
6 node scripts/check-declaration-mirrors.mjs --self-test 0
7 node scripts/check-scripts-symbol-anchors.mjs 0
8 node scripts/check-scripts-symbol-anchors.mjs --self-test 0
9 node scripts/check-self-test-wired.mjs 0
10 node scripts/check-self-test-wired.mjs --self-test 0
11 node scripts/check-self-test-workflow-commands.mjs 0
12 node scripts/check-self-test-workflow-commands.mjs --self-test 0
13 node scripts/check-skills-token-ratchet.mjs 0
14 node scripts/check-skills-token-ratchet.mjs --self-test 0
15 node scripts/check-whole-set-label-write.mjs 0
16 node scripts/check-whole-set-label-write.mjs --self-test 0
17 node scripts/pm/bare-root-worklist.mjs --self-test 0
18 node scripts/pm/check-governed-queue-guard.mjs --self-test 0
19 node scripts/pm/check-harness-current.mjs --self-test 0
20 pnpm check:agent-test-spelling 0
21 pnpm check:bash32-floor 0
22 pnpm check:cli-command-ids 0
23 pnpm check:closing-target-claim 0
24 pnpm check:cross-package-test-inputs 0
25 pnpm check:declared-population-live 0
26 pnpm check:doc-authoring 0
27 pnpm check:docs-audit-scope 0
28 pnpm check:driver-memory-census 0
29 pnpm check:entry-guard 0
30 pnpm check:gitlink-declared 0
31 pnpm check:nul-bytes 0
32 pnpm check:parse-guard 0
33 pnpm check:pm-expected-skips 0
34 pnpm check:pm-governed-merges 0
35 pnpm check:pm-governed-prose 0
36 pnpm check:pm-skill-id-lint 0
37 pnpm check:pm-skill-ratchet 0
38 pnpm check:pnpm-filter-targets 0
39 pnpm check:ratchet-remedy-authority 0
40 pnpm check:refd-timer-probe 0
41 pnpm check:required-contexts 0
42 pnpm check:skill-frame-sync 0
43 pnpm check:watch-hint-literal 0
44 pnpm --filter @objectstack/lint run check:doc-formula-expressions 0
45 pnpm check:pm-dispatch-gates 0

Notes on the run:

  • pnpm --filter @objectstack/lint run check:doc-formula-expressions first answered exit 3 — PREREQUISITE NOT MET (@objectstack/formula and @objectstack/lint not built; "Nothing was measured"). That is not a measurement, so it is not the record: the prescribed pnpm exec turbo run build --filter=@objectstack/formula --filter=@objectstack/lint ran under the shared verify lock (os-verify-lock: VERDICT command-exit 0 · held the lock 186s · waited 0s), and the gate re-ran: exit 0. The row above is that re-run.
  • The diff touches no workspace package (every path is root-owned), so no package build/test/typecheck is owed locally and none was run beyond that prerequisite build; pnpm lint (the repo-wide eslint sweep) is CI's run, not derived here, and was not run.
  • The four skill/prose gates named by the card (check:pm-skill-ratchet, check:pm-skill-id-lint, check:pm-governed-prose, check:nul-bytes) are in the union and green; check:pm-skill-ratchet reads SKILL.md 319/319 and landing-operations.md 101/101 with headroom 0, unchanged.
  • CI convergence is the PM's to read; this is the local half.

Reverse verification: the constant alone back to 5000, every pin left at 3000

PM hypothesis 2 asked for the pins to be found by moving the constant first. Measured as a mutation leg instead, in a throwaway detached worktree at cfff9b1a (installed; node_modules removed and the worktree removed afterwards), through scripts/ablation-replace.mjs so the on-disk evidence is the tool's own: anchor export const HUMAN_MERGE_LINE_THRESHOLD = 3000; x1 → x0, replacement … = 5000; x0 → x1, blob 6d8be7178d5f → 717e33fc3d6d, "ok mutation landed"; after every leg, "ok restored: blob == HEAD (6d8be7178d5f) and git diff HEAD is empty", and a separate git status --porcelain read of 0 lines. Expected direction: RED on the pins that bind the number, GREEN where the number is only imported.

leg command under the mutation result
1 node scripts/pm/check-governed-merges.mjs --self-test exit 1 — 5 failure(s): the-threshold-is-the-ruled-3000-of-2026-10-09-declared-once: 5000; ⭐ exactly-3000-changed-lines-is-UNDER-the-threshold (read changedLines: 5000, threshold: 5000); ⭐ 3001-changed-lines-is-OVER-it-the-count-is-additions-PLUS-deletions (read changedLines: 5001); and-the-threshold-the-strict-comparison-and-the-generated-files-inclusion-are-UNCHANGED-by-the-lift; --json-carries-governed-false-humanMerge-true-and-the-size-block (3,001 handed in read threshold: 5000, exceeds: false)
2 node scripts/pm/check-governed-queue-guard.mjs --self-test exit 0 — 296 cases pass: this file declares no threshold of its own (its own pin this-file-declares-NO-threshold-of-its-own forbids one) and reads LINE = HUMAN_MERGE_LINE_THRESHOLD through the import, so it follows the constant wherever it is — green by design, not a vacuous pin
3 node scripts/pm/dispatch-gates.mjs --self-test exit 1 — 1 of 2011 case(s) failed: ✗ the threshold is read from the gate — no second copy here — and it is the ruled 3000 — the one pin at :26400, and nothing else in the frozen file

So the number binds in exactly six places outside its declaration — five merges pins and the one dispatch-gates pin — which are exactly the rows this PR moved; on the unmutated head all three self-tests are green (below).

Acceptance notes

  • PM hypothesis 2 (move the constant first, repair what reds): executed as one coherent edit set, and then measured the other way round by the mutation leg above — the constant alone back to 5000 reds exactly five merges pins and the one dispatch-gates pin; the queue guard pins no number of its own (its :3659 pin forbids one), so it stays green by design. Same information, reported as a measurement.
  • check-skill-line-ratchet.mjs:325-328: a code comment inside a ceiling-ledger entry; re-wrapped 3 → 4 lines (a .mjs file, no line ceiling). It names the lowered line without restating the old figure, so the literal pin stays clean.
  • check-governed-queue-guard.mjs:3463: the pin's name quoting-both-rulings became quoting-all-three-rulings and gained a third includes, so the new printed words are pinned exactly like the earlier two. Battery floors are by battery name and count; the case count is unchanged (296).
  • The fixture PR numbers in check-governed-merges.mjs (#5000 / #5001) were mnemonics for the line a synthetic commit stands at; moved to #3000 / #3001 so the pin reads true against the live LINE and the literal grep stays clean. Synthetic repo, no real PR named.
  • dispatch-gates.mjs (FROZEN, ruling 208 R6): the one pin at :26400 only, digits only. The --tier note from the earlier card is not added; it waits on the letter of its own card ([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).
  • 15,000 at check-skill-line-ratchet.mjs:779 matches the 5,000 alternation as a substring; a quota figure, untouched.
  • Changeset: none, skip-changeset applies — root package.json is private: true; none of the seven touched paths is owned by any of the 132 workspace packages; positive control: packages/spec/src/index.ts is owned by @objectstack/spec (private: false, files[] present). scripts/pm/**, .claude/** and AGENTS.md publish nothing.
  • Shared checkout /home/user/objectstack untouched at f66c440d; worktree only.
  • Nothing found out of scope; nothing filed.

维护者速读(草稿)

改了什么

把「超过多少行就必须人工审核」这条线从 5000 行降到 3000 行(additions + deletions,含生成物)。数字只在 scripts/pm/check-governed-merges.mjs 里声明一次,队列守卫、派发脚本、自检、技能文件与 AGENTS.md 都跟着这一处读;自检的钉子同步挪到 3000/3001;三条早前的原话原样保留,10 月 9 日的原话加在旁边。

为什么改

按维护者 2026-10-09 的裁决原话执行:「这种大额改动就应该人工审核,我还是建议5000行的人工审核门槛降到 3000,立卡。」 字面已给定,不是决策卡。

风险与代价(含回滚)

  • 代价:落地后,3001–5000 行之间的 PR 从「绿了就能排队合并」变成「要维护者 APPROVED(或人工直合)才能落地」。本 PR 正文的 30 天实测给出了这个区间的 PR 数量,即新增的审核负担。
  • 风险:低。规则其余部分一字未动(四件套、无 Tier S 例外、含生成物、各仓覆盖)。dispatch-gates.mjs 冻结文件只动了那一枚因常量搬家而必红的钉子。
  • 回滚:把那一处常量改回 5000 并把自检钉子一并改回即可(本 PR 的反向镜像);不涉及任何发布面,无 changeset。

席位意见

(留空)

你要做的

本 PR 触及 Tier H(AGENTS.md)与 Tier S(.claude/**),按治理规则留在 draft:维护者给出 APPROVED 后由认领席落地,或由维护者人工直合。不需要你做别的决定。


Generated by Claude Code

…nes (HUMAN_MERGE_LINE_THRESHOLD), per the maintainer's 2026-10-09 ruling

The maintainer, 2026-10-09, verbatim: 「这种大额改动就应该人工审核,我还是建议5000行的人工审核门槛降到 3000,立卡。」

- scripts/pm/check-governed-merges.mjs: the one declaration moves 5000 → 3000;
  the header and docblock prose state 3,000 beside the earlier quotes (kept
  verbatim) with the 2026-10-09 words added; the self-test pins on the line
  (ruled default, exactly-at under, over-by-one over, the lift's unchanged
  threshold, the --test / --json runs, the fixture subjects) move to
  3000 / 3001; the parse-only probes stay.
- scripts/pm/check-governed-queue-guard.mjs: the stated value in the header,
  the 2026-10-09 words beside the earlier two in the header and in the REFUSED
  guidance, and the pin on that guidance extended to the new words.
- scripts/pm/check-skill-line-ratchet.mjs: the sentence describing the rule line.
- scripts/pm/dispatch-gates.mjs: the one pin on the constant (3000 / 3001);
  nothing else in the frozen file.
- .claude/skills/pm-dispatch/SKILL.md, references/landing-operations.md,
  AGENTS.md: the digit in place, 0 net lines.

Claude-Session: https://claude.ai/code/session_01JmWtcHfGbC4ncw4GFKWuRA
Co-authored-by: Claude <noreply@anthropic.com>
@github-actions github-actions Bot added size/s documentation Improvements or additions to documentation labels Oct 9, 2026
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 9, 2026
@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

Contract review

Served-tier: CONTRACT_REVIEW_TIER
Head-sha: cfff9b1ade9e9afef16b796bb51ccca41d5f5a46
Local-runs: none

① Derived judgments

  • Accept set: the governance predicate's one number — HUMAN_MERGE_LINE_THRESHOLD 5,000 → 3,000, declared once at check-governed-merges.mjs:1115; sizeVerdict, the sweep's printed words, the queue guard and dispatch-gates.mjs read it from the import, so no second copy moves. The predicate stays strictly greater (the self-test pins exactly-3,000 under and 3,001 over, the lift's unchanged threshold, the --test / --json runs and the fixture subjects renamed #3000 / #3001). Right, and exactly the maintainer's letter: 「这种大额改动就应该人工审核,我还是建议5000行的人工审核门槛降到 3000,立卡。」 — nothing else about the rule changes (the four-piece terminal set, no Tier S exception, generated files included, GOVERNED_REPOS).
  • The rulings stay verbatim and gain the third: the 2026-09-18 and 2026-09-27 quotes are untouched in both gate headers, the docblock and the queue guard's printed REFUSED guidance, and the 2026-10-09 words are added beside them (check-governed-merges.mjs ×2, check-governed-queue-guard.mjs ×3, the guard's pin extended to "all three rulings", 296 cases unchanged). Right.
  • The literal pin over the seven files on the head: every remaining 5000 / 5001 / 5,000 is a quoted ruling, a parse-only probe ('5001' as a string, the --additions 5000 flag parsing, the half pair) or the unrelated 15,000 quota in a comment — read by the seat with git grep, matching the PR body's table. Right.
  • scripts/pm/dispatch-gates.mjs: exactly one line changed (the pin at 26400 — === 3000, additions: 3001, the words "the ruled 3000"), the freeze's own exception as the triage read it; no --tier note, nothing else. Right.
  • Governed text: SKILL.md:186 and landing-operations.md:58 carry the digit in place (319/319 with the 342-byte widest row and 101/101 unchanged); AGENTS.md:510 in place (1108 lines). check-skill-line-ratchet.mjs's ceiling-ledger comment re-wrapped 3 → 4 lines in a .mjs file with no ceiling, naming the lowered line without the old figure. Right.
  • The measurement the card asked for is in the PR body: 2,606 merges in the last 30 days, 2,579 at or under 3,000 changed lines, 16 between 3,001 and 5,000 (the population the line adds, listed by number), 11 over 5,000 — read from the pulls list, window and filter stated. Right.
  • Public surface: none (scripts/pm/**, .claude/**, AGENTS.md publish nothing); Clause-②: no is correct.

② Semver level

Clause-②: no on the claim and the PR body; skip-changeset is the correct declaration. No .changeset/*.md touched.

③ Boundary flags

  • The dev was killed by the usage wall at about 13:07Z after the label stroke's read-back and resumed at 14:05Z from its on-disk ledger: battery exit 0 (1,080.2 s on cfff9b1a, re-run with the exit captured after a first bare run), --ran 45/45 reconciled, the PR body already complete — only the report was posted after the revival. Nothing was redone; accepted.
  • Mechanism assumption 2 (move the constant first, repair what reds) was executed as one edit set and measured the other way round by the ablation (constant alone back to 5,000: the merges self-test red on exactly the five line pins, the dispatch-gates battery red on exactly the :26400 pin, the queue guard green by its own number-free pin). Same information; accepted.
  • CI on the head: 35 check runs, every one success or skipped; mergeable_state clean; git merge-tree against origin/main 35ef501e clean.
  • Git identity: one commit, authored and committed by objectstack-fleet[bot] with the fleet e-mail, model-free trailer pair — no deviation. mcp_calls 0 (one gh api graphql probe answered 403, a refused read).
  • open_questions: none; out-of-scope findings: none.

Implemented-by: claude/issue-22451-human-merge-threshold-3000
Reviewed-by: session_01JmWtcHfGbC4ncw4GFKWuRA

VERDICT: PASS

@objectstack-fleet

Copy link
Copy Markdown
Contributor Author

维护者速读 — PR #22490(#22451)— skills 席 1,2026-10-09T14:10Z

  • 改了什么: 人工审核行数线 HUMAN_MERGE_LINE_THRESHOLD 从 5,000 改为 3,000,仍只在 check-governed-merges.mjs 声明一次,其余读者(判定、打印句、队列守卫、dispatch-gates)都从导入读;判定仍是"严格大于"(恰好 3,000 不算,3,001 算),自测 pin 与 fixture 随数字移;三条裁决原话逐字保留(2026-09-18、09-27),10-09 的原话加在旁边;dispatch-gates.mjs 只动第 26400 行那条 pin(冻结的自身例外);SKILL.md:186、landing-operations.md:58、AGENTS.md:510 原位改数字,行数不变。七个文件 +57/−40。
  • 为什么改: 你 10-09 的原话 「这种大额改动就应该人工审核,我还是建议5000行的人工审核门槛降到 3000,立卡。」。落地后 3,001 行以上的 PR 走四件套终局(你的 APPROVED + 席位落地,或人工合并)。
  • 风险与代价(含回滚): 纯治理门禁与文本,不发包、无 changeset;审核负荷实测:近 30 天 2,606 次合并,新线多拦 16 次(3,001–5,000 行,PR 正文有清单),5,000 以上 11 次。自测与 2,011 例电池全绿;反向消融:只把常量改回 5000,恰好五条 pin 与 dispatch-gates 那一条 pin 变红,其余不动。回滚 = 还原一个提交。
  • 席位意见: 建议批准。与你的原话一一对应,不多改一处;本席契约复核 PASS 在案(6082600302)。
  • 你要做的: 看一眼 PR 正文的"site → old → new"表,认可就给一个 APPROVED;批准后席位落地(你顺手 ready + auto-merge 也可)。

@os-zhuang
os-zhuang marked this pull request as ready for review October 9, 2026 14:14
@os-zhuang
os-zhuang added this pull request to the merge queue Oct 9, 2026
Merged via the queue into main with commit 6212cc6 Oct 9, 2026
41 checks passed
@os-zhuang
os-zhuang deleted the claude/issue-22451-human-merge-threshold-3000 branch October 9, 2026 14:44
This was referenced Oct 9, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

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

2 participants