Skip to content

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 into
mainfrom
claude/issue-23261-next0-changelog-amend
Oct 13, 2026
Merged

objectstack-fleet[bot] merged 5 commits into
mainfrom
claude/issue-23261-next0-changelog-amend

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #23261
Clause-②: no

This PR amends release-owned text only. It changes the 18.0.0-next.0 entries of five CHANGELOGs: packages/lint, packages/services/service-automation, packages/spec, packages/cli and packages/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:spec seat 2 dispatch, session session_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 comment 6155243339 on the card.

Route: amend in place

AGENTS.md, Documentation Guardrails, the packages/*/CHANGELOG.md row: "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.0 bullet and the GA 18.0.0 bullet (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

PR #23252 corrected each of its 15 files for one of three reasons. This PR takes only the first:

  1. A sentence S6 made false. False when 18.0.0-next.0 was published. Amended here.
  2. A sentence S7 made false. True of 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 into packages/verify/CHANGELOG.md).
  3. An addition that corrects nothing false. Row 4's FROM → TO for the retired rule's id and exports (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/changelog writes 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 (615c696 in three CHANGELOGs, 6a06e3b in 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.0 in every row. "Row" is PR #23252's table row.

Row changeset (under .changeset/pre/) → bullet lint service-automation spec cli formula BEFORE → AFTER
1 19939-flow-value-slot-template-dialect-refused.md → 0e9e7b7 105 363 400 — — "A filter value keeps the template dialect; a text slot (…) reads {{ }} holes …" → "A text slot (…) reads {{ }} holes …"
2 22161-lint-slice-10-one-line.md → d8c7d38 1077, 1081–1082, after 1089, 1092–1093 — — — — title drops "flow-filter-token,"; "these 10 rule ids" → 9; the flows id list drops flow-filter-token-unknown; added: "A tenth id this change shortened, flow-filter-token-unknown, is retired in this same release with its rule: …"; the os explain bullet: "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 the os verify list and the runtime-gate sentence drop the id
3 22161-lint-slice-14-one-line-fix.md → 63d5db2 1173, 1177, 1181, 1187, 1190, 1192–1193 — — — — "17 more" / "these 17 rule ids" → 16; the "flow filters" item removed; added: "A seventeenth id this change shortened, flow-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 "a flow write" item removed
4 (part) 19939-flow-crud-filter-operands.md → 615c696 80 117 154 — — "The value-slot retirement's run-user changeset on this line names filter: { id: '{uid}' } for a $User.Email read; this one supersedes that line: read the user record with filter: { id: { dialect: 'cel', source: 'current_user.id' } }." → (removed: row 11 now states that remedy itself)
5 19939-flow-callee-input-value-slots.md → f66fdc7 — 33 70 — — "The single-brace dialect keeps resolving where it still lives, a CRUD filter value." → (removed)
6 19939-flow-collection-value-slots.md → 9fdb127 833 72 109 — — same sentence → (removed)
7 19939-flow-http-slots.md → 968acc8 879 165 202 — — same sentence → (removed)
8 19939-flow-notify-value-slots.md → 111ffff 925 211 248 — — same sentence → (removed)
9 19939-flow-screen-value-slots.md → 12b9daf — 255 292 — — same sentence → (removed)
10 19939-flow-value-slot-date-macros-refused.md → d85615d 974 303 340 — — "The single-brace dialect, date macros included, keeps resolving where it still lives, a CRUD filter value." → (removed)
11 (part) 19939-flow-value-slot-run-user-refused.md → 6a06e3b 996, 1004 325, 333 362, 370 467, 475 — "{$User.*} keeps resolving where the single-brace dialect still lives, a CRUD filter value." → (removed); the $User.Email row: "an assignment of uid: { dialect: 'cel', source: 'current_user.id' }, a get_record on sys_user with filter: { id: '{uid}' }" → "a get_record on sys_user with filter: { id: { dialect: 'cel', source: 'current_user.id' } }"
12 22110-flow-text-slot-double-brace.md → 2b61f2d 143 401 448 — 23 "Unchanged: a CRUD filter value keeps the single-brace dialect, and the value slots are CEL's." → "Unchanged: the value slots are CEL's."
14 22502-flow-binding-variable-dollar-name-refused.md → 3e72f93 — — 627 — — "(a text-slot hole, a CEL expression, a single-brace token in a value position)" → "(a text-slot hole, a CEL expression)"
15 22572-flow-binding-name-dollar-refused.md → 9f5eca5 — — 720 — — same → same

The 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 same 6a06e3b lint-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 (:5664 at 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 control git grep -c "## 18.0.0-next.0" gives 1 in each.
  • One filter: { id: '{uid}' } stays in each of lint, service-automation and spec, in 615c696'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.0 sections moved. In each of the five files, the text from the ## 17.7.0 heading 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.0 heading.

Not changed, on purpose

  • Row 11's :44 lint-hint sentence ("…and every other position keeps the single brace."), lint :1018, service-automation :347, spec :384, cli :489: true of 18.0.0-next.0. S7 changed that hint.
  • Row 4's :27 FROM → TO addition: completes the bullet, corrects no false sentence (see above).
  • Row 13 (22301): S7, and it compiles only into packages/verify/CHANGELOG.md, outside this card.
  • Every other version's entry, including lint 17.4.0's flow-filter-token-unknown introduction.

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-major and release-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-changeset

CHANGELOG.md is in the files[] of all five packages, so the next tarball of each ships the amended entry. changeset version prepends 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, on baa9e0be0, derives 59 commands. They are byte-identical to round 1's list on da548251c. First, pnpm --workspace-concurrency=2 --filter '@objectstack/lint...' build ran 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.

    • 57 exit 0. Among them: check:nul-bytes (11284 text files, no raw ASCII control bytes), check:release-notes, check:release-page-status, check-release-section-coverage (plain, --strict and --self-test), check:published-files, check:issue-citations, check:doc-authoring, docs-audit/check-affected-docs, check-adr-0087-registration --base origin/main and check:docs-transcript-drift ("4 declared transcript value(s) across 414 page(s) under content/docs/ equal what the registry derives today").
    • Two of those 57 swept only the 4 built packages of the lint closure: check:dts-closure ("4 built package(s) swept - 46/46 declared declaration file(s) present") and check: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.
    • 2 NOT MEASURED, each exit 3 (PREREQUISITE NOT MET): check:dual-build-cjs-loads and check:lean-entry-closure. Both need a full workspace build. This narrowing is declared: the diff changes no source byte, and a build compiles src/ and never reads CHANGELOG.md. CI's Lint & Repo Gates runs them after its own build.
    • --ran reports: "✓ 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.md by name, and no test or gate pins a bullet of these entries.

  • ESLint, a measured narrowing: eslint --no-inline-config --format json over 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.mjs enables no type-aware linting (no parserOptions.project), so the diff cannot move the verdict on an untouched file.

  • Control bytes: grep -naP for raw control bytes over the 5 files matches nothing (exit 1; a control file with one control byte answers exit 0).

Acceptance notes

  • The GitHub Releases still carry the old text. The bodies of @objectstack/lint, service-automation, spec, cli and formula at 18.0.0-next.0 were 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.
  • The same claim, in spec source (filed by the seat as spec(migrations): two step-18 D3 entries still tell authors to rename "a single-brace token in a value position" — no value position reads one since #19939 S6, and the text ships in the upgrade guide and 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:35 and 18.flow-binding-variable-dollar-name-refused.ts:28, both in replacement. Their changesets (rows 14 and 15) were corrected. The published @objectstack/spec@18.0.0-next.0 ships this text in dist/migrations/index.js, dist/migrations/index.mjs and spec-changes.json (grep of the unpacked tarball).
  • Noted, not filed: the header of packages/lint/src/validate-expressions.text-slot.test.ts:23 says "Every other notify / screen string keeps the single-brace dialect". A test comment, not shipped. Carrier: the next PR that edits that file.

… 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>
@objectstack-fleet objectstack-fleet Bot added the skip-changeset PR has no user-facing published change; bypasses the changeset gate label Oct 13, 2026
@github-actions github-actions Bot added the documentation Improvements or additions to documentation label Oct 13, 2026
@github-actions

github-actions Bot commented Oct 13, 2026 •

Copy link
Copy Markdown
Contributor

📓 Docs Drift Check

⚠️ 5 changed file(s) yielded no anchor (packages/cli/CHANGELOG.md, packages/formula/CHANGELOG.md, packages/lint/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 5 changed package(s)).

What this run could not see
  • 5 changed file(s) yielded no anchor (packages/cli/CHANGELOG.md, packages/formula/CHANGELOG.md, packages/lint/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.
  • a key NAME is not a key, so the hand re-read the line above prescribes can land on the wrong schema. The same spelling is authorable on one governed type and a [REMOVED] tombstone on another for each of active, aria, joins, objects, template, tools and version (censused on [finding] tools is a key on BOTH AgentSchema (tombstoned, dead) and SkillSchema (live, cloud-attested), so a name-based search attributes skill examples to the agent key — it produced a false stop-the-line alarm on PR #19059 #19093 over the liveness ledger's governed types, top-level keys); nothing in a search result distinguishes the two, so a grep hit on a LIVE example reads as evidence about the DEAD key. Measured on fix(spec): the agent.tools liveness row says dead — it claimed live on a key the schema tombstoned #19059: content/docs/ai/agents.mdx was reported as contradicting the agent.tools tombstone over its tools: example at :161, which is inside the defineSkill({ block opened at :155 — the page was already correct. Settle ownership by PARSING the value against both schemas, never by the name: that literal PASSES SkillSchema, and as an AgentSchema it FAILS at tools with the tombstone prescription. ⛔ These names are not the whole class — a key retired through a .strict() guidance map leaves no tombstone in the walked shape and none of them here (tool.category, live as AIToolDefinition.category).

Coarse fallback — 149 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 14a13bce06418b634b5e092c1cd107e2717d8b17 → packageMentionDocs.

…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
objectstack-fleet Bot marked this pull request as ready for review October 13, 2026 21:49
@objectstack-fleet
objectstack-fleet Bot enabled auto-merge October 13, 2026 21:49
@objectstack-fleet
objectstack-fleet Bot added this pull request to the merge queue Oct 13, 2026
Merged via the queue into main with commit 828fe1d Oct 13, 2026
49 checks passed
@objectstack-fleet
objectstack-fleet Bot deleted the claude/issue-23261-next0-changelog-amend branch October 13, 2026 22:22
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

2 participants