Repository navigation
Meeting polls: vote for Best Table Topics Speaker, Best Speaker, and Best Evaluator (#80) - #143
claude[bot] wants to merge 8 commits into
Conversation
…eaker, and Best Evaluator Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
plan — The plan ships web-link voting (A) and the native Zoom poll (B) in one PR, built in layers, as the issue requires.
Everything is behind the new flags Open questions (defaults in brackets):
|
|
Review answers (Q5, Q6). #80 isn't split, so both are in this PR, not follow-ups.
Q1–Q4, Q7 and Q8 are still open. |
|
Review answers (Q1, Q2, Q4, Q5, Q6, Q7, Q8). Q3 is still open: I'm looking at verified Zoom identities for votes in place of an IP limit. A separate comment will follow.
|
|
Review answer (Q3): vote inside Zoom first, with the web link as a backup. This changes the Approach, so update the plan before building.
|
|
Dev app Marketplace changes are in (follow-up to Q3/Q4). The dev Zoom app now has:
So run the chat post (MP-04), the native poll (MP-13 and MP-14) and the new invite and in-Zoom vote steps for real, with no ⏭ for missing settings. Before the run, check the Debug Panel's SDK Status (as in CC-00) to confirm the new APIs show as granted. Guests on the unpublished dev app also need a local flag on each device that joins as a guest: on macOS, |
|
build — Stopped before starting: this run's permissions refuse every |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Failing tests written from the approved plan before any implementation: Worker (polls, native Zoom poll, club template, archive, /r/ winners, /vote/ routing and CSP, 402 gate), shared logic (ballot, template, winners, refresh, sync, outbox, report image), the POLL tab and the Stage winners panel, a Playwright spec (the vote page runs the real Worker in-process), and the new meeting-polls Zoom-client spec. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
oracle — 26933dc writes failing tests for AC-1…AC-17 and records them in Contract the tests fix (the plan left these open):
How they fail now:
Zoom-client: a new spec, Not covered here: I did not add |
The ballot is built from the speakers this meeting already timed, so packages/shared/polls.js turns a template (club, personal or default) plus the reports into one meeting's ballot, and reads the winners back with ties kept and none for a category nobody voted in. The personal template syncs (SYNCED_KEYS); the club's copy arrives with refreshClub when ver moves; the draft and results stay local and go with Clear. Closed results ride the club outbox to /api/club/meetings/<id>/polls, and the report image grows a Winners block when there are any. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…m poll One PollRoom per poll keeps strongly consistent counts, so the totals at Close are final, which KV could not promise. Votes inside Zoom are keyed by the verified uid from the app context and must come from the poll's meeting; guests and the /vote/<id> backup page are keyed by a hashed device token, the page behind a per-poll-and-address limit of 120 a minute that fails open. Results and Close are the owner's only. The club publishes a poll template like presets, and closed results are stored under their own archive key so compaction keeps them; /r/ lists the winners. The native Zoom poll keeps the host's refresh token only AES-GCM encrypted in its room and deletes it after the meeting.ended fetch, the last retry or 24 hours. Both flags are off. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
The organizer sets up, opens, watches and closes the poll from a POLL tab after REPORT (flag polls); a free plan sees the setup locked behind Upgrade but can always vote. Opening posts the link to chat and offers "Invite everyone", both optional SDK capabilities with Copy link as the fallback. An invited participant's app finds the open poll through its app context and shows "Vote now". Close reveals the winners, keeps them for the Report tab and the club archive, and "Show on Stage" puts them on the owner's Stage. The meeting-polls spec now covers the new files. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
… and timer-sounds for #80 Meeting polls touched files these specs cover (LiveTab.jsx passes poll winners to the Stage, zoomSdk.js gained three optional APIs, club.js stores the poll template, club-cards.js shares its publisher check). No step changes; timer-core and club-card-sets are marked stale until the Zoom station reruns them. verified_at stays at the last real run. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
implement — Three feature commits make the oracle green: 378daf5 (shared), c91a5cb (Worker), 4fa68d7 (Zoom app), plus d5fcaa1, which reviews the specs.
One departure from the plan: the plan says the rotated refresh token is never stored beyond that one call. I believe Zoom invalidates the old token on refresh (not checked against Zoom's docs), and if so the +15 and +60 min retries could not work with the original. So while a retry is pending, the rotated token replaces the stored one, encrypted the same way. It is still deleted once the answers are in, after the last retry, or at 24 h. The plan's Risk section should say so, or the change should be reverted if that isn't wanted. |
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Closes #80
Plan:
.factory/plans/80-meeting-polls.mdAnswer the open questions inline on the plan file, then add
plan:approved.🤖 Generated with Claude Code