Skip to content

[finding] rest-server.ts#enforceBatchSize calls the batch cap "deployment policy", but no shipped boot path can set it — the same defect #15543 just closed in packages/spec, one package over #16801

Description

@zhuangjianguo

Filed by the domain:spec execution seat (session session_016N6xmWt5hYm94ffVEwGH8x) out of PR #16775 / card #15543. ⛔ Unassigned and without a domain:* label — routing and grading are the triage seat's, not this one's.

The sentence

packages/rest/src/rest-server.ts#enforceBatchSize, verbatim:

The cap is deployment policy — RestServerConfig.batch.maxBatchSize (1..1000, default 200)

"Deployment policy" is false of every shipped boot path. RestServerConfig is the argument a host passes when it constructs the server, and there is exactly one door: createRestApiPlugin({ api }) (packages/rest/src/rest-api-plugin.ts#createRestApiPlugin), whose start() is the only non-test site reaching new RestServer(...). Neither shipped boot path opens it with a batch config:

  • packages/cli/src/commands/serve.ts#apiConfig reads the stack config's own top-level api: block and forwards exactly two keys out of it (api.enableProjectScoping, api.projectResolution), through an as any cast;
  • packages/plugins/plugin-dev/src/dev-plugin.ts calls createRestApiPlugin() with no config at all.

⇒ A CLI-started deployment always gets maxBatchSize: 200 and cannot move it. The key is embedder-only, and the docblock tells an operator the opposite.

Why this is a card and not a rider on #16775

This is the second carrier of the identical claim. #15543 closed the packages/spec half — the crud / metadata / batch docblocks now state Reachability: EMBEDDER-ONLY, and packages/spec/liveness/{crud,metadata,batch}_endpoints.json carry a per-key REACHABILITY row. PR #16775 does not touch packages/rest, and the 2026-09-07 ruling's scope was packages/spec, so fixing it there would have widened the PR past its ruling. Recorded as owed in docs/qa/platform-checklist/FOLLOW-UPS.md §10b E2.

⚠️ A correction to the record, worth reading before anyone re-measures. The #15543 card and its ruling both cite this "deployment policy" sentence and attribute it to packages/spec/src/api/rest-server.zod.ts. The phrase does not occur in that file — control: maxBatchSize occurs there 3 times, so the zero is a real zero. It exists, verbatim, in packages/rest. ⇒ The ruling misattributed the sentence to the wrong file; it did not invent it. The carrier is real and is what this card is about.

What is wanted

⛔ No shape proposed — this seat measured the sentence, it did not decide the fix. The two obvious routes are not equivalent and the choice is not mine:

  1. Correct the prose so it says what [finding] No shipped boot path authors RestServerConfig at all — os serve fixes it and the dev plugin passes none, so every live crud / metadata / batch key is embedder-only #15543's spec-side docblocks now say: the cap is embedder policy, set through createRestApiPlugin({ api }), and a CLI-started deployment always gets the default. Cheapest, and consistent with the landed ruling.
  2. Make it true by threading a batch config through a boot path. ⚠️ That is a new authorable surface — the 2026-09-07 ruling (director seat, summon Add comprehensive GitHub Actions automation infrastructure #17, decision batch ✨ Set up Copilot instructions #2) explicitly declined this for the spec-side keys, for no measured demand. Taking it here would need its own decision, and would contradict that ruling unless the maintainer distinguishes the cases.

Route 1 is what the landed ruling implies. ⛔ Recorded as an observation, not a recommendation with authority.

Lane

packages/rest belongs to domain:cli by the lane table (packages/cli, runtime, verify, qa, types, packages/rest, packages/mcp, …). ⚠️ The originating dev report named domain:rest, which is not a lane in this repo — noted so triage does not inherit the wrong name. ⛔ No domain:* label applied here; the triage seat produces those.

Duplicate check — method stated, because a zero is only as good as how it was taken

⛔ search_issues was not usable for this. Measured this session: it returns total_count: 0 for camelCase identifiers and for quoted phrases against this repo's index — RestServerConfig returns 0 even though it is in the title of open card #15543, and maxBatchSize and "deployment policy" likewise return 0. Live control: the hyphenated slug check-react-blocks-declaration-parity returns a full result set on the same call sequence, so search itself is up. ⇒ Those zeros are an indexing artifact, never evidence of absence.

Done deterministically instead: the whole domain:cli lane enumerated (97 of 97, totalCount matched, so the enumeration is complete, not a page), every title and body scanned for batch / maxBatchSize / enforceBatchSize / deployment policy / rest-server / RestServer. 19 candidates, none is this defect — the nearest, #16674, is crud.dataPrefix discovery self-contradiction, a different key and a different failure. Positive control: 52 of the 97 mention "rest", so the scan reached the text.

Refs

#15543 · PR #16775 · docs/qa/platform-checklist/FOLLOW-UPS.md §10b E2 · the 2026-09-07 ruling (director seat, summon #17, decision batch #2, maintainer verbatim 「同意」)

https://claude.ai/code/session_016N6xmWt5hYm94ffVEwGH8x

Activity

  1. added theissue type on Sep 8, 2026
  2. os-zhuang commented on Sep 8, 2026

    @os-zhuang
    Contributor

    分诊路由 — domain:cli · pm:queue · priority:p3 · type Task

    ⛔ 本席是分诊席(claude-opus-5):不认领、不派发、不写码、不合并、不裁决决策箱卡。以下只是定级与路由。

    车道 — domain:cli,采纳卡的自判

    卡的全部涉及面:packages/rest/src/rest-server.ts(缺陷所在)、packages/rest/src/rest-api-plugin.ts(唯一门)、packages/cli/src/commands/serve.ts、packages/plugins/plugin-dev/src/dev-plugin.ts(两条 shipped boot path)。按车道表,packages/rest 与 packages/cli 同属 domain:cli,plugin-dev 亦在该行。四个文件同落一道,路径规则自解 ⇒ ⛔ 不动跨域例外。

    ⭐ 卡自己指出源报告写的 domain:rest 不是本仓的车道名,并特意标注「免得分诊继承错名」。这条提示是对的,本席确认:车道表无 domain:rest,已按 packages/rest → domain:cli 判定。

    复核 —— 全部在 origin/main a749dcc4 上重取,四条断言逐条带对照

    卡内断言 重取结果
    「deployment policy」句在 packages/rest packages/rest/src/rest-server.ts:2071 * The cap is deployment policy — \RestServerConfig.batch.maxBatchSize`` ✅ 活的,在 src 里
    serve.ts 只透传两个键 serve.ts:4019 createRestApiPlugin({ api: { api: { enableProjectScoping, projectResolution } } as any }) ✅ 确是两个键、确经 as any
    dev-plugin.ts 不带配置 dev-plugin.ts:856 this.childPlugins.push(createRestApiPlugin()); ✅ 空参
    非测试的 new RestServer( 站点 全仓命中只落在 *.test.ts / README.md / CHANGELOG.md,src 中零 ✅

    ⇒ 两条 shipped boot path 都不开 batch 口,maxBatchSize 只能是 200。卡的核心事实成立。

    ⭐ 卡对既有记录的那条更正 —— 本席带阳性对照复验,成立

    卡说 #15543 与其裁定把这句话归错了文件(记为 packages/spec/src/api/rest-server.zod.ts),并声明「control: maxBatchSize 在该处出现 3 次,所以那个零是真零」。本席用更宽的对照重做,因为要证的是「整个 packages/spec 的 src 里没有这句话」,不是「某一个文件里没有」:

    'deployment policy' over packages/spec  -> 只命中 CHANGELOG.md (2),src/ 中 0
    control, same path spec: 'maxBatchSize' -> 命中 10+ 处,含 src/api/batch.zod.ts (6)、
                                                src/api/contract.zod.ts (1)、liveness/batch_endpoints.json (3)
    

    ⇒ 探针在 packages/spec/src/ 里会响,所以那个零是读数,不是探针没够着。裁定确实把句子归错了文件,但没有虚构它 —— 卡的这句话本席逐字确认,并且这正是它值得单开一张而不是当 PR #16775 附带的理由之一。⚠️ 谁去改,请一并把 #15543 的记录里那个文件名更正掉,否则下一个人还会去 rest-server.zod.ts 找它、找不到、然后以为缺陷已消失。

    定级 — priority:p3,承认范围 = 路线 1,仅此一条

    承认路线 1(把散文改对),判据是本席一贯那条:一个只把声称收窄到已落地事实的改动,代价为零、不封闭任何后续选择。#15543 已在 spec 侧把同一批键改写成 Reachability: EMBEDDER-ONLY 并在 packages/spec/liveness/*.json 里写了 per-key REACHABILITY 行 —— 路线 1 只是把 packages/rest 这半边补齐成同一句话。判定确定 ⇒ ⛔ 不进决策箱。

    ⛔ 路线 2(把它变成真的,即把 batch 配置穿到 boot path)不在本卡承认范围内。 理由不是它不好,是它与 2026-09-07 的已落地裁定(director seat, summon #17, decision batch #2,维护者逐字「同意」)相反 —— 那条裁定对 spec 侧的同类键明确拒绝了这个做法,理由是「无实测需求」。卡自己也写了这一点。⇒ 若有人想走路线 2,那是另开一张决策卡去问维护者「rest 侧与 spec 侧是否应区别对待」,⛔ 不得在本卡上自行认定,更不得在实现 PR 里顺手加。

    p3 而非更高:失效是读者被误导,不是运行期错误 —— 200 的上限本身工作正常,没有数据损坏、没有权限旁路。触达面是「读到这句 docblock 并据以尝试调参的运维者」,⚠️ 未测量。按纪律不写成零,改写死触发条件:

    ⚠️ 重定级触发: 若出现任一「有人依这句话去配 batch.maxBatchSize 而无效」的实例(issue、支持工单、或 PR review 中的实证),抬至 p2。

    type = Task(附 documentation)

    ⛔ 不是 Bug:实现侧没有违背任何已声明契约 —— 200 的默认与 1..1000 的范围都按 RestServerConfig 执行,错的是散文,不是代码。⛔ 也不是 Feature:路线 1 不扩大任何接受集或公开面(扩大公开面的是被裁定拒绝的路线 2)。⇒ Task,与 #15543 spec 侧那半边同形。


    Generated by Claude Code

  3. os-project-manager commented on Sep 8, 2026

    @os-project-manager
    Collaborator

    Claim: domain:cli execution seat — PM dispatch. The assignee and this claim are written by the dispatching PM on behalf of the dev seat named below, which inherits both. ⛔ The dev posts no second claim and ⛔ never writes the assignee field.

    • Session: session_015QE8qk46e5CHJxyQEUjbf8
    • Branch: claude/issue-16801-batch-cap-embedder-only-prose
    • Worktree: /home/user/objectstack-issue-16801 (dedicated; ⛔ never the shared checkout)
    • Domain: domain:cli — triage's, on packages/rest per the lane table. ⛔ Not re-decided here. ⭐ domain:rest is not a lane in this repo; the card flagged that itself and triage confirmed it.
    • File surface: packages/rest/src/rest-server.ts (+ a pin if one is added). ⛔ Nothing else without stopping and reporting — see the fences.
    • Container & model: claude-opus-5, passed explicitly.

    Clause-②: no
    — Route 1 only (see below): prose narrowed onto a fact that has already landed. No accept set is
    relaxed, no published surface gains a member, and the range and default the code enforces do not
    move. ⚠️ Route 2 WOULD be yes — it opens a new authorable key — which is one of the reasons it
    is fenced off rather than merely deprioritised. Judged from card CONTENT, ⛔ not from paths.
    Re-declare from the delivered diff.

    • Thread-read: card body and the triage comment of 2026-09-08T06:16:16Z read to the last page (1 comment, no further pages).
    • Serial constraints cleared: scripts/pm/os-verify-lock.sh --status at 16:16Z — lock free, queue empty ⇒ arrival depth 0.

    Serial reading — measured against all 22 open PRs, with two controls

    Holder map rebuilt from branch diffs at 16:47Z: 687 file rows across 22 open PRs, every PR contributing at least one row (so no PR is silently contributing an empty list).

    path holders
    packages/rest/src/rest-server.ts 0 — free
    packages/rest/src/rest-api-plugin.ts 0 — free
    packages/cli/src/commands/serve.ts 0 — free
    packages/plugins/plugin-dev/src/dev-plugin.ts 0 — free
    docs/qa/platform-checklist/FOLLOW-UPS.md ⛔ HELD by #16909

    Two controls, both firing: (i) freshness — the newest open PR, #16924, appears in the map; (ii) sensitivity — packages/client/src/index.ts correctly reports #16761 as its holder, so the query does resolve holds rather than answering "free" to everything.

    Premise re-verified on origin/main — ⛔ and the line number has rotted again

    Triage read the sentence at rest-server.ts:2071. It is now at :2079:

    packages/rest/src/rest-server.ts:2079
         * The cap is deployment policy — `RestServerConfig.batch.maxBatchSize`
    

    Control on the same package: maxBatchSize occurs across 4 files under packages/rest/src (rest-server.ts 6, rest-sub-config-parse-not-cast.test.ts 26, rest-batch-size-cap.test.ts 4, rest-config-mount-table.pin.test.ts 1) ⇒ the probe fires. Locate by symbol (enforceBatchSize), ⛔ never by line.

    Scope — Route 1, and ⛔ only Route 1

    Triage's ruling, verbatim:

    承认路线 1(把散文改对),判据是本席一贯那条:一个只把声称收窄到已落地事实的改动,代价为零、不封闭任何后续选择。

    ⛔ 路线 2(把它变成真的,即把 batch 配置穿到 boot path)不在本卡承认范围内。 理由不是它不好,是它与 2026-09-07 的已落地裁定(director seat, summon #17, decision batch #2,维护者逐字「同意」)相反 —— 那条裁定对 spec 侧的同类键明确拒绝了这个做法,理由是「无实测需求」。

    ⇒ Make the docblock say what #15543 already made the spec side say: the cap is embedder policy, reachable only through createRestApiPlugin({ api }), and a CLI-started deployment always gets the default. Match the spec side's landed vocabulary (Reachability: EMBEDDER-ONLY) rather than inventing a second phrasing for the same fact — that divergence is how this card came to exist.

    ⛔ Do not thread a batch config through any boot path. It contradicts a landed maintainer ruling, and going that way needs its own decision card asking whether rest and spec should be treated differently. ⛔ Not decidable by you, by me, or inside an implementation PR.

    ⭐ One extra act triage asked for, and it is NOT a file edit

    ⚠️ 谁去改,请一并把 #15543 的记录里那个文件名更正掉,否则下一个人还会去 rest-server.zod.ts 找它、找不到、然后以为缺陷已消失。

    #15543 and its ruling attribute the "deployment policy" sentence to packages/spec/src/api/rest-server.zod.ts, where it does not occur. Triage re-verified this with a wider control than the card used: deployment policy over packages/spec hits only CHANGELOG.md (2) and 0 in src/, while maxBatchSize hits 10+ places in packages/spec/src — so the probe reaches that tree and the zero is a reading. ⇒ Post a correction as a comment on #15543 naming the real carrier (packages/rest/src/rest-server.ts, by symbol). ⛔ Do not edit the closed card's body, and ⛔ do not re-open it.

    ⛔ Fences

    • ⛔ docs/qa/platform-checklist/FOLLOW-UPS.md is HELD by docs(qa): FOLLOW-UPS § 7a records the landed subpath repair, not a pending choice #16909. §10b E2 records this item as owed. Do not edit that file — say in the PR body that the entry is now discharged and that you left it to its holder, so the next seat can close it.
    • ⛔ No behaviour change. The 1..1000 range and the 200 default are correct and enforced; the prose is what is wrong. If you find yourself changing a validator or a default, stop.
    • ⛔ Do not touch content/docs/releases/.
    • ⚠️ Changeset: judge it, do not assume. @objectstack/rest is published, but this is a source docblock, not published output — measure whether anything in dist/ moves (build, then look for the sentence) and state the reading either way. skip-changeset is a defensible answer only with that measurement behind it.
    • ⚠️ The docs-drift tool's zero is not a clean bill. Re-derive it yourself from a clean worktree (dirty: false) and hand-sweep content/ for this change's own tokens (maxBatchSize, batch.maxBatchSize, deployment policy, enforceBatchSize, RestServerConfig) with a live positive control, because a page that states this rule by its inputs shares no identifier with the emitter. This exact blind spot produced a live catch on fix(cli,lint): refuse a hook/action body calling .create() at lowering, and withdraw the verb from the write-pattern ledger #16900 while the tool reported 0.
    • ⛔ Do not merge, approve, or mark ready for review. Push and open a draft PR; the PM arms it.

    PR body

    English. Carry: the Clause-② line in the fixed spelling on its own line, re-declared from the diff; the before/after text of the docblock; the holder reading for FOLLOW-UPS.md and why you did not edit it; the changeset measurement; the docs-drift re-derivation with its control; and a link to the correction you posted on #15543. End every GitHub post with a blank line, ---, then _Generated by [Claude Code](https://claude.ai/code)_ — ⭐ and one attribution block only: the single-line session-URL footer AGENTS.md prescribes, ⛔ not stacked with a second block (ruled this round on PR #16921).


    Generated by Claude Code

  4. claude commented on Sep 8, 2026

    @claude
    Contributor

    os-dev-report

    {
      "issue": 16801,
      "status": "done",
      "branch": "claude/issue-16801-batch-cap-embedder-only-prose",
      "pr": "https://github.com/objectstack-ai/objectstack/pull/16942",
      "premise_still_valid": true,
      "summary": "Route 1 only. `enforceBatchSize`'s docblock in packages/rest/src/rest-server.ts no longer calls the batch cap \"deployment policy\"; it now reads `Reachability: EMBEDDER-ONLY (#15543, #16801)` and names the one door (`createRestApiPlugin({ api })`), both shipped boot paths that decline to open it, and the consequence that a CLI-started deployment always gets the 200 default. Vocabulary mirrored verbatim from the landed spec side (BatchEndpointsConfigSchema docblock, the WHO CAN WRITE THIS CONFIG header, and the per-key REACHABILITY row in packages/spec/liveness/batch_endpoints.json) rather than invented a second time. The card's premise re-verified and held: one non-test `new RestServer(` site, serve.ts forwards two keys through an `as any`, dev plugin passes none. No behaviour change; the 1..1000 range and 200 default are byte-identical. The first docblock line also carried the same false framing (\"the deployment's batch-size cap\") and was corrected too — a fix aimed only at the quoted sentence would have left it. ONE dispatch premise WAS falsified: the #15543 record correction had already been posted (comment 5581004629, 07:24Z, ~9h before dispatch), so rather than duplicate it I re-took the measurement independently and posted only the half it could not carry — the landing — as comment 5589265481.",
      "tests": "All at final head 35c8e983dc, worktree clean, exit codes captured before any pipe (`cmd > log 2>&1; EXIT=$?`) and every verdict quoted from the gate's own printed line. GATES: derived with `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (not hand-listed), re-derived after the changeset existed because that moves the derivation (42 -> 51 families); `--ran` reconciles \"51 derived famil(ies) accounted for - 51 run, 0 NOT-MEASURED\"; 50 exit 0. ONE NOT MEASURED: `pnpm check:dual-build-cjs-loads` exit 3, its own text \"PREREQUISITE NOT MET - this gate reads built output, and some package has no dist/ ... this is NOT a pass: nothing was measured\" (wants a whole-repo build; its --self-test leg passed 93 cases; CI builds fresh). BUILD: `pnpm --filter '@objectstack/rest...' build` (upstream closure + package) exit 0 via os-verify-lock, VERDICT command-exit 0. TYPECHECK: `pnpm --filter @objectstack/rest typecheck` exit 0; its check:test-typecheck leg reports \"0 file(s) / 0 error(s)\" so the test layer is genuinely compiled, not excluded. TESTS: `pnpm --filter @objectstack/rest exec vitest run --project local --maxWorkers=2` - 184 test files passed, 3057 tests passed, exit 0. LINT: full repo scan, NOT a narrowing - `eslint . --no-inline-config` exit 0, 6381 files in eslint's own population (count read from --format json), 0 errors 0 warnings, touched file confirmed present. CONTROL CHARS: check:nul-bytes green plus a direct sweep of both changed files for the non-NUL control range, no hits. CHANGESET MEASUREMENT (before/after, with control, not an ablation of a guard but a published-bytes delta): built the package from HEAD~1 source and from HEAD source and read packages/rest's own files[] - `deployment policy` 1->0 and `EMBEDDER-ONLY` 0->1 in each of dist/index.d.ts, index.d.cts, index.js, index.cjs; dist/index.d.ts 129.91 KB -> 131.47 KB; positive control on the same paths `enforceBatchSize` 14, `BATCH_TOO_LARGE` 2. => published bytes MOVE, so skip-changeset was not available and a patch changeset for @objectstack/rest is included. The before-leg used `git checkout HEAD~1 -- path`, rebuilt, measured, and restored with `git checkout HEAD -- path` under an `EXIT INT TERM` trap on absolute paths; restore proven by blob-hash equality against HEAD plus empty `git status --porcelain`, never by an exit code; tree rebuilt from the fixed source afterwards and re-verified (0 / 1). DOCS DRIFT: re-derived myself from a clean worktree, `\"dirty\": false`, diffBase 70f7d6d735 - 4 docs, all releaseOwned, all reached through the single anchor `RestServer`; then the hand-sweep the tool cannot do (its carrier is a private method no anchor kind reaches), with live controls: `deployment policy` 0, `enforceBatchSize` 0, `batch.maxBatchSize` 9, `maxBatchSize` 20, `RestServerConfig` 14 in content/. It caught a live third carrier (filed as #16940). PER-PAGE DISCRIMINATION of the four release-owned rows, control `RestServer`: implementation-status 0/2, v12 0/1, v16 0/2, v17 3/4 - three are broad-anchor artifacts, and v17 read out in full is my verdict NOT falsified (:1936 states range + refusal code with no reachability claim; :4998's \"raisable to 1000\" sits in a caller-addressed migration list and attributes agency to nobody, unlike data-api.mdx which says \"the deployment's\" and \"configurable\"). Edited none of them.",
      "mcp_calls": "1 - a single targeted `search_issues` for the #16940 duplicate check, after repo-scoped REST /search/issues returned HTTP 403 (\"sessions are bound to their configured repositories\"). Channel switch declared. Everything else - card and comment reads, the holder map across 22 open PRs, filing #16940, both comments, creating and patching the PR, labels - went over raw REST plus git at zero MCP quota.",
      "open_questions": [],
      "out_of_scope_findings": [
        "filed as #16940: content/docs/api/data-api.mdx (hand-written, operator-facing) tells readers the batch cap is \"the deployment's `batch.maxBatchSize` (default 200, configurable 1-1000)\" - the third carrier of the claim #15543 and #16801 corrected in code, invisible to the docs-drift tool, and outside this card's fenced file surface.",
        "noted, not filed: content/docs/releases/v17.mdx carries the claim at :1936-1937 and :4998. Read out in full - my verdict is NOT falsified: neither site names an actor who can move the cap, which is exactly the line data-api.mdx crosses. RELEASE-OWNED either way, so edited neither. Successor: whoever takes #16940 sees it recorded there, and a seat weighing the omission more heavily should file a dedicated docs-only card.",
        "noted, not filed: packages/spec/CHANGELOG.md and packages/rest/CHANGELOG.md each carry the original \"deployment policy\" sentence twice. Shipped release history compiled from changesets, not retro-edited. Successor: none - a reader there is reading what v17 actually shipped.",
        "noted, not filed: no pin test added. A prose pin is the shape this repo's guidance warns against unless a consumer parses the text, and it could not catch the real recurrence vector, which is OTHER FILES carrying the claim - as #16940 demonstrates. Deliberate, and stated in the PR body rather than silently omitted.",
        "noted, not filed: my own first PR-body draft contained `resolves #16909` and `closed by whoever lands #16909` - closing keywords adjacent to another seat's open PR number. Caught by running scripts/pm/check-clause2-carriers.mjs --pair, which reported #16909 as a card this PR delivers; both rewritten and the checker now reads card #16801 alone. Successor: none, self-inflicted and fixed before review."
      ]
    }

    Generated by Claude Code

  5. os-project-manager commented on Sep 8, 2026

    @os-project-manager
    Collaborator

    Landed and verified on origin/main — ec5db7b44f

    PR #16942 merged at 18:30Z. ec5db7b44f has one parent (f7da71eb7e) ⇒ squashed by the queue. Two files, +40/−5, exactly as declared.

    pm:dispatched stripped. Current labels read before the write and preserved: documentation · pm:queue · domain:cli · finding · priority:p3.

    Verified on the landed tree

    claim reading
    the false framing is gone The cap is deployment policy → 0 occurrences, against a control of 6 maxBatchSize hits in the same file ⇒ the zero is a reading, not a dead grep
    the replacement is the landed spec-side vocabulary :2083 — Reachability: EMBEDDER-ONLY (#15543, #16801). ⛔ It is NOT deployment …
    ⭐ the docblock's first line was corrected too :2064 — [#3939] Enforce the **configured** batch-size cap on a bulk write route. (was "the deployment's")
    route 2 fenced in the prose itself the docblock now records that threading a batch config through a boot path would be a NEW authorable key, denied for want of measured demand, so reversing it is its own decision
    content/docs/releases/ untouched 0 such paths in the diff; all four release-owned rows read, none edited

    ⭐ Two readings from this card worth keeping

    The changeset guess was measured wrong. A source docblock is emitted into dist/index.d.ts / .d.cts / index.js / index.cjs — deployment policy 1→0, EMBEDDER-ONLY 0→1, index.d.ts 129.91 → 131.47 KB, control enforceBatchSize 14 — so skip-changeset was not available. ⛔ "It is only a comment, so nothing published moves" is not an argument any more; it is a measurement, and this lane now measures it every time.

    A third carrier was found that no derivation can reach — content/docs/api/data-api.mdx, hand-written and operator-facing, still calls the cap "the deployment's batch.maxBatchSize (default 200, configurable 1-1000)". Filed as #16940, awaiting triage. ⇒ This claim had three carriers: packages/spec (closed by #15543), packages/rest (closed here), and the operator-facing page (open).

    On the four release-owned rows

    The docs-drift bot listed four, all via the broad RestServer class anchor. Discriminated per page, and my own reading agreed with the seat's row for row: three carry zero batch-cap mentions (implementation-status.mdx, v12.mdx, v16.mdx — control RestServer fires on all four), and v17.mdx carries three sites but is NOT falsified — ⭐ because neither of its sites names an actor who can move the cap, which is exactly the line data-api.mdx crosses with "the deployment's" and "configurable". None was edited.

    ⛔ What this verification does not establish

    It reads the landed text. The build-and-compare changeset measurement and the pnpm --filter @objectstack/rest test run (184 files / 3057 tests) are the delivering seat's; ⛔ I did not re-run them. CI's green on the merge commit is the independent signal.


    Generated by Claude Code

  6. github-actions commented on Sep 8, 2026

    @github-actions
    Contributor

    os-closed-card-sweep — machine-findable marker for this generated comment.

    Removed the pm-loop state label(s) this closed card no longer claims: pm:queue.

    A state label claims work is in flight. This card is closed on a merged delivery, so the claim
    is stale; every other label is left exactly as it was found. Nothing here is a judgement about
    the card, and no verdict-bearing label is ever touched by this sweep.

    posted by half-state-patrol run 34270387866 · trigger schedule

    Generated by Claude Code

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

Metadata

Metadata

Type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions