Skip to content

Shared "Topics to discuss" list (#206) - #228

Merged
aleksejs1 merged 1 commit into
mainfrom
feat/shared-topics-206
Oct 4, 2026
Merged

aleksejs1 merged 1 commit into
mainfrom
feat/shared-topics-206

Conversation

@aleksejs1

Copy link
Copy Markdown
Owner

Closes #206, the last item of #213.

What

Drafts are private until published, so topics one side jots down during the week were invisible to the other until then. The first card on a meeting is now a shared list either side adds to at any time, visible to the other within one live-update poll.

  • The list. Only the author edits or deletes a topic; either side ticks it as discussed; archived, it is frozen. Topic text renders inline Markdown. Strings in all 6 locales.
  • Storage. Anketa::$topicsBlob/$topicsVersion (SQLite + MySQL migrations), encrypted under the meeting key. PUT /api/anketas/{id}/topics saves through the same conditional UPDATE as the "discussed" ticks. In the detail, live-state and data export.
  • Carry-forward. Undiscussed topics move to the next meeting like unchecked outcomes, re-encrypted by the archiving browser. The archive request names the topicsVersion they were built from; if the list has moved on, the archive is refused with the meeting left open and the page retries with the current list.
  • Form version 3. New meetings on all four built-in templates drop discuss/managerDiscuss; older meetings keep the blocks and their answers. Company templates keep both ids valid and the editor still offers them; only the new-template prefill leaves them out.
  • Demo data. demo-seed.json regenerated for all 6 locales: the "what else" entries are topics now.

Decisions on the issue's open questions

Full reasoning, the client design (TopicsSync, one per loaded meeting) and the accepted limitations are in docs/decisions/2026-10-04-shared-topics-list.md.

Known limitations

  • A tab left open across the release archives without carrying topics, and still shows the retired question on new meetings.
  • An open topic edit is dropped if the meeting is archived meanwhile.
  • AnketaTopics.svelte repeats much of AnketaOutcomes.svelte, and TopicsSync much of DiscussedSync.
  • The images in docs/screenshots/ were not regenerated (the script is fixed; they still show the page without the card).
  • Translations were written by Claude and are not native-speaker-reviewed.

Verification

  • make verify-pr-ready passes: backend 849 tests, PHPStan, CS, PhpMetrics; frontend 932 tests, typecheck, lint, knip, format, duplication, doc links.
  • Full Playwright suite (65) against the e2e stack, including two new dual-actor tests: topics shared before publishing, synced both ways, a stale carry-forward refused once then carried, only undiscussed topics in the successor; and a form-version-2 meeting still showing its "What else to discuss" answers. The full suite last ran before two final small changes; the four affected tests were re-run after them.
  • Both migrations run up/down/up, the MySQL one on a throwaway MySQL 8.4.
  • Seeded demo topics checked by logging in as two demo accounts in a real browser.
  • Eight independent code-review rounds; see docs/history.md for what each found.

🤖 Generated with Claude Code

The first card on a meeting is a list either side adds to at any time,
visible to the other at once with no draft phase. The author edits or
deletes a topic, either side ticks it as discussed, and it is frozen
once archived.

- Anketa::$topicsBlob/$topicsVersion (SQLite and MySQL migrations),
  encrypted under the meeting key, saved by PUT /api/anketas/{id}/topics
  through the same conditional UPDATE as the "discussed" ticks.
- Undiscussed topics carry forward like unchecked outcomes. The archive
  request names the topics version they were built from, and is refused
  with the meeting left open if the list has moved on.
- Form version 3: new meetings on every built-in template drop the
  "What else to discuss" blocks; older meetings keep them. Company
  templates keep both ids valid.
- Demo fixture regenerated for all 6 locales with topics.

See docs/decisions/2026-10-04-shared-topics-list.md.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
@aleksejs1
aleksejs1 merged commit f55596a into main Oct 4, 2026
6 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Shared "Topics to discuss" list, live-synced like outcomes

1 participant