Repository navigation
A requester updates the obligations they own: the accountable person is the platform owner owner_id - #205
Merged
Conversation
clm_obligation.owner is retired (ruling 6617224478 on #64, letter A): the person accountable for an obligation is its platform owner, owner_id, the one column the controlled_by_parent ownerMayEdit opt-in admits an update on without edit on the contract. obligation_requester_own, my_obligations, F10's recipients, the obligation dataset, the seed and F9's renewal obligation now all key on owner_id. Legal and the CLM administrator hold allowTransfer on clm_obligation, so they can hand an obligation to someone else; a requester cannot, and holds contract and due_date read-only (legal opens both again in its own set). The demo's one deliberately unowned obligation goes with the column. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017nzWFRUo2U7evMkPdVniAn
…quester Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_017nzWFRUo2U7evMkPdVniAn
Contributor
Author
席位核对 — ACCEPT · head
|
| check | reading |
|---|---|
| ruling | batch 12 item 1, letter A (6617224478): the accountable person is the platform owner owner_id; clm_obligation.owner retired |
| shape | draft → main, Fixes #64; rebased on 7e6017a (PR #204), mergeable clean |
| CI on the head | both Validate check-runs success on 56a96ec = PR head.sha |
| scope | 16 files, all inside the claim: owner removed and owner_id declared like the contract's; obligation_requester_own, my_obligations, F10's three stages, the obligation dataset, the seeds and F9's renewal obligation all read owner_id; legal and admin hold allowTransfer; the requester holds readOnly(Obligation, ['contract','due_date']), and legal re-opens those two because it also holds the requester set. Lint on main goes 1 → 0 warnings |
| measured (18.3.0, declared personas) | requester3 on own obligation: status / notes / done 200 (before: 403); someone else's 403; contract 403, due_date 403 「Field write denied」, owner_id 403 (transfer). Legal Counsel 2: status, due_date, reassign 200; admin reassign 200. F10: 7 of 7 notifications reach the obligation's owner_id. F9: the renewal obligation's owner_id = the contract owner. Browser: one 负责人 and an 编辑 button for the requester |
| residuals | the deliberately unowned demo obligation is gone (owner_id is never empty), as ruled. A stale clause in _daily-sweep.ts's notifyRecipients comment still mentions an empty obligation owner; it is left for the next card touching that file. §03 / §04 text is carried on PR #120 |
Landing: under the maintainer's ruling (batch 12, 「同意」 2026-11-03T22:34Z) and merge authorization (project thread: 「你可以自己审核的就自己合并」).
Generated by Claude Code
zhuangjianguo
marked this pull request as ready for review
November 3, 2026 23:20
zhuangjianguo
pushed a commit
that referenced
this pull request
Nov 3, 2026
…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
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Fixes #64
Ruling-ref: 6617224478 (batch #12 item 1, letter A): the person accountable for an obligation is its platform owner
owner_id, andclm_obligation.owneris retired. Platform side: objectstack-ai/objectstack#26591, answered through PR #26658 in 18.3.0 (onlyowner_id, one owner concept).What changed
src/objects/obligation.object.tsowner: Field.userremoved.owner_idis declared the wayclm_contract.owner_idis (Field.lookup('sys_user'),system: true, label Owner / 负责人, groupobligation).highlightFieldsandrelatedListColumnsuseowner_id.ownerMayEdit: truestays. The comment that said the platform owner is not the accountable person is rewritten.src/profiles/requester.profile.tsobligation_requester_own:owner_id == current_user.id.src/views/obligation.view.tsmy_obligationsfilters onowner_id. Theall_obligationscolumn isowner_id.src/flows/obligation-due.flow.tsowner_idand send toobligation.owner_id.src/datasets/obligation.dataset.ts+src/translations/{en,zh-CN}/app.tsobligation_metricsdimension is nowowner_id(name and field).src/data/post-signature.seed.ts,src/data/keys.tsowner_idas a system write.obligationOwnerOfnever returns null.src/objects/contract.hook.tsowner_id= the contract'sowner_id. The hook already read that value.src/profiles/legal.profile.ts,src/profiles/admin.profile.tsallowTransfer: trueonclm_obligation, so legal and the CLM admin can reassign an obligation. In admin.profile.ts only theclm_obligationentry changed; theclm_contractentry and the header are #196's (PR #204). This branch is rebased on it.src/profiles/requester.profile.tsreadOnly(Obligation, ['contract', 'due_date']).src/profiles/legal.profile.tsopen(Obligation, ['contract', 'due_date']). Legal also holdsclm_requester, and only sets that declare a field get a vote on it (_grants.ts). Without this line legal would pick up the requester's lock. The admin needs no such line:modifyAllRecordsonclm_obligationvotes on every field.src/data/plan-children.tsleaveUnassignedmachinery that kept it, are removed. A comment says why:owner_idis never empty, so F10 has no "nobody to tell" row. The shared sweep's edge is still exercised by F3 (UNASSIGNED_IN_REVIEW).src/translations/{en,zh-CN}/objects.lifecycle.tsownerkey moves toowner_id. The label is kept (Owner / 负责人). The help text drops "empty means unassigned" and now says legal or a CLM administrator can reassign.README.mdEvidence: 18.3.0,
pnpm demo:zhon port 3168, a throwaway DB each run, declared personas (password admin123), REST signed in as each personaBEFORE = origin/main
b38df5a. AFTER =2ceb663(pre-rebase). FINAL =56a96ec, rebased on7e6017a, read again in full.owner: BR1 50 · BR2 53 · BR3 40 · LC1 29 · LC2 27 · empty 1.owner_id: Dev Admin on all of them (199, plus one I had just reassigned)owner_id: BR1 50 · BR2 54 · BR3 40 · LC1 29 · LC2 27 · empty 0{status: in_progress}{notes}then{status: done}completed_atstamped{contract: another active contract of theirs}{due_date}{owner_id: requester1}{status}/{due_date}open()line holds){due_date}modifyAllRecordsfrom the admin's contract entry)security/explainclm_obligation updateF10 recipients were read on AFTER, with an uncommitted
cron: '* * * * *'override onobligation_duethat is now reverted (git diff HEADempty, override string count 0). Legal Counsel 1 re-dated two obligations into the today and arrears windows. Receipts were read signed in as each persona:The 23:08 week stage no longer selected 提交用量报表, because requester3 had marked it done at step 1c.
F9 on AFTER: Legal Counsel 1 completed NDA-2026-0005's signature round, F7 filed the final version, and Legal Counsel 1 PATCHed the contract
{status: active}→ 200. The renewal obligation "Renewal decision: 双向保密协议 — 子午线零售集团" has owner_id = Business Requester 2, the contract'sowner_id, not the acting lawyer.Browser (Chromium at /opt/pw-browsers/chromium, zh-CN, signed in as each persona):
负责人showed twice, as Business Requester 3 (theownerfield) and as Dev Admin (owner_id). There was no 编辑, and the menu offered only 添加到收藏, 分享, 整页打开.负责人, Business Requester 3, and has 编辑. In the form, 合同 and 到期日 render disabled. Changing 状态 to 进行中, adding a note and pressing 更新 sentPATCH /api/v1/data/clm_obligation/keqFO3ERadREDNnl {"status":"in_progress","notes":…} -> 200, and the toast read 履约义务“提供年度安全声明”已更新. On the full record page requester3 gets no edit control beside 负责人.PATCH … {"owner_id":"…"} -> 200, and the header then read 负责人 Business Requester 1.no such table.Gates (FINAL head
56a96ec, each exit code captured before any pipe)Acceptance notes
src/flows/_daily-sweep.ts, in the doc comment onnotifyRecipients(about line 242), still cites "an obligation'sowneris explicitly allowed to be empty" as one reasonhasRecipientexists. That file is outside this card's claimed surface, so I left it. The code is unaffected, because F3'slegal_ownerstill needs the edge. Suggested wording: drop the obligation clause.owner_id), so they are unchanged.owner lookup user) and §04 ride the seat's design-doc PR Sync the governed design text with the rulings landed on 2026-10-25 (#96 #100 #11 #20 #38 #82) #120, as the ruling's step 6 says.Generated by Claude Code
🤖 Generated with Claude Code
https://claude.ai/code/session_017nzWFRUo2U7evMkPdVniAn