Skip to content

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 into
mainfrom
claude/issue-18740-changelog-batch-cap-claim
Sep 18, 2026
Merged

os-try-charles merged 1 commit into
mainfrom
claude/issue-18740-changelog-batch-cap-claim

Conversation

@os-try-charles

@os-try-charles os-try-charles commented Sep 18, 2026 •

Copy link
Copy Markdown
Collaborator

Part of #18740

⚠️ Changed from Fixes to Part of by the dispatching domain:devx seat. Eight of the card's nine sites are corrected here. The ninth — content/docs/releases/v17/17-0.mdx:1734 — is still a live carrier, and the delivering agent correctly declined it: its standing operating rules prohibit editing content/docs/releases/** unconditionally, and a permission in AGENTS.md does not lift a prohibition. A closing keyword here would silently close a card that still has an open half, so it is withdrawn. The ninth site is routed as its own card; this PR stays a clean two-file CHANGELOG amendment.

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 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.maxBatchSize is the argument a host passes when it constructs the server, through the one door createRestApiPlugin({ api }). Neither shipped boot path passes it — os serve forwards exactly two keys out of the stack config's api: block (api.enableProjectScoping, api.projectResolution), and the dev plugin calls createRestApiPlugin() 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 789ad63 entry 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. The Batch size is / deployment policy sentence is wrapped across two lines: a single-line grep for it returns 0 and reads as a false absence.

file heading wording
packages/rest/CHANGELOG.md ## 17.0.0 (L4733) should raise instruction + deployment policy
packages/rest/CHANGELOG.md ## 17.0.0-rc.1 (L14992) both
packages/spec/CHANGELOG.md ## 17.0.0 (L15658) both
packages/spec/CHANGELOG.md ## 17.0.0-rc.1 (L67924) both

Per copy:

  • The claim. Batch size is deployment policy now reads Batch size is embedder policy, and the counterfactual beside it — (a deployment raising the limit to 500 would still have been refused at 200) — now says a host, since it presupposed the same unreachable knob.
  • The instruction. The behaviour bullet read Deployments that were quietly relying on unbounded batches should raise batch.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.md and packages/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.md forbids. Nothing published moves here either: the diff is prose inside already-shipped entries.

⚠️ The ninth site is NOT in this PR — a standing-rule conflict I am not resolving silently

content/docs/releases/v17/17-0.mdx:1734 carries the same claim (stay under batch.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.md permits a docs-only PR there; it does not require one — a permission does not override the prohibition, so there is no conflict with AGENTS.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.

⚠️ Report item, ⛔ not fixed here

packages/spec/CHANGELOG.md:3581 says the phrase "exists verbatim in the REST server ... at packages/rest/src/rest-server.ts:2071 ... it is owed to a follow-up in packages/rest". Re-measured on 631dcbd4b: grep -c "deployment policy" packages/rest/src/rest-server.ts = 0, and packages/rest/CHANGELOG.md:351 records ec5db7b retiring 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. #18740 does not cover it.

Firing controls

Computed from git diff -U0 hunk headers so that context lines cannot contaminate the reading, and taken from the probed files themselves.

  • C1 — should raise + batch.maxBatchSize: 0 outside the diff. Its only four hits are the verbatim quotations inside the new erratum lines.
  • C2 — the batch-cap deployment policy claim, 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).
  • C3 — the wrapped Batch size is / deployment policy sentence: 0 hits anywhere in the tree.
  • Control bytes: grep -naP over both changed files exits 1 (no match).

A bare deployment policy string is ⛔ not a usable control — it matches unrelated scheduling prose in about 30 files.


Generated by Claude Code


Generated by Claude Code

…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>
@os-try-charles os-try-charles added documentation Improvements or additions to documentation skip-changeset PR has no user-facing published change; bypasses the changeset gate labels Sep 18, 2026 — with Claude
@github-actions

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️ 2 changed file(s) yielded no anchor (packages/rest/CHANGELOG.md, packages/spec/CHANGELOG.md), so the pages documenting them are NOT COVERED by this run — this is not a clean bill of health for those files. Nothing else in this diff resolved to a documentable surface (no symbol, route or SDK anchor derived from 2 changed package(s)).

What this run could not see
  • 2 changed file(s) yielded no anchor (packages/rest/CHANGELOG.md, packages/spec/CHANGELOG.md) — pages documenting those are invisible to this run
  • a page that states a rule by its inputs shares no identifier with the emitter that implements the rule, so an emitter-only diff cannot list it — not on this run and not on any run. Measured on fix(driver-sql): emit varchar(maxLength) for a text field a declared index keys on #11430: content/docs/protocol/objectql/types.mdx documents the text-family column mapping by the ObjectQL type names it maps FROM (text / textarea / html) while the diff changed createColumn; it went unlisted, and it was the page that diff falsified, in four places. No shared token exists to detect this on, so a rule your change carries has to be re-read by hand in the pages that restate it.

Coarse fallback — 138 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): node scripts/docs-audit/affected-docs.mjs --json 631dcbd4b93c3f86d02080bc129a611f0619ed23 → packageMentionDocs.

@os-try-charles
os-try-charles marked this pull request as ready for review September 18, 2026 01:11
@os-try-charles
os-try-charles added this pull request to the merge queue Sep 18, 2026
Merged via the queue into main with commit 18cc3b1 Sep 18, 2026
52 checks passed
@os-try-charles
os-try-charles deleted the claude/issue-18740-changelog-batch-cap-claim branch September 18, 2026 01:48
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>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

documentation Improvements or additions to documentation size/s skip-changeset PR has no user-facing published change; bypasses the changeset gate

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants