docs(skills): name flow-filter-token-unknown for the flow-node filter position - #16803
Conversation
… position The passage sat directly after "A flow node's `config.filter` takes these tokens too", so its rule id read as the one that fails an unknown token in a flow node. Since #16732 that position is owned by a second rule. The two ids stay distinct, because the two positions do not share a token vocabulary or a consequence: - flows -> `flow-filter-token-unknown` (validate-flow-filter-tokens.ts), which fires only when NEITHER dialect resolves the token and whose consequence is a guard refusal: "this node cannot run at all"; - dashboards/objects/views/reports/datasets/pages/apps -> `filter-token-unknown` (validate-filter-tokens.ts), which deliberately does not walk `flows` and whose consequence is the silent zero. Collapsing them into one statement would re-teach the confusion the split exists to prevent, so the flow sentence names its own rule and the general paragraph is scoped with "Outside a flow". Wording (not the id distinction) was tightened to stay under the published token ratchet: 2136 -> 2146 tokens against a 2149 ceiling. Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01P58euzUXCVJNwmhuPC9DXY
维护者速读(终稿)席位复核记录:#16736 上的 ACCEPT 评论(skills 席,hotlong,session 改了什么一个已发布技能文件 为什么改自 PR #16732 起 flow 位置归第二条规则管,原文却只写了旧 id,而且紧接在 flow 段之后没有任何再限定。拿着 风险与代价(含回滚)风险很低:一个已发布 prose 文件、一段话,不进任何 npm 包(实测:改动独有片段在所有 dist/ 零命中,阳性对照 6 命中)。代价:该文件 token 棘轮余量 13 → 3(2146/2149),以后再加字先删字;上限未动。回滚 = revert 这一个 commit,无下游依赖。 席位意见同意合并。席位对照 GitHub 逐项核过:两个 id 都在 派发时席位的一处推断被证伪:「余量 13 够、不用删字」——诚实改写先超 8 再超 1,dev 按裁决只压措辞落到 2146。另一处订正:旧规则走的根是七个(dashboards、objects、views、reports、datasets、pages、apps),不是卡和裁决写的五个;散文不列举它们,不影响本改动。 你要做的受管面( 是 Generated by Claude Code |
Fixes #16736
skills/objectstack-query/rules/filters.mdhad exactly onefilter-token-unknownhit, and it sat in the paragraph immediately after "A flow node's
config.filtertakes these tokens too" — with nothing re-scoping it, so it readas the rule that fails an unknown token in a flow node. Since PR #16732 that
position is owned by a second rule.
The two ids stay distinct
Verified on the branch base by grep, both live:
flowsflow-filter-token-unknownpackages/lint/src/validate-flow-filter-tokens.ts:65dashboardsobjectsviewsreportsdatasetspagesappsfilter-token-unknownpackages/lint/src/validate-filter-tokens.ts:65They are two ids because the two positions share neither a token vocabulary nor a
consequence.
validate-filter-tokens.tswalks seven roots and deliberately notflows;validate-flow-filter-tokens.tswalksflowsonly and fires solely onthe call-position arm. Its module header states why widening the old id was
refused: "Widening the published id would make its meaning depend on the position
it fired in, which a machine consumer keyed on the id cannot see."
So the flow sentence names its own rule and the general paragraph is scoped with
"Outside a flow". The prose does not merge them into a single statement.
Wording — not the id distinction — was tightened to pay the token ratchet.
Readings (re-derived; the card's
238was not inherited)Branch base is
b72226f48, newer than theb38821d1cthe card was writtenagainst; every number below was re-measured on it.
flow-filter-token-unknownat line 234,filter-token-unknownat line 239 (one hit each)Published-bundle readings, both required for a
skills/**diff:rules/filters.md)Ceiling for this file is 2149, so headroom went 13 to 3 — it fits without
deleting content, and the id distinction never became the currency:
This is a one-line correctness fix, not an expansion: net +10 tokens on a 150k
bundle.
Gates — 20/20 green at
6cfd58efaDerived in the worktree with
node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(no paths); the derivation reproduced the dispatch'slist exactly — 20 commands, no additions. All run after the final commit, each
exit code captured by redirect before any pipe.
check:doc-formula-expressionsfirst exited 3 — PREREQUISITE NOT MET, which isnot a reading. Built the two packages it names under
scripts/pm/os-verify-lock.sh(
VERDICT command-exit 0 · held the lock 1s · waited 98s) and re-ran it to a realexit 0.
Governed-surface predicate, quoted:
Outside the runnable total and deliberately not read as clearance: 10 WIDE families,
42 artifact rosters, 2 families taking a value from the workflow.
No changeset — measured, not assumed
skills/**is not on the fast track, so it was measured rather than asserted:files[]entries acrosspackages/**,apps/**,services/**match/skill/iOutside a flow, a whole-): 0 hits in any builtdist/flow-filter-token-unknown(genuinely published via@objectstack/lint): 6 hitsSymbol zero, control non-zero, so the grep works and nothing published moves.
Labelled
skip-changeset.验收备注
inherited: base moved
b38821d1ctob72226f48between dispatch and pickup.The file was still 250 lines with the single hit still at 238.
noted, not filed:the same passage's "renders a widget showing 0" clause andits
isDateMacroToken/isContextTokenadvice are the ObjectQL-vocabularystory, so before this change a flow author who searched the skill for their
build error would have landed on the wrong dialect's fix. The scoping added
here removes that path; no separate card. 承接者: this PR.
filter-token-unknownwalks includedashboardsandobjects,two more than the five the card enumerates. The prose does not enumerate them,
so nothing here depends on the difference; recorded only so the next reader of
this passage is not surprised. 承接者: 无.
维护者速读(草稿)
改了什么 — 一个已发布技能文件里的一段话,一处规则 id。原文把「flow 节点的
config.filter里写错 token,构建会以哪条规则失败」指向了filter-token-unknown;自 #16732 起,那个位置归
flow-filter-token-unknown管。现在 flow 那句点名自己的规则,原来那段用「Outside a flow」限定回它本来的位置。
为什么改 — 这段话是给 AI 作者看的。它构建失败、拿着
flow-filter-token-unknown回来查技能包,原文会把它领到另一条规则的后果(「widget 显示 0」)和另一套词汇的修法
(
isDateMacroToken/isContextToken)。两个位置的 token 词汇本就不同 —— 这正是当初拆成两个 id 的原因 —— 所以散文里合并两者,等于把这次拆分要防的混淆重新教一遍。
风险与代价(含回滚) — 风险很低:改动只有一个文件、一段话,不含任何代码,不发布
任何 npm 包内容(已实测,非推断)。代价是 token 棘轮余量从 13 降到 3,这个文件以后再
加字需要先删字。回滚就是 revert 这一个 commit,没有任何下游依赖。
席位意见 — (留空,待席位填)
你要做的 — 只需确认一件事:为了让两个 id 的区分放得进 token 棘轮,我压缩了同一段
落的措辞(删掉「while authoring」「passing the」这类冗余,把「a value that is entirely
{...}」改成「a whole-{...}value」),没有删任何一条信息、也没有抬 ceiling。请确认这个取舍可以接受 —— 裁决说「容不下时缩短的是措辞,不是那两个 id 的区分」,我照此执行。
Generated by Claude Code