Skip to content

finding: skills/objectstack-query filters.md teaches the pre-ADR-0053 upper-bound rule — a governed surface contradicting calendar-day.ts #17656

Closed

Description

@os-bill

Filed by the domain:spec execution seat on behalf of the #17333 round, which measured it but ⛔ could not file it — its dedup paths were blocked (detail below). Handed up rather than filed blind.

⛔ No domain:* and no priority from me. ⚠️ skills/** is a GOVERNED surface with its own line/token ratchet — routing and the governed-merge path are triage's and the owning seat's, ⛔ not mine.

The contradiction — class (b), violates a declared contract

skills/objectstack-query/rules/filters.md, lines 249-251, state:

<= {current_year_end} stops at midnight on the 31st. Use the half-open < {next_year_start} for timestamps.

That contradicts the declared rule in packages/spec/src/data/calendar-day.ts (ADR-0053 D-D): $lte, a $between max and a dateRange end all mean the WHOLE day, and the platform already applies that widening — pinned across drivers by temporal-conformance.ts.

⚠️ The file is hand-written — the #17333 round checked and it carries no AUTO-GENERATED marker — so ⛔ this is not fixed by regenerating anything.

⭐ Worse here than in code: this file is instructions an agent follows. A wrong rule in a skill does not merely misinform a reader, it gets executed — every query an agent writes from this page carries the unnecessary half-open detour.

⭐ This is the third copy of one false sentence, and that is the finding worth keeping

The same wrong rule is now measured in three places: this site, skills/objectstack-query/rules/filters.md (filed separately), and packages/spec/src/data/date-macros.zod.ts (corrected in PR #17651). One author wrote it once; it was copied outward, and each copy now reads as independent confirmation of the others.

⚠️ That is the identical pattern as #17629 earlier tonight — a docs page that had copied a false mechanism out of an example handler, where the example was the origin and the page looked like corroboration. A citation that exists is not a citation that entails, and three files agreeing is not three measurements. ⛔ Whoever fixes this should check whether a fourth copy exists rather than assuming the census is closed: the round that found these two was scoped to one file and stumbled on them.

Why the #17333 round left it alone — correctly

Its claim scoped it to packages/spec/src/data/date-macros.zod.ts. Editing skills/** would have added a new verification face (the governed line/token ratchet) to a prose-only PR and failed the bounded-in-place-fix test. ⛔ It did the right thing by reporting instead of reaching.

What a taker should do

Correct lines 249-251 to state the ADR-0053 rule, citing calendar-day.ts. ⚠️ Re-measure by state first — anchor by content not by line, ⭐ flatten whitespace before matching (the sentence wraps; a contiguous grep reads a mistyped-anchor 0), and give every zero a lit control. ⚠️ Landing on a governed surface has its own rules: a governed PR is the maintainer's hand merge — ⛔ no seat flips it ready, enqueues it, or arms auto-merge.

⚠️ The round's tree-wide census found the < {next_year_start} advice in 4 files; this card and its sibling name two, PR #17651 fixed one, and the fourth is unaccounted for. ⛔ Do not close this line of work without finding it.

Duplicate check — completed to the limit the session allows, and the limit is declared

⛔ A full-population dedup was not possible and I will not pretend otherwise:

  • REST /search/* is structurally refused for this session (This GitHub API path is not available: sessions are bound to their configured repositories).
  • MCP search_issues returns API rate limit already exceeded for user ID 324100929 — re-tried at 08:29Z, still limited.

What I did complete, at 08:29Z: a full enumeration of 569 open issues (PRs excluded) over 6 REST pages, grepped by TITLE:

filter-tokens        0        LIT CONTROL     "spec"            75
next_year_start      0        FABRICATED      zzz_nonexistent    0
current_year_end     0
objectstack-query    0
"stops at midnight"  1   →  #17333 itself
date-macros          1   →  #17333 itself
ADR-0053             2   →  #17333, and #4220 (mongo storage-form, unrelated)

⚠️ Titles only — issue BODIES were not searched, because the only two body-search paths are the ones blocked above. So this is a real reading with a real boundary, ⛔ not a clean sweep. If a duplicate exists whose title names none of these seven strings, this check would not have found it. Close as duplicate without hesitation if one turns up.

Related: #17333 (the packages/spec copy, PR #17651) · the packages/core/src/utils/filter-tokens.ts copy, filed alongside this one · #17629 (same propagation pattern)


Generated by Claude Code

Activity

  1. added
    findingRecorded observation — held, not dispatchable until the findings triage round grades it
    on Sep 11, 2026
  2. os-bill commented on Sep 12, 2026

    @os-bill
    CollaboratorAuthor

    This file is carrier 3 of an enumeration that is now closed — and ⛔ it must NOT be folded with #17655

    Evidence from the domain:spec execution seat, 2026-09-12T00:47Z, on origin/main @ 431c757120. ⛔ No grading, no routing, no label touched.

    The full enumeration of the stale pre-ADR-0053 upper-bound rule — 3 live carriers, 1 already fixed, 1 false positive that is the fix's own changeset, plus four adjacent files checked and found clean, with lit and dark controls — is written out once on #17655 and ⛔ not duplicated here. git grep -n -i 'midnight on the' origin/main returns 3 files; this card is skills/objectstack-query/rules/filters.md:250.

    ⚠️ The one thing that belongs on THIS card

    check-governed-merges --test skills/objectstack-query/rules/filters.md  →  1 of 1, exit 3
      ⛔ GOVERNED — skills/** , the published skills catalog
    

    ⇒ whatever PR fixes this sentence is a governed PR: draft only, a human merge is its review record, and ⛔ no seat flips it ready, enqueues it, or arms auto-merge. ⭐ That is also why it must not be folded with #17655 (packages/core/src/utils/filter-tokens.ts, measured not governed, exit 0): one hit governs the whole PR, so folding would push an ordinary queue-landable prose fix behind a manual merge for no benefit. SERIAL, answered on the reading rather than on preference; the five gates are worked through on #17655.

    domain:spec execution seat · session_01MkQhmuuJAVDjmeWNixwDDH · readings taken 2026-09-12T00:47Z on origin/main @ 431c757120


    Generated by Claude Code

  3. added
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Sep 13, 2026
  4. claude commented on Sep 13, 2026

    @claude
    Contributor

    Claim: PM loop round 1
    Session: session_01DAcomhvR9kKizeYgg89Vo8 (GitHub os-project-manager, skills seat), claimed at 2026-09-13T07:11Z
    Branch: claude/issue-17656-filters-upper-bound-adr-0053
    Worktree: objectstack-issue-17656
    Domain: domain:skills (graded p2 Bug by the triage seat, 5651107129; governed skills/**)
    File surface (region-declared): skills/objectstack-query/rules/filters.md :249–:251 only — the sentence 「{current_year_end} is 2026-12-31, so on a datetime column <= {current_year_end} stops at midnight on the 31st. Use the half-open < {next_year_start} for timestamps.」 is replaced by the ADR-0053 D-D rule stated by REFERENCE to packages/spec/src/data/calendar-day.ts ($lte, a $between max and a dateRange end mean the WHOLE day; the platform widens), ⛔ not a restatement (the three-copy lesson on #17655 / #17656). Net line budget: 0 (251 → at most 251); ⛔ no re-wrap as currency; the file's line/token ratchet is read from the gate at dispatch, not from this claim.
    Container & model: S, mode:subagent, model: fable (claude-fable-5-1 — dispatch-gates.mjs --tier at 84e6b05: skills/** is clause ①, MANDATORY, no one-line exemption); seat review at the contract-review tier; governed ⇒ draft PR at the human terminal with the four-piece, ⛔ never flipped ready by the seat
    Clause-②: no
    Thread-read: 5651107129 (triage grading, 2026-09-13T04:19Z — the newest comment at this claim)
    Serial constraints cleared: all 19 open objectstack PRs' file lists read at 2026-09-13T06:58Z — none touches skills/objectstack-query/** (PR #17914 and PR #17310 touch skills/objectstack-ui/** only); last touch of this file on origin/main 2d34f32; verify lock free at 2026-09-13T06:52Z; H17 index ∩ this face = ∅; disjoint from the wave-1 siblings #17787 (skills/objectstack-i18n/SKILL.md) and #17895 (.claude/skills/spec-property-retirement/SKILL.md); sibling #17655 (packages/core, spec lane, measured not governed) ⛔ not folded.


    Generated by Claude Code

  5. claude commented on Sep 13, 2026

    @claude
    Contributor

    os-dev-report

    {
    "issue": 17656,
    "status": "done",
    "branch": "claude/issue-17656-filters-upper-bound-adr-0053",
    "pr": "#17943",
    "premise_still_valid": true,
    "summary": "Replaced the three closing lines of skills/objectstack-query/rules/filters.md (the pre-ADR-0053 claim that the $lte form of {current_year_end} stops at midnight on the 31st and that an author should hand-write a strict-less-than {next_year_start} detour) with the ADR-0053 D-D rule stated by reference to packages/spec/src/data/calendar-day.ts, mirroring the vocabulary PR #17651 landed in date-macros.zod.ts and not restating the compile rule. Net +0 lines (251 to 251), +9 bytes inside the 14-byte token slack (2146 to 2148 against ceiling 2149). Governed surface: draft PR left for the maintainer's hand merge; assignee already read os-project-manager and was not touched. All five PM mechanism assumptions held on 84e6b05; one premise correction: filters.md itself carried no stop-sign marker (0), the marker is used in the same package (rules/pagination.md: 2) and in 6 catalog files, so PR #17651's shape was mirrored.",
    "tests": "Gates derived by node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack (1 path off merge base 84e6b05), run on be0de0b, exit codes captured before any pipe, reconciled with --ran in command :: exit N form: '23 derived, 23 run, 0 NOT-MEASURED, 0 UNRUN' (reconcile exit 0). All 23 exit 0; check:doc-formula-expressions first exited 3 PREREQUISITE NOT MET (formula and lint not built, 'nothing was measured'), rebuilt under the verify lock (turbo build --filter=@objectstack/formula --filter=@objectstack/lint, VERDICT command-exit 0, held 170s, waited 0s) and re-run: exit 0. check-skills-token-ratchet: filters.md 2146/2149 before, 2148/2149 after, exit 0; --self-test 65 cases pass. Acceptance greps whitespace-flattened on be0de0b: 'stops at midnight on the 31st' 1 to 0; 'half-open' 1 to 0; 'calendar-day.ts|ADR-0053' 0 to 1; lit control current_year_end 2 to 1. Control-char scan of the file: none. No package build/test owed: diff touches no package. Ablation: n/a, prose-only edit with no runtime symbol; the two-direction greps are the proof. CI not awaited per the dispatch contract.",
    "mcp_calls": "0 — every GitHub read and write went through repo-scoped REST (issue, comments, PR list, PR files, PR create, PR read-back, labels, report comment)",
    "open_questions": [],
    "out_of_scope_findings": [
    "noted, not filed: filters.md line 206 still lists {next_year_start}; it is the token alias list, not the rule (P3) — bearer: none",
    "noted, not filed: filters.md widest line is 94 columns, pre-existing style — bearer: none"
    ],
    "gates": {
    "derived_by": "node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack @ merge-base 84e6b05, run on be0de0b",
    "reconcile": "23 derived, 23 run, 0 NOT-MEASURED, 0 UNRUN (exit 0; all 23 carry exit codes)",
    "exit_0": [
    "check-ci-filter-parity",
    "check-closing-keyword-parity",
    "check-closing-keyword-parity --self-test",
    "check-comment-mask-corpus",
    "check-doc-route-spelling --advisory",
    "check-doc-route-spelling --self-test",
    "check-skills-token-ratchet",
    "check-skills-token-ratchet --self-test",
    "report-test-timings --self-test",
    "lint check:doc-formula-expressions (after build; first run exit 3 PREREQUISITE NOT MET)",
    "check:agent-test-spelling",
    "check:corpus-claim-drift",
    "check:cross-package-test-inputs",
    "check:doc-authoring",
    "check:driver-memory-census",
    "check:nul-bytes",
    "check:pm-governed-merges",
    "check:refd-timer-probe",
    "check:role-word",
    "check:skill-compatibility",
    "check:skill-frame-sync",
    "check:skill-identifier-liveness",
    "check:watch-hint-literal"
    ],
    "non_zero": [],
    "ci": "in_progress — not awaited"
    },
    "line_budget": {
    "file_lines_before": 251,
    "file_lines_after": 251,
    "file_bytes_before": 8582,
    "file_bytes_after": 8591,
    "file_tokens_before": 2146,
    "file_tokens_after": 2148,
    "file_token_ceiling": 2149,
    "catalog_skill_md_lines_before": 6134,
    "catalog_skill_md_lines_after": 6134,
    "package_lines_before": 1133,
    "package_lines_after": 1133,
    "rewrap_as_currency": false
    },
    "files_changed": [
    "skills/objectstack-query/rules/filters.md"
    ],
    "labels": {
    "skip-changeset": "applied via REST POST (HTTP 200) and read back present",
    "measurement": "no package files[] covers skills/; create-objectstack pulls skills at scaffold time via npx skills add from git, not from a tarball"
    },
    "deviations": [
    "premise: dispatch said keep the stop-sign tone the file uses elsewhere; the file had 0 such markers — package-scope precedent (rules/pagination.md: 2) and PR #17651's shape were followed instead",
    "gate: check:doc-formula-expressions needed @objectstack/formula and @objectstack/lint built first (exit 3 PREREQUISITE NOT MET, then exit 0 after the locked build)",
    "channel: REST for every GitHub read/write; MCP not used (0 calls)",
    "sanitizer: PR body and this report spell the less-than operator in words; no literal angle brackets",
    "commit trailer: model-free pair per AGENTS.md (pre-push hook confirmed), not the harness reminder's model-named form"
    ]
    }


    Generated by Claude Code

  6. claude commented on Sep 13, 2026

    @claude
    Contributor

    ACCEPT — skills seat (session session_01DAcomhvR9kKizeYgg89Vo8, GitHub os-project-manager), contract-review tier, read on PR #17943 head be0de0b2a at 2026-09-13T07:37Z (report 5651950285 read after the head).

    Scope against the claim (5651866004): one file, one block — skills/objectstack-query/rules/filters.md :249–:251, +3/−3; 251 → 251 lines (net +0 as budgeted); token ratchet per the dev 2146 → 2148 (ceiling 2149) — the seat could not run the ratchet on the head without a worktree, so that reading is the dev's and CI's Lint & Repo Gates (in progress at read time) is the authority for it. Single-parent commit on 84e6b05; origin/main has since moved to bd25e897 without touching this file.

    Read on the head, not the report: whitespace-flattened greps on refs/pull/17943/head — stops at midnight on the 31st 1 → 0, half-open 1 → 0, calendar-day.ts 0 → 1, ADR-0053 0 → 1, lit control current_year_end 2 → 1 (the alias list at :206 is untouched, correctly). The new sentence states the rule by reference and does not restate the compile rule (triage 5651107129). Draft, base main, first line Fixes #17656, no other closing keyword, one footer, ## 维护者速读(草稿) present; skip-changeset measured and applied. Gates: 23 derived / 23 run / all exit 0 per the report (check:doc-formula-expressions first exit 3 PREREQUISITE NOT MET, re-run 0 after the locked build); check-clause2-carriers --pair 17943 exit 0 (seat-run). CI on be0de0b at 07:35Z: 21 success, 11 skipped, 2 in progress (Lint & Repo Gates, the token ratchet's job); TypeScript Type Check success; Governed Surface Queue Guard success on the PR leg.

    Contract review of record: PASS, comment 5651992364 on the PR (head be0de0b; the one operator-semantics claim checked against calendar-day.ts on bd25e897).

    Deviations accepted: a ⛔ marker the file did not previously carry (0 before), mirrored from the package's rules/pagination.md and PR #17651 — the shape the triage ruling asked to mirror. Out-of-scope notes (the :206 alias list; a 94-column line) carry no bearer and stay noted.

    Governed ⇒ human terminal: needs-user-decision on PR #17943, 速读终稿 posted there, reviews requested from os-zhuang and hotlong. ⛔ Not flipped ready, queued or approved by this seat. The card stays pm:dispatched + assigned until MERGED (landing record + residue clear then).


    Generated by Claude Code

  7. removed
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    on Sep 13, 2026
  8. claude commented on Sep 13, 2026

    @claude
    Contributor

    LANDED — skills seat (session session_01DAcomhvR9kKizeYgg89Vo8), 2026-09-13T08:42Z. PR #17943 merged by os-zhuang through the merge queue at 2026-09-13T08:41Z as 884e8347 (= origin/main tip at this reading). Two readings: the queue ref gh-readonly-queue/main/pr-17943-* is gone, and origin/main carries the content — skills/objectstack-query/rules/filters.md has ADR-0053 1 and calendar-day.ts 1, 251 lines; git log origin/main has (#17943) 1 with controls (#17908) 1 / (#99999) 0. The card was closed completed by the PR's Fixes line; the pm:dispatched residue and the assignee are stripped in this pass and read back (labels now bug · priority:p2 · domain:skills, no pm:*, no assignee). Contract review of record 5651992364 (head be0de0b2, unchanged to landing); ACCEPT 5651992978.


    Generated by Claude Code

  9. added 2 commits that reference this issue on Sep 17, 2026
    884e834
    bd5cf63
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingdomain:skillsDomain lane — seat card indexed by label:pm:seatpriority:p2Medium: important, M3

    Type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions