Skip to content

Sync the governed design text with the rulings landed on 2026-10-25 (#96 #100 #11 #20 #38 #82) - #120

Merged
os-zhuang merged 17 commits into
mainfrom
claude/design-sync-round14
Nov 4, 2026
Merged

os-zhuang merged 17 commits into
mainfrom
claude/design-sync-round14

Conversation

@objectstack-fleet

@objectstack-fleet objectstack-fleet Bot commented Oct 25, 2026 •

Copy link
Copy Markdown
Contributor

Fixes #96 · Fixes #100 · Fixes #20 — Refs #11 · Refs #38 · Refs #82 · Refs #107 · Refs #109 · Refs #28 · Refs #31 · Refs #133 · Refs #134 · Refs #169 · Refs #43 · Refs #19 · Refs #186 · Refs #152 · Refs #190 · Refs #157 · Refs #64 · Refs #203

⚠️ Governed surface (DESIGN.md §03 / §04, AGENTS.md, docs/design/**): the seat opens it; the maintainer merges it. Every line below is copied from a recorded ruling or from the dev's measured proposal that the ruling assigned to this PR — no new decision is taken here.

What changed

Card · ruling File · place Change
#96 · 6395827965 step 1 DESIGN.md §03 clm_contract_version is_current boolean(每份合同至多一个当前版本:标记一个即取消其余,hook 强制,各入口一致;新的谈判版本默认为当前;final_signed 不夺取当前标记) (code: PR #112)
#96 · same docs/design/00 §5.5 rule, state diagram, guard table 「存在清稿」→「当前版本为清稿」 — the guard contract.hook.ts actually runs
#100 · 6393735625 DESIGN.md §04 permission matrix + sharing table records: R(approved 及之后)U(signing 及之后;执行与归档字段); contract_records_execution row reads the approved read window (code: PR #113, two rules because a rule carries one access level)
#11 · 6395821523 step 1 DESIGN.md §04, after the action-gate line the 门控 × 持有者 table, verbatim from the ruling (code unchanged; matches src/profiles/*.profile.ts)
#20 · 6396457129 step 3 DESIGN.md §03 clm_contract our_entity* lookup sys_business_unit(签约主体:kind = company 且启用的业务单元;演示种子三家) (code: PR #118)
#38 · 6396324694 + 6398275254 DESIGN.md §03 clm_contract_type.template_placeholders removed; 「模板文件和占位符」→「模板文件」; clm_signature.notes removed (ruling C — code: PR #121); envelope_id / signers carry their scheduled consumer (#83 / objectstack-ai/objectstack#25747); clm_party row matches the object (verified_at → country_code and screening_status)
#38 · same DESIGN.md §08 相对方筛查 writes screening_status only (screened_at removed by PR #116)
#107 · 6398591124 (batch 7, lane follow-through) DESIGN.md §13 Q6 the 落实 cell gains a pointer to the ruled HotCRM → CLM category map and selection rule; the 裁定 cell is unchanged (§13 keeps ruled answers as written)
#109 · #20 ruling 6396457129 step 5 DESIGN.md §03 clm_contract department lookup sys_business_unit(发起部门:kind = department,可选;演示种子七个) (code: PR #128)
#134 · 6422705361 (A, finance half) DESIGN.md §04 sharing table contract_finance_routed row: route_finance == true → position clm_finance_controller — read(审批中只读;编辑仍自 approved 起,§13 Q1) (code: PR #153)
#134 · same (A, rung-1 half) DESIGN.md §04 sharing table contract_manager_reports row: the pending direct manager's read comes from the platform from 18.2.0 (objectstack#26180); the app declares no rule (code: none — README by PR #164)
#133 · 6422701531 (A) DESIGN.md §04 permission matrix + FLS table clm_party requester cell RC(不含银行账号与电话;风险标记、风险说明、筛查结果、启用状态与开户行只读); new FLS row for risk_flag · risk_note · screening_status · is_active · bank_name (clm_requester 只读) — the dev's measured proposal (code: PR #154)
#31 · 6396322580 (C; 1C + 2B stand) DESIGN.md §02 Insights row, §09 dataset + 法务工作台 bullets and the durations paragraph, §12 gap table durations delivered on the 18.2.0 duration measure; 平均审批周转 replaces 审批吞吐; per-type 「超 SLA」 now delivered too: §03 gains review_sla_days_offset (a platform stored expression, 0 - record.contract_type.review_sla_days), the workbench tile becomes 审查超时限 with a per-type bar, the §12 per-type SLA row is removed and the §09 ⛔ sentence now bans only app-side stamping (fa7f612) — the devs' measured proposals (code: PRs #168, #201)
#28 · 6396320437 (D) DESIGN.md §10 last paragraph demo accounts are declared in demoStaff and created by the platform on the demo boot; the roster; the line manager stays a manual step (objectstack#26616) — the dev's measured proposal (code: PR #171)
#169 · triaged defect DESIGN.md §03 clm_contract roll-ups + state-machine note approved_legal_review_count · current_clean_version_count · final_signed_version_count; the three buttons read them through disabled, the hook still refuses — the dev's measured proposal (code: PR #173)
#43 · 6395823636 (A) DESIGN.md §04 action-gate line + holders table, §06 F16 row new backfill_contract gate (records, legal, admin) on the F16 action and the executed_upload flow; the dialog asks for the business owner owner_id, and legal still sets legal_owner on the record — the dev's measured proposal (code: PR #177)
#19 · 6396327991 (D) · #186 · seat call DESIGN.md §10 clm_contract_version and clm_review rows the 300 versions carry demo PDFs via seedFile, one current version per contract; seeded reviews are dealt by stage (legal owner, finance or the legal head before approval, legal head, requester) — the devs' measured proposals (code: PRs #185, #189, #193, #194)
#152 · 6607872904 (D) DESIGN.md §03 object map + clm_party / clm_clause row labels, §04 OWD sentence clm_party and clm_clause are public_read_write: rows open to update for everyone, permission sets and field locks still decide who edits what, deletes stay owner-only (code: PR #193)
#190 · 6607878401 (D) DESIGN.md §04 matrix clm_review · clm_finance, §10 review dealing finance records its finance-stage review through the 「记录财务审查」 action (in review / in approval); the seeded finance reviews all sit with the finance controller (code: PR #194)
#157 · 6617239807 (batch 12, A) AGENTS.md naming bullet; DESIGN.md §03 clm_contract_version · clm_review · clm_deviation · clm_signature rows a name composed of select option labels may be a text formula display_name using label(record.FIELD) in the reader's locale (not searchable; only for names nothing searches by their parts) — the ruled text verbatim; the four §03 rows say 公式(按读者语言); §11's 「display_name 镜像」 still holds for obligation and payment plan (code: PR #202)
#107 · 6617236113 (batch 12, A) DESIGN.md §06 F15 row, §08 HotCRM row, §11 M4 row F15 waits for the distribution-model ruling (objectstack#25805 ruled D, deferred, 2026-10-29) and leaves M4; §01 「它不是 HotCRM 的模块」 unchanged (code: none)
#64 · 6617224478 (batch 12, A) DESIGN.md §03 clm_obligation row, §04 OWD paragraph, §06 F10 row owner lookup user → owner_id(负责人,平台所有者); new §04 sentence: the accountable person (owner_id) updates the obligation with read on the parent contract only, and reassigning needs the transfer grant (legal, admin); F10 reminds the owner_id (code: PR #205)
#203 · triaged follow-up of #31 DESIGN.md §06 F3 row F3 reads the stored review_sla_days_offset (the workbench tile's rule), skips a contract whose offset is empty, copies the head of legal at 2× the SLA, one notice per contract per run — the dev's measured proposal (code: PR #206)
#82 · 6393739591 (「AGENTS.md 那句启动告警规则需要维护者补一句豁免」) AGENTS.md boot rule one sentence: the NOT bound — disabled by deployment policy notice under the platform default is by design; pnpm demo binds the sweeps (code: PR #111)

Not here: #11 step 3 (isDefault + declared capabilities) is code only and landed as PR #122.

Gates

Docs only; CI Validate on the head runs pnpm verify's four gates.

Acceptance notes

https://claude.ai/code/session_017nzWFRUo2U7evMkPdVniAn


Generated by Claude Code

@zhuangjianguo
zhuangjianguo force-pushed the claude/design-sync-round14 branch from 2ddf018 to fbe6b74 Compare October 25, 2026 14:05
@zhuangjianguo
zhuangjianguo force-pushed the claude/design-sync-round14 branch from fbe6b74 to 952a079 Compare October 25, 2026 15:22
DESIGN.md §03/§04/§08, docs/design/00 §5.5 and the state-machine guard,
and one AGENTS.md exemption sentence, each copied from a recorded ruling:
#96 (is_current), #100 (records read window), #11 (gate × holder table),
#20 (our_entity lookup), #38 (removed fields, clm_party row drift, e-sign
consumer note), #82 (scheduled-work boot notice).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017nzWFRUo2U7evMkPdVniAn
Refs #107 — ruling 6398591124 lane follow-through: the 落实 cell of Q6
gains a pointer to the category map and selection rule; the ruled
answer itself is unchanged.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017nzWFRUo2U7evMkPdVniAn
Refs #109 — under #20's ruling C (6396457129, step 5): department becomes
a lookup to sys_business_unit filtered to kind department, optional,
seeded with seven departments in the demo.

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017nzWFRUo2U7evMkPdVniAn
…ce half, PR #153)

Ruling 6422705361 (A).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017nzWFRUo2U7evMkPdVniAn
…d-only (#133, PR #154)

Ruling 6422701531 (A).

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017nzWFRUo2U7evMkPdVniAn
… platform (#134, PR #164)

Ruling 6422705361 (A).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017nzWFRUo2U7evMkPdVniAn
…; per-type over-SLA waits on objectstack#26601 (#31, PR #168)

Ruling 6396322580 (C); 1C + 2B stand.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017nzWFRUo2U7evMkPdVniAn
…e platform (#28, PR #171)

Ruling 6396320437 (D).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017nzWFRUo2U7evMkPdVniAn
…can succeed (#169, PR #173)

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017nzWFRUo2U7evMkPdVniAn
#31)

review_sla_days_offset is a platform stored expression on clm_contract
(0 - record.contract_type.review_sla_days); the legal workbench counts
reviews over their own type's SLA. The §12 row for per-type SLA goes,
and the §09 ban on a mirrored SLA column is narrowed to app-side stamping.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017nzWFRUo2U7evMkPdVniAn
, #107)

AGENTS.md: a name composed of select option labels may be a text formula
display_name using label() (ruling 6617239807). DESIGN.md §03: the version,
review, deviation and signature names are formulas in the reader's language
(code: PR #202). §06 F15, §08 HotCRM: waiting on the distribution-model
ruling; §11 M4 drops F15 (ruling 6617236113).

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017nzWFRUo2U7evMkPdVniAn
…r_id (#64)

Ruling 6617224478 (batch 12, A); code: PR #205.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017nzWFRUo2U7evMkPdVniAn
Code: PR #206.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_017nzWFRUo2U7evMkPdVniAn
@os-zhuang
os-zhuang marked this pull request as ready for review November 4, 2026 06:53
@os-zhuang
os-zhuang merged commit 6a7881d into main Nov 4, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment