Office Hours Synthesis · Feature Plan

Member-Created Events

A synthesis of four review passes (Office Hours, CEO, Engineering, Design) plus two independent codex outside-voice runs. One critical state-machine bug caught at plan stage. Zero unresolved decisions. Ready for implementation.

Status: Design complete
Customer trigger: Hiking-club board decision · mid-July
Author: gercek@raklet.org
Date: 2026-06-05

0Review pipeline

Four review passes, two cross-model outside voices, zero unresolved decisions. Every cell in this grid was a real conversation, not a checkbox.

1. Office Hours
Problem framing + premise check
6 YC-style forcing questions. Decided personas, wedge, premises. Picked Approach C (status field on EventDoc + dedicated UI). Codebase explore mapped reuse surfaces.
Codex pass #1
Outside voice on scope + wedge
10 findings. Reframed the success metric (vanity → 4-stack). Held the wedge ("event submission" vs "event manager role") pending customer call.
2. CEO Review
Selective expansion + strategic decisions
6 expansion proposals surfaced. All 6 deferred to v1.5. Locked 7-day SLA + explicit-submit edit pattern. Lean v1 holds.
3. Engineering Review
Architecture + test scope
App2 location · centralized filter helpers · 24-callsite refactor · embedded PendingDraft · 55+ planned tests including regression scope.
Codex pass #2
Outside voice on architecture
10 findings. Caught a critical state-machine bug. Fixed via two-status model. Six refinements accepted as engineering open items.
4. Design Review
UI specs + visual conventions
5 design decisions locked. Mobile-first member surfaces. Bootstrap 4 + FontAwesome reuse. Designed empty state for adoption metric.
Synthesis
Plan ready for implementation
0 unresolved decisions · 0 critical gaps · 1 bug caught at plan stage · 21-file scope with heavy reuse · 6 worktree lanes parallelizable.

1Problem

Today only admins create events. A growing share of customers (federations, hiking clubs, multi-chapter orgs, student-club platforms, volunteer orgs) have distributed event organizers who run their own events on behalf of the parent brand. Today's workflow loses members to Meetup.

The workflow we are replacing

  1. Sub-leader emails or WhatsApps event details to the admin (Google Doc, chat paste)
  2. Admin re-keys the details into the Raklet admin panel
  3. Event publishes
  4. Money flows to the org's default event account

For hiking-club-style customers specifically: members use Meetup in parallel with Raklet for member-organized events. We are not replacing nothing. We are replacing Meetup for this workflow.

The structural pattern

Orgs where event organizing is naturally distributed. The admin is not being lazy. They cannot be the bottleneck. The org has 5, 20, 100 sub-leaders (chapter heads, club presidents, volunteer coordinators, location managers) who each run their own events on behalf of the parent brand.

Primary demand signal

Hiking-club discovery call (current sales cycle)

800-member volunteer org with 50 hike leaders organizing their own events. Customer is in 2-week trial. Board recommendation in mid-July. Asked specifically about an "event manager role with limited access." Three use cases described: (1) Simple event scheduling for 50 hike leaders (currently using Meetup); (2) Paid outing management; (3) Lodge booking with approval workflow + fee collection.

2Forcing questions (Office Hours)

Six YC-style demand and specificity questions. Each answer narrowed the design. Verbatim user input below; takeaways follow each.

Q1 · Demand reality
What's the strongest evidence that real customers actually need member-created events?
User answer
"Some asked, fits a clear customer segment."
Honest mid-range answer. Not "everyone is asking" (would be theater). Not "one big logo" (would be lock-in risk). The "clear segment" claim became the load-bearing premise to test in Q3.
Q3 · Desperate specificity
Which segment of Raklet customers is the wedge for this feature?
User answer
"Clubs, volunteers, special interest groups, multi chapter location orgs."
Initial answer was four overlapping buckets — every Raklet org fits at least one. Reframed to the structural pattern: orgs with distributed event organizers (chapter heads, club presidents, volunteer coordinators). User accepted the reframe. The hiking-club call later validated this.
Q3.1 · Persona differentiation
Sub-leader vs regular member — which persona is v1 for?
User answer
"Both sub-leaders and members are the requirements. Why did you ask, what's the difference?"
The "why did you ask" pushback is the reason this design is right. The two personas have different abuse profiles, different volumes, different trust models. Collapsing them to a single mandatory-approval v1 flow + deferring auto-approve to v2 came from this question.
Q4 · Narrowest wedge (lean scope)
Take lean v1 across the board, or stretch on specific rows?
User answer
"Edit on their end is required, ticket types are required. Match the admin panel event creation process, but no donation type tickets. Custom fields: maybe remove or default. Admin notification: daily digest. Only logged-in members can submit. Single occurrence only. Default reminders is a separate site feature."
The "default reminders is a site feature" insight was unsolicited and load-bearing. Most CEOs hand off "let members create events" without surfacing the reminders gotcha. (Codex would later argue this should be hardcoded for v1 — user accepted that override.)
Q4.1 · Notification cadence (reversed mid-session)
Real-time admin notifications, or daily digest?
User answer
"Events are not urgent, so maybe we can just start with a daily digest for admins and add more granular notifications in the settings later."
User reversed from "real-time email" to "daily digest" mid-session after considering admin spam fatigue at the hiking-club volume (50 leaders × weekly = 25+ emails per admin per week). Locked: digest email + real-time in-app bell + real-time email to submitter on decision.
Q5 · Premise check (9 premises)
All 9 premises hold? Any revisions before alternatives?
User answer
"Notifications should be in the center, so we don't want to keep members waiting for long. At the time of approval admins should be able to choose a bank account as well. Did you check our codebase for email creation for admins?"
"Did you check the codebase?" — the move that separates plausible-sounding designs from grounded ones. The codebase explore found OrganisationManagerSettingsDoc.ManagerEmailSettings per-manager opt-in scaffolding already exists, which moved "configurable notification recipients" from v1.5 to v1 (free).

The 9 locked premises

  1. Wedge segment: distributed-organizer orgs. Validated by hiking-club call.
  2. v1 = single-tier submission with mandatory admin approval. Auto-approve = v2.
  3. Both personas go through the same v1 flow. Differentiation deferred.
  4. Payment routing locked to org accounts; members see no bank-account UI. Admin overrides at approval time.
  5. Member submission form matches admin event form's fields, not its full feature set.
  6. Edit is in v1 (explicit Save vs Submit-for-approval pattern).
  7. "Default event reminders" — originally a pre-req. Eng-review override: hardcoded 24h default in v1.
  8. Notifications tiered by urgency: digest email + real-time in-app + real-time on decision.
  9. Approval-queue infrastructure clones the membership-application pattern.

3Implementation alternatives considered

Three approaches sketched in Office Hours. User picked C. The other two stay as fallback options if scope ever needs to flex.

ApproachData modelEffort (human)RiskDecision
A · Minimal viable
Status field on EventDoc; pending events as a tab in admin events list
1 enum + 2 fields on existing EventDoc ~4 weeks Low Fallback if timeline tightens
B · Textbook clean
Separate EventSubmissionDoc mirroring ApplicationDoc; conversion on approval
2 documents joined by SourceId ~7-8 weeks Medium (model drift over time) Rejected
C · Status field + dedicated UI (chosen) Same as A; refined to two-status model after codex pass #2 ~5-6 weeks Low-medium SELECTED

Why C

Approach B's model drift is a real long-term tax for an app that adds event fields regularly. Approach A's "tab in events list" UX is not the queue experience the hiking-club admin needs. C buys A's velocity and most of B's UX clarity. Backend in C is identical to A — fallback path exists if the timeline ever needs A's lower UI scope.

4Scope decisions

Cherry-picks surfaced in CEO review (all deferred)

ProposalWhy it was temptingEffort (CC)Decision
AI-assisted submissionThe Meetup-killer moat. Hike leader types 2 sentences, AI fills the form.~3-5 daysv1.5
Auto-approve trusted creatorsHiking-club customer literally asked for this ("event manager role with limited access").~1-2 daysv1.5
"Create another like this"Weekly-hike pattern means leaders submit ~52 events/year.~30 minv1.5
Recurring eventsHiking-club's weekly recurring meetups would benefit.~3-5 daysv1.5
Submission analytics dashboardWithout it, can't measure feature success in-product.~30 minv1.5
Tagged rejection reasons + Request Changes + marketing kitFriction reduction for admin + growth surface for member.~1-2 daysv1.5
Org-configurable default reminders (was pre-req)Admins want it independently of this feature.~1 weekv1.5

v1 in-scope

CapabilityImplementation
Member submission formNew surface under Application/Areas/App2/
Member "My Submissions" viewStatus badges · designed empty state · mobile-first
Mandatory admin approvalInline approval panel on existing admin event detail page (no new tab)
Edit-after-approval draft patternSave (draft) + Submit-for-approval — GitHub PR-draft model
Payment routingAlways org account; admin picks specific account at approval time
Real-time in-app notificationExisting SignalR fan-in to admin bell counter
Daily digest emailReuses existing job-lease pattern; per-manager opt-in via existing scaffolding
SLA escalation3-day admin reminder + 7-day org-owner escalation
Hardcoded 24h reminder defaultPer-event reminder until org-level defaults ship in v1.5
Feature flag wraps entire flowRollback without code revert
Centralized visibility filter helpers24-callsite refactor + boundary audit (added by codex challenge)

5Cross-model challenge — Codex pass #1 (after CEO review)

Codex read the design doc + CEO plan with no session context. 10 findings. Verbatim. Each tagged with how it was resolved.

CODEX SAYS (plan review — outside voice)
  1. The plan answers "event submission," but the customer asked for an "event manager role with limited access," which may imply managing attendees, cancellations, messages, waitlists, check-in, and edits after approval. Ask the hiking club to define the leader lifecycle explicitly, then decide whether v1 is a submission queue or a limited organizer role. held — validate via customer call
  2. The mid-July deadline is being treated like an engineering target, but the current scope is more like a full production workflow. Cut to a single-customer pilot scope or accept that this is unlikely to influence the board decision in time. held — lean scope already addresses this
  3. "All admin-form fields minus a few toggles" is not lean; ticket types, capacity, custom fields, cover images, dates, location, payments, and validation are most of the admin event product. Define the smallest hiking-club event schema first. held — engineering can narrow at impl
  4. The plan assumes replacing Meetup, but Meetup's value may be discovery, RSVP norms, reminders, leader autonomy, mobile UX, or community habit rather than just event creation. Ask "what would still happen in Meetup after this ships?" held — became part of customer call assignment
  5. Storing pending submissions as EventDoc is faster, but the leak risk is being underpriced in an old multi-tenant codebase with many event query paths. Either use a separate submission model or make unpublished/pending exclusion enforced centrally below controllers. accepted — centralized filter helper + 24-callsite refactor + boundary audit
  6. The approved-event draft-copy policy sounds product-clean but is technically a second event/versioning model hiding inside Approach C. Cut edit-after-approval from v1 or model explicit event revisions before engineering starts. deferred to eng review for data-model decision
  7. Default reminders are framed as a prerequisite, but they are a separate feature with cross-impact on admin-created events. Decouple by applying a hardcoded sane default to member-submitted events for the pilot. accepted in eng review — 24h hardcoded default; full feature deferred
  8. The notification plan is overdesigned for v1 and still may miss the customer need if admins expect real-time approval. Start with immediate admin email plus in-app notification. held — daily digest stays in v1; watch for customer feedback
  9. The success metric of 300 approved events across paying orgs is disconnected from the actual business goal. Use pilot conversion, number of active leaders, Meetup displacement, and repeat leader submissions. accepted — 4-metric stack replaces vanity proxy
  10. The plan assumes the member portal can support this flow in the same Angular surface, but its location, routing, permissions, image upload, and mobile behavior are still unresolved. accepted — verified at eng review (App2 area under Application/)

Net effect of codex pass #1

6User flows

Member submission flow (happy path)

1 Open portal Events tab 2 Fill form Title→When→Where 3 Submit Idempotency check 4 Pending state My Submissions 5 Admin review Bell + digest 6 Approved Email to submitter 7 Event live Public + reminders If no review in 3 days → admin reminder · 7 days → org-owner escalation
Hike leader's path from intent to live event. Admin response cadence decoupled from member-visible Pending status.

Admin approval flow

1 Notification Bell / digest email 2 Events list Pending badge 3 Event detail Full context read 4 Approval panel Pick bank account 5a Approve Atomic flip 5b Reject + reason DraftStatus=Rejected 6 Member notified Real-time email + reason
Admin reads full context before deciding. No inline shortcut — protects against accidental approval of lodge-booking submissions.

7State machine (two-status model)

Locked after codex pass #2 caught a state-machine conflict in the original single-status design. Public visibility depends only on PublishStatus; draft review state lives on a parallel DraftStatus axis. They never collide.

DRAFT STATUS → ← PUBLISH STATUS Pending None Rejected Draft Published INITIAL SUBMISSION Public: not visible Admin sees: Pending badge Awaiting first approval (unused state) Draft without pending review REJECTED (FIRST PASS) Public: not visible Member sees reason Member can re-submit LIVE EVENT Public: VISIBLE Reminders schedule Steady state EDIT PENDING Public: VISIBLE (old version) PendingDraft != null Admin sees update pending EDIT REJECTED Public: VISIBLE (original) PendingDraft cleared Member sees reason approve reject member submits edit approve (merge) reject edit (clear draft) member re-submits edited draft KEY: approval transition rejection transition member action re-submission
Two independent axes. PublishStatus controls public visibility. DraftStatus controls admin queue. They never collide.
The bug this fixes (caught by codex pass #2)

Original single-status design used one SubmissionStatus enum for both purposes. When a member edited a live event → status flipped to Pending → visibility filter (Status=Approved) hid the event from public. Live events would disappear during member edits. Two-status model makes this structurally impossible.

8Architecture

Approach C: status fields on EventDoc with dedicated UI. Heavy reuse of existing Raklet patterns.

Existing patterns reused (not invented)

PatternSource
Approval queue blueprintApplyController.cs:1946-1958 (membership applications)
Payment routingEventDetailsEditViewModel.PaymentAccountId + OrganisationDto.DefaultPaymentAccountId
Per-manager email opt-in scaffoldingOrganisationManagerSettingsDoc.ManagerEmailSettings
Member portal areaApplication/Areas/App2/ (Razor MVC + AngularJS widgets)
Real-time notification fan-inSignalR (already wired in Application/Scripts/)
Cover image uploadExisting CDN flow
Job lease / checkpoint patternExisting Raklet.WebJobs.Secondary infrastructure

EventDoc data shape (additions)

EventDoc {
  // Approved fields (publicly visible)
  Title, Description, StartDate, TicketTypes, PaymentAccountId, ...
  IsPublished, PublishStatus: enum { Draft, Published, Archived },

  // Draft review state (independent of publish state)
  DraftStatus: enum { None, Pending, Rejected },
  DraftCreatedAt: DateTime?,
  SubmittedByMemberId: Guid?,
  SubmittedAt: DateTime?,

  // Member's pending edits (allowlisted fields only)
  PendingDraft: {
    Title, Description, StartDate, Capacity, CoverImageUrl,
    // NOT: PaymentAccountId, TicketTypes prices, IsPublished, PublishStatus
    SubmittedAt: DateTime?
  }
}

Visibility filter helper — explicit per-surface, deny-by-default

EventQueryFilters deny-by-default · explicit caller intent VisibleForPublic() IsPublished AND PublishStatus=Published VisibleForMember(orgId) scoped to org + same as Public VisibleForAdmin(orgId) all events in org including drafts/pending VisibleForSystemJob() explicit caller declares intent at call site 24 existing EventDoc-query callsites refactored to use helpers + boundary audit (calendar feeds, exports, Zapier, search, emails, webhooks) V2EventsController · EventsController · ExploreController · ZapierEventsController EventOrgSummaryService · EventEmailService · EmailReminderSchedulerService · ExportFunctions · ...
Filter intent explicit at every call site. New query paths must declare which audience they serve. No more "filter by convention."

9Cross-model challenge — Codex pass #2 (after Eng review)

Codex read the locked engineering decisions and challenged them. 10 findings. Verbatim. This pass caught a critical bug.

CODEX SAYS (engineering plan review — outside voice)
  1. SubmissionStatus=Pending on an already-approved event conflicts with the visibility rule SubmissionStatus=Approved, so submitting an edit can make the live approved event disappear. Split published approval state from pending-draft review state, or make the visibility filter explicitly treat approved top-level data with pending draft as visible. CRITICAL BUG · fixed via two-status model (D6)
  2. EventQueryFilters.VisibleTo(callerContext) will become a hidden permission oracle if every caller has to encode admin/member/public/job semantics correctly. Make the API explicit: VisibleForPublic, VisibleForMember, VisibleForAdmin, VisibleForSystemJob. Deny by default. accepted — per-surface helpers locked
  3. Refactoring 24 callsites is not enough if EventDoc data also reaches users through cached summaries, DTO projections, calendar feeds, emails, exports, search indexes, or webhooks. Build a data-flow inventory and add leak regression tests at the boundary outputs. accepted — boundary audit added to v1 scope (+2-3 days CC)
  4. Embedding PendingDraft duplicates sensitive mutable fields like tickets, payment account, dates, and publish state, which creates merge bugs and finance/reporting inconsistencies. Use a strict allowlist of draft-editable fields, block or separately review financial fields, and require ETag/version checks on approve. accepted — field-level allowlist locked
  5. Reusing EventDetailsEditViewModel for member submissions couples member validation to admin editing assumptions and will accidentally expose admin-only fields over time. Keep shared validators, but introduce a member submission command/view model with field-level authorization. accepted — shared validators + member-specific command DTO
  6. Putting pending submissions inside the existing admin event list creates risk that bulk actions, exports, filters, reminders, publishing toggles, and integrations treat pending member content as normal admin-created events. Audit every admin-list action and gate behavior by submission state. accepted — admin-list bulk-action audit added to v1 scope
  7. The hardcoded 24h reminder rule has edge cases for events created less than 24 hours before start, timezone boundaries, canceled events, rejected events, and edited approved events. Define deterministic suppression rules and test against event timezone, not server time. accepted — deterministic edge-case rules locked
  8. Daily digest and SLA jobs are duplicate-email prone unless they have recipient-level idempotency and distributed locking. Persist send markers keyed by org, event, threshold, recipient, and date. accepted — recipient-level idempotency markers + Raklet lease pattern
  9. SLA escalation using only SubmissionStatus=Pending conflates first-time submissions with pending edits to approved events. Store separate timestamps and reason/state for original submission versus pending draft. accepted — solved by two-status model + DraftCreatedAt field
  10. "24 integration tests for 24 callsites" is expensive but still weak if they only prove happy-path filtering. Add focused negative tests for tenant isolation and pending/rejected leakage across public API, member API, admin API, exports, email jobs, Zapier/webhooks, and cached summaries. accepted — negative tenant-isolation tests added to test scope

Net effect of codex pass #2

10Wireframes

Indicative layouts using Raklet's existing Bootstrap 4 + FontAwesome conventions. Final pixel work in /design-review against live screenshots.

Member submission form (mobile-first)

Application/Areas/App2/Views/Events/Submit.cshtml · mobile viewport 375px
← Submit an Event
Submit an event for Crater Lake Hiking Club

Your submission goes to an admin for review.

e.g. Saturday Crater Lake Rim Hike
Start date
Start time
End date
End time
South parking lot
20
General · $25
Tell members what to expect...
+ Upload

Member "My Submissions" — empty state vs populated

First-time visit (designed empty state)
My Submissions
📅
Host an event for Crater Lake Hiking Club

Submit your event details for admin review. Once approved, your event publishes under your org's brand.

+ Submit your first event

How does approval work?

Active member with submissions
My Submissions
Saturday Crater Lake Rim
Oct 12, 9am · 20 spots
Pending (2 days)
Mt Hood waterfall day
Oct 19, 8am · 15 spots
Approved
Mirror Lake snowshoe
Edit requested · prices
Rejected
Smith Rock weekend
Approved · Editing draft
Draft pending

Admin event detail with approval panel (desktop)

Raklet.Backend admin SPA · event detail page · DraftStatus=Pending
Events / Saturday Crater Lake Rim ⏱ Pending Approval
⏱ Member submission awaiting approval
Submitted by: Sarah Chen · Oct 5, 10:14am · 2 days ago
Crater Lake Hiking Club — Main Event Account (default) ▼
✓ Approve ✗ Reject (with reason)
Event details (pending submission preview)
Saturday Crater Lake Rim
Oct 12, 9:00 AM — Oct 12, 4:00 PM
South parking lot, Crater Lake NP
20
General · $25.00
Intermediate trail. Bring water + lunch. Meet at south parking lot 8:45am for briefing.

Admin events list with pending badge

Existing admin events list · pending member submissions inline with badge
Events
Saturday Crater Lake Rim
Submitted by Sarah Chen · Oct 5
⏱ Pending Approval
Mt Hood waterfall day
Oct 19, 8am · 15/20 attendees
Published
Annual gala 2026
Dec 12, 6pm · Admin-created
Published
Mirror Lake snowshoe
Submitted by Tom Park · Editing
⏱ Edit pending

11Design decisions locked

Visual system

Reuse Raklet's existing Bootstrap 4 + FontAwesome + Social* CSS conventions. No new design vocabulary. All user-facing strings localized across 5 locales (de, en, fr, sv, zh).

DecisionLocked value
Member form field orderTitle → When → Where → Capacity → Ticket → Description → Cover image (member task flow, not admin order)
My Submissions empty stateCentered card · fa-calendar-plus icon · designed headline + primary CTA
Mobile-first member surfacesSingle column always · native HTML5 inputs · sticky bottom action bar · 44px touch targets
Admin pending badgeProminent badge badge-warning + fa-clock · click into detail for action (no inline shortcut)
Edit form button hierarchySave primary (btn-primary) · Submit-for-approval secondary (btn-default)
Notification cadenceDaily digest email + real-time in-app bell + real-time email on decision
SLA escalation3-day admin reminder + 7-day org-owner escalation

12Success metrics

Original "300 events approved" metric was a vanity proxy. Codex pass #1 flagged it. Replaced with a 4-metric stack that tracks the actual business goal.

Day 60
Hiking club paying + active
3+
Other paying orgs with a member submission
>50%
Repeat-leader ratio in adopting orgs
1+
Customer reports reduced Meetup usage
Kill signal (pause v1.5, do customer research)

Fewer than 2 paying orgs use the feature by day 60, OR the hiking-club customer does not convert / drops Raklet after trial.

13Implementation strategy

Step 1 (foundational model + filter helper) blocks everything else. After Step 1, six lanes parallelize across worktrees.

LANE A — Foundation (sequential) EventDoc model + filter helper + status fields Models/ · Services/CosmosDbServices/ LANE B 24-callsite refactor + boundary audit Services · Raklet.Api · Application LANE C Admin SPA UI (badge + approval panel) Raklet.Backend LANE D Member portal Events surface App2/Controllers · App2/Views LANE E Email templates + notification hook Services/EmailServices LANE F Feature flag wiring Web.config LANE G Hardcoded 24h reminder logic Services/EmailServices LANE E.1 Daily digest job (after Lane E) WebJobs.Secondary LANE E.2 SLA escalation (after Lane E) WebJobs.Secondary ⚠ Coordinate merge between Lane B and Lane E Both touch Services/EmailServices/ (different files; manageable) Land Lane A first → parallelize B/C/D/E/F/G → merge with sequential rebase
Lane A is the foundational refactor. Land it first. Then 6 lanes parallelize, plus 2 follow-on jobs after Lane E's template work.

Test scope

14What worked in the review pipeline

Four reflections from the conversation, captured verbatim from the design doc. These are not "things to do" — they're patterns worth keeping for the next feature.

1. The opening brief was unusually clean

The original request layered three concerns (UI, approval, payment routing) and surfaced the "default reminders is a site feature" gotcha unprompted. Most product briefs hand off "let members create events" and leave the reminders surprise to engineering. Naming dependencies in the opening message saved a round of discovery.

2. Pushback when the AI sounded confident

When the sub-leader / regular-member distinction was introduced, the response was "why did you ask, what's the difference?" — not nodding. That question is the reason the design is right. If the distinction had been accepted, v1 would be a two-tier system instead of a single flow with v2 auto-approve. Worth keeping the instinct to ask "but why" when an AI sounds confident.

3. Mid-session reversals on UX calls

Notification timing flipped: real-time → daily digest → ("but admins shouldn't keep members waiting") → digest with real-time bell + real-time submitter email on decision. Not flip-flopping. Holding the user experience as the load-bearing concern over engineering convenience. Worth doing more of, even when the AI argues against you.

4. "Did you check the codebase?"

This is the move that separates the people who get useful designs from AI from those who get plausible-sounding ones. The codebase research is what changed "per-manager opt-in is v1.5" to "per-manager opt-in is free in v1." That single finding probably saved a quarter of cycle time on this feature.

15Next steps

  1. Call the hiking-club prospect this week. The Assignment from Office Hours. Validate the wedge before engineering commits. CEO action.
  2. Create the Linear task (Engineering team · Feature label · High priority).
  3. Create the implementation PR. Worktree off latest master. Land docs + mkdocs nav in the same commit.
  4. Land Lane A: filter helper + 24-callsite refactor + boundary audit. Highest-risk regression scope. Lock first.
  5. Parallelize Lanes B–G in worktrees. Coordinate the Lane B + E merge.
  6. Run /design-review against live screenshots — verify Bootstrap aesthetic match + mobile experience on a real device.
  7. scripts/dev/pr-ready-check.ps1 + QA screenshots to Azure Blob per standing PR-readiness rules.

Linked artifacts

DocumentSource (GitHub)Rendered (docs site)
Design doc (canonical) repo docs site
CEO plan (scope decisions) repo docs site
Test plan repo docs site
Deferred v1.5 items TODOS.md