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
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