Skip to content

Commit ed656f3

Browse files
authored
feat: add "Agent in a Day" workshop + first-class module navigation in agendas (#394)
* feat: add "Agent in a Day" workshop Full-day, hands-on workshop composed entirely from existing module and lab entities (no new lab content). Maps the published agenda to four module->lab pairs: M365 Agent Builder, Core Concepts Part 1 & 2, and Orchestration & Dynamic Chaining, plus welcome/intro sessions and breaks. Adds: - _workshops/agent-in-a-day.md (order 4, after "MCS in a Day") - _data/agendas/agent-in-a-day.yml (full 9:00-16:00 schedule) - CHANGELOG.md entry Module slide decks resolve automatically from each module's own front matter. Verified with a local Jekyll build: page renders and all four lab links and four module links resolve. * refactor: keep agenda in sync with entities Remove redundant overrides from the Agent in a Day agenda so module/lab rows stay sourced from their entities. All duration overrides exactly matched _modules/_labs values, and module title overrides were identical too, so durations and module titles now resolve live (item.x | default: entity.x). Updates to a module or lab (link, description, level, duration, slides, module title) propagate automatically. The only intentional override kept is the short event-friendly title on each lab row, matching the existing mcs-in-a-day pattern. * feat: accent agenda module rows with a distinct rail Style type:module agenda rows like lab rows (boxed card, prominent title, hover) but with a purple left accent rail (--color-journey-purple) instead of the lab rows' blue accent, so modules read as clickable companions to labs rather than plain session text. Adds .ws-agenda-row--module rules and switches the module <li> class from --session to --module in _layouts/event.html. Applies to every event/workshop agenda. * feat: make modules first-class in event navigation Generalize the previously lab-only event-nav engine so module pages reached from an agenda get the same in-event UX as labs, and fix module rows rendering blank in the agenda popover. - manifest: resolve module schedule rows against the _modules collection (emit title/slug/url/duration), fixing blank module rows in the rail agenda popover; add a `type` field to the page context so the engine knows whether the current page is a lab or a module. - script: item-type aware throughout — eventContainsItem(), sequence and Prev/Next over the current page's type ("Module X of N"), module rows linkable + highlightable in the popover, and a breadcrumb override that handles both the theme breadcrumb (labs) and the module breadcrumb. - module.html: include the event rail, nav-pair, and script so a module opened from an agenda shows the blue rail + an agenda-aware breadcrumb back to the originating event/workshop. Standalone module pages (no event context) are unchanged.
1 parent cb595f7 commit ed656f3

7 files changed

Lines changed: 268 additions & 69 deletions

File tree

CHANGELOG.md

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,14 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
88
## Unreleased
99

1010
### Added
11+
- **New "Agent in a Day" workshop (`_workshops/agent-in-a-day.md` + `_data/agendas/agent-in-a-day.yml`).** Full-day, hands-on workshop composed entirely from existing module and lab entities — no new lab content. Agenda: Welcome + Kickoff, Intro to Hands-On Labs, then four module→lab pairs — Module 1 / Lab 1 *M365 Agent Builder* (`agent-builder``agent-builder-m365`), Module 2 / Lab 2 *Core Concepts Part 1 → Creation, Topics, Knowledge, and Tools* (`core-concepts-part1``core-concepts-agent-knowledge-tools`), Module 3 / Lab 3 *Core Concepts Part 2 → Variables, Agents, and Channels* (`core-concepts-part2``core-concepts-variables-agents-channels`), and Module 4 / Lab 4 *Orchestration & Dynamic Chaining → Orchestration with Copilot Studio* (`orchestration``mcs-orchestration`), with coffee and lunch breaks. Module slide decks resolve automatically from each module's own `slides:` front matter. Listed on `/workshops/` at `order: 4`, immediately after *MCS in a Day*.
12+
- **Module pages now participate in event navigation.** When a module page is reached from an event/workshop agenda (via `?event=`, or a sticky in-session context), it shows the same in-event chrome labs already had: the blue **event rail** (event name, "Module X of N", Prev/Next across the event's modules, and an expandable agenda popover) plus an event-aware **breadcrumb** that points back to the originating agenda instead of "All Modules". The previously lab-only event-nav engine (`_includes/event-nav/script.html`) was generalized to be item-type aware (lab *or* module), driven by a new `type` field on the page context; `_layouts/module.html` now includes the rail, nav-pair, and script. Standalone module pages (no event context) are unchanged.
1113
- **Backlog Tracker at `/tracker/`.** New static page surfacing GitHub issues across 5 categories (Bugs, New Labs, Content Updates, Portal Enhancements, Bootcamp Features). Two tabs: **Insights** (default — KPI tiles, donut by category, opened-vs-closed trend line with date/count axes, per-category aging breakdown with stacked bucket bars + named oldest issues, top-15 oldest open issues table) and **Board** (Kanban with Triage / Backlog / In Progress / Done columns, filter chips per category, smart "+ New item" button that picks the right GitHub issue template based on the active filter). 100% public — any deeper interaction (assignees, comments, history) deep-links to the corresponding GitHub issue. **Data is fetched live from the public GitHub Issues REST API in the browser on each page load** (no scheduled workflow, no committed snapshot in the hot path) — the page shapes raw issues client-side into the five categories and lifecycle states. A manual **Refresh** button re-fetches on demand; tab switches / filter clicks / time-range changes do NOT re-fetch (they re-render from the already-loaded dataset). Time-range selector (7d / 14d / 30d / 60d / 90d) drives the Closed KPI, trend chart x-axis, and Done column window. If the live API call fails (network, 5xx, or anonymous-rate-limited at 60/hr/IP), the page falls back to a committed seed JSON at `assets/data/issues.json` and surfaces the degraded state in the header ("⚠ Cached snapshot · N min old (live API unavailable)"). Linked from the home-page footer only — not site-wide nav. Inherits `layout: single` so masthead, footer, and theme switcher are consistent with the rest of the site. Lab Assistant + "Request an account" CTA are suppressed on this page. Module split: `tracker.md` (page shell), `assets/css/tracker.css`, `assets/js/tracker/{data,insights,board,main}.js`, `_data/tracker.yml` (repo config + stale threshold), `scripts/build-tracker-data.js` (standalone Node script for occasionally regenerating the seed JSON, with Node 20 built-in test runner unit tests).
1214
- **`Bootcamp Feature` issue template.** New `.github/ISSUE_TEMPLATE/bootcamp_feature.yml` for bootcamp process, tooling, and management work — auto-applies `type: bootcamp-feature` and `status: triage` so new submissions land in a reviewable state.
1315
- **Labels: `type: bootcamp-feature`, `status: triage`, `status: backlog`, `status: in-progress`.** Support the Backlog Tracker's Triage → Backlog → In Progress → Done lifecycle.
1416

1517
### Changed
18+
- **Agenda module rows now render as accented cards.** On every event/workshop agenda, `type: module` rows are styled like lab rows (boxed card, prominent title, hover) but with a distinct **purple** left accent rail (`--color-journey-purple`) versus the lab rows' blue rail — surfacing that modules are clickable links to their module page and visually separating modules from labs in the timeline. Previously module rows reused the plain, unboxed `--session` styling. New `.ws-agenda-row--module` rules in `_layouts/event.html`; the module `<li>` now carries `ws-agenda-row--module`.
1619
- **Issue template rename: "Redesign feedback" → "Portal Enhancements".** The air-theme redesign is now just "the site," so the template covering site-wide bugs/suggestions has been renamed and broadened. File renamed `.github/ISSUE_TEMPLATE/redesign-feedback.yml``portal_enhancement.yml`; label `redesign``portal-enhancement`. The "Which page?" dropdown now includes `Backlog tracker (/tracker/)`.
1720
- **Label rename: `feedback``discussion`.** Distinguishes open-ended threads from the existing `question` label (which implies a specific answer is wanted).
1821

@@ -28,6 +31,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
2831
- **Multi-Agent UC #2 "Set the X to:" lines standardized.** US version was bold (`**US Product Information Agent**`); UK was inline code; both now use fenced ` ```text ``` ` blocks so the values render with a Copy button consistent with the rest of the lab. Removed a stray trailing backtick on line 362 (UK instructions block) that would have copied with the literal value.
2932

3033
### Fixed
34+
- **Module rows no longer render blank in the in-lab agenda popover.** The event-nav manifest (`_includes/event-nav/manifest.html`) only emitted `item.title` for non-lab schedule rows, so any `type: module` row whose agenda omitted an explicit title (i.e. relied on the module entity's own title) appeared as a time with no label in the rail's expandable agenda. The manifest now resolves module rows against the `_modules` collection — emitting the module's `title`, `slug`, `url`, and `duration` — mirroring how lab rows are enriched, so the full agenda renders and module rows are clickable.
3135
- **Table CSS in `assets/css/main.scss` — three site-wide rendering bugs.** (1) Header `th` horizontal padding now uses `1.25em` to compensate for `font-size: 0.8em` so cells line up with `tbody td` (was 11.264px header / 14.08px body — now both 14.08px). (2) Row separators switched from `var(--color-bg-elevated)` to `var(--color-divider)` for better dark-theme contrast (the elevated tone was nearly invisible against the dark page bg). (3) Tables now declare `display: table; width: 100%` to override the upstream minimal-mistakes `display: block` so cells stretch to fill the content column instead of shrinking to the longest line and visually stopping short of the heading rule.
3236

3337
### Fixed

_data/agendas/agent-in-a-day.yml

Lines changed: 89 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,89 @@
1+
event_id: agent-in-a-day
2+
3+
# Agent in a Day — 1-day hands-on agenda.
4+
#
5+
# Module and lab rows are linked to first-class entities by `slug` only, so
6+
# they stay in sync automatically: the layout resolves the link, description,
7+
# difficulty level, duration, and (for modules) slide deck live from
8+
# _modules/<slug>.md and _labs/<slug>.md on every build. Do NOT duplicate
9+
# those values here — an override freezes the field (`item.x | default: entity.x`).
10+
#
11+
# The ONLY intentional override kept here is the short `title:` on lab rows:
12+
# an event-friendly agenda label (e.g. "Variables, Agents, and Channels") that
13+
# is deliberately more concise than the lab's full descriptive title. Everything
14+
# else flows from the entity. Sessions and breaks are not entity-backed, so they
15+
# carry their own title/description/duration.
16+
17+
schedule:
18+
- type: session
19+
title: "Welcome + Kickoff"
20+
description: "Meet your instructor, review the day, and set expectations."
21+
label: "Welcome"
22+
time: "09:00"
23+
duration: 15
24+
25+
- type: session
26+
title: "Introduction to Hands-On Labs"
27+
description: "Overview of the lab environment, setup instructions, and how the day flows."
28+
label: "Intro"
29+
time: "09:15"
30+
duration: 15
31+
32+
- type: module
33+
slug: agent-builder
34+
label: "Module 1"
35+
time: "09:30"
36+
37+
- type: break
38+
title: "Coffee break / Q&A"
39+
time: "10:00"
40+
duration: 15
41+
42+
- type: lab
43+
slug: agent-builder-m365
44+
label: "Lab 1"
45+
title: "M365 Agent Builder"
46+
time: "10:15"
47+
48+
- type: module
49+
slug: core-concepts-part1
50+
label: "Module 2"
51+
time: "10:45"
52+
53+
- type: lab
54+
slug: core-concepts-agent-knowledge-tools
55+
label: "Lab 2"
56+
title: "Creation, Topics, Knowledge, and Tools"
57+
time: "11:15"
58+
59+
- type: break
60+
title: "Lunch break"
61+
time: "12:00"
62+
duration: 60
63+
64+
- type: module
65+
slug: core-concepts-part2
66+
label: "Module 3"
67+
time: "13:00"
68+
69+
- type: lab
70+
slug: core-concepts-variables-agents-channels
71+
label: "Lab 3"
72+
title: "Variables, Agents, and Channels"
73+
time: "13:30"
74+
75+
- type: break
76+
title: "Coffee break / Q&A"
77+
time: "14:00"
78+
duration: 15
79+
80+
- type: module
81+
slug: orchestration
82+
label: "Module 4"
83+
time: "14:15"
84+
85+
- type: lab
86+
slug: mcs-orchestration
87+
label: "Lab 4"
88+
title: "Orchestration with Copilot Studio"
89+
time: "15:00"

_includes/event-nav/manifest.html

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,23 @@
4545
}
4646
{%- assign item_sep = "," -%}
4747
{%- endif -%}
48+
{%- elsif item.type == "module" -%}
49+
{%- assign mod = site.modules | where: "slug", item.slug | first -%}
50+
{%- if mod -%}
51+
{%- assign display_title = item.title | default: mod.title -%}
52+
{{ item_sep }}
53+
{
54+
"type": "module",
55+
"slug": {{ item.slug | jsonify }},
56+
"label": {{ item.label | default: "" | jsonify }},
57+
"url": {{ mod.url | relative_url | jsonify }},
58+
"title": {{ display_title | jsonify }},
59+
"difficulty": {{ mod.difficulty | default: 0 | jsonify }},
60+
"duration": {{ item.duration | default: mod.duration | default: 0 }}
61+
{%- if item.time %}, "time": {{ item.time | jsonify }}{% endif -%}
62+
}
63+
{%- assign item_sep = "," -%}
64+
{%- endif -%}
4865
{%- else -%}
4966
{{ item_sep }}
5067
{
@@ -86,6 +103,7 @@
86103
</script>
87104
<script type="application/json" id="mcs-lab-context">
88105
{
106+
"type": {% if page.collection == "modules" %}"module"{% else %}"lab"{% endif %},
89107
"slug": {{ page.slug | jsonify }},
90108
"title": {{ page.title | jsonify }},
91109
"url": {{ page.url | relative_url | jsonify }}

0 commit comments

Comments
 (0)