The defect
src/sharing/positions.ts defines seven positions and src/profiles/ defines five permission sets. Three passages state those counts and only one of them is right.
Reading — the ground truth
src/sharing/positions.ts, CLM_POSITION:
| # |
name |
| 1 |
clm_legal_counsel |
| 2 |
clm_legal_head |
| 3 |
clm_finance_controller |
| 4 |
clm_executive |
| 5 |
clm_general_manager |
| 6 |
clm_records_manager |
| 7 |
clm_admin |
src/profiles/ = 5 permission sets: clm_admin · clm_finance · clm_legal · clm_records · clm_requester.
Defect 1 — README.md, the operator setup section
The instruction reads:
create accounts in Setup → Users and assign the seven positions:
and is followed by a table of seven rows — but the seventh row is:
| (business requesters) | 3 | The default clm_requester set — launches contracts, sees their own |
That is a permission set, not a position. So the table lists six real positions and one set, under a sentence that says "seven positions". The seventh real position, clm_admin, is absent from the table entirely.
The count is arithmetically reconcilable — 6 positions + 1 set row = 7 rows — which is exactly why it survived: it reads correct. It is not correct, and it costs the reader in two ways:
- an operator following it literally never assigns
clm_admin and never learns the position exists;
- the row that is not a position sits in a table whose header column is
Position, so (business requesters) reads as a position name to anyone scanning the table for what to type into sys_user_position.position.
The paragraph two screens below — "The other five positions are named however you like" — is consistent with the table's six, not with the tree's seven.
Defect 2 — DESIGN.md §11, layout block vs M1 row
The same section states the census twice and disagrees with itself:
| where |
text |
verdict |
| §11 layout block |
src/profiles/ src/sharing/ 5 permission set · 7 position · 6 sharing rule · FLS |
right on both counts |
| §11 M1 milestone row |
11 对象 · 状态机守卫 · 8 position / 6 set · 共享与 FLS · 配置域种子 |
wrong on both — the tree has 7 positions and 5 sets |
Same section, same document, two numbers each. The M1 row is the one that is wrong.
What to change
Three edits, all prose. No metadata, no code, no behaviour.
README.md — make the sentence and the table agree with the tree. Either say what the table actually contains (six positions plus the default requester set) or add the seventh position and keep the sentence; the constraint is that the Position column must contain only position names, so the (business requesters) row needs to be visibly not-a-position — a separate row group, a separate small table, or moved into the naming paragraph below it. clm_admin must appear somewhere the operator can find it, with what it actually grants (src/sharing/positions.ts: "Maintains the configuration objects and holds full reach over every CLM object"). Whether an operator setting up the demo should assign clm_admin at all is a judgement call — the dev admin already holds no clm_* set, so a real administrator account is arguably exactly what the section is missing — state your reading and say why.
README.md — the "other five positions" sentence follows from whatever count edit 1 lands on; keep it consistent.
DESIGN.md §11 M1 row — 8 position / 6 set → the real counts. The layout block above it is already right and must not be touched.
Constraints
Acceptance
pnpm validate && pnpm lint && pnpm typecheck all 0, exit codes captured before any pipe. None of them reads either file, so none can move — say so rather than implying the gates verified anything.
- Every count in the PR body backed by a reading from this tree, in a claim → reading table.
README.md's Position column contains only strings that are real values of sys_user_position.position.
DESIGN.md §11 states one census, and it matches src/sharing/positions.ts and src/profiles/.
- Every occurrence found, not just the three named here: grep both files for position and permission-set counts before declaring done. This card exists because a count drifted in three places at once.
Provenance
Found by the dev on #46 while verifying PR #56, reported as an out-of-scope finding and correctly left unfixed there (README.md's table is off that card's edit surface and DESIGN.md is off its file surface). The clm_admin and src/profiles/ readings above are the PM seat's own, taken on d34b225; DESIGN.md's blob on main is df0269af, so the §11 quotes are current.
The defect
src/sharing/positions.tsdefines seven positions andsrc/profiles/defines five permission sets. Three passages state those counts and only one of them is right.Reading — the ground truth
src/sharing/positions.ts,CLM_POSITION:clm_legal_counselclm_legal_headclm_finance_controllerclm_executiveclm_general_managerclm_records_managerclm_adminsrc/profiles/= 5 permission sets:clm_admin·clm_finance·clm_legal·clm_records·clm_requester.Defect 1 —
README.md, the operator setup sectionThe instruction reads:
and is followed by a table of seven rows — but the seventh row is:
That is a permission set, not a position. So the table lists six real positions and one set, under a sentence that says "seven positions". The seventh real position,
clm_admin, is absent from the table entirely.The count is arithmetically reconcilable — 6 positions + 1 set row = 7 rows — which is exactly why it survived: it reads correct. It is not correct, and it costs the reader in two ways:
clm_adminand never learns the position exists;Position, so(business requesters)reads as a position name to anyone scanning the table for what to type intosys_user_position.position.The paragraph two screens below — "The other five positions are named however you like" — is consistent with the table's six, not with the tree's seven.
Defect 2 —
DESIGN.md§11, layout block vs M1 rowThe same section states the census twice and disagrees with itself:
src/profiles/ src/sharing/ 5 permission set · 7 position · 6 sharing rule · FLS11 对象 · 状态机守卫 · 8 position / 6 set · 共享与 FLS · 配置域种子Same section, same document, two numbers each. The M1 row is the one that is wrong.
What to change
Three edits, all prose. No metadata, no code, no behaviour.
README.md— make the sentence and the table agree with the tree. Either say what the table actually contains (six positions plus the default requester set) or add the seventh position and keep the sentence; the constraint is that thePositioncolumn must contain only position names, so the(business requesters)row needs to be visibly not-a-position — a separate row group, a separate small table, or moved into the naming paragraph below it.clm_adminmust appear somewhere the operator can find it, with what it actually grants (src/sharing/positions.ts: "Maintains the configuration objects and holds full reach over every CLM object"). Whether an operator setting up the demo should assignclm_adminat all is a judgement call — the dev admin already holds noclm_*set, so a real administrator account is arguably exactly what the section is missing — state your reading and say why.README.md— the "other five positions" sentence follows from whatever count edit 1 lands on; keep it consistent.DESIGN.md§11 M1 row —8 position / 6 set→ the real counts. The layout block above it is already right and must not be touched.Constraints
DESIGN.md§11 is not a governed section (the governed range is §01–§04), so this card may edit it. But PR Record four maintainer rulings in DESIGN.md §03, §06 and §09 #40 is open and editsDESIGN.md— this card does not start until Record four maintainer rulings in DESIGN.md §03, §06 and §09 #40 has merged, so two branches never touch that file at once. It is queued for that reason, not for any doubt about the defect.legal_owner, so four of six scheduled jobs notify nobody #47/The demo makes M3's reminder layer look broken: 54 of 120 contracts have nolegal_owner, so four of six scheduled jobs notify nobody #55's, freshly rewritten, and the surrounding measurements in it are correct.content/docs/releases/(does not exist here) and do not add a changeset (this repo has no changeset gate).Acceptance
pnpm validate && pnpm lint && pnpm typecheckall 0, exit codes captured before any pipe. None of them reads either file, so none can move — say so rather than implying the gates verified anything.README.md'sPositioncolumn contains only strings that are real values ofsys_user_position.position.DESIGN.md§11 states one census, and it matchessrc/sharing/positions.tsandsrc/profiles/.Provenance
Found by the dev on #46 while verifying PR #56, reported as an out-of-scope finding and correctly left unfixed there (
README.md's table is off that card's edit surface andDESIGN.mdis off its file surface). Theclm_adminandsrc/profiles/readings above are the PM seat's own, taken ond34b225;DESIGN.md's blob onmainisdf0269af, so the §11 quotes are current.