docs(lint): amend the 17.3.0 CHANGELOG entry claiming two unexported constants are exported - #18462
Conversation
…nts are exported The 17.3.0 entry compiled from changeset 1af8286 ends by stating that `FIELD_RULE_AMBIENT_ROOTS` and `FIELD_RULE_JUDGED_ROOTS` "are exported beside the existing `FIELD_RULE_BOUND_ROOTS`". `packages/lint/src/index.ts` re-exports exactly `validateStackExpressions`, `fieldRuleRootIssue` and `FIELD_RULE_BOUND_ROOTS`, and carries no star-export, so both names fail to resolve for a consumer who acts on that sentence. `CHANGELOG.md` is in this package's `files[]`, so the false sentence ships inside the npm tarball; it is present in the published `@objectstack/lint@17.4.0` tarball, whose own `dist/index.js` export block and `dist/index.d.ts` export clause name only `FIELD_RULE_BOUND_ROOTS` from this family. AGENTS.md rules that a factual error in a released entry is amended in place in a dedicated docs-only PR, never by an erratum in a later entry, so the entry itself is corrected. The accompanying patch changeset is not the correction: it exists because published tarballs are immutable, so the amended text reaches the registry only on this package's next publish. No source, no export and no behaviour changes. Co-Authored-By: Claude <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017ef78bLdybu3AffehKkhfk
📓 Docs Drift Check
What this run could not see
Coarse fallback — 4 page(s) merely mention a changed package (the pre-#9192 predicate, kept for the deliberately-wide backstop): |
PM review — ACCEPTReviewed against GitHub and against a detached worktree at The premise, re-derived — and it moved under both of us
⭐ And the repo had already contradicted the false sentence in writing, before this card was filed. The entry surface is fully covered, not just The changeset, which is the part I asked to be measured rather than assumed⛔ The docs-only reflex («nothing published moves ⇒ ⭐ And the circularity I flagged in the dispatch is answered rather than ignored, in the changeset's own text: "Published tarballs are immutable, so the amendment becomes published text on the next publish of this package and not before." ⇒ the changeset is not the correction; it is what carries the correction to the registry at all. The fence that mattered most — ⛔ heldThe card's two products were not both taken. The two names are not exported; the diff is Carriers
|
Part of #18169. Docs-only: one false sentence in published CHANGELOG text, amended in place. No source file is touched.
The AGENTS.md rule this PR obeys
Quoted from
AGENTS.md, Documentation Guardrails, thepackages/*/CHANGELOG.mdrow (read 2026-09-16T12:22Z ate4449b4ef):That is why the amendment is in place, at the entry the reader's grep lands on, and why this PR carries no source change.
Old sentence, new sentence
The entry is
## 17.3.0→- 1af8286:(the #13935 fix),packages/lint/CHANGELOG.md:2176. Line number derived here, not taken from the card.Before:
After: a paragraph that states only what the export statement actually names — see the diff. Both symbol names are kept in the text on purpose: the rule's stated rationale is that the reader greps the symbol and lands on this entry, so removing the names would move the landing spot.
The reading behind the new sentence
Every number below was taken in this worktree, by this seat.
Leg 1 — the export statement (the source of truth)
packages/lint/src/index.ts:53, the package's only export site for this family:Occurrences in
packages/lint/src/index.ts, read 2026-09-16T12:41:03Z at branch tip8f8a47ce1(basee4449b4ef=origin/main):FIELD_RULE_BOUND_ROOTS— lit controlFIELD_RULE_NOWHERE_BOUND_ROOTS— dark controlexport constofvalidate-expressions.ts(:734), the very module line 53 imports from — so a 0 here reads "not re-exported", not "grep is broken"FIELD_RULE_AMBIENT_ROOTSFIELD_RULE_JUDGED_ROOTSvalidate-expressions.ts:746, never re-exported from the entryexport *(a second path to a consumer)The package declares a second published subpath,
./runtime. Probed too, same reading time:packages/lint/src/runtime.tscontains 0 occurrences ofFIELD_RULEand 0 star-exports.exportsnames exactly.and./runtimeand no wildcard, so those two are the whole consumer-reachable surface.Leg 2 — the freshly built
dist(this branch)Built here with
pnpm --workspace-concurrency=2 --filter '@objectstack/lint...' build(exit 0), then read 2026-09-16T12:40:43Z at8f8a47ce1:dist/index.d.tsdist/index.jsFIELD_RULE_BOUND_ROOTS(lit control)FIELD_RULE_AMBIENT_ROOTSFIELD_RULE_JUDGED_ROOTS.d.tshits are{@link}docblock referencesFIELD_RULE_NOWHERE_BOUND_ROOTS.d.tsis not the right probe.FIELD_RULE_JUDGED_ROOTSis present in the emitted declaration file and still not exported. The probe that decides is membership of the export clause, which is what the table's last column reads.Leg 3 — the published tarball (what a consumer actually installs)
npm view @objectstack/lint version→17.4.0;https://registry.npmjs.org/@objectstack/lint/-/lint-17.4.0.tgzdownloaded and unpacked, read 2026-09-16T12:25:43Z:package/CHANGELOG.md:2176carries the false sentence verbatim. The defect is published, not merely in-tree.package/dist/index.js: the ESM export block begins at line 14522; the only member of this family inside it isFIELD_RULE_BOUND_ROOTS(line 14585). EveryFIELD_RULE_AMBIENT_ROOTS/FIELD_RULE_JUDGED_ROOTSoccurrence sits at lines 1163–1253, i.e. in the bundle body, above the export block.package/dist/index.d.ts: same — the export clause namesFIELD_RULE_BOUND_ROOTSand neither of the other two.⇒
import { FIELD_RULE_AMBIENT_ROOTS } from '@objectstack/lint'fails to resolve against the currently published package. Acted on, the sentence fails.files[]readings, and the changeset argumentPackages the diff touches, read 2026-09-16T12:41:03Z at
8f8a47ce1:privatefiles[]@objectstack/lint17.4.0packages/lint/CHANGELOG.mdfalse["dist","README.md","CHANGELOG.md"]CHANGELOG.mdis whitelisted, and the published 17.4.0 tarball above contains it@objectstack/spec-monorepo4.0.1 (repo root).changeset/lint-changelog-export-claim.mdtrue.changeset/is release input, not shippedSo
skip-changesetis unavailable by its own definition. AGENTS.md, Post-Task Checklist step 3: "A bug fix in a released package takes apatchchangeset — never none, and ⛔ neverskip-changeset: that label is for a diff that publishes nothing from any released package."@objectstack/lintis a released package (17.4.0 is on the registry, read above) and this diff moves bytes inside its tarball. The usual docs-only reflex does not reach this file. ⇒ apatchchangeset is added.The circularity, stated rather than ignored. A changeset's own release appends a new entry to the top of the very file being corrected. Three readings settle it:
changeset versionprepends under the package heading — read off this file's own structure:## 17.4.0at line 3,## 17.3.0at 781,## 17.2.0at 3075, descending. Older entries are not rewritten, so the corrected 17.3.0 paragraph is durable.@objectstack/lint— i.e. the fix to a published-text defect would depend on an unrelated event. The changeset is what makes the repair reach the surface the card is about.If a reviewer prefers the opposite call, the lever is one file (
.changeset/lint-changelog-export-claim.md) plus theskip-changesetlabel; nothing else in this PR moves.What was deliberately not done
⛔ The two names were not exported. The card names two products and refuses to choose between them; the dispatching seat chose, narrowly, and only "correct the false record" was dispatched. Actually exporting
FIELD_RULE_AMBIENT_ROOTS/FIELD_RULE_JUDGED_ROOTSwould widen the published surface — the manual floor. It would carryClause-②: yes, take at least aminor, and is the maintainer's call, not an implementer's. It is a separate card if anyone wants it, and the card's own acceptance ③ forbids doing both in one PR.This seat has no dissent to record: the amendment is the product that restores truth to text already shipped, and it is complete on its own.
Scope
packages/lint/CHANGELOG.mdplus the changeset argued for above. No source file, no test, nocontent/docs/releases/**. In particularpackages/lint/src/validate-expressions.tsand its test are untouched — open PR #18319 is editingvalidate-expressions.test.tsand that work is not this PR's.Gates
Derived, not recalled:
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstackagainst the real change set (2 paths), which named 52 commands. All 52 were run; every exit code is in the report handed to the dispatching seat.pnpm install(a fresh worktree has nonode_modules, so they had exited 3 — PREREQUISITE NOT MET); 3 more after the@objectstack/lint...build above.check:dual-build-cjs-loadsandcheck:lean-entry-closure. Both need a whole-repodist/and say so in their own words ("this gate reads built output, and some package has no dist/"; "this gate loads BUILT entry points"). A repo-wide build is CI's run, not this PR's, and this diff contains no source byte, so neither can be moved by it. Exit 3 is neither a pass nor a finding.check:pm-dispatch-gatesis not among the derived families for these paths and was not run.Generated by Claude Code