Repository navigation
docs(changelog): amend the 18.0.0-next.0 entries of lint, service-automation and spec whose sentences the CRUD-filter-operand stage had made false - #23336
Merged
objectstack-fleet[bot] merged 5 commits intoOct 13, 2026
Conversation
… operand stage had made false The 18.0.0-next.0 cut compiled pending changesets whose sentences the CRUD-filter-operand stage (615c696, an ancestor of the cut d889448) had already made false: the single-brace dialect "keeps resolving where it still lives, a CRUD `filter` value", the run-user `$User.Email` row's `filter: { id: '{uid}' }`, and the retired `flow-filter-token-unknown` listed among the live rule ids of the slice 10 and slice 14 bullets. Each sentence is replaced in place with the corrected changeset's text under .changeset/pre/ (7958bdf). Sentences that commit made false only for the later release (the run-user lint hint) stay: they were true of 18.0.0-next.0. No other version's entry is touched. Claude-Session: https://claude.ai/code/session_01BRQ9Mp1yH7R1az6MaUM18H Co-authored-by: Claude <noreply@anthropic.com>
…he CRUD filter operand stage had made false The 18.0.0-next.0 cut compiled pending changesets whose sentences the CRUD-filter-operand stage (615c696, an ancestor of the cut d889448) had already made false: the single-brace dialect "keeps resolving where it still lives, a CRUD `filter` value" and its variants, and the run-user `$User.Email` row's `filter: { id: '{uid}' }` together with the sentence in the CRUD-filter bullet that superseded it. Each sentence is replaced in place with the corrected changeset's text under .changeset/pre/ (7958bdf). Sentences that commit made false only for the later release (the run-user lint hint) stay: they were true of 18.0.0-next.0. No other version's entry is touched. Claude-Session: https://claude.ai/code/session_01BRQ9Mp1yH7R1az6MaUM18H Co-authored-by: Claude <noreply@anthropic.com>
… operand stage had made false The 18.0.0-next.0 cut compiled pending changesets whose sentences the CRUD-filter-operand stage (615c696, an ancestor of the cut d889448) had already made false: the single-brace dialect "keeps resolving where it still lives, a CRUD `filter` value" and its variants, the run-user `$User.Email` row's `filter: { id: '{uid}' }` together with the sentence in the CRUD-filter bullet that superseded it, and the two dollar-binding bullets' "a single-brace token in a value position". Each sentence is replaced in place with the corrected changeset's text under .changeset/pre/ (7958bdf). Sentences that commit made false only for the later release (the run-user lint hint) stay: they were true of 18.0.0-next.0. No other version's entry is touched. Claude-Session: https://claude.ai/code/session_01BRQ9Mp1yH7R1az6MaUM18H Co-authored-by: Claude <noreply@anthropic.com>
Contributor
📓 Docs Drift Check
What this run could not see
Coarse fallback — 149 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
This was referenced Oct 13, 2026
…operand stage had made false The run-user value-slot bullet of the 18.0.0-next.0 entry carries two sentences the CRUD-filter-operand stage (615c696, an ancestor of the cut d889448) had already made false: "`{$User.*}` keeps resolving where the single-brace dialect still lives, a CRUD `filter` value", and the `$User.Email` row's `filter: { id: '{uid}' }`. Both are replaced in place with the corrected changeset's text under .changeset/pre/ (7958bdf). The bullet's lint-hint sentence, which that commit made false only for the later release, stays: it was true of 18.0.0-next.0. No other version's entry is touched. Claude-Session: https://claude.ai/code/session_01BRQ9Mp1yH7R1az6MaUM18H Co-authored-by: Claude <noreply@anthropic.com>
…er operand stage had made false The text-slot double-brace bullet of the 18.0.0-next.0 entry says "a CRUD `filter` value keeps the single-brace dialect", which the CRUD-filter-operand stage (615c696, an ancestor of the cut d889448) had already made false. The sentence is replaced in place with the corrected changeset's text under .changeset/pre/ (7958bdf): "Unchanged: the value slots are CEL's." No other version's entry is touched. Claude-Session: https://claude.ai/code/session_01BRQ9Mp1yH7R1az6MaUM18H Co-authored-by: Claude <noreply@anthropic.com>
objectstack-fleet
Bot
deleted the
claude/issue-23261-next0-changelog-amend
branch
October 13, 2026 22:22
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.
Fixes #23261
Clause-②: no
This PR amends release-owned text only. It changes the
18.0.0-next.0entries of five CHANGELOGs:packages/lint,packages/services/service-automation,packages/spec,packages/cliandpackages/formula. In each entry it replaces the sentences that the CRUD-filter-operand stage (S6,615c696046) had already made false when the entry was published. The new text is the corrected changeset text that PR #23252 records under.changeset/pre/. The PR has no code, no changeset and no entry of any other version.Written by the
domain:specseat 2 dispatch, sessionsession_01BRQ9Mp1yH7R1az6MaUM18H. Round 1 (da548251c) amended lint, service-automation and spec. The patch round (baa9e0be0) adds cli and formula, after the seat re-scoped the claim's file surface in review comment6155243339on the card.Route: amend in place
AGENTS.md, Documentation Guardrails, the
packages/*/CHANGELOG.mdrow: "Factual error in a released entry → amend that entry in a dedicated docs-only PR, ⛔ never an erratum in a later entry and never 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; what shipped stays recorded in the published tarballs and in git history."Each false sentence is replaced inside the bullet that published it, with the wording of the corrected changeset. So the
18.0.0-next.0bullet and the GA18.0.0bullet (compiled from the same corrected changeset) say the same thing about S6. This PR adds no dated erratum line. PR #22296 took that shape, and its triage asked for it. This card asks for the corrected changeset's text, and an erratum line would make the two entries differ. The shipped wording is still recorded in four places: the npm tarballs, the GitHub Releases, git history, and the BEFORE column below.Which sentences, measured
18.0.0-next.0.git merge-base --is-ancestor 615c696046 d889448b9exits 0.d889448b9is the Version Packages merge that cut18.0.0-next.0. At the cut,packages/lint/srchas noflow-filter-token-unknownrule: the only hits are two comments that call it retired. At615c696046^the rule's files exist (validate-flow-filter-tokens.tsand its test).7958bdf36d) is not in it.git merge-base --is-ancestor 7958bdf36d d889448b9exits 1. The control leg,615c696046on the same checkout and target, exits 0. Read from the content too: at the cut,service-automation'sbuiltin/template.tsstill exports the single-brace resolver (interpolate,interpolateString). At this base it exports none of them.npm packof@objectstack/lint,service-automation,spec,cliandformulaat18.0.0-next.0gives apackage/CHANGELOG.mdbyte-identical to this PR's basecc14657ed(cmpexit 0, all five).nextis18.0.0-next.0, the onlynextpublished.git diff --quiet d889448b9 7958bdf36d^over the 15 files exits 0. So the cut compiled exactly the BEFORE text of PR feat(service-automation,lint,spec,verify)!: the single-brace resolver and the legacy condition path are deleted — every condition is CEL, a value-slot literal is handed on as written (#19939 pass 4, S7) #23252's table.PR #23252 corrected each of its 15 files for one of three reasons. This PR takes only the first:
18.0.0-next.0was published. Amended here.18.0.0-next.0, whose code still had the resolver, so it stays: row 11's lint-hint sentence (:44) and row 13 (22301, which compiles only intopackages/verify/CHANGELOG.md).19939-flow-crud-filter-operands.md:27). The next.0 bullet says the rule and its exports "are removed", which is true. The added migration map completes the bullet but corrects no false sentence, so it is not in this card's surface. It stays.What changed
The tool: each bullet is located by its full compiled BEFORE text. That is the changeset at the cut, with the commit hash prefixed and every later line indented two spaces, as
@changesets/cli/changelogwrites it. Each of the 34 bullets matched exactly once, in each CHANGELOG its changeset's frontmatter names, and in no other CHANGELOG. Then only the selected hunks of PR #23252's diff were applied. After the edit, 27 bullets are byte-identical to the compiled corrected changeset. The other 7 (615c696in three CHANGELOGs,6a06e3bin four) are identical to it except for the hunks left out above (reasons 2 and 3).Line numbers are at base
cc14657ed. Version:18.0.0-next.0in every row. "Row" is PR #23252's table row..changeset/pre/) → bullet19939-flow-value-slot-template-dialect-refused.md→0e9e7b7filtervalue keeps the template dialect; a text slot (…) reads{{ }}holes …" → "A text slot (…) reads{{ }}holes …"22161-lint-slice-10-one-line.md→d8c7d38flow-filter-token-unknown; added: "A tenth id this change shortened,flow-filter-token-unknown, is retired in this same release with its rule: …"; theos explainbullet: "10" → "9" (×3), and "the two vocabularies a flow filter token resolves in, and why a miss stops the node;" removed; "all 11 ids" → 10, and theos verifylist and the runtime-gate sentence drop the id22161-lint-slice-14-one-line-fix.md→63d5db2flow-filter-token-unknown, is retired …"; "the two vocabularies a flow filter token resolves in;" removed; "10 of the 17 fire" → "9 of the 16"; the "aflowwrite" item removed19939-flow-crud-filter-operands.md→615c696filter: { id: '{uid}' }for a$User.Emailread; this one supersedes that line: read the user record withfilter: { id: { dialect: 'cel', source: 'current_user.id' } }." → (removed: row 11 now states that remedy itself)19939-flow-callee-input-value-slots.md→f66fdc7filtervalue." → (removed)19939-flow-collection-value-slots.md→9fdb12719939-flow-http-slots.md→968acc819939-flow-notify-value-slots.md→111ffff19939-flow-screen-value-slots.md→12b9daf19939-flow-value-slot-date-macros-refused.md→d85615dfiltervalue." → (removed)19939-flow-value-slot-run-user-refused.md→6a06e3b{$User.*}keeps resolving where the single-brace dialect still lives, a CRUDfiltervalue." → (removed); the$User.Emailrow: "anassignmentofuid: { dialect: 'cel', source: 'current_user.id' }, aget_recordonsys_userwithfilter: { id: '{uid}' }" → "aget_recordonsys_userwithfilter: { id: { dialect: 'cel', source: 'current_user.id' } }"22110-flow-text-slot-double-brace.md→2b61f2dfiltervalue keeps the single-brace dialect, and the value slots are CEL's." → "Unchanged: the value slots are CEL's."22502-flow-binding-variable-dollar-name-refused.md→3e72f9322572-flow-binding-name-dollar-refused.md→9f5eca5The cli and formula cells are the patch round. These two changesets also name
@objectstack/cli(row 11) and@objectstack/formula(row 12) in their frontmatter, so their bullets compiled into those CHANGELOGs too. In cli the same6a06e3blint-hint sentence (:489, reason 2) stays.Size: 5 files, +50 / −48 (lint +23 / −21, service-automation +11 / −11, spec +13 / −13, cli +2 / −2, formula +1 / −1). One commit per CHANGELOG.
Re-check of triage's counts (
6147677135), on this PR's head:git grep -c "flow-filter-token-unknown"gives lint 6, service-automation 3, spec 3. At filing it was 8, 3 and 3. Lint loses the four live-id mentions of rows 2 and 3 and gains the two retirement sentences those rows add. Every remaining hit says the rule retires, or sits in the 17.4.0 entry that introduced it (:5664at base), which was true when it shipped.git grep -c "keeps resolving where","keeps the single-brace dialect","keeps the template dialect"and"a single-brace token in a value position"give 0 in all five files. The controlgit grep -c "## 18.0.0-next.0"gives 1 in each.filter: { id: '{uid}' }stays in each of lint, service-automation and spec, in615c696's "Who is affected" line. It describes a remedy text that S6 itself migrated, so it is history.Nothing outside the
18.0.0-next.0sections moved. In each of the five files, the text from the## 17.7.0heading to the end of the file has the same sha256 at base and at head. The header lines are unchanged. Every hunk ends before the## 17.7.0heading.Not changed, on purpose
:44lint-hint sentence ("…and every other position keeps the single brace."), lint:1018, service-automation:347, spec:384, cli:489: true of18.0.0-next.0. S7 changed that hint.:27FROM → TO addition: completes the bullet, corrects no false sentence (see above).22301): S7, and it compiles only intopackages/verify/CHANGELOG.md, outside this card.flow-filter-token-unknownintroduction.No ripple
Several tools read these files mechanically:
check-release-notes,check-release-page-status,check-release-section-coverage,sync-release-index-currency,check-docs-image-tag,check-future-spec-majorandrelease-github-releases. They all read version headings or a whole section. None pins a bullet line. No version heading or bullet hash changes here. No docs page is generated from these files.Changeset: none, labelled
skip-changesetCHANGELOG.mdis in thefiles[]of all five packages, so the next tarball of each ships the amended entry.changeset versionprepends new entries and keeps this one. A changeset would compile the correction into a new entry under a later version, which is the "erratum in a later entry" the guardrail rules out. It follows PR #22296.Verification (head
baa9e0be0)Derived gates.
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, with no paths, onbaa9e0be0, derives 59 commands. They are byte-identical to round 1's list onda548251c. First,pnpm --workspace-concurrency=2 --filter '@objectstack/lint...' buildran under the verify lock (VERDICT command-exit 0, held 3m04s), which left the working tree clean. Each command then ran once, with its exit code captured before any pipe.check:nul-bytes(11284 text files, no raw ASCII control bytes),check:release-notes,check:release-page-status,check-release-section-coverage(plain,--strictand--self-test),check:published-files,check:issue-citations,check:doc-authoring,docs-audit/check-affected-docs,check-adr-0087-registration --base origin/mainandcheck:docs-transcript-drift("4 declared transcript value(s) across 414 page(s) under content/docs/ equal what the registry derives today").check:dts-closure("4 built package(s) swept - 46/46 declared declaration file(s) present") andcheck:sourcemap-no-sources-content("4 built package(s) swept - 58 map(s), none embed source text"). Each is exit 0 over that population, not the workspace. This partial sweep is declared, as is the narrowing below.check:dual-build-cjs-loadsandcheck:lean-entry-closure. Both need a full workspace build. This narrowing is declared: the diff changes no source byte, and a build compilessrc/and never readsCHANGELOG.md. CI'sLint & Repo Gatesruns them after its own build.--ranreports: "✓ dispatch-gates --ran: 59 derived famil(ies) accounted for — 57 run, 2 NOT-MEASURED (2 DERIVED from a recorded exit 3)."Tests and typecheck: none owed. No TypeScript is touched. No test reads these CHANGELOG lines: the tests that walk the tree skip
CHANGELOG.mdby name, and no test or gate pins a bullet of these entries.ESLint, a measured narrowing:
eslint --no-inline-config --format jsonover the 5 changed files reports 5 files, each with 0 errors and the single warning "File ignored because no matching configuration was supplied".eslint.config.mjsenables no type-aware linting (noparserOptions.project), so the diff cannot move the verdict on an untouched file.Control bytes:
grep -naPfor raw control bytes over the 5 files matches nothing (exit 1; a control file with one control byte answers exit 0).Acceptance notes
@objectstack/lint,service-automation,spec,cliandformulaat18.0.0-next.0were compiled from these sections when the version was published. Each still carries S6-false sentences: service-automation and spec have 7 "keeps resolving where" lines each and cli has 1; lint and formula have the "keeps the single-brace dialect" line. Lint's body is cut at the API limit before its later bullets. Editing a Release is the maintainer's act, so it is not done here. Like the tarballs, those bodies record what shipped.spec-changes.json#23338, not edited: code). Two ADR-0087 D3 entries still prescribe "Rename every read of the old name with it — a text-slot hole, a CEL expression, a single-brace token in a value position":packages/spec/src/migrations/entries/semantic/18.flow-binding-name-dollar-refused.ts:35and18.flow-binding-variable-dollar-name-refused.ts:28, both inreplacement. Their changesets (rows 14 and 15) were corrected. The published@objectstack/spec@18.0.0-next.0ships this text indist/migrations/index.js,dist/migrations/index.mjsandspec-changes.json(grep of the unpacked tarball).packages/lint/src/validate-expressions.text-slot.test.ts:23says "Every other notify / screen string keeps the single-brace dialect". A test comment, not shipped. Carrier: the next PR that edits that file.