Skip to content

DESIGN.md §04 gives clm_requester update on its own obligations, and controlled_by_parent refuses it for all 200 — 我负责的履约 is read-only for the audience it is built for #64

Closed

Description

@claude

Ruled: 6617224478 · letter A · 2026-11-03T22:34:37Z (batch #12: the accountable person is the platform owner owner_id; clm_obligation.owner is retired. Unblocked: objectstack#26591 answered through PR #26658, in 18.3.0.)

Earlier: Ruled: 6395825992 · letter D · 2026-10-25T09:14Z (D = platform card in objectstack; added by the director seat beyond A/B/C below). Blocked-by objectstack#25760 → #26591, both closed.

Found while measuring #52, which deals clm_obligation.owner to real accounts for the first time. ⛔ Not introduced by that card — it applies to any requester-owned obligation, and #52 is simply the first change that makes one exist.

The contract

DESIGN.md §04, permission matrix, verbatim:

对象 clm_requester clm_legal clm_finance clm_records clm_admin
clm_obligation RU(本人负责) RCU R R RCUD

U(本人负责) — a requester updates the obligations they are accountable for. §05 puts that list in the 我的合同 group every employee reaches (我负责的履约), and F10 reminds the owner to "Record progress, or mark it done once it is performed."

Measured: the U never arrives, for every row that exists

Clean database, pnpm demo on port 3152, README operator setup performed plus the clm_requester grant #11 is about, re-seeded so the upserts hand the rows over. Signed in as Business Requester 3 over REST:

obligation : Submit the quarterly service report | status pending | owner == me: true
its parent : NDA-2026-0009                       | status active  | owner_id == me: true

POST /api/v1/security/explain {object: clm_obligation, operation: update}  ->  allowed: true

PATCH /api/v1/data/clm_obligation/OBLIGATION_ID {"status":"in_progress"}  ->  403
  {"error":"[Security] Access denied: update on 'clm_obligation' requires edit access to
    its master record (master 'clm_contract' not editable by this user (row-level security))",
   "code":"PERMISSION_DENIED","object":"clm_obligation"}

The account owns the obligation and owns its parent contract, and the object-level explain says yes. The write is still refused.

Why it can never succeed

Two declarations that are each correct alone:

  • clm_obligation is sharingModel: 'controlled_by_parent' (§04 "五个子对象 controlled_by_parent", ADR-0055) — so update on a child requires edit on the master clm_contract row, whatever the child's own row scope says;
  • clm_requester's contract edit window is REQUESTER_EDITABLE_STATUSES = ['draft', 'submitted'] (§04 "本人发起,draft/submitted 可改", src/sharing/_lifecycle.ts).

An obligation is a post-signature commitment: plan-children.ts hangs every one of the 200 off a contract in active / expired / terminated, and the product itself only creates them at F9 (contract_activate). So the two windows are disjoint by construction — there is no state in which a requester holds edit on the parent of an obligation. §04's U(本人负责) on clm_obligation is unreachable for 100% of rows, today and by design.

clm_legal is unaffected and was measured working: Legal Counsel 2 PATCHed one of its own obligations to in_progress and got 200, because contract_legal_all grants edit on every contract.

What this costs

我负责的履约 renders for a requester (measured: 18 open rows for Business Requester 3, navigation groups My Contracts and Analytics), F10's reminder reaches them, and every action the reminder asks for is refused. A read-only to-do list is a worse demo than an empty one, because it looks like it works.

What it is not

⛔ Not a platform bug. controlled_by_parent is doing exactly what ADR-0055 says. The disagreement is between two things this repository declares about itself.

Options, none of which a developer agent should pick

  • A. Change §04: clm_obligation for clm_requester becomes R(本人负责), and the reminder wording, my_obligations and F10's message stop implying the owner can act. Cheapest; concedes that only legal, finance and records ever close an obligation, which contradicts §05's placement of 我负责的履约 in the 我的合同 group.
  • B. Give clm_requester a narrow contract-edit grant on executed contracts they own, scoped by FLS to nothing — enough to satisfy the master check. Keeps §04 and §05 as written; widens a row-level grant for a reason that reads as a workaround, and needs the FLS surface listed field by field.
  • C. Change clm_obligation off controlled_by_parent to private with its own sharing rules. Honours both §04 rows literally; contradicts §04's own OWD sentence and ADR-0055's reason for deriving child access from the parent, and every other child object would ask why not too.

Recommendation: A if 我负责的履约 is a status board, B if it is a work queue. §05's 履约 grid (due_date 升序, unfinished only) and F10's "mark it done once it is performed" both read as a work queue, so B is what the rest of the design already assumes — but the wording that would have to change is §04/§05, which is a governed surface.

Related

#52 (where this was measured) · #11 (the other half of why a requester holds nothing by default) · #28 · #39 / PR #42 (F10 itself, working as built)

Activity

  1. zhuangjianguo commented on Sep 10, 2026

    @zhuangjianguo
    Collaborator

    PM triage — needs-user-decision, and the decision box goes to 9

    Labelled, ⛔ not dispatched. Every one of the three options either edits a governed surface (DESIGN.md §04/§05) or widens a row-level grant to satisfy a check it was not written for. That is not a developer's call, and the card is right to say so rather than picking one.

    Both load-bearing readings independently confirmed

    claim reading
    clm_obligation derives access from its parent src/objects/obligation.object.ts:34 — sharingModel: 'controlled_by_parent'
    a requester may edit a contract only in draft / submitted src/sharing/_lifecycle.ts:44 — REQUESTER_EDITABLE_STATUSES = subset(CONTRACT_STATUSES, ['draft', 'submitted'], …)

    So the disjointness is structural, exactly as the card argues: an obligation exists only under a post-signature contract, a requester holds edit only before signature, and controlled_by_parent routes the child's update through the parent's edit. There is no state in which the two overlap. §04's U(本人负责) on clm_obligation is unreachable for 100% of rows.

    Why this one is worth the maintainer's attention rather than a shrug

    The card names the cost precisely and I want it preserved for the decision batch:

    A read-only to-do list is a worse demo than an empty one, because it looks like it works.

    That is the distinguishing feature. This is not a missing capability — it is a declared capability that renders, gets reminded about by F10, and refuses the one action the reminder asks for. explain even answers allowed: true, because the refusal happens at the master-record check below it, so the platform's own introspection endpoint agrees with §04 right up until the write.

    And it has just become reachable in practice: until #52 (in flight), every obligation was owned by the dev admin, which holds no clm_* set and never opened 我负责的履约 at all. #52 does not cause this — it is the first change that makes a requester-owned obligation exist for anyone to be refused on.

    What I am NOT doing here

    ⛔ No adjudication and no four-prism analysis on this card yet. The tier fuse (CONTRACT_REVIEW_TIER = 'claude-fable-5-1', compared exactly) is not met by this seat, so the director's four duties stay parked — 不裁不清标. This card joins the box and gets its full analysis when the maintainer calls the next decision batch.

    One note for whoever writes that analysis: the card's own recommendation splits on a question the maintainer has effectively already answered elsewhere — is 我负责的履约 a status board or a work queue? §05 orders that grid by due_date ascending and filters to unfinished, and F10's message is "Record progress, or mark it done once it is performed." Both read as a work queue. That points at option B, and option B is the one that keeps §04 and §05 as written — but B widens a row-level grant, which is the kind of thing that wants an explicit ruling rather than an inference.

    Attribution

    Found and written by the dev on #52 while measuring, not by this seat. It measured a REST refusal it did not need to measure to finish its own card, chased it to two declarations that are each individually correct, and stopped at the point where a person has to choose. That is the right shape for a card an agent should not resolve.


    Generated by Claude Code

  2. objectstack-fleet commented on Oct 10, 2026

    @objectstack-fleet
    Contributor

    Evidence from the 17.7.0 browser pass · 2026-10-10T02:46Z — #87, finding 5 (screenshots 092–095 under qa/browser-test-17-7/screenshots/ on branch claude/issue-87-browser-test-17-7).

    Business Requester 1, My Obligations → "Provide the annual security attestation" → mark done:
    PATCH /api/v1/data/clm_obligation/-YpaMcuIEzJyRhnt {"status":"done"} → 403 "requires edit access to its master record (master 'clm_contract' not editable by this user (row-level security))"; the form says "You don't have permission to save this record".

    So this card's measurement holds on 17.7.0 in the browser, for an obligation the requester owns on an active contract: every requester obligation on an in-force contract is unreachable, as the card argued.


    Generated by Claude Code

  3. zhuangjianguo commented on Oct 25, 2026

    @zhuangjianguo
    Collaborator

    Ruling: batch #2 item 3 · letter D · maintainer 「同意」 2026-10-25T09:14:04Z

    裁定:D(新增项)—— 这是平台缺口,立 objectstack 卡,hotclm 等平台

    维护者在第 2 批决策箱回了「同意」(= 推荐项 D)。裁决文档:https://claude.ai/artifact/X4sZxhLrEYshLjkgYp4svr 。D 是本席在正文 A/B/C 之外按维护者 2026-10-25 的规则(「本项目是元数据应用,平台相关的功能应该在平台开发」)新增的选项。

    为什么是平台的事:正文说「不是平台 bug」是对的 —— ADR-0055 §3 在按设计工作(改子记录要求对上级有编辑权;子记录自己的 owner RLS 只 AND 收窄,永不授予)。但「一个有负责人的子记录,负责人能不能改自己那一行」是平台级语义:Salesforce 在 Controlled by Parent 的活动对象上有铁律「Assigned To 对自己那条记录永远有完整权限」;HotCRM 的任务 / 活动挂在客户下、分给只能读客户的销售,会撞上一模一样的墙。objectstack 去重:controlled_by_parent 相关卡 42 张,全是写入门的强制与回归,关于「子记录负责人」语义的为 0。

    ⛔ A(降为只读)削产品,与 §05、F10 的工作队列措辞相反;B 做不到正文写的形状(using 只按状态、FLS 按权限集不按状态,B 实际是让发起人能改自己生效合同的业务字段);C 为回退项,仅当平台答「请用 private」时启用。

    鲜度门:正文 2026-09-10T08:50Z;评论两条,最后一条 2026-10-10T02:47Z(17.7.0 浏览器复现)。main e4997a8 的 obligation.object.ts:34、_lifecycle.ts:44、requester.profile.ts 的两条 RLS 与正文一致。录裁前重读,无变化。

    裁后执行

    1. 本席立 objectstack 卡(类 ③ 平台缺口),回链见下一条评论;本卡 Blocked-by 它。
    2. 平台发布后 hotclm 两处:clm_obligation 加一行声明(形式按平台定),§04 加一句「履约由负责人更新,不要求上级合同可改」(受管面,随设计文档 PR)。
    3. 期间:「我负责的履约」对发起人保持只读,法务不受影响。⛔ 不做应用侧绕路(AGENTS.md → Platform gaps)。
    4. 若平台拒绝(答「请用 private」):回退 C,届时另起一轮呈维护者定 §04 的 OWD 句子。

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


    Generated by Claude Code

  4. zhuangjianguo commented on Oct 25, 2026

    @zhuangjianguo
    Collaborator

    Platform card filed per the D ruling above: objectstack-ai/objectstack#25760 — controlled_by_parent detail row's owner may update their own row with read on the master (opt-in per object). Class ③, unlabelled, awaiting triage there.

    Blocked-by: objectstack-ai/objectstack#25760


    Generated by Claude Code

  5. objectstack-fleet commented on Oct 25, 2026

    @objectstack-fleet
    Contributor

    Out of the decision box — Ruling-ref: comment 6395825992 (batch #2 · maintainer 「同意」).

    • State: needs-user-decision → pm:blocked, Blocked-by: objectstack-ai/objectstack#25760 (controlled-by-parent detail owner may update own row).
    • Meanwhile 我负责的履约 stays read-only for requesters; no app-side workaround. If the platform answers "use private", fallback C goes back to the maintainer.

    Generated by Claude Code

  6. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    Contributor

    Unblocked — 2026-10-27

    upstream state installable here
    objectstack-ai/objectstack#25760 closed fix commit 5e113b3 is an ancestor of tag @objectstack/spec@18.2.0

    main now pins @objectstack/* 18.2.0 (PR #155, merge 21f2319, push CI Validate success), so the fix is installable in this repo. The ruling recorded in the body stands; this card returns to the queue for dispatch. The dev re-measures the premise on main before writing code.

    Note: 18.2's lint already flags obligation_requester_own (security-controlled-by-parent-owner-policy-without-opt-in) on main. Opting in to sharing.controlledByParent.ownerMayEdit is this card's work.

    State: pm:blocked → pm:queue.


    Generated by Claude Code

  7. objectstack-fleet commented on Oct 27, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 17
    Ruling-ref: 6395825992
    Session: session_017nzWFRUo2U7evMkPdVniAn
    Account: zhuangjianguo (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-64-obligation-owner-may-edit
    Worktree: hotclm-issue-64
    Domain: repo:hotclm (single-lane sister repo — no domain:*)
    Seat: repo:hotclm#1
    File surface: src/objects/obligation.object.ts (the controlledByParent.ownerMayEdit opt-in) · src/profiles/requester.profile.ts (only if the opt-in needs the policy touched) — §04 sentence rides the seat's design-doc PR #120 — 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 obligation sharing (an owner updates their own obligation) | objectstack-ai/objectstack#25760 shipped in 18.2.0 | every requester who performs an obligation
    Thread-read: 6437385561
    Premise: re-measured by the dev on origin/main 21f2319 (@objectstack 18.2.0) with README personas first
    Serial constraints cleared: Unblocked 2026-10-27 (18.2.0 on main); it also clears 18.2's new lint warning on obligation_requester_own; round 17 dispatches #134, #127, #64 and #159 together on disjoint files.


    Generated by Claude Code

  8. 5 remaining items

  9. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    Contributor

    Platform answered — to the decision box · 2026-11-03

    objectstack#26591 closed through PR #26658 (d434481, an ancestor of @objectstack/spec@18.3.0), and its answer is the second option: lint and gate agree on owner_id only (fix(lint): the controlledByParent owner arm prescribes ownerMayEdit only for an owner_id-keyed policy). main is on 18.3.0 since PR #198. Under the plan recorded on this card (comment 6438164138), moving the accountable column (clm_obligation.owner) onto owner_id is a product decision, so it goes to the maintainer. State: pm:blocked → needs-user-decision.


    Generated by Claude Code

  10. zhuangjianguo commented on Nov 3, 2026

    @zhuangjianguo
    Collaborator

    Ruling: batch #12 item 1 · letter A · maintainer 「同意」 2026-11-03T22:34:37Z

    裁定:A —— 履约义务的负责人就是平台所有者 owner_id,退役 clm_obligation.owner

    决策箱文档:https://claude.ai/artifact/VTMgyRUKZu1gQChSijSnXD 。前提:objectstack#26591 裁「只认 owner_id,一个所有者概念」(PR #26658,已进 18.3.0,lint 现在直接提示把负责人放进 owner_id);hotclm main fc68eb6 18.3 的第 18 条 lint 警告就是本卡的 obligation_requester_own。本裁取代 10-27 席位记的「迁 owner_id 需裁定」待决项;10-25 的 D 裁定(平台卡)已履行完毕。

    裁后执行(lane 一个 PR)

    1. clm_obligation:删除 owner: Field.user;highlightFields / relatedListColumns 改 owner_id;ownerMayEdit: true 保留;对象注释里「平台所有者不是 owner」那段改写。
    2. obligation_requester_own 改为 owner_id == current_user.id;my_obligations 视图过滤 owner_id;F10 三段提醒 recipients 改 obligation.owner_id;履约 dataset 维度改 owner_id;post-signature.seed.ts / plan-children.ts 把负责人写进 owner_id(系统写入);F9 续签义务 owner_id = 合同 owner_id(hook 已读到该值)。
    3. clm_legal、clm_admin 在 clm_obligation 上加 allowTransfer: true(改派负责人);clm_requester 加 readOnly(Obligation, ['contract', 'due_date'])。
    4. demo 里「1 条故意无负责人」的 F10 边界用例随 owner 退役(owner_id 不为空),plan-children.ts 注释说明。
    5. 实测(README 人设,18.3.0):发起人 PATCH 自己的义务 status 200、别人的 403、改 contract/due_date 403;法务改派 200;F10 收件人正确。lint 警告 18 → 17(18.3 lint: clm_admin's modifyAllRecords on clm_contract makes its 17 field edit locks inert — the locks are declared but bind no admin #196 另裁)。
    6. 受管文字随席位设计文档 PR:§03 clm_obligation 行 owner lookup user → owner_id(负责人,平台所有者);§04 加一句「履约由其负责人(平台所有者 owner_id)更新,只需能读上级合同,不要求上级合同可改」。

    ⛔ 不取 B(双列同步)、C(再向平台要 ownerField)、D(§04 退回只读)。⛔ 本席不动标签;lane 席位派发时转标签并带 Ruling-ref:。


    Generated by Claude Code

  11. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    Contributor

    Claim: PM loop round 19
    Ruling-ref: 6617224478
    Session: session_017nzWFRUo2U7evMkPdVniAn
    Account: zhuangjianguo (the seat's linked user as GET /user answers it; the card's assignee)
    Branch: claude/issue-64-owner-id
    Worktree: hotclm-issue-64
    Domain: repo:hotclm (single-lane sister repo — no domain:*)
    Seat: repo:hotclm#1
    File surface: src/objects/obligation.object.ts · src/objects/contract.hook.ts (F9 renewal obligation owner_id) · src/profiles/{requester,legal,admin}.profile.ts (clm_obligation entries and obligation_requester_own only) · src/views/obligation.view.ts · src/flows/obligation-due.flow.ts · src/datasets/obligation.dataset.ts · src/email-templates/obligation-due.email-template.ts · src/data/{post-signature.seed.ts,plan-children.ts,keys.ts} · src/pages/contract_detail.page.ts (obligation columns only) · src/translations/{en,zh-CN}/ (the retired owner keys) · README (obligation owner lines) — 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 obligation accountability (requester updates the obligations they own) | objectstack-ai/objectstack#26591 answered owner_id-only (18.3.0) | requesters, legal
    Thread-read: none
    Premise: re-measured by the dev on origin/main dfa5d67 (@objectstack 18.3.0) with the declared demo staff
    Serial constraints cleared: batch 12 ruled 2026-11-03T22:34:37Z. Dispatched together with #196, which edits only the clm_contract entry and header comment of admin.profile.ts; the second PR to land rebases.


    Generated by Claude Code

  12. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    Contributor

    os-dev-report

    {
      "issue": 64,
      "status": "done",
      "branch": "claude/issue-64-owner-id",
      "pr": "https://github.com/objectstack-ai/hotclm/pull/205",
      "session": "session_017nzWFRUo2U7evMkPdVniAn",
      "premise_still_valid": true,
      "summary": "Built ruling 6617224478 (A). clm_obligation.owner is retired; owner_id is declared like clm_contract's (label Owner/负责人, group obligation) and is now what highlightFields, relatedListColumns, obligation_requester_own (owner_id == current_user.id), my_obligations, F10's three stages, the obligation_metrics dimension, the seed (system write) and F9's renewal obligation (= the contract's owner_id) read. clm_legal and clm_admin hold allowTransfer on clm_obligation, and clm_requester holds readOnly(Obligation, ['contract','due_date']). clm_legal also gets open(Obligation, ['contract','due_date']), because legal also holds clm_requester and would otherwise inherit the lock. Both lines are clm_obligation entries in claimed files. The deliberately unowned demo obligation and leaveUnassigned are gone, with a plan-children.ts comment saying why. Translations and the README are carried over (requesters' obligations are now 144, 50/54/40). The branch is rebased on main 7e6017a (#196's PR #204); in admin.profile.ts only the clm_obligation entry changed. The relay created PR #205 as a draft although the pr_create op had no draft key; I did not change that.",
      "tests": "18.3.0, pnpm demo:zh on port 3168, throwaway DB per run, declared personas over REST. BEFORE b38df5a: requester3 PATCH on own obligation (提交用量报表, MSA-2026-0015 active) status/notes/done 403 'requires edit access to its master record'; legal reassign owner_id 403 'requires the transfer grant'; owner_id was Dev Admin on all 200. AFTER 2ceb663 and FINAL 56a96ec (rebased on 7e6017a, re-measured in full): owner_id census BR1 50/BR2 54/BR3 40/LC1 29/LC2 27, empty 0; requester3 my_obligations 18 rows; own status in_progress 200, notes 200, done 200 (completed_at stamped), done->pending 422 INVALID_STATE; someone else's (owner Legal Counsel 2) 403; own contract re-point 403 (master gate); own due_date 403 'Field write denied [due_date]'; own owner_id change 403 'requires the transfer grant'; Legal Counsel 2 status 200, due_date 200, reassign to requester1 200; CLM admin reassign 200, due_date 200. F10, with the uncommitted cron '* * * * *' override now reverted (git diff HEAD empty): 7 notifications over the week, today and arrears stages, each delivered only to the obligation's owner_id (match 7/7, receipts read signed in as each persona). F9: NDA-2026-0005 activated by Legal Counsel 1 got its renewal obligation owner_id = Business Requester 2, the contract owner. Browser (zh-CN, /opt/pw-browsers/chromium): BEFORE, requester3's drawer showed 负责人 twice (BR3 and Dev Admin) and no 编辑. AFTER, there is one 负责人 and 编辑; 合同 and 到期日 render disabled; the save sent PATCH 200 with toast 履约义务“提供年度安全声明”已更新. Legal Counsel 2's form has 合同 and 到期日 editable; reassigning inline on the full record page via the 负责人 picker sent PATCH owner_id 200 and the header read Business Requester 1; requester3 has no control beside 负责人 there. Console showed only the login-page 404 and 401 lines, the same on both runs. Ablation: none; config-only metadata, no test-pinned behaviour.",
      "gates": "FINAL head 56a96ec, each exit code captured before any pipe: pnpm install 0 · pnpm validate 0 · pnpm lint 0 (0 warnings, 6 suggestions; on b38df5a the same change went 18 -> 17, the 17 being #196's, since removed by PR #204) · pnpm typecheck 0 · pnpm lint:i18n-gate 0 (COVERAGE: 0 missing keys across 2 locale(s)) · CLM_DEMO_SEED=1 pnpm validate 0. PR check-runs on 56a96ec when the report was written: Validate completed success; a second Validate run in_progress.",
      "dogfood_battery": "n/a — sister repo, no `!` in the PR title and no (narrowing) arm",
      "mcp_calls": "0",
      "api_writes": "2 — relay pr_create objectstack-ai/hotclm#205 (run 41737943032, read-back identical 9740 bytes, assignee zhuangjianguo); relay issue comment on #64 (this os-dev-report). git push is not a REST write.",
      "open_questions": [],
      "governed_text_proposal": "For the seat's design-doc PR #120 (ruling step 6). DESIGN.md §03 line 111, clm_obligation row: replace 'owner lookup user' with 'owner_id(负责人,平台所有者)'. §04, after the permission matrix (line 178) or beside the OWD sentence at line 158, add: 「履约由其负责人(平台所有者 `owner_id`)更新,只需能读上级合同,不要求上级合同可改;改派负责人需 transfer 授权(法务、管理员)。」 Optional, §06 F10: 'T-7 与 T-0 提醒义务 owner' could read '提醒义务负责人(owner_id)'.",
      "out_of_scope_findings": [
        "class: none (stale comment, outside the claimed surface) · src/flows/_daily-sweep.ts, the doc comment on notifyRecipients (about line 242), still cites 'an obligation's `owner` is explicitly allowed to be empty' as one reason hasRecipient exists. The code is correct, because F3's legal_owner still needs the edge. Suggested fix: drop the obligation clause. · carrier: 承接者:无 · in the PR's Acceptance notes only",
        "noted: the relay opened PR #205 as a draft although the pr_create op had no draft key (the same behaviour seen on PR #165). I did not touch it."
      ]
    }
  13. objectstack-fleet commented on Nov 3, 2026

    @objectstack-fleet
    Contributor

    Ruling-ref: 6617224478

    Landed — PR #205 · 2026-11-03

    reading value
    PR #205 MERGED (squash on main), merged at its ACCEPT head 56a96ec; Fixes #64 closes this card
    authority batch 12 item 1, letter A, maintainer 「同意」

    Release: a requester can now update the obligations they are responsible for (status, notes, done) without edit rights on the contract, but cannot move the contract or due date; legal and admins reassign the responsible person. Lint on main is at 0 warnings. The §03 / §04 text is on PR #120. State: pm:dispatched removed, assignee cleared.


    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

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions