docs(changelog): correct the falsified batch-cap claim in the published 17.0.0 and 17.0.0-rc.1 entries - #18852
Merged
os-try-charles merged 1 commit intoSep 18, 2026
Conversation
…ed 17.0.0 and 17.0.0-rc.1 entries
A dedicated docs-only PR, which AGENTS.md's Documentation Guardrails row for
`packages/*/CHANGELOG.md` requires: a factual error in a released entry is
amended in that entry, never as an erratum in a later one and never as a rider
on code changes. This diff is exactly two files, adds no source, no schema, no
export and no changeset.
The 2026-09-07 ruling found that no reader of a published surface can configure
`batch.maxBatchSize`. The `789ad63` entry carries that falsified claim in two
wordings, and the copy under `## 17.0.0` and the copy under `## 17.0.0-rc.1` are
both published text, so all four copies are corrected:
- "Batch size is deployment policy" -> "embedder policy", and the counterfactual
beside it ("a deployment raising the limit to 500") now reads "a host".
- The behaviour bullet stopped issuing an instruction no shipped boot path can
carry out. It read "Deployments ... should raise `batch.maxBatchSize` (up to
1000) rather than discover the cap in production"; it now states where the cap
actually comes from.
One dated erratum line closes each entry, carrying the in-repo tail this
repository already uses, and quoting both published wordings verbatim so the
record of what shipped is still readable. The 1..1000 range, the 200 default and
the enforcement this release shipped are unchanged.
Vocabulary is copied from the four prior landings of this same correction rather
than invented.
Claude-Session: https://claude.ai/code/session_017ef78bLdybu3AffehKkhfk
Co-authored-by: Claude <noreply@anthropic.com>
Contributor
📓 Docs Drift Check
What this run could not see
Coarse fallback — 138 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
os-try-charles
marked this pull request as ready for review
September 18, 2026 01:11
os-try-charles
deleted the
claude/issue-18740-changelog-batch-cap-claim
branch
September 18, 2026 01:48
This was referenced Sep 18, 2026
Merged
akarma-synetal
pushed a commit
to akarma-synetal/framework
that referenced
this pull request
Sep 28, 2026
…se announcements (objectstack-ai#19041) Fixes objectstack-ai#18926 Clause-②: no The near-miss ownership census (`ownershipMarkerNearMisses` over `OWNERSHIP_MARKER_NEAR_MISS_FORMS`, landed by PR objectstack-ai#18911 / objectstack-ai#18831) lists cards with a near-miss ownership line and no readable `Claim:` / `Release:`. Five of objectstack-ai#18914's sixteen rows have no ownership record to normalise: four `pm:seat` posts (objectstack-ai#6017 · objectstack-ai#6021 · objectstack-ai#6026 · objectstack-ai#6367), whose ownership is their BODY plus their audit comments and whose comments carry shift narration, and objectstack-ai#17536's `## Released — PR objectstack-ai#17517 merged. pm:blocked -> pm:queue`, a blocker release naming a PR on a card that was never claimed. Two exclusions, both COUNTED rather than dropped, and they are deliberately different KINDS: a seat post leaves the POPULATION (no record is owed on the thread), a release announcement leaves the near-miss CHANNEL (the line is not a refused record). - `ownershipCensusSpeaksAbout(issue)` — a `pm:seat` thread is out of the population, read off the label page the sweep already holds, so the census keeps its "buys NOTHING" contract. Gated at the call site like every other population predicate in this file (`h47SpeaksAbout`, `h58SpeaksAbout`, `h67SpeaksAbout`), which is also what makes it usable by the direct full-board caller that produced objectstack-ai#18914's rows. - `releaseAnnouncementHeading(formId, prefix, line)` — a heading whose word is the PARTICIPLE `Released`, whose remainder names the `PR #n` that landed or the `pm:*` -> `pm:*` transition it unblocked, and which names NO session. The line keeps its card, comment id and prefix and moves to a second channel, so the two arrays partition exactly what the single array used to carry. - `ownershipMarkerNearMissCensus` returns `{ misses, announcements }`; `ownershipMarkerNearMisses` stays the near-miss half and the name every caller and every fixture already uses. The vocabulary is untouched (no form added, no form removed) and so is the reader: no change to what a readable `Claim:` / `Release:` is. H8 / H46 territory is not entered. ## The three narrowings, each measured against the corpus line that forced it Every one of these leaves the line IN the census — the safe direction for a filter whose failure mode is silence. | narrowing | the line that forced it | verdict | |---|---|---| | HEADING forms only | objectstack-ai#18740 comment 5723834336 `Release-landed: … (PR objectstack-ai#18852)` | `separator`, not a heading — stays listed | | the PARTICIPLE only | objectstack-ai#16233 comment 5704218834 `### Release: PR objectstack-ai#18523 …` | bare noun opens the directive — stays listed | | NO session token (`session` or the Chinese spelling) | objectstack-ai#6023 comment 5552092492 `## Released tail — in flight under THIS session's process tree` | names a session — stays listed | ## The census over the live board — BEFORE / AFTER Two readings, both read-only through the session proxy, both with the `--use-env-proxy` re-exec the file performs itself. **(1) The instrument's own clause, one full sweep each.** BEFORE at the base (`784366372`), AFTER at this branch's head: ``` BEFORE Ownership-marker near misses: 17 line(s) on 15 of 222 thread(s) … AFTER Ownership-marker near misses: 16 line(s) on 14 of 226 thread(s) … 0 `pm:seat` thread(s) are OUT of that population (0 near-miss line(s) not listed above) … 1 further line(s) are release ANNOUNCEMENTS rather than refused records … — objectstack-ai#17536 comment 5625672905 「## Released」 (names a PR, names a `pm:*` transition) ```⚠️ MEASURED AND REPORTED AS MEASURED: the population clause prints `0` / `0` on the live sweep, and that is not the filter failing. The census reads only threads `commentCache` already holds, and a `pm:seat` post's page enters that cache in the H44 pass BELOW the census loop (`commentCache.set` at the seat-comments leg; `seatPostRowsFor` itself writes only `seatPageCache`). So on the sweep as currently ordered a seat thread is UNJUDGED by the census, never listed — which is why the clause renders both numbers unconditionally instead of staying silent: a run with nothing excluded and a run where the exclusion stopped being applied must not print alike. The ordering itself is left exactly as it is; moving the census would widen what it reads, which this card does not ask for. **(2) The full-board corpus — the population objectstack-ai#18914's sixteen rows were actually measured over**, and the reading where the population filter bites. Read 2026-09-18 13:0xZ, tree `784366372`: 539 open cards, 484 of them carrying a comment, the census run over every thread: ``` BEFORE (vocabulary alone): 36 line(s) on 30 card(s) pm:seat threads OUT of the population: 5 thread(s), 9 line(s) objectstack-ai#6017 · objectstack-ai#6021 · objectstack-ai#6023 (×4) · objectstack-ai#6026 · objectstack-ai#6367 release ANNOUNCEMENTS out of the near-miss channel: 1 line objectstack-ai#17536 comment 5625672905 「## Released」 AFTER (near-miss channel): 26 line(s) on 24 card(s) partition check: 26 + 9 + 1 === 36 -> true ``` The five rows the card names are gone, each with its printed reason. Of objectstack-ai#18914's other eleven, the ten that are still open are listed byte-identically — objectstack-ai#11633 · objectstack-ai#11663 · objectstack-ai#14512 · objectstack-ai#15638 · objectstack-ai#6736 · objectstack-ai#9659 · objectstack-ai#9707 · objectstack-ai#11286 · objectstack-ai#11453 · objectstack-ai#11925. The eleventh, objectstack-ai#18755, is CLOSED (`pm:done`) and so is absent from an open-board read altogether, not dropped by anything here.⚠️ objectstack-ai#6023 is a FIFTH `pm:seat` post the filing card's table does not name, carrying four narration lines. It is out of the population on the same grounds as the four, and the count above says so rather than folding it into the named five. ## Self-test — floors rise, and the controls are inside the floored battery ``` BEFORE 4978 cases pass. … H2/H47/H66 decorated ownership marker 140/136 … AFTER 5031 cases pass. … H2/H47/H66 decorated ownership marker 193/184 … ``` +53 cases, all in the floored battery, pin raised 136 -> 184 (the file's "just under the count" convention, ~95%). What they floor is a NARROWING — the one direction in which a suite can go green by asserting less — so the firing controls live inside the same battery: the five measured rows as fixtures (each line pasted from the REST read of its own comment), the three narrowings above each pinned through its corpus line, the positive control that objectstack-ai#14512's `Claiming` line is still listed on the near-miss channel and its card still in the population, and the ablation pin that the excluded line IS a near miss under the vocabulary alone (so the exclusion pin is capable of failing). One landed case was RE-POINTED, not deleted: `objectstack-ai#18831: the release side of the HEADING form is named too` carried objectstack-ai#17536's line as its fixture, which is the very line this card moves to the announcement channel. Its claim is untouched and still floored; its fixture is now objectstack-ai#16712 comment 5605768467 (`## Release + seat ruling — …`, a live release heading that names no PR and no transition), and a sibling case pins where the old fixture went. ## Verification - `pnpm check:pm-half-states` — exit 0, `✓ check-half-states self-test: 5031 cases pass.` - Gates derived from this worktree with `node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack` (1 path vs merge base `784366372`): 39 commands, 38 run in the foreground, all `exit 0`, reconciled with `--ran`. `pnpm check:pm-dispatch-gates` exceeds the foreground cap and was detached. - The derivation reports a STALE TREE against `origin/main` `dbd474431` (`.github/workflows/pr-automation.yml`). Read: that change is prose inside the `Check Changeset` job (objectstack-ai#18375's route-0 discriminator) and declares no family, so no command is missing from the list above. - No changeset: `scripts/pm/**` publishes nothing from any released package. Route 0 of that same discriminator does not apply — this PR edits no existing changeset. - Control-byte self-scan over the touched file: no hits. **Reader test** — one line, from the worktree root, prints `0 1 false`: the excluded line is no longer a near miss, it IS counted on the announcement channel, and a `pm:seat` thread is out of the population. ```bash node -e 'const L="## Released — **PR objectstack-ai#17517 merged.** `pm:blocked` → `pm:queue`";import("./scripts/pm/check-half-states.mjs").then(m=>console.log(m.ownershipMarkerNearMisses([{id:1,body:L}]).length,m.ownershipMarkerNearMissCensus([{id:1,body:L}]).announcements.length,m.ownershipCensusSpeaksAbout({labels:[{name:"pm:seat"}]})))' ``` ## Acceptance notes Noted, not filed — observations, no card: - The `separator` form reads `Release-landed:` (objectstack-ai#18740 ×3, objectstack-ai#16529 comment 5720102045) as a near miss. Those are report-line labels, not ownership records, and they are the largest remaining class of the same kind this card narrows. Deliberately left listed: the ruling scopes this card to the seat population and the release HEADING, and ⛔ no widening or further narrowing of the vocabulary. Whoever next touches `OWNERSHIP_MARKER_NEAR_MISS_FORMS` is the successor; today there is none. - The census loop sits ABOVE the pass that puts a `pm:seat` page into `commentCache`, so the census never judges a seat thread on a live sweep. Stated in the sweep reading above and in the code comment; not filed, because changing the ordering would widen the census's judged population, which is a decision and not a defect. - The dispatch's assumption that the five rows' FIRST lines are the fixtures was falsified by the paste: on three of the five (objectstack-ai#6017 · objectstack-ai#6021 · objectstack-ai#6367) the census names a later narration line and the heading the card's table quotes carries no near miss at all. The fixtures are the lines the census NAMES; the discrepancy is pinned as a case rather than left as a silence. Serial: `scripts/pm/check-half-states.mjs`. PR objectstack-ai#18980 (objectstack-ai#18939) is a parallel draft on this file with old-line hunks :19613–:19659 and :35268 — the proxy-rearm plan and its guard — disjoint from the census hunks here (:1362–:1440 and the BATTERY68 battery). Nothing there is touched. Whichever lands second merges `origin/main` first. Not governed (`scripts/pm/**`): draft, for the `domain:skills` seat's contract-tier review. --- _Generated by [Claude Code](https://claude.ai/code/session_01BTeBejoPUvRHN8WdAJC6oF)_ Co-authored-by: Claude <noreply@anthropic.com>
akarma-synetal
pushed a commit
to akarma-synetal/framework
that referenced
this pull request
Sep 28, 2026
…ease page (objectstack-ai#18854) (objectstack-ai#18907) Fixes objectstack-ai#18854 The 17.0 release page (`content/docs/releases/v17/17-0.mdx`) told bulk callers the batch cap was "raisable to 1000". That claim was ruled false on 2026-09-07 (director seat, summon objectstack-ai#17, decision batch objectstack-ai#2, maintainer 「同意」): `batch.maxBatchSize` is embedder policy — `RestServerConfig.batch.maxBatchSize`, 1..1000, default 200 — written only by a host that constructs the server; `os serve` and the dev plugins pass none, so a CLI-started deployment is at 200 and no published surface raises it. Eight carriers were corrected under that ruling (objectstack-ai#15543, objectstack-ai#16801, objectstack-ai#16940, objectstack-ai#17183, objectstack-ai#18739, objectstack-ai#18740 ×8 sites via PR objectstack-ai#18852). This is the ninth and last: the bullet is corrected in the entry itself and carries a dated erratum, in the shape PR objectstack-ai#18852 established. - **Dedicated docs-only PR** per `AGENTS.md`'s Documentation Guardrails row for `content/docs/releases/` (factual error on a releases page → dedicated docs-only PR, never a rider). Opened by the director seat executing decision batch objectstack-ai#155 item 1 (maintainer 「同意」 to B on objectstack-ai#18854); the dispatched dev correctly declined this site under `os-dev.md:67`, whose alignment is its own card. - Diff: one file, one bullet (+8/−2). No source, no schema, no export, no test. - `Clause-②: no` — no contract surface. No changeset (docs-only; `skip-changeset` label applied). - Claim record on the card: objectstack#18854 comment 5725535123 (`Branch:` this branch, `Clause-②: no` — both carriers agree; `check-clause2-carriers --pair 18907` exit 0 locally). 🤖 Generated with [Claude Code](https://claude.com/claude-code) https://claude.ai/code/session_01Wj1HUjzyeiBQ8atRf1ZhaL --- _Generated by [Claude Code](https://claude.ai/code)_ Co-authored-by: hotlong <hotlong@users.noreply.github.com> Co-authored-by: Claude <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of #18740
A dedicated docs-only PR, which
AGENTS.md's Documentation Guardrails row forpackages/*/CHANGELOG.mdrequires: a factual error in a released entry is amended in that entry, ⛔ never as an erratum in a later entry and ⛔ never as a rider on code changes — "the reader greps the tombstoned symbol and lands on the old entry, so a correction anywhere else is one it never reaches".The diff is exactly two files. No source, no schema, no export, no test, and no changeset (see below).
What was false
The 2026-09-07 ruling found that no reader of a published surface can configure
batch.maxBatchSize. The cap is embedder policy:RestServerConfig.batch.maxBatchSizeis the argument a host passes when it constructs the server, through the one doorcreateRestApiPlugin({ api }). Neither shipped boot path passes it —os serveforwards exactly two keys out of the stack config'sapi:block (api.enableProjectScoping,api.projectResolution), and the dev plugin callscreateRestApiPlugin()with no config at all. A CLI-started deployment therefore always gets the 200 default, and no flag, config file or CLI option moves it.The
789ad63entry carries that falsified claim in two wordings, and it is duplicated under two published version headings, so there are eight carriers, not four.The eight sites corrected
Located by content, across lines on this tree at
631dcbd4b— ⛔ not by the line numbers carried on the card, and ⛔ not with a single-line match. TheBatch size is / deployment policysentence is wrapped across two lines: a single-line grep for it returns 0 and reads as a false absence.packages/rest/CHANGELOG.md## 17.0.0(L4733)should raiseinstruction +deployment policypackages/rest/CHANGELOG.md## 17.0.0-rc.1(L14992)packages/spec/CHANGELOG.md## 17.0.0(L15658)packages/spec/CHANGELOG.md## 17.0.0-rc.1(L67924)Per copy:
Batch size is deployment policynow readsBatch size is embedder policy, and the counterfactual beside it —(a deployment raising the limit to 500 would still have been refused at 200)— now saysa host, since it presupposed the same unreachable knob.Deployments that were quietly relying on unbounded batches should raisebatch.maxBatchSize(up to 1000) rather than discover the cap in production. That told an operator to perform an action no shipped boot path can perform, so a reader who complied had no way to tell whether they had succeeded. It now states where the cap actually comes from and issues no instruction.Where this landed between "faithful to the record" and "no longer misleading"
This is a CHANGELOG, so the job is to record what happened in that version — ⛔ not to rewrite history into "this is what we said at the time". I did not invent a shape for that: this repository has already settled it, in #18569 / #17849, and I copied it. The published words are corrected in place, and the old words are kept as a marked quotation in a dated erratum line closing the entry — the in-repo tail already used at
packages/spec/CHANGELOG.md(three sites),packages/lint/CHANGELOG.mdandpackages/metadata-protocol/CHANGELOG.md. So the entry no longer instructs, and what shipped is still readable verbatim.The factual vocabulary is likewise copied, ⛔ not invented — from
ec5db7b(packages/rest/CHANGELOG.md:351) and the pending.changeset/18739-batch-cap-embedder-only.md, which are the fourth and fifth landings of this same correction.⛔ No new entry at the top, ⛔ no version heading added, ⛔ nothing this release published is changed: the 1..1000 range, the 200 default and the enforcement are all untouched.
⛔ Deliberately no changeset
A changeset would compile this correction into a new release note — which is precisely the erratum-in-a-later-entry shape
AGENTS.mdforbids. Nothing published moves here either: the diff is prose inside already-shipped entries.content/docs/releases/v17/17-0.mdx:1734carries the same claim (stay underbatch.maxBatchSize(default 200, raisable to 1000) or chunk) and the dispatch listed it as the ninth site.I did not touch it. My standing operating rules carry an unconditional prohibition on editing
content/docs/releases/, and they state that such a clause wins over the dispatch word.AGENTS.mdpermits a docs-only PR there; it does not require one — a permission does not override the prohibition, so there is no conflict withAGENTS.md, only with the dispatch. Flagging rather than choosing a side: that line is still a live carrier and needs either a separate actor or an explicit release of the prohibition.packages/spec/CHANGELOG.md:3581says the phrase "exists verbatim in the REST server ... atpackages/rest/src/rest-server.ts:2071... it is owed to a follow-up inpackages/rest". Re-measured on631dcbd4b:grep -c "deployment policy" packages/rest/src/rest-server.ts= 0, andpackages/rest/CHANGELOG.md:351recordsec5db7bretiring exactly that phrase. That follow-up is done and the note is now stale — a debt recorded as outstanding that has been paid. It is a different error from the one this card names, so it is reported, ⛔ not ridden.#18740does not cover it.Firing controls
Computed from
git diff -U0hunk headers so that context lines cannot contaminate the reading, and taken from the probed files themselves.should raise+batch.maxBatchSize: 0 outside the diff. Its only four hits are the verbatim quotations inside the new erratum lines.deployment policyclaim, multiline-aware: 4 hits outside the diff, each classified and none a live carrier —packages/rest/CHANGELOG.md:351(records the phrase's retirement),packages/spec/CHANGELOG.md:3581(the stale note above),.changeset/18739-batch-cap-embedder-only.md(the sibling correction),docs/qa/platform-checklist/FOLLOW-UPS.md:575(states the correct embedder-only fact).Batch size is/deployment policysentence: 0 hits anywhere in the tree.grep -naPover both changed files exits 1 (no match).A bare
deployment policystring is ⛔ not a usable control — it matches unrelated scheduling prose in about 30 files.Generated by Claude Code
Generated by Claude Code