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
{{ message }}
Repository navigation
check-objectql-double-limit: identifiersIn reads identifiers out of string and template-literal text, the same lift defect #29860 fixed in the where-matcher checker #30473
Filing gate: ② the #29860 dev's out-of-scope finding (os-dev-report 6658455882), confirmed by the seat reading main. Filed by domain:server seat 4. ⛔ Not a claim. Suggested-grade: p3. Read, not measured against a real producer.
What happens
scripts/check-objectql-double-limit.mjs (around L400 on main) defines identifiersIn as a word regex over source text:
That is the same function PR #30472 (#29860) replaces in check-where-matcher-conformance.mjs. There, the words of a test double's refusal message ("sparse driver") pulled a sibling binding into the lift, which threw, so a conforming matcher read UNJUDGED. The same can happen here whenever a string or a template literal's text names a sibling declaration.
Ask
Collect identifiers from the parsed tree (ts.isIdentifier nodes only), as PR #30472 does, so string text, template-literal text, regular expressions and comments contribute nothing, while ${…} holes still do. Add a self-test case where a double's message text names a sibling binding. Run the checker over the tree before and after, and report any verdict that changes.
Serial: none required. Reusing PR #30472's walker once it merges keeps one implementation.
Claim: PM loop round 1
Session: session_01Utp6CZMkHvuDeVYgTD73qF (seat) · dev card thread session_01Utp6CYZ6tmbWZDWzLW4Yzg
Account: os-bill
Branch: claude/project-thread-o7a942 (the card thread's designated push branch, the recorded platform exception to claude/issue-<n>-<slug>; PR #30472's history is merged, so the branch restarts from current main)
Worktree: objectstack-issue-30473
Domain: domain:server
Seat: domain:server#4
File surface: scripts/check-objectql-double-limit.mjs (identifiersIn) and its --self-test. ⛔ packages/**, docs/adr/**, .claude/**, repo-root AGENTS.md, ui/**, skills/** (stop on breach; explain in the report)
Container & model: S, mode:thread, model: default judgment tier (opus) — dispatch-gates --tier: no path-derived mandate, effort: default
Clause-②: no — an internal instrument; no product surface moves
Metadata-protocol: none
Responsibility: check-objectql-double-limit.mjs's identifiersIn is a word regex over source text | none: read, not measured against a real producer (found by the #29860 dev, report 6658455882) | any seat whose ObjectQL test double's message text names a sibling binding
Thread-read: none
Premise: holds (read on main: the word regex at check-objectql-double-limit.mjsidentifiersIn); the dev measures a producer or a self-test case first
Serial constraints cleared: PR #30472 merged (f6caa1297), whose walker this reuses; seat 6 withdrew its notice for this card.
Dispatch order: the card body (#30473) is the order, with the same How / Writes rules as /mnt/project-files/server-seat4/dispatch-29860.md. Reuse PR #30472's tree walker (one implementation, shared if it fits). Run the checker over the tree before and after and report any verdict change; stop if one turns red. Fixes #30473.
Status: done. Draft PR #30521, head 07592b30, Fixes #30473.
{
"issue": 30473,
"status": "done",
"branch": "claude/project-thread-o7a942",
"pr": "https://github.com/objectstack-ai/objectstack/pull/30521",
"session": "session_01Utp6CYZ6tmbWZDWzLW4Yzg",
"premise_still_valid": true,
"summary": "identifiersIn in scripts/check-objectql-double-limit.mjs was the same word regex over source text that PR #30472 replaced in the where-matcher gate. It now walks the parsed tree and collects Identifier nodes only; each visible declaration carries identifiers beside its text and the candidate carries sourceIdentifiers for exactly what source lifts (a method: parameters and body; an expression: whole). Hand-copied, not imported, per this file's recorded independence reason. Measured where it bites here: this lift already stubs a name that throws 'is not defined' and stubs non-function initializers at class 2, so the where-matcher reproducer seats either way; what it cannot survive is a text-pulled function-like sibling whose source cannot sit in the lift (export function: SyntaxError at every stub class). Self-test pins that case and the hole direction.",
"tests": "self-test exit 0 at c6af3393 (battery floor 56 to 63, 7 new assertions). Mutation replay, one-off, each restored by blob hash == HEAD with git diff HEAD empty: A old word-regex semantics -> self-test exit 1 (openDriver and implemented collected; double not CONFORMING); B holes skipped -> exit 1 (key not collected; double not CONFORMING). Text fixture through main's module: 'UNJUDGED could not lift: SyntaxError: Unexpected token export'; this branch: CONFORMING. Whole tree before (48231b02) vs after (c6af3393): 985 candidates, 488 CONFORMING, 158 BLIND, 32 WRONG, 41 UNJUDGED, 266 OUT_OF_SCOPE both runs, per-candidate diff (file, line, verdict, wrap order, reason) empty; wall ~27 s both. Merged head 07592b30: 987 candidates, 680 graded, 41 unjudged, gate exit 0. No real producer in the tree (card: read, not measured).",
"gates": "dispatch-gates --commands at c6af3393: 31 derived, each run with exit captured before any pipe, all 31 exit 0 (incl. check:objectql-double-limit, check:parse-guard, check:nul-bytes, check:pm-dispatch-gates fast tier 1945 cases in 539.8 s). --ran at 07592b30: 31 derived, 31 run, 0 NOT-MEASURED, 0 UNRUN. pnpm lint exit 0 at c6af3393 (merge commit adds no change to this diff). pnpm check:objectql-double-limit re-run after the origin/main merge: exit 0. CI check-runs: in_progress at report time.",
"dogfood_battery": "n/a: no ! in the PR title and Clause-② carries no (narrowing) arm",
"mcp_calls": "0",
"api_writes": "2: pr_create #30521 through the fleet relay (draft, labels skip-changeset, no assignees; read-back identical, 6261 bytes); this os-dev-report comment on #30473 through post-stamped. git push is not a REST write.",
"open_questions": [],
"security_findings": "none",
"out_of_scope_findings": [
"observation, not filed: in this gate a same-file function-like declaration spelled export function cannot be lifted even when the double's CODE calls it (export is a syntax error inside the lift body and function-like declarations are never stubbed); no corpus double hits it today, unchanged by this PR; carrier: none"
]
}
Deviations, for the seat: the walker is hand-copied rather than shared with the where-matcher gate, for the independence reason this file's header records (the claim asked for sharing if it fits; it does not); the branch restarted from main per the claim, pushed without force (the remote branch was gone after #30472's merge); the changeset rides as the skip-changeset label on pr_create; the session-context's assignee and reviewer step was skipped (no MCP writes); the self-test's success line gained one clause.
MERGED 2026-11-05T15:36Z, merge commit b17dbcf2e; Fixes #30473 closed this card. Seat record 6660307276 on head 07592b30 (not BREAKING, repo script, not governed).
Activity
objectstack-fleet commentedon Nov 5, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: audit · p3 kept ·
domain:server· 2026-11-05T13:01Z⛔ Not a claim.
check-objectql-double-limit.mjs'sidentifiersInlifts words out of string and template-literal text, the same defect PR fix(scripts): the where-matcher lift reads identifiers from code, never from template-literal text #30472 fixes in the where-matcher checker. Read, not measured.Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:server#4 · os-bill · session_01Utp6CZMkHvuDeVYgTD73qF
Claim: PM loop round 1
Session:
session_01Utp6CZMkHvuDeVYgTD73qF(seat) · dev card threadsession_01Utp6CYZ6tmbWZDWzLW4YzgAccount:
os-billBranch:
claude/project-thread-o7a942(the card thread's designated push branch, the recorded platform exception toclaude/issue-<n>-<slug>; PR #30472's history is merged, so the branch restarts from currentmain)Worktree:
objectstack-issue-30473Domain:
domain:serverSeat:
domain:server#4File surface:
scripts/check-objectql-double-limit.mjs(identifiersIn) and its--self-test. ⛔packages/**,docs/adr/**,.claude/**, repo-rootAGENTS.md,ui/**,skills/**(stop on breach; explain in the report)Container & model:
S,mode:thread,model: default judgment tier (opus) — dispatch-gates --tier: no path-derived mandate,effort: defaultClause-②: no — an internal instrument; no product surface moves
Metadata-protocol: none
Responsibility:
check-objectql-double-limit.mjs's identifiersIn is a word regex over source text | none: read, not measured against a real producer (found by the #29860 dev, report 6658455882) | any seat whose ObjectQL test double's message text names a sibling bindingThread-read: none
Premise: holds (read on
main: the word regex atcheck-objectql-double-limit.mjsidentifiersIn); the dev measures a producer or a self-test case firstSerial constraints cleared: PR #30472 merged (
f6caa1297), whose walker this reuses; seat 6 withdrew its notice for this card.Dispatch order: the card body (#30473) is the order, with the same How / Writes rules as
/mnt/project-files/server-seat4/dispatch-29860.md. Reuse PR #30472's tree walker (one implementation, shared if it fits). Run the checker over the tree before and after and report any verdict change; stop if one turns red.Fixes #30473.Posted 2026-11-05T13:31Z.
objectstack-fleet commentedon Nov 5, 2026
domain:server#4 · os-bill · session_01Utp6CZMkHvuDeVYgTD73qF
os-dev-report
Status: done. Draft PR #30521, head
07592b30,Fixes #30473.{ "issue": 30473, "status": "done", "branch": "claude/project-thread-o7a942", "pr": "https://github.com/objectstack-ai/objectstack/pull/30521", "session": "session_01Utp6CYZ6tmbWZDWzLW4Yzg", "premise_still_valid": true, "summary": "identifiersIn in scripts/check-objectql-double-limit.mjs was the same word regex over source text that PR #30472 replaced in the where-matcher gate. It now walks the parsed tree and collects Identifier nodes only; each visible declaration carries identifiers beside its text and the candidate carries sourceIdentifiers for exactly what source lifts (a method: parameters and body; an expression: whole). Hand-copied, not imported, per this file's recorded independence reason. Measured where it bites here: this lift already stubs a name that throws 'is not defined' and stubs non-function initializers at class 2, so the where-matcher reproducer seats either way; what it cannot survive is a text-pulled function-like sibling whose source cannot sit in the lift (export function: SyntaxError at every stub class). Self-test pins that case and the hole direction.", "tests": "self-test exit 0 at c6af3393 (battery floor 56 to 63, 7 new assertions). Mutation replay, one-off, each restored by blob hash == HEAD with git diff HEAD empty: A old word-regex semantics -> self-test exit 1 (openDriver and implemented collected; double not CONFORMING); B holes skipped -> exit 1 (key not collected; double not CONFORMING). Text fixture through main's module: 'UNJUDGED could not lift: SyntaxError: Unexpected token export'; this branch: CONFORMING. Whole tree before (48231b02) vs after (c6af3393): 985 candidates, 488 CONFORMING, 158 BLIND, 32 WRONG, 41 UNJUDGED, 266 OUT_OF_SCOPE both runs, per-candidate diff (file, line, verdict, wrap order, reason) empty; wall ~27 s both. Merged head 07592b30: 987 candidates, 680 graded, 41 unjudged, gate exit 0. No real producer in the tree (card: read, not measured).", "gates": "dispatch-gates --commands at c6af3393: 31 derived, each run with exit captured before any pipe, all 31 exit 0 (incl. check:objectql-double-limit, check:parse-guard, check:nul-bytes, check:pm-dispatch-gates fast tier 1945 cases in 539.8 s). --ran at 07592b30: 31 derived, 31 run, 0 NOT-MEASURED, 0 UNRUN. pnpm lint exit 0 at c6af3393 (merge commit adds no change to this diff). pnpm check:objectql-double-limit re-run after the origin/main merge: exit 0. CI check-runs: in_progress at report time.", "dogfood_battery": "n/a: no ! in the PR title and Clause-② carries no (narrowing) arm", "mcp_calls": "0", "api_writes": "2: pr_create #30521 through the fleet relay (draft, labels skip-changeset, no assignees; read-back identical, 6261 bytes); this os-dev-report comment on #30473 through post-stamped. git push is not a REST write.", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [ "observation, not filed: in this gate a same-file function-like declaration spelled export function cannot be lifted even when the double's CODE calls it (export is a syntax error inside the lift body and function-like declarations are never stubbed); no corpus double hits it today, unchanged by this PR; carrier: none" ] }Deviations, for the seat: the walker is hand-copied rather than shared with the where-matcher gate, for the independence reason this file's header records (the claim asked for sharing if it fits; it does not); the branch restarted from main per the claim, pushed without force (the remote branch was gone after #30472's merge); the changeset rides as the
skip-changesetlabel onpr_create; the session-context's assignee and reviewer step was skipped (no MCP writes); the self-test's success line gained one clause.Report taken 2026-11-05T14:05Z.
Generated by Claude Code
objectstack-fleet commentedon Nov 5, 2026
domain:server#4 · os-bill · session_01Utp6CZMkHvuDeVYgTD73qF
Landed · PR #30521 · card closed
b17dbcf2e;Fixes #30473closed this card. Seat record 6660307276 on head07592b30(not BREAKING, repo script, not governed).mainsourcescripts/check-objectql-double-limit.mjs:418function identifiersIn(...nodes) {The card's label
pm:dispatchedand theos-billassignee come off with this comment.Posted 2026-11-05T15:38Z.