Repository navigation
[ruling] a PR whose changed line count exceeds 5,000 lands only by a human merge — rule line in SKILL.md + landing-operations.md, and a size predicate in the landing gate #19012
Description
Activity
- addedpriority:p1High: required for production / M2High: required for production / M2and removed
on Sep 18, 2026 os-elon-musk commented
on Sep 18, 2026 CollaboratorAuthorMore actionsClaim: PM loop round 1 (wave 7b — maintainer ruling)
Session:session_01BTeBejoPUvRHN8WdAJC6oF
Branch:claude/issue-19012-size-threshold-human-merge
Worktree:objectstack-issue-19012
Domain:domain:skills
Seat:domain:skills#1
File surface:scripts/pm/check-governed-merges.mjs(a SIZE predicate beside the path predicate:additions + deletions > 5000⇒ human merge, one declared constant, a pin per side, fed by--pr Nthrough the proxy or the numbers passed in) +scripts/pm/dispatch-gates.mjs(the same reading printed at dispatch time) +.claude/skills/pm-dispatch/references/landing-operations.md(the checklist row) + ONE line in.claude/skills/pm-dispatch/SKILL.md's landing rules (812 / 812 — fold or pay; ⛔ only if it lands disjoint from PR #18903's hunks :509–:525 / :633–:675 and #18993's :339, else the line waits for #18903 and the rest lands first)
Container & model:M,mode:subagent,model: claude-fable-5-1(CONTRACT_REVIEW_TIER, path-mandated by SKILL.md); the seat's contract-tier review at delivery; governed ⇒ draft at the four-piece terminal
Clause-②: no
Thread-read: (card body — a maintainer ruling, no triage comment yet)
Serial constraints cleared:check-governed-merges.mjs— no open PR in the lane's thirteen (file lists read at 2026-09-18T11:05Z);dispatch-gates.mjs— PR #18903 (draft) touches it in another region: whichever lands second mergesorigin/main;landing-operations.md— no open PR; stem scan oforiginheads (size-threshold,19012): none; the revert of PR #18971 (#19011, spec) also touchesdispatch-gates.mjs— ⛔ do not depend on it either way. Lock free.
Ruling-ref: maintainer verbatim 「还有应该完善skills,修改代码量超过某个行数(比如5000)就应该人工审核。」 (chat, 2026-09-18; recorded on #16045 with ruling C) — 5,000 =additions + deletions, generated files included; threshold moves by one word from the maintainer
Generated by Claude Code
os-elon-musk commented
on Sep 18, 2026 CollaboratorAuthorMore actionsos-dev-report
{ "issue": 19012, "status": "done", "branch": "claude/issue-19012-size-threshold-human-merge", "pr": "https://github.com/objectstack-ai/objectstack/pull/19033", "session": "session_01BTeBejoPUvRHN8WdAJC6oF", "premise_still_valid": true, "summary": "The maintainer ruling 「还有应该完善skills,修改代码量超过某个行数(比如5000)就应该人工审核。」 now has a mechanical face: scripts/pm/check-governed-merges.mjs declares HUMAN_MERGE_LINE_THRESHOLD = 5000 once and its --test/--pr/--branch verdict carries a SIZE limb — --pr reads additions/deletions off the same GET /pulls/N that gives changed_files (a missing pair is a refusal on exit 1, never a zero), --branch counts the merge-base range with git diff --numstat, --test takes --additions N --deletions N as a pair or says size: NOT MEASURED on stdout; either limb exits on the GOVERNED code 3, generated files included with no exemption (a certified regeneration lifts the path, never the size). scripts/pm/dispatch-gates.mjs prints the same reading beside the tier verdict (worktree numstat + untracked files; an explicit path list prints NOT MEASURED) and imports the threshold rather than copying it. Rule text: one 111-byte SKILL.md line beside the four-piece-terminal trigger (:608) and the landing-operations.md pre-check row folded to --pr N with the size limb (117 B, ceiling unchanged); the SKILL.md ceiling rises 812 → 813 under the ratchet's maintainer exit, measured (0 of 598 bullet pairs fold under 120 B). Draft PR #19033 at the four-piece terminal; assignee was pre-set by the dispatch and never touched; origin/main merged once (SKILL.md siblings #18921/#18981 landed disjoint; the line is present once).", "tests": "Replay on the live API through the proxy — BASE 43f476688 copy: `check-governed-merges.mjs --pr 18971` exit 0 「✅ NOT governed — ordinary queue landing applies」; this head: exit 3 「⛔ HUMAN MERGE — 238429 changed line(s) (+238310 / -32…) > 5000」 (exact line: `238429 changed line(s) (+238310 / -119) > 5000`); `--pr 18994` exit 0 `size: 16 changed line(s) (+15 / -1) ≤ 5000 — under`; `--pr 18921` exit 3 GOVERNED + `size: 12 … under`; `--pr 19033` (this PR) exit 3 GOVERNED by path (.claude/** ×2) + `size: 724 changed line(s) (+692 / -32) ≤ 5000`, matching GitHub's own additions/deletions on the PR object. Self-tests: `check-governed-merges.mjs --self-test` 328 assertions / 26 batteries at BASE → 369 / 27 on this head (new battery ⭐ the SIZE predicate, floor 30: 5000 under, 5001 over, 238310+119 = 238429 over, NOT MEASURED never zero, lift moves the path not the size, numstat with a binary row at 0, pair/half-pair/non-integer flags, --pr fixture with and without the pair, end-to-end on a real repo: --branch counts +6/-1 with a binary at 0, byte-identical verdict through --branch and --test on the same list and numbers, exit 3 at 5001 and 0 at 5000, --json humanMerge, one flag = exit 1, flags beside --branch = exit 1 two readings). `pnpm check:pm-dispatch-gates` detached (nohup + tail --pid, 795.6 s): `✓ dispatch-gates self-test: 1862 cases pass.` (+13 cases: derived size +1/-0, dirty tree +3/-1 with an untracked file, an untracked binary at 0 lines, provenance line, changedLineLines over/at/none/threshold, lineCountOf text/binary, --tier explicit prints NOT MEASURED, --tier derived prints the measured line, --json changedLines.measured false). First detached run on the pre-merge tree was aborted on purpose (tree changed under it); the merged-tree run failed 1/1862 on the named line-number census (my import block moved this file's inherited-population marker :702 → :705) — row updated, rerun on the final head 7fdd61ca0 green. dispatch-gates --tier (no paths, this worktree): `Changed lines — 722 (+691 / -31; generated files INCLUDED) vs the human-merge threshold 5000: under.` No ablation owed (no build/dist path; the pins are the self-test batteries above). Exit codes captured as `cmd > log 2>&1; status=$?` before any pipe.", "gates": "Derived with `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` from the worktree (no paths; 5-path change set) at the final head 7fdd61ca0: 42 commands, all run, all `:: exit 0`; `--ran` reconciliation: `✓ dispatch-gates --ran: 42 derived famil(ies) accounted for — 42 run, 0 NOT-MEASURED` (0 UNRUN). Named in the dispatch and green on the final head: check:pm-governed-merges (369 assertions), check:pm-dispatch-gates (1862 cases, detached), check:pm-skill-ratchet (SKILL.md is 813 lines, ceiling 813, headroom 0; landing-operations.md is 69 lines, ceiling 69), check:pm-skill-id-lint (27 files clean), check:nul-bytes (8913 text files, no control bytes), check-governed-queue-guard --self-test, check:pm-governed-prose, check-skills-token-ratchet, check:watch-hint-literal, check:declared-population-live. check:doc-formula-expressions exited 3 = PREREQUISITE NOT MET (formula/lint not built) on the first pass — not a measurement; both packages built under scripts/pm/os-verify-lock.sh (VERDICT command-exit 0, held 152 s, waited 0 s) and the gate reran exit 0. NOT MEASURED locally by the derivation itself: 3 CI-only value-bearing commands (check-shard-attestation --emit, check-test-completeness, check-half-states --format=markdown --provenance), 11 wide-population families, 50 artifact-roster families — CI-owned. `pnpm lint` (repo-wide eslint) not run: CI-owned. No packages/** file touched ⇒ no ①/② build/test owed. The derivation reported STALE TREE twice (origin/main moved under a sibling's fetch: 6 commits before my merge, then 3 after — none of the 3 touch my five files; merge-base for the PR is 96cf32b07). CI on the PR: in_progress at report time; not awaited.", "line_budget": { "SKILL.md": "before 812 lines / ceiling 812 → after 813 / 813 (headroom 0); +1 line at :608, 111 B; ceiling raised under the ratchet's maintainer exit with the ruling quoted in the CEILINGS entry. Fold measured impossible: 0 of 598 adjacent bullet pairs merge under 120 B (smallest 123 B); the trigger line :607 is 118 B.", "landing-operations.md": "before 69 / 69 → after 69 / 69; line 26 folded 118 B → 117 B (pre-check spelled --pr N, size limb 「>5000 行(含生成物)照规则层」); of its 50 bullet pairs 1 merges under 120 B but splices two unrelated D-section rules — not used.", "check-skill-id-lint": "27 files clean; neither line carries an issue-ID citation, date or quotation." }, "files_changed": [ "scripts/pm/check-governed-merges.mjs (+523/-…: HUMAN_MERGE_LINE_THRESHOLD, sizeVerdict, landsByHumanMerge, renderSizeLines, parseNumstat, pullSizeFrom, readSizeFlags, SIZE_FLAGS, CALLER_SIZED_NOTE; --pr/--branch/--test plumbing; header section; self-test battery + roster 26 → 27, floor 25 → 27)", "scripts/pm/dispatch-gates.mjs (+181: import of the threshold, changedLinesFromGit, lineCountOf, changedLineLines, provenance size line, --json changedLines, human/--tier stdout line; 13 self-test cases; census row :702 → :705)", ".claude/skills/pm-dispatch/SKILL.md (+1 line at :608)", ".claude/skills/pm-dispatch/references/landing-operations.md (line 26 rewritten)", "scripts/pm/check-skill-line-ratchet.mjs (CEILINGS SKILL.md 812 → 813 with the ruling entry)" ], "deviations": [ "Mechanism assumption 1 (a failing size read exits PREREQUISITE NOT MET = 3): under --pr the code 3 already means GOVERNED and the file's own contract forbids one invocation carrying both meanings, so a PR object without the additions/deletions pair is a REFUSAL on the derivation code 1 (stated, never 0, never a size of zero). The ruling's intent — never read as not governed — is kept.", "SKILL.md 「fold or pay」: measured, neither was available (0 fold capacity; deleting a ruled clause refused by precedent), so the line lands under the ratchet's own maintainer exit 812 → 813, the 811 → 812 entry's form, with the ruling quoted in the CEILINGS entry and the PR body. The hunk (:608) is disjoint from #18903's bands (:509–:525, :633–:675) and #18993's :339; the seat may drop the SKILL.md hunk + ratchet entry together and file the line behind #18903 if it prefers that route.", "--branch derives the size itself (numstat on the range it lists) instead of taking passed-in numbers; --additions/--deletions beside --pr or --branch are refused as two readings of one number.", "The dispatch-gates self-test's named census of live population markers pins file:line; the import block moved this file's own inherited-population marker :702 → :705 and that row was updated (the census exists to record exactly such moves).", "Commit trailer: the harness-stamped Co-Authored-By carried a model name and the pre-push hook refused it; amended to the AGENTS.md model-free pair before the first push (AGENTS.md outranks the harness reminder).", "The PR body was written once at creation; stored byte-identical to the sent text apart from a trailing newline; one session-URL footer, 维护者速读(草稿) section present, no angle-bracket fragments, Fixes only on line 1." ], "reader_test": "The skill tree defines no 「reader test」 (grep for reader test / 读者测试 in .claude/skills/pm-dispatch and .claude/agents: none), so this is my reading of it: a seat reading SKILL.md :608 alone learns the trigger (改动 >5000 行), that generated files count (含生成物), the destination (同换终局四件套), that the fact-layer exception does not apply (⛔ 无事实层例外) and what the number is (读数 = PR additions+deletions); a seat at the landing window reading landing-operations.md :26 alone learns the one command to run (check-governed-merges.mjs --pr N) and that both limbs route to the rules layer; neither line needs the other or a card to act on, and the number is read in one place (the PR object) by one tool. The PR-body reader test: the 维护者速读 ends with one question (确认 5000 是否是您要的;是 ⇒ 人合本 PR).", "mcp_calls": "0 — no MCP GitHub tool was called; every GitHub read and write went through REST via the session proxy (curl with GITHUB_TOKEN, or the repo's own scripts re-exec'd with --use-env-proxy).", "api_writes": "4 channels, as budgeted — git push ×5 on the one branch (the empty write-route probe, then four WIP/final pushes; last: 7fdd61ca0); POST /repos/objectstack-ai/objectstack/pulls ×1 (draft #19033, HTTP 201, Content-Type application/json); POST /repos/objectstack-ai/objectstack/issues/19033/labels ×1 via scripts/pm/label-write.mjs --add skip-changeset (HTTP 200; read-back MATCHES: size/l, skip-changeset); POST /repos/objectstack-ai/objectstack/issues/19012/comments ×1 (this os-dev-report). No PATCH, no PUT, no DELETE, no assignee write, no second claim. needs:contract-review: not on PR #19033 (labels: size/l, skip-changeset); check-clause2-carriers --pair 19033 exit 0 (Clause-②: no declared on the claim and the PR body).", "open_questions": [], "out_of_scope_findings": [ "to file (class b — a declared contract the queue cannot yet hold; dedupe: queue guard size threshold · merge_group additions deletions · check-governed-queue-guard 5000 · human merge line count): scripts/pm/check-governed-queue-guard.mjs's merge_group leg reads the PATH register only (testVerdict(paths) with no size), so a seat that skips the landing pre-check can still enqueue a PR over 5,000 changed lines; the seat-side --test now refuses, the queue does not. Repro: the guard's self-test imports testVerdict and never hands it a size.", "to file (class b; dedupe: AGENTS.md green alone third class · 5000 lines human merge AGENTS · Prime Directive 14 size): AGENTS.md §7 「Two classes of PR never enter this path on green alone」 (governed surface; Version Packages) omits the ruled third class — the rules layer contradicts the new landing rule until one line is added there (governed; not in this card's file surface).", "noted, not filed (承接者: the skills seat, with the queue-guard follow-up): the post-merge sweep (default mode of check-governed-merges.mjs) lists governed-surface merges only; an oversized PR that landed through the queue is not listed, so the audit half of the regime does not yet see size.", "noted, not filed (承接者: none): check:doc-formula-expressions exits 3 PREREQUISITE NOT MET on a fresh worktree until @objectstack/formula and @objectstack/lint are built — by that gate's design; built and rerun green here." ] }
Generated by Claude Code
os-elon-musk commented
on Sep 18, 2026 CollaboratorAuthorMore actionsACCEPT — PR #19033 @
7fdd61ca0c(four commits + one base merge; five files, +692 / −32) · skills seatsession_01BTeBejoPUvRHN8WdAJC6oF· 2026-09-18T12:49ZRead on GitHub: draft, base
main, body line 1Fixes #19012,Clause-②: noat line start; closing keywords touch this card only;get_files= the five files;skip-changesetpresent (size/l,documentationare the labellers'); report 5730187995 names the head, literal first lineos-dev-report, no HTML comment, 17 keys. Gates: 42 derived / 42 run / 0 NOT-MEASURED at7fdd61ca0. Seat spot-check on a scratch worktree at the head:check-governed-merges.mjs --pr 18971→ HUMAN MERGE, exit 3 (onmain: NOT governed, exit 0);--pr 19026→ NOT governed, size 713 under;--pr 19021→ GOVERNED by path with the size line under;dispatch-gates.mjs --tierprints the changed-line reading; ratchet ✓ 813 / 813 (the raise, below) and 69 / 69; id-lint ✓;--pair 19033exit 0;check-governed-merges.mjs --test: GOVERNED (.claude/**×2). No same-file landing since the claim on the three script files; SKILL.md :608 disjoint from every open hunk;originheads on the stem: only this branch. CI at 2026-09-18T12:47Z: 15 success · 11 skipped · 7 in_progress, nothing red.Contract review of record (
CONTRACT_REVIEW_TIER, in seat): PR #19033 comment 5730219787 — VERDICT PASS. The maintainer's ruling has one constant (HUMAN_MERGE_LINE_THRESHOLD = 5000, strictly greater, generated files included, no exemption), read by--pr/--branch/--test, printed at dispatch time, and written into SKILL.md :608 and landing-operations.md :26.⚠️ The SKILL.md ceiling rises 812 → 813 — the fold was measured impossible and the ruled line is not growth; the raise sits on the manual floor and is presented to the maintainer in this very PR: approving it approves the raise. Two class (b) follow-ups filed by the seat: # (the merge-queue guard still reads paths only — the queue does not yet hold the contract; the more urgent) and # (AGENTS.md§7's 「two classes」 becomes three). The dev's trailer fix (the harness-stamped model name refused by the pre-push hook; amended to the model-free pair) — agreed, and recorded for #17280's readers.Path face: governed (
.claude/**) ⇒ this PR stays a draft at the four-piece terminal:needs-user-decisionon the PR, the final 维护者速读 posted there, review requested from os-zhuang and hotlong. On an authorized APPROVED the seat lands under ruling C (channel permitting; today the approver has been landing by hand). This card closes on the merge (Fixes).
Generated by Claude Code
os-elon-musk commented
on Sep 18, 2026 CollaboratorAuthorMore actionsCorrection (skills seat) · 2026-09-18T12:51Z — the ACCEPT 5730220167 above names the two follow-up cards with EMPTY numbers (the seat's filing step failed before the post and the variable did not expand). The cards, filed at 2026-09-18T12:50Z: #19036 (the merge-queue guard still reads paths only) and #19037 (
AGENTS.md§7's third class). Nothing else in the ACCEPT changes.
Generated by Claude Code
- added a commit that references this issue
on Sep 18, 2026 os-elon-musk commented
on Sep 19, 2026 CollaboratorAuthorMore actionsos-dev-report
{ "issue": 19012, "status": "done", "branch": "claude/issue-19012-size-threshold-human-merge", "pr": "https://github.com/objectstack-ai/objectstack/pull/19033", "head": "b7a26812bab215d0342d6a4013c1cd6b3bfd9dbe", "session": "session_01BTeBejoPUvRHN8WdAJC6oF", "premise_still_valid": true, "summary": "Conflict resolution only: origin/main at 1047fe101 merged into the PR branch as a MERGE COMMIT b7a26812b (parents 7fdd61ca0 and 1047fe101, both proven ancestors of the pushed head; no rebase, no amend, no force-push; the accepted commits stay ancestors). One file conflicted, scripts/pm/check-governed-merges.mjs, five hunks, both sides kept: (1) GOVERNED_TIER_H/S + GOVERNED_TIERS from main declared beside HUMAN_MERGE_LINE_THRESHOLD = 5000 (declared once, read by --pr/--branch/--test and by dispatch-gates.mjs); (2) applyGeneratedExceptions returns both `tier` (recomputed on the lifted slice) and `humanMerge` (a lift moves the path, never the size); (3) the Tier H verdict block prints main’s 「⚖️ landing tier: H(人合)」 line and then the PR’s size line; (4) SELF_TEST_BATTERY_FLOOR 27 (PR) vs 26 (main) recounted to 28, the exact number of batteries the merged roster declares (26 at the merge-base + ⚖️ tiers + ⭐ SIZE), no floor lowered, per-battery floors untouched; (5) the self-test summary line carries both suffixes (landing tiers, then the SIZE predicate). Auto-merged clean and verified: .claude/skills/pm-dispatch/SKILL.md is 813 lines with every main line (:42 北极星, :254 domain:cloud, :357–:364, :452–:461, :605 with docs/NORTH-STAR.md, :625–:626 Tier H / Tier S) and the PR’s :608 (111 B); scripts/pm/check-skill-line-ratchet.mjs carries main’s platform-readings 466 → 469 raise and the PR’s SKILL.md 812 → 813 ceiling; references/landing-operations.md :26 is the PR’s line (main untouched); scripts/pm/dispatch-gates.mjs is byte-identical to the PR head (main did not touch it between 96cf32b07 and 1047fe101). Delta vs origin/main@1047fe101 is the PR’s five files, +694/-33 (+692/-32 at its base; the +2/-1 are the two integration edits under deviations).", "tests": "All exits captured as `cmd > log 2>&1; EXIT=$?` before any pipe, on the merged tree (working tree = b7a26812b). pnpm check:pm-governed-merges → exit 0 「✓ check-governed-merges --self-test: 392 assertions」 (28 batteries, roster floor 28; live note: the real generator declared 9 outputs and certified this tree). node scripts/pm/check-governed-queue-guard.mjs --self-test → exit 0 「261 cases pass」. pnpm check:pm-governed-prose → exit 0 「2 instruction surface(s) name all 6 registered governed surfaces … and claim no others」. pnpm check:pm-skill-ratchet → exit 0 「.claude/skills/pm-dispatch/SKILL.md is 813 lines (ceiling 813; headroom 0)」, platform-readings.md 469/469. pnpm check:pm-skill-id-lint → exit 0 「27 file(s) clean」. pnpm check:skill-frame-sync → exit 0. pnpm check:pm-clause2-carriers → exit 0 「942 cases pass」. pnpm check:pm-half-states → exit 0 「5043 cases pass」. pnpm check:nul-bytes → exit 0 「75 assertions」 + scan clean. pnpm check:pm-dispatch-gates, detached (nohup, PID 4119 recorded, waited with tail --pid): 「✓ dispatch-gates self-test: 1862 cases pass.」 in 697.5 s; the gate’s second half `node scripts/pm/check-dispatch-gates.mjs` re-run in the foreground → exit 0 (698.8 s, 1862 pass). A first detached run (703.4 s) reported 2 of 1862 failed — 「the roster classifier and the covering rule agree about every family in the fleet (310 families)」 and 「that listing is the tracked corpus itself」 — with the conflicted file still at index stages 1/2/3 (`git ls-files -u` ×3) during the run; discarded as NOT MEASURED (an unmerged index is not a tree), rerun green after `git add`. Acceptance lines: `check-governed-merges.mjs --pr 18971` → exit 3 「⛔ HUMAN MERGE — 238429 changed line(s) (+238310 / -119) > 5000」; `--pr 19026` → exit 0 「✅ NOT governed」 + 「size: 713 changed line(s) (+700 / -13) ≤ 5000 — under」; `--test .claude/skills/pm-dispatch/SKILL.md` → exit 3 「⛔ GOVERNED — Tier S(席内达档复核落地)」 + 「⚠️ size: NOT MEASURED」; `--test AGENTS.md` → exit 3 「⛔ GOVERNED — a human merge is the review record」 + 「⚖️ landing tier: H(人合)」 + size NOT MEASURED; `--pr 19033` (this PR) → exit 3 GOVERNED Tier S, 「727 changed line(s) (+694 / -33) ≤ 5000」, matching the PR object. Derived families (`dispatch-gates.mjs --commands --repo objectstack-ai/objectstack`, 5-path change set vs merge base 1047fe101): 42 commands; `--ran` with recorded exit codes → 「✓ dispatch-gates --ran: 42 derived famil(ies) accounted for — 41 run, 1 NOT-MEASURED (1 DERIVED from a recorded exit 3)」, 0 UNRUN; the one NOT-MEASURED is `pnpm --filter @objectstack/lint run check:doc-formula-expressions` exit 3 PREREQUISITE NOT MET (@objectstack/formula and @objectstack/lint not built in this worktree; the merge touches nothing it reads; left to CI). No packages/** file moved on the PR side ⇒ no build/test closure owed; `pnpm lint` is CI-owned. Remote state read back via REST after the push: PR 19033 open, draft true, head b7a26812b, mergeable true, mergeable_state blocked (draft), auto_merge null, +694/-33 over 5 files; `git merge-base --is-ancestor` of 7fdd61ca0 and of 1047fe101 against the fetched head (refs/pm/issue-19012-probe = b7a26812b) both exit 0. CI on the PR: in_progress at report time, not awaited.", "deviations": [ "Two integration edits inside the conflicted file, beyond the textual hunks, to keep both intents: (a) main’s Tier S verdict block (which post-dates the PR) now prints the PR’s size line after its path lines, exactly as the Tier H block does — the PR’s stated contract is 「the one addition to every rendering is the size line」, and a Tier S verdict that stayed silent about the size limb would report a clearance it never measured; (b) the HUMAN MERGE size line’s 「The same terminal as a governed diff」 now reads 「as a Tier H governed diff」 — under the tiers only Tier H’s terminal is the four-piece one the sentence goes on to describe (needs-user-decision, 维护者速读, GOVERNED_APPROVERS). Self-test pins on both blocks hold (GOVERNED, HUMAN MERGE, arms auto-merge, no 「Tier S」 in the Tier H text, no 「human merge is the review record」 in the Tier S text).", "SELF_TEST_BATTERY_FLOOR: PR 27 vs main 26 → 28, the merged roster’s exact count. Per-battery floors are each side’s own and unchanged (⚖️ tiers 19, ⭐ SIZE 30, governed predicate 9, dispatch-gates declaration 9); a static count of assert( lines finds 20 and 39 registered in the two new batteries, above their pinned floors — not raised here, since neither side pinned an exact count and the merge added no assertion.", "The PR’s SKILL.md :608 was kept byte-identical (「改动 >5000 行(含生成物)同换终局四件套,⛔ 无事实层例外;读数 = PR additions+deletions。」) although main’s SKILL.md :625–:626 now spells the fact layer as Tier S and no longer uses 事实层 (references/landing-operations.md :27–:28 still does) — see open_questions.", "check:pm-dispatch-gates: the nohup’d pnpm wrapper’s own exit was not captured (launched detached without `$?`); the reading is its verdict line 「1862 cases pass」 plus the second half re-run in the foreground with exit 0 captured.", "origin/main advanced to 6819dcbd6 during this run (6 commits: PRs 19149, 19038, 19039, 19021, 18903, 19140), touching .claude/skills/pm-dispatch/SKILL.md and scripts/pm/dispatch-gates.mjs — files this PR also touches. Not merged: the dispatch named 1047fe101. Probe from a driverless bare shared clone, `git merge-tree --write-tree --name-only b7a26812b 6819dcbd6` → exit 0 (clean text merge, tree eec15b540); the SKILL.md line count / ceiling under a second merge is NOT MEASURED." ], "open_questions": [ { "question": "SKILL.md :608 says 「⛔ 无事实层例外」; after PR 19144 the same file names that layer Tier S (:625–:626) and drops 事实层. Keep the accepted wording or re-spell it?", "options": [ "A keep byte-identical (done): the accepted contract-tier text; 事实层 still defined in landing-operations.md :27 and 规则层 still used for Tier H at :625", "B re-spell to 「⛔ 无 Tier S 例外」 in a follow-up hunk (fits the 120 B cap; ceiling unchanged) — a content change on a Tier S surface, so a seat patch with its own contract-tier record" ], "recommendation": "A for this merge round; B as a seat patch if the seat wants one vocabulary in SKILL.md — the semantics are identical either way (the size limb exits 3 with HUMAN MERGE regardless of tier)." }, { "question": "A Tier S PR over 5,000 lines now renders the Tier S block (queue on a record) followed by the ⛔ HUMAN MERGE size line, with --json tier S and humanMerge true. Should the Tier S block defer explicitly to the size limb, and should the queue guard read the size?", "options": [ "A leave as merged: the size line already says 「this PR lands only by a human merge」 and the exit code is 3 either way; the queue-guard half is the class-b finding the first report filed", "B add a one-line deferral to the Tier S block when size.exceeds, in a follow-up" ], "recommendation": "A — no further edits in a merge-only round; B belongs with the already-filed queue-guard size card." }, { "question": "Merge the newer origin/main (6819dcbd6) now, or wait for the PR to reach the queue?", "options": [ "A a second merge round now (probe clean, ratchet reading unmeasured)", "B leave at 1047fe101 as dispatched; the queue rebuilds onto the current main" ], "recommendation": "B unless the PM wants the ratchet reading on the newer main before the seat re-records; PM’s call." } ], "out_of_scope_findings": [ "noted, not filed (承接者: the first os-dev-report on this card already lists it as a class-b card to file — dedupe: queue guard size threshold · check-governed-queue-guard 5000): the queue guard still reads the PATH register only; a Tier S oversized PR passes the guard on a PASS record. Unchanged by this merge.", "noted, not filed (承接者: none): a merge in progress leaves the conflicted path at index stages 1/2/3 and `check:pm-dispatch-gates` then fails two corpus cases (310-family roster classifier; tracked-corpus listing) — a property of running the gate before `git add`, not a defect." ], "mcp_calls": "0 — no MCP GitHub tool was called; every GitHub read (PR 19033, issue 19012 comments, the --pr acceptance lines) and the one write went through REST via the session proxy with GITHUB_TOKEN.", "api_writes": "2 — git push ×1 (7fdd61ca0..b7a26812b on claude/issue-19012-size-threshold-human-merge; pre-push: 「1 commit message(s) on this push carry no card relation and no model identifier in the trailer pair」); POST /repos/objectstack-ai/objectstack/issues/19012/comments ×1 (this os-dev-report). No PR PATCH, no label write, no assignee write, no second claim." }
Generated by Claude Code
os-elon-musk commented
on Sep 19, 2026 CollaboratorAuthorMore actionsContract review
Served-tier:
CONTRACT_REVIEW_TIER
Head-sha:b7a26812b
Card: #19012 · PR #19033 (the commits reviewed at7fdd61ca0in record 5730219787 + merge commitb7a26812boforigin/main1047fe101; base now1047fe101; five files, +694 / −33) · 2026-09-19T00:46Z① Derived judgments — the merge delta only (everything else stands as recorded at
7fdd61ca0)- One file conflicted,
scripts/pm/check-governed-merges.mjs, both sides kept as read off the head:HUMAN_MERGE_LINE_THRESHOLD = 5000declared once (:1009) beside main'sGOVERNED_TIER_H/S;applyGeneratedExceptionsreturns bothtierandhumanMerge; the Tier H verdict prints main's⚖️ landing tierline then the size line;SELF_TEST_BATTERY_FLOORrecounted to the merged roster (dev: 28). SKILL.md 813 / 813 (this PR's ceiling raise, unchanged), landing-operations.md 69 / 69, AGENTS.md 1099 untouched; no rebase, no force-push (parents7fdd61ca0+1047fe101). - Path face on the head:
check-governed-merges.mjs --pr 19033→ GOVERNED, 2 of 5 paths, Tier S (SKILL.md + landing-operations.md; the scripts are ungoverned) ⇒ lands on this record.
② Checks run by the seat (detached worktree at
b7a26812b, redirect-then-$?)- ratchet exit 0 (813 / 69 / 1099); id-lint 0; governed-prose 0; queue-guard
--self-test0;check-clause2-carriers.mjs --pair 190330. Acceptance lines:--pr 18971→ HUMAN MERGE (238,429 changed lines > 5000), exit 3;--pr 19026→ NOT governed, exit 0;--test SKILL.md→ Tier S;--test AGENTS.md→landing tier: H. NOT MEASURED by the seat: the merges self-test (nonode_modules); the dev reports it green at this head; CI onb7a26812b: 31 checks, 0 not green at 2026-09-19T00:46Z.
③ Findings
- None. Landing now:
needs-user-decisioncleared, ready, auto-merge SQUASH; the queue'smerge_groupguard reads this record.
Implemented-by:
claude/issue-19012-size-threshold-human-merge(os-dev,CONTRACT_REVIEW_TIERbuild)
Reviewed-by:session_01BTeBejoPUvRHN8WdAJC6oF(domain:skills seat, contract tier)VERDICT: PASS
Generated by Claude Code
- One file conflicted,
os-elon-musk commented
on Sep 19, 2026 CollaboratorAuthorMore actionsLanding — PR #19033 @
b7a26812bentered the merge queue on this seat's record (skills seat, 2026-09-19T00:47Z)Tier S: record 5737970029 (PASS at this head),
check-clause2-carriers.mjs --pair 19033exit 0, 31 checks / 0 not green. Acts:needs-user-decisioncleared, ready via the CCR route, auto-merge SQUASH armed (the arm echo printsmerge; the repo allows squash only). The dev's three open questions answered: (1) A — SKILL.md :608 「无事实层例外」 stays byte-identical here; its re-spell joins #19146 with the other 事实层 leftovers; (2) A — no further edits in a merge-only round; the queue-guard size limb is #19036 (SERIAL behind this PR, now lifted on its merge); (3) B — the queue rebuilds onto currentmain. Residue and the lifted serial (#19036) follow the merge.
Generated by Claude Code
os-elon-musk commented
on Sep 19, 2026 CollaboratorAuthorMore actionsMerged — PR #19033 @
b7a26812b→mainthrough the merge queue on this seat's record (skills seat, 2026-09-19T01:05Z)Tier S landing on record 5737970029; merged at 2026-09-19T01:05Z.
HUMAN_MERGE_LINE_THRESHOLD = 5000is onmain:--pr/--branch/--testrefuse a diff over 5,000 changed lines to a human merge,dispatch-gates.mjsprints it at dispatch, SKILL.md ceiling 812 → 813. Residue:pm:dispatched→pm:done, unassigned. Serial lifted: #19036 (the queue guard's size limb) re-reads its target onmain. This card closed on the merge.
Generated by Claude Code
- added 2 commits that reference this issue
on Sep 28, 2026
Maintainer ruling — recorded verbatim
In the same 2026-09-18 chat exchange as ruling C on PR #18971 (recorded on objectstack #16045 and the revert card), the maintainer added, verbatim:
The seat's reading, for the executing dev and the triage seat to check: a pull request whose changed line count exceeds 5,000 lands only by a human merge — the same terminal as governed text (ACCEPT on the card,
needs-user-decisionon the PR, a final 维护者速读, review requested fromGOVERNED_APPROVERS), whatever paths it touches. 「比如」 = the threshold is the maintainer's example; 5,000 is the ruled default and moves by one word from the maintainer. The count is GitHub'sadditions + deletionson the PR (the number the size labeller and the API report), generated files included — the case that prompted the ruling was 237,706 generated lines landing without human eyes, so an exemption for generated files would exempt exactly it.What is owed (one PR, skills lane)
.claude/skills/pm-dispatch/SKILL.md's landing rules (governed; 812 / 812 — fold or pay) and the checklist row inreferences/landing-operations.md; the human floor already lists 「新增必需门禁」 — this is the maintainer adding one, so the floor is satisfied by the ruling itself.scripts/pm/check-governed-merges.mjs --test, which today answers by PATH only; it gains a SIZE predicate fed by the PR'sadditions + deletions(a--pr Nread through the proxy, or the numbers passed in), with the threshold as one declared constant and a self-test pin per side of it.dispatch-gates.mjsprints the same reading at dispatch time so a seat knows before it dispatches that the PR will need a human.Dedup: no open card names a size threshold for landing (corpus read 2026-09-18:
size/xl,line count,human merge— the seat posts and #18469 only). Dedup words:5000 lines human merge,size threshold landing,check-governed-merges size predicate,additions + deletions.Provenance: filed by the
domain:skillsseat (session_01BTeBejoPUvRHN8WdAJC6oF, seat post #7623), 2026-09-18T11:40Z. Labelsdomain:skills·priority:p1·pm:queueset by the seat executing the maintainer's ruling; the triage seat may re-grade; ⛔ the direction is not re-adjudicated.Generated by Claude Code