Skip to content

crm_campaign_member 根本没有 view 元数据,但 event_attendee.view.ts:10 的注释以「campaign_member 有」为立论前提——按该注释自己的推理,营销活动详情页的成员关联列表在裸退化 #944

Description

@yinlianghui

发现自 #938 / PR #942 的实施过程(marketing/index《Where to find things》一节末句把读者指向「营销活动详情页」去看已加入的线索,核实这条路径时读到的)。

基线 origin/main = 11f62429(平台 17.0.0-rc.3)。

事实

src/views/event_attendee.view.ts:5-:16 的文件头注释,把自己存在的理由建立在 crm_campaign_member 上:

A junction object is normally edited inside its parent's related list, and
crm_event_attendee is no exception — but it still needs a grid and a form,
for the same reason crm_campaign_member has them: the related list renders
THIS view's columns, and the quick-create modal renders THIS form. Without
them the panel falls back to every column in declaration order and the
create modal offers the raw autonumber.

但 crm_campaign_member 没有这些 view:

  • ls src/views/ | grep -i campaign → 只有 campaign.view.ts(是 crm_campaign 的,不是成员的)。
  • src/views/index.ts 导出 15 个 view 模块,没有 CampaignMemberViews。
  • grep -rln "crm_campaign_member" src/ --include="*.view.ts" → 只命中 event_attendee.view.ts 自己那句注释。

也就是说,注释里作为「已成立的先例」被引用的那个对象,恰恰是反例。

影响(按注释自己的推理)

如果 event_attendee.view.ts 对机制的描述是准确的——它是本仓对这条渲染路径唯一的成文说明——那么 crm_campaign_member 今天就正处在它描述的退化态:

  • 营销活动详情页的 Campaign Members 关联列表按声明顺序渲染全部字段,而不是策展过的列;
  • 快速新建弹窗把 member_number(autonumber)当作首个可填字段呈现。

我没有在浏览器里实测(本单按派发要求不起 dev server),所以影响一栏是从该注释的断言推导的,不是观测值。接手的人应先跑一次 dogfood 确认退化的具体形态,再决定补 view 还是改注释。

至少可以确定的是:两者必有一错——要么 crm_campaign_member 缺 view 元数据,要么 event_attendee.view.ts:10 的注释在拿一个不存在的先例说事。

与已有单的边界

建议的处置面

补 src/views/campaign_member.view.ts(grid + form,参照 event_attendee.view.ts 的形状),在 src/views/index.ts 导出,并按 src/translations/{en,zh-CN,es-ES,ja-JP}.ts 四语补 view label;或者,若判定关联列表的默认退化可接受,则改掉 event_attendee.view.ts 那句失实的注释。二选一,别两边都放着。

Refs #715 #597 #938 #942

Activity

  1. added
    metadataDeclarative metadata — schema, security posture, UI surfaces
    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 6, 2026
  2. self-assigned this
    on Aug 6, 2026
  3. yinlianghui commented on Aug 6, 2026

    @yinlianghui
    CollaboratorAuthor

    🔒 认领(/pm-dispatch R31)— session session_01VHrPAGEgFDoHjphqYG4BMa,分支 claude/issue-944-campaign-member-views。

    文件面:src/views/(可能新增 campaign_member.view.ts + index.ts 导出)或仅 src/views/event_attendee.view.ts:10 注释——二选一由测量定,元数据单。

    裁定(measure-first):

    1. 先测:①campaign-members 文档三语向读者承诺了什么形态的成员列表;②event_attendee.view.ts 为自己 authored grid+form 的理由(其 :10 注释自述机制)是否同样适用于 campaign_member(字段面、autonumber 首字段问题、关联列表裸渲染);③dist 产物里 campaign_member 相关 view 声明现状。
    2. 默认修法 A:沿 event_attendee 模式补最小 CampaignMemberViews(grid+form),字段选择照抄其取舍逻辑(避开 autonumber 首字段、列出人读的字段),index.ts 导出;若测量发现「无 view」是刻意设计(如有注释/#547 类先例佐证),转修法 B:只修 event_attendee.view.ts:10 的失实注释,并把 A 的理由写成 finding 留档。取舍在 PR 说明。
    3. ⚠️ 本单动 src/**:六道门全跑 + dist 产物结构核对(新增 view 出现在 objectstack.json);无浏览器实测条件,影响推断如实标注(沿 issue 正文姿势);不碰 @objectstack/* 版本、releases/、Campaign member lifecycle: support contacts, live metrics, and trim tracker fields that have no writer #597(成员生命周期 needs-user-decision)不预判。
    4. changeset patch 级;若新增 view 的字段/标签涉 zh 翻译,语言包同步(沿 fix(i18n): 五处 zh-CN help 串按 B1 跟 label 收口 (#846) #859 先例)。

    Generated by Claude Code

  4. yinlianghui commented on Aug 6, 2026

    @yinlianghui
    CollaboratorAuthor

    ✅ 验收通过 —— PR #957 已合并(CI 9/9 全绿实核)。

    验收要点:

    1. measure-first 裁定的教科书执行:premise partial 判得准——事实面成立(全仓无 view),影响面被 Console 产物逐句证伪(关联列表列走 relatedListColumns→highlightFields→启发式,不读 list view;快速新建先剔 autonumber)——「两者必有一错」而错的是注释,修法 B 转向有完整测量支撑。
    2. 不为修而修:认定修法 A「无可测业务拉力且新增无人渲染的表面」——这句判断本身就是本单价值;零元数据变更,产物与基线逐项一致。
    3. 守卫钉在真正承重处:新守卫钉 highlightFields(派生集合 = 有 required crm_ lookup 且无导航项的四对象),反向预判红实测红(2 failed 点名);注释改动无法直接钉住的边界如实标注。

    越界发现处置:#961(文档承诺的 Members 选项卡/四视图/Add Members 流程不存在——「文档对齐产品」还是「产品对齐文档」两条处置面)→ 标 needs-user-decision 入决策箱(第 19 件),这是产品方向判断不由修复线代裁;#964(EventAttendeeViews.list 无消费面,三条处置面)→ finding 留池,dev 已正确标注。


    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

metadataDeclarative metadata — schema, security posture, UI surfacespm: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