You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
ci(test-shards): the slice-count pin has no hysteresis, so a 20 s drift flips the CLI map and turns the weekly refresh red again #29826
Filing gate: ① named location scripts/partition-test-shards.mjs pin 3c (the "Raise it to"/"Lower it to" derivation, lines ~881-887 at main), reproduced on PR #28978's dataset
Reader: domain:devx seat, the PR after #29777's dataset-and-map lane PR (the map becomes cli 2 there)
Dedupe (open AND closed): "partition-test-shards hysteresis" → 1 (#29777, the bound, not this); "FILE_SHARDED_PACKAGES slice count flip" → 4, none about the derivation margin; "shard partitioner slice derivation margin" → 3, none
reach: measured on the refreshed dataset at PR #28978 head b5b4b790: pin 3c accepts only x2, at 716 s against a 736.45 s target, a 20 s margin
QA-source: none (seat finding from #29777's measurements)
Checklist item priority: n/a
type: Bug
Why
Pin 3c accepts exactly one slice count for a package: the smallest that meets the target. It refuses both a larger count ("Lower it to n−1") and a smaller one ("Raise it to …"). There is no band. On the refreshed dataset the CLI holds x2 by 20 s. The flip to x3 comes if the CLI grows to about 1473 s or more, or if metadata-protocol shrinks to about 551 s or less (Fable analysis on #29777). Each flip turns the weekly generated refresh PR red, because the generated dataset and the hand-edited FILE_SHARDED_PACKAGES map then disagree. A seat must then land a lane PR carrying both, as in #26186 and in #29777's resolution. The bot run alone never lands. Week-to-week noise is enough to cross 20 s: the CLI's three measured runs spread 1339 to 1493 s.
Proposed shape (for the dev to measure, not ruled)
A hysteresis band on the "Lower it" half only: keep n while n−1 would meet the target with less than a fixed margin, for example 5%. The "Raise it" half stays strict, since it guards balance. The pin's positive and negative controls gain a fixture inside the band.
Acceptance notes
At a 20 s margin, the refreshed dataset with the map at 2 passes, and so does the same dataset with the CLI at 1480 s and the map still at 2.
A drift past the band still says "Lower it" or "Raise it" with the measured numbers.
Claim: PM loop round 1
Session: session_017ihL2ebbZkr2QAEG1x7UC8
Account: marchtian
Branch: claude/issue-29826-slice-pin-hysteresis
Worktree: objectstack-issue-29826
Domain: domain:devx
Seat: domain:devx#2
File surface: scripts/partition-test-shards.mjs (pin 3c's "Lower it to" / "Raise it to" derivation and its --self-test positive and negative controls). ⛔ No edit to scripts/ci/test-shard-timings.json, FILE_SHARDED_PACKAGES or .github/workflows/**.
Container & model: S/M, mode:subagent, model: default tier (dispatch-gates --tier: no path-derived mandate), effort: high
Clause-②: no
Metadata-protocol: none
Responsibility: the partitioner's own pin 3c accepts exactly one slice count with no band, so a 20 s week-to-week drift flips the CLI map and turns the generated weekly refresh PR red; no platform path covers it; it reaches every seat that has to land a dataset-and-map lane PR by hand
Thread-read: 6597446499
Premise: holds (pin 3c at origin/mainf68b47ca still derives "Lower it to n−1" / "Raise it to N" with no band, scripts/partition-test-shards.mjs ~L895–901)
Serial constraints cleared: #29777 (the sibling triage named) is closed; no open PR or live Claim: names scripts/partition-test-shards.mjs (in-flight domain:devx claims #30078 and #30105 name .gitignore, scripts/codemod-split-*.mjs, driver-sql and scripts/facade-delegation-registry.json)
The band is the card's proposal, not a ruling. If the measured band reads as loosening the pin (accepting a slice count the current pin refuses for a reason other than drift noise), the dev reports needs_decision and the seat takes it to the maintainer.
{
"issue": 29826,
"status": "needs_decision",
"branch": "claude/issue-29826-slice-pin-hysteresis",
"pr": null,
"head": "f68b47ca (no commit made; branch not pushed)",
"premise_still_valid": "partly",
"premise_readings": {
"tree": "objectstack-ai/objectstack @ f68b47ca",
"dataset_at_main_equals_b5b4b790": "yes: scripts/test-shard-timings.json packages, 79 of 79 weights identical (gh api contents?ref=b5b4b790 vs the worktree file)",
"map_at_main": "@objectstack/cli: 2 (PREVIOUS_FILE_SHARDED_PACKAGES cli: 4)",
"pin_3c_today": "PASS: node scripts/partition-test-shards.mjs --self-test exit 0",
"half_that_flips_at_map_2": "RAISE, not LOWER. At map 2 the LOWER half can only say 'Retire the entry', and only at cli at or below 736.45 s"
},
"measured_margins": {
"command": "node SCRATCH/measure.mjs WORKTREE: imports the exported sliceCountProblems, workspaceTestTaskCounts, expandSlices, serialFloorOf from scripts/partition-test-shards.mjs, bins the committed dataset as the self-test does (ci.yml --exclude set, workspace task counts), then overrides only the cli weight",
"floor": "@objectstack/metadata-protocol 566.50 s (next: service-automation 526.88, plugin-security 515.26)",
"limit": "1.3 x 566.50 = 736.45 s",
"x2_slice": "716.02 s, margin 20.43 s (2.77 %)",
"raise_flip": "cli at or above 1472.90 s, or the floor at or below 550.78 s",
"verdicts": {
"dataset, map 2": "PASS",
"dataset, map 3": "Lower it to 2",
"dataset, map 4": "Lower it to 3",
"cli 1473, map 2": "Raise it to 3 (737 s past 736 s)",
"cli 1480, map 2": "Raise it to 3 (740 s past 736 s)",
"cli 1493, map 2": "Raise it to 3 (747 s past 736 s)",
"cli 1339, map 2": "PASS",
"cli 1339, map 3": "Lower it to 2"
}
},
"acceptance_vs_proposed_shape": "The card's second acceptance bullet (cli 1480, map still 2, passes) is reachable only by loosening the RAISE half: 740 s is above the 736.45 s serial-floor limit, so any shape that passes it accepts a slice the pin refuses today because it is still the run's serial floor. The card's own proposed shape (a band on the LOWER half only, RAISE strict) cannot pass that bullet: at map 2 the LOWER half is not in play. The two halves of the card contradict each other on the current tree.",
"needs_decision": [
{
"option": "A: LOWER-only band f (the card's shape)",
"effect": "map 2 still turns red at cli 1472.90 s and up (one lane PR: dataset + map 2 to 3 + PREVIOUS map). After that, map 3 holds for cli in (2 x (1 - f) x 736.45, 2209.35]. f = 5 %: (1399.26, 2209.35]; the measured low run 1339 s still flips it back; f must be at least 9.09 % to hold x3 across the measured 1339-1493 s spread",
"acceptance_bullet_2": "not met",
"loosening": "accepts x3 on today's dataset (refused today as 'Lower it to 2') while x2 meets by less than f; RAISE unchanged"
},
{
"option": "B: tolerance g on the RAISE half (what bullet 2 needs)",
"effect": "g of 0.482 % passes cli 1480; g of 1.365 % covers the measured high run 1493 s; g = 2 % holds x2 to cli 1502.36 s, an effective serial-floor bound of 1.326 x instead of 1.3 x",
"acceptance_bullet_2": "met",
"loosening": "yes: a weakening of an existing gate's internal parameter (the AGENTS.md decision axes default this to no without a ruling)"
},
{
"option": "C: no change",
"effect": "each real crossing of 1472.90 s (or floor 550.78 s) costs one lane PR carrying dataset + map + PREVIOUS map; no oscillation has been observed yet, since map 2 has held since the 4-to-2 lane landed",
"acceptance_bullet_2": "not met",
"loosening": "none"
}
],
"gates": {
"partition_self_test_at_main": "node scripts/partition-test-shards.mjs --self-test: exit 0, 'self-test OK ... file-level slices: @objectstack/cli x2'",
"dispatch_gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: exit 2, 'this branch changes nothing against origin/main ... nothing to derive' (no diff, so no --ran reconciliation)"
},
"line_budget": "0 (no diff)",
"files_changed": [],
"deviations": [
"Stopped before writing code under the order's ruling section: the shape that meets the card's acceptance loosens pin 3c's RAISE half.",
"No git push and no pr_create: nothing to push, no PR opened.",
"PM assumption 3 corrected: the committed dataset at main IS the refreshed dataset (package weights byte-equal to b5b4b790, which is not fetchable as a ref but is readable through the contents API); the reproduction used cli overrides on it instead.",
"PM assumption 2 corrected: at the current map (2) the flip is the RAISE half; the LOWER half was the one that flipped at the previous lane (map 4 against the shrunk cli)."
],
"mcp_calls": 0,
"api_writes": "1: this comment (POST issues/29826/comments via scripts/pm/post-stamped.mjs)",
"out_of_scope_findings": [
"carrier: none · noted, not filed: a map change also changes what measure-test-shard-timings.mjs can decode (PREVIOUS_FILE_SHARDED_PACKAGES), so every flip costs that edit too; this weighs on the option choice and is not a defect"
],
"security_findings": "none"
}
Why it needs a ruling: this card's second acceptance bullet (cli 1480 s with the map still at 2 passes) can only be met by a tolerance on the RAISE half of pin 3c (option B in the report). That loosens an existing gate's bound from 1.3× toward ~1.33×, and a gate parameter change that weakens is outside the seat's discretion (AGENTS.md decision axes: an existing gate's internal parameter is fixed only as a strengthening or a blind-spot fix). The card's own proposed shape (a LOWER-half band, option A) cannot meet that bullet. Option C is no change.
Options A / B / C with their measured margins are in the report. A four-axis analysis for the maintainer follows on this card.
The claim stands (assignee kept); no slot is held while the card waits.
Governing text: AGENTS.md, decision axes, "新增门禁默认否" and "既有门禁内部参数与盲区修复(加强,非削弱,非新增)".
Ruled: option D, a symmetric 5 % band on pin 3c · recorded 2026-11-04T15:04Z
Ruled: the maintainer (田騏, marchtian) answered 「同意」 at 2026-11-04T15:02:51Z in this account's project, in the decision thread that analysed this card, to that thread's recommendation D. Options B (a RAISE-only tolerance) and C (no change) are not chosen. The analysis is in the project files (issue-29826/decision-analysis.md); this comment is its execution record.
Option D, as ruled:
One constant, e.g. SLICE_COUNT_HYSTERESIS = 0.05, whose comment says it is the observed noise width of the cli median.
RAISE half: says "Raise it to …" only when weight / n > (1 + h) × limit.
LOWER half: says "Lower it to n−1" / "Retire the entry" only when weight / (n−1) ≤ (1 − h) × limit.
Inside the band the pin passes; every refusal still carries the measured numbers.
planShards()'s NEEDED, the density cap and pin 3d are unchanged.
Fixtures: two in-band passes (one on the RAISE side, one on the LOWER side) and two out-of-band refusals. The four existing fixtures keep their verdicts at 5 % (the analysis computed PASS / Retire / Lower it to 2 / Raise it to 5; the dev re-measures).
The FILE_SHARDED_PACKAGES docblock's "RE-DERIVED AT 2" paragraph gains one sentence on why the band exists.
Measured thresholds from the analysis (unverified here; the dev re-measures): map 2 holds up to cli ≤ 1546.5 s; map 3 holds over (1399.3, 2319.8]. Both acceptance bullets on this card are met: cli 1480 s with the map at 2 passes, and a drift past the band still says Raise / Lower with the numbers.
Governing text: AGENTS.md decision axes. The nominal RAISE bound moves from 1.3× to 1.365×. The maintainer ruled on that tradeoff; it is no longer the seat's call.
State: needs-user-decision → pm:dispatched (the claim 6632724845 stands, same branch). The dev resumes as soon as a slot frees under this account's ceiling of 2 cards in hand.
{
"issue": 29826,
"round": 2,
"status": "done",
"ruling": "comment 6634084947, option D",
"branch": "claude/issue-29826-slice-pin-hysteresis",
"pr": 30138,
"head": "1c0a83b762f16c0a09b0a537cc68ecba009ceb3c",
"files_changed": ["scripts/partition-test-shards.mjs"],
"line_budget": "+89 / -13 (102 changed lines, 1 file), under the 3000 human-merge threshold",
"measured_margins": {
"command": "node SCRATCH/measure2.mjs WORKTREE: calls the exported sliceCountProblems on the committed dataset binned the way the self-test bins it (ci.yml --exclude set, workspace task counts), varying only the cli weight on a 0.01 s grid from 500 to 3000 s",
"tree": "objectstack-ai/objectstack @ 1c0a83b762 (dataset cli 1432.04 s, floor metadata-protocol 566.50 s, limit 736.45 s, h 0.05)",
"map_2_accepted_cli": "699.63 to 1546.54 s (ruling: up to 1546.5 s) - agrees",
"map_3_accepted_cli": "1399.26 to 2319.81 s (ruling: over 1399.3 up to 2319.8 s) - agrees",
"map_2_floor_holds_at_or_above": "524.56 s (716.02 / (1.3 x 1.05), formula)",
"acceptance_bullet_1": "dataset map 2 PASS; cli 1480 map 2 PASS; cli 1493 map 2 PASS",
"acceptance_bullet_2": "cli 1546.6 map 2: 'one slice is 773.30s ... (567s, so 736.45s) by more than its 5% band (773.27s) ... Raise it to 3.'; cli 1399.2 map 3: 'at 2 one slice (699.60s) ... with more than its 5% band to spare (699.63s). Lower it to 2'; cli 2319.9 map 3: 'Raise it to 4.'",
"existing_fixtures_at_h_0.05": "PASS (120/2), Retire the entry (60/2), Lower it to 2 (120/3), Raise it to 5 (300/2) - unchanged"
},
"ablations": {
"tool": "scripts/ablation-replace.mjs, each leg restored to the HEAD blob with git diff HEAD empty",
"SLICE_COUNT_HYSTERESIS = 0": "exit 1, RAISE in-band pass fixture",
"LOWER branch on bare limit": "exit 1, LOWER in-band pass fixture",
"RAISE branch on bare limit": "exit 1, RAISE in-band pass fixture",
"SLICE_COUNT_HYSTERESIS = 0.07": "exit 1, RAISE out-of-band refusal fixture",
"SLICE_COUNT_HYSTERESIS = 0.1": "exit 1, existing Retire fixture",
"balancing-pins floor 29 to 99": "exit 1, battery registered 30 cases"
},
"gates": {
"derive": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: exit 0, 31 commands",
"run": "31 of 31 exit 0, each captured before any pipe; check:pm-dispatch-gates exit 0 (fast tier, 1945 cases, 326.7 s)",
"partition_self_test": "node scripts/partition-test-shards.mjs --self-test: exit 0 on 1c0a83b762",
"ran_reconciliation": "31 derived, 31 run, 0 NOT-MEASURED, 0 UNRUN (a derived zero: all 31 recorded an exit code)",
"not_measured_locally": "CI-only step ci.yml Plan Test Core shards; type-check lanes; artifact-roster families (CI runs them)",
"ci_at_report": "head 1c0a83b762: 1 success, 8 skipped, 16 in_progress"
},
"deviations": [
"Refusal messages print slice, limit and band edge to two decimals (was whole seconds); at the band edge whole seconds read '773s past 773s'. No consumer parses the text; fixtures assert the 'Raise it to N' / 'Lower it to N' phrase plus the slice number.",
"Balancing-pins battery floor raised 25 to 29 (old floor + 4 new cases); it registers 30, as before the change it registered 26 against 25.",
"The origin/main merge commit 1c0a83b762 carries no trailer pair (git's default merge message); the two authored commits carry it."
],
"mcp_calls": 0,
"api_writes": "2 this round (git push x3 is not a REST write): pr_create via fleet-write relay run 41858647685 (draft, label skip-changeset, no assignees, no reviewers); this comment via post-stamped.mjs. Round 1 comment 6632860830 was 1 earlier write.",
"out_of_scope_findings": [
"carrier: none · noted, not filed: the analysis says a future RAISE past 1546 s would likely go straight to x4 because planShards cannot spread x3; that is planShards' behaviour, outside this card"
],
"security_findings": "none"
}
Landed · PR #30138 merged as 2381085a64 · 2026-11-04T16:37Z. Ruling 6634084947 (option D): one constant SLICE_COUNT_HYSTERESIS = 0.05, both halves of pin 3c banded; map 2 holds for cli up to 1546.54 s and map 3 over 1399.26–2319.81 s. planShards(), the density cap and pin 3d are untouched. ACCEPT record is on the PR. The card closed through Fixes; pm:dispatched comes off in this stroke.
Activity
objectstack-fleet commentedon Nov 3, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p2 ·
domain:devx·pm:queue· 2026-11-03T06:56Z⛔ Not a claim.
Generated by Claude Code
objectstack-fleet commentedon Nov 4, 2026
domain:devx#2 · marchtian · session_017ihL2ebbZkr2QAEG1x7UC8
Claim: PM loop round 1
Session:
session_017ihL2ebbZkr2QAEG1x7UC8Account:
marchtianBranch:
claude/issue-29826-slice-pin-hysteresisWorktree:
objectstack-issue-29826Domain:
domain:devxSeat:
domain:devx#2File surface:
scripts/partition-test-shards.mjs(pin 3c's "Lower it to" / "Raise it to" derivation and its--self-testpositive and negative controls). ⛔ No edit toscripts/ci/test-shard-timings.json,FILE_SHARDED_PACKAGESor.github/workflows/**.Container & model:
S/M,mode:subagent,model: default tier (dispatch-gates --tier: no path-derived mandate),effort: highClause-②: no
Metadata-protocol: none
Responsibility: the partitioner's own pin 3c accepts exactly one slice count with no band, so a 20 s week-to-week drift flips the CLI map and turns the generated weekly refresh PR red; no platform path covers it; it reaches every seat that has to land a dataset-and-map lane PR by hand
Thread-read: 6597446499
Premise: holds (pin 3c at
origin/mainf68b47castill derives "Lower it to n−1" / "Raise it to N" with no band,scripts/partition-test-shards.mjs~L895–901)Serial constraints cleared: #29777 (the sibling triage named) is closed; no open PR or live
Claim:namesscripts/partition-test-shards.mjs(in-flightdomain:devxclaims #30078 and #30105 name.gitignore,scripts/codemod-split-*.mjs, driver-sql andscripts/facade-delegation-registry.json)The band is the card's proposal, not a ruling. If the measured band reads as loosening the pin (accepting a slice count the current pin refuses for a reason other than drift noise), the dev reports
needs_decisionand the seat takes it to the maintainer.objectstack-fleet commentedon Nov 4, 2026
domain:devx#2 · marchtian · session_017ihL2ebbZkr2QAEG1x7UC8
os-dev-report
{ "issue": 29826, "status": "needs_decision", "branch": "claude/issue-29826-slice-pin-hysteresis", "pr": null, "head": "f68b47ca (no commit made; branch not pushed)", "premise_still_valid": "partly", "premise_readings": { "tree": "objectstack-ai/objectstack @ f68b47ca", "dataset_at_main_equals_b5b4b790": "yes: scripts/test-shard-timings.json packages, 79 of 79 weights identical (gh api contents?ref=b5b4b790 vs the worktree file)", "map_at_main": "@objectstack/cli: 2 (PREVIOUS_FILE_SHARDED_PACKAGES cli: 4)", "pin_3c_today": "PASS: node scripts/partition-test-shards.mjs --self-test exit 0", "half_that_flips_at_map_2": "RAISE, not LOWER. At map 2 the LOWER half can only say 'Retire the entry', and only at cli at or below 736.45 s" }, "measured_margins": { "command": "node SCRATCH/measure.mjs WORKTREE: imports the exported sliceCountProblems, workspaceTestTaskCounts, expandSlices, serialFloorOf from scripts/partition-test-shards.mjs, bins the committed dataset as the self-test does (ci.yml --exclude set, workspace task counts), then overrides only the cli weight", "floor": "@objectstack/metadata-protocol 566.50 s (next: service-automation 526.88, plugin-security 515.26)", "limit": "1.3 x 566.50 = 736.45 s", "x2_slice": "716.02 s, margin 20.43 s (2.77 %)", "raise_flip": "cli at or above 1472.90 s, or the floor at or below 550.78 s", "verdicts": { "dataset, map 2": "PASS", "dataset, map 3": "Lower it to 2", "dataset, map 4": "Lower it to 3", "cli 1473, map 2": "Raise it to 3 (737 s past 736 s)", "cli 1480, map 2": "Raise it to 3 (740 s past 736 s)", "cli 1493, map 2": "Raise it to 3 (747 s past 736 s)", "cli 1339, map 2": "PASS", "cli 1339, map 3": "Lower it to 2" } }, "acceptance_vs_proposed_shape": "The card's second acceptance bullet (cli 1480, map still 2, passes) is reachable only by loosening the RAISE half: 740 s is above the 736.45 s serial-floor limit, so any shape that passes it accepts a slice the pin refuses today because it is still the run's serial floor. The card's own proposed shape (a band on the LOWER half only, RAISE strict) cannot pass that bullet: at map 2 the LOWER half is not in play. The two halves of the card contradict each other on the current tree.", "needs_decision": [ { "option": "A: LOWER-only band f (the card's shape)", "effect": "map 2 still turns red at cli 1472.90 s and up (one lane PR: dataset + map 2 to 3 + PREVIOUS map). After that, map 3 holds for cli in (2 x (1 - f) x 736.45, 2209.35]. f = 5 %: (1399.26, 2209.35]; the measured low run 1339 s still flips it back; f must be at least 9.09 % to hold x3 across the measured 1339-1493 s spread", "acceptance_bullet_2": "not met", "loosening": "accepts x3 on today's dataset (refused today as 'Lower it to 2') while x2 meets by less than f; RAISE unchanged" }, { "option": "B: tolerance g on the RAISE half (what bullet 2 needs)", "effect": "g of 0.482 % passes cli 1480; g of 1.365 % covers the measured high run 1493 s; g = 2 % holds x2 to cli 1502.36 s, an effective serial-floor bound of 1.326 x instead of 1.3 x", "acceptance_bullet_2": "met", "loosening": "yes: a weakening of an existing gate's internal parameter (the AGENTS.md decision axes default this to no without a ruling)" }, { "option": "C: no change", "effect": "each real crossing of 1472.90 s (or floor 550.78 s) costs one lane PR carrying dataset + map + PREVIOUS map; no oscillation has been observed yet, since map 2 has held since the 4-to-2 lane landed", "acceptance_bullet_2": "not met", "loosening": "none" } ], "gates": { "partition_self_test_at_main": "node scripts/partition-test-shards.mjs --self-test: exit 0, 'self-test OK ... file-level slices: @objectstack/cli x2'", "dispatch_gates": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: exit 2, 'this branch changes nothing against origin/main ... nothing to derive' (no diff, so no --ran reconciliation)" }, "line_budget": "0 (no diff)", "files_changed": [], "deviations": [ "Stopped before writing code under the order's ruling section: the shape that meets the card's acceptance loosens pin 3c's RAISE half.", "No git push and no pr_create: nothing to push, no PR opened.", "PM assumption 3 corrected: the committed dataset at main IS the refreshed dataset (package weights byte-equal to b5b4b790, which is not fetchable as a ref but is readable through the contents API); the reproduction used cli overrides on it instead.", "PM assumption 2 corrected: at the current map (2) the flip is the RAISE half; the LOWER half was the one that flipped at the previous lane (map 4 against the shrunk cli)." ], "mcp_calls": 0, "api_writes": "1: this comment (POST issues/29826/comments via scripts/pm/post-stamped.mjs)", "out_of_scope_findings": [ "carrier: none · noted, not filed: a map change also changes what measure-test-shard-timings.mjs can decode (PREVIOUS_FILE_SHARDED_PACKAGES), so every flip costs that edit too; this weighs on the option choice and is not a defect" ], "security_findings": "none" }objectstack-fleet commentedon Nov 4, 2026
domain:devx#2 · marchtian · session_017ihL2ebbZkr2QAEG1x7UC8
Into the decision box ·
pm:dispatched→needs-user-decision· 2026-11-04T14:13Zneeds_decision(report 6632860830). No branch push, no PR.origin/mainf68b47ca:FILE_SHARDED_PACKAGESis{'@objectstack/cli': 2}, so the refreshed dataset already landed (ci(test-shards): the weekly shard-timings refresh is refused by the partitioner's own self-test — @objectstack/cli (1432 s) can be neither kept whole nor sliced under the density bound #29777's lane PR) and map 2 passes today.objectstack-fleet commentedon Nov 4, 2026
domain:devx#2 · marchtian · session_017ihL2ebbZkr2QAEG1x7UC8
Ruled: option D, a symmetric 5 % band on pin 3c · recorded 2026-11-04T15:04Z
Ruled: the maintainer (田騏,
marchtian) answered 「同意」 at 2026-11-04T15:02:51Z in this account's project, in the decision thread that analysed this card, to that thread's recommendation D. Options B (a RAISE-only tolerance) and C (no change) are not chosen. The analysis is in the project files (issue-29826/decision-analysis.md); this comment is its execution record.Option D, as ruled:
SLICE_COUNT_HYSTERESIS = 0.05, whose comment says it is the observed noise width of the cli median.weight / n > (1 + h) × limit.weight / (n−1) ≤ (1 − h) × limit.planShards()'s NEEDED, the density cap and pin 3d are unchanged.FILE_SHARDED_PACKAGESdocblock's "RE-DERIVED AT 2" paragraph gains one sentence on why the band exists.Measured thresholds from the analysis (unverified here; the dev re-measures): map 2 holds up to cli ≤ 1546.5 s; map 3 holds over (1399.3, 2319.8]. Both acceptance bullets on this card are met: cli 1480 s with the map at 2 passes, and a drift past the band still says Raise / Lower with the numbers.
Governing text: AGENTS.md decision axes. The nominal RAISE bound moves from 1.3× to 1.365×. The maintainer ruled on that tradeoff; it is no longer the seat's call.
State:
needs-user-decision→pm:dispatched(the claim 6632724845 stands, same branch). The dev resumes as soon as a slot frees under this account's ceiling of 2 cards in hand.objectstack-fleet commentedon Nov 4, 2026
domain:devx#2 · marchtian · session_017ihL2ebbZkr2QAEG1x7UC8
os-dev-report
{ "issue": 29826, "round": 2, "status": "done", "ruling": "comment 6634084947, option D", "branch": "claude/issue-29826-slice-pin-hysteresis", "pr": 30138, "head": "1c0a83b762f16c0a09b0a537cc68ecba009ceb3c", "files_changed": ["scripts/partition-test-shards.mjs"], "line_budget": "+89 / -13 (102 changed lines, 1 file), under the 3000 human-merge threshold", "measured_margins": { "command": "node SCRATCH/measure2.mjs WORKTREE: calls the exported sliceCountProblems on the committed dataset binned the way the self-test bins it (ci.yml --exclude set, workspace task counts), varying only the cli weight on a 0.01 s grid from 500 to 3000 s", "tree": "objectstack-ai/objectstack @ 1c0a83b762 (dataset cli 1432.04 s, floor metadata-protocol 566.50 s, limit 736.45 s, h 0.05)", "map_2_accepted_cli": "699.63 to 1546.54 s (ruling: up to 1546.5 s) - agrees", "map_3_accepted_cli": "1399.26 to 2319.81 s (ruling: over 1399.3 up to 2319.8 s) - agrees", "map_2_floor_holds_at_or_above": "524.56 s (716.02 / (1.3 x 1.05), formula)", "acceptance_bullet_1": "dataset map 2 PASS; cli 1480 map 2 PASS; cli 1493 map 2 PASS", "acceptance_bullet_2": "cli 1546.6 map 2: 'one slice is 773.30s ... (567s, so 736.45s) by more than its 5% band (773.27s) ... Raise it to 3.'; cli 1399.2 map 3: 'at 2 one slice (699.60s) ... with more than its 5% band to spare (699.63s). Lower it to 2'; cli 2319.9 map 3: 'Raise it to 4.'", "existing_fixtures_at_h_0.05": "PASS (120/2), Retire the entry (60/2), Lower it to 2 (120/3), Raise it to 5 (300/2) - unchanged" }, "ablations": { "tool": "scripts/ablation-replace.mjs, each leg restored to the HEAD blob with git diff HEAD empty", "SLICE_COUNT_HYSTERESIS = 0": "exit 1, RAISE in-band pass fixture", "LOWER branch on bare limit": "exit 1, LOWER in-band pass fixture", "RAISE branch on bare limit": "exit 1, RAISE in-band pass fixture", "SLICE_COUNT_HYSTERESIS = 0.07": "exit 1, RAISE out-of-band refusal fixture", "SLICE_COUNT_HYSTERESIS = 0.1": "exit 1, existing Retire fixture", "balancing-pins floor 29 to 99": "exit 1, battery registered 30 cases" }, "gates": { "derive": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack: exit 0, 31 commands", "run": "31 of 31 exit 0, each captured before any pipe; check:pm-dispatch-gates exit 0 (fast tier, 1945 cases, 326.7 s)", "partition_self_test": "node scripts/partition-test-shards.mjs --self-test: exit 0 on 1c0a83b762", "ran_reconciliation": "31 derived, 31 run, 0 NOT-MEASURED, 0 UNRUN (a derived zero: all 31 recorded an exit code)", "not_measured_locally": "CI-only step ci.yml Plan Test Core shards; type-check lanes; artifact-roster families (CI runs them)", "ci_at_report": "head 1c0a83b762: 1 success, 8 skipped, 16 in_progress" }, "deviations": [ "Refusal messages print slice, limit and band edge to two decimals (was whole seconds); at the band edge whole seconds read '773s past 773s'. No consumer parses the text; fixtures assert the 'Raise it to N' / 'Lower it to N' phrase plus the slice number.", "Balancing-pins battery floor raised 25 to 29 (old floor + 4 new cases); it registers 30, as before the change it registered 26 against 25.", "The origin/main merge commit 1c0a83b762 carries no trailer pair (git's default merge message); the two authored commits carry it." ], "mcp_calls": 0, "api_writes": "2 this round (git push x3 is not a REST write): pr_create via fleet-write relay run 41858647685 (draft, label skip-changeset, no assignees, no reviewers); this comment via post-stamped.mjs. Round 1 comment 6632860830 was 1 earlier write.", "out_of_scope_findings": [ "carrier: none · noted, not filed: the analysis says a future RAISE past 1546 s would likely go straight to x4 because planShards cannot spread x3; that is planShards' behaviour, outside this card" ], "security_findings": "none" }objectstack-fleet commentedon Nov 4, 2026
domain:devx#2 · marchtian · session_017ihL2ebbZkr2QAEG1x7UC8
Landed · PR #30138 merged as
2381085a64· 2026-11-04T16:37Z. Ruling 6634084947 (option D): one constantSLICE_COUNT_HYSTERESIS = 0.05, both halves of pin 3c banded; map 2 holds for cli up to 1546.54 s and map 3 over 1399.26–2319.81 s.planShards(), the density cap and pin 3d are untouched. ACCEPT record is on the PR. The card closed throughFixes;pm:dispatchedcomes off in this stroke.