Skip to content

[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

Description

@claude

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's config.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:

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.

Refs #16096 · PR #16732.


Generated by Claude Code

Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions