Repository source: docs/plans/mitrapclub_events_experience/mitrapclub_events_experience_step1_solution_assessment.md
Original Query
Great job, I committed. Please continue with the next task.
Understood Intent
You picked Cycle 4 ("Events experience") from
docs/plans/mitrapclub_theme_and_features_checklist.mdas the next cycle.Context: the original
mitrapclub_websitefeature's Step 1 explicitly deferred a dedicated events experience (its "Option B") in favor of treating events as ordinary tagged/pinned threads (its "Option C"), with the note "only build a qdb-style dedicated events experience later if that turns out not to be enough." The checklist now flags this as worth revisiting: event posts (date/location/RSVP link) still render as plain threads, indistinguishable from an ordinary discussion thread.Architecture check before framing options:
boardCardis a profile-wide presentation slot (threadvs.quote, a whole-partial swap inBoardPageController) — it picks one card layout for every thread on the board, not per-thread. There is currently no per-thread "this one is an event" distinction anywhere in the rendering. Separately, this app's canonical data model already derives structured fields (thread_labels_json,board_tags_json) from parsed canonical text records (seeReadModelBuilder::indexThreadLabels()), rather than from relational schema columns — any new structured event data most naturally follows that same text-in/derived-field-out pattern.
Problem Statement
A mitrapclub event announcement (date, location, optional RSVP/ticket link) renders identically to an ordinary discussion thread, with no structured presentation and no visual distinction between post types.
Solution Options
Option A: Status quo, documented as sufficient. Keep using the existing generic
pinnedthread label and board tags to surface an event thread; rely on the author writing date/location into the post body as plain prose. No new code.Pros: zero cost; this is exactly what the original feature's Step 1 already chose (Option C) and it works today.
Cons: doesn't actually resolve the checklist's complaint — still indistinguishable from any other thread, no structured fields, nothing for
thread_card.phpto render specially.
Option B: Lightweight structured event fields on ordinary threads (recommended). Define a small, parseable event-metadata convention inside a thread's canonical post text (mirroring how
thread_labels_json/board_tags_jsonare already derived from parsed canonical records); extend the read model to derive optionaleventDate/eventLocation/eventLinkfields per thread when present;thread_card.phprenders a distinct event-styled block (date/location/link) when a thread carries them, otherwise renders exactly as today. No newExperience, no new routes, no newboardCardslot value — stays inside the existing genericforumexperience thatmitrapclub/zenmemes/chousealready share.Pros: genuinely resolves "no structured presentation" and "no visual distinction between post types"; additive and reuses the codebase's existing text-to-derived-field pattern instead of inventing a new one;
zenmemes/chouse/qdbare structurally unaffected unless they opt in.Cons: real read-model/parsing work (more than a config change); needs a concrete, unambiguous syntax decision for how an author marks a post as an event (Step 2/3 territory); "RSVP link" here means a plain URL field, not attendee tracking or RSVP state — scope stays at display, not a new capability.
Option C: Full dedicated events experience (qdb-style). Build a new
Experience(own routes, compose form with explicit date/location/RSVP fields, and a dedicated events listing), the same shape asQdbExperience/QdbPresentation.Pros: most capable — a real "what's next" events page, not just decorated threads; room for future RSVP/attendee features.
Cons: materially more code (new experience class, routes, policy, its own presentation slots) — the same cost/speculation trade-off the original Step 1 already weighed and rejected; still speculative before Option B is tried.
Recommendation
Option B. It directly fixes the checklist's actual complaint (no structured fields, no visual distinction) without repeating Option C's full-experience cost, and it extends a pattern this codebase already trusts (deriving structured fields from parsed canonical text) rather than introducing a new one. Option A is the honest "no-op" fallback if Step 2/3 scoping finds even this too invasive. Option C stays available later if Option B proves insufficient, exactly as the original Step 1 anticipated.
Vertical-slice viability: Yes. Entry is an author composing a thread on mitrapclub using the event convention; outcome is that thread rendering with a distinct, structured event block (date/location/link) on the board and in the thread view; recovery is graceful (a malformed or missing event marker just renders as an ordinary thread, never an error); no regression to zenmemes/chouse/qdb.
Waiting for "Approved Step 1" before drafting Step 2.