docs(spec): register the FILTER-axis formula refusal in the ADR-0087 ledger (#8370) - #8657
Conversation
…ledger (#8370) The refusal shipped in 17.0.0 (#8296 / PR #8369) with no semantic entry, so the migration ledger, spec-changes.json and the generated upgrade guide say nothing about it. Its SORT-axis twin (#7095) carries one for the identical shape. Adds entries/semantic/17.engine-find-formula-filter-refused.ts and regenerates registry.ts, spec-changes.json and docs/protocol-upgrade-guide.md. Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01E5tUwGM3LQoqErTfkvRW7W
…ter-refusal-adr0087-entry
|
The latest updates on your projects. Learn more about Vercel for GitHub. 1 Skipped Deployment
|
📓 Docs Drift CheckThis PR changes 1 package(s): 106 hand-written doc(s) reference the affected code and may need an implementation-accuracy re-verification:
⛔ 7 release-owned page(s) also reference the affected code. These are read-only:
|
…ter-refusal-adr0087-entry
…p18 + gate repair absorbed)
Fixes #8370
The FILTER-axis formula refusal shipped in 17.0.0 (#8296 / PR #8369) without an ADR-0087 semantic entry, while its SORT-axis twin (#7095,
engine-find-formula-order-by-refused) carries one for the identical shape. For a code-path API there is nosys_metadatarow for the D2 chain to rewrite, so the ledger entry is the only notification channel this class has —objectstack migrate meta,spec-changes.jsonand the generated upgrade guide all read the registries, and all three said nothing about it.Registered per the triage ruling of 2026-08-13 on #8370, which inherits #7095's "register it anyway" for the same shape. No semantic difference from the sort precedent was found; the filter case is the stronger one (a refused sort reorders the same rows, a refused filter changes the row SET, and the surfaces that break are author-written).
What lands
packages/spec/src/migrations/entries/semantic/17.engine-find-formula-filter-refused.ts— new entry, idengine-find-formula-filter-refused, under protocol major 17 (the refusal's changeset was consumed by the v17.0.0 version cut24c1b91).packages/spec/src/migrations/registry.ts(gen:migration-registry),packages/spec/spec-changes.json(gen:spec-changes),docs/protocol-upgrade-guide.md(gen:upgrade-guide)..changeset/formula-filter-refusal-adr-0087-entry.md—@objectstack/specpatch, carrying theregistered engine-find-formula-filter-refuseddisposition marker.The entry is written against the MERGED behaviour, read out of PR #8369's code rather than transcribed from the card:
wherenaming aformulafield at BOTH doors: the REST ingress (assertFilterFieldsExist,metadata-protocol, covering everything that reachesfindData) and the engine's own filter seam (assertFilterIsMaterializable,objectql/filter-comparand-shape.ts), reached byfind/findOne/count/aggregate/update/delete. Both answer400 INVALID_FIELD; both judge the field with the same@objectstack/spec/datapredicate (isVirtualSearchField/SEARCH_VIRTUAL_TYPES, which holdsformulaand nothing else).summary/autonumberneed no action: both get real maintained columns.config.filter, dashboard widget filters and view filters for a filtered field whose object declares it aformula.Two facts in the entry were verified in-tree rather than quoted:
sys_saved_report.query.filterreally is forwarded verbatim intoengine.find(plugin-reports/src/report-service.ts,where: q.filter), which is the author-reachable path that bypasses the ingress; andSEARCH_VIRTUAL_TYPESreally isformula-only, which is what keepssummaryandautonumberout of the refusal.Verification
Gate union re-run after the final commit, at HEAD
3c1b2ada0(includes the merge of currentorigin/main):Green:
check:nul-bytes,check-empty-changeset,check-changeset-no-major,check:merge-driver,check:spec-parsed-alias,check:type-source-resolution,check:objectui-changeset,check:migration-registry,check:spec-changes,check:upgrade-guide,check:generated(13/13 artifacts current),check:doc-formula-expressions.pnpm --filter @objectstack/spec test— 397 files / 10527 tests passed (includes the D3 chain replay).pnpm --filter @objectstack/spec typecheck— clean.Red for repo-state reasons that reproduce on pristine
origin/main, unrelated to this diff:check:changeset-gate-self-tests— thecheck-changeset-no-major --self-testcontrol requires major-declaring changesets in the real stock; the v17 cut consumed them. Already filed as finding:check-changeset-no-major --self-testgoes red repo-wide after a release exits pre mode — its control requires major-declaring changesets AND apre.jsonthat no longer exists #8654, measured red atorigin/main56724c500with this branch absent.check-adr-0087-registration— its own input assertion, on the same post-cut condition: "not one of 3 changeset(s) in stock matches the breaking-change detector". Sibling gate of finding:check-changeset-no-major --self-testgoes red repo-wide after a release exits pre mode — its control requires major-declaring changesets AND apre.jsonthat no longer exists #8654, filed separately (see the report comment on The FILTER-axis formula refusal (#8296) shipped without the ADR-0087 semantic entry its SORT-axis twin (#7095) carries — the upgrade guide will not mention it #8370).check:dev-prereqs— an unbuilt worktree ("The workspace is not built", 67 packages); CI builds first.Generated by Claude Code