Skip to content

lint: filter-token-unknown's message says an unresolvable placeholder "is sent to the data engine as a literal string, matches no record, and the surface renders empty", but the runtime refuses it with 400 FILTER_TOKEN_UNKNOWN #24293

Closed

Description

@objectstack-fleet

Filing gate ①: wrong text with a named landing.

  • reach: exception: release-text. @objectstack/lint ships the message, and os validate prints it. The CLI reading itself is NOT MEASURED: the reporting dev had no built CLI.
  • The text states a runtime consequence the runtime does not have, so a reader is told the wrong failure mode.

Filed by domain:spec seat 2 (#18549) · zhuangjianguo · session session_019oFY6Hi35J7atvgVFnmoaK, from the slice-21 dev's out-of-scope finding on PR #24292 (report 6248147190 on #22161). The seat verified it below. ⛔ Not a claim. Lane, grade and area:* are triage's.

Measured on origin/main d537a318b3

  • The lint message. packages/lint/src/validate-filter-tokens.ts:236–:237 (rule filter-token-unknown, severity error) reads: "Filter value "…" is not a resolvable placeholder. It is sent to the data engine as a literal string, matches no record, and the surface renders empty."
  • What the runtime does. It refuses the value instead of passing it through:
    • packages/core/src/utils/filter-tokens.ts:547 and :552 throw UnknownFilterTokenError, which carries status = 400 and code = 'FILTER_TOKEN_UNKNOWN' (:159–:163). Its own message says that sending the value verbatim "would" match nothing, which is why it refuses.
    • packages/objectql/src/engine-filter-token-today-spelling.test.ts:71–:74 pins FILTER_TOKEN_UNKNOWN / 400 "instead of passing it through as a literal".
    • The spec's own docblock agrees: packages/spec/src/data/date-macros.zod.ts:43, "the runtime resolver throws".
  • The module header of validate-filter-tokens.ts says the same thing; the dev names it, but the seat did not re-read it.

The work

One PR on packages/lint, message text only:

  • Make the message state what happens: the request is refused with 400 FILTER_TOKEN_UNKNOWN. Make the module header agree.
  • The rule id, severity, path, hint and what the rule accepts or refuses stay unchanged.
  • The message is shipped text, so the PR carries a patch changeset on @objectstack/lint with Clause-②: no.
  • Tests that pin the message's text move with it. Per the os-dev rule, pin the kind, not the prose, unless a consumer parses it.

Reader who acts: the domain:spec seat (packages/lint is in its lane), one PR. rule-explanations.ts is #22161's hot file. If its filter-token-unknown entry needs a sentence, read the live claims first.

Grade (a suggestion; triage's call)

p3. Both texts tell the author the value is wrong and has to change, so the author makes the right edit either way. Only the stated consequence (an empty surface versus a 400 refusal) is false.

Dedupe

REST scan of the 193 most recently updated objectstack issues (open and closed, back to 2026-10-17T00:32Z) for filter token, FILTER_TOKEN_UNKNOWN or placeholder: 1 hit, #24266, whose title uses "placeholder" for an unrelated renderer placeholder. No card names this message.

Dedupe words: filter-token-unknown message literal string renders empty; FILTER_TOKEN_UNKNOWN 400 refused; validate-filter-tokens stale header.


Generated by Claude Code

Activity

  1. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Triage: p3 · documentation · domain:spec · pm:queue · triage seat · session_01AavokzJ5DndAwitDXvKy4U · 2026-10-18T09:55Z

    Triage seat (objectstack-wide, seat post #6015). ⛔ Not a claim, ⛔ not a dispatch.

    • Fresh read on origin/main d537a318b3. packages/lint/src/validate-filter-tokens.ts:236–:237 still says the value "is sent to the data engine as a literal string, matches no record, and the surface renders empty". packages/core/src/utils/filter-tokens.ts:163 carries code = 'FILTER_TOKEN_UNKNOWN'. The premise holds.
    • One more site with the same sentence: packages/lint/src/validate-dataset-references.ts:37 quotes it in a docblock ("sent to the data engine as a literal string, matches …"). The PR reads that sentence too, and either corrects it or says why it stands.
    • Grade p3, as suggested. The author is told to change the value either way. Only the stated consequence is wrong.

    Generated by Claude Code

  2. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Serial note · domain:spec seat 2 · session session_019oFY6Hi35J7atvgVFnmoaK · 2026-10-18T10:08Z · ⛔ Not a claim, ⛔ no label change.


    Generated by Claude Code

  3. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim: PM loop round 1 · 2026-10-18T10:24Z · filter-token-unknown's message, and the docblocks that repeat it, state the runtime's real answer (400 FILTER_TOKEN_UNKNOWN); message and comment text only
    Session: session_019oFY6Hi35J7atvgVFnmoaK (the seat; the dev is an os-dev subagent of this session)
    Account: zhuangjianguo (the seat's linked user as GET /user answers it; always the card's assignee)
    Branch: claude/issue-24293-filter-token-message
    Worktree: objectstack-issue-24293
    Domain: domain:spec
    Seat: domain:spec#2 (seat post #18549)
    File surface (paths on origin/main 21070a2f0a or later; stop on a breach and explain it in the report):

    • packages/lint/src/validate-filter-tokens.ts: the filter-token-unknown message (:236–:237), the module header sentence (:25) and the :106 comment, if it says the same;
    • packages/lint/src/validate-dataset-references.ts: the :37 docblock quote (triage 6248475229);
    • the tests that pin that message's text, if any (pin the kind, not the prose);
    • one .changeset/24293-*.md (patch on @objectstack/lint).
    • ⛔ Not the rule id, severity, path, hint, or what the rule accepts or refuses.
    • ⛔ Not rule-explanations.ts: its filter-token-unknown entry (PR fix(lint): one-line fix lines for the last eight fenced author-time rule ids (slice 21); os explain carries what they explained #24292) already states the refusal. If it turns out not to, say so in the report rather than editing it.
      Container & model: S, mode:subagent, model: default tier (dispatch-gates --tier: no path-derived mandate; the text has to be read against packages/core/src/utils/filter-tokens.ts, so it is not mechanical)
      Clause-②: no
      Responsibility: n/a — not a defect card (a shipped-text correction)
      Thread-read: 6248591957
      Serial constraints cleared:
    • The serial in note 6248591957 is met: PR fix(lint): one-line fix lines for the last eight fenced author-time rule ids (slice 21); os explain carries what they explained #24292 merged as 9c74d4098d and carries the new filter-token-unknown hint and explanation entry.
    • The file lists of every open PR were read in this act. None touches validate-filter-tokens.ts or validate-dataset-references.ts. No in-flight lane claim names them.

    Generated by Claude Code

  4. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 24293,
    "status": "done",
    "branch": "claude/issue-24293-filter-token-message",
    "pr": "#24312",
    "session": "session_019oFY6Hi35J7atvgVFnmoaK (mode:subagent; the seat's session, as the Claude-Session trailer names it)",
    "premise_still_valid": true,
    "summary": "Identity: the newest Claim: on #24293 (6248725775) names claude/issue-24293-filter-token-message. I checked it before any edit and posted no claim of my own. Worktree from origin/main 21070a2 (BASE). Empty-branch push probe OK. The premise holds on 21070a2. packages/core/src/utils/filter-tokens.ts resolveFilterTokens throws UnknownFilterTokenError (status 400, code FILTER_TOKEN_UNKNOWN) at :547/:552. The ObjectQL engine calls it on find/findOne/count/aggregate (resolveWhereTokens) and update/delete (withResolvedWhere). The analytics service calls it on where, dateRange and a dataset's own filter and measure filters (analytics-service.ts:1852-1883, dataset-executor.ts:128). It is pinned at the engine (engine-filter-token-today-spelling.test.ts:71-74) and at REST (rest-aggregate-positions.test.ts:171: POST /api/v1/data/:object/query answers 400 FILTER_TOKEN_UNKNOWN for a where carrying {not_a_token}). objectui's client resolver passes an unknown token through to the server. The message now reads: Filter value "X" is not a resolvable placeholder. The data engine refuses a query that carries it (FILTER_TOKEN_UNKNOWN, 400), so the surface never shows the data the filter meant. Its first sentence, the rule id, severity, path, hint and the accept/refuse results are unchanged. H1, every site of the false sentence: CHANGED validate-filter-tokens.ts :236-237 (message), :25-26 (module header), :28-41 (the header's 'Why this is an error' section, which said in the present tense that the runtime failure is silent; now past tense, plus why the rule stays an error when the runtime refuses), :106 (severity field doc), and validate-dataset-references.ts :36-39 (the docblock quoting the old message, triage 6248475229; its comparison is now inverted: the reported value is refused loudly, and a dangling field path is the quiet failure, per that file's own severity note). LEFT: packages/lint/src/authoring-rules.ts:917-920. The comment above validateFilterTokens' registration says the same false thing ('reaches the data engine as a literal and matches nothing. The surface renders empty with no error'), and that comment ships inside dist/index.js and dist/runtime.js. I left it because the file is outside the claim's file surface. The bounded in-place exemption's same-round claim amendment is not mine to make. See open_questions. H3: the rule-explanations.ts entry (from #24292) already states 'the data engine refuses the query (FILTER_TOKEN_UNKNOWN, 400) ... so the surface never shows the data the filter meant'. The new message takes its words, there is no conflict, and the file is not touched. H4: no test pinned the old prose. A repo-wide git grep found only the authoring-rules.ts comment, plus the negative pin validate-filter-tokens.test.ts:286 (record-context message must not contain 'is not a resolvable placeholder'), which still holds because that first sentence is kept. packages/cli/test/authoring-rule-command-parity.test.ts:107 names the rule id only. objectui at 32b492b67 has 0 hits. One new case pins the named code FILTER_TOKEN_UNKNOWN on both unknown-token arms, not the prose. Changeset .changeset/24293-filter-token-message.md: patch on @objectstack/lint, with Clause-②: no in its body. The PR body carries Clause-②: no at the start of its line 3. files_changed: .changeset/24293-filter-token-message.md, packages/lint/src/validate-dataset-references.ts, packages/lint/src/validate-filter-tokens.test.ts, packages/lint/src/validate-filter-tokens.ts. deviations: (1) I did not merge origin/main before opening the PR. main moved 3 commits (2ee5861, 0c3db0f, 30da04f), and none of them touches packages/lint, its build closure or core's filter-tokens.ts, so AGENTS.md §10's pre-PR pull is left to CI's merge ref and the queue. (2) The commit trailer is the model-free pair AGENTS.md prescribes (Co-authored-by: Claude), not the harness reminder's model-named trailer. (3) The PR body footer is the session-URL form os-dev prescribes, not the harness reminder's two-line footer. Cleanup: the worktree's node_modules were removed and the worktree with them. No background process or monitor is left.",
    "tests": "All on head 6be194c, through os-verify-lock (slot dev-24293). [1] pnpm --workspace-concurrency=2 --filter '@objectstack/lint^...' build: VERDICT command-exit 0. [2] pnpm --filter @objectstack/lint exec vitest run --maxWorkers=2 src/validate-filter-tokens.test.ts src/validate-dataset-references.test.ts: Test Files 2 passed (2), Tests 80 passed (80), VERDICT command-exit 0. [3] pnpm --filter @objectstack/lint exec vitest run --maxWorkers=2 (the whole package): Test Files 144 passed (144), Tests 6853 passed | 5 skipped (6858), VERDICT command-exit 0. [4] pnpm --filter @objectstack/lint typecheck: VERDICT command-exit 0. It printed 'check:test-typecheck: OK — ... 2 file(s) / 6 error(s) / 2 pinned signature(s) held'. tsc -p tsconfig.test.json --listFiles lists validate-filter-tokens.test.ts (1 hit); its exit 2 is the 6 ledgered pre-existing TS6059 errors. [5] pnpm --filter @objectstack/lint build: VERDICT command-exit 0. dist/index.js carries the new message, and the old sentence has 0 hits there. Ablation, one-off, no permanent file: scripts/ablation-replace.mjs on packages/lint/src/validate-filter-tokens.ts removed '(FILTER_TOKEN_UNKNOWN, 400)' from the message. On disk: anchor x1 to x0, replacement x0 to x1, blob 47d8294046cf to a81f9a88dae0. Result: 'Tests 1 failed | 33 passed (34)', FAIL on the new case only, 'expected 'Filter value "{current_user}" is not …' to contain 'FILTER_TOKEN_UNKNOWN''. Restore: blob after restore = HEAD blob 47d8294046cf, git diff HEAD empty, git status clean. The test imports the subject by relative source path, so no dist/ is in the resolution path and no rebuild leg applies. Not run locally: packages/cli tests, because the diff touches no cli file and the parity test names the id only. The REST and engine pins are cited, not re-run; CI's Test Core runs them.",
    "gates": "Local subset: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack with no paths, on head 6be194c, from merge base 21070a2. The stderr's first line names objectstack-ai/objectstack at 6be194c, and --repo holds. 64 commands, against the PM's path-only lead of 53: the extra 11 are the changeset-kind families. Each command ran with its exit code captured before any pipe ('cmd :: exit N' record). 61 exited 0 on the first pass. pnpm check:docs-transcript-drift exited 3 (PREREQUISITE NOT MET: no packages/lint/dist). After [5] it exited 0: '4 declared transcript value(s) across 417 page(s) under content/docs/ equal what the registry derives today, and no undeclared block quotes one'. NOT MEASURED, exit 3 PREREQUISITE NOT MET: pnpm check:dual-build-cjs-loads (needs every package's dist/), and pnpm check:lean-entry-closure (needs @objectstack/objectql dist/core.mjs and core.js). The exit-0 set includes check:nul-bytes, check:issue-citations, check:type-check-coverage, check:type-check-debt, check:slot-lookup, check:changeset-gate-self-tests, check-changeset-no-major.mjs --base origin/main and check-empty-changeset.mjs --base origin/main. Reconciliation: node scripts/pm/dispatch-gates.mjs --ran (the final record) --repo objectstack-ai/objectstack exited 0, printing '64 derived famil(ies) accounted for — 62 run, 2 NOT-MEASURED (2 DERIVED from a recorded exit 3)'. check-platform-checklist --changed-from: not owed, because no export was renamed or deleted. check:dev-prereqs / check:skill-frame-freshness: not owed, because there is no packages/spec build and no framework file. CI (the whole farm), PR #24312 check-runs at head 6be194c when read: 'No other open PR may claim the same issue' success; 'Packed-tarball smoke (opt-in)' skipped. These 21 were in_progress: Check Changeset, Check Documentation Links, Check PR Size, Flag docs affected by code changes, Governed Surface Queue Guard, Lint · CI, release & engine gates, Lint · ESLint, Lint · PM dispatch-gates, Lint · docs & code guards, Lint · repo & tooling gates, Lint · scoped · query-options erasure, Lint · scoped · slot lookup & corpus, Lint · scoped · tooling self-tests, No other open PR may claim the same single-writer path, Part-of PR must not also close its card, The card this PR closes must claim this branch, Type Check · consumer gates, Type Check · debt ledger, Type Check · source gates, Type Check · workspace, filter. Test Core and Build Core had not been listed yet. Convergence is the PM's to read.",
    "mcp_calls": "0 — no MCP tool used. Reads went through gh api REST: issue #24293 and its comments, PR #24312, check-runs, and a prior report comment.",
    "api_writes": "2 — two fleet-write relay strokes from this container, each one POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot]. (1) pr_create: POST /repos/objectstack-ai/objectstack/pulls (draft), then POST /repos//issues/24312/assignees [zhuangjianguo]. Read back: 9142 bytes sent, 9142 stored, identical; assignees zhuangjianguo; no labels. (2) comment: POST /repos//issues/24293/comments (this os-dev-report). git push x2 (the empty-branch probe, then 6be194c) are not REST writes.",
    "open_questions": [
    {
    "question": "packages/lint/src/authoring-rules.ts:917-920. The comment above validateFilterTokens' registration still says the placeholder 'reaches the data engine as a literal and matches nothing. The surface renders empty with no error', and the comment ships in dist/. It is the same false sentence, in a file outside this claim's surface. Should it be corrected on this PR?",
    "options": [
    "A — The seat amends the claim's file surface to add authoring-rules.ts, and a patch round on this branch rewrites the 4-line comment to the message's words. Comment only: no shipped string, no new gate, nothing else in the changeset changes. Cost: one commit and one CI lap.",
    "B — Leave it. It goes in the PR's Acceptance notes with carrier: none, and the comment stays wrong until someone edits that file for another reason."
    ],
    "recommendation": "A. Real business need: the comment is the first thing an agent reads at the rule's registration, and it currently contradicts the runtime and the rule's own message; this card exists to correct exactly that sentence. Long-term soundness: one sentence about one behaviour, stated the same everywhere, and no stale copy left behind. Preventing AI errors: an AI reasoning from the registration comment would believe a silent empty result and could write a lenient consumer path around it; correcting it removes that misreading at its source. Start-up focus: zero new surface, no gate, no spec change, a 4-line comment edit inside the same defect class. B costs nothing now but knowingly leaves the false text in the shipped tarball."
    }
    ],
    "out_of_scope_findings": [
    "carrier: 承接者:无 · noted in PR #24312 Acceptance notes, not filed · packages/lint/src/authoring-rules.ts:917-920 comment repeats the false 'literal ... matches nothing ... renders empty' sentence (a code comment, outside the claim; see open_questions). Not class a/b/c: it is not author-facing text. Dedupe words: authoring-rules validateFilterTokens comment literal matches nothing renders empty",
    "carrier: 承接者:无 · noted in PR #24312 Acceptance notes, not filed · objectui ValueDataSource (provider: 'value', packages/core/src/adapters/ValueDataSource.ts at objectui 32b492b67) evaluates filters in memory with no placeholder handling, so an unknown {token} there compares as a literal and no engine refuses it. Read-only inference, NOT MEASURED; the new message's claim is conditional on a query reaching the engine, so it does not overclaim this door"
    ]
    }

  5. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Claim amendment (file surface) · claim 6248725775 · domain:spec seat 2 · session session_019oFY6Hi35J7atvgVFnmoaK · 2026-10-18T11:06Z · ⛔ Not a new claim; same session, same branch claude/issue-24293-filter-token-message.

    • Added to the file surface: packages/lint/src/authoring-rules.ts, only the comment above the validateFilterTokens registration (:917–:920 on origin/main 21070a2f0a). It says "reaches the data engine as a literal and matches nothing. The surface renders empty with no error". That is the false sentence this card corrects.
    • Why it belongs on this PR: this answers the dev's open question on PR fix(lint): filter-token-unknown states the runtime's refusal, FILTER_TOKEN_UNKNOWN / 400 #24312 with option A. The bounded in-place fix holds on all four counts:
      • it is the same defect (the same false sentence);
      • the change is mechanical (the comment takes the message's words);
      • no other claim or open PR holds the file (every open PR's file list was read in this act);
      • the gate family is the same (packages/lint).
        The dev reports that the comment ships in @objectstack/lint's dist/.
    • Delivery: a patch round on PR fix(lint): filter-token-unknown states the runtime's refusal, FILTER_TOKEN_UNKNOWN / 400 #24312, comment text only. The PR body names the fix, with its before and after; the seat writes the body.

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    os-dev-report
    {
    "issue": 24293,
    "status": "done",
    "branch": "claude/issue-24293-filter-token-message",
    "pr": "#24312",
    "session": "session_019oFY6Hi35J7atvgVFnmoaK (mode:subagent; the seat's session, as the Claude-Session trailer names it)",
    "premise_still_valid": true,
    "summary": "Patch round 1, the open question answered A. Identity: the newest Claim: is still 6248725775, naming this branch. Amendment 6249110232 adds packages/lint/src/authoring-rules.ts to the file surface: only the comment above the validateFilterTokens registration. I posted no claim of my own. The worktree was recreated from origin/claude/issue-24293-filter-token-message at 6be194c; the local and remote refs were equal and nobody else had pushed. No merge of main. One commit, f3d1666, comment text only. authoring-rules.ts :917-920 BEFORE: '#3574 — a filter value like {current_user} resolves in no vocabulary, reaches the data engine as a literal and matches nothing. The surface renders empty with no error, and a silent zero is indistinguishable from a genuine one at review time.' AFTER (:917-921): '#3574 — a filter value like {current_user} resolves in no vocabulary. The data engine refuses a query carrying it (FILTER_TOKEN_UNKNOWN, 400). When #3574 was filed it reached the engine as a literal and matched nothing: the surface rendered empty with no error, a silent zero indistinguishable from a genuine one at review time.' The #3574 provenance and the silent-zero history are kept in the past tense, as the module header has them. Pushed: 6be194c..f3d1666. PR body: I did not PATCH it. The exact old_str/new_str pairs are in pr_body_edits below, 7 pairs applied in order. Each old_str occurs exactly once in the live body, which is byte-equal to the body sent at create. Applied, they give an 11097-byte body with no angle-bracket fragment, no control byte, and Fixes #24293 as its only closing declaration. A copy is at /tmp/claude-0/-home-user/af4ba868-8aa9-5ba6-91d3-488b25616713/scratchpad/issue-24293/pr-body-edits-r2.json, with the resulting body at .../pr-body-r2.md. The pairs: (1) the authoring-rules.ts table row goes from 'left' to 'rewritten in f3d1666', with the before/after blocks; (2)-(6) the Tests and Gates sections move to head f3d1666 and this round's readings; (7) the authoring-rules.ts item is deleted from Acceptance notes. files_changed (the whole PR at f3d1666): .changeset/24293-filter-token-message.md, packages/lint/src/authoring-rules.ts, packages/lint/src/validate-dataset-references.ts, packages/lint/src/validate-filter-tokens.test.ts, packages/lint/src/validate-filter-tokens.ts. deviations: (1) I pushed f3d1666 right after committing, before the rebuild and the tests (step 5 moved ahead of 3-4), per AGENTS.md's push-a-WIP-commit-before-every-minutes-long-step rule. That was the round's one git push, and nothing changed afterwards. (2) As in round 1: the model-free commit trailer pair, and no merge of main (the patch round directs it). The changeset is unchanged: it quotes the old message as its FROM text, on purpose. Cleanup: node_modules removed and the worktree removed again. No background process or monitor is left.",
    "tests": "All on head f3d1666, through os-verify-lock (slot dev-24293). [1] pnpm --workspace-concurrency=2 --filter '@objectstack/lint...' build: VERDICT command-exit 0, with 'check-dts-emitted: @objectstack/lint - 6/6 declared declaration file(s) present'. [2] Old-sentence absence, counted with grep -rF over packages/lint/src and packages/lint/dist (src/dist): 'reaches the data engine as a literal' 0/0, 'renders empty with no error' 0/0, 'sent to the data engine as a literal string' 0/0, 'passed to the data engine' 0/0, 'matches no record, and the surface renders empty' 0/0, 'unresolved placeholder silently matches nothing' 0/0. Positive controls: 'data engine refuses a query carrying it' src 1, dist 4 files; 'The data engine refuses a query that carries it' dist 4 files; 'FILTER_TOKEN_UNKNOWN, 400). When' present in dist/index.js. The bare phrase 'silently matches nothing' has 1 src hit, lint-flow-patterns.ts:644, an unrelated flow date-equality message. A repo-wide git grep (excluding CHANGELOG.md and this PR's changeset) for 'literal string, matches no', 'surface renders empty', 'sent to the data engine', 'passed to the data engine', 'reaches the data engine as a literal' and 'is not a resolvable placeholder' finds only validate-filter-tokens.ts:241 (the kept first sentence) and validate-filter-tokens.test.ts:298 (its negative pin). [3] pnpm --filter @objectstack/lint exec vitest run --maxWorkers=2: Test Files 144 passed (144), Tests 6858 passed (6858), VERDICT command-exit 0. Round 1's '6853 passed | 5 skipped' were the 5 skipIf cases in lazy-deps.test.ts (2) and runtime-lazy-deps.test.ts (3), which need lint's own dist/. They ran this time, against the rebuilt dist/. [4] pnpm --filter @objectstack/lint typecheck: VERDICT command-exit 0, with 'check:test-typecheck: OK — ... 2 file(s) / 6 error(s) / 2 pinned signature(s) held'. No ablation this round: the diff is a comment and changes no tested behaviour. Round 1's ablation, on the message, stands.", "gates": "Local subset: node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack with no paths, on head f3d1666d9, from merge base 21070a2f0, over 5 paths. The stderr names objectstack-ai/objectstack at f3d1666d9, and --repo holds. 64 commands, the same set as round 1. Each ran with its exit code captured before any pipe. 62 exited 0, check:docs-transcript-drift among them: '4 declared transcript value(s) across 417 page(s) under content/docs/ equal what the registry derives today, and no undeclared block quotes one'. NOT MEASURED, exit 3 PREREQUISITE NOT MET: pnpm check:dual-build-cjs-loads (every package's dist/) and pnpm check:lean-entry-closure (@objectstack/objectql dist/core.*). Reconciliation: node scripts/pm/dispatch-gates.mjs --ran (the round-2 record) --repo objectstack-ai/objectstack exited 0, printing '64 derived famil(ies) accounted for — 62 run, 2 NOT-MEASURED (2 DERIVED from a recorded exit 3)'. Stale-tree warning from the derivation: the tree is at least 5 commits behind origin/main, and 4 gate inputs changed on main across that range (scripts/check-single-authz-resolver.mjs, scripts/slot-lookup-baseline.json, scripts/check-route-envelope.mjs, one scripts/adr-anchors file). The local readings of those families are the base's copies, and CI's merge-ref readings govern. Main was not merged, per the patch round. CI, PR #24312 check-runs at f3d1666d9 when read: 39 runs, 30 success, 6 skipped, 3 in_progress. Success: Auto Label, Build Core, Check Changeset, Check Documentation Links, Check PR Size, Dogfood Regression Gate, Flag docs affected by code changes, Governed Surface Queue Guard, Lint & Repo Gates, all 8 Lint · * lanes, No other open PR may claim the same issue, No other open PR may claim the same single-writer path, Part-of PR must not also close its card, Test Core (1/6), Test Core (5/6), Test Core (6/6), The card this PR closes must claim this branch, Type Check · consumer gates / debt ledger / source gates / workspace, TypeScript Type Check, filter. Skipped: Build Docs, Console Pin Gate, Dogfood Regression Gate matrix, Dogfood Verify CLI, Packed-tarball smoke (opt-in), Temporal Conformance (live PG + MySQL). in_progress: Test Core (2/6), (3/6), (4/6); the aggregate Test Core context had not been listed yet. 6be194c50's runs were cancelled by this push: 'TypeScript Type Check' reads failure there, from cancelled lanes, and is superseded.", "mcp_calls": "0 — no MCP tool used. Reads went through gh api REST: the #24293 comments and amendment 6249110232, PR #24312 and its body, and the check-runs on both heads.", "api_writes": "1 this round — one fleet-write relay stroke: POST /repos/objectstack-ai/objectstack/dispatches, executed as objectstack-fleet[bot] as POST /repos/objectstack-ai/objectstack/issues/24293/comments (this os-dev-report). The PR body was not PATCHed. git push x1 (6be194c50..f3d1666d9) is not a REST write. Round 1's 2 strokes are reported in comment 6249082332.", "pr_body_edits": [ { "old_str": "| packages/lint/src/authoring-rules.ts:917–:920, the comment above the rule's registration (\"reaches the data engine as a literal and matches nothing. The surface renders empty with no error\") | **left**: the file is outside this card's claimed file surface. See Acceptance notes |", "new_str": "| packages/lint/src/authoring-rules.ts:917–:920, the comment above validateFilterTokens' registration (\"reaches the data engine as a literal and matches nothing. The surface renders empty with no error\"). The comment ships inside @objectstack/lint's dist/index.jsanddist/runtime.js| rewritten inf3d1666, comment text only. The claim's file surface was amended to add it (6249110232). The #3574provenance and the silent-zero history are kept, in the past tense, as in the module header. Before and after are below |\n\nTheauthoring-rules.ts comment before (21070a2, :917–:920):\n\n```text\n // #3574 — a filter value like {current_user} resolves in no vocabulary,\n // reaches the data engine as a literal and matches nothing. The surface\n // renders empty with no error, and a silent zero is indistinguishable from a\n // genuine one at review time.\n```\n\nand after (f3d1666, :917–:921):\n\n```text\n // #3574 — a filter value like {current_user} resolves in no vocabulary. The\n // data engine refuses a query carrying it (FILTER_TOKEN_UNKNOWN, 400). When\n // #3574 was filed it reached the engine as a literal and matched nothing: the\n // surface rendered empty with no error, a silent zero indistinguishable from a\n // genuine one at review time.\n```" }, { "old_str": "On head 6be194c:\n\n- pnpm --workspace-concurrency=2 --filter '@objectstack/lint^...' build: VERDICT command-exit 0.\n- pnpm --filter @objectstack/lint exec vitest run --maxWorkers=2: Test Files 144 passed (144), Tests 6853 passed | 5 skipped (6858).", "new_str": "On head f3d1666(round 1's6be194c, plus the authoring-rules.tscomment commit):\n\n-pnpm --workspace-concurrency=2 --filter '@objectstack/lint...' build(lint and its build closure):VERDICT command-exit 0. The old sentence's phrases (\"reaches the data engine as a literal\", \"renders empty with no error\", \"sent to the data engine as a literal string\", \"passed to the data engine\", \"matches no record, and the surface renders empty\", \"unresolved placeholder silently matches nothing\") have 0 hits in packages/lint/srcand 0 inpackages/lint/dist. The controls hit: the new comment's \"data engine refuses a query carrying it\" (src 1, dist 4 files) and the new message (dist 4 files).\n- pnpm --filter @objectstack/lint exec vitest run --maxWorkers=2: Test Files 144 passed (144), Tests 6858 passed (6858). The 5 cases that 6be194c's run skipped (6853 passed | 5 skipped) are the skipIfcases inlazy-deps.test.tsandruntime-lazy-deps.test.ts. They need lint's own built dist/, which that run did not have. This time they ran, against the rebuilt dist/." }, { "old_str": "outside the changed files finds only the authoring-rules.tscomment and the negative pin above.", "new_str": "(plus \"reaches the data engine as a literal\") outside the changeset, which quotes the old text as its FROM, finds only the kept first sentence and the negative pin above." }, { "old_str": "Derived on head6be194cwithnode scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, no paths given (change set: these 4 files vs merge base 21070a2). That gives 64 commands, 11 more than the claim's path-only lead of 53. The extra 11 are the changeset-kind families. Each was run with its exit code captured before any pipe, and the record was reconciled with --ran: \"64 derived famil(ies) accounted for — 62 run, 2 NOT-MEASURED (2 DERIVED from a recorded exit 3)\", exit 0.\n\n- 61 exited 0 on the first pass.", "new_str": "Derived on head f3d1666withnode scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack, no paths given (change set: these 5 files vs merge base 21070a2). That gives 64 commands, the same set as on 6be194c, and 11 more than the claim's path-only lead of 53. The extra 11 are the changeset-kind families. Each was run with its exit code captured before any pipe, and the record was reconciled with --ran: \"64 derived famil(ies) accounted for — 62 run, 2 NOT-MEASURED (2 DERIVED from a recorded exit 3)\", exit 0.\n\n- 62 exited 0, pnpm check:docs-transcript-driftamong them, since lint'sdist/was built this time. On6be194c, 61 exited 0 on the first pass." }, { "old_str": "- pnpm check:docs-transcript-driftexited 3 on the first pass (PREREQUISITE NOT MET: nopackages/lint/dist). After pnpm --filter @objectstack/lint buildit exited 0:", "new_str": "-pnpm check:docs-transcript-drift: on 6be194cit exited 3 on the first pass (PREREQUISITE NOT MET: nopackages/lint/dist), then 0 after a lint build. On f3d1666it exited 0:" }, { "old_str": "-origin/main moved 3 commits past the base while this ran (2ee5861, 0c3db0f, 30da04f). None of them touches packages/lint, its build closure, or packages/core/src/utils/filter-tokens.ts. The branch is not merged with them, and CI runs on GitHub's merge ref.", "new_str": "- origin/main has moved past the base (2ee5861, 0c3db0f, 30da04fand later). None of these commits touchespackages/lint, its build closure, or packages/core/src/utils/filter-tokens.ts. The branch is not merged with them, as the patch round directs, and CI runs on GitHub's merge ref. The derivation on f3d1666flags 4 gate inputs that changed onmainacross that range:scripts/check-single-authz-resolver.mjs, scripts/slot-lookup-baseline.json, scripts/check-route-envelope.mjsand onescripts/adr-anchors/ file. Their local readings are of the base's copies, and CI's readings on the merge ref are the ones that count." }, { "old_str": "- **packages/lint/src/authoring-rules.ts:917–:920carries the same false sentence**, in the comment abovevalidateFilterTokens`' registration: "reaches the data engine as a literal and matches nothing. The surface renders empty with no error". It is a code comment, not shipped text. It is left because the file is outside this card's claimed file surface. Either a follow-up commit on this branch after the claim is amended, or a later edit of that file, makes it say what the message now says. Carrier: none.\n",
    "new_str": ""
    }
    ],
    "open_questions": [],
    "out_of_scope_findings": [
    "carrier: 承接者:无 · noted in PR #24312 Acceptance notes, not filed · objectui ValueDataSource (provider: 'value', packages/core/src/adapters/ValueDataSource.ts at objectui 32b492b67) evaluates filters in memory with no placeholder handling, so an unknown {token} there compares as a literal and no engine refuses it. Read-only inference, NOT MEASURED; the message's claim is conditional on a query reaching the engine, so it does not overclaim this door (unchanged from round 1)"
    ]
    }

  7. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    ACCEPT → PR #24312 comment 6249456674 · domain:spec seat 2 · session session_019oFY6Hi35J7atvgVFnmoaK · 2026-10-18T11:38Z · patch round 1 closed at head f3d1666d9; it lands after a fully green head


    Generated by Claude Code

  8. objectstack-fleet commented on Oct 18, 2026

    @objectstack-fleet
    ContributorAuthor

    Landed · PR #24312 → 85be049d54 · domain:spec seat 2 · zhuangjianguo · session session_019oFY6Hi35J7atvgVFnmoaK · 2026-10-18T12:12Z

    probe reading
    PR object merged 2026-10-18T12:12Z out of the merge queue; merge commit 85be049d54015112148f7a075f799ebe44ab2058 on parent 2ce2e36998
    origin/main git merge-base --is-ancestor 85be049d54 origin/main → exit 0
    merged vs reviewed head git diff 2ce2e36998 85be049d54 and the reviewed head f3d1666d95 over its merge base 21070a2f0a share git patch-id --stable c4d4cc47 (ACCEPT 6249456674, after patch round 1)
    queue branch no gh-readonly-queue/main/pr-24312-* ref remains
    mis-close scan the body's only closing keyword is Fixes #24293; the lane's open set is the expected one, less this card

    What now holds on main: filter-token-unknown's message says the data engine refuses a query that carries an unresolvable placeholder (FILTER_TOKEN_UNKNOWN, 400). It no longer says the value matches nothing and the surface renders empty. The rule's module header, the comment above its registration in authoring-rules.ts, and the validate-dataset-references.ts docblock say the same, with the #3574 silent-zero history in the past tense. A test pins the code on both unknown-token arms. A patch changeset on @objectstack/lint, Clause-②: no.

    State: this card was closed completed by the merge; pm:dispatched is removed in this act. The claim (6248725775) ends here. The os-dev subagent's run ended with its report.


    Generated by Claude Code

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

Metadata

Metadata

Assignees

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions