Skip to content

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

@objectstack-fleet

Filing gate: a maintainer ruling, recorded for execution. Filed by the director seat (summon #35, session_01VYToj6PQehTEKNrjGM9akg, GitHub os-zhuang; written as objectstack-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-zhuang or hotlong) 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 of GOVERNED_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/main 440bed63e7)

  • 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").
  • Self-test pins on the number: :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 :1863 and :1907–:1908, its pins at :3459–:3460 and :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:187 and .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_REPOS covers 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.
  • The skill lines, landing-operations.md, AGENTS.md:510 and the queue guard's printed guidance say 3,000.
  • check-governed-merges.mjs --self-test, check-governed-queue-guard.mjs --self-test and check-skill-line-ratchet.mjs green.
  • Measured in the PR, for the record: how many pull requests merged in the last 30 days fell between 3,001 and 5,000 changed lines, the population the new line adds, so the maintainer sees the review load the ruling buys.
  • 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,000


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: 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:26400

    Triage 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/** and AGENTS.md. That puts the card in domain:skills. It carries a maintainer ruling with the letter given. ⛔ No decision is owed.

  2. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 3
    Session: session_01JmWtcHfGbC4ncw4GFKWuRA
    Account: os-elon-musk (the seat's linked user as GET /user answers 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 → 3000 at 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, the 5001 / 5000 probes 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.mjs ONLY at line 26400 (the pin HUMAN_MERGE_LINE_THRESHOLD === 5000 with its additions: 5001 probe → 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.md line 186 and .claude/skills/pm-dispatch/references/landing-operations.md line 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), and AGENTS.md line 510 (Tier H: the number in place). Pin: 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; check-governed-merges.mjs --self-test, check-governed-queue-guard.mjs --self-test, check-skill-line-ratchet.mjs and the check:pm-dispatch-gates battery 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 (#22458 d87dff67 on SKILL.md, #22457 587bd969 on landing-operations.md) — both MERGED, nothing in flight on them; AGENTS.md last touched 9bdbd766 (2026-10-01); the three scripts/pm gate scripts 1db5322b / da93a8b3 / f151ef2c, dispatch-gates.mjs 5ff7cbe3 (2026-10-08); no open PR touches AGENTS.md, .claude/** or scripts/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 --tier note stays out (waits on #22453); verify lock reads LOCKED at the reading — the dev takes the lock protocol as os-verify-lock.sh prescribes; the lane holds no open p1. Readings at 2026-10-09T12:07Z.

  3. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

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

  4. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT — 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:09Z

    Verified on GitHub and on the fetched branch, not on the report: a draft PR against main, first line Fixes #22451 (the only closing keyword in the body), 7 files (+57/−40): HUMAN_MERGE_LINE_THRESHOLD 5,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.mjs changed at the one pin only, SKILL.md:186 / landing-operations.md:58 / AGENTS.md:510 in 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, the check:pm-dispatch-gates battery 2,011 cases in 1,080.2 s on this head; the gate union pinned to cfff9b1a (45 families, --ran 45/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 one success or skipped; mergeable_state clean. mcp_calls 0; api_writes 3 relay strokes (pr_create, label-write, the report 6082535728) — skip-changeset and the assignee read back. Commit authored by objectstack-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 from os-zhuang and hotlong through 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.

  5. objectstack-fleet commented on Oct 9, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed — PR #22490 MERGED by the approver, card closed by Fixes — skills seat 1, session_01JmWtcHfGbC4ncw4GFKWuRA, 2026-10-09T14:46Z

    Two readings, taken together: PR #22490 reads merged: true at 2026-10-09T14:44Z (commit 6212cc6cf2a41d3d2775d8939d8260f3ca7da64f, merged through the merge queue after os-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 of origin/main as fetched in this act — a single-parent squash commit (the queue's own method). The seven files are byte-identical to the PR head cfff9b1a; origin/main now declares HUMAN_MERGE_LINE_THRESHOLD = 3000 once, 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 completed by Fixes; pm:dispatched and the assignee are stripped in this act, and so is the PR's needs-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), merges origin/main behind this landing before its PR. Nothing else is owed on this card.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions