9 · Feedback and issues, mapped to the design
9 · Feedback and issues, mapped to the design
Every piece of attendee feedback from the 2026 event and every open-issue theme, and the element of this design that serves it. Where the design changes what was asked for, the row says so.
Attendee feedback
| Ask | Served by |
|---|---|
| Where is the room? Floor in the room info; a venue map with points of interest | Place.floor, Place.directions, Place.mapPin; the venue screen and the place popover on every session block (02, 04) |
| Privately mark things I am not interested in, as an exclusion list | Mark{kind: hide}, private by audience (02 § Mark) |
| “Like” attendees to keep a shortlist of people to meet | Mark{kind: star} on a person |
| Bookmark sessions, between RSVP and nothing; filter by “may be interested” | Mark{kind: star} on a session; the agenda’s source: star; filters as pure functions |
| My RSVPs for myself vs. for public information should be separate | Star (private, uncounted) vs. RSVP (public commitment) vs. RSVP anonymous (counted, name hidden). Three explicit states instead of one overloaded one |
| Overlap view of my RSVP’d sessions | agenda().clashGroups over host + RSVP + star + meetings, shown as a view and as all clashes on RSVP (#1042) |
| Personal schedule of hosted / RSVP’d / starred events; meals and opening on it by default | The agenda; Session{kind: fixture} is on everyone’s agenda unless hidden |
| Which volunteer shifts still need people | Session{kind: shift, minHeadcount}; shiftsBelowMinimum() as a list, a filter on the grid, and a reminder |
| Not updating without a reload is rough | The replica and change feed; the kiosk never refreshes either |
| Text me via a bot | ChatChannel adapters bound per person; same notification records |
| Someone moved a scheduled session into the spontaneous slots | ReservedWindow{spontaneousOnly, bookableFrom} enforced by canPlace |
| Who added this proposal? | Proposal.createdBy, shown; the change log answers “who changed what” generally |
| A proposal that did not get scheduled should become a 1-on-1 suggestion | Decided not to build (see 08 § resolved). If it ever is, it is a reaction in meetings; nothing else changes |
| 1-on-1s should be on by default | Event setting default meetingsEnabled = true |
| The times on the side did not match the times on the sessions | One slot grid on the Day; sessions drawn at real instants; no second copy of the grid |
| Grid columns too wide on a phone; too much horizontal scrolling | Viewer-chosen visible places, wrapped titles, a “now” strip across all places |
| The list view is noisy with volunteer slots | kind filter (hide shifts) and hide marks |
| More session metadata: latecomers welcome, RSVP required, limited slots, gathering location for “anywhere” | Session.latecomers, Session.rsvp, capacity, gatheringPoint required for anywhere |
| A minimal affinity feature | Out of scope; the person star is the closest honest thing. A matching feature would be its own module reacting to marks and profiles, which the design allows without changing anything else |
Open issues by theme
| Theme (issues) | Served by |
|---|---|
| Favoriting and filtering on the grid (#864, #865, #264, #678) | Marks; filters as pure functions over the replica |
| Optimistic RSVP bugs, redundant fetching, hydration errors (#463, #381, #734) | One optimistic mechanism in commands/; the replica; no SSR |
| Email outbox, reminder dispatch, email log (#1005, #580) | The change log plus the jobs loop; delivery_attempts |
| Admin API, OpenAPI, sessions/locations CRUD (#1006, #677) | One API for all roles; contracts generate the document |
| Rate limiting, event-wide required auth, security review (#679, #682, #680) | 05-security.md: rate limits by default, identity mode verified, audience model |
Domain types out of db/ (#965) |
The package split makes it structural |
| Meal times on the schedule, sessions during meals (#861, #465) | Fixtures; Day.mealWindows overlap is a client warning, not a canPlace denial |
| Meetings: break offsets, opt-in, only in scheduling (#1049, #1046, #952) | Slot grid on the Day used by meetings too; on by default; phase in meeting settings |
| Comments: see my own, remove from my profile (#993, #901) | people.canEditProfile for removal; a query over the viewer’s comments |
| Notifications: devices listed, lost-host notice, co-host wording (#969, #953, #954) | Bindings per device; reactions for HostRemoved leaving zero hosts; templates per category |
| Pagination, modal navigation, deep links (#831, #856, #994, #109) | Cursor pagination in the API; modals as URL state |
| Time format 12/24 h (#607) | Person preference honoured by domain/time |
| Attendee labels, badges, hover cards (#629, #793, #789) | labels on participations; profile public view in the replica |
| Phase at a glance (#771) | phaseAt is in the replica’s event; one component |
| Data collection policy (#801) | Generated from schema data classes |
| Load test (#691) | A tools/loadtest against the API and feed with the sizing in 03 § capacity |
| Demo data for production (#373) | tools/seed profiles usable against any instance through the API |
| Statistics (#389) | Queries over the change log and state; no extra tracking |
| In-app chat, spaced repetition (#776, #395) | Not designed for; both fit as new modules with their own changes and audiences |
Things nobody asked for that the design provides for
- Calendar export: an ICS feed of the agenda, signed per person, is a query
over
agenda(); attendees will ask for it the first time they open their phone calendar. - Organizer announcements: a
fixture-like notification to everyone in the event over all channels; a use case innotificationswith organizer role. - Waitlists when capacity is hard: an RSVP state, not a new concept.
- Reporting a comment or profile to organizers: a change with audience
organizersand a queue in the admin section. - Import of people and sessions from CSV or a call-for-papers tool through the API with an organizer token.
- Session feedback after the fact (in the backlog): a
feedbackmodule reacting toSessionEnded, private to hosts by audience. - A second language: strings are keys and policies return codes from day one.