You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
demoStaff spells the legal head and finance controller names as literals that keys.ts mirrors; a rename silently drops seeded reviews #191
Filing gate: ③ latent defect, found by #186's dev (PR #189).
objectstack.config.ts declares the 'Head of Legal' and 'Finance Controller' demo staff with literal names. Since PR #189, src/data/keys.ts mirrors them as LEGAL_HEAD / FINANCE_CONTROLLER for reviewerOf(). clm_review.reviewer is required, so renaming one side drops every review dealt to that account, and the seed still reports success.
Fix.objectstack.config.ts spells those two entries from keys.ts, as it already does for CONTRACT_OWNERS and LEGAL_OWNERS. One file. Measure that pnpm demo still seeds 60 reviews.
Claim: PM loop round 17
Ruling-ref: none (seat-filed follow-up of #186, PR #189)
Session: session_017nzWFRUo2U7evMkPdVniAn
Account: zhuangjianguo (the seat's linked user as GET /user answers it; the card's assignee)
Branch: claude/issue-191-staff-names
Worktree: hotclm-issue-191
Domain: repo:hotclm (single-lane sister repo — no domain:*)
Seat: repo:hotclm#1
File surface: objectstack.config.ts (the two demoStaff names) · src/data/keys.ts only if an export is missing — 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 demo (one spelling for the staff names the seed resolves) | none | maintainers renaming demo staff
Thread-read: none
Premise: re-measured by the dev on origin/main494fb35 (@objectstack 18.2.0, after PR #189)
Serial constraints cleared: #186 landed (PR #189). Nothing else in flight.
{
"issue": 191,
"status": "done",
"branch": "claude/issue-191-staff-names",
"pr": "https://github.com/objectstack-ai/hotclm/pull/192",
"session": "session_017nzWFRUo2U7evMkPdVniAn",
"premise_still_valid": true,
"summary": "I checked the premise on origin/main 494fb35. objectstack.config.ts demoStaff spelled 'Head of Legal' and 'Finance Controller' as literals, and src/data/keys.ts copied them as LEGAL_HEAD / FINANCE_CONTROLLER, which reviewerOf() deals 24 of the 60 reviews to. The fix touches one file, objectstack.config.ts: it imports LEGAL_HEAD and FINANCE_CONTROLLER from ./src/data/keys.js and uses them as the two entries' name, the same way CONTRACT_OWNERS / LEGAL_OWNERS are already used. The demoStaff comment now lists every account the fixture deals to by name, and it drops the sentence 'The fixture names none of them', which had been false since #189. The resolved strings are unchanged, so the seed is identical before and after. keys.ts was not touched because every export it needs already exists. Its JSDoc above LEGAL_HEAD still says the config 'spells them as literals rather than from here'; that is now stale, and a replacement is proposed below. When I started, #191 had 0 comments, the label pm:queue and no assignee. By the time I opened the PR the seat's Claim comment and pm:dispatched were in place. I wrote no claim and no assignee.",
"tests": "Reverse check, fix committed first (e24c3bf). A trap-restored script set LEGAL_HEAD='General Counsel' and FINANCE_CONTROLLER='Group Controller' in keys.ts (on disk: 1 hit for each new string, 0 for the old ones), emitted the stack with tsc to dist/probe, and loaded it with CLM_DEMO_SEED=1. LEG A, this branch's config: legal.head@ staff name 'General Counsel', finance@ 'Group Controller', reviews 60, reviewers not declared as staff 0. LEG B, origin/main 494fb35 config with the same renamed keys.ts: staff still 'Head of Legal' / 'Finance Controller', reviewers not declared 24. Restore: 'RESTORED: blob hashes match HEAD', git diff HEAD 0 lines. LEG C, restored tree: original names, 0 undeclared. Live run: pnpm demo:zh on port 3161, @objectstack 18.2.0, empty .objectstack/data each time. BEFORE used a detached worktree at 494fb35 and AFTER used e24c3bf. Both read the same as admin@: GET /api/v1/data/clm_review total 60, 0 naming Dev Admin, and per account counsel1 16, counsel2 18, legal.head 8, finance 16, requester2 1, requester3 1. Browser: Chromium /opt/pw-browsers/chromium, locale zh-CN, signed in through the /_console/ form with admin123 on both runs. legal.head@ got sign-in 200, landed on clm_contract/view/legal_intake (法务工作台 › 待受理, 6 条记录), session user 'Head of Legal', html lang zh-CN, 60 reviews visible, 8 naming itself ('Legal · Head of Legal', 'Finance · Head of Legal'). finance@ got sign-in 200, landed on clm_payment_plan/view/all_payment_plans, session user 'Finance Controller', 50 reviews visible, 16 naming itself. The only response at 400 or above was 401 GET /api/v1/auth/get-session on the login page before sign-in. No unit tests exist for src/data and no tested behaviour changed, so there is no ablation.",
"gates": "Head e24c3bf, each exit code captured before any pipe: pnpm install 0; pnpm validate 0 ('✓ Validation passed'); pnpm lint 0 (0 warnings, 'Suggestions (6)', same as main); pnpm typecheck 0; pnpm lint:i18n-gate 0 ('COVERAGE : 0 missing keys across 2 locale(s)'); CLM_DEMO_SEED=1 pnpm validate 0 ('✓ Validation passed'). PR #192 check-runs when last read: Validate completed success, plus a second Validate run still in_progress. dispatch-gates.mjs is objectstack-only and was not used for this sister repo.",
"dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm",
"mcp_calls": "0",
"api_writes": "2 — fleet-write relay pr_create (create + assignee leg, read-back 4825/4825 bytes identical, PR #192 draft, assignee zhuangjianguo); this os-dev-report comment on #191 via post-stamped. Plus 1 git push (not REST).",
"open_questions": [
{
"question": "The JSDoc above LEGAL_HEAD / FINANCE_CONTROLLER in src/data/keys.ts (the ⚠️ paragraph at line 318 on main) still says objectstack.config.ts 'spells them as literals rather than from here', which is false after this PR. The claim's surface allows keys.ts only for a missing export, so I left it. Should the seat widen the surface for a comment-only edit on this PR?",
"options": [
"A: widen the surface; one comment-only commit on PR #192 changes the second sentence to: 'These two are the `name` of their `demoStaff` entries in `objectstack.config.ts`, which spells them from here, so a rename moves both. `reviewer` is `required: true`, which is why they must never drift: the loader refuses every review that names an account nobody carries, and the seed reports success for the rest.'",
"B: land #192 as is and let the next PR that touches keys.ts fix the comment"
],
"recommendation": "A, because the stale sentence describes the exact hazard this PR removes and would send the next reader looking for a literal that no longer exists. It is a one-paragraph comment edit with no runtime effect and stays inside the same gate family."
}
],
"out_of_scope_findings": [
"carrier: this card's seat (open_questions[0]) · noted, not filed: the keys.ts JSDoc for LEGAL_HEAD / FINANCE_CONTROLLER is stale after PR #192"
]
}
Release: the demo's legal head and finance controller names are spelled in one place, so renaming either no longer silently drops seeded reviews. State: pm:dispatched removed, assignee cleared.
Activity
objectstack-fleet commentedon Oct 27, 2026
Claim: PM loop round 17
Ruling-ref: none (seat-filed follow-up of #186, PR #189)
Session:
session_017nzWFRUo2U7evMkPdVniAnAccount:
zhuangjianguo(the seat's linked user asGET /useranswers it; the card's assignee)Branch:
claude/issue-191-staff-namesWorktree:
hotclm-issue-191Domain:
repo:hotclm(single-lane sister repo — nodomain:*)Seat:
repo:hotclm#1File surface:
objectstack.config.ts(the twodemoStaffnames) ·src/data/keys.tsonly if an export is missing — stop on breach; explain in the reportContainer & model:
S,mode:subagent,model: opus(TIER_DEFAULT; hand-derived for a sister repo),effort: mediumClause-②: no
Metadata-protocol: none
Responsibility:
this app's demo (one spelling for the staff names the seed resolves) | none | maintainers renaming demo staffThread-read: none
Premise: re-measured by the dev on
origin/main494fb35(@objectstack 18.2.0, after PR #189)Serial constraints cleared: #186 landed (PR #189). Nothing else in flight.
Generated by Claude Code
objectstack-fleet commentedon Oct 27, 2026
os-dev-report
{ "issue": 191, "status": "done", "branch": "claude/issue-191-staff-names", "pr": "https://github.com/objectstack-ai/hotclm/pull/192", "session": "session_017nzWFRUo2U7evMkPdVniAn", "premise_still_valid": true, "summary": "I checked the premise on origin/main 494fb35. objectstack.config.ts demoStaff spelled 'Head of Legal' and 'Finance Controller' as literals, and src/data/keys.ts copied them as LEGAL_HEAD / FINANCE_CONTROLLER, which reviewerOf() deals 24 of the 60 reviews to. The fix touches one file, objectstack.config.ts: it imports LEGAL_HEAD and FINANCE_CONTROLLER from ./src/data/keys.js and uses them as the two entries' name, the same way CONTRACT_OWNERS / LEGAL_OWNERS are already used. The demoStaff comment now lists every account the fixture deals to by name, and it drops the sentence 'The fixture names none of them', which had been false since #189. The resolved strings are unchanged, so the seed is identical before and after. keys.ts was not touched because every export it needs already exists. Its JSDoc above LEGAL_HEAD still says the config 'spells them as literals rather than from here'; that is now stale, and a replacement is proposed below. When I started, #191 had 0 comments, the label pm:queue and no assignee. By the time I opened the PR the seat's Claim comment and pm:dispatched were in place. I wrote no claim and no assignee.", "tests": "Reverse check, fix committed first (e24c3bf). A trap-restored script set LEGAL_HEAD='General Counsel' and FINANCE_CONTROLLER='Group Controller' in keys.ts (on disk: 1 hit for each new string, 0 for the old ones), emitted the stack with tsc to dist/probe, and loaded it with CLM_DEMO_SEED=1. LEG A, this branch's config: legal.head@ staff name 'General Counsel', finance@ 'Group Controller', reviews 60, reviewers not declared as staff 0. LEG B, origin/main 494fb35 config with the same renamed keys.ts: staff still 'Head of Legal' / 'Finance Controller', reviewers not declared 24. Restore: 'RESTORED: blob hashes match HEAD', git diff HEAD 0 lines. LEG C, restored tree: original names, 0 undeclared. Live run: pnpm demo:zh on port 3161, @objectstack 18.2.0, empty .objectstack/data each time. BEFORE used a detached worktree at 494fb35 and AFTER used e24c3bf. Both read the same as admin@: GET /api/v1/data/clm_review total 60, 0 naming Dev Admin, and per account counsel1 16, counsel2 18, legal.head 8, finance 16, requester2 1, requester3 1. Browser: Chromium /opt/pw-browsers/chromium, locale zh-CN, signed in through the /_console/ form with admin123 on both runs. legal.head@ got sign-in 200, landed on clm_contract/view/legal_intake (法务工作台 › 待受理, 6 条记录), session user 'Head of Legal', html lang zh-CN, 60 reviews visible, 8 naming itself ('Legal · Head of Legal', 'Finance · Head of Legal'). finance@ got sign-in 200, landed on clm_payment_plan/view/all_payment_plans, session user 'Finance Controller', 50 reviews visible, 16 naming itself. The only response at 400 or above was 401 GET /api/v1/auth/get-session on the login page before sign-in. No unit tests exist for src/data and no tested behaviour changed, so there is no ablation.", "gates": "Head e24c3bf, each exit code captured before any pipe: pnpm install 0; pnpm validate 0 ('✓ Validation passed'); pnpm lint 0 (0 warnings, 'Suggestions (6)', same as main); pnpm typecheck 0; pnpm lint:i18n-gate 0 ('COVERAGE : 0 missing keys across 2 locale(s)'); CLM_DEMO_SEED=1 pnpm validate 0 ('✓ Validation passed'). PR #192 check-runs when last read: Validate completed success, plus a second Validate run still in_progress. dispatch-gates.mjs is objectstack-only and was not used for this sister repo.", "dogfood_battery": "n/a — no `!` in the PR title and no (narrowing) arm", "mcp_calls": "0", "api_writes": "2 — fleet-write relay pr_create (create + assignee leg, read-back 4825/4825 bytes identical, PR #192 draft, assignee zhuangjianguo); this os-dev-report comment on #191 via post-stamped. Plus 1 git push (not REST).", "open_questions": [ { "question": "The JSDoc above LEGAL_HEAD / FINANCE_CONTROLLER in src/data/keys.ts (the ⚠️ paragraph at line 318 on main) still says objectstack.config.ts 'spells them as literals rather than from here', which is false after this PR. The claim's surface allows keys.ts only for a missing export, so I left it. Should the seat widen the surface for a comment-only edit on this PR?", "options": [ "A: widen the surface; one comment-only commit on PR #192 changes the second sentence to: 'These two are the `name` of their `demoStaff` entries in `objectstack.config.ts`, which spells them from here, so a rename moves both. `reviewer` is `required: true`, which is why they must never drift: the loader refuses every review that names an account nobody carries, and the seed reports success for the rest.'", "B: land #192 as is and let the next PR that touches keys.ts fix the comment" ], "recommendation": "A, because the stale sentence describes the exact hazard this PR removes and would send the next reader looking for a literal that no longer exists. It is a one-paragraph comment edit with no runtime effect and stays inside the same gate family." } ], "out_of_scope_findings": [ "carrier: this card's seat (open_questions[0]) · noted, not filed: the keys.ts JSDoc for LEGAL_HEAD / FINANCE_CONTROLLER is stale after PR #192" ] }Generated by Claude Code
keys.ts: the staff-name comment says config spells them from here (#191)
Demo staff names are spelled once, in keys.ts (#192)
objectstack-fleet commentedon Oct 27, 2026
Ruling-ref: none (seat-filed follow-up of #186)
Landed — PR #192 · 2026-10-27
MERGED(squash onmain), merged at its ACCEPT headb8b4342;Fixes #191closes this cardRelease: the demo's legal head and finance controller names are spelled in one place, so renaming either no longer silently drops seeded reviews. State:
pm:dispatchedremoved, assignee cleared.Generated by Claude Code