Let everyone change due dates and self-assign and self-unassign #157

Closed
opened 2026-08-26 17:59:33 +00:00 by Grandiras · 2 comments
Owner
No description provided.
Collaborator

🤖 On it — follow along in the action run; the reply will link the full session transcript.

📜 Live transcript — updating every ~5 minutes while the task runs.

🤖 On it — follow along in [the action run](https://git.grandiras.net/Grandiras/claude-bot/actions/runs/384); the reply will link the full session transcript. <!-- claude-run:comment --> 📜 [Live transcript](https://git.grandiras.net/Grandiras/claude-bot/src/branch/claude-logs/transcripts/Grandiras/Ponente/issue-157/run-384.md) — updating every ~5 minutes while the task runs.
Collaborator

Pushed to claude/issue-157.

What changed

A card stays its author's (or an admin's) to rewrite — but two things on it were never really about what the card says, and locking them behind authorship made the board worse:

  • A due date is everybody's, on any card you can see. It is the one field on a card that goes stale without anybody editing the card, and the member who learns that Thursday has moved is hardly ever the one who wrote it. That is the same argument a drag is already open under. The calendar is what makes it urgent: a date is the only thing on a card visible from there, so a calendar of other people's dates was a screen for reading only.
  • Assignees are everybody's, but only about themselves. Putting your own name on a card is signing up for the work; putting somebody else's name on it is a claim about them and stays the card's own rule.

Everything else on somebody else's card — title, description, tags, Delete, "move to another board" — is unchanged.

How

CardPermissions grows two rules: CanSetDueDate, which takes no card because the answer does not depend on one, and CanSetAssignees — the one rule in the file that judges a difference rather than a row. Whoever may edit the card may write any list; everybody else may write the one list whose symmetric difference from the stored one is their own DID and nothing else.

CardService.SetDueDateAsync is a separate method rather than a lenient UpdateCardAsync, so the write that is allowed physically cannot carry a title with it and does not have to be trusted not to. MemberService.SetCardAssigneesAsync now reads the current rows before it checks — the opposite order to every other guard there, because the question needs both lists to be answerable.

The dialog on somebody else's card is therefore no longer read-only, so CardModal's footer Save is unconditional and Cancel no longer becomes Close. The assignee picker in that state narrows to the people already on the card plus the reader's own chip (AssigneePicker.OnlyDid) rather than showing the whole allowlist greyed out. Both BoardPage.SaveCard and Calendar.SaveCard split the save by what each rule governs rather than by diffing what came back.

The card dialog as an ordinary member sees somebody else's card: title, description and tags are text, Delete is gone — and the due date, the self-assign chip and Save are live

Also in the branch: a Changelog.Unreleased line in both locales, and the paragraphs this outdated in docs/boards-and-permissions.md, docs/calendar.md and docs/ui.md.

Verified

  • dotnet build Ponente.sln clean; dotnet test 395 passed, including six new CardPermissions cases covering every direction the assignee difference can point (on, off, somebody else's name either way, an unchanged list, BoardViewer.None).
  • tests/e2e/permissions.spec.js — extended to drive the second member through setting a date and putting themselves on and then off the admin's card, reading both back after a reopen, and confirming the title is still not theirs — passes against the compose stack (built and run here via the dind host).

One caveat, reported plainly: a full npx playwright test in this job container came back 122 passed / 20 failed. Those failures are the prerender race docs/testing.md already documents for CI ("a click issued on a page whose circuit has not attached yet"), not this change — I checked rather than assumed. Running calendar.spec.js alone gave 14/11 with the change and 10 failures on a clean, stashed tree with the image rebuilt, with an overlapping failure set; the due-date test at calendar.spec.js:121 fails identically on both, and its DOM dump shows the card created with its date on the board and simply no dialog opened by the un-retried click. permissions.spec.js passed in the full run and standalone.


⏱ 38m 11s · 527 turns · tokens: 264.5k in / 98.0k out (+108486.2k cache-read)
📜 Full session transcript
→ Opened PR: #158

Pushed to **`claude/issue-157`**. ## What changed A card stays its author's (or an admin's) to rewrite — but two things on it were never really about what the card *says*, and locking them behind authorship made the board worse: - **A due date is everybody's**, on any card you can see. It is the one field on a card that goes stale without anybody editing the card, and the member who learns that Thursday has moved is hardly ever the one who wrote it. That is the same argument a drag is already open under. The calendar is what makes it urgent: a date is the only thing on a card visible from there, so a calendar of other people's dates was a screen for reading only. - **Assignees are everybody's, but only about themselves.** Putting your own name on a card is signing up for the work; putting somebody *else's* name on it is a claim about them and stays the card's own rule. Everything else on somebody else's card — title, description, tags, Delete, "move to another board" — is unchanged. ## How `CardPermissions` grows two rules: `CanSetDueDate`, which takes no card because the answer does not depend on one, and `CanSetAssignees` — the one rule in the file that judges a **difference** rather than a row. Whoever may edit the card may write any list; everybody else may write the one list whose symmetric difference from the stored one is their own DID and nothing else. `CardService.SetDueDateAsync` is a separate method rather than a lenient `UpdateCardAsync`, so the write that is allowed physically cannot carry a title with it and does not have to be trusted not to. `MemberService.SetCardAssigneesAsync` now reads the current rows *before* it checks — the opposite order to every other guard there, because the question needs both lists to be answerable. The dialog on somebody else's card is therefore no longer read-only, so `CardModal`'s footer Save is unconditional and Cancel no longer becomes Close. The assignee picker in that state narrows to the people already on the card plus the reader's own chip (`AssigneePicker.OnlyDid`) rather than showing the whole allowlist greyed out. Both `BoardPage.SaveCard` and `Calendar.SaveCard` split the save by what each rule governs rather than by diffing what came back. ![The card dialog as an ordinary member sees somebody else's card: title, description and tags are text, Delete is gone — and the due date, the self-assign chip and Save are live](https://git.grandiras.net/attachments/a86ac170-6309-4e79-b7b2-7a9c288c7e68) Also in the branch: a `Changelog.Unreleased` line in both locales, and the paragraphs this outdated in `docs/boards-and-permissions.md`, `docs/calendar.md` and `docs/ui.md`. ## Verified - `dotnet build Ponente.sln` clean; `dotnet test` **395 passed**, including six new `CardPermissions` cases covering every direction the assignee difference can point (on, off, somebody else's name either way, an unchanged list, `BoardViewer.None`). - `tests/e2e/permissions.spec.js` — extended to drive the second member through setting a date and putting themselves on and then off the admin's card, reading both back after a reopen, and confirming the title is still not theirs — **passes** against the compose stack (built and run here via the dind host). One caveat, reported plainly: a full `npx playwright test` in this job container came back **122 passed / 20 failed**. Those failures are the prerender race `docs/testing.md` already documents for CI ("a click issued on a page whose circuit has not attached yet"), not this change — I checked rather than assumed. Running `calendar.spec.js` alone gave 14/11 with the change and **10 failures on a clean, stashed tree with the image rebuilt**, with an overlapping failure set; the due-date test at `calendar.spec.js:121` fails identically on both, and its DOM dump shows the card created with its date on the board and simply no dialog opened by the un-retried click. `permissions.spec.js` passed in the full run and standalone. --- ⏱ 38m 11s · 527 turns · tokens: 264.5k in / 98.0k out (+108486.2k cache-read) 📜 [Full session transcript](https://git.grandiras.net/Grandiras/claude-bot/src/branch/claude-logs/transcripts/Grandiras/Ponente/issue-157/run-384.md) → Opened PR: https://git.grandiras.net/Grandiras/Ponente/pulls/158
Sign in to join this conversation.
No labels
No milestone
No project
No assignees
2 participants
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
Grandiras/Ponente#157
No description provided.