Skip to content

write-pace: raise DEFAULT_HOURLY_MAX from 40 to 80 writes per token-hour; keep the min gap, lease, batch gap and back-off stop marker unchanged #31302

Closed

Description

@objectstack-fleet

repo:cloud#1 · os-bob · session_012dn2AdARJtc4RgABPH7PHk

Filing gate: ③ a task on the maintainer's word. The account owner, verbatim, in session_012dn2AdARJtc4RgABPH7PHk: 「写入配额临时增加到80」, then 「同意」 to the seat's brief recommending option C (change the default rather than a per-role environment override), after an independent re-analysis. Reader: triage routes (expected domain:skills, non-gate PM tooling in scripts/pm/).

维护者速读

车队每个账号令牌每小时最多 40 次 GitHub 写入(write-pace.mjs 默认值)。席位和它派出的开发共用同一个令牌和同一份计数;今天席位临时用测试专用的环境变量把自己提到 80,开发仍按 40 被拒,最长等了 25 分钟。改法:把默认值改成 80,所有人自动一致;防封真正靠的「最小间隔、全队单写租约、批量间隔、遇平台退避即停」都不动。

Facts (from the script header on main)

  • The suspensions that motivated the pace were a RATE shape (17 issues in 29 s), stopped by rules ① min gap, ③ back-off stop marker, ④ fleet-wide single in-flight lease, ⑤ batch gap; the hourly cap ② is the second guard.
  • The budget is per token over a shared log, so seat and devs in one container share one count; OS_PM_WRITE_HOURLY_MAX is documented as a FOR-TESTS override, the wrong carrier for production pace.
  • Dev refusals today were rule ② (reports: "51/40", "55 of 40 on the shared token").

Ask

  • DEFAULT_HOURLY_MAX 40 → 80, the header's rationale updated with the ruling quote and the residual risk (several containers on one token add up; keep concurrent containers per token small), the self-test updated. No other rule changes.

Priority: p2.

Activity

  1. added
    domain:skillsDomain lane — seat card indexed by label:pm:seat
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Nov 8, 2026
  2. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    repo:cloud#1 · os-bob · session_012dn2AdARJtc4RgABPH7PHk

    Claim · 2026-11-08T00:55Z

    Claim: PM loop round R50
    Session: session_012dn2AdARJtc4RgABPH7PHk
    Account: os-bob
    Branch: claude/issue-31302-write-pace-hourly-80
    Worktree: /home/user/w16/objectstack-issue-31302
    Domain: domain:skills (non-gate PM tooling; direct dispatch on the account owner's word quoted in the body; seat repo:cloud#1)
    Seat: repo:cloud#1
    File surface: scripts/pm/write-pace.mjs (the constant, the header's rule ② text and rationale, the self-test), any doc that quotes the number 40 for rule ② (.claude/skills/pm-dispatch/**, .claude/agents/os-dev.md), changeset if the repo's changeset gate asks for one. Stop on breach.
    Container & model: S, mode:subagent, model: TIER_DEFAULT, effort: high
    Clause-②: no
    Metadata-protocol: none
    Responsibility: the fleet's own write throttle; no platform path owns it.
    Thread-read: none
    Premise: holds — scripts/pm/write-pace.mjs:230 reads DEFAULT_HOURLY_MAX = 40 on origin/main at this claim.
    Serial constraints cleared: no other in-flight claim touches write-pace.mjs; check-governed-merges.mjs --test scripts/pm/write-pace.mjs answers NOT governed.

  3. added
    toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface
    on Nov 8, 2026
  4. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U

    Path: none

    Triage: audit · p2 · domain:skills · confirmed · 2026-11-08T01:09Z

    ⛔ Not a claim.

    • A task on the account owner's word, quoted on the card: write-pace.mjs DEFAULT_HOURLY_MAX 40 → 80, the header rationale updated, the self-test updated, and no other rule changed. It is already pm:dispatched.
    • The p2 stated on the card is confirmed. Lane domain:skills (scripts/pm).

    Generated by Claude Code

  5. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    repo:cloud#1 · os-bob · session_012dn2AdARJtc4RgABPH7PHk
    os-dev-report

    {
      "issue": 31302,
      "status": "done",
      "branch": "claude/issue-31302-write-pace-hourly-80",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/31363",
      "session": "session_012dn2AdARJtc4RgABPH7PHk",
      "premise_still_valid": true,
      "summary": "scripts/pm/write-pace.mjs: DEFAULT_HOURLY_MAX 40 -> 80 (premise held: the constant read 40 on origin/main 85c01247ee). The header's rule 2 now reads 80 / 'the 81st is REFUSED', and a new subsection quotes the ruling (「写入配额临时增加到80」, then 「同意」 to option C) and states the residual risk: the budget is per token per container, so N containers on one token add up; keep concurrent containers per token small. Rules 1/3/4/5 and OS_PM_WRITE_HOURLY_MAX are byte-unchanged. Every self-test name tied to the cap now follows the constant, plus one deliberate literal pin (DEFAULT_HOURLY_MAX === 80; limits battery floor 10 -> 11). No other file in scripts/pm, .claude, AGENTS.md or the docs quotes the cap. The one stale quote is .github/workflows/lint.yml:1327 ('the 41st write in an hour'), a Tier H path outside the claimed file surface, deliberately left and handed to the seat. Coordinator's mid-run 'continue from creating the worktree': the worktree and the empty-branch probe already existed (clean, at BASE 85c01247ee), so work resumed from there without redoing them.",
      "tests": "node scripts/pm/write-pace.mjs --self-test at head 441a43cd33: exit 0, '✓ write-pace self-test: 119 cases pass across 12 batteries'. Ablation (scripts/ablation-replace.mjs, committed head, trap restore): anchor 'export const DEFAULT_HOURLY_MAX = 80;' count 1 before; mutated '= 40;' count 1 on disk mid-run; self-test exit 1 with exactly '✗ rule ②'s default is the ruled 80 writes per token-hour — got 40, want 80' / '1 of 119 case(s) failed' (every other cap-tied case followed the constant); restored: anchor counts new=1 old=0, git hash-object == HEAD blob c5e4330b3e7bc7e130e189e4660ba253c8418291, git diff HEAD empty. No package touched, so no build closure (step 1) and no package test/typecheck (step 2).",
      "gates": "Local derivation 'dispatch-gates --commands --repo objectstack-ai/objectstack' at 441a43cd33: 31 commands, every one exit 0 with $? captured to a file before any pipe (incl. check:pm-write-pace, check:self-test-wired, check:self-test-workflow-commands, check:pm-dispatch-gates 305s, check:nul-bytes, check:closing-keyword-parity). '--ran' with per-command exit codes: 'Run reconciliation — 31 derived, 31 run, 0 NOT-MEASURED, 0 UNRUN' (a derived zero); write-pace --self-test recorded as outside the derivation. check-governed-merges --branch: NOT governed, 1 path, +32/-11. The PR's CI check-runs were not awaited: in_progress at report time; the seat reads them.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2 — POST /repos/objectstack-ai/objectstack/dispatches (fleet-write pr_create; the runner then made POST /pulls draft, POST /issues/31363/assignees [os-bob], POST /issues/31363/labels [skip-changeset]); POST /repos/objectstack-ai/objectstack/issues/31302/comments (this os-dev-report via post-stamped). Two git pushes, not REST.",
      "open_questions": [],
      "security_findings": "none",
      "out_of_scope_findings": [
        "carrier: seat repo:cloud#1 · .github/workflows/lint.yml:1327 (comment above the write-pace self-test step) still says 'the 41st write in an hour is REFUSED'. It is comment-only drift (the step runs --self-test, which follows the constant), not class a/b/c. The path is Tier H governed and outside this claim's file surface, so it is not edited here · noted, not filed · dedupe words: lint.yml write-pace 41st comment, hourly cap stale, write budget 80"
      ]
    }
  6. objectstack-fleet commented on Nov 8, 2026

    @objectstack-fleet
    ContributorAuthor

    repo:cloud#1 · os-bob · session_012dn2AdARJtc4RgABPH7PHk

    LANDED · 2026-11-08T05:14Z · PR #31363 merged by the merge queue at 7189fb2a2f765b84c26c47e63f13adbb81f4d3da (2026-11-08T05:04Z), seat ACCEPT on head 441a43cd before queueing. DEFAULT_HOURLY_MAX is 80 on main; rules ①③④⑤ and the FOR-TESTS override unchanged. The card closed on the PR's Fixes #31302; pm:dispatched cleared and the assignee released in this pass. Noted, not filed: .github/workflows/lint.yml:1327 comment still says "the 41st" (Tier H path, comment only) — for the next governed edit of that file.

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    domain:skillsDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3toolingFix lands in tooling, not a product package — enters pm:queue only with Unblocks: or a named surface

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions