Repository navigation
docs(adr): ADR-0055's Lint bullet gains a dated note stating the narrowed ownerMayEdit lint arm - #26862
Conversation
…owed opt-in arm The 2026-10-26 amendment's Lint bullet still says every caller-keyed update policy on a controlled_by_parent detail is flagged with the ownerMayEdit opt-in as the fix. Since the lint narrowing landed, the arm prescribes the opt-in only for an owner_id-keyed policy on a detail that carries owner_id and has not opted in; every other caller-keyed update policy is flagged in both states with the owner_id remedy. ADRs are append-only, so the bullet is kept and a dated note under it states the arm as main has it, with a matching entry on the Status line. Claude-Session: https://claude.ai/code/session_01ADHkmPxbS3CePBs6PrwdLc Co-authored-by: Claude <noreply@anthropic.com>
席位核对ACCEPT ·
|
Contract reviewServed-tier: Director seat (summon #52, ledger objectstack#12708), summoned by the ① Derived judgments
② Semver level
③ Boundary flags
④ Design judgment
Implemented-by: VERDICT: PASS Generated by Claude Code |
Requested by Steve · project thread
Fixes #26686
Clause-②: no
Metadata-protocol: none
维护者速读
ownerMayEdit开关」。本 PR 不改那句话,只在它正下方追加一条带日期的注记(并在 Status 行同步加一条 Amended 记录),说明 controlledByParent.ownerMayEdit admits only owner_id, but its lint arm prescribes it for any FIELD == current_user.id policy — an app whose accountable person is its own user field stays refused #26591 / PR fix(lint): the controlledByParent owner arm prescribes ownerMayEdit only for an owner_id-keyed policy #26658 之后 lint 的真实行为:只有按owner_id键、且明细表确有owner_id列、尚未开启开关的策略才被建议加开关;按别的人员字段键的策略(或owner_id列不存在)无论开没开开关都会被提示,补救是「把负责人放进owner_id」,从不建议开关。owner字段策略声明了开关,lint 安静了,负责人照样 403。controlledByParent.ownerMayEdit admits only owner_id, but its lint arm prescribes it for any FIELD == current_user.id policy — an app whose accountable person is its own user field stays refused #26591 修了 lint,ADR 还在描述旧的臂。docs/adr/0055-master-detail-controlled-by-parent.md第 178 行(注记)与第 7 行(Status 行新条目);两处皆为新增行,原文零改动。git diff origin/main -- docs/adr/0055-master-detail-controlled-by-parent.md,预期只有 2 行新增、0 行删除;pnpm check:adr-anchors && pnpm check:adr-symbol-anchors预期绿。docs/adr/**,Tier H,席位不转 ready、不入队)。What changes
One file, two inserted lines, nothing rewritten (ADRs are append-only, Prime Directive 13; the card's "reword that one bullet" yields to it, as the triage audit line and the retriage answer on #26686 say):
docs/adr/0055-master-detail-controlled-by-parent.md, the Lint bullet of "What the opt-in does, exactly" (the 2026-10-26 amendment forcontrolled_by_parent: the owner of a detail row cannot update their own row when they only read the master — no equivalent of the "activity owner always has full access" rule (hotclm obligations today, HotCRM tasks next) #25760) gains a dated note directly under it, in the file's own in-place form (⚠️ **Amended YYYY-MM-DD (#N) — …**, the shape the 2026-10-22 and 2026-09-07 notes use). The note states the armmaincarries since controlledByParent.ownerMayEdit admits only owner_id, but its lint arm prescribes it for any FIELD == current_user.id policy — an app whose accountable person is its own user field stays refused #26591 / PR fix(lint): the controlledByParent owner arm prescribes ownerMayEdit only for an owner_id-keyed policy #26658, read offpackages/lint/src/validate-security-posture.tsonorigin/main:update/allpolicy that keys the caller onowner_id, on acontrolled_by_parentdetail that carriesowner_idand has not opted in (pushCbpOwnerPolicyWithoutOptIn);owner == current_user.id, orowner_idon a detail with no such column) is flagged in both states, opted in or not, with theowner_idremedy and never the opt-in (pushCbpCallerPolicyOffOwnerColumn);warningtier are unchanged; the rule'sos explainentry says the same;· **Amended** (2026-10-27, #26591 / PR #26658) — …entry, because every in-place note in this file is paired with one there.No gate, spec, lint or other ADR text changes. No changeset:
docs/adr/**publishes nothing (skip-changesetsent with the create).Tests
None owed: a docs-only diff under
docs/adr/, no package touched, no tested behaviour changed, so no ablation.Acceptance notes
owner_idis named as the one column the opt-in admits;check:adr-anchorsis green at the head and ADR-0055 declares the same machine-readable decision-letter count at base and head (0 headings, 0 bold leads, 0 table cells on bothorigin/main8eef9a8 and the head, by the four grammarscheck-adr-anchors.mjsreads).origin/main8eef9a8 (the delta's 0ea90c7 has moved on): the Lint bullet is unchanged at line 176, and no open PR namesdocs/adr/0055*.path#symbolformcheck:adr-symbol-anchorsresolves (pushCbpOwnerPolicyWithoutOptIn,pushCbpCallerPolicyOffOwnerColumn,SECURITY_CBP_OWNER_POLICY_WITHOUT_OPT_IN_EXPLANATIONall exist onorigin/main).docs/adr/README.mdis generated and did not need regenerating: its status column truncates ADR-0055's value before the new entry (check:adr-index --reportreads it current).Verification
Local, in the worktree at head
a7fbcca4(the only commit), after it:@objectstack/lint/@objectstack/formula):pnpm turbo run build --filter='@objectstack/lint...' --concurrency=2underscripts/pm/os-verify-lock.sh:VERDICT command-exit 0 · held the lock 102s.node scripts/pm/dispatch-gates.mjs --commands --repo objectstack-ai/objectstack(change set derived from git, 1 path vs merge base8eef9a8d) listed 21 commands; every one ran serially with stdin closed and recorded exit 0:check-adr-links(+--self-test),check-closing-keyword-parity(+--self-test),check-comment-mask-corpus,ci/plan-test-core-shards --self-test,@objectstack/lint check:doc-formula-expressions,check:adr-anchors,check:adr-index,check:adr-symbol-anchors,check:ci-filter-parity,check:closed-ceremony-text,check:cross-package-test-inputs,check:doc-authoring,check:driver-memory-census,check:gitlink-declared,check:nul-bytes,check:pm-governed-merges,check:pm-prior-rulings,check:refd-timer-probe,check:watch-hint-literal.node scripts/pm/dispatch-gates.mjs --repo objectstack-ai/objectstack --ran ran.txt:✓ dispatch-gates --ran: 21 derived famil(ies) accounted for — 21 run, 0 NOT-MEASURED (a DERIVED zero — all 21 recorded an exit code and none of them is 3).dispatch-gates --tier: MANDATORYdocs/adr/**(clause ①, no one-line exit); changed lines 2 (+2 / -0), under the 3000 human-merge threshold.check:adr-symbol-anchors:2690 anchors across 144 records resolve, the three newpath#symbolanchors among them.Generated by Claude Code