Skip to content

Commit cdfc983

Browse files
Document real GridSmart shape and fix UTC/ET handling
Verified against last year's published grid (sessionize.com/api/v2/ayab1utz/view/GridSmart). Two correctness fixes: - Session startsAt/endsAt are UTC (Z suffix), not ET. Agenda + now/next workflows now explicitly convert UTC -> Eastern Time when displaying. - The agenda workflow referenced a nonexistent startSlot field; replaced with the real nested days[].rooms[].sessions[] traversal, including dedup of plenary sessions and filtering of isServiceSession entries. Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent d0edffa commit cdfc983

3 files changed

Lines changed: 58 additions & 10 deletions

File tree

‎.claude-plugin/plugin.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "techbash",
33
"description": "Connect your project to the TechBash 2026 session catalog — discover relevant talks, look up speakers, plan your schedule, and capture notes from your development environment.",
4-
"version": "0.3.0",
4+
"version": "0.3.1",
55
"author": {
66
"name": "TechBash"
77
},

‎.github/plugin/plugin.json‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "techbash",
33
"description": "Connect your project to the TechBash 2026 session catalog — discover relevant talks, look up speakers, plan your schedule, and capture notes from your development environment.",
4-
"version": "0.3.0",
4+
"version": "0.3.1",
55
"author": {
66
"name": "TechBash",
77
"url": "https://techbash.com"

‎skills/techbash/SKILL.md‎

Lines changed: 56 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ compatibility: >-
2020
per conversation and filter in-context.
2121
metadata:
2222
author: TechBash organizers
23-
version: "0.3"
23+
version: "0.3.1"
2424
domain: techbash
2525
---
2626

@@ -63,8 +63,8 @@ Key fields from the Sessions / All views:
6363
| `description` | Full abstract (markdown-ish; may contain `\r\n`) |
6464
| `speakers[]` | Array of `{ id, name }` — join to the Speakers view for bios/links |
6565
| `categories[]` | Track/level/format tags (may be empty pre-publish) |
66-
| `room` / `roomId` | `null` until the schedule is published |
67-
| `startsAt` / `endsAt` | ISO timestamps in ET; `null` until the schedule is published |
66+
| `room` / `roomId` | `null` until the schedule is published; populated from GridSmart once the grid is live |
67+
| `startsAt` / `endsAt` | ISO 8601 timestamps in **UTC** (e.g. `2025-11-04T14:00:00Z` = 10:00 EDT); `null` until the schedule is published. Always convert to Eastern Time before showing to the user. |
6868
| `status` | `Accepted` for confirmed sessions |
6969
| `isServiceSession` | `true` for non-talk slots (meals, breaks, family-day activities) |
7070

@@ -74,6 +74,53 @@ Key fields from the Sessions / All views:
7474
| --- | --- |
7575
| `id` (GUID) | Use to join from session `speakers[].id` |
7676
| `fullName`, `firstName`, `lastName`, `tagLine`, `bio` | Display fields |
77+
78+
### GridSmart (schedule) shape
79+
80+
When published, GridSmart returns an array of day objects. Until then it returns `[]` — handle that case before trying to index into anything.
81+
82+
```jsonc
83+
[
84+
{
85+
"date": "2026-10-13T00:00:00Z", // day bucket (UTC midnight)
86+
"isDefault": false,
87+
"rooms": [
88+
{
89+
"id": 60694,
90+
"name": "Sagewood",
91+
"hasOnlyPlenumSessions": false,
92+
"sessions": [
93+
{
94+
"id": "919802",
95+
"title": "...",
96+
"description": "...",
97+
"startsAt": "2026-10-13T14:00:00Z", // ALWAYS UTC ("Z" suffix)
98+
"endsAt": "2026-10-13T17:30:00Z",
99+
"isServiceSession": false, // meals / breaks / registration
100+
"isPlenumSession": false, // keynote / plenary
101+
"speakers": [{ "id": "<guid>", "name": "Chris Ayers" }],
102+
"categories": [],
103+
"roomId": 60694,
104+
"room": "Sagewood",
105+
"liveUrl": null,
106+
"recordingUrl": null, // populated post-event when uploads land
107+
"status": "Accepted",
108+
"isInformed": true,
109+
"isConfirmed": true
110+
}
111+
]
112+
}
113+
]
114+
}
115+
]
116+
```
117+
118+
Notes:
119+
120+
- Times are **UTC**. Always convert to Eastern Time (America/New_York, which is EDT during TechBash week) before displaying. Eastern Time observes DST; the offset is `-04:00` in October.
121+
- `isServiceSession: true` marks meals, breaks, registration, and family-day activities — exclude these from "what talks are on?" answers unless the user explicitly asks.
122+
- `isPlenumSession: true` marks keynotes / shared sessions; they typically appear in every room's `sessions[]` or in a single dedicated room. Deduplicate by session `id`.
123+
- `liveUrl` / `recordingUrl` are usually `null` during the event; the recording URL is populated days-to-weeks after the conference.
77124
| `profilePicture` | URL to the headshot |
78125
| `sessions[]` | `{ id, name }` — reverse index back to sessions |
79126
| `links[]` | `{ title, url, linkType }` — Twitter / LinkedIn / Blog / Company_Website / etc. |
@@ -184,14 +231,15 @@ Stack: Node 22, TypeScript, Azure Functions, GitHub Actions
184231

185232
1. Run the matching workflow above to pick recommended sessions.
186233
2. Fetch GridSmart.
187-
3. If GridSmart is empty (no `startSlot`/`rooms`), tell the user the schedule isn't published yet and offer to save the un-timed picks as a markdown shortlist.
188-
4. If GridSmart has data, build a per-day itinerary, flag conflicts, and offer to save as `techbash-agenda.md` (and, on request, `techbash-agenda.ics`). Do not write files until the user confirms.
234+
3. If GridSmart is `[]` (empty array), tell the user the schedule isn't published yet and offer to save the un-timed picks as a markdown shortlist.
235+
4. If GridSmart has data, build a per-day itinerary by iterating each day's `rooms[].sessions[]`, deduplicating sessions that appear in multiple rooms (e.g. plenary sessions), converting `startsAt`/`endsAt` from UTC to Eastern Time, flagging conflicts where the user's picks overlap, and excluding `isServiceSession: true` entries unless asked. Offer to save as `techbash-agenda.md` (and, on request, `techbash-agenda.ics`). Do not write files until the user confirms.
189236

190237
### "What's happening now?" / "What's next in \<room\>?"
191238

192-
1. Fetch GridSmart. If empty, report "schedule not yet published".
193-
2. Compare the current time (Eastern Time) to session `startsAt`/`endsAt`.
194-
3. Return the matching session(s) with title, speaker, room, and remaining time.
239+
1. Fetch GridSmart. If `[]`, report "schedule not yet published" and stop.
240+
2. Get the current time in Eastern Time, convert it to UTC for comparison against session `startsAt`/`endsAt`.
241+
3. Walk every day's `rooms[].sessions[]`, deduplicating by session `id` (plenary sessions can appear in multiple rooms). Exclude `isServiceSession: true` unless the user asked about meals/breaks specifically.
242+
4. Return the matching session(s) with title, speaker, room (display the room `name`, not the `roomId`), and remaining time — formatted in Eastern Time, e.g. "ends at 3:30 PM ET (32 min left)".
195243

196244
### "Log a note from \<session\>"
197245

0 commit comments

Comments
 (0)