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
[Decision] Relative dates look only backward: add 下月, 下季度 and 未来 N 天 for forecasting? #30076
The maintainer: 「等我决定的都要立卡,并且从业务的角度给我具体解释和我沟通」 (2026-11-04). Measured by the seat on main63b86b385d, on the example CRM unless noted. No domain:* label is set: triage routes this card.
The question
The filter panel's 13 relative dates (#29115) include 本月 and 近 30 天 but nothing ahead. A sales manager's question is usually forward: what closes next month, next quarter, in the next 30 days. #29115 left this out on purpose: "Future-facing presets such as next week: the spec has none, and adding them is a spec change for later."
Governing text: packages/spec/src/data/date-range-presets.ts:42-49. The macros already exist in the client: next_month_start, next_quarter_start (ui/packages/core/src/utils/date-macros.ts:129-132).
Whether the server's macro resolver accepts these three end macros, or a rolling forward window. Check first: the client list holds start macros, and a window also needs its end.
The maintainer, 2026-11-04: 「30079这种不是应该在元数据应用中自己去开发自定义操作吗?你的意见是批量换负责人放到内核吗?其他全部同意」.
Ruling: option A. Add 下月, 下季度 and 未来 30 天 to the spec's preset table. First confirm the server resolves the macros these need, including the window ends, as this card notes. needs-user-decision is removed; triage routes this card.
Read fresh. The ruling recorded on this card (A, 「其他全部同意」) is the scope. Add 下月, 下季度 and 未来 30 天 to the spec's relative-date preset table, after confirming the server resolves their macros, including the window ends. New preset values in the protocol, so p1 under 「协议新增定 p1」.
Claim: PM loop round 13 (p1)
Session: session_01WGufzfgvGexKn9vLHsy89K
Account: os-support-ai
Branch: the card thread's own claude/project-thread-* branch, named in the dev's hand-back and restated in a later claim (a measured platform exception to claude/issue-30076-…)
Worktree: objectstack-issue-30076
Domain: domain:spec
Seat: domain:spec#3
File surface: packages/spec/src/data/date-range-presets.ts (DATE_RANGE_PRESETS, DATE_RANGE_PRESET_MACRO_WINDOWS) and its tests, the spec ledgers a new enum value moves, and the server readers that must resolve every declared preset: packages/core/src/utils/analytics-date-range.ts (with its conformance file) and the analytics closed-vocabulary pins. The ui readers (ui/packages/core/src/utils/dashboard-filters.ts, ui/packages/components/src/custom/filter-builder.tsx) are measured, and a domain:ui follow-up is filed if they keep their own list. ⛔ Not the existing 13 windows' extents, and not date-macros.zod.ts's token grammar unless the measurement shows that a needed end token is missing.
Container & model: M, mode:thread, model: TIER_DEFAULT, effort: high
Clause-②: yes (widening: three new accepted preset values)
Metadata-protocol: added (new accepted values on an authorable enum; the dev confirms with check-changeset-no-major)
Responsibility: n/a — not a defect card
Thread-read: 6631304039
Premise: holds. At origin/mainf6f663a8, DATE_RANGE_PRESETS holds the 13 names and nothing forward. date-macros.zod.ts already declares next_month_start/end, next_quarter_start/end and the parametric {N_days_from_now}. Core's half-open resolver (analytics-date-range.ts) ends this_month at next_month_start. So next_month and next_quarter need an exclusive end there, the month or quarter after next, and the rolling window needs one too. Whether that end resolves is the measurement the ruling asks for first.
Human floor: ruling A on this card (6631151570): add 下月, 下季度 and 未来 30 天 to the spec table only, after confirming the server resolves their macros, including the window ends. ⛔ Not option B's full mirror.
Serial constraints cleared: no open PR touches date-range-presets.ts or analytics-date-range.ts.
Claim: PM loop round 13 (p1), restated with the branch
Session: session_01WGufzfgvGexKn9vLHsy89K
Account: os-support-ai
Branch: claude/project-thread-tg9eh0 (the card thread's own branch, a measured platform exception to claude/issue-30076-…), off origin/mainf68b47ca
Worktree: objectstack-issue-30076
Domain: domain:spec
Seat: domain:spec#3
File surface: packages/spec/src/data/date-range-presets.ts (DATE_RANGE_PRESETS, DATE_RANGE_PRESET_MACRO_WINDOWS) and its tests, the spec ledgers a new enum value moves, and the server readers that must resolve every declared preset: packages/core/src/utils/analytics-date-range.ts (with its conformance file) and the analytics closed-vocabulary pins. The ui readers (ui/packages/core/src/utils/dashboard-filters.ts, ui/packages/components/src/custom/filter-builder.tsx) are measured, and a domain:ui follow-up is filed if they keep their own list. ⛔ Not the existing 13 windows' extents, and not date-macros.zod.ts's token grammar unless the measurement shows that a needed end token is missing.
Container & model: M, mode:thread, model: TIER_DEFAULT, effort: high
Clause-②: yes (widening: three new accepted preset values)
Metadata-protocol: added (new accepted values on an authorable enum; the dev confirms with check-changeset-no-major)
Responsibility: n/a — not a defect card
Thread-read: 6632261612
Premise: holds. At origin/mainf6f663a8, DATE_RANGE_PRESETS holds the 13 names and nothing forward. date-macros.zod.ts already declares next_month_start/end, next_quarter_start/end and the parametric {N_days_from_now}. Core's half-open resolver (analytics-date-range.ts) ends this_month at next_month_start. So next_month and next_quarter need an exclusive end there, the month or quarter after next, and the rolling window needs one too. Whether that end resolves is the measurement the ruling asks for first.
Human floor: ruling A on this card (6631151570): add 下月, 下季度 and 未来 30 天 to the spec table only, after confirming the server resolves their macros, including the window ends. ⛔ Not option B's full mirror.
Serial constraints cleared: no open PR touches date-range-presets.ts or analytics-date-range.ts.
Accepted: PR #30133, head 186fb601. The ACCEPT is 6635125262 and the contract reviews are 6634808446 and 6635074212, all on the PR. It lands through the merge queue.
Follow-ups: #30140 (ui p2, compareTo on a forward window) and #30134 (ui p3, the client macros).
Landed: PR #30133 merged at aa57c760. The spec preset table now holds next_month (下月), next_quarter (下季度) and next_30_days (未来 30 天). Core resolves all three, and the Console labels them in all 10 packs. The card closed by Fixes, and the seat removes pm:dispatched.
Activity
objectstack-fleet commentedon Nov 4, 2026
epic:#26676#1 · zhuangjianguo · session_cdb7a717def74e719988f089fbaa18ff
The maintainer, 2026-11-04: 「30079这种不是应该在元数据应用中自己去开发自定义操作吗?你的意见是批量换负责人放到内核吗?其他全部同意」.
Ruling: option A. Add 下月, 下季度 and 未来 30 天 to the spec's preset table. First confirm the server resolves the macros these need, including the window ends, as this card notes.
needs-user-decisionis removed; triage routes this card.objectstack-fleet commentedon Nov 4, 2026
triage#1 · os-zhuang · session_01AavokzJ5DndAwitDXvKy4U
Path: none
Triage: first-touch audit · p1 ·
domain:spec· 2026-11-04T13:01Z⛔ Not a claim.
Generated by Claude Code
objectstack-fleet commentedon Nov 4, 2026
domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K
Claim: PM loop round 13 (p1)
Session:
session_01WGufzfgvGexKn9vLHsy89KAccount:
os-support-aiBranch: the card thread's own
claude/project-thread-*branch, named in the dev's hand-back and restated in a later claim (a measured platform exception toclaude/issue-30076-…)Worktree:
objectstack-issue-30076Domain:
domain:specSeat:
domain:spec#3File surface:
packages/spec/src/data/date-range-presets.ts(DATE_RANGE_PRESETS,DATE_RANGE_PRESET_MACRO_WINDOWS) and its tests, the spec ledgers a new enum value moves, and the server readers that must resolve every declared preset:packages/core/src/utils/analytics-date-range.ts(with its conformance file) and the analytics closed-vocabulary pins. The ui readers (ui/packages/core/src/utils/dashboard-filters.ts,ui/packages/components/src/custom/filter-builder.tsx) are measured, and adomain:uifollow-up is filed if they keep their own list. ⛔ Not the existing 13 windows' extents, and notdate-macros.zod.ts's token grammar unless the measurement shows that a needed end token is missing.Container & model:
M,mode:thread,model: TIER_DEFAULT,effort: highClause-②: yes (widening: three new accepted preset values)
Metadata-protocol: added (new accepted values on an authorable enum; the dev confirms with
check-changeset-no-major)Responsibility:
n/a — not a defect cardThread-read: 6631304039
Premise: holds. At
origin/mainf6f663a8,DATE_RANGE_PRESETSholds the 13 names and nothing forward.date-macros.zod.tsalready declaresnext_month_start/end,next_quarter_start/endand the parametric{N_days_from_now}. Core's half-open resolver (analytics-date-range.ts) endsthis_monthatnext_month_start. Sonext_monthandnext_quarterneed an exclusive end there, the month or quarter after next, and the rolling window needs one too. Whether that end resolves is the measurement the ruling asks for first.Human floor: ruling A on this card (6631151570): add 下月, 下季度 and 未来 30 天 to the spec table only, after confirming the server resolves their macros, including the window ends. ⛔ Not option B's full mirror.
Serial constraints cleared: no open PR touches
date-range-presets.tsoranalytics-date-range.ts.objectstack-fleet commentedon Nov 4, 2026
domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K
Claim: PM loop round 13 (p1), restated with the branch
Session:
session_01WGufzfgvGexKn9vLHsy89KAccount:
os-support-aiBranch:
claude/project-thread-tg9eh0(the card thread's own branch, a measured platform exception toclaude/issue-30076-…), offorigin/mainf68b47caWorktree:
objectstack-issue-30076Domain:
domain:specSeat:
domain:spec#3File surface:
packages/spec/src/data/date-range-presets.ts(DATE_RANGE_PRESETS,DATE_RANGE_PRESET_MACRO_WINDOWS) and its tests, the spec ledgers a new enum value moves, and the server readers that must resolve every declared preset:packages/core/src/utils/analytics-date-range.ts(with its conformance file) and the analytics closed-vocabulary pins. The ui readers (ui/packages/core/src/utils/dashboard-filters.ts,ui/packages/components/src/custom/filter-builder.tsx) are measured, and adomain:uifollow-up is filed if they keep their own list. ⛔ Not the existing 13 windows' extents, and notdate-macros.zod.ts's token grammar unless the measurement shows that a needed end token is missing.Container & model:
M,mode:thread,model: TIER_DEFAULT,effort: highClause-②: yes (widening: three new accepted preset values)
Metadata-protocol: added (new accepted values on an authorable enum; the dev confirms with
check-changeset-no-major)Responsibility:
n/a — not a defect cardThread-read: 6632261612
Premise: holds. At
origin/mainf6f663a8,DATE_RANGE_PRESETSholds the 13 names and nothing forward.date-macros.zod.tsalready declaresnext_month_start/end,next_quarter_start/endand the parametric{N_days_from_now}. Core's half-open resolver (analytics-date-range.ts) endsthis_monthatnext_month_start. Sonext_monthandnext_quarterneed an exclusive end there, the month or quarter after next, and the rolling window needs one too. Whether that end resolves is the measurement the ruling asks for first.Human floor: ruling A on this card (6631151570): add 下月, 下季度 and 未来 30 天 to the spec table only, after confirming the server resolves their macros, including the window ends. ⛔ Not option B's full mirror.
Serial constraints cleared: no open PR touches
date-range-presets.tsoranalytics-date-range.ts.objectstack-fleet commentedon Nov 4, 2026
domain:spec#3 · os-support-ai · session_01WGufzj9os3R42oiDRwN6HZ
os-dev-report
{ "issue": 30076, "status": "done", "branch": "claude/project-thread-tg9eh0", "pr": "https://github.com/objectstack-ai/objectstack/pull/30133", "head_sha": "f7e8b2034a08adcb10e71b6f7f1d08873dd91ac4", "base_sha": "f68b47cac", "session": "session_01WGufzj9os3R42oiDRwN6HZ", "premise_still_valid": true, "summary": "Draft #30133: DATE_RANGE_PRESETS adds next_month, next_quarter, next_30_days with inclusive windows [{next_month_start},{next_month_end}], [{next_quarter_start},{next_quarter_end}], [{today},{30_days_from_now}]. Core resolves them half-open; next_30_days ends at 31_days_from_now; next_month/next_quarter end by re-anchoring next_*_start on the day it names (seat-approved option A, no new macro token). Seat-lifted ui edits: 3 labels x 10 locale packs, filter-builder English defaults, client resolver next_month_end/next_quarter_end, two count/order pins. Reader fix outside ui: packages/verify dashboard-window fixture days now cover a forward window's future edges. QA checklist item api-backend.date-range-preset-matrix revision 3, expect 16.", "tests": "spec suite 811 files, 24,399 passed (after moving src/ui/dashboard.test.ts 13->16, 14->17); spec typecheck exit 0. core suite 133 files, 2,970 passed; core + lint + verify typecheck exit 0. driver-memory date-range files 49 passed; service-analytics conformance+arity 42, native-sql decline 8; verify dashboard-window 15 (5 red before the fixture-day fix); lint validate-preset-comparands 29; objectql engine-temporal-comparand-door 14; driver-sql calendar-day-upper-bound 18. ui root: 29116, 29115, 4984, en-zh-key-parity 4 files 112 passed (29115 ablation without filter-builder defaults: 4 red).", "gates": "dispatch-gates --commands: 108 derived; --ran 108 run, 0 NOT-MEASURED, 0 UNRUN; 107 exit 0; pnpm check:platform-checklist exit 1 on a main-borne finding only (areas/platform-core.json anchor protocol.ts#assertProtocolCompat, 0 matches on origin/main f68b47ca). check:generated exit 0 at NODE_OPTIONS 6144 (heap crash at 4096). check-changeset-no-major with PR body exit 0. Full packages build 80/80. CI check-runs on #30133 not yet read.", "dogfood_battery": "n/a — widening, no `!`", "mcp_calls": "2 — GitHub MCP reads only (issue_read get + get_comments on #30076); 0 MCP writes", "api_writes": "2 — relay pr_create #30133 (draft, no assignee, no reviewer, no labels); this os-dev-report comment", "open_questions": [], "security_findings": "none", "out_of_scope_findings": [ { "class": "b", "finding": "ui client date-macro resolver lacks next_week_end and next_year_end, both in spec DATE_MACRO_TOKENS; unknown tokens pass through unresolved.", "where": "ui/packages/core/src/utils/date-macros.ts:128-133", "seam": "spec:DATE_MACRO_TOKENS(next_week_end,next_year_end) → renderer:resolveDateMacros", "reach": "a filter authored with {next_year_end} on a console surface reaches client readers unresolved", "carrier": "seat files domain:ui follow-up (seat ruling on this thread)", "dedupe_terms": ["next_week_end", "next_year_end", "date-macros.ts", "resolveDateMacros"] }, { "class": "observation", "finding": "ui/packages/types/src/data-protocol.ts keeps a hand union of preset names that includes undeclared next_year, next_7_days, next_90_days.", "where": "ui/packages/types/src/data-protocol.ts:595-610", "carrier": "none" }, { "class": "main-borne", "finding": "check:platform-checklist reds on areas/platform-core.json anchor packages/metadata-protocol/src/protocol.ts#assertProtocolCompat, which main no longer declares.", "where": "docs/qa/platform-checklist/areas/platform-core.json", "carrier": "none" } ] }Generated by Claude Code
objectstack-fleet commentedon Nov 4, 2026
domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K
Accepted: PR #30133, head
186fb601. The ACCEPT is 6635125262 and the contract reviews are 6634808446 and 6635074212, all on the PR. It lands through the merge queue.Follow-ups: #30140 (ui p2, compareTo on a forward window) and #30134 (ui p3, the client macros).
objectstack-fleet commentedon Nov 4, 2026
domain:spec#3 · os-support-ai · session_01WGufzfgvGexKn9vLHsy89K
Landed: PR #30133 merged at
aa57c760. The spec preset table now holdsnext_month(下月),next_quarter(下季度) andnext_30_days(未来 30 天). Core resolves all three, and the Console labels them in all 10 packs. The card closed byFixes, and the seat removespm:dispatched.Carried:
next_week_endandnext_year_end.Posted 2026-11-04T17:43Z.