You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
[finding] skills/objectstack-query rules/filters.md names filter-token-unknown as the rule that fails an unknown token in a flow node's config.filter — it never fired there, and after PR #16732 the rule that does is flow-filter-token-unknown #16736
Filed by the domain:devx @ objectstack execution seat (session_012GKcPZbMoGq7WPzKLfRBTU) at 2026-09-08T02:5xZ, out of the contract-review of PR #16732 (closes #16096). ⛔ Left unlabelled for triage to route and rank — this seat does not produce domain:*.
⚠️Governed, customer-published surface.skills/** is governed (Prime Directive #14) and this bundle ships to customers, so the correction is a maintainer-merged docs-only PR; it cannot ride another change. That is why it is a card and not a ## 验收备注 note: the reviewer of PR #16732 flagged that the note's 承接者:无 was the weak spot, since a governed surface always has an owner.
The claim, quoted from the file
skills/objectstack-query/rules/filters.md on origin/main (be92d46), lines 230-239 — two paragraphs, the second scoped by the first:
A flow node'sconfig.filter takes these tokens too. […]
Unknown tokens are rejected, not ignored. A value that is entirely {...} is a placeholder by construction: objectstack build fails it (rule filter-token-unknown) and the resolver throws […]
Why it is a class (b) finding — a declared contract the build does not honour
The paragraph declares a rule id as the thing that fails an unknown whole-string token in a flow node's config.filter. That id has never covered that position:
So for the whole life of this sentence, an author following it got the opposite of what it promises: the build passed, and the token reached the data engine as a literal.
PR #16732 fixes the behaviour but not this sentence, and moves the target: the flow position is now covered by a different rule, flow-filter-token-unknown, deliberately built on the flow template grammar rather than the ObjectQL vocabulary (a naive flows root addition would red every legitimate {TODAY() - 45}). After that PR merges, the doc names an id that still does not fire for the position its own paragraph is about.
Suggested repair, not a prescription
Name flow-filter-token-unknown for the flow-node position and keep filter-token-unknown for view/report/dataset/page/app filters — the two ids are deliberately distinct because the two positions have different token vocabularies, and collapsing them in the prose would re-teach the confusion the split exists to prevent.
Re-check commands
git show origin/main:skills/objectstack-query/rules/filters.md | sed -n '228,240p'
git show origin/main:skills/objectstack-query/rules/filters.md | grep -n 'filter-token-unknown'
At filing: the second returns exactly one hit, line 238; the file is 250 lines. If PR #16732 has merged by the time this is picked up, re-derive both readings before acting — ⛔ the line will have moved.
Not a duplicate
Searched open and closed: #14139 (closed) is the same shape on a different bundle (objectstack-ui teaching $currentUser against its own two-token contract); #16111 (closed) is the adjacent lint gap for flow-template-unknown-field; #3810 (closed) is the run-time half of this seam. None of them touches this sentence.
Filed by the
domain:devx @ objectstackexecution seat (session_012GKcPZbMoGq7WPzKLfRBTU) at 2026-09-08T02:5xZ, out of the contract-review of PR #16732 (closes #16096). ⛔ Left unlabelled for triage to route and rank — this seat does not producedomain:*.skills/**is governed (Prime Directive #14) and this bundle ships to customers, so the correction is a maintainer-merged docs-only PR; it cannot ride another change. That is why it is a card and not a## 验收备注note: the reviewer of PR #16732 flagged that the note's承接者:无was the weak spot, since a governed surface always has an owner.The claim, quoted from the file
skills/objectstack-query/rules/filters.mdonorigin/main(be92d46), lines 230-239 — two paragraphs, the second scoped by the first:Why it is a class (b) finding — a declared contract the build does not honour
The paragraph declares a rule id as the thing that fails an unknown whole-string token in a flow node's
config.filter. That id has never covered that position:filter-token-unknownnever walksflows— an unresolvable{TOKEN()}in a flow node'sconfig.filteris silent, while the identical string in a view filter exits 1 #16096 measured it directly on the pinned artifact, with a working control: the identical token string errors and exits 1 in a view filter underfilter-token-unknown, and is completely silent (exit 0, byte-identical to baseline) in a flow node'sconfig.filter.validateFilterTokenswalks a fixed root list —objects,views,reports,datasets,pages,apps— andflowsis not in it.PR #16732 fixes the behaviour but not this sentence, and moves the target: the flow position is now covered by a different rule,
flow-filter-token-unknown, deliberately built on the flow template grammar rather than the ObjectQL vocabulary (a naiveflowsroot addition would red every legitimate{TODAY() - 45}). After that PR merges, the doc names an id that still does not fire for the position its own paragraph is about.Suggested repair, not a prescription
Name
flow-filter-token-unknownfor the flow-node position and keepfilter-token-unknownfor view/report/dataset/page/app filters — the two ids are deliberately distinct because the two positions have different token vocabularies, and collapsing them in the prose would re-teach the confusion the split exists to prevent.Re-check commands
At filing: the second returns exactly one hit, line 238; the file is 250 lines. If PR #16732 has merged by the time this is picked up, re-derive both readings before acting — ⛔ the line will have moved.
Not a duplicate
Searched open and closed: #14139 (closed) is the same shape on a different bundle (
objectstack-uiteaching$currentUseragainst its own two-token contract); #16111 (closed) is the adjacent lint gap forflow-template-unknown-field; #3810 (closed) is the run-time half of this seam. None of them touches this sentence.Refs #16096 · PR #16732.
Generated by Claude Code