Skip to content

Update afternoon schedule and add Engineering Loteria session - #14

Merged
shrinkray merged 7 commits into
mainfrom
feat/sanityUpdates
Sep 15, 2026
Merged

shrinkray merged 7 commits into
mainfrom
feat/sanityUpdates

Conversation

@shrinkray

@shrinkray shrinkray commented Sep 15, 2026 •

Copy link
Copy Markdown
Contributor

User description

Summary

Two content updates for the 2026 summit:

  • Schedule times (conferenceActivities.js): Sessions now end at 14:00 rather than 16:00, freeing the 14:00 slot for the Engineering Loteria. Closing Remarks & Prizes moves to 15:30–16:00 and Techie Hour & Networking to 16:00–17:00, so the day wraps an hour earlier than before.
  • Speaker/session content (speakers.generated.json, regenerated from Sanity): the Level Up panel is retitled to "Detroit Latin Heritage Month Innovation Summit Panel Discussion" with a shorter description broken out by participating organization, and SHPE Detroit's Engineering Loteria is added as a 14:00 Main Room session.

Test plan

  • pnpm build succeeds
  • Schedule page shows the new afternoon times with no gaps or overlaps
  • Engineering Loteria appears at 14:00 and its session detail renders

🤖 Generated with Claude Code

https://claude.ai/code/session_01Kckqqm3FepYjhVFPFjU5aG


Generated description

Below is a concise technical summary of the changes proposed in this PR:
Update the 2026 summit schedule and session data to add Engineering Loteria, retitle and revise the Latin Heritage Month panel, and shift afternoon activities earlier. Normalize Sanity session tags so schedule chips and type labels always have usable values.

TopicDetails
Session Tag Quality Normalize and trim session tags from Sanity data, falling back to the default track when no valid tags remain.
Modified files (1)
  • scripts/fetch-event-data.mjs
Latest Contributors(1)
UserCommitDate
hello@gregmiller.iofix(speakers): drop bl...September 15, 2026
Summit Schedule Add Engineering Loteria at 14:00 in the Main Room, revise the Latin Heritage Month panel content, and update the afternoon schedule through networking.
Modified files (2)
  • src/data/2026/conferenceActivities.js
  • src/data/2026/speakers.generated.json
Latest Contributors(2)
UserCommitDate
hello@gregmiller.iofix(schedule): name th...September 15, 2026
SShumunov@gmail.comfeat: IWD 2026 Summit ...March 26, 2026
Review this PR on Baz
Customize your next review

shrinkray and others added 2 commits September 14, 2026 20:52
Sessions now end at 14:00 to make room for the Engineering Loteria
activity, and closing remarks plus the techie hour shift a half hour
earlier, wrapping the day at 17:00 instead of 18:00.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Kckqqm3FepYjhVFPFjU5aG
Regenerated from Sanity: the Level Up panel picks up its final title and
a shorter description organized by participating org, and SHPE Detroit's
Engineering Loteria is added as a 14:00 session in the Main Room.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Kckqqm3FepYjhVFPFjU5aG
@vercel

vercel Bot commented Sep 15, 2026 •

Copy link
Copy Markdown

The latest updates on your projects. Learn more about Vercel for GitHub.

Project Deployment Actions Updated
mishpe26 Ready Ready Preview Sep 15, 2026 1:37am UTC

content: null,
time: '13:00',
timeEnd: '16:00',
timeEnd: '14:00',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Schedule shows an unexplained afternoon gap

Changing schedule-sessions-afternoon to end at 14:00 leaves the 14:00–15:30 Level Up session unavailable to SessionsSection and NavRunOfShow, since they filter by the active Schedule track, so the timeline has a gap — should we add an explicit Schedule-track break/transition or represent that interval in those consumers?

Severity

Want Baz to fix this for you? Activate Fixer

Other fix methods

Fix in Cursor

Prompt for AI Agents
Before applying, verify this suggestion against the current code. In
`src/data/2026/conferenceActivities.js` around lines 61-61, update the conference
schedule data so the new 14:00 end time for `Sessions` does not leave an unrepresented
14:00–15:30 gap. Add an explicit `Schedule`-track break or transition activity for
that interval, following the existing data conventions, and verify that
`SessionsSection` and `NavRunOfShow` include and display it when filtering by the
active/`Schedule` track.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Commit 438f3d5 addressed this comment by adding a Schedule-track “Engineering Loteria” activity from 14:00–15:00 and shifting subsequent schedule activities earlier, eliminating the gap.

Comment on lines +313 to +317
},
{
"id": 1001125532,
"name": "SHPE Detroit",
"avatar": "https://cdn.sanity.io/images/d1h6cagq/production/b4ac13262059c2f3857fad8f263e05917cb09bfd-2667x4252.jpg",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Partial builds drop Engineering Loteria

The committed Engineering Loteria row is overwritten when a non-empty Sanity response omits that session, so the public roster loses it while the write reports success — should we guard partial results against the expected session or preserve/reject the row before replacing the file?

Severity

Want Baz to fix this for you? Activate Fixer

Other fix methods

Fix in Cursor

Prompt for AI Agents
Before applying, verify this suggestion against the current code. In
`src/data/2026/speakers.generated.json` around lines 313-317, protect the `Engineering
Loteria` session from being removed by partial regeneration. Update the roster
generation/write logic to validate that expected sessions such as this one are present,
or merge/preserve the existing record when Sanity returns an incomplete non-empty
result; reject the replacement and report an error instead of treating it as a
successful write.

Comment thread src/data/2026/speakers.generated.json Outdated
"title": "Engineering Loteria",
"abstract": "",
"description": "Celebrate Hispanic Heritage Month through an interactive, culturally rooted spin on the classic game of chance. Replace the traditional chalupa and catrín with engineering icons, software terms, hardware components, and technical milestones. Attendees network, test their STEM trivia, and compete for prizes in a lively community atmosphere.\n⚬\tInteractive Gameplay: Custom Lotería cards spotlight engineering concepts, technical tools, and historic Hispanic innovators.\n⚬\tCommunity Connection: Connect students, seasoned technologists, and industry leaders across disciplines.\n⚬\tPrizes and Trivia: Earn recognition and take home gear while celebrating culture, craft, and technical problem-solving.",
"tags": ["STEM Pipeline", "Tech Trivia", "Diversity", ""],

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Blank topic chip in speaker modal

The Engineering Loteria record at src/data/2026/speakers.generated.json:329-329 includes an empty tags value, so SpeakerDetails renders a blank Topics chip for SHPE Detroit — should we remove it from the authoritative data or filter empty labels before rendering?

Guidelines: .claude/agents/code-review.md

Severity

Want Baz to fix this for you? Activate Fixer

Other fix methods

Fix in Cursor

Prompt for AI Agents
Before applying, verify this suggestion against the current code. In
`src/data/2026/speakers.generated.json` around lines 329-329, fix the Engineering
Loteria record’s `tags` array by removing the empty string so `SpeakerDetails` cannot
render a blank Topics chip. Update the authoritative source and regenerate this
generated artifact if applicable; also consider filtering empty tag labels before
mapping them to topic spans as a defensive safeguard.

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Commit 438f3d5 addressed this comment by removing the empty tag from SHPE Detroit’s Engineering Loteria record, preventing a blank Topics chip.

"tags": ["STEM Pipeline", "Tech Trivia", "Diversity", ""],
"track": "Level Up",
"time": "14:00",
"room": "Main Room",

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

New session advertises noncanonical room

The new Level Up session hardcodes Main Room instead of the canonical VENUE_ROOMS.LEVEL_UP (Engineering Building), so schedule and calendar exports forward an unverified location — should we use the canonical room in the source and regenerate, or update the venue registry first if Main Room is confirmed?

Guidelines: .claude/agents/code-review.md

Severity

Want Baz to fix this for you? Activate Fixer You can also update your AI coding guidelines based on this comment by apply pr to [branch name]

Other fix methods

Fix in Cursor

Prompt for AI Agents
Before applying, verify this suggestion against the current code. In
`src/data/2026/speakers.generated.json` around lines 332-332, update the new Level Up
session’s `room` value from the unverified `Main Room` label to the canonical
`VENUE_ROOMS.LEVEL_UP` value, `Engineering Building`. Locate and edit the authoritative
source, then regenerate this generated JSON; only add or change the venue registry first
if `Main Room` has been confirmed as the approved canonical label.

shrinkray and others added 5 commits September 15, 2026 01:13
The afternoon Sessions block ended at 14:00 while the Loteria runs
14:00-15:00 in the Level Up track, so the Schedule tab and the mobile
run-of-show jumped straight from 14:00 to Closing Remarks at 15:30 and
never accounted for the new session.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DgrmHLBfXRaPCzK9tdvfRd
The Loteria session carries an empty tag in Sanity, which SpeakerDetails
rendered as an empty Topics chip. Normalize tags in the importer so blank
and non-string entries are dropped for every session, and mirror the
result into the generated roster.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DgrmHLBfXRaPCzK9tdvfRd
Sessions now run to 15:00, so pull Closing Remarks & Prizes to 15:00-15:30
and Techie Hour & Networking to 15:30-16:30. The run-of-show is continuous
from 09:00 to 16:30 and the day wraps 30 minutes earlier.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DgrmHLBfXRaPCzK9tdvfRd
Fitness Yoga is unpublished in Sanity — it runs before opening remarks and
is already covered by the Morning Mindfulness & Meditative Yoga entry in
the run-of-show, so it does not need to be a Level Up session.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DgrmHLBfXRaPCzK9tdvfRd
Replace the afternoon Sessions umbrella with the panel discussion
(13:00-14:00) and the Engineering Loteria (14:00-15:00) as their own
Schedule-track entries, so the run-of-show names both activities before it
returns to closing remarks.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01DgrmHLBfXRaPCzK9tdvfRd
},
{
"id": 1293748638,
"id": 377718030,

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Saved selections disappear after ID changes

Changing William Bowen’s ID to 377718030 and the panel activity ID to schedule-panel leaves existing 1293748638 and schedule-sessions-afternoon selections unchanged because canonicalizeSessionId returns unknown values as-is, so exact filtering hides the replacement entries — should we add canonical aliases for both old identifiers or migrate persisted selections?

Severity

Want Baz to fix this for you? Activate Fixer

Other fix methods

Fix in Cursor

Prompt for AI Agents
Before applying, verify this suggestion against the current code. In
`src/data/2026/speakers.generated.json` around line 136 and
`src/data/2026/conferenceActivities.js` around line 56, preserve backward compatibility
for William Bowen’s old ID `1293748638` and the old activity ID
`schedule-sessions-afternoon`, which were replaced by `377718030` and `schedule-panel`.
Update `canonicalizeSessionId` or the persisted-data migration layer to map both legacy
identifiers to their new canonical IDs before My Schedule, sidebar, and export filtering
runs. Add or update tests to verify existing saved selections resolve to the replacement
speaker session and panel.

Comment on lines +65 to +70
id: 'schedule-loteria',
track: SCHEDULE_TRACK,
title: 'Engineering Loteria',
content: null,
time: '14:00',
timeEnd: '15:00',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Duplicate Loteria calendar events

The shared save flow stores activity ID schedule-loteria and generated session ID 1001125532 as unrelated because activity IDs do not resolve through speakersData, so SessionsSection exports both and the ICS generator emits duplicate Engineering Loteria VEVENTs — should we give them one canonical identity or exclude one from save/export?

Severity

Want Baz to fix this for you? Activate Fixer

Other fix methods

Fix in Cursor

Prompt for AI Agents
Before applying, verify this suggestion against the current code. In
`src/data/2026/conferenceActivities.js` around lines 65-70, the `schedule-loteria`
activity duplicates SHPE Detroit’s generated speaker session but uses an unrelated ID,
so the shared save flow and `SessionsSection` export it as a second event. Refactor the
save/export logic to give this activity the same canonical identity as the generated
session (including overlap detection), or explicitly mark the static activity as
non-saveable and exclude it from exports. Add or update tests to verify that saving
Engineering Loteria produces only one saved item and one ICS VEVENT.

Comment on lines +87 to +88
time: '15:30',
timeEnd: '16:30',

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

JSON-LD outlasts published schedule

The homepage’s SEOStructuredData still emits endDate: 2026-09-19T17:00:00-04:00 even though the visible run-of-show ends at 16:30, so public information advertises a later event end — should we derive it from the authoritative schedule or update the structured metadata?

Guidelines: .claude/agents/code-review.md

Severity

Want Baz to fix this for you? Activate Fixer You can also update your AI coding guidelines based on this comment by apply pr to [branch name]

Other fix methods

Fix in Cursor

Prompt for AI Agents
Before applying, verify this suggestion against the current code. In
`src/data/2026/conferenceActivities.js` around lines 87-88, the `Techie Hour &
Networking` entry establishes the visible schedule end at 16:30, while
`SEOStructuredData` still advertises a 17:00 `endDate`. Update the structured-data
end-time source to match the authoritative schedule, preferably by deriving it from the
latest activity rather than retaining a separate hardcoded boundary, and verify the
generated metadata uses 16:30 on September 19, 2026.

.map((tag) => (typeof tag === 'string' ? tag.trim() : ''))
.filter(Boolean)
: []
return labels.length ? labels : [DEFAULT_TRACK]

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Fallback ignores session track

The empty-label branch hard-codes DEFAULT_TRACK, and buildRow doesn't pass session.track, so tagless, whitespace-only, or non-string CMS tags on an Innovation session yield ['Level Up'] as the visible type label in schedules.js — should we pass the resolved track into the helper?

Severity

Want Baz to fix this for you? Activate Fixer

Other fix methods

Fix in Cursor

Prompt for AI Agents
Before applying, verify this suggestion against the current code. In
`scripts/fetch-event-data.mjs` around lines 141-147 and 170-174, fix `normalizeTags` and
its `buildRow` call so empty, whitespace-only, or non-string tags fall back to the
session’s resolved track rather than hard-coded `DEFAULT_TRACK`. Pass `session.track
|| DEFAULT_TRACK` into the helper, and use that argument as the fallback label while
preserving the existing tag normalization.

@shrinkray

Copy link
Copy Markdown
Contributor Author

@ -0,0 +1,45 @@

Baz review — fixed vs. skipped

Verified each finding against the code before acting. Two were real and needed for the Loteria; two are out of scope for this PR.

Fixed

1. Schedule shows an unexplained afternoon gap — real, and introduced by this PR (17cbb43, 1aca68a, 438f3d5).

SessionsSection and NavRunOfShow merge sessions and activities only within a track, so the Schedule tab is driven entirely by conferenceActivities. With the afternoon block ending at 14:00, the run-of-show went from 14:00 straight to Closing Remarks at 15:30, while the Loteria actually runs 14:00–15:00 in the Level Up track — attendees reading the Schedule tab would think the day paused.

The afternoon now names both activities instead of hiding them behind a Sessions umbrella, and the closing blocks follow immediately:

Time Run-of-show
12:15–13:00 Lunch Break & Networking
13:00–14:00 Detroit Latin Heritage Month Innovation Summit Panel Discussion
14:00–15:00 Engineering Loteria
15:00–15:30 Closing Remarks & Prizes
15:30–16:30 Techie Hour & Networking

The run-of-show is continuous from 09:00 through 16:30 with no gap — the day wraps 30 minutes earlier than the original 17:00. Checked programmatically for gaps and overlaps; the only overlap left is the deliberate morning one, where Check-In runs 08:00–09:00 alongside yoga and opening remarks.

2. Blank topic chip in speaker modal — real (4721020).

The Loteria's tags really does carry a trailing "", and SpeakerDetails maps every entry, so SHPE Detroit rendered an empty bordered pill under Topics. The empty value originates in Sanity, so fixing only the generated JSON would come back on the next regeneration. Instead the importer now normalizes tags — trimmed strings only, non-strings dropped, falling back to the track when nothing usable remains. Unit-checked against eight tag shapes, including null, [], ["", " "] and mixed non-strings; the regenerated roster in f07b141 confirms it strips the blank tag in practice.

The Sanity document still holds the stray empty tag — harmless now that the importer drops it, but worth clearing in the Studio.

Also in this branch

f07b141 regenerates the roster from Sanity, which drops Fitness Yoga. It runs before opening remarks and the run-of-show already covers it as Morning Mindfulness & Meditative Yoga, so it does not need to be a Level Up session.

Skipped

3. Partial builds drop Engineering Loteria — no change.

The importer already refuses to replace real data with an empty result (shouldKeepExisting keeps the committed file when a query returns 0 rows and warns rather than failing the build). Baz's remaining case is a non-empty but incomplete response, and guarding a named session against that would mean pinning expected content in code — which contradicts Sanity being the single source of truth for the roster. If a session disappears from Sanity, the site should reflect Sanity: exactly what happened with Fitness Yoga above, and the behaviour we want. Nothing here is specific to the Loteria, so it isn't part of this PR.

4. New session advertises noncanonical room — premise doesn't hold.

Main Room isn't hardcoded by this PR; it's the value in Sanity, and every published 2026 session with a room set uses it. DEFAULT_ROOM in the importer is '', and VENUE_ROOMS.LEVEL_UP (Engineering Building) is only referenced by conferenceActivities entries. So the label mismatch is pre-existing across the whole session dataset, not something the Loteria introduced — changing this one row would make it the odd one out. Deciding which label is correct for the venue and then aligning Sanity and venues.js together belongs in its own change.

Verification

eslint (repo scope), the a11y config and prettier --check all pass; the two pre-existing no-unused-vars errors in fetch-event-data.mjs are unchanged and outside the lint script's --ext js,jsx scope. pnpm build wasn't run locally — build coverage falls to CI.

@shrinkray
shrinkray merged commit a637cab into main Sep 15, 2026
6 checks passed

This branch was successfully deployed

1 active deployment
Preview — 438f3d54 Deployed Sep 15, 2026 by vercel[bot]
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.

1 participant