Skip to content

[Decision] 17.4 的新规则指出 21 个字段声明了却没人读——展品该给它们消费者,还是删掉声明 #38

Open

Description

@zhuangjianguo

Ruled: 6396324694 · letter A · 2026-10-25T10:07Z (A = default remove; exceptions per the group table in the ruling comment)
Ruled: 6398275254 · supplement, letter C (keep clm_contract_version.notes, remove clm_signature.notes) · 2026-10-25T13:29:55Z

Unblocked: the 17.7.0 → 18.1.0 upgrade landed as PR #110 (7b736a0).

维护者速读

事情:17.4 把作者期规则从 42 条加到 44 条,其中一条 field-no-consumers 报出本仓 21 个字段「声明了,但这个 stack 里没有任何东西读它或显示它」。门禁全绿(是 warning 不是 error),所以不阻塞任何事 —— 但它指出的东西对一个展品来说是要紧的。

发现于 17.4 升级(#35 / PR #37),当场没有顺手改:在一个依赖升级里替 21 个字段做产品决定是夹带,不是交付。

21 个字段(每个的判定都一样:只有载体,没有消费者 —— 翻译包给了它一个标签,然后没有任何视图、页面或流程读它):

对象 字段
clm_party legal_representative · address · contact_phone · bank_name · bank_account · risk_note · screened_at
clm_signature envelope_id · signers · notes
clm_review comments · internal_note
clm_deviation deviation_text · justification
clm_clause standard_text · fallback_text
clm_obligation evidence · notes
clm_contract_type description · template_placeholders
clm_contract_version notes

为什么要你拍板:这 21 个不是一类东西。clm_party.bank_account 和 contact_phone 是任何 CLM 都真的要有的合同相对方资料,缺的只是一个视图列;clm_signature.envelope_id 是电子签集成落地时才有消费者的字段(卡 12,M4);而 clm_clause.standard_text / fallback_text 是条款库的正文,没人读它意味着条款库今天是个空壳。给消费者还是删声明,得逐组判,而判据是产品要不要这个能力。

你要做的:回一个字母定默认方向,逐字段的执行我按它派发。

选项

做法 代价 / 收益
A(推荐) 默认删声明,只保留能当场点名消费者的字段(含卡 12/13 已排期要用的,正文写明排期即算消费者) 符合 ADR-0049 enforce-or-remove 与创业阶段不扩散;展品从此 declared = enforced。代价:删字段要连翻译包里的载体一起删,且是一次性的批量改动
B 默认给消费者 —— 逐个补进视图列、详情页分区或流程 展品更丰满,21 个字段都变成真能力。代价最大,且其中若干(envelope_id、screened_at)今天没有真实数据来源,补上去就是假能力,正是 AGENTS.md 的 Honest capabilities 禁止的
C 分组处理:相对方资料补消费者,签署/审查的内部字段删声明,条款正文单独判 最贴近事实,但它其实不是一个选项,是「A 和 B 各用在对的地方」。选它等于要我先出一张分组清单再逐组回一次

四棱分析

实际业务需求 — 偏 C,其次 A。这一棱要求实测「谁在写、谁在读」。今天:21 个全都没人读。但写的一侧不一样 —— clm_party 那七个是种子数据真的在写的(相对方档案),clm_signature.envelope_id 与 screened_at 是连写都没人写的纯投机面。所以「有拉动」的只有一部分,把 21 个当一类处理会同时犯两个方向的错。

项目长远合理性 — 偏 A。展品的第一职责是示范正确写法。一个被翻译包命名、被 schema 声明、然后没有任何东西渲染的字段,是在教读者「声明可以不兑现」。ADR-0049 的 enforce-or-remove 就是为这个形状写的,方向是拉回而不是补齐。

防 AI 写错 — 最偏 A,且这一棱最不平衡。展品撒谎等于教每个照抄的 AI 撒谎(本车道章程原话)。而 B 在这里特别危险:给 envelope_id 补一个详情页字段,读者会认为电子签集成已经在跑;给 screened_at 补一个列,读者会认为制裁名单筛查已经在跑。两者都没有。 补消费者去掩盖「没有生产者」,比留着不读更糟 —— 那把一个安静的空声明变成一个会骗人的界面。

创业阶段不扩散 — 明确偏 A。21 个无拉动的声明面按 implementation-first 处置;已发布零消费的能力不因沉没成本获得豁免。本仓 private: true、尚未发布,删除成本是历史最低的一刻。

结论:三棱偏 A,第一棱指出 21 个不同质。拟推荐 A 作为默认方向,并接受第一棱的修正:clm_party 那七个若你认为相对方档案是 V1 该有的,就点名保留并派一张「给它们视图列」的卡 —— 那是 A 的例外,不是 B。⛔ 我没有替你逐字段决定,那 21 个里至少三组是产品能力取舍。

影响

不阻塞。门禁全绿,pnpm validate 只是多 21 条 warning。但每一轮 validate 都会打印它们,新 warning 会很快变成没人看的 warning —— 这是本仓 AGENTS.md「a boot that logs warnings is not a passing boot」那条纪律真正的成本。

⚠️ 坦白一句:这张卡把决策箱从 8 张变成 9 张,而你刚让我清它。我没有把它自裁掉,因为「删 21 个字段还是补 21 个界面」是产品能力取舍,那是代裁的人工地板,不在任何自裁通道里。

关联

#35 / PR #37(发现处)· AGENTS.md → Honest capabilities · ADR-0049 enforce-or-remove · 卡 12(e-sign,envelope_id 的排期消费者)· 卡 13(AI skills)

Activity

  1. zhuangjianguo commented on Oct 25, 2026

    @zhuangjianguo
    CollaboratorAuthor

    Ruling: batch #3 item 3 · letter A · maintainer 「同意」 2026-10-25T10:07:34Z

    裁定:A —— 默认删声明;例外按下面的分组表执行

    维护者在第 3 批决策箱回了「同意」(= 推荐项 A + 分组表)。裁决文档:https://claude.ai/artifact/N1GCqHkEVMy3kneFmVEM8w 。

    鲜度门:正文 2026-09-09T14:44Z,无评论。复测(main 134707e,按字段名 grep src/views src/pages src/flows src/actions;本容器无 node_modules,lint 未重跑):21 个里已有 4 个长出消费者(clm_party.address 在合同详情页,contact_phone、bank_account 在相对方视图,risk_note 在发起流程),剩 17 个;第 1 批已裁 #83 = A(平台电子签连接器,objectstack#25747),clm_signature.envelope_id / signers 从「投机面」变成「已排期有消费者」。录裁前重读,无变化。

    读法提醒:这条 lint 数的是声明的视图 / 页面 / 流程,不数平台默认表单。clm_review.comments 这类是法务在表单里录入的自由文本,「没人读」的意思是没有列表列或详情分区展示它,不是没有生产者。

    分组表(A 的执行清单;lane 在 18.1 上重跑 lint 核实后按它派发)

    组 字段 处置
    ① 已排期有消费者,保留不动 clm_signature.envelope_id、signers(#83-A 电子签连接器 + 回调流程) 正文注明排期卡号即算消费者
    ② 录入性内容,给一个展示面(一张小卡:详情分区或列表列) clm_review.comments、internal_note;clm_deviation.deviation_text、justification;clm_clause.standard_text、fallback_text(条款库正文);clm_obligation.evidence、notes;clm_party.legal_representative、bank_name(与已有消费者的 address/contact_phone/bank_account 同一张档案卡);clm_contract_type.description 有生产者(人在表单里写),补展示面不是假能力
    ③ 无生产者或无排期,删声明(含两套翻译的载体,§03 字段行同步) clm_party.screened_at(制裁筛查不是能力);clm_contract_type.template_placeholders(没有模板填充功能在排期);clm_signature.notes、clm_contract_version.notes(两个对象已有 sys_comment,重复) 将来有功能再加回

    裁后执行

    两张卡:「删组 ③ + 注明组 ① 排期」(含 §03 受管面的字段行同步,随设计文档 PR)与「给组 ② 展示面」。4 个已有消费者的字段应已不在 18.1 的报告里,lane 核实后从清单划掉。

    ⛔ 本席不动标签;lane 席位派发时转标签并带 Ruling-ref:。


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    Contributor

    Out of the decision box — Ruling-ref: comment 6396324694 (batch #3 · letter A · maintainer 「同意」).

    • State: needs-user-decision → pm:blocked, Blocked-by: the 18.1 upgrade PR: the ruling's first step is to re-run the declared-but-unread lint on 18.1.
    • Then two cards per the ruling's group table: remove group ③ (screened_at, template_placeholders, signature.notes, version.notes — §03 rows and translations) and give group ② a display surface; group ① (envelope_id, signers) stays with Card 12 — F8 e-signature connector · F15 HotCRM hand-off behind CLM_COMPOSITION (M4) #83.

    Generated by Claude Code

  3. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    Contributor

    Unblocked: PR #110 (the 18.1 upgrade) merged as 7b736a0. State pm:blocked → pm:queue; dispatch follows its ruling.


    Generated by Claude Code

  4. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 14
    Session: session_017nzWFRUo2U7evMkPdVniAn
    Account: zhuangjianguo (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-38-group2-display
    Worktree: hotclm-issue-38
    Domain: repo:hotclm (single-lane sister repo — no domain:*)
    Seat: repo:hotclm#1
    File surface: src/views/** · src/pages/** and their translation-bundle keys (src/translations/**) — display surfaces for group ② only; ⛔ no object file, no field added or removed — stop on breach; explain in the report
    Container & model: S, mode:subagent, model: opus (TIER_DEFAULT; hand-derived for a sister repo), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: this app's views and pages (declared fields with a producer but no display) | none known | legal, finance and requesters reading review, deviation, clause, obligation and party records
    Thread-read: 6397129172
    Ruling-ref: 6396324694 (batch #3 item 3 · letter A, group table)
    Premise: the lint is re-run by the dev on origin/main a7239e8 (18.1.0); fields that already have a consumer are struck from the list
    Serial constraints cleared: PR #110 merged 7b736a0. In flight: #96 (contract-version.*, hooks.ts), #86 (requester.profile.ts, contract.object.ts) — disjoint. Scope of this branch: group ② (Part of #38). Group ③ deletions and group ① notes follow after #96 lands (contract-version.object.ts overlap); the §03 field-line sync is governed and goes to the maintainer.


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    Contributor

    os-dev-report

    {
      "issue": 38,
      "status": "done",
      "branch": "claude/issue-38-group2-display",
      "pr": null,
      "session": "session_017nzWFRUo2U7evMkPdVniAn",
      "premise_still_valid": false,
      "summary": "Group 2 premise disproved on 18.1.0, so there is no PR and the branch has no commits (HEAD = origin/main a7239e8). The ruling said to re-run the lint on 18.1 first and give a surface only to the group 2 fields it still reports. The field-no-consumers rule (os validate / os lint, author-time rule `validateFieldConsumers`, tier advisory) now reports 0 of the original 21 fields: 0 for group 2, and also 0 for groups 1 and 3. The cause is a rule change, not a change in this repo. In 18.x the rule counts a field's `group` (naming one of the object's `fieldGroups`) as a consumer, because the platform-synthesized record page draws it in that section. Every field here has carried `group` since the scaffold commits. In the browser, all 11 group 2 fields already render with their seeded text on the synthesized record page of their object, in en and zh-CN, and a review opens from the contract page's Review & Deviations tab. That record page is the display surface the ruling asked for, so adding one would duplicate it.",
      "tests": "No code change, so no new tests. (1) Lint re-run on a7239e8: `pnpm validate` exit 0, 6 warnings, all approval-approvers-may-resolve-empty; `os validate --json` rule tally {approval-approvers-may-resolve-empty: 6}, no field-no-consumers; `pnpm lint` exit 0, 6 suggestions, same rule. (2) Control leg, proving the rule runs and showing what credits each field: called `validateFieldConsumers` from @objectstack/lint 18.1.0 on the built dist/objectstack.json. As built: 0 findings. With every field's `group` stripped: 11 findings (clause standard_text/fallback_text; contract_type description/template_placeholders; party legal_representative/address/contact_phone/bank_name/bank_account/risk_note/screened_at). An instrumented copy of the bundle (since deleted) printed each field's consumer sites. The 7 party fields and the clause/contract_type fields are credited ONLY by `objects[i].fields.F.group`. review comments/internal_note, deviation deviation_text/justification and obligation evidence/notes are credited by `group` AND by the `contract` master_detail `inlineEdit` derived inline grid/row form. So the ruling's 4 already-consumed fields were never credited by a view: the party view and contract page mention address/contact_phone/bank_account only in comments, and the party view says they are deliberately absent from its columns. (3) Browser: `PORT=3038 pnpm demo` on a clean .objectstack/data, Playwright on /opt/pw-browsers/chromium-1243, signed in as admin, each record at /_console/apps/clm/OBJ/record/ID. GET /api/v1/data/OBJ returned 200 every time, and the seeded text is in the rendered body, en and zh-CN alike: clm_review comments + internal_note (Outcome section); clm_deviation deviation_text + justification; clm_clause standard_text + fallback_text (zh: 标准表述 / 退让表述 under 立场表述); clm_party legal_representative (Identity) + bank_name (Banking group, collapsed by default, expanded by click); clm_contract_type description. clm_obligation evidence/notes are seeded null, and a group with every field empty is not drawn. After entering notes on one obligation through PATCH /api/v1/data/clm_obligation/ID (admin, 200; local demo DB only), the Progress section shows it (zh label 备注 shown). Click-through: contract 3DlYTILbtDZ-EMHC ?tab=review, clicking the review row opens clm_review/record/-nBDGi2TDu-hqUT- with Comments shown. Browser console: 2 errors per run (one 404 and one 401 resource load at sign-in), the same on every page. Screenshots are kept locally in the dev scratchpad (12 record pages, en and zh, plus the click-through) and not uploaded to GitHub. Non-admin check (requester/finance cannot see internal_note on the synthesized page): NOT MEASURED. It would need a permission set assigned on the local DB, and this run adds no surface: the FLS hidden() grants in requester.profile.ts and finance.profile.ts are unchanged.",
      "gates": "Local, on a7239e8 with an empty diff, each exit code captured before any pipe: pnpm install 0 · pnpm validate 0 · pnpm lint 0 · pnpm typecheck 0 · pnpm lint:i18n-gate 0 (COVERAGE: 0 missing keys across 2 locales). Boot log: the main boot itself, since there is no diff, so no new warnings by construction. It has 6 author-time warnings, 2 boot diagnostics (metadata plugin superseded; the seeder over its 8000ms inline budget) and the known SeedLoader unresolved-user lines that the demo note explains. PR check-runs: none, because no PR was opened.",
      "dogfood_battery": "n/a — no PR, and this repo has no dogfood battery",
      "mcp_calls": "0",
      "api_writes": "1 — POST /repos/objectstack-ai/hotclm/issues/38/comments (this report, via post-stamped). No git push, because the branch has no commits; no pr_create.",
      "open_questions": [
        {
          "question": "With the 18.1 lint reporting none of them, should group 2 still get an additional surface (for example a standard_text column in the clause library list, or deviation_text on the contract page's deviation related list), or is it closed as already displayed?",
          "options": [
            "A: Close group 2 as satisfied by the 18.1 synthesized record pages. No code; the remaining #38 work is group 3 plus the group 1 note.",
            "B: Add list columns or related-list columns anyway, as a product choice rather than a lint fix. Long richtext in a grid column truncates, and it needs a new card with named columns."
          ],
          "recommendation": "A. The ruling's own test was 'if 18.1 still reports it', and it does not. The record page draws every group 2 field in its declared section, so the fields are displayed and readable."
        }
      ],
      "out_of_scope_findings": [
        "Group 3 card input, not filed: on 18.1 the lint does not report screened_at, template_placeholders, clm_signature.notes or clm_contract_version.notes either, because `group` credits them too. Deleting them will not change any lint count, so the group 3 card has to rest on the ruling's no-producer reason, not on the warning. Note also that the synthesized record pages DO draw screened_at (the party Risk section shows Screened At with a seeded date), so today it is a displayed field with no real producer, which is the case the Honest capabilities rule warns about. carrier: the group 3 card of #38 (the PM's follow-up branch after #96)",
        "Ruling freshness-gate correction, noted and not filed: the 4 already-consumed fields were a grep hit on code comments (party.view.ts line 6, contract_detail.page.ts comment text), not consumers. Moot on 18.1. carrier: none — noted only"
      ]
    }

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 14 (second branch on this card, same session)
    Session: session_017nzWFRUo2U7evMkPdVniAn
    Account: zhuangjianguo (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-38-group3-remove
    Worktree: hotclm-issue-38
    Domain: repo:hotclm (single-lane sister repo — no domain:*)
    Seat: repo:hotclm#1
    File surface: src/objects/party.object.ts · contract-type.object.ts · signature.object.ts · contract-version.object.ts · src/data/party.seed.ts · src/data/catalog.seed.ts (comment) · src/translations/** keys of the removed fields · any view/page naming them — stop on breach; explain in the report
    Container & model: S, mode:subagent, model: opus (TIER_DEFAULT; hand-derived for a sister repo), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: this app's declared fields with no producer and no scheduled feature | none known | everyone who reads a party, contract type, signature or version page and sees a field nothing fills honestly
    Thread-read: 6397649898
    Ruling-ref: 6396324694 (batch #3 item 3 · letter A, groups ③ and ①)
    Premise: group ② re-measured on 18.1.0 by the previous branch (report above): the 18.1 lint credits a field's group as a consumer, and every group ② field already renders with its seeded text on its object's record page, en and zh-CN — the display surface the ruling asked for exists, so group ② is satisfied with no code. Group ③ rests on the ruling's no-producer reason, not on a lint count.
    Serial constraints cleared: PR #112 (#96, contract-version.object.ts) merged ef93d9b. In flight: #86 (contract.object.ts, requester.profile.ts), #100 (src/sharing/**, records.profile.ts) — disjoint. DESIGN.md §03 field-line sync is governed — the seat's design-doc PR carries it.


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    Contributor

    os-dev-report

    {
      "issue": 38,
      "status": "needs_decision",
      "branch": "claude/issue-38-group3-remove",
      "pr": "https://github.com/objectstack-ai/hotclm/pull/116",
      "session": "session_017nzWFRUo2U7evMkPdVniAn",
      "premise_still_valid": false,
      "summary": "Partly delivered. Draft PR #116 (head 2a806d9, Part of #38, no closing keyword) removes 2 of the 4 group 3 fields: clm_party.screened_at, plus its party.seed.ts value and the now-unused dayOffset import, and clm_contract_type.template_placeholders. Each field's en and zh-CN bundle keys go with it. The template_file help (description plus both bundles) no longer promises a placeholder list, and the catalog.seed.ts comment is fixed. Group 1 gets a code comment, not a description, on clm_signature.envelope_id and signers naming their scheduled consumer: hotclm#83 with objectstack-ai/objectstack#25747. Nothing read screened_at; screening_status is unchanged. The premise is false for the other two. clm_contract_version.notes has three flow producers: create_record writes notes in src/flows/contract-intake.flow.ts:382, executed-upload.flow.ts:272 and signature-record.flow.ts:321. A write naming a removed field is refused (measured: PATCH clm_party {screened_at} answers 400 INVALID_FIELD), so removing the field breaks those flows unless they are edited. That is outside the file surface and changes behaviour. clm_signature.notes has a seed producer: negotiation.seed.ts:141 writes all 30 rounds, and the record page shows it. Removing it means editing negotiation.seed.ts and the strings/prose files, also outside the surface. I stopped on both, as the dispatch said to; neither is touched. The ruling's sys_comment point does hold: both record pages draw a Discussion panel.",
      "tests": "No unit-test surface: metadata-only app with no test runner. (1) git grep -n -E 'screened_at|template_placeholders' -- src: exit 1, 0 lines (remaining repo hits are DESIGN.md:102 and :289, governed). (2) pnpm demo on a fresh .objectstack/data. main f5ad133: Seed loading completed {inserted:820, updated:0, skipped:0, errored:404, referencesDropped:0}. Branch 2a806d9: identical counts. The WARN/ERROR/⚠ digest of main vs branch differs only in an environment line ('Port 3138 is in use — serving on 3139', my own leftover server). The 404 errors are the known SeedLoader unresolved-user lines (obligation.owner 199, contract.owner_id 120, legal_owner 68, deviation.decided_by 17). No degraded, no 'no such table'. Validate field count is 168, down from 170 on main. (3) Existing DB, measured on 18.1.0: the branch booted on main's seeded DB (screened_at filled on 36 of 40 parties). Boot does not refuse and does not drop. It prints '[schema-drift] clm_contract_type.template_placeholders: column exists in the database but not in metadata (orphaned) — \"os migrate apply --allow-destructive\" to drop it.' and the same for clm_party.screened_at. The seed reports skipped 820, the data stays (count(screened_at) = 36 after boot), GET /api/v1/data/clm_party answers 200 with no screened_at key, and a PATCH naming it answers 400 INVALID_FIELD. os migrate plan (exit 0) lists both under 'Destructive (requires --allow-destructive)' as [drop_column]. (4) Browser: Playwright, Chromium /opt/pw-browsers/chromium-1243/chrome-linux64, admin, en and zh-CN. clm_party 0LOuG6MuFWA8J96K: Risk section = RISK NOTE / SCREENING Clear / ACTIVE (zh 风险说明 / 筛查结果 通过 / 启用), with no Screened At or 筛查时间 on the record page or the Edit form. clm_contract_type 6E-elbUuNbgAGcZ7: the Edit form's Template group shows only the file field plus the new help, en and zh, with no 'placeholder' or '占位符'. The record page draws no Template section because every field in it is empty, the same as on main. clm_signature 3aNgKyEhVx7Ft96W: ENVELOPE ID ENV-70390 and SIGNERS JSON are shown (zh 信封 ID / 签署人). clm_contract_version: NOT MEASURED, because GET answers 200 total 0 (no seeded versions) and the object is untouched. Console: en one 404 resource load at sign-in; zh none.",
      "gates": "Local, on 2a806d9, exit codes captured to files before any pipe: pnpm install 0 · pnpm validate 0 ('✓ Validation passed (861ms)'; 6 warnings, all approval-approvers-may-resolve-empty, same as main) · pnpm lint 0 ('6 suggestion(s)') · pnpm typecheck 0 · pnpm lint:i18n-gate 0 ('COVERAGE : 0 missing keys across 2 locale(s)'). The objectstack dispatch-gates deriver does not apply to this sister repo; hotclm's CI is one job, Validate (.github/workflows/ci.yml). PR check-runs on head 2a806d9: Validate completed success (run 40195372945, push) and Validate in_progress (run 40195486297, pull_request) when this report was written.",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm; this repo has no dogfood battery",
      "mcp_calls": "0",
      "api_writes": "2 — fleet-write relay pr_create (POST pulls + POST issues/116/assignees, request fw-20261025T125750Z-019c2d, read-back identical 9529 bytes, assignee zhuangjianguo) · POST /repos/objectstack-ai/hotclm/issues/38/comments (this report, via post-stamped). Plus git push of claude/issue-38-group3-remove (not a REST write).",
      "open_questions": [
        {
          "question": "Group 3's two notes fields have producers the ruling did not count: three flows write clm_contract_version.notes, and the demo seed writes clm_signature.notes. What should happen to them?",
          "options": [
            "A: Keep both. The ruling's 'no producer' premise is false for them, and they are produced and displayed (group 2's shape). No code; the §03 rows stay.",
            "B: Remove both on a new branch whose file surface adds the three flows, negotiation.seed.ts and the strings/prose files. The flows stop writing the provenance line ('Drafted from the contract type template.' etc.), and the 30 seeded signature notes go.",
            "C: Remove clm_signature.notes only (seed-only producer; the Discussion panel covers what a person would type) and keep clm_contract_version.notes (written by the product's own flows)."
          ],
          "recommendation": "C. A version's notes are written by three of the product's own flows and shown on its record page, which is not a duplicate of a discussion thread. A signature's notes are only demo seed text, and sys_comment covers the human use. If the maintainer wants the ruling taken literally, B costs a small S branch."
        }
      ],
      "out_of_scope_findings": [
        "Noted, not filed: DESIGN.md §03 clm_party row lists verified_at, which party.object.ts does not declare, and omits country_code and screening_status, which it does. carrier: the seat's governed design-doc PR for #38 (listed in PR #116 Acceptance notes item 4)",
        "Noted, not filed: DESIGN.md §08 row 相对方筛查 (line 289) says the connector writes screened_at. carrier: the same governed design-doc PR (Acceptance notes item 3)",
        "Noted, not filed: existing deployments keep orphaned screened_at / template_placeholders columns, flagged at boot by [schema-drift], until 'os migrate apply --allow-destructive'. This is platform behaviour working as designed; demo DBs are rebuilt clean. carrier: none, noted only"
      ]
    }

    Generated by Claude Code

  8. 5 remaining items

  9. zhuangjianguo commented on Oct 25, 2026

    @zhuangjianguo
    CollaboratorAuthor

    Ruling: batch #5 item 5 · letter C · maintainer 「同意」 2026-10-25T13:29:55Z

    C: remove clm_signature.notes only; keep clm_contract_version.notes. This supersedes ruling 6396324694's group ③ for these two fields; the group-③ judgement ("no producer ⇒ remove") is re-applied to what the dev measured (report 6397949072, PR #116):

    • clm_contract_version.notes has three producers in the product's own flows (contract-intake.flow.ts:382, executed-upload.flow.ts:272, signature-record.flow.ts:321, each a provenance line such as "Drafted from the contract type template.") and is shown on the version record page. Produced and displayed = group ② shape. Keep; §03 row stays.
    • clm_signature.notes is written only by the demo seed (negotiation.seed.ts:141, all 30 rounds) and by no flow or action; the signature record page already draws the Discussion panel (sys_comment) for what a person would type. A seed-only producer is the exhibit demonstrating a capability the product does not have. Remove.

    Freshness: body Ruled: line 6396324694; comments through the seat's landing note 6398028831 (2026-10-25T13:07Z); re-read before recording, no change. Verified the four producer lines on main bcf8eb9.

    Lane follow-through: a small branch removing clm_signature.notes from signature.object.ts, negotiation.seed.ts (and its STRINGS.signatureNotes), and both translation bundles; Part of #38. The §03 sync (this field's row, plus the clm_party row drift and §08 line 289 the dev listed) rides the seat's governed design-doc PR. Nothing else on this card needs the maintainer.

    ⛔ The director does not change labels; the lane seat transitions with Ruling-ref:.


    Generated by Claude Code

  10. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 14 (third branch on this card, same session)
    Session: session_017nzWFRUo2U7evMkPdVniAn
    Account: zhuangjianguo (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-38-signature-notes
    Worktree: hotclm-issue-38
    Domain: repo:hotclm (single-lane sister repo — no domain:*)
    Seat: repo:hotclm#1
    File surface: src/objects/signature.object.ts (notes) · src/data/negotiation.seed.ts · src/data/strings.ts · src/data/demo-en/index.ts · src/data/demo-zh/index.ts (signatureNotes) · the field's keys in both translation bundles — stop on breach; explain in the report
    Container & model: S, mode:subagent, model: opus (TIER_DEFAULT; hand-derived for a sister repo), effort: medium
    Clause-②: no
    Metadata-protocol: none
    Responsibility: this app's clm_signature.notes (filled only by demo seed text; a product capability nothing provides) | none known | everyone reading a signature round
    Thread-read: 6398275254
    Ruling-ref: 6398275254 (batch #5 item 5 · letter C) — supersedes 6396324694 group ③ for the two notes fields
    Premise: re-measured by the dev on origin/main bcf8eb9 (18.1.0)
    Serial constraints cleared: PR #116 merged 4efc391. In flight: #20 (contract.object.ts, src/data/** business-unit seed and contract.seed.ts, flows, actions, page, objects.contract / flows bundles) — the demo-locale files may both be touched; whoever lands second rebases. Scope: Part of #38; clm_contract_version.notes stays. The §03 sync rides the seat's governed design-doc PR.


    Generated by Claude Code

  11. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    Contributor

    os-dev-report

    {
      "issue": 38,
      "status": "done",
      "branch": "claude/issue-38-signature-notes",
      "pr": "https://github.com/objectstack-ai/hotclm/pull/121",
      "session": "session_017nzWFRUo2U7evMkPdVniAn",
      "premise_still_valid": true,
      "summary": "Draft PR #121 (head 134ebef, rebased on origin/main 4460d31; Part of #38, no closing keyword) delivers ruling C: clm_signature.notes is removed. That covers the field in signature.object.ts, the seed value in negotiation.seed.ts, the DemoStrings.signatureNotes slot in strings.ts, both demo index entries and imports, and the four SIGNATURE_NOTES strings per locale in demo-en/prose.ts and demo-zh/prose.ts. The plan field SignaturePlan.noteIndex in plan-children.ts goes too; grep showed nothing else read it. The en and zh-CN bundle keys clm_signature.fields.notes are removed as well. clm_contract_version.notes is untouched. No view, page, profile or flow named the field. Two files beyond the claim's list: plan-children.ts was named by the dispatch, and the two prose.ts files hold the constants that only fed STRINGS.signatureNotes, so keeping them would leave dead exports. Both are declared in the PR's Acceptance notes. The rebase over PR #118 conflicted only in the two demo index import lists; the resolution keeps SIGNING_ENTITIES.",
      "tests": "No unit-test surface: metadata-only app with no test runner. (1) git grep -n -E 'signatureNotes|SIGNATURE_NOTES|noteIndex': exit 1, no lines. The remaining notes hits in src/ are contract_version, obligation and payment_plan, plus the three flows' version writes; none is clm_signature. (2) pnpm demo on a clean .objectstack/data. main 4460d31: Seed loading completed {inserted:823, updated:0, skipped:0, errored:404, referencesDropped:0}. Branch 134ebef: identical. Normalised WARN/ERROR digest diff: exit 0. degraded / no such table: 0. The 404 errors are the known unseeded-user deferred refs (obligation.owner 199, contract.owner_id 120, legal_owner 68, deviation.decided_by 17), the same on main. API on the branch: GET clm_signature 200 with 30 rows and no notes key (main: notes on 30/30). meta clm_signature has 18 fields, no notes (main: 19). meta clm_contract_version still has notes. PATCH clm_signature {notes} answers 400 INVALID_FIELD 'Unknown field notes on object clm_signature'. (3) Browser: Playwright on Chromium /opt/pw-browsers/chromium-1243, admin, en-US and zh-CN. Signature 2HOHV660TOTTs4g1 shows no NOTES/备注 label, and Discussion (2) / 讨论 (2) is drawn with its comment box. On main, the equivalent record 1A3mxzcUCDCgFaro shows Execution with NOTES 'Notarisation booked; ...'. Control: no versions are seeded, so a contract version was created via upload plus POST (201). Record VLv_qvT4ymiH_Guf shows NOTES / 备注 with the text in both locales, the same as main. Console is the same set on main and branch: a pre-login 401 get-session in both locales, plus one 404 resource load in en.",
      "gates": "Local, on 134ebef, each exit code captured to its own file before any pipe: pnpm install 0. pnpm validate 0 ('✓ Validation passed (864ms)', 'Data: 11 Objects 167 Fields'; main 4460d31: 168; 6 warnings, all approval-approvers-may-resolve-empty, the same as main). pnpm lint 0 ('6 suggestion(s)'). pnpm typecheck 0. pnpm lint:i18n-gate 0 ('✓ i18n gate', 'COVERAGE : 0 missing keys across 2 locale(s)'). The same four were green on the pre-rebase head b271afc. The objectstack dispatch-gates deriver does not apply to this sister repo; hotclm CI is the single Validate job. PR check-runs on head 134ebef when this report was written: Validate completed success (job 121187927260, run 40199658115, push) and Validate in_progress (job 121188505815, run 40199849752, pull_request).",
      "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm; this repo has no dogfood battery",
      "mcp_calls": "0",
      "api_writes": "2 — fleet-write relay pr_create (request fw-20261025T135524Z-72ee97, run 40199834636 success: POST /repos/objectstack-ai/hotclm/pulls draft plus POST issues/121/assignees; read-back 7408 bytes identical, assignee zhuangjianguo) · POST /repos/objectstack-ai/hotclm/issues/38/comments (this report, via post-stamped). git push of claude/issue-38-signature-notes (empty probe at bcf8eb9, then fast-forward to 134ebef) is not a REST write.",
      "open_questions": [],
      "out_of_scope_findings": [
        "PR body correction for the seat (dev does not PATCH): Acceptance note 3 says 'Completed At still shows in the header'. That holds only for completed rounds, where completed_at is set. A sent round's header shows Method and Status only. Suggested wording: 'Completed At shows in the header once the round has one.' carrier: the seat · noted, not filed",
        "Governed DESIGN.md §03 sync: line 110, the clm_signature row's tail '· executed_file file · completed_at · notes |' becomes '· executed_file file · completed_at |'. carrier: the seat's governed design-doc PR for #38 (listed in PR #121 Acceptance notes item 1)",
        "Noted, not filed: an existing database keeps an orphaned clm_signature.notes column until 'os migrate apply --allow-destructive'. PR #116 measured the same platform behaviour on 18.1; it was not re-measured for this field. carrier: none, noted only"
      ]
    }

    Generated by Claude Code

  12. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    Contributor

    Maintainer-action: merge PR #120 (governed DESIGN.md §03 / §08 sync for this card's rulings — already edited there, including the clm_signature.notes removal).

    Landed — PR #121 · 2026-10-25T14:00Z

    reading value
    PR #121 MERGED, squash 685eb58 on main, merged at its ACCEPT head 134ebef
    authority maintainer, project thread, verbatim: 「你可以自己审核的就自己合并」

    Release: every code step of rulings 6396324694 and 6398275254 is delivered (PRs #116, #121; group ② needed none). What remains is governed text only, in PR #120. State: pm:dispatched → pm:awaiting-maintainer, assignee cleared; PR #120 closes the card when merged (it carries Refs #38 — the seat closes it then).


    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

No one assigned

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions