Skip to content

同 #744 缺陷类:src/views/task.view.ts 两处注释仍立在「列表路径不解析日期宏 / 用户令牌」的过期前提上,且彼此矛盾 #782

Description

@yinlianghui

发现于 #771 的实施过程中(文件面是 src/pages/home.page.ts + content/docs/sales/activities.mdx ×3,不含 src/views/),按「越界即停」单独记录。基线 origin/main = 7667c9b。

现象

#744 / PR #773 订正了四处仍断言「列表数据路径不解析日期宏」的注释(sales.dashboard.ts、revenue.seed.ts、opportunity.view.ts、knowledge_article.view.ts)。src/views/task.view.ts 是同一缺陷类的第五个文件,不在那一轮的文件面里。

两处注释:

  1. todays_tasks(task.view.ts:141-142)

    // Operator-only filter (the view runtime does not interpolate
    // {TODAY()} / {current_user_id} templates). Sort puts urgent at top.

  2. overdue_tasks(task.view.ts:154-160)

    // Honest label: the view layer cannot resolve due_date < {TODAY()}
    // (only {current_user_id} interpolates) and is_overdue is a
    // write-time snapshot that goes stale, so we cannot reliably filter to
    // *strictly* past-due rows here.

三个问题

一、两处注释彼此矛盾。 第 1 处说 {current_user_id} 不插值;第 2 处说「只有 {current_user_id} 插值」。同一个文件,相隔十几行。

二、{current_user_id} 确实解析,实测过。 在 #771 的浏览器验证里用两个临时探针标签页把三种可能分开测了(同一页面、同一对象 crm_task、7 条种子数据全部属于登录的 admin):

探针 filter 结果 排除了什么
owner_id = {current_org_id} 0 行 过滤没有被静默丢弃
owner_id = {current_user_id} 7 行(全部) 不是按字面量比较(字面串匹配不到任何 owner)

两个探针合起来只剩一个解释:令牌被解析成了当前用户 id 并生效。这与 #773 的 changeset 一致——resolveFilterTokens() 自 17.0.0-rc.0 起接在 ObjectQL 读路径上(find / findOne / count / aggregate),已保存视图的 filter 同样覆盖;test/forecast-current-quarter-view.test.ts 在锁定的 17.0.0-rc.2 上跑真实引擎钉住了这一点。

三、{TODAY()} 从来不在令牌词表里,所以「解析不了」的理由也不成立。 词表(@objectstack/core 的 resolveFilterToken)是 current_user_id / current_org_id / now / today / yesterday / tomorrow + 周期令牌 + {N_<unit>_ago|from_now} 参数化宏。规范拼法是 {today};{TODAY()} 会被 classifyFilterToken 判为 unknown 并抛 UnknownFilterTokenError——这正是 #773 在 revenue.seed.ts 上记下的同一个坑({this_quarter_start} 拼错则抛)。

影响范围(为什么打 finding 而不是 bug)

用户今天碰不到:两个视图的行为没有变,注释错的是理由。但它已经产生了一次下游成本——#771 的分诊单据要求「文档如实转述源码注释写明的原因」,如果照抄,这个过期理由就会被搬进面向用户的文档。#771 的 PR 因此只写了视图的口径(未完成任务按最久逾期排序),没有转述理由。

建议修法(不含行为变更)

  1. 按 docs(comments): 订正四处仍断言「列表路径不解析日期宏」的注释(含 stale_articles) #773 的做法订正两处注释:删掉过期的日期宏理由,保留仍然成立的那一半(is_overdue 是写入时快照会过期——这一点由 src/objects/task.hook.ts:68 在 beforeSave 里盖戳证实,仍然成立),并明确写出规范拼法是 {today} 而不是 {TODAY()}。
  2. 订正注释不决定 filter 怎么写。 overdue_tasks 现在可以表达 due_date 早于 {today} 了,但那是行为变更,与 stale_opportunities 的 14 天切分现在可以用 stage_entry_date 表达了 —— 要不要改是行为决策,需单独实测 #770 同属任务视图行为决策,应单独定;本条只管注释。
  3. todays_tasks 的 label 是 📅 My Priority Tasks 而 filter 里没有 owner 条件,「My」与实际口径也对不上——同样是行为/命名决策,一并留给 stale_opportunities 的 14 天切分现在可以用 stage_entry_date 表达了 —— 要不要改是行为决策,需单独实测 #770 那条线,不在本条范围内。

Refs #744、#771、PR #773、#770

Activity

  1. added
    pm:queueReady for the PM dispatch loop
    pm:dispatchedDispatched to a dev agent by /pm-dispatch
    and removed
    pm:queueReady for the PM dispatch loop
    on Aug 5, 2026
  2. self-assigned this
    on Aug 5, 2026
  3. yinlianghui commented on Aug 5, 2026

    @yinlianghui
    CollaboratorAuthor

    PM 分诊 + 🔒 认领(修复线):晋级派发,按 #744→PR #773 的成熟模式做

    与 #744 同缺陷类的第五个文件,修法先例完备(纯注释订正 + 双重机械证明),立即可派。边界:只订正注释,task.view.ts 的任何 label / filter / 行为不动(那是 #770 族的未决决策);{TODAY()} 从来不在词表里(canonical 是 {today},未知 token 抛 UnknownFilterTokenError)与 {current_user_id} 已解析(#784 双探针)两条实测结论作为订正依据。

    认领:session_01VHrPAGEgFDoHjphqYG4BMa,分支 claude/issue-782-task-view-stale-comments,worktree hotcrm-issue-782。文件面:src/views/task.view.ts(仅注释)、changeset(空 frontmatter)。


    Generated by Claude Code

  4. yinlianghui commented on Aug 5, 2026

    @yinlianghui
    CollaboratorAuthor

    ✅ 验收通过 — PR #785 已转 ready 并挂 auto-merge(CI 9/9 绿)。

    判定要点:

    越界发现 #786(平台占位符文法漏诊,仓库守卫比平台诊断严、次序反了)→ PM 已开上游镜像 objectstack#5578,#786 保持 finding 持有(hotcrm 今天碰不到,不阻塞)。#782 随本 PR 关闭。


    Generated by Claude Code

  5. yinlianghui commented on Aug 5, 2026

    @yinlianghui
    CollaboratorAuthor

    更正:上一条验收评论里镜像单号写错了——#786 的上游镜像实际是 objectstack-ai/objectstack#5586(评论里误写为 #5578,该号与本单无关,请以本条为准)。


    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

Labels

findingpm:dispatchedDispatched to a dev agent by /pm-dispatch

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions