@bitcobblers/wod-wiki-tools 0.36.2134 → 0.36.2136
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/bin/wod.cjs +274 -69
- package/dist/bin/wod.cjs.map +1 -1
- package/dist/bin/wod.mjs +5 -14
- package/dist/bin/wod.mjs.map +1 -1
- package/dist/{chunk-B3QJYJVI.mjs → chunk-6QNX4FED.mjs} +217 -52
- package/dist/chunk-6QNX4FED.mjs.map +1 -0
- package/dist/{chunk-EUQWEX6Z.mjs → chunk-CYKNTEGY.mjs} +3 -3
- package/dist/chunk-CYKNTEGY.mjs.map +1 -0
- package/dist/{compiler-KT6P3AC6.mjs → chunk-FZKXOYMJ.mjs} +4 -5
- package/dist/chunk-FZKXOYMJ.mjs.map +1 -0
- package/dist/{chunk-32FASQP5.mjs → chunk-MA6BBTWC.mjs} +54 -12
- package/dist/chunk-MA6BBTWC.mjs.map +1 -0
- package/dist/{chunk-K3GZZFAC.mjs → chunk-V23POHG2.mjs} +10 -9
- package/dist/chunk-V23POHG2.mjs.map +1 -0
- package/dist/compiler-CTPLIZJK.mjs +9 -0
- package/dist/compiler-CTPLIZJK.mjs.map +1 -0
- package/dist/index.cjs +274 -58
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +3 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.mjs +5 -4
- package/dist/server/app.cjs +7 -6
- package/dist/server/app.cjs.map +1 -1
- package/dist/server/app.mjs +1 -1
- package/dist/server-JXECWS4A.mjs +11 -0
- package/dist/{server-3TJZDKQC.mjs.map → server-JXECWS4A.mjs.map} +1 -1
- package/dist/web/playground/assets/main-B-bffxwE.css +2 -0
- package/dist/web/playground/assets/main-iLSeEl2E.js +188 -0
- package/dist/web/playground/assets/{statementBuilderFlow-DXlHS86r.js → statementBuilderFlow-ugwi0fu0.js} +2 -2
- package/dist/web/playground/assets/{vendor-codemirror-BtJgoBjf.js → vendor-codemirror-C41SFn-r.js} +2 -2
- package/dist/web/playground/assets/vendor-g-NJOjvC.js +198 -0
- package/dist/web/playground/index.html +4 -4
- package/dist/web/playground/seed/core/chunks/canvas.20048125.json +1 -0
- package/dist/web/playground/seed/core/manifest.json +7 -7
- package/dist/web/playground/seed/core/report.html +11 -11
- package/dist/web/server/assets/main-B-bffxwE.css +2 -0
- package/dist/web/server/assets/main-CRyLxlPN.js +187 -0
- package/dist/web/server/assets/{statementBuilderFlow-CXugzTXB.js → statementBuilderFlow-40WaYjdq.js} +2 -2
- package/dist/web/server/assets/{vendor-codemirror-BtJgoBjf.js → vendor-codemirror-C41SFn-r.js} +2 -2
- package/dist/web/server/assets/vendor-g-NJOjvC.js +198 -0
- package/dist/web/server/index.html +4 -4
- package/dist/web/server/seed/core/chunks/canvas.20048125.json +1 -0
- package/dist/web/server/seed/core/manifest.json +7 -7
- package/dist/web/server/seed/core/report.html +9 -9
- package/package.json +6 -8
- package/dist/chunk-32FASQP5.mjs.map +0 -1
- package/dist/chunk-B3QJYJVI.mjs.map +0 -1
- package/dist/chunk-EUQWEX6Z.mjs.map +0 -1
- package/dist/chunk-K3GZZFAC.mjs.map +0 -1
- package/dist/compiler-KT6P3AC6.mjs.map +0 -1
- package/dist/server-3TJZDKQC.mjs +0 -11
- package/dist/web/playground/assets/main-Bhn9NHgQ.css +0 -2
- package/dist/web/playground/assets/main-Bj_mxNMk.js +0 -212
- package/dist/web/playground/assets/vendor-BlJqgFME.js +0 -201
- package/dist/web/playground/seed/core/chunks/canvas.054cd7db.json +0 -1
- package/dist/web/server/assets/main-Bhn9NHgQ.css +0 -2
- package/dist/web/server/assets/main-CfAVkURA.js +0 -211
- package/dist/web/server/assets/vendor-BlJqgFME.js +0 -201
- package/dist/web/server/seed/core/chunks/canvas.054cd7db.json +0 -1
|
@@ -1 +0,0 @@
|
|
|
1
|
-
[{"path":"markdown/canvas/ai-first/README.md","content":"---\nsearch: hidden\ntemplate: canvas\nroute: /ai-first\ntype: syntax\n---\n\n# AI-First Workouts {sticky dark full-bleed}\n\nText-based workout scripts are the perfect interface for AI. They're compact, unambiguous, and easy to generate, edit, and share.\n\n```view\nname: ai-demo\nstate: note\nsource: wods/examples/home/welcome-1.md\nruntime: in-memory\nlaunch: host\nalign: right\nwidth: 50%\n```\n\n## Why Text Wins {sticky #why-text theme:violet}\n\n- **Portable** — copy-paste into any chat, note, or document\n- **Versionable** — diff-friendly, git-friendly, review-friendly\n- **Composable** — LLMs can generate, remix, and extend scripts without special tools\n- **Executable** — the same text that reads well to humans runs live in the playground\n\n```command\ntarget: ai-demo\npipeline:\n - set-source: wods/examples/home/welcome-1.md\n - set-state: note\n```\n\n```button\nlabel: Try It →\ntarget: ai-demo\npipeline:\n - set-state: track\n```\n\n## Parse Skill {sticky #parse-skill theme:emerald}\n\nThe canonical WOD Wiki parse skill defines the grammar, examples, and constraints the parser understands. Point any AI assistant at this file and it can generate valid workout scripts on the first try.\n\n```button\nlabel: Open Parse Skill →\ntarget: ai-demo\npipeline:\n - navigate: /ai-skills/parse.md\n```\n\n## Shared AI Apps {sticky #shared-apps theme:sky}\n\nCollaborative workspaces and custom GPTs pre-loaded with the WOD Wiki syntax.\n\n### Gemini\n\nA shared Gemini Gem with the parse skill built in.\n\n```button\nlabel: Open Gemini Gem →\ntarget: ai-demo\npipeline:\n - navigate: https://gemini.google.com/gem/1sCEfdhn2Bwg53DS6GvPgcFTRrUrJRdV-?usp=sharing\n```\n\n### ChatGPT\n\nCustom GPT coming soon.\n\n```button\nlabel: ChatGPT (coming soon)\ntarget: ai-demo\npipeline:\n - set-state: note\n```\n\n### Copilot\n\nMicrosoft Copilot integration coming soon.\n\n```button\nlabel: Copilot (coming soon)\ntarget: ai-demo\npipeline:\n - set-state: note\n```\n\n### Claude\n\nClaude project coming soon.\n\n```button\nlabel: Claude (coming soon)\ntarget: ai-demo\npipeline:\n - set-state: note\n```\n\n## Start Building {sticky full-bleed dark}\n\nOpen a new note and generate a workout with any AI assistant.\n\n```button\nlabel: New Workout Note →\ntarget: ai-demo\npipeline:\n - set-source: query:new\n - set-state: note\n - launch: dialog\n```\n\n```button\nlabel: ← Back to Home\ntarget: ai-demo\npipeline:\n - navigate: /\n```\n","blocks":{},"blockIndex":[],"blockEfforts":[]},{"path":"markdown/canvas/guide/README.md","content":"# Learning Collection — Design Review & Page Map\n\n> **Status: SHIPPED (2026-10).** The eight chapters in this directory are the production guide: each carries `template: canvas` + `route: /guide/<slug>` frontmatter and renders as a live canvas page. The six editor chapters (start, protocols, structure, metrics, clock, sessions) have the sticky workout editor, chapter/quest gameplay, and Run; **wql and dashboards are sandbox chapters** — no workout editor or quests, but the sticky panel holds a live, editable ```query sandbox (wql: preset query tabs; dashboards: the real seeded boards loaded with live widgets). The old 18 routed learning pages (`syntax/*` hubs and routed chapters, `behaviors/*`, `analytics/*`) were deleted in the same cutover — §7 is the migration map that was applied, with no redirects left behind.\n>\n> Shipped vs contract, precisely: **§3.1–§3.3 (fresh note per Run, record exactly once including Stop, reset snapshots) are implemented in the canvas runtime and exercised for real** (first Run/Stop verified inline on a guide page). **§3.4–§5 (stage-driven run, sticky stage flow, reduced-motion runways) remain the homepage-rebuild contract** — these guide pages use the standard canvas sticky panel, not the stage machine. §1's counts and fixtures table are the **pre-cutover inventory** (historical: 18 routed learning pages then; today this directory's 8).\n\n**The shared example.** Every chapter from [First Workout](/guide/start) through Dashboards reuses one workout, `markdown/canvas/home/sample-script.md` verbatim:\n\n```time\n(3)\n 10 Kettlebell Swings 24kg\n *:30 Rest\n```\n\nYou edit it, run it, watch what the clock records (Metrics), query the records (WQL), and pin the query to a dashboard.\n\n---\n\n## 1. Design review of the pre-cutover learning surface (historical)\n\n**Exact routed count.** A route-frontmatter search across `markdown/` finds **20 routed pages**: syntax 8, analytics 6, behaviors 4, plus the homepage `canvas/home/README.md` (`/`) and `canvas/ai-first/README.md` (`/ai-first`). That gives **18 learning pages**. The inventory report's \"19 routed\" counted the homepage row but missed that `/ai-first` also carries `route:` frontmatter. Per scope, **homepage and `/ai-first` are product/marketing, not learning pages**, and are excluded from the collection (ai-first stays linked from First Workout as \"generate with AI\").\n\n**Orphans.** 65 of the 73 files in `markdown/canvas/syntax/` are non-routed tab-page fixtures (`search: hidden`, scroll-stage sources). They are compiled by tests and rendered only as scroll stages — several contradict their own routed captions. The collection de-orphans every unique topic without keeping the dead scroll plumbing.\n\n**Duplicates merged (unique topics preserved).**\n\n| Topic | Duplicates | Resolution |\n|---|---|---|\n| Calculated metrics ×3 | syntax/calculated-metrics.md (section document), custom-metrics-5.md (section custom-metrics), custom-and-calculated-metrics.md (section advanced) | one [Calculated](/guide/metrics?h=calculated) section in metrics.md |\n| AMRAP ×2 | protocols-1.md `20:00 (AMRAP)` vs classic-amrap.md `20:00 AMRAP` | keep the caption-blessed canonical `20:00 AMRAP` |\n| EMOM ×4 | protocols-2 `10:00 (EMOM)`, protocols-5 implicit, basic-emom `(10) :60 EMOM`, alternating/longer/custom variants | keep canonical `(10) :60 EMOM` + longer-interval + alternating branches |\n| Actions ×2 | supplemental-1 vs actions-comments | merged into [start.md#actions-comments](/guide/start?h=actions-comments) |\n| Rest ×2 | supplemental-2 vs timers-4 (both `*:30 Rest`) | merged into [protocols.md#required-rest](/guide/protocols?h=required-rest) |\n| Comments ×2 | supplemental-3 vs actions-comments | merged into start.md |\n| Unknown loads ×2 | supplemental-4 vs metrics-5 (`?lb`) | merged into [metrics.md#capture](/guide/metrics?h=capture) |\n| Cheatsheets ×2 | /guide/syntax/cheatsheet + /guide/analytics/cheatsheet | **no separate cheat-sheet page** — compact reference tables fold into [start.md#reference](/guide/start?h=reference) and [wql.md](/guide/wql?h=aggregate); 8 pages max |\n| Idioms tables | behaviors/README vs timers.md vs rounds.md (near row-for-row) | behaviors/README absorbed into [clock.md#run-next](/guide/clock?h=run-next) |\n| Prototype copies | root tour-redesign.prototype.html ≡ apps/playground copy | out of scope for markdown (IntegratedPrototype's); noted for cleanup |\n\n**Contradictions — resolved or flagged.** Ground truth = `packages/lang` parser/runtime + `packages/wql` vocabulary (verified in source, not from docs).\n\n| # | Docs say | Source says | Resolution in this collection |\n|---|---|---|---|\n| 1 | \"wrap your workout in a `wod` block\"; dialects page implies ```` ```wod ````/```` ```plan ````/```` ```climb ```` fences | runtime affords `time` (run) and `log` (record) fences only; dialect fixtures themselves use ```` ```time ````/```` ```log:climbing ```` | teach `time`/`log`/`log:climbing`; `wod`/`plan`/`climb` kept as *intent* vocabulary, flagged **needs validation** ([sessions.md#intent](/guide/sessions?h=intent)) |\n| 2 | home caption + prototypes: \"```` ```wql ```` for queries\"; cookbook shows ```wql copy blocks | real in-note fence is ```` ```query ````; no ```wql handling exists | use ```query everywhere; cookbook's ```wql snippet blocks flagged **needs validation** |\n| 3 | analytics/README + anatomy document `source:all` | parser hard-errors: \"source:all is retired — omit the source: filter\" | omitting `source:` **is** the all-sources default; never write `source:all` |\n| 4 | filters.md teaches singular `source:collection`/`source:feed` | `WQL_SOURCE_VALUES` = plural `journal, feeds, guides, playground, dashboards, efforts`; `source:collections` retired (parser errors) | teach plural; pin one catalog with `catalog:<id>`; `source:collection:<id>` remains a storage-identity literal |\n| 5 | structure.md caption: name groups `(Warmup)`; named-groups/mixed-sections fixtures use `// Warmup` | classifier emits a labeled group node for `(Warmup)` (`RoundsMetric(label)`); `//` is a text comment — different mechanisms, both legal | both documented with the difference ([structure.md#named-sections](/guide/structure?h=named-sections)) |\n| 6 | `:?` placement: timers-3 prefixes (`:? Max Effort`), capture/cheatsheet append (`5:00 Run :?`) | `:?` is a standalone collectible-duration token; both positions parse | append taught as the convention; prefix noted as equally legal ([metrics.md#capture](/guide/metrics?h=capture)) |\n| 7 | behaviors/timers.md: movement without duration counts up; timers-5.md: \"no timer — stopwatch mode\" | `DurationMetric.direction`: value 0/undefined/collectible → **up** | same behavior, two descriptions: a bare movement runs a count-up stopwatch ([clock.md](/guide/clock)) |\n| 8 | capture.md queries `avg:wod.rpe by {week}` | no `wod.rpe` key exists anywhere; session RPE is typed metric `session-rpe` | corrected to `avg:session-rpe{} by {week}` ([metrics.md#session-rpe](/guide/metrics?h=session-rpe)) |\n| 9 | anatomy.md lists `metMinutes` as a base metric | vocabulary registers it as `calc.metMinutes` (engine-published) | listed under calculated metrics ([metrics.md#calculated](/guide/metrics?h=calculated)) |\n| 10 | prototypes use `{tag:benchmark}`, `{intensity:zone4}`, `since:2026-01-01` | real keys: `tags:`; intensity tiers `low|moderate|high`; windows `last <n>d|w` / `from … to …` | corrected vocabulary shipped in wql.md; IntegratedPrototype notified |\n| 11 | behaviors/README idiom `AMRAP 10` (label-first) | fixtures only show duration-first `20:00 AMRAP` (canonical per caption) | duration-first everywhere; label-first order flagged **needs validation** |\n| 12 | home/README still carries a retired 720vh ```scroll:chapters spec; HomeView error cites nonexistent routes/home.md | dead plumbing | out of scope here — flagged for the homepage rebuild owner |\n| 13 | behaviors/capture.md: `5:00 Run :?` asks for \"actual distance covered in the 5 minutes\"; \"prompt for load **before** the first squat\" | `:?` is a collectible **timer**: it mounts a count-up timer whose elapsed time is recorded on completion (compliance suites `timer.compliance`/`countup.compliance`; parse skill's collectible rule: prescribed time → collect distance with `?m`, prescribed distance → collect time with `:?`). No runtime evidence schedules a load prompt \"before the first rep\" — prompt timing is a capture-surface concern | metrics.md teaches the collectible family (`?` reps, `:?` time, `?lb`/`?kg` load, `?m`/`?km`/`?mile` distance) with prescribed-vs-outcome rule; prompt timing not asserted |\n\n**Honesty rules carried into every chapter.** No invented HR/trend numbers; calculated metrics document only real prerequisites (e.g. `calc.readiness` publishes a value for a day only when soreness, sleep, and HRV were all captured that day — verified in `calc/seeds.ts`). Unlanded `calc.*` surfaces render a labeled \"proposed\" placeholder in the app; dashboards label sample answers as sample.\n\n---\n\n## 2. The eight proposed pages\n\n| # | File | Proposed title | Sticky stages | Absorbs |\n|---|---|---|---|---|\n| 1 | [start.md](/guide/start) | First Workout | editor → runtime | basics.md, syntax/README hub, core syntax tab pages, the printable cheat sheet |\n| 2 | [protocols.md](/guide/protocols) | Timers & Protocols | editor → runtime | protocols.md, all timer/protocol tab pages, the timer half of behaviors/timers.md |\n| 3 | [structure.md](/guide/structure) | Structure & Rounds | editor → runtime | structure.md, group tab pages, behaviors/rounds.md |\n| 4 | [metrics.md](/guide/metrics) | Metrics: Planned, Recorded, Calculated | editor → runtime (results focus) | custom-metrics.md, metric/calculated tab pages, behaviors/capture.md |\n| 5 | [clock.md](/guide/clock) | Run, Track & Capture (the Clock) | editor → runtime (runtime is the subject) | behaviors/README.md, the runtime halves of timers.md/capture.md |\n| 6 | [wql.md](/guide/wql) | Query Your Training (WQL) | editor → WQL table (data focus) | analytics/README, anatomy, filters, joins |\n| 7 | [dashboards.md](/guide/dashboards) | Dashboards & Cookbook | WQL table → dashboard (data focus) | analytics/cookbook, the query-block half of analytics/cheatsheet, the 6 seeded boards |\n| 8 | [sessions.md](/guide/sessions) | Dialects & Complex Sessions | editor → runtime | dialects.md, complex.md, dialect/complex tab pages |\n\nThe stages column is mirrored verbatim in each page's chapter banner. Chapters 1–3 and 8 **run and save**; chapter 5 documents the runtime itself; chapters 4, 6, 7 focus on **reading the data** runs produce. No chapter defines its own result policy — every run saves under the one contract in [§3](#run-contract).\n\n### Common page model\n\nEvery chapter uses the same skeleton: `# Title`, chapter banner (chapter number, **Sticky stages** line, replaced routes, homepage placements), the teaching sections with their existing anchors, exactly one `## Try it {#try-it}`, and a one-line chapter footer (`**Next:** … · [Overview](/guide/start)`). A Try it block has three labeled parts — **Run** (what to paste/press), **Observe** (what the runtime should show), **Result query** where the chapter reads data — and any caption buttons reuse existing action labels only (`Run`, preset names, `Cast`); no invented controls, no duplicated nav prose.\n\nEntry and deep-link anchors (used by the homepage and the prototype's learn links):\n\n| Page | Entry anchor | Try it | Key deep anchors |\n|---|---|---|---|\n| start.md | `#first-workout` | `#try-it` | `#reference`, `#measurements` |\n| protocols.md | `#countdown-countup` | `#try-it` | `#amrap`, `#required-rest` |\n| structure.md | `#rounds` | `#try-it` | `#named-sections`, `#rep-schemes` |\n| metrics.md | `#planned-vs-recorded` | `#try-it` | `#capture`, `#calculated`, `#session-rpe` |\n| clock.md | `#run-next` | `#try-it` | `#casting`, `#provenance`, `#pause-skip`, `#capture-prompts` |\n| wql.md | `#planes` | `#try-it` | `#aggregate`, `#filters`, `#sources`, `#windows`, `#joins` |\n| dashboards.md | `#note-frontmatter` | `#try-it` | `#widgets`, `#cookbook`, `#seeded-boards`, `#composer` |\n| sessions.md | `#intent` | `#try-it` | `#full-session` |\n\nReading order is the numbered order; 1–3 teach writing, 4–5 teach what running records, 6–7 teach querying, 8 composes everything.\n\n---\n\n## 3. Run & save contract — today vs proposed {#run-contract}\n\n> **Everything in §3–§5 is PROPOSED** for the homepage rebuild and these eight chapters. \"Today\" statements come from source review of the intake/recorder seams, run refs, reset paths, and scroll drivers — no runtime behavior has been exercised, and nothing here is implemented. The eight drafts above carry **no `route:` frontmatter** and no runtime wiring.\n\n### 3.1 One active workspace, immutable run archive\n\n**Today.** One active persisted Note per *surface*: `ensurePlaygroundEntry` (`createPlaygroundPage.ts`) creates once, then **updates in place** under reuseKey `'home'`, `'chapter-<id>'`, or `canvas:<route>` (`getCanvasNoteId`, `canvasUtils.ts`) — deliberately, so the library doesn't fill with duplicate experiment entries. Fresh notes are minted only by explicit New/Reset page buttons, ZIP import, templates, and journal→playground copies (each named via `formatPlaygroundTimestampId`). Reset is in-memory only: `HomeTour.startNewSession` and `useCanvasRuntime.closeRun` unmount without recording — in-flight results are silently dropped.\n\n**Proposed.** Keep exactly one active **editable workspace** per surface — the hero editor remains the single authoring surface, sticky through its stage. Nothing overwrites the draft in place, and nothing is ever activated in place of a new note: **every Run creates a fresh note, and every Reset creates a separate fresh unstarted draft snapshot — both retained** (the extra archive entries are intentional; the user explicitly asked for clones of both). Reset finalizes the active run partial, restores the template content in the editor, and mints a fresh draft snapshot (status `reset-unstarted`) as its archive record; the next Run still mints its own fresh note — a reset draft is never activated. Snapshot name = `<page label> — <section label> — <formatPlaygroundTimestampId>`: labels taken verbatim from the page H1 and the section heading the run launched from; section is optional (hero runs use the section label `Run`); run state (`running` / `completed` / `stopped` / `reset-unstarted`) is note metadata, not a second naming scheme. One workspace ≠ one saved note — **all session data is always recorded**: the archive retains every run and reset snapshot; retention is §3.6.\n\n### 3.2 Create before run; capture identity at start\n\n**Today.** Runs already persist before execution: `ensurePlaygroundEntry` completes before the runtime mounts, and save failure = toast + abort — no execution without a saved note. Run identity `{noteId, resultId, block}` is captured once at start and never re-derived (`activeRun.current`, `useCanvasRuntime.ts:56`; `playgroundEntryRef`/`playgroundBlockRef`, `HomeTour.tsx:602-616`). Recording resolves `segmentId = runBlock?.id ?? blockId`, `blockContentId = runBlock?.contentId`, origin `'playground'` for playground notes (`resultRecorder.ts:104-133`); segment **version** is deferred to the persistence adapter at write time.\n\n**Proposed.** Unchanged mechanics, new target: the captured triple points at the run's **snapshot** note — minted fresh at every Run (never a reused reset draft) — and the snapshot **source** is captured at start the same way — captured results can never retroactively bind to a later-edited draft. Editing the draft mid-run is a *try-edit*: finalize the active run partial, halt, let the editor change live; the edited content becomes a snapshot only at the next Run.\n\n### 3.3 Record once — partial or full — with failure guards\n\n**Today.** `playgroundRecorder.record` is the only result seam; natural completion and Stop both record (Stop sends `completed:false`). But `handleWorkoutComplete` never consumes the captured run — a second completion call would re-record the same resultId — and reset paths drop without recording. Other sourced races: two concurrent same-reuseKey `ensureEntry` calls can mint two same-slug notes; `completeWorkout` (workbench) is a non-atomic two-write pair whose result-write failure is only console-logged.\n\n**Proposed.** One finalization path shared by **natural completion, Stop, and metrics-stage arrival** (entering the metrics stage stops the runtime and finalizes). Record **exactly once** per run — partial (`completed:false`) or full — by consuming the captured run on record (clear `activeRun.current` / generation check, or an id-keyed guard in the recorder). Guards:\n\n- **Reset while running:** finalize the partial first and **retain the snapshot — always, even with zero outputs**, marked reset/unstarted, with no fabricated performance rows (a zero-output note honestly records \"attempted, nothing captured\"; nothing is silently dropped). Reset then mints a **separate fresh unstarted draft snapshot** as its archive record; the next Run still creates its own fresh note — prepared/reset drafts are never activated (explicit user policy: each run creates a new note; the extra archive entry is requested).\n- **Save failure:** persist-before-run stays; a failed save must **never clear recorded output nor auto-start a new run** — the run and its results stay, retry is explicit.\n- Per-run snapshots retire the reuseKey race surface entirely (each run mints its own note; no shared-slug ensure).\n- In the HTML prototype, session recording stays **page-memory only** and is labelled visibly as such; production records through the recorder seam.\n\n### 3.4 No fullscreen; stage-driven run\n\n**Today.** Run mounts a fullscreen overlay (`TourTimerScreen` tour-side, `FullscreenTimer` canvas-side) with autostart gated in `RuntimeTimerPanel` (`(autoStart||pendingStart)&&ready&&idle`).\n\n**Proposed.** Run scrolls to the **inline runtime stage** — no fullscreen. Arrival autostarts **once per run**. Captions offer existing actions only, as optional explicit buttons (`Run`, `Next`, `Stop`, `Cast` — real control labels/testids, no hidden auto-Next, no auto-cast; the autoplay entrance is user-scroll-triggered). A previous runtime resumes only via explicit **Run** (which always mints a new snapshot).\n\n### 3.5 Stage observers are idempotent\n\nBackward scroll never restarts a run nor replays a one-shot stage effect (renormalized progress + reached-once guards, the `useReachedOnce` pattern). Forward **fast scroll** that resolves straight to a later stage cannot launch the skipped runtime stage: the stage machine emits one discrete stage per frame (`resolveScrollStage`), so skipped stages' enter effects (autostart included) never fire. Every stage-enter effect runs once per run, not once per direction.\n\n### 3.6 Bounded seams and cleanup scope\n\nAll changes are bounded to existing seams — no new subsystem:\n\n1. **Snapshot naming** — a policy inside `createPlaygroundIntake` (the single note-minting seam); callers (`HomeTour`, `useCanvasRuntime`) keep their signatures. Explicit New/Reset page buttons keep today's `createPage` semantics.\n2. **Record-once** — a guard at the recorder or the run hooks (consume captured run / id-keyed guard), closing the double-record race before any autostart re-runs exist.\n3. **Partial finalize on reset** — a `completed:false` record at the two reset points (`HomeTour.startNewSession`, `useCanvasRuntime.closeRun`), retained even at zero outputs, then a separate fresh unstarted draft snapshot is minted (Run never activates it).\n4. **One active session owner** — generalize the `useCanvasRuntime` pattern instead of scattered refs (HomeTour refs vs canvas `activeRun` vs workbench store). **The workbench keeps its own multi-note session store** (`completeWorkout`, autosave, `resetStore`): it serves journal/workbench routes and promotion — one-active is a *playground-surface policy*, not a storage policy. Don't delete general workbench multi-note session support because the homepage is one-active.\n5. **Retention** — snapshot growth is handled by the existing promotion invariant (`movePlaygroundToJournal` — moved notes can never be hijacked by a later same-key ensure) and `find:note{source:playground}` scoping, not new deletion logic.\n\n**Cleanup scope when the collection is approved** (not before — nothing here routes the eight drafts or retires any `/guide/*` route):\n\n- Safe to retire with their routed parents: the 65 non-routed syntax tab-page fixtures and their ```scroll stage plumbing (they exist as scroll-stage sources for routed pages), the duplicate prototype HTML copy (keep one canonical), the `ProtoTimerMobile` throwaway (`?proto-timer`), the retired 720vh ```scroll:chapters spec in `canvas/home/README.md`.\n- **Out of scope:** workbench/journal session store and its wiring, collections/feeds/journal surfaces, promotion, chapter-run reuse — multi-note session support serves routes beyond the homepage and survives a one-active homepage.\n\n---\n\n## 4. Sticky stage flow (desktop & mobile)\n\nFour sticky stages in page order: **editor → runtime → WQL table → dashboard**. Desktop is native **sticky push-off**: each stage is a tall section whose card sticks at the nav offset (`STICKY_NAV_HEIGHT` = 104px, card `h-[calc(100vh-104px)]` — the `TourSectionRunway` pattern) and is pushed off by the next stage's sticky card, driven by the existing pure stage machine (`resolveScrollStage` with clamp01/renormalize over a capture-phase scroll listener). The hero editor is **one reused instance** sticking through stage 1. Run scrolls editor→runtime; **Stop (or metrics arrival) slides the metrics view in**; the **WQL table stage** sticks bound to the **current run's facts**, with caption query actions (real queries, `ParsedQueryChips` vocabulary) and a floating **\"Revert current session\"** that re-binds the table to the current run — discarding view-state (query tweaks, sample overlay) only; the **dashboard stage** sticks a board with **load buttons** for the seeded boards.\n\nMobile (≤1023px, `MOBILE_BREAKPOINT_PX`): **bounded sticky stage windows** — one stage card at a time in the reading zone (top 65px window, `MOBILE_STICKY_TOP`), captions **below** the card, card-visibility IntersectionObserver as the stage driver (the `TourMobileRunway` pattern). Same stage order, same run contract.\n\nReduced motion wins everywhere (`RunwayAdapter`: reduced > mobile > desktop): flat card stack, no push-off, no scroll scrub; stage arrival is visibility-based and still once-per-run.\n\nGuarantees on every form factor:\n\n- Runtime arrival autostarts once; backward scroll never restarts; fast scroll to a later stage cannot launch the skipped runtime (§3.5).\n- Caption actions are explicit buttons using existing labels; no hidden auto-Next/auto-cast.\n- Sample fallbacks are badged **sample**; sample datasets and dashboard/board edits never mutate saved session results; **Revert** restores view only.\n\n---\n\n## 5. System organization\n\n| Term | Purpose | Scope / storage |\n|---|---|---|\n| **Note** | the markdown document + identity (uuidv7 id, slug, sourceId, type) | one IndexedDB store (notes + results + attachments + analytics) |\n| **Page** | a note bound to a surface (routed guide page, playground home/canvas) | bindings via reuseKey / `getCanvasNoteId` |\n| **Block** | one addressable fenced unit in a note; the run target | Block Content Id = content hash, stable across reorders/clones |\n| **Effort** | named workout registry entry (e.g. *fran*) | content-plane query target; aggregates `by {effort}` |\n| **Session** | one recorded run | `{noteId, resultId, block}` triple; results join `Session.noteId` |\n| **Journal** | your saved notes | `source:journal`; promotion target |\n| **Playground** | experiment surface (home/canvas, learning runs) | `source:playground`; run snapshots archive here until promoted |\n| **Catalog** | catalog of benchmark sessions | `source:feeds`; clone into journal |\n| **Feed** | dated posts | — |\n| **Dashboard** | a note with `dashboard: true`; its query blocks render as widgets | vault (editable) vs prebuilt (read-only, clone) |\n\n**`source:` scope.** Plural values — `journal, feeds, guides, playground` (plus `dashboards`, `efforts`); omitting `source:` searches all; pin one catalog with `catalog:<id>`. Learning runs record with origin `'playground'` until promotion re-homes the note to the journal — a query pinned to `source:journal` excludes playground experiments by design.\n\n**Session vs template vs sample dataset vs revert.**\n\n- **Session** — immutable recorded facts from one run against its snapshot note.\n- **Template** — read-only source content (`sample-script.md`, `WORKOUT_PRESETS`, catalog sessions, seeded boards). Running a template copies it into the active workspace/snapshot; **templates never mutate**.\n- **Sample dataset** — the SAMPLE fallback (`SAMPLE_HOME_ANALYTICS`, `SampleDataPrompt`) shown when the store has no facts; always badged sample; never persisted as your results.\n- **Revert** (\"Revert current session\") — discards view-state only (query tweaks, sample overlay) and re-binds the stage to the current run's recorded facts; never deletes saved sessions.\n\n---\n\n## 6. Homepage placements (existing slots only)\n\n| Homepage slot | Proposed links |\n|---|---|\n| Hero / editor-blank caption | \"Start Lesson 1\" → start.md#first-workout; add \"See the full syntax\" → start.md#reference |\n| 01 Write — editor-metrics caption | add \"What each line collects\" → metrics.md |\n| 01 Write — WORKOUT_PRESETS | each preset mirrors a protocols.md / structure.md example |\n| 02 Run — behaviors caption | point \"Read the behaviors explainer\" → clock.md |\n| 02 Run — timer-cast caption | clock.md#casting |\n| 03 Own — metrics-d (\"Measures ride along\") | add action → metrics.md |\n| 03 Own — metrics-c (\"Efforts × measures compound\") | add teaser → wql.md |\n| 04 Explore (currently no inline analytics links; `home:analytics_guide_opened` telemetry declared but never fired) | header actions: \"WQL in depth\" → wql.md, \"Copy-paste queries\" → dashboards.md#cookbook; wql-dashboard/wql-live captions → dashboards.md#seeded-boards |\n| CelebrationBridge (\"Now learn the language\") | render the 8-chapter map as the card row |\n| TourChapterPicker / TourLearnSection | CHAPTER_ROUTES gains the 8 files |\n| Footer \"Where to next?\" | add Learn column: start.md, wql.md, dashboards.md |\n| /ai-first | stays a standalone marketing page, linked from start.md (\"Generate with AI\") |\n\n## 7. Old route → new page/anchor map\n\nConcrete migration map for the 18 currently routed learning pages. Slugs follow the current routed files under `markdown/canvas/`; the eight targets are §2's files. **Both cheatsheets are absorbed into existing pages — there is no ninth page.** Nothing routes or redirects until the collection is approved; until then both trees coexist.\n\n| Old location (routed file) | New target |\n|---|---|\n| `syntax/README.md` (hub) | [start.md](/guide/start) header + [sessions.md#intent](/guide/sessions?h=intent) |\n| `syntax/basics.md` | [start.md#first-workout](/guide/start?h=first-workout) |\n| `syntax/protocols.md` | [protocols.md#countdown-countup](/guide/protocols?h=countdown-countup) |\n| `syntax/structure.md` | [structure.md#rounds](/guide/structure?h=rounds) |\n| `syntax/custom-metrics.md` | [metrics.md#planned-vs-recorded](/guide/metrics?h=planned-vs-recorded) |\n| `syntax/dialects.md` | [sessions.md#intent](/guide/sessions?h=intent) |\n| `syntax/complex.md` | [sessions.md#full-session](/guide/sessions?h=full-session) |\n| `syntax/cheatsheet.md` | [start.md#reference](/guide/start?h=reference) — **cheatsheet #1 absorbed** |\n| `behaviors/README.md` | [clock.md#run-next](/guide/clock?h=run-next) |\n| `behaviors/timers.md` | [protocols.md](/guide/protocols) (syntax forms) + [clock.md#pause-skip](/guide/clock?h=pause-skip) (runtime) |\n| `behaviors/rounds.md` | [structure.md#rep-schemes](/guide/structure?h=rep-schemes) + [clock.md#run-next](/guide/clock?h=run-next) |\n| `behaviors/capture.md` | [metrics.md#capture](/guide/metrics?h=capture) + [clock.md#capture-prompts](/guide/clock?h=capture-prompts) |\n| `analytics/README.md` | [wql.md#planes](/guide/wql?h=planes) |\n| `analytics/anatomy.md` | [wql.md#aggregate](/guide/wql?h=aggregate) |\n| `analytics/filters.md` | [wql.md#filters](/guide/wql?h=filters) · [#sources](/guide/wql?h=sources) · [#windows](/guide/wql?h=windows) |\n| `analytics/joins.md` | [wql.md#joins](/guide/wql?h=joins) |\n| `analytics/cookbook.md` | [dashboards.md#cookbook](/guide/dashboards?h=cookbook) |\n| `analytics/cheatsheet.md` | [wql.md#aggregate](/guide/wql?h=aggregate) tables + [dashboards.md#widgets](/guide/dashboards?h=widgets) — **cheatsheet #2 absorbed** |\n\nThe 65 non-routed tab-page fixtures follow their routed parents (their unique content is already merged — §8). `canvas/home/README.md` (homepage) and `canvas/ai-first/README.md` stay product pages, out of the collection.\n\n## 8. Source coverage\n\nEvery routed learning page (18) and every underlying non-routed lesson source (65 syntax tab pages + 2 home sources), mapped to its target. Merged duplicates list only once with their union.\n\n| Current source (routed unless marked) | Topics kept | → New page |\n|---|---|---|\n| syntax/README.md (hub) | core concepts map, dialect intro, new-note CTA | start.md (header/TOC), sessions.md#intent |\n| syntax/basics.md | fences, one-thing-per-line, indentation, measurements, `?lb`, effort words, actions, comments | start.md |\n| syntax/protocols.md + timers-rest, timer-modifiers, timers-1..5, longer-duration, mixed-timers, classic-amrap, time-cap, multiple-amrap-windows, basic-emom, longer-intervals, alternating-emom, protocols-1..5, custom-intervals, distance-intervals, supplemental-2 | countdown/countup/`^`/`*`/`:?`, H:MM:SS, AMRAP, caps, EMOM family, Tabata, intervals, rest | protocols.md |\n| syntax/structure.md + groups-1..4, named-groups, mixed-sections, multiple-sets | rounds, rep schemes, nesting, named sections, sets | structure.md |\n| syntax/custom-metrics.md + custom-metrics-1..5, calculated-metrics, custom-and-calculated-metrics, metrics-1..5, supplemental-4 | inline JSON, rpe/rir, multi-metric lines, calculate blocks, JSON rules, unknown loads `?lb`/`?kg` | metrics.md |\n| syntax/dialects.md + dialect-wod/log/plan, dialect-climb-bouldering/hangboard/sport | intent distinction, `log:climbing`, climbing signals | sessions.md |\n| syntax/complex.md + complex-nested-protocols, complex-full-session, complex-barbell-cycling, complex-partner-workout, complex-swimming | nested protocols, full session, EMOM chains, partner windows, swimming | sessions.md |\n| syntax/cheatsheet.md (routed) | one-page syntax | start.md#reference + per-page tables (no separate page) |\n| syntax/single-movement, core-rules, measurements, effort-notes, actions-comments, supplemental-1, supplemental-3, document-1..4, welcome-1 (home/), sample-script.md (home/) | smallest workout, three rules, headers/checklists/equipment-table document patterns, actions/comments | start.md |\n| behaviors/README.md | script→parse→compile→track, 3 behavior families, idioms | clock.md |\n| behaviors/timers.md | timer strategy selection, sound/pause/skip/required-rest | clock.md (+ protocols.md for syntax forms) |\n| behaviors/rounds.md | round behavior, rep math, supersets, interval groups, rounds↔timers | structure.md (+ clock.md) |\n| behaviors/capture.md | `:?`, `?lb`/`?kg`, session RPE, trendlines, fact origins | metrics.md (+ clock.md for prompt behavior) |\n| analytics/README.md | 3 WQL surfaces, 2 query planes, where-join | wql.md |\n| analytics/anatomy.md | aggregators, base/calc metrics, dimensions, rollups, find targets | wql.md |\n| analytics/filters.md | tag filters (negation/OR/substring), source filters, time windows, Library tri-state toggles | wql.md |\n| analytics/joins.md | where joins, Block Content Id mechanics | wql.md |\n| analytics/cookbook.md | 5 canonical queries, ```query embeds, dashboard notes, widget types/spans | dashboards.md (+ wql.md) |\n| analytics/cheatsheet.md | WQL one-pager | wql.md tables + dashboards.md#widgets (no separate page) |\n| markdown/dashboards/training-block-review.md | widget exemplars (see dashboards.md#seeded-boards) | dashboards.md |\n| markdown/dashboards/road-to-560-total.md | strength PR board exemplar | dashboards.md#seeded-boards |\n| markdown/dashboards/polarized-base-marathon.md | endurance polarization exemplar | dashboards.md#seeded-boards |\n| markdown/dashboards/finger-strength-v8.md | climbing board exemplar (wellness capture, `calc.mvcBw`) | dashboards.md#seeded-boards |\n| markdown/dashboards/benchmark-pr-board.md | benchmark table exemplar (`last:elapsed{tags:benchmark}`) | dashboards.md#seeded-boards |\n| markdown/dashboards/recovery-readiness.md | ```wellness capture + readiness exemplar | dashboards.md#seeded-boards (+ metrics.md#calculated) |\n\nNot counted as learning sources: `canvas/home/README.md` (product walkthrough — the homepage itself stays), `canvas/ai-first/README.md` (AI marketing, linked as an aside). Orphaned scroll plumbing (```scroll blocks, getTabExamples/getHomeExample, protocols-1's `(AMRAP)` spelling) is dropped, not migrated.\n\n## 9. Review method\n\nEach chapter ends with a **Try it** block: what to paste/press, what the runtime should show, and — for data chapters — the result query — a reviewer checklist, not a test report. Every syntax, behavior, and query claim in this collection comes from **source review only** (parser grammar, compiler metrics, WQL vocabulary/seeds, shipped fixtures). That was true at review time; since the cutover the chapters are production pages — the §3.1–§3.3 run/save behavior is implemented and exercised, while §3.4–§5 (stage flow) stay contract-only (see the status block).\n","blocks":{"seed:markdown/canvas/guide/README.md:0":{"id":"seed:markdown/canvas/guide/README.md:0","kind":"wod","from":1554,"to":1609,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/guide/README.md:seed:markdown/canvas/guide/README.md:0","noteId":"markdown/canvas/guide/README.md","blockId":"seed:markdown/canvas/guide/README.md:0","blockVersion":1,"sourceRevision":1,"from":1554,"to":1609,"position":0,"dataType":"wod","blockContentId":"bc-86bf9888","rawContent":"```time\n(3)\n 10 Kettlebell Swings 24kg\n *:30 Rest\n```","noteTitle":"Overview","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/README","sourcePath":"markdown/canvas/guide/README.md"}],"blockEfforts":[{"id":"markdown/canvas/guide/README.md:seed:markdown/canvas/guide/README.md:0:kettlebell-swings","noteId":"markdown/canvas/guide/README.md","blockId":"seed:markdown/canvas/guide/README.md:0","blockContentId":"bc-86bf9888","effortSlug":"kettlebell-swings","isStatic":true,"sourcePath":"markdown/canvas/guide/README.md","createdAt":1792027033000}]},{"path":"markdown/canvas/guide/clock.md","content":"---\nsearch: hidden\ntemplate: canvas\nroute: /guide/clock\ntype: guide\ntitle: \"Run, Track & Capture (the Clock)\"\n---\n\n```chapter\nid: clock\ntitle: The Clock\nbadge: dumbbell\nquests: clock-run, clock-rest, clock-split\nsections: []\n```\n\n```quest\nid: clock-run\nlabel: Run the First Example\nvalidation:\n type: run-started\n```\n\n```quest\nid: clock-rest\nlabel: Program a required rest\nvalidation:\n type: contains-token\n value: '*:'\n```\n\n```quest\nid: clock-split\nlabel: Add a cue card action\nvalidation:\n type: contains-token\n value: \"[\"\n```\n\n# Run, Track & Capture (the Clock) {sticky dark full-bleed}\n\nSyntax is the plan; **behaviors** are what the runtime does with it. When you press Run, the compiler turns every line into a timeline of behaviors and the clock plays them in order.\n\n```view\nname: preview\nstate: note\nsource: wods/examples/home/sample-script.md\nruntime: in-memory\nlaunch: host\nalign: right\nwidth: 50%\n```\n\n## From script to clock {#run-next}\n\n1. **Script** — your Markdown note with fenced blocks.\n2. **Parse** — the grammar turns each line into statements of metrics.\n3. **Compile** — statements match to behaviors and lay out a timeline.\n4. **Track** — the clock steps through the timeline: counting, prompting, logging.\n\nThree behavior families cover every line:\n\n| Family | What it does | Example line | On the clock |\n|---|---|---|---|\n| **Timers** | counts up or down, repeats, rings | `20:00 AMRAP` | countdown + round counter |\n| **Rounds** | repeats, names, walks a rep scheme | `(21-15-9)` | three rounds with descending reps |\n| **Capture** | asks for actuals | `225lb ?lb`, `:?` | prompt when reached or finished |\n\n**Run** starts the current block; **Next** advances it and locks the elapsed time as a **split** — every click records where you are. Timers choose their strategy from the line ([chapter 2](/guide/protocols?h=countdown-countup)): duration → countdown, `^` or no duration → count-up stopwatch, `EMOM`/work-rest pair → interval, the word `Rest` → rest cue.\n\n## Pause, skip, and sound {#pause-skip}\n\n```button\nlabel: Try it: Required rest\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/timers-rest.md\n```\n\n- **Pause / resume** — countdowns stop and resume from the same elapsed time; interval timers keep round state, so an EMOM window never restarts from zero.\n- **Skip** — any timer without `*` can be skipped. `*:30 Rest` cannot; required timers force the full wait.\n- **Sound** — the runtime emits sound cues at timer start, the final ten seconds, and round transitions; audio surfaces subscribe to them.\n\nA movement line without a duration is not \"no timer\" — it's a count-up stopwatch tracking that block while you log reps.\n\nOn a stored note, **Stop** or **Exit** saves the captured partial run. Finishing the last block saves a completed run. The fullscreen results view shows **Saved ✓** only after the write succeeds. If saving fails, the clock keeps the run open; **Retry save** retries the same run without creating another session. Live \"results captured\" counts do not confirm a save.\n\n## Capture prompts {#capture-prompts}\n\nCollectible placeholders (`?lb`, `:?`, `?m`, `?`) mark the values the plan doesn't know; you supply the actuals during capture, and each lands in the fact store with its block. Session RPE is captured after the workout — skippable, and never blocking a save. Every recorded value carries a declared origin — see [Provenance](#provenance).\n\n## Casting {#casting}\n\nThe clock casts to a big screen: the timer surface — current block, round counter, countdown, cue cards — renders on a paired display while the controls stay on your device. Timers, cue cards (`[Change Plates]`), and round indicators all cross over; pauses on the device pause the cast.\n\n## Provenance {#provenance}\n\nEvery recorded fact carries its origin, which later tells analytics what to trust:\n\n| Origin | Producer | Example |\n|---|---|---|\n| `parser` / `compiler` | from your text | planned `24kg`, rep scheme values |\n| `runtime` | the clock | elapsed spans, splits, round counts |\n| `user` | you, at a prompt | captured loads, `:?` results, session RPE, wellness entries |\n| `analyzed` | the calc engine | `calc.*` values (estimated ones are marked `analyzed-estimated`) |\n\n## Try it {#try-it}\n\n**Run** — run the shared `(3) × 10 Kettlebell Swings 24kg / *:30 Rest` note and try each control: pause mid-round (elapsed freezes, resumes exactly), attempt to skip the `*` rest (refused), then `Next` through the last round — each split is locked with its timestamp. **Observe** — the review grid afterwards is just this provenance trail, organized. Runtime behavior is the subject here; run saving is the shared run contract.\n\n```button\nlabel: Run\ntarget: preview\nopen: view\npipeline:\n - set-state: track\n```\n\n","blocks":{},"blockIndex":[],"blockEfforts":[]},{"path":"markdown/canvas/guide/dashboards.md","content":"---\nsearch: hidden\ntemplate: canvas\nroute: /guide/dashboards\ntype: guide\ntitle: \"Dashboards & Cookbook\"\n---\n\n# Dashboards & Cookbook {sticky dark full-bleed}\n\nA dashboard is **just a note**: mark it `dashboard: true`, and every in-note query block becomes a widget on one grid. The panel on the right has the real Training Block Review board loaded — its ```query blocks render live results right in the sandbox, and you can edit a query without touching the seeded board.\n\n```view\nname: sandbox\nstate: note\nsource: dashboards/training-block-review.md\nruntime: in-memory\nlaunch: host\nalign: right\nwidth: 50%\n```\n\n## The note is the dashboard {#note-frontmatter}\n\nThe real board is already loaded in the sandbox.\n\n````markdown\n---\ntitle: Training Block Review\ndashboard: true\ndashboard.weeks: 16\n---\n\n## Avg TIS\nHow hard are sessions?\n\n```query:value\navg:tis{}\n```\n\n## Weekly tonnage\nIs volume rising?\n\n```query:timeseries-2\nsum:totalVolume{} by {week}\n```\n````\n\nThree conventions:\n\n- The **heading above a block** is the widget title.\n- The **paragraph directly above a block** is its question/subtitle.\n- `dashboard.weeks`, `dashboard.intensity: [low, moderate, high]`, or any `dashboard.<name>` value in frontmatter becomes a **token control** referenced as `$name` — `$weeks`, `$intensity`. List tokens render as segmented controls; unknown token references produce a visible refusal, never a silent blank.\n\n## Widget types and spans {#widgets}\n\n```button\nlabel: Try it: Benchmark PR board\ntarget: sandbox\npipeline:\n - set-source: dashboards/benchmark-pr-board.md\n```\n\nThe fence tag carries type and grid span (`query:<type>[-<1..4>|-full]`); a bare ```query defaults to `table`. Grid is 4 columns wide.\n\n| Tag | Widget |\n|---|---|\n| ```query | table (default) |\n| ```query:list / ```query:value | list / single big number |\n| ```query:timeseries / ```query:timeseries-2 / ```query:timeseries-4 | line over time, 1/2/4 columns |\n| ```query:bar / ```query:stacked-bar | bars / stacked bars |\n| ```query:toplist | ranked rows |\n| ```query:goal-rings / ```query:zone-distribution | progress rings / zone split |\n\nThe block body is **one WQL line** — everything from [the WQL chapter](/guide/wql?h=aggregate) works, including tokens:\n\n```query\nsum:sessionLoad{intensity:$intensity} by {week}\n```\n\nWellness data comes from a capture fence in any note — wellness keys are plain properties, one per line:\n\n```wellness\nsoreness: 7\nsleep: 7.5h\nhrv: 62\n```\n\nCapture those daily and boards like Recovery Readiness light up ([what feeds `calc.readiness`](/guide/metrics?h=calculated)).\n\n## Compose, inspect, clone {#composer}\n\n- **Vault boards** (`/dashboard/<your-note>`) are yours: add, edit, duplicate, reorder, and resize widgets in place; concurrent-edit guards refuse lost writes visibly.\n- **Prebuilt boards** are read-only, but **Inspect** shows any widget's query with a live preview, and **Clone to vault** copies the whole board into your journal to edit.\n- The widget composer is the same three steps for both: pick the **dataset** (a WQL line), the **calculation** (aggregator/metric/filters/window via the composer pills), and the **visualization** (type + span) — preview executes against your live journal with your range and kg/lb preferences.\n- Empty journal? Widgets stay honest with a sample-data prompt instead of fake numbers.\n\n## Cookbook {#cookbook}\n\nCopy-paste queries (paste into a ```query block, or straight into the Explorer):\n\n| Question | Query |\n|---|---|\n| Weekly strength volume | `sum:totalVolume{discipline:strength} by {week}` |\n| Top volume movements | `sum:totalVolume{} by {effort}` |\n| TIS trend | `avg:tis{} by {week}` |\n| Acute:chronic load | `avg:calc.acwr{}` |\n| Find benchmark notes | `:note{effort:fran,source:feeds}` |\n| This week's swings volume | `sum:totalVolume{effort:kettlebell-swings} last 6w` |\n\nThe shared kettlebell note feeds the last row — [run it](/guide/start?h=try-it), and it appears among the sample rows.\n\n## Seeded boards {#seeded-boards}\n\nSix real dashboard notes ship with the app — open any of them, or Inspect → Clone:\n\n| Board | Built around |\n|---|---|\n| [Training Block Review](/d/training-block-review) | values (`avg:tis{}`, `sum:totalVolume{}`, `avg:calc.adherence{}`), weekly volume timeseries, volume by effort toplist, stacked load by intensity/week, distance by discipline |\n| [Road to 560 Total](/d/road-to-560-total) | strength PR progression toward a total |\n| [Polarized Base Marathon](/d/polarized-base-marathon) | endurance polarization (intensity split across weeks) |\n| [Finger Strength V8](/d/finger-strength-v8) | climbing: `calc.mvcBw` hang strength vs grade |\n| [Benchmark PR Board](/d/benchmark-pr-board) | `last:elapsed{tags:benchmark} by {effort}`, benchmark timeseries |\n| [Recovery Readiness](/d/recovery-readiness) | ```wellness capture → `last:calc.readiness{}`, HRV/monotony/ACWR trends |\n\n## Try it {#try-it}\n\n**Run** — the sandbox has the real board loaded: edit the *Weekly tonnage* query in the panel, change `by {week}` to `by {day}`, and watch the widget re-run — sandbox edits never touch the seeded board. Then open the live board: every widget executes against your journal, rows without facts badge as **sample answers until you have logged work of your own**. **Observe** — in the board view, inspect the *Weekly tonnage* widget and clone the board to keep an edit. Sample answers and board edits read saved sessions; they never rewrite them.\n\n```button\nlabel: Open Training Block Review →\ntarget: preview\npipeline:\n - navigate: /d/training-block-review\n```\n\n```button\nlabel: Browse all dashboards →\ntarget: preview\npipeline:\n - navigate: /dashboards\n```\n\n","blocks":{"seed:markdown/canvas/guide/dashboards.md:0":{"id":"seed:markdown/canvas/guide/dashboards.md:0","kind":"query","from":2247,"to":2307,"sourceRevision":1,"version":1}},"blockIndex":[{"id":"guide/dashboards:seed:markdown/canvas/guide/dashboards.md:0","noteId":"guide/dashboards","blockId":"seed:markdown/canvas/guide/dashboards.md:0","blockVersion":1,"sourceRevision":1,"from":2247,"to":2307,"position":0,"dataType":"query","rawContent":"```query\nsum:sessionLoad{intensity:$intensity} by {week}\n```","noteTitle":"Dashboards","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/dashboards","sourcePath":"markdown/canvas/guide/dashboards.md","routeId":"guide/dashboards"}],"blockEfforts":[]},{"path":"markdown/canvas/guide/metrics.md","content":"---\nsearch: hidden\ntemplate: canvas\nroute: /guide/metrics\ntype: guide\ntitle: \"Metrics: Planned, Recorded, Calculated\"\n---\n\n```chapter\nid: metrics\ntitle: Metrics\nbadge: activity\nquests: metrics-run, metrics-custom, metrics-capture\nsections: []\n```\n\n```quest\nid: metrics-run\nlabel: Run the First Example\nvalidation:\n type: run-started\n```\n\n```quest\nid: metrics-custom\nlabel: Attach a custom metric\nvalidation:\n type: contains-token\n value: '{\"rpe\"'\n```\n\n```quest\nid: metrics-capture\nlabel: Add a collectible load\nvalidation:\n type: contains-token\n value: ?lb\n```\n\n# Metrics: Planned, Recorded, Calculated {sticky dark full-bleed}\n\nEvery number in WOD Wiki has an origin. Knowing the three layers tells you what you can query and what you can trust.\n\n```view\nname: preview\nstate: note\nsource: wods/examples/home/sample-script.md\nruntime: in-memory\nlaunch: host\nalign: right\nwidth: 50%\n```\n\n## The three layers {#planned-vs-recorded}\n\n| Layer | Who produces it | Examples | You asked for it by writing |\n|---|---|---|---|\n| **Planned** | parser + compiler, from your text | `5:00` duration, `(21-15-9)` reps, `24kg` load, discipline/intensity hints | the line itself |\n| **Recorded** | the runtime clock while you exercise | elapsed spans, splits, reps/distance/resistance performed, captured loads and ratings | `:?`, `?lb`, and running the workout |\n| **Calculated** | the analytics engine after (and during) runs | `calc.e1rm`, `calc.acwr`, `calc.readiness`, … | enough recorded facts to feed a formula |\n\nThe running example makes the split concrete:\n\n```time\n(3)\n 10 Kettlebell Swings 24kg\n *:30 Rest\n```\n\nPlanned: 3 rounds, 10 reps, 24 kg, 30 s rest. After running it, the recorded facts (30 swings at 24 kg) derive **720 kg of total volume** — computed from records, never asserted. That number is what [WQL](/guide/wql?h=aggregate) queries later.\n\n## Inline custom metrics {#custom-metrics}\n\n```button\nlabel: Try it: Custom metrics\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/custom-metrics-1.md\n```\n\nAttach any key/value data with a JSON object, anywhere on the line:\n\n```time\n5 Back Squat 225lb {\"rpe\": 8}\n10 Thrusters 95lb {\"intensity\": 80, \"coach\": \"greg\"}\n```\n\n- **Optional & additive** — existing syntax is unchanged; the object can sit anywhere on the line.\n- **Typed values** — numbers, strings, booleans, or null.\n- **Known keys** (`rpe`, `rir`, `intensity`, `load`) map to canonical metric types.\n- **Any other key becomes a custom metric** — and a queryable dimension (`{coach:greg}` filters, `by {coach}` groups; keys are camelCase-normalized, so `Sleep Quality` answers to `sleepQuality`).\n\n## Capture prompts {#capture}\n\n```button\nlabel: Try it: Collectible loads\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/metrics-5.md\n```\n\nUnknown values become **collectible** placeholders — the plan stays honest, and you supply the actual during capture:\n\n| Line | What it means |\n|---|---|\n| `?lb Back Squat` | collectible load — unknown at parse; you enter the actual value when capturing |\n| `225lb ?lb Deadlift` | prescribed 225 lb alongside a collectible load (editing allowed) |\n| `?kg Clean` | collectible load in kilograms |\n| `?` | collectible reps — how many you actually did |\n| `?m` / `?km` / `?mile` | collectible distance |\n| `For Time :?` | collectible timer — elapsed time is recorded when you complete the block |\n| `5km Run :?` | distance is prescribed, so `:?` collects the **time taken** |\n| `:? Max Effort Pushups` | a bare `:?` mounts a count-up timer whose elapsed is recorded on completion — the prefix form parses the same |\n\nThe collectible rule: a value that is **prescribed** is written literally; a value that is the **outcome** gets the `?` placeholder — a time-prescribed run collects distance with `?m`, a distance-prescribed run collects time with `:?`. What the clock does when a prompt fires is the [Clock chapter](/guide/clock?h=capture-prompts).\n\nCaptured loads feed trendlines, estimated 1RMs, and PR detection across sessions.\n\n## Session RPE {#session-rpe}\n\nA session-level rating rides on the note as a property:\n\n```log\ndate: 2026-05-25\nrpe: 7\n\n5 Back Squat 225lb hard\n```\n\n`rpe:` (and `rir:`) are typed session metrics — the parser maps the property to `session-rpe`, the stored fact carries canonical key `session-rpe`, and the executor matches aggregate metric keys by exact string, so weekly intensity is one query:\n\n```query\navg:session-rpe{} by {week}\n```\n\n(Older pages showed `avg:wod.rpe` — no such key exists; `session-rpe` is the real one.)\n\n## Calculated metrics {#calculated}\n\n```button\nlabel: Try it: Calculated metrics\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/calculated-metrics.md\n```\n\nTwo ways to derive values.\n\n**In-note `calculate` blocks** evaluate over the workout's recorded rows; rows with unknown inputs are skipped, not zeroed:\n\n````markdown\n```time\nrpe: 8\n(5 Sets)\n 5 Deadlifts 225lb\n 5 Deadlifts ?lb\n```\n\n```calculate\ntotalLoad = sum(reps * weight)\navgRPE = mean(rpe)\nsetCount = count(reps)\n```\n````\n\nA trailing `calculate` section inside the fence works the same way. Formulas run live during tracking and finalize on completion.\n\n**Engine-published `calc.*` metrics** are built in — the full vocabulary WQL can query:\n\n| Family | Keys |\n|---|---|\n| Training load | `calc.acwr`, `calc.monotony`, `calc.strain`, `calc.ctl`, `calc.atl`, `calc.tsb` |\n| Strength | `calc.e1rm`, `calc.pct1rm` |\n| Wellness | `calc.soreness`, `calc.sleep`, `calc.hrv`, `calc.readiness` |\n| Climb / run | `calc.sends`, `calc.ef`, `calc.metMinutes`, `calc.mvcBw` |\n| Plan | `calc.adherence` |\n\nNo invented prerequisites: each formula states what it needs. `calc.readiness`, for example, is computed only for days where a ```wellness fence captured **soreness, sleep, and HRV** — days missing any input produce no value rather than a misleading zero. These 17 keys are exactly the engine-registered set; any other `calc.*` (e.g. the planned `calc.pmc` composite) renders a labeled **proposed** placeholder instead of a value.\n\n## Try it {#try-it}\n\nThe kettlebell example is already in the panel — run it, then open the review grid: reps and load should come from the plan, splits and elapsed from the clock, and `totalVolume` should appear as a derived summary. Add `{\"rpe\": 7}` to a line and re-run — the custom metric should appear in the grid. **Result query** — the same run answers `sum:totalVolume{effort:kettlebell-swings} last 6w` in [WQL](/guide/wql?h=aggregate). This chapter reads what runs record; saving follows the shared run contract — no separate result policy.\n\n```button\nlabel: Run\ntarget: preview\nopen: view\npipeline:\n - set-state: track\n```\n\n","blocks":{"seed:markdown/canvas/guide/metrics.md:0":{"id":"seed:markdown/canvas/guide/metrics.md:0","kind":"wod","from":1568,"to":1623,"sourceRevision":1,"version":1,"dialect":"time"},"seed:markdown/canvas/guide/metrics.md:1":{"id":"seed:markdown/canvas/guide/metrics.md:1","kind":"wod","from":2112,"to":2206,"sourceRevision":1,"version":1,"dialect":"time"},"seed:markdown/canvas/guide/metrics.md:2":{"id":"seed:markdown/canvas/guide/metrics.md:2","kind":"wod","from":4120,"to":4179,"sourceRevision":1,"version":1,"dialect":"log"},"seed:markdown/canvas/guide/metrics.md:3":{"id":"seed:markdown/canvas/guide/metrics.md:3","kind":"query","from":4428,"to":4468,"sourceRevision":1,"version":1}},"blockIndex":[{"id":"guide/metrics:seed:markdown/canvas/guide/metrics.md:0","noteId":"guide/metrics","blockId":"seed:markdown/canvas/guide/metrics.md:0","blockVersion":1,"sourceRevision":1,"from":1568,"to":1623,"position":0,"dataType":"wod","blockContentId":"bc-86bf9888","rawContent":"```time\n(3)\n 10 Kettlebell Swings 24kg\n *:30 Rest\n```","noteTitle":"Metrics","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/metrics","sourcePath":"markdown/canvas/guide/metrics.md","routeId":"guide/metrics"},{"id":"guide/metrics:seed:markdown/canvas/guide/metrics.md:1","noteId":"guide/metrics","blockId":"seed:markdown/canvas/guide/metrics.md:1","blockVersion":1,"sourceRevision":1,"from":2112,"to":2206,"position":1,"dataType":"wod","blockContentId":"bc-04273bda","rawContent":"```time\n5 Back Squat 225lb {\"rpe\": 8}\n10 Thrusters 95lb {\"intensity\": 80, \"coach\": \"greg\"}\n```","noteTitle":"Metrics","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/metrics","sourcePath":"markdown/canvas/guide/metrics.md","routeId":"guide/metrics"},{"id":"guide/metrics:seed:markdown/canvas/guide/metrics.md:2","noteId":"guide/metrics","blockId":"seed:markdown/canvas/guide/metrics.md:2","blockVersion":1,"sourceRevision":1,"from":4120,"to":4179,"position":2,"dataType":"wod","blockContentId":"bc-a40eab33","rawContent":"```log\ndate: 2026-05-25\nrpe: 7\n\n5 Back Squat 225lb hard\n```","noteTitle":"Metrics","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/metrics","sourcePath":"markdown/canvas/guide/metrics.md","routeId":"guide/metrics"},{"id":"guide/metrics:seed:markdown/canvas/guide/metrics.md:3","noteId":"guide/metrics","blockId":"seed:markdown/canvas/guide/metrics.md:3","blockVersion":1,"sourceRevision":1,"from":4428,"to":4468,"position":3,"dataType":"query","rawContent":"```query\navg:session-rpe{} by {week}\n```","noteTitle":"Metrics","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/metrics","sourcePath":"markdown/canvas/guide/metrics.md","routeId":"guide/metrics"}],"blockEfforts":[{"id":"guide/metrics:seed:markdown/canvas/guide/metrics.md:0:kettlebell-swings","noteId":"guide/metrics","blockId":"seed:markdown/canvas/guide/metrics.md:0","blockContentId":"bc-86bf9888","effortSlug":"kettlebell-swings","isStatic":true,"sourcePath":"markdown/canvas/guide/metrics.md","createdAt":1792027033000},{"id":"guide/metrics:seed:markdown/canvas/guide/metrics.md:1:back-squat","noteId":"guide/metrics","blockId":"seed:markdown/canvas/guide/metrics.md:1","blockContentId":"bc-04273bda","effortSlug":"back-squat","isStatic":true,"sourcePath":"markdown/canvas/guide/metrics.md","createdAt":1792027033000},{"id":"guide/metrics:seed:markdown/canvas/guide/metrics.md:1:thrusters","noteId":"guide/metrics","blockId":"seed:markdown/canvas/guide/metrics.md:1","blockContentId":"bc-04273bda","effortSlug":"thrusters","isStatic":true,"sourcePath":"markdown/canvas/guide/metrics.md","createdAt":1792027033000},{"id":"guide/metrics:seed:markdown/canvas/guide/metrics.md:2:back-squat","noteId":"guide/metrics","blockId":"seed:markdown/canvas/guide/metrics.md:2","blockContentId":"bc-a40eab33","effortSlug":"back-squat","isStatic":true,"sourcePath":"markdown/canvas/guide/metrics.md","createdAt":1792027033000}]},{"path":"markdown/canvas/guide/protocols.md","content":"---\nsearch: hidden\ntemplate: canvas\nroute: /guide/protocols\ntype: guide\ntitle: \"Timers & Protocols\"\n---\n\n```chapter\nid: protocols\ntitle: Timers & Protocols\nbadge: timer\nquests: protocols-run, protocols-timer, protocols-rounds, protocols-tag\nsections: []\n```\n\n```quest\nid: protocols-run\nlabel: Run the First Example\nvalidation:\n type: run-started\n```\n\n```quest\nid: protocols-timer\nlabel: Add a rest or time cap\nvalidation:\n type: has-timer\n```\n\n```quest\nid: protocols-rounds\nlabel: Add a 3-round cap\nvalidation:\n type: min-rounds\n count: 3\n```\n\n```quest\nid: protocols-tag\nlabel: Add a workout tag\nvalidation:\n type: contains-token\n value: AMRAP\n```\n\n# Timers & Protocols {sticky dark full-bleed}\n\nA duration prefix turns any line into a timer. Combined with round headers, the same few tokens produce AMRAP, EMOM, Tabata, and every interval scheme.\n\n```view\nname: preview\nstate: note\nsource: wods/examples/syntax/timers-rest.md\nruntime: in-memory\nlaunch: host\nalign: right\nwidth: 50%\n```\n\n## Countdown, count-up, and the three prefixes {#countdown-countup}\n\n```button\nlabel: Try it: Timer prefixes\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/timer-modifiers.md\n```\n\n| Line | Clock behavior |\n|---|---|\n| `5:00 Run` | counts **down** from 5:00 |\n| `10 Pushups` | no duration → counts **up** like a stopwatch while you log reps |\n| `^5:00 Row` | `^` forces a count-**up** to 5:00 even though a duration is given |\n| `*:30 Rest` | `*` marks the timer **required** — it cannot be skipped |\n| `1:30:00 Long Row` | `H:MM:SS` for anything over an hour |\n| `5:00 Run :?` | `:?` collects the **actual** result when the block finishes |\n\n`Rest` is behavior, not decoration: the rest cue comes from the word `Rest` on the line; `*` only decides whether it can be skipped. The `:?` prompt may also lead the line — `:? Max Effort Pushups` parses identically because `:?` is its own duration token; this guide appends it as the convention.\n\n### Required rest {#required-rest}\n\n```button\nlabel: Try it: Required rest\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/timers-rest.md\n```\n\n```time\n(3)\n 10 Kettlebell Swings 24kg\n *:30 Rest\n```\n\nThe shared example's rest is non-skippable: the clock waits the full 30 seconds before round 2. A plain `1:00 Rest` (no `*`) can be skipped; `^5:00 Rest` counts up instead of down. What the clock does with rest — pause, skip, sound — is the [Clock chapter](/guide/clock?h=pause-skip).\n\n## AMRAP {#amrap}\n\n```button\nlabel: Try it: AMRAP\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/classic-amrap.md\n```\n\n**As Many Rounds As Possible** — a time cap plus the `AMRAP` label. The clock counts down and counts completed rounds:\n\n```time\n20:00 AMRAP\n 5 Pullups\n 10 Pushups\n 15 Air Squats\n```\n\nA bare duration on a line — `20:00` with no label — is a **time cap** for the work nested beneath it ([Caps](#caps)). Chain several AMRAP windows in one note and each gets its own countdown and round counter.\n\n## EMOM {#emom}\n\n```button\nlabel: Try it: EMOM\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/basic-emom.md\n```\n\n**Every Minute On the Minute** — a round count, an interval duration, and the `EMOM` label:\n\n```time\n(10) :60 EMOM\n 5 Power Cleans\n```\n\nTen windows, one minute each, a bell at the start of every window. Heavier work wants longer windows: `(5) 2:00 EMOM` is five two-minute windows. Separate indented branches rotate across windows:\n\n```time\n(10) :60 EMOM\n 5 Pullups\n 10 Pushups\n```\n\nOdd windows do pull-ups, even windows do push-ups.\n\n## Tabata and intervals {#tabata-intervals}\n\n```button\nlabel: Try it: Tabata\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/protocols-4.md\n```\n\nA work line and a rest line inside a round count — the canonical Tabata:\n\n```time\n(8)\n :20 Max Effort Burpees\n :10 Rest\n```\n\nThe compact form writes the pair on one line with a slash — `(8 Rounds) :20 / :10` — same tokens, same behavior. Change any number: `:40` work with `*:20 Rest` over `(5)` is a popular variant. Sub-minute durations need the leading colon (`:20`, `:10`).\n\n## Caps and For Time {#caps}\n\n```button\nlabel: Try it: Time caps\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/time-cap.md\n```\n\n| Line | Behavior |\n|---|---|\n| `20:00` (bare, work nested under it) | time cap — the clock counts down over whatever is indented |\n| `For Time` | count up, no cap — stop the clock when done |\n| `5:00 For Time` | count up toward a 5:00 cap |\n\n## Distance intervals {#distance-intervals}\n\n```button\nlabel: Try it: Distance intervals\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/distance-intervals.md\n```\n\nPair a timed work interval with a distance target, then recover:\n\n```time\n(6)\n 2:00 Run 400m\n *1:00 Rest\n```\n\nEach round is 400 m against the clock, then mandatory recovery. Distance is just a measure on the line — everything from [First Workout](/guide/start?h=measurements) composes with timers.\n\n## Try it {#try-it}\n\n```button\nlabel: Try it: Tabata\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/protocols-4.md\n```\n\n**Run** — run the Tabata block: eight `:20/:10` cycles with bells on every transition, and the round counter advancing automatically. Pause mid-window and resume — interval timers keep their round state. **Observe** — splits lock per window and the required rest refuses `Next` until elapsed. Runs save a snapshot named from this page and section under the shared run contract.\n\n```button\nlabel: Run\ntarget: preview\nopen: view\npipeline:\n - set-state: track\n```\n\n","blocks":{"seed:markdown/canvas/guide/protocols.md:0":{"id":"seed:markdown/canvas/guide/protocols.md:0","kind":"wod","from":2122,"to":2177,"sourceRevision":1,"version":1,"dialect":"time"},"seed:markdown/canvas/guide/protocols.md:1":{"id":"seed:markdown/canvas/guide/protocols.md:1","kind":"wod","from":2721,"to":2785,"sourceRevision":1,"version":1,"dialect":"time"},"seed:markdown/canvas/guide/protocols.md:2":{"id":"seed:markdown/canvas/guide/protocols.md:2","kind":"wod","from":3220,"to":3262,"sourceRevision":1,"version":1,"dialect":"time"},"seed:markdown/canvas/guide/protocols.md:3":{"id":"seed:markdown/canvas/guide/protocols.md:3","kind":"wod","from":3461,"to":3511,"sourceRevision":1,"version":1,"dialect":"time"},"seed:markdown/canvas/guide/protocols.md:4":{"id":"seed:markdown/canvas/guide/protocols.md:4","kind":"wod","from":3800,"to":3851,"sourceRevision":1,"version":1,"dialect":"time"},"seed:markdown/canvas/guide/protocols.md:5":{"id":"seed:markdown/canvas/guide/protocols.md:5","kind":"wod","from":4742,"to":4786,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"guide/protocols:seed:markdown/canvas/guide/protocols.md:0","noteId":"guide/protocols","blockId":"seed:markdown/canvas/guide/protocols.md:0","blockVersion":1,"sourceRevision":1,"from":2122,"to":2177,"position":0,"dataType":"wod","blockContentId":"bc-86bf9888","rawContent":"```time\n(3)\n 10 Kettlebell Swings 24kg\n *:30 Rest\n```","noteTitle":"Protocols","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/protocols","sourcePath":"markdown/canvas/guide/protocols.md","routeId":"guide/protocols"},{"id":"guide/protocols:seed:markdown/canvas/guide/protocols.md:1","noteId":"guide/protocols","blockId":"seed:markdown/canvas/guide/protocols.md:1","blockVersion":1,"sourceRevision":1,"from":2721,"to":2785,"position":1,"dataType":"wod","blockContentId":"bc-a8ec9216","rawContent":"```time\n20:00 AMRAP\n 5 Pullups\n 10 Pushups\n 15 Air Squats\n```","noteTitle":"Protocols","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/protocols","sourcePath":"markdown/canvas/guide/protocols.md","routeId":"guide/protocols"},{"id":"guide/protocols:seed:markdown/canvas/guide/protocols.md:2","noteId":"guide/protocols","blockId":"seed:markdown/canvas/guide/protocols.md:2","blockVersion":1,"sourceRevision":1,"from":3220,"to":3262,"position":2,"dataType":"wod","blockContentId":"bc-3f48dbdd","rawContent":"```time\n(10) :60 EMOM\n 5 Power Cleans\n```","noteTitle":"Protocols","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/protocols","sourcePath":"markdown/canvas/guide/protocols.md","routeId":"guide/protocols"},{"id":"guide/protocols:seed:markdown/canvas/guide/protocols.md:3","noteId":"guide/protocols","blockId":"seed:markdown/canvas/guide/protocols.md:3","blockVersion":1,"sourceRevision":1,"from":3461,"to":3511,"position":3,"dataType":"wod","blockContentId":"bc-561fee7c","rawContent":"```time\n(10) :60 EMOM\n 5 Pullups\n 10 Pushups\n```","noteTitle":"Protocols","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/protocols","sourcePath":"markdown/canvas/guide/protocols.md","routeId":"guide/protocols"},{"id":"guide/protocols:seed:markdown/canvas/guide/protocols.md:4","noteId":"guide/protocols","blockId":"seed:markdown/canvas/guide/protocols.md:4","blockVersion":1,"sourceRevision":1,"from":3800,"to":3851,"position":4,"dataType":"wod","blockContentId":"bc-73981dd5","rawContent":"```time\n(8)\n :20 Max Effort Burpees\n :10 Rest\n```","noteTitle":"Protocols","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/protocols","sourcePath":"markdown/canvas/guide/protocols.md","routeId":"guide/protocols"},{"id":"guide/protocols:seed:markdown/canvas/guide/protocols.md:5","noteId":"guide/protocols","blockId":"seed:markdown/canvas/guide/protocols.md:5","blockVersion":1,"sourceRevision":1,"from":4742,"to":4786,"position":5,"dataType":"wod","blockContentId":"bc-be8f24b3","rawContent":"```time\n(6)\n 2:00 Run 400m\n *1:00 Rest\n```","noteTitle":"Protocols","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/protocols","sourcePath":"markdown/canvas/guide/protocols.md","routeId":"guide/protocols"}],"blockEfforts":[{"id":"guide/protocols:seed:markdown/canvas/guide/protocols.md:0:kettlebell-swings","noteId":"guide/protocols","blockId":"seed:markdown/canvas/guide/protocols.md:0","blockContentId":"bc-86bf9888","effortSlug":"kettlebell-swings","isStatic":true,"sourcePath":"markdown/canvas/guide/protocols.md","createdAt":1792027033000},{"id":"guide/protocols:seed:markdown/canvas/guide/protocols.md:1:pullups","noteId":"guide/protocols","blockId":"seed:markdown/canvas/guide/protocols.md:1","blockContentId":"bc-a8ec9216","effortSlug":"pullups","isStatic":true,"sourcePath":"markdown/canvas/guide/protocols.md","createdAt":1792027033000},{"id":"guide/protocols:seed:markdown/canvas/guide/protocols.md:1:pushups","noteId":"guide/protocols","blockId":"seed:markdown/canvas/guide/protocols.md:1","blockContentId":"bc-a8ec9216","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/guide/protocols.md","createdAt":1792027033000},{"id":"guide/protocols:seed:markdown/canvas/guide/protocols.md:1:air-squats","noteId":"guide/protocols","blockId":"seed:markdown/canvas/guide/protocols.md:1","blockContentId":"bc-a8ec9216","effortSlug":"air-squats","isStatic":true,"sourcePath":"markdown/canvas/guide/protocols.md","createdAt":1792027033000},{"id":"guide/protocols:seed:markdown/canvas/guide/protocols.md:2:power-cleans","noteId":"guide/protocols","blockId":"seed:markdown/canvas/guide/protocols.md:2","blockContentId":"bc-3f48dbdd","effortSlug":"power-cleans","isStatic":true,"sourcePath":"markdown/canvas/guide/protocols.md","createdAt":1792027033000},{"id":"guide/protocols:seed:markdown/canvas/guide/protocols.md:3:pullups","noteId":"guide/protocols","blockId":"seed:markdown/canvas/guide/protocols.md:3","blockContentId":"bc-561fee7c","effortSlug":"pullups","isStatic":true,"sourcePath":"markdown/canvas/guide/protocols.md","createdAt":1792027033000},{"id":"guide/protocols:seed:markdown/canvas/guide/protocols.md:3:pushups","noteId":"guide/protocols","blockId":"seed:markdown/canvas/guide/protocols.md:3","blockContentId":"bc-561fee7c","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/guide/protocols.md","createdAt":1792027033000},{"id":"guide/protocols:seed:markdown/canvas/guide/protocols.md:4:max-effort-burpees","noteId":"guide/protocols","blockId":"seed:markdown/canvas/guide/protocols.md:4","blockContentId":"bc-73981dd5","effortSlug":"max-effort-burpees","isStatic":true,"sourcePath":"markdown/canvas/guide/protocols.md","createdAt":1792027033000},{"id":"guide/protocols:seed:markdown/canvas/guide/protocols.md:5:run","noteId":"guide/protocols","blockId":"seed:markdown/canvas/guide/protocols.md:5","blockContentId":"bc-be8f24b3","effortSlug":"run","isStatic":true,"sourcePath":"markdown/canvas/guide/protocols.md","createdAt":1792027033000}]},{"path":"markdown/canvas/guide/sessions.md","content":"---\nsearch: hidden\ntemplate: canvas\nroute: /guide/sessions\ntype: guide\ntitle: \"Dialects & Complex Sessions\"\n---\n\n```chapter\nid: sessions\ntitle: Dialects & Complex Sessions\nbadge: puzzle\nquests: sessions-run, sessions-log, sessions-nested\nsections: []\n```\n\n```quest\nid: sessions-run\nlabel: Run the First Example\nvalidation:\n type: run-started\n```\n\n```quest\nid: sessions-log\nlabel: Write a log block\nvalidation:\n type: contains-token\n value: \\`\\`\\`log\n```\n\n```quest\nid: sessions-nested\nlabel: Nest a protocol inside rounds\nvalidation:\n type: min-rounds\n count: 2\n```\n\n# Dialects & Complex Sessions {sticky dark full-bleed}\n\nEverything you've learned composes. This chapter covers the fence flavors and the session shapes that combine them.\n\n```view\nname: preview\nstate: note\nsource: wods/examples/syntax/complex-full-session.md\nruntime: in-memory\nlaunch: host\nalign: right\nwidth: 50%\n```\n\n## Intent and the fence {#intent}\n\n```button\nlabel: Try it: The time fence\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/dialect-wod.md\n```\n\nA fence tells WOD Wiki what a block **is**, while the line grammar stays the same:\n\n| Fence | Intent | Behavior |\n|---|---|---|\n| ```` ```time ```` | a session to **run** — the workout of the day, or tomorrow's plan | runnable with the clock ([the Clock](/guide/clock?h=run-next)) |\n| ```` ```log ```` | a **record** of what happened — performed work, notes, subjective effort | preserved as-is; no timer expectations |\n| ```` ```log:climbing ```` | a log in a **sport dialect** — climbing signals (grades, send types, attempts, high points) become explicit metrics | same `log` semantics + the climbing dialect |\n\nWhether a ```time block is today's workout or tomorrow's plan is your call — the syntax is identical, and unknown loads stay as `?lb` placeholders until execution either way. Older pages speak of ```` ```wod ````/```` ```plan ````/```` ```climb ```` fences: treat those as *intent* vocabulary, not fence names — the runtime affords `time` and `log` (with `:sport` suffixes).\n\nThe suffix is a sport name or dialect id — `climbing` maps to the `climb` dialect. An unknown suffix warns and falls back to the full dialect stack, so a typo never loses your data.\n\n## Full session {#full-session}\n\nThe four-section session is already in the panel — warmup → strength → conditioning → cool-down ([section labeling](/guide/structure?h=named-sections)):\n\n```time\n// Warmup\n 400m Run\n 10 Air Squats\n\n// Strength\n (5 Sets)\n 3 Back Squat 225lb\n *2:00 Rest\n\n// Conditioning\n 10:00 AMRAP\n 5 Pullups\n 10 Pushups\n\n// Cool-down\n 5:00 Walk\n```\n\n## Nested protocols {#nested}\n\n```button\nlabel: Try it: Nested protocols\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/complex-nested-protocols.md\n```\n\nAn outer round can wrap a timed block and a strength block; groups run sequentially and the runtime handles transitions:\n\n```time\n(3)\n 5:00 AMRAP\n 5 Pullups\n 10 Pushups\n// Strength\n 3 Back Squat 225lb\n *2:00 Rest\n```\n\n## Partner sessions {#partner}\n\n```button\nlabel: Try it: Partner windows\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/complex-partner-workout.md\n```\n\nSeparate labeled windows keep each partner's work distinct while sharing the document:\n\n```time\n// Partner A\n 5:00 AMRAP\n 5 Pullups\n 10 Pushups\n\n// Partner B\n 5:00 AMRAP\n 10 Air Squats\n 8 Burpees\n```\n\n## Swimming {#swimming}\n\n```button\nlabel: Try it: Swimming sets\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/complex-swimming.md\n```\n\nMulti-set interval work with named sets and distance measures:\n\n```time\n(4) Power Sprints\n 25m Freestyle Sprint\n 1:30 Rest\n\n(6) IM Main Set\n 100m IM\n :45 Rest\n\n150m Cooldown\n```\n\n## Barbell cycling {#barbell-cycling}\n\n```button\nlabel: Try it: Barbell cycling\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/complex-barbell-cycling.md\n```\n\nBack-to-back EMOM windows with changing loads — cue cards prompt the plate change between blocks:\n\n```time\n(5) :60 EMOM\n 3 Power Clean 135lb\n\n(Change Plates)\n\n(5) :60 EMOM\n 2 Power Clean 155lb\n```\n\n## Climbing and logging {#climbing}\n\n```button\nlabel: Try it: Climbing log\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/dialect-climb-bouldering.md\n```\n\nA ```log fence records what happened — effort words, properties, and comments included:\n\n```log\ndate: 2026-05-25\nrpe: 7\n\n5 Back Squat 225lb hard\n// Bar speed slowed on set 3.\n```\n\nWith the climbing suffix, plain text becomes structured signals — grades, send types, attempt counts, high points, and discipline stay readable as Markdown but queryable via `grade`, `calc.sends`, and friends ([finger-strength board](/guide/dashboards?h=seeded-boards)):\n\n```log\nNight session. Sent Midnight Lightning V8, 3 attempts. High point on the 5.12a proj.\n```\n\n## Try it {#try-it}\n\nThe full session is back in the panel (the first **Try it** above restores the fence flavors any time). Run it end to end — four sections, required rest, an AMRAP window, a cooldown — then open [your dashboard](/guide/dashboards?h=seeded-boards) and find the session in this week's volume. **Observe** — per-section splits and the AMRAP round counter in the review grid. Runs save under the shared run contract, like every chapter.\n\n```button\nlabel: Run\ntarget: preview\nopen: view\npipeline:\n - set-state: track\n```\n\n","blocks":{"seed:markdown/canvas/guide/sessions.md:0":{"id":"seed:markdown/canvas/guide/sessions.md:0","kind":"wod","from":2423,"to":2619,"sourceRevision":1,"version":1,"dialect":"time"},"seed:markdown/canvas/guide/sessions.md:1":{"id":"seed:markdown/canvas/guide/sessions.md:1","kind":"wod","from":2913,"to":3016,"sourceRevision":1,"version":1,"dialect":"time"},"seed:markdown/canvas/guide/sessions.md:2":{"id":"seed:markdown/canvas/guide/sessions.md:2","kind":"wod","from":3275,"to":3400,"sourceRevision":1,"version":1,"dialect":"time"},"seed:markdown/canvas/guide/sessions.md:3":{"id":"seed:markdown/canvas/guide/sessions.md:3","kind":"wod","from":3619,"to":3736,"sourceRevision":1,"version":1,"dialect":"time"},"seed:markdown/canvas/guide/sessions.md:4":{"id":"seed:markdown/canvas/guide/sessions.md:4","kind":"wod","from":4013,"to":4112,"sourceRevision":1,"version":1,"dialect":"time"},"seed:markdown/canvas/guide/sessions.md:5":{"id":"seed:markdown/canvas/guide/sessions.md:5","kind":"wod","from":4375,"to":4464,"sourceRevision":1,"version":1,"dialect":"log"},"seed:markdown/canvas/guide/sessions.md:6":{"id":"seed:markdown/canvas/guide/sessions.md:6","kind":"wod","from":4738,"to":4833,"sourceRevision":1,"version":1,"dialect":"log"}},"blockIndex":[{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:0","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:0","blockVersion":1,"sourceRevision":1,"from":2423,"to":2619,"position":0,"dataType":"wod","blockContentId":"bc-28a484de","rawContent":"```time\n// Warmup\n 400m Run\n 10 Air Squats\n\n// Strength\n (5 Sets)\n 3 Back Squat 225lb\n *2:00 Rest\n\n// Conditioning\n 10:00 AMRAP\n 5 Pullups\n 10 Pushups\n\n// Cool-down\n 5:00 Walk\n```","noteTitle":"Sessions","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/sessions","sourcePath":"markdown/canvas/guide/sessions.md","routeId":"guide/sessions"},{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:1","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:1","blockVersion":1,"sourceRevision":1,"from":2913,"to":3016,"position":1,"dataType":"wod","blockContentId":"bc-4c58ae00","rawContent":"```time\n(3)\n 5:00 AMRAP\n 5 Pullups\n 10 Pushups\n// Strength\n 3 Back Squat 225lb\n *2:00 Rest\n```","noteTitle":"Sessions","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/sessions","sourcePath":"markdown/canvas/guide/sessions.md","routeId":"guide/sessions"},{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:2","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:2","blockVersion":1,"sourceRevision":1,"from":3275,"to":3400,"position":2,"dataType":"wod","blockContentId":"bc-8c7b43c3","rawContent":"```time\n// Partner A\n 5:00 AMRAP\n 5 Pullups\n 10 Pushups\n\n// Partner B\n 5:00 AMRAP\n 10 Air Squats\n 8 Burpees\n```","noteTitle":"Sessions","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/sessions","sourcePath":"markdown/canvas/guide/sessions.md","routeId":"guide/sessions"},{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:3","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:3","blockVersion":1,"sourceRevision":1,"from":3619,"to":3736,"position":3,"dataType":"wod","blockContentId":"bc-37778bd2","rawContent":"```time\n(4) Power Sprints\n 25m Freestyle Sprint\n 1:30 Rest\n\n(6) IM Main Set\n 100m IM\n :45 Rest\n\n150m Cooldown\n```","noteTitle":"Sessions","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/sessions","sourcePath":"markdown/canvas/guide/sessions.md","routeId":"guide/sessions"},{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:4","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:4","blockVersion":1,"sourceRevision":1,"from":4013,"to":4112,"position":4,"dataType":"wod","blockContentId":"bc-720fc8b6","rawContent":"```time\n(5) :60 EMOM\n 3 Power Clean 135lb\n\n(Change Plates)\n\n(5) :60 EMOM\n 2 Power Clean 155lb\n```","noteTitle":"Sessions","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/sessions","sourcePath":"markdown/canvas/guide/sessions.md","routeId":"guide/sessions"},{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:5","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:5","blockVersion":1,"sourceRevision":1,"from":4375,"to":4464,"position":5,"dataType":"wod","blockContentId":"bc-8e347283","rawContent":"```log\ndate: 2026-05-25\nrpe: 7\n\n5 Back Squat 225lb hard\n// Bar speed slowed on set 3.\n```","noteTitle":"Sessions","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/sessions","sourcePath":"markdown/canvas/guide/sessions.md","routeId":"guide/sessions"},{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:6","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:6","blockVersion":1,"sourceRevision":1,"from":4738,"to":4833,"position":6,"dataType":"wod","blockContentId":"bc-d1d7a046","rawContent":"```log\nNight session. Sent Midnight Lightning V8, 3 attempts. High point on the 5.12a proj.\n```","noteTitle":"Sessions","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/sessions","sourcePath":"markdown/canvas/guide/sessions.md","routeId":"guide/sessions"}],"blockEfforts":[{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:0:run","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:0","blockContentId":"bc-28a484de","effortSlug":"run","isStatic":true,"sourcePath":"markdown/canvas/guide/sessions.md","createdAt":1792027033000},{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:0:air-squats","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:0","blockContentId":"bc-28a484de","effortSlug":"air-squats","isStatic":true,"sourcePath":"markdown/canvas/guide/sessions.md","createdAt":1792027033000},{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:0:back-squat","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:0","blockContentId":"bc-28a484de","effortSlug":"back-squat","isStatic":true,"sourcePath":"markdown/canvas/guide/sessions.md","createdAt":1792027033000},{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:0:pullups","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:0","blockContentId":"bc-28a484de","effortSlug":"pullups","isStatic":true,"sourcePath":"markdown/canvas/guide/sessions.md","createdAt":1792027033000},{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:0:pushups","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:0","blockContentId":"bc-28a484de","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/guide/sessions.md","createdAt":1792027033000},{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:0:walk","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:0","blockContentId":"bc-28a484de","effortSlug":"walk","isStatic":true,"sourcePath":"markdown/canvas/guide/sessions.md","createdAt":1792027033000},{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:1:pullups","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:1","blockContentId":"bc-4c58ae00","effortSlug":"pullups","isStatic":true,"sourcePath":"markdown/canvas/guide/sessions.md","createdAt":1792027033000},{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:1:pushups","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:1","blockContentId":"bc-4c58ae00","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/guide/sessions.md","createdAt":1792027033000},{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:1:back-squat","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:1","blockContentId":"bc-4c58ae00","effortSlug":"back-squat","isStatic":true,"sourcePath":"markdown/canvas/guide/sessions.md","createdAt":1792027033000},{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:2:pullups","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:2","blockContentId":"bc-8c7b43c3","effortSlug":"pullups","isStatic":true,"sourcePath":"markdown/canvas/guide/sessions.md","createdAt":1792027033000},{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:2:pushups","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:2","blockContentId":"bc-8c7b43c3","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/guide/sessions.md","createdAt":1792027033000},{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:2:air-squats","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:2","blockContentId":"bc-8c7b43c3","effortSlug":"air-squats","isStatic":true,"sourcePath":"markdown/canvas/guide/sessions.md","createdAt":1792027033000},{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:2:burpees","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:2","blockContentId":"bc-8c7b43c3","effortSlug":"burpees","isStatic":true,"sourcePath":"markdown/canvas/guide/sessions.md","createdAt":1792027033000},{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:3:power-sprints","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:3","blockContentId":"bc-37778bd2","effortSlug":"power-sprints","isStatic":true,"sourcePath":"markdown/canvas/guide/sessions.md","createdAt":1792027033000},{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:3:freestyle-sprint","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:3","blockContentId":"bc-37778bd2","effortSlug":"freestyle-sprint","isStatic":true,"sourcePath":"markdown/canvas/guide/sessions.md","createdAt":1792027033000},{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:3:im-main-set","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:3","blockContentId":"bc-37778bd2","effortSlug":"im-main-set","isStatic":true,"sourcePath":"markdown/canvas/guide/sessions.md","createdAt":1792027033000},{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:3:im","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:3","blockContentId":"bc-37778bd2","effortSlug":"im","isStatic":true,"sourcePath":"markdown/canvas/guide/sessions.md","createdAt":1792027033000},{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:4:power-clean","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:4","blockContentId":"bc-720fc8b6","effortSlug":"power-clean","isStatic":true,"sourcePath":"markdown/canvas/guide/sessions.md","createdAt":1792027033000},{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:5:back-squat","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:5","blockContentId":"bc-8e347283","effortSlug":"back-squat","isStatic":true,"sourcePath":"markdown/canvas/guide/sessions.md","createdAt":1792027033000},{"id":"guide/sessions:seed:markdown/canvas/guide/sessions.md:6:night-session-sent-midnight-lightning-v8","noteId":"guide/sessions","blockId":"seed:markdown/canvas/guide/sessions.md:6","blockContentId":"bc-d1d7a046","effortSlug":"night-session-sent-midnight-lightning-v8","isStatic":true,"sourcePath":"markdown/canvas/guide/sessions.md","createdAt":1792027033000}]},{"path":"markdown/canvas/guide/start.md","content":"---\nsearch: hidden\ntemplate: canvas\nroute: /guide/start\ntype: guide\ntitle: \"First Workout\"\n---\n\n```chapter\nid: start\ntitle: First Workout\nbadge: play\nquests: start-run, start-movement, start-reps, start-load\nsections: []\n```\n\n```quest\nid: start-run\nlabel: Run the First Example\nvalidation:\n type: run-started\n```\n\n```quest\nid: start-movement\nlabel: Add a movement\nvalidation:\n type: has-movement\n```\n\n```quest\nid: start-reps\nlabel: Add a rep count\nvalidation:\n type: has-reps\n```\n\n```quest\nid: start-load\nlabel: Add a load or distance\nvalidation:\n type: contains-token\n value: lb\n```\n\n# First Workout {sticky dark full-bleed}\n\nWOD Wiki turns a plain Markdown note into a workout you can **run** and a journal you can **query**. This chapter gets you from an empty note to your first tracked session — the same note the homepage uses. Edit the example on the right as you read; every section swaps in its own.\n\n```view\nname: preview\nstate: note\nsource: wods/examples/home/sample-script.md\nruntime: in-memory\nlaunch: host\nalign: right\nwidth: 50%\n```\n\n## Fences {sticky}\n\nA workout lives inside a fenced code block. Two fence tags matter:\n\n- ```` ```time ```` — a session you intend to **run** with the clock.\n- ```` ```log ```` — a session you are **recording** after (or while) it happened.\n\n````markdown\n```time\n(3)\n 10 Kettlebell Swings 24kg\n *:30 Rest\n```\n````\n\nEverything else in this chapter goes *inside* the fence. There is no `wod`/`plan` fence — the runtime affords `time` and `log` (with `:sport` suffixes, [Sessions](/guide/sessions?h=intent)); in-note analytics use [```query](/guide/wql).\n\n## Three rules {#first-workout}\n\n```button\nlabel: Try it: Core rules\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/core-rules.md\n```\n\n1. **Fences** — wrap the workout in a ```` ```time ```` (or ```` ```log ````) block.\n2. **One thing per line** — a line is a movement, a time, a group header, or a note.\n3. **Indentation means nesting** — anything indented under a header belongs to it.\n\nThe smallest valid workout is one line:\n\n```time\nPushups\n```\n\nNo reps, no timer — the runtime asks how many you did when you finish. Add a number and the rep count is tracked automatically:\n\n```time\n10 Pushups\n```\n\n## Measures ride along {#measurements}\n\n```button\nlabel: Try it: Measurements\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/measurements.md\n```\n\nLoads and distances attach directly to movement lines; the runtime records them as metrics:\n\n| Line | What it records |\n|---|---|\n| `5 Back Squat 225lb` | 5 reps × 225 lb per set |\n| `5 Back Squat 100kg` | kilograms work exactly the same |\n| `Run 400m` | 400 m distance |\n| `10 miles` | bare distances work too |\n| `5 Deadlifts ?lb` | load unknown — the clock prompts for the actual weight ([Capture](/guide/metrics?h=capture)) |\n| `5 Back Squat 225lb hard` | a plain-language effort word rides along |\n\n## Instructions and asides {#actions-comments}\n\n```button\nlabel: Try it: Actions & comments\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/actions-comments.md\n```\n\n- **Actions** in square brackets are cue cards in the timer: `[Setup Barbell]` appears when reached, then the clock moves on.\n- **Comments** start with `//` — passive annotations that never affect the clock.\n\n```time\n// Warmup — get loose\n 400m Run\n(Chalk up)\n 10 Air Squats\n```\n\n## The system at a glance {#system}\n\nEverything you create lives in one place, addressed one way:\n\n| Term | Purpose | Scope / storage |\n|---|---|---|\n| **Note** | the markdown document + identity | one IndexedDB store (notes + results + attachments + analytics) |\n| **Page** | a note bound to a surface (a routed guide page, the playground) | bindings per surface |\n| **Block** | one addressable fenced unit in a note; the run target | Block Content Id = content hash, stable across reorders/clones |\n| **Effort** | named workout registry entry (e.g. *fran*) | aggregates `by {effort}` |\n| **Session** | one recorded run | `{noteId, resultId, block}` triple |\n| **Journal** | your saved notes | `source:journal`; promotion target |\n| **Playground** | experiment surface (home, learning runs) | `source:playground` |\n| **Catalog** | catalog of benchmark sessions | `source:feeds`; clone into journal |\n| **Feed** | dated posts | — |\n| **Dashboard** | a note with `dashboard: true`; its query blocks render as widgets | [Dashboards](/guide/dashboards) |\n\n**`source:` scope** — plural values: `journal`, `feeds`, `guides`, `playground` (plus `dashboards`, `efforts`). Omitting `source:` searches all of them; pin one catalog with `catalog:<id>`. Learning runs record with origin `'playground'` until promoted to the journal — a query pinned to `source:journal` excludes playground experiments by design ([WQL sources](/guide/wql?h=sources)).\n\n**Session vs template vs sample vs revert.** A **session** is immutable recorded facts from one run. A **template** is read-only source content — the examples on these pages; running one copies it into your own snapshot, it never mutates. A **sample dataset** is the badged fallback you see before you have facts of your own. **Revert** discards view state only — it never deletes saved sessions.\n\n## The running example {#try-it}\n\nThis is the homepage's edit-me note — already loaded in the panel — and the example every later chapter reuses:\n\n```time\n(3)\n 10 Kettlebell Swings 24kg\n *:30 Rest\n```\n\n**Run** — press **Run**: the clock counts three rounds of 10 swings with a required 30-second rest between them; each `Next` locks the elapsed time as a split. **Observe** — when the workout completes, the review grid shows 30 total swings at 24 kg — the raw material for [Metrics](/guide/metrics). Running saves a snapshot named from this page and section; every chapter shares the one run contract — none defines its own.\n\n```button\nlabel: Run\ntarget: preview\nopen: view\npipeline:\n - set-state: track\n```\n\n## Compact syntax reference {#reference}\n\nOne table, the whole line grammar. Chapters 2–3 expand each row.\n\n| You write | You get |\n|---|---|\n| ```` ```time ```` / ```` ```log ```` | runnable / recorded fence |\n| `10 Pushups` | movement + reps |\n| `5 Back Squat 225lb` | movement + reps + load |\n| `Run 400m` / `10 miles` | movement + distance |\n| `?lb` / `?kg` / `225lb ?lb` | capture-the-load prompt |\n| `5:00 Run` / `^5:00 Row` | countdown / forced count-up |\n| `*:30 Rest` | required rest block |\n| `:?` | collect-the-actual prompt (`5:00 Run :?`) |\n| `(3)` / `(3 Rounds)` / `(5 Sets)` | repeat the indented block |\n| `(21-15-9)` | rep scheme — one round per value |\n| `(Warmup)` or `// Warmup` | named section ([Structure](/guide/structure?h=named-sections)) |\n| `20:00 AMRAP` / `(10) :60 EMOM` / `(8)` + `:20`/`:10` | protocols ([Timers & Protocols](/guide/protocols?h=amrap)) |\n| `{\"rpe\": 8}` | inline custom metric ([Metrics](/guide/metrics?h=custom-metrics)) |\n| `[Setup Barbell]` / `// note` | cue card / comment |\n| `hard`, `easy` | effort words |\n\nPrefer generating? The [/ai-first](/ai-first) page shows AI-assisted note authoring.\n","blocks":{"seed:markdown/canvas/guide/start.md:0":{"id":"seed:markdown/canvas/guide/start.md:0","kind":"wod","from":2067,"to":2086,"sourceRevision":1,"version":1,"dialect":"time"},"seed:markdown/canvas/guide/start.md:1":{"id":"seed:markdown/canvas/guide/start.md:1","kind":"wod","from":2217,"to":2239,"sourceRevision":1,"version":1,"dialect":"time"},"seed:markdown/canvas/guide/start.md:2":{"id":"seed:markdown/canvas/guide/start.md:2","kind":"wod","from":3298,"to":3369,"sourceRevision":1,"version":1,"dialect":"time"},"seed:markdown/canvas/guide/start.md:3":{"id":"seed:markdown/canvas/guide/start.md:3","kind":"wod","from":5356,"to":5411,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"guide/start:seed:markdown/canvas/guide/start.md:0","noteId":"guide/start","blockId":"seed:markdown/canvas/guide/start.md:0","blockVersion":1,"sourceRevision":1,"from":2067,"to":2086,"position":0,"dataType":"wod","blockContentId":"bc-40d05391","rawContent":"```time\nPushups\n```","noteTitle":"Start","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/start","sourcePath":"markdown/canvas/guide/start.md","routeId":"guide/start"},{"id":"guide/start:seed:markdown/canvas/guide/start.md:1","noteId":"guide/start","blockId":"seed:markdown/canvas/guide/start.md:1","blockVersion":1,"sourceRevision":1,"from":2217,"to":2239,"position":1,"dataType":"wod","blockContentId":"bc-de52a1a2","rawContent":"```time\n10 Pushups\n```","noteTitle":"Start","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/start","sourcePath":"markdown/canvas/guide/start.md","routeId":"guide/start"},{"id":"guide/start:seed:markdown/canvas/guide/start.md:2","noteId":"guide/start","blockId":"seed:markdown/canvas/guide/start.md:2","blockVersion":1,"sourceRevision":1,"from":3298,"to":3369,"position":2,"dataType":"wod","blockContentId":"bc-0121a97c","rawContent":"```time\n// Warmup — get loose\n 400m Run\n(Chalk up)\n 10 Air Squats\n```","noteTitle":"Start","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/start","sourcePath":"markdown/canvas/guide/start.md","routeId":"guide/start"},{"id":"guide/start:seed:markdown/canvas/guide/start.md:3","noteId":"guide/start","blockId":"seed:markdown/canvas/guide/start.md:3","blockVersion":1,"sourceRevision":1,"from":5356,"to":5411,"position":3,"dataType":"wod","blockContentId":"bc-86bf9888","rawContent":"```time\n(3)\n 10 Kettlebell Swings 24kg\n *:30 Rest\n```","noteTitle":"Start","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/start","sourcePath":"markdown/canvas/guide/start.md","routeId":"guide/start"}],"blockEfforts":[{"id":"guide/start:seed:markdown/canvas/guide/start.md:0:pushups","noteId":"guide/start","blockId":"seed:markdown/canvas/guide/start.md:0","blockContentId":"bc-40d05391","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/guide/start.md","createdAt":1792027033000},{"id":"guide/start:seed:markdown/canvas/guide/start.md:1:pushups","noteId":"guide/start","blockId":"seed:markdown/canvas/guide/start.md:1","blockContentId":"bc-de52a1a2","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/guide/start.md","createdAt":1792027033000},{"id":"guide/start:seed:markdown/canvas/guide/start.md:2:run","noteId":"guide/start","blockId":"seed:markdown/canvas/guide/start.md:2","blockContentId":"bc-0121a97c","effortSlug":"run","isStatic":true,"sourcePath":"markdown/canvas/guide/start.md","createdAt":1792027033000},{"id":"guide/start:seed:markdown/canvas/guide/start.md:2:air-squats","noteId":"guide/start","blockId":"seed:markdown/canvas/guide/start.md:2","blockContentId":"bc-0121a97c","effortSlug":"air-squats","isStatic":true,"sourcePath":"markdown/canvas/guide/start.md","createdAt":1792027033000},{"id":"guide/start:seed:markdown/canvas/guide/start.md:3:kettlebell-swings","noteId":"guide/start","blockId":"seed:markdown/canvas/guide/start.md:3","blockContentId":"bc-86bf9888","effortSlug":"kettlebell-swings","isStatic":true,"sourcePath":"markdown/canvas/guide/start.md","createdAt":1792027033000}]},{"path":"markdown/canvas/guide/structure.md","content":"---\nsearch: hidden\ntemplate: canvas\nroute: /guide/structure\ntype: guide\ntitle: \"Structure & Rounds\"\n---\n\n```chapter\nid: structure\ntitle: Structure & Rounds\nbadge: blocks\nquests: structure-run, structure-rounds, structure-repscheme\nsections: []\n```\n\n```quest\nid: structure-run\nlabel: Run the First Example\nvalidation:\n type: run-started\n```\n\n```quest\nid: structure-rounds\nlabel: Wrap movements in 2+ rounds\nvalidation:\n type: min-rounds\n count: 2\n```\n\n```quest\nid: structure-repscheme\nlabel: Write a rep scheme\nvalidation:\n type: contains-token\n value: 21-15-9\n```\n\n# Structure & Rounds {sticky dark full-bleed}\n\nA header in parentheses creates a **round behavior** that owns every indented line beneath it. Ownership is indentation; the runtime tracks which round you're in and advances automatically.\n\n```view\nname: preview\nstate: note\nsource: wods/examples/syntax/groups-1.md\nruntime: in-memory\nlaunch: host\nalign: right\nwidth: 50%\n```\n\n## Rounds {#rounds}\n\n```time\n(3)\n 10 Pushups\n 15 Air Squats\n```\n\n`(3)`, `(3 Rounds)`, `(3 Rds)` — the label is optional. The clock executes pushups, air squats, then repeats until three rounds are done, showing the current round throughout.\n\n## Rep schemes {#rep-schemes}\n\n```button\nlabel: Try it: Rep schemes\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/groups-2.md\n```\n\nA dash-separated list creates one round per value, and **every movement in the block inherits the current round's value**:\n\n```time\n(21-15-9) Thruster / Pull-up\n```\n\nRound 1: 21 thrusters and 21 pull-ups. Round 2: 15 of each. Round 3: 9. Ladders like `(10-8-6-4-2)` work the same way. The slash between movements is choice notation — do the movements in either order (or alternate) each round.\n\n## Sets {#sets}\n\n```button\nlabel: Try it: Sets\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/multiple-sets.md\n```\n\n`(5 Sets)` repeats a block five times with equal reps per set — usually with rest inside:\n\n```time\n(5 Sets)\n 3 Back Squat 225lb\n *2:00 Rest\n```\n\n## Nesting {#nesting}\n\n```button\nlabel: Try it: Nesting\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/groups-3.md\n```\n\nRounds nest inside rounds — supersets, alternating blocks, complex sessions:\n\n```time\n(5)\n (3)\n 5 Deadlift\n 10 Pushups\n```\n\nFive outer rounds, each containing three inner sets: 5 × 3 × 5 = 75 deadlifts. The clock counts both levels and shows where you are.\n\n### Rep math {#rep-math}\n\nThe compiler derives totals — nothing is guessed or manually logged:\n\n| Structure | Math |\n|---|---|\n| `(3 Rounds) 10 Burpees` | 10 × 3 = 30 burpees |\n| `(21-15-9) Thruster` | 21 + 15 + 9 = 45 thrusters |\n| `(5) (3) 5 Deadlift` | 5 × 3 × 5 = 75 deadlifts |\n\nThese planned totals feed the review grid, and — combined with what the clock records — become the [recorded facts](/guide/metrics?h=planned-vs-recorded) that WQL aggregates.\n\n## Named sections {#named-sections}\n\n```button\nlabel: Try it: Named sections\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/named-groups.md\n```\n\nTwo legal ways to label a section of a session:\n\n- **`(Warmup)`** — a parenthesized label creates a named group node. Without a number it does not repeat; it organizes.\n- **`// Warmup`** — a comment line. Pure text: no group node, but it labels sections in every shipped session example.\n\n```time\n// Warmup\n 400m Run\n 10 Air Squats\n\n// Strength\n (5 Sets)\n 3 Back Squat 225lb\n *2:00 Rest\n\n// Conditioning\n 10:00 AMRAP\n 5 Pullups\n 10 Pushups\n\n// Cool-down\n 5:00 Walk\n```\n\nChain named groups to describe a full training session in one note; sections run sequentially and don't need to repeat to be useful. Use `(Label)` when you want a first-class group the runtime knows about; use `// Label` for pure organization. Full sessions like this one are [composed in the last chapter](/guide/sessions?h=full-session).\n\n## Try it {#try-it}\n\n```button\nlabel: Try it: Full session\ntarget: preview\npipeline:\n - set-source: wods/examples/syntax/complex-full-session.md\n```\n\n**Run** — run the four-section session above: each named section plays in order, the `(5 Sets)` block tracks set count and enforces required rest, and the AMRAP window counts its own rounds. **Observe** — the review grid at the end shows per-section and per-round splits. Runs save under the shared run contract, same as every chapter.\n\n```button\nlabel: Run\ntarget: preview\nopen: view\npipeline:\n - set-state: track\n```\n\n","blocks":{"seed:markdown/canvas/guide/structure.md:0":{"id":"seed:markdown/canvas/guide/structure.md:0","kind":"wod","from":976,"to":1020,"sourceRevision":1,"version":1,"dialect":"time"},"seed:markdown/canvas/guide/structure.md:1":{"id":"seed:markdown/canvas/guide/structure.md:1","kind":"wod","from":1472,"to":1512,"sourceRevision":1,"version":1,"dialect":"time"},"seed:markdown/canvas/guide/structure.md:2":{"id":"seed:markdown/canvas/guide/structure.md:2","kind":"wod","from":1967,"to":2021,"sourceRevision":1,"version":1,"dialect":"time"},"seed:markdown/canvas/guide/structure.md:3":{"id":"seed:markdown/canvas/guide/structure.md:3","kind":"wod","from":2238,"to":2289,"sourceRevision":1,"version":1,"dialect":"time"},"seed:markdown/canvas/guide/structure.md:4":{"id":"seed:markdown/canvas/guide/structure.md:4","kind":"wod","from":3336,"to":3532,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"guide/structure:seed:markdown/canvas/guide/structure.md:0","noteId":"guide/structure","blockId":"seed:markdown/canvas/guide/structure.md:0","blockVersion":1,"sourceRevision":1,"from":976,"to":1020,"position":0,"dataType":"wod","blockContentId":"bc-36c6b543","rawContent":"```time\n(3)\n 10 Pushups\n 15 Air Squats\n```","noteTitle":"Structure","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/structure","sourcePath":"markdown/canvas/guide/structure.md","routeId":"guide/structure"},{"id":"guide/structure:seed:markdown/canvas/guide/structure.md:1","noteId":"guide/structure","blockId":"seed:markdown/canvas/guide/structure.md:1","blockVersion":1,"sourceRevision":1,"from":1472,"to":1512,"position":1,"dataType":"wod","blockContentId":"bc-f3e49f1b","rawContent":"```time\n(21-15-9) Thruster / Pull-up\n```","noteTitle":"Structure","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/structure","sourcePath":"markdown/canvas/guide/structure.md","routeId":"guide/structure"},{"id":"guide/structure:seed:markdown/canvas/guide/structure.md:2","noteId":"guide/structure","blockId":"seed:markdown/canvas/guide/structure.md:2","blockVersion":1,"sourceRevision":1,"from":1967,"to":2021,"position":2,"dataType":"wod","blockContentId":"bc-aedf8ee3","rawContent":"```time\n(5 Sets)\n 3 Back Squat 225lb\n *2:00 Rest\n```","noteTitle":"Structure","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/structure","sourcePath":"markdown/canvas/guide/structure.md","routeId":"guide/structure"},{"id":"guide/structure:seed:markdown/canvas/guide/structure.md:3","noteId":"guide/structure","blockId":"seed:markdown/canvas/guide/structure.md:3","blockVersion":1,"sourceRevision":1,"from":2238,"to":2289,"position":3,"dataType":"wod","blockContentId":"bc-9bba73a2","rawContent":"```time\n(5)\n (3)\n 5 Deadlift\n 10 Pushups\n```","noteTitle":"Structure","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/structure","sourcePath":"markdown/canvas/guide/structure.md","routeId":"guide/structure"},{"id":"guide/structure:seed:markdown/canvas/guide/structure.md:4","noteId":"guide/structure","blockId":"seed:markdown/canvas/guide/structure.md:4","blockVersion":1,"sourceRevision":1,"from":3336,"to":3532,"position":4,"dataType":"wod","blockContentId":"bc-28a484de","rawContent":"```time\n// Warmup\n 400m Run\n 10 Air Squats\n\n// Strength\n (5 Sets)\n 3 Back Squat 225lb\n *2:00 Rest\n\n// Conditioning\n 10:00 AMRAP\n 5 Pullups\n 10 Pushups\n\n// Cool-down\n 5:00 Walk\n```","noteTitle":"Structure","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/structure","sourcePath":"markdown/canvas/guide/structure.md","routeId":"guide/structure"}],"blockEfforts":[{"id":"guide/structure:seed:markdown/canvas/guide/structure.md:0:pushups","noteId":"guide/structure","blockId":"seed:markdown/canvas/guide/structure.md:0","blockContentId":"bc-36c6b543","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/guide/structure.md","createdAt":1792027033000},{"id":"guide/structure:seed:markdown/canvas/guide/structure.md:0:air-squats","noteId":"guide/structure","blockId":"seed:markdown/canvas/guide/structure.md:0","blockContentId":"bc-36c6b543","effortSlug":"air-squats","isStatic":true,"sourcePath":"markdown/canvas/guide/structure.md","createdAt":1792027033000},{"id":"guide/structure:seed:markdown/canvas/guide/structure.md:1:thruster","noteId":"guide/structure","blockId":"seed:markdown/canvas/guide/structure.md:1","blockContentId":"bc-f3e49f1b","effortSlug":"thruster","isStatic":true,"sourcePath":"markdown/canvas/guide/structure.md","createdAt":1792027033000},{"id":"guide/structure:seed:markdown/canvas/guide/structure.md:2:back-squat","noteId":"guide/structure","blockId":"seed:markdown/canvas/guide/structure.md:2","blockContentId":"bc-aedf8ee3","effortSlug":"back-squat","isStatic":true,"sourcePath":"markdown/canvas/guide/structure.md","createdAt":1792027033000},{"id":"guide/structure:seed:markdown/canvas/guide/structure.md:3:deadlift","noteId":"guide/structure","blockId":"seed:markdown/canvas/guide/structure.md:3","blockContentId":"bc-9bba73a2","effortSlug":"deadlift","isStatic":true,"sourcePath":"markdown/canvas/guide/structure.md","createdAt":1792027033000},{"id":"guide/structure:seed:markdown/canvas/guide/structure.md:3:pushups","noteId":"guide/structure","blockId":"seed:markdown/canvas/guide/structure.md:3","blockContentId":"bc-9bba73a2","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/guide/structure.md","createdAt":1792027033000},{"id":"guide/structure:seed:markdown/canvas/guide/structure.md:4:run","noteId":"guide/structure","blockId":"seed:markdown/canvas/guide/structure.md:4","blockContentId":"bc-28a484de","effortSlug":"run","isStatic":true,"sourcePath":"markdown/canvas/guide/structure.md","createdAt":1792027033000},{"id":"guide/structure:seed:markdown/canvas/guide/structure.md:4:air-squats","noteId":"guide/structure","blockId":"seed:markdown/canvas/guide/structure.md:4","blockContentId":"bc-28a484de","effortSlug":"air-squats","isStatic":true,"sourcePath":"markdown/canvas/guide/structure.md","createdAt":1792027033000},{"id":"guide/structure:seed:markdown/canvas/guide/structure.md:4:back-squat","noteId":"guide/structure","blockId":"seed:markdown/canvas/guide/structure.md:4","blockContentId":"bc-28a484de","effortSlug":"back-squat","isStatic":true,"sourcePath":"markdown/canvas/guide/structure.md","createdAt":1792027033000},{"id":"guide/structure:seed:markdown/canvas/guide/structure.md:4:pullups","noteId":"guide/structure","blockId":"seed:markdown/canvas/guide/structure.md:4","blockContentId":"bc-28a484de","effortSlug":"pullups","isStatic":true,"sourcePath":"markdown/canvas/guide/structure.md","createdAt":1792027033000},{"id":"guide/structure:seed:markdown/canvas/guide/structure.md:4:pushups","noteId":"guide/structure","blockId":"seed:markdown/canvas/guide/structure.md:4","blockContentId":"bc-28a484de","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/guide/structure.md","createdAt":1792027033000},{"id":"guide/structure:seed:markdown/canvas/guide/structure.md:4:walk","noteId":"guide/structure","blockId":"seed:markdown/canvas/guide/structure.md:4","blockContentId":"bc-28a484de","effortSlug":"walk","isStatic":true,"sourcePath":"markdown/canvas/guide/structure.md","createdAt":1792027033000}]},{"path":"markdown/canvas/guide/wql.md","content":"---\nsearch: hidden\ntemplate: canvas\nroute: /guide/wql\ntype: guide\ntitle: \"Query Your Training (WQL)\"\n---\n\n# Query Your Training (WQL) {sticky dark full-bleed}\n\nWQL (Wod Query Language) queries your journal across two planes: numeric **facts** the clock recorded, and the markdown **content** those facts came from. The panel on the right is a live query sandbox: the ```query block renders real results, and editing the query line re-runs it as you type — switch presets with the tabs as each section loads them.\n\n```view\nname: sandbox\nstate: note\nsource: wql-presets/aggregate-by-week.md\nruntime: in-memory\nlaunch: host\nalign: right\nwidth: 50%\n```\n\n```query\nsum:totalVolume{discipline:strength} by {week} last 6w\n```\n\nThree surfaces use the same language: the **Library** (zero-syntax tri-state browsing), the **Explorer** (`/dashboards` workbench), and **in-note ```query blocks** — the one this chapter focuses on, which [dashboards](/guide/dashboards) compose.\n\n## The two planes {#planes}\n\n| Plane | Shape | Searches | Example |\n|---|---|---|---|\n| **Metrics** | `agg:metric{filters} by {dim}` | the fact store | `sum:totalVolume{} by {week}` |\n| **Content** | `:target{filters,source:scope}` | notes, blocks, efforts | `:note{effort:fran,source:journal} last 8w` |\n\n## Aggregate queries {#aggregate}\n\n```button\nlabel: Try it: Weekly volume\ntarget: sandbox\npipeline:\n - set-source: wql-presets/aggregate-by-week.md\n```\n\n```button\nlabel: Try it: By effort\ntarget: sandbox\npipeline:\n - set-source: wql-presets/aggregate-by-effort.md\n```\n\n```button\nlabel: Try it: TIS trend\ntarget: sandbox\npipeline:\n - set-source: wql-presets/tis-trend.md\n```\n\n```\n<aggregator>:<metric>{<filters>} by {<dimension>} last <window>\n```\n\n**Aggregators** — `sum`, `avg`, `min`, `max`, `count`, `last` (most recent value), `delta` (change across the window).\n\n**Metrics** — two tiers of stored facts, plus everything calculated:\n\n- Tier-2 aggregates: `totalVolume`, `totalReps`, `totalDistance`, `tis`, `sessionLoad`\n- Metric families: `reps`, `distance`, `resistance`, `elapsed`, `power`, `pace`\n- Calculated: the [`calc.*` list](/guide/metrics?h=calculated) (`calc.acwr`, `calc.e1rm`, `calc.readiness`, …)\n\n`avg:session-rpe{}` works too — [captured metrics](/guide/metrics?h=session-rpe) are facts like any other.\n\n```button\nlabel: Try it: Session RPE\ntarget: sandbox\npipeline:\n - set-source: wql-presets/session-rpe.md\n```\n\n**Dimensions** — time buckets `day`, `week`, `session`, `round`; metadata `effort`, `discipline`, `intensity`, `grade`; and any [custom property you authored](/guide/metrics?h=custom-metrics) (`by {coach}`).\n\n### Filters {#filters}\n\n```button\nlabel: Try it: Filter combos\ntarget: sandbox\npipeline:\n - set-source: wql-presets/filter-combos.md\n```\n\nInside the braces:\n\n| Filter | Meaning |\n|---|---|\n| `{effort:thruster}` | exact match |\n| `{!discipline:recovery}` | negation — exclude |\n| `{discipline:strength\\|gymnastics}` | OR |\n| `{text:fran}` | substring (content plane) |\n| `{intensity:high}` | intensity tier — one of `low`, `moderate`, `high` |\n| `{tags:benchmark}` | note tags |\n| `{coach:greg}` | your custom property |\n\n### Sources {#sources}\n\n```button\nlabel: Try it: source:journal\ntarget: sandbox\npipeline:\n - set-source: wql-presets/source-journal.md\n```\n\nThe `source:` filter names where content lives — plural values:\n\n`journal` (your notes) · `feeds` (catalog sessions) · `guides` · `playground` (plus `dashboards`, `efforts`)\n\nOmitting `source:` searches **all** of them — there is no `source:all` (the parser refuses it). Pin one catalog with an id: `catalog:crossfit-girls`. The old `source:collections` spelling is retired — the parser errors; write `feeds` (storage keeps `collection:`-prefixed sourceIds).\n\nJournal scope includes user-created clones whose `sourceId` points to the original note UUID or legacy `journal/YYYY-MM-DD` ID. That backlink does not turn a clone into imported content. Seeded guides, catalog notes, dashboards, efforts, and equipment remain excluded.\n\n### Windows {#windows}\n\nOne per query, at the end: relative — `last 7d`, `last 6w`, `last 12w` — or absolute — `from 2026-01-01 to 2026-03-31` (both dates included; drop `to …` to stay open). There is no `since:` keyword.\n\n### Grouping & rollups {#grouping-rollup}\n\n`by {week}` buckets; multiple dimensions group hierarchically — `by {intensity, week}`. Smooth weekly series with `.rollup(2w)` or `.rollup(4w)` (any multi-day/multi-week period; `.rollup(1w)` is refused — use `by {week}`).\n\n### Where joins {#joins}\n\n```button\nlabel: Try it: Where join\ntarget: sandbox\npipeline:\n - set-source: wql-presets/where-join.md\n```\n\nContent queries can require a numeric threshold computed over each result's linked workouts:\n\n```query\n:note{tags:pr,source:journal} last 8w where sum:totalVolume{} > 5000\n```\n\nKeep only journal notes tagged `pr` whose total volume exceeds 5,000 kg. Joins are supported on `:note` and `:block`; other targets report an advisory and ignore the clause. Joins lean on the **Block Content Id** — a content hash of each workout block, stable across reorders and preserved when you clone a catalog benchmark into your journal, so history aggregates across every note where that workout lives.\n\n## Content queries {#content}\n\n```button\nlabel: Try it: fran\ntarget: sandbox\npipeline:\n - set-source: wql-presets/content-fran.md\n```\n\n```query\n:block{text:fran,source:feeds}\n```\n\nTargets: `:note` (whole notes), `:block` (addressable fenced blocks), `:effort` (registry entries, filterable by `effort`, `discipline`, `intensity`, `origin`, `text`), plus the advanced `:session`, `:segment`, `:event` for recorded results and raw rows. Content-only keys (`type`, `text`, `has`, `source`, `catalog`) are category errors on aggregates.\n\nThe search palette's FIND mode matches note titles and bodies within its selected scope and time window. Type plain text or a quoted phrase such as `\"workout in the park\"`; clearing the text restores the scope. WQL mode retains diagnostics for malformed queries. Freeform CONTAINS rows have no count badge; the results total reports matches.\n\n### Presentation pipes {#pipes}\n\n```button\nlabel: Try it: limit 5\ntarget: sandbox\npipeline:\n - set-source: wql-presets/pipes-limit.md\n```\n\nContent queries can end with pipes — `| select … | order by … | limit … [offset …]`:\n\n```query\n:note{tags:pr,source:journal} last 8w | limit 5\n```\n\n`order by <column> [asc|desc]` sorts by a field of the result rows; `select` picks columns (with `in kg`/`in lb` units). Pipes ride on content queries — aggregates don't take them — and some targets ignore a pipe and say so via advisory (`:session` always orders by completion time; `| select` only reshapes `:segment` and `:event`).\n\n## Try it {#try-it}\n\n**Run** — after running the kettlebell note a few times this week ([First Workout](/guide/start?h=try-it)), edit the sandbox query above: change `by {week}` to `by {effort}`, or swap `{discipline:strength}` for `{!discipline:recovery}` — results re-run as you type. **Observe** — sample fallbacks are always badged and never written as your results; this chapter only reads what runs saved. For the interactive workbench, open the [Explorer on the dashboards page](/dashboards).\n\n```button\nlabel: Open the Explorer →\ntarget: preview\npipeline:\n - navigate: /dashboards\n```\n\n","blocks":{"seed:markdown/canvas/guide/wql.md:0":{"id":"seed:markdown/canvas/guide/wql.md:0","kind":"query","from":661,"to":728,"sourceRevision":1,"version":1},"seed:markdown/canvas/guide/wql.md:1":{"id":"seed:markdown/canvas/guide/wql.md:1","kind":"query","from":4751,"to":4832,"sourceRevision":1,"version":1},"seed:markdown/canvas/guide/wql.md:2":{"id":"seed:markdown/canvas/guide/wql.md:2","kind":"query","from":5382,"to":5425,"sourceRevision":1,"version":1},"seed:markdown/canvas/guide/wql.md:3":{"id":"seed:markdown/canvas/guide/wql.md:3","kind":"query","from":6351,"to":6411,"sourceRevision":1,"version":1}},"blockIndex":[{"id":"guide/wql:seed:markdown/canvas/guide/wql.md:0","noteId":"guide/wql","blockId":"seed:markdown/canvas/guide/wql.md:0","blockVersion":1,"sourceRevision":1,"from":661,"to":728,"position":0,"dataType":"query","rawContent":"```query\nsum:totalVolume{discipline:strength} by {week} last 6w\n```","noteTitle":"Wql","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/wql","sourcePath":"markdown/canvas/guide/wql.md","routeId":"guide/wql"},{"id":"guide/wql:seed:markdown/canvas/guide/wql.md:1","noteId":"guide/wql","blockId":"seed:markdown/canvas/guide/wql.md:1","blockVersion":1,"sourceRevision":1,"from":4751,"to":4832,"position":1,"dataType":"query","rawContent":"```query\n:note{tags:pr,source:journal} last 8w where sum:totalVolume{} > 5000\n```","noteTitle":"Wql","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/wql","sourcePath":"markdown/canvas/guide/wql.md","routeId":"guide/wql"},{"id":"guide/wql:seed:markdown/canvas/guide/wql.md:2","noteId":"guide/wql","blockId":"seed:markdown/canvas/guide/wql.md:2","blockVersion":1,"sourceRevision":1,"from":5382,"to":5425,"position":2,"dataType":"query","rawContent":"```query\n:block{text:fran,source:feeds}\n```","noteTitle":"Wql","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/wql","sourcePath":"markdown/canvas/guide/wql.md","routeId":"guide/wql"},{"id":"guide/wql:seed:markdown/canvas/guide/wql.md:3","noteId":"guide/wql","blockId":"seed:markdown/canvas/guide/wql.md:3","blockVersion":1,"sourceRevision":1,"from":6351,"to":6411,"position":3,"dataType":"query","rawContent":"```query\n:note{tags:pr,source:journal} last 8w | limit 5\n```","noteTitle":"Wql","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:guide/wql","sourcePath":"markdown/canvas/guide/wql.md","routeId":"guide/wql"}],"blockEfforts":[]},{"path":"markdown/canvas/home/README.md","content":"---\nsearch: hidden\ntemplate: canvas\nroute: /\ntype: home\n---\n```scroll\nrunway: 1300vh\nscreen: editor\ntypewriter: true\nstages:\n - id: editor-metrics\n range: [0.12, 0.24]\n screen: editor\n accent: hsl(var(--primary))\n label: Every Line Collects Metrics\n source: wods/examples/home/welcome-1.md\n caption: \"Every Line Collects Metrics. Reps, distance & load. Each line defines the metric types the runtime will collect: rep counts (15 Swings), distance (400m Run), load resistance (24kg, 225lb), and timed rest (*:30 Rest).\"\n ring:\n key: editor.wodBlock\n tag: Line Metrics\n - id: editor-run\n range: [0.24, 0.36]\n screen: editor\n accent: hsl(var(--primary))\n label: Press Run to Start\n source: wods/examples/home/welcome-1.md\n caption: \"Press Run to start the Clock. Scrolling through the tour never starts a workout. Use Next to advance and Stop to save your results.\"\n ring:\n key: editor.runButton\n tag: Run Button\n - id: timer-wallclock\n range: [0.36, 0.47]\n screen: timer\n accent: hsl(var(--primary))\n label: What Happens When It Runs\n source: wods/examples/home/welcome-1.md\n caption: \"What Happens When It Runs. The script becomes the clock. The Clock runs your exact script — stepping through reps, distance, and load lines at your own pace without forced countdown caps.\"\n ring:\n key: timer.floor\n tag: Clock\n - id: timer-next\n range: [0.47, 0.57]\n screen: timer\n accent: hsl(var(--primary))\n label: Advance Rounds with Next\n source: wods/examples/home/welcome-1.md\n caption: \"Next Advances the Workout. Every click locks a time. Click Next to advance to the next movement or round. Each click records elapsed time as a split. Stop or completion saves the results; the Metrics section shows them when you reach it.\"\n ring:\n key: timer.nextButton\n tag: Next Button\n - id: timer-cast\n range: [0.57, 0.65]\n screen: timer\n accent: hsl(var(--primary))\n label: Cast to the Big Screen\n source: wods/examples/home/welcome-1.md\n caption: \"Cast to the Big Screen. Real-time mirror for the gym floor. Stream the Clock to Chromecast or a shared screen — live rep counters and timers update in real time.\"\n ring:\n key: timer.castButton\n tag: Cast\n - id: wql-idea\n range: [0.65, 0.72]\n screen: analytics\n accent: hsl(var(--primary))\n label: Query what you just did\n caption: \"Query what you just did. Every result is one query away. WQL turns your journal into queryable facts — pick an aggregator and a metric, filter by tag, group by a dimension, roll up over time. The same elements drive every presentation in this window.\"\n ring:\n key: analytics.vocab\n tag: \"WQL elements\"\n - id: wql-table\n range: [0.72, 0.79]\n screen: analytics\n accent: hsl(var(--primary))\n label: Read it as a list\n caption: \"Read it as a list. One aggregator, one metric, one dimension: sum total reps grouped by effort becomes a ranked table the moment the workout is logged. The chips above the widget are the parsed query — the vocabulary, front and center.\"\n ring:\n key: analytics.table\n tag: Table list\n - id: wql-graphs\n range: [0.79, 0.86]\n screen: analytics\n accent: hsl(var(--primary))\n label: See it as trends\n caption: \"See it as trends. Roll the same facts up by week and they become a timeseries — is tonnage rising, is training polarized? A graph is not a feature you enable; it is a rollup away.\"\n ring:\n key: analytics.graphs\n tag: Graphs\n - id: wql-dashboard\n range: [0.86, 0.93]\n screen: analytics\n accent: hsl(var(--primary))\n label: Compose a dashboard\n caption: \"Compose a dashboard. A dashboard is just N queries on one screen. Mix values, lists, and graphs — each tile its own WQL statement, exactly like the DashboardView you get in the app.\"\n ring:\n key: analytics.dashboard\n tag: Dashboard\n - id: wql-live\n range: [0.93, 1.00]\n screen: analytics\n accent: hsl(var(--primary))\n label: It's your data\n caption: \"Explore labelled example data without adding workouts to your journal. Your recorded runs stay separate. Open Dashboards to query your own training.\"\n```\n\n```scroll:chapters\nrunway: 720vh\nscreen: editor\ntypewriter: true\nstages:\n - id: basics\n range: [0.0, 0.166]\n screen: editor\n source: wods/examples/syntax/single-movement.md\n caption: \"Basics. Statements and metrics — how a workout line reads, from rounds to reps.\"\n ring:\n tag: Basics example\n - id: protocols\n range: [0.166, 0.333]\n screen: editor\n source: wods/examples/syntax/timers-rest.md\n caption: \"Protocols. Countdowns, AMRAPs, EMOMs — the timing protocols that pace a workout.\"\n ring:\n tag: Protocols example\n - id: structure\n range: [0.333, 0.5]\n screen: editor\n source: wods/examples/syntax/groups-1.md\n caption: \"Structure. Rounds, groups, and nesting — how blocks compose a workout.\"\n ring:\n tag: Structure example\n - id: custom-metrics\n range: [0.5, 0.666]\n screen: editor\n source: wods/syntax/custom-metrics-1.md\n caption: \"Custom Metrics. Reps, loads, and custom metrics — what gets tracked per movement.\"\n ring:\n tag: Custom Metrics example\n - id: dialects\n range: [0.666, 0.833]\n screen: editor\n source: wods/examples/syntax/dialect-climb-bouldering.md\n caption: \"Dialects. Run, climb, strength — dialect tags that specialize a block.\"\n ring:\n tag: Dialects example\n - id: complex\n range: [0.833, 1.0]\n screen: editor\n source: wods/examples/syntax/complex-swimming.md\n caption: \"Complex Workouts. Multi-set swimming intervals with rest recovery.\"\n ring:\n tag: Complex example\n```\n\n\n```chapter\nid: home-tour\ntitle: Take the Tour\nbadge: play\nquests: qs-arrive, qs-edit, qs-run, qs-tour-timer, qs-tour-analytics\nsections: []\n```\n\n```chapter\nid: basics\ntitle: Basics\nbadge: trophy\nquests: basics-run, basics-movement, basics-reps, basics-load\nsections: []\n```\n\n```chapter\nid: protocols\ntitle: Protocols\nbadge: timer\nquests: protocols-run, protocols-timer, protocols-rounds, protocols-tag\nsections: []\n```\n\n```chapter\nid: structure\ntitle: Structure\nbadge: blocks\nquests: structure-run, structure-rounds, structure-repscheme\nsections: []\n```\n\n```chapter\nid: custom-metrics\ntitle: Custom Metrics\nbadge: activity\nquests: custom-metrics-run, metrics-custom, metrics-calc\nsections: []\n```\n\n```chapter\nid: dialects\ntitle: Dialects\nbadge: file-text\nquests: dialects-run, dialects-log, dialects-climb\nsections: []\n```\n\n```chapter\nid: complex\ntitle: Complex Workouts\nbadge: puzzle\nquests: complex-run, complex-time, complex-rounds\nsections: []\n```\n\n```quest\nid: qs-arrive\nlabel: Welcome to WOD Wiki\ndesc: You landed on the playground dashboard.\n```\n\n```quest\nid: qs-tour-timer\nlabel: See the timer run it\ndesc: Let the demo timer reach a running state in the Clock stage.\nvalidation:\n type: run-started\n```\n\n```quest\nid: qs-tour-analytics\nlabel: Review the session\ndesc: Scroll through the analytics stage of the home tour.\n```\n\n```quest\nid: qs-edit\nlabel: Change the workout\ndesc: Make any edit to the demo script.\n```\n\n```quest\nid: qs-run\nlabel: Run it to the finish\ndesc: Press Run and let the workout complete.\nvalidation:\n type: workout-complete\n```\n\n```quest\nid: basics-run\nlabel: Run the First Example\nvalidation:\n type: run-started\n```\n\n```quest\nid: protocols-run\nlabel: Run the First Example\nvalidation:\n type: run-started\n```\n\n```quest\nid: structure-run\nlabel: Run the First Example\nvalidation:\n type: run-started\n```\n\n```quest\nid: custom-metrics-run\nlabel: Run the First Example\nvalidation:\n type: run-started\n```\n\n```quest\nid: dialects-run\nlabel: Run the First Example\nvalidation:\n type: run-started\n```\n\n```quest\nid: complex-run\nlabel: Run the First Example\nvalidation:\n type: run-started\n```\n","blocks":{},"blockIndex":[],"blockEfforts":[]},{"path":"markdown/canvas/home/sample-script.md","content":"# Edit Me: Morning Strength\n\nChange the reps, movements, or rest below and see the workout update live.\n\n```time\n(3)\n 10 Kettlebell Swings 24kg\n *:30 Rest\n```","blocks":{"seed:markdown/canvas/home/sample-script.md:0":{"id":"seed:markdown/canvas/home/sample-script.md:0","kind":"wod","from":105,"to":160,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/home/sample-script.md:seed:markdown/canvas/home/sample-script.md:0","noteId":"markdown/canvas/home/sample-script.md","blockId":"seed:markdown/canvas/home/sample-script.md:0","blockVersion":1,"sourceRevision":1,"from":105,"to":160,"position":0,"dataType":"wod","blockContentId":"bc-86bf9888","rawContent":"```time\n(3)\n 10 Kettlebell Swings 24kg\n *:30 Rest\n```","noteTitle":"Sample Script","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:home/sample-script","sourcePath":"markdown/canvas/home/sample-script.md"}],"blockEfforts":[{"id":"markdown/canvas/home/sample-script.md:seed:markdown/canvas/home/sample-script.md:0:kettlebell-swings","noteId":"markdown/canvas/home/sample-script.md","blockId":"seed:markdown/canvas/home/sample-script.md:0","blockContentId":"bc-86bf9888","effortSlug":"kettlebell-swings","isStatic":true,"sourcePath":"markdown/canvas/home/sample-script.md","createdAt":1792027033000}]},{"path":"markdown/canvas/home/welcome-1.md","content":"---\nsearch: hidden\ntitle: \"Welcome\"\nsubtitle: \"Edit this, then hit Run\"\nsection: home\norder: 1\n---\nEdit the reps below, change the time, add extra instructions then press **Run**. Use **Next** to advance and **Stop** to save your results.\n\n```time\n// click start [:start]\n0:03 Count Down\n10 Pushups\n```","blocks":{"seed:markdown/canvas/home/welcome-1.md:0":{"id":"seed:markdown/canvas/home/welcome-1.md:0","kind":"wod","from":240,"to":302,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/home/welcome-1.md:seed:markdown/canvas/home/welcome-1.md:0","noteId":"markdown/canvas/home/welcome-1.md","blockId":"seed:markdown/canvas/home/welcome-1.md:0","blockVersion":1,"sourceRevision":1,"from":240,"to":302,"position":0,"dataType":"wod","blockContentId":"bc-522e280e","rawContent":"```time\n// click start [:start]\n0:03 Count Down\n10 Pushups\n```","noteTitle":"Welcome 1","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:home/welcome-1","sourcePath":"markdown/canvas/home/welcome-1.md"}],"blockEfforts":[{"id":"markdown/canvas/home/welcome-1.md:seed:markdown/canvas/home/welcome-1.md:0:pushups","noteId":"markdown/canvas/home/welcome-1.md","blockId":"seed:markdown/canvas/home/welcome-1.md:0","blockContentId":"bc-522e280e","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/home/welcome-1.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/actions-comments.md","content":"---\nsearch: hidden\ntitle: \"Actions & Comments\"\nsubtitle: \"Use (parentheses) for actions and // for notes\"\nsection: basics\norder: 5\n---\n```time\n(Setup Barbell)\n5 Back Squat ?lb\n// Add weight each set\n```\n","blocks":{"seed:markdown/canvas/syntax/actions-comments.md:0":{"id":"seed:markdown/canvas/syntax/actions-comments.md:0","kind":"wod","from":135,"to":202,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/actions-comments.md:seed:markdown/canvas/syntax/actions-comments.md:0","noteId":"markdown/canvas/syntax/actions-comments.md","blockId":"seed:markdown/canvas/syntax/actions-comments.md:0","blockVersion":1,"sourceRevision":1,"from":135,"to":202,"position":0,"dataType":"wod","blockContentId":"bc-d7cb4396","rawContent":"```time\n(Setup Barbell)\n5 Back Squat ?lb\n// Add weight each set\n```","noteTitle":"Actions Comments","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/actions-comments","sourcePath":"markdown/canvas/syntax/actions-comments.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/actions-comments.md:seed:markdown/canvas/syntax/actions-comments.md:0:back-squat","noteId":"markdown/canvas/syntax/actions-comments.md","blockId":"seed:markdown/canvas/syntax/actions-comments.md:0","blockContentId":"bc-d7cb4396","effortSlug":"back-squat","isStatic":true,"sourcePath":"markdown/canvas/syntax/actions-comments.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/alternating-emom.md","content":"---\nsearch: hidden\ntitle: \"Alternating EMOM\"\nsubtitle: \"Separate branches let the interval rotate between tasks\"\nsection: protocols\norder: 11\n---\n```time\n(6) :60 EMOM\n - 5 Pullups\n - 8 Pushups\n```\n","blocks":{"seed:markdown/canvas/syntax/alternating-emom.md:0":{"id":"seed:markdown/canvas/syntax/alternating-emom.md:0","kind":"wod","from":146,"to":198,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/alternating-emom.md:seed:markdown/canvas/syntax/alternating-emom.md:0","noteId":"markdown/canvas/syntax/alternating-emom.md","blockId":"seed:markdown/canvas/syntax/alternating-emom.md:0","blockVersion":1,"sourceRevision":1,"from":146,"to":198,"position":0,"dataType":"wod","blockContentId":"bc-4108183a","rawContent":"```time\n(6) :60 EMOM\n - 5 Pullups\n - 8 Pushups\n```","noteTitle":"Alternating Emom","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/alternating-emom","sourcePath":"markdown/canvas/syntax/alternating-emom.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/alternating-emom.md:seed:markdown/canvas/syntax/alternating-emom.md:0:pullups","noteId":"markdown/canvas/syntax/alternating-emom.md","blockId":"seed:markdown/canvas/syntax/alternating-emom.md:0","blockContentId":"bc-4108183a","effortSlug":"pullups","isStatic":true,"sourcePath":"markdown/canvas/syntax/alternating-emom.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/alternating-emom.md:seed:markdown/canvas/syntax/alternating-emom.md:0:pushups","noteId":"markdown/canvas/syntax/alternating-emom.md","blockId":"seed:markdown/canvas/syntax/alternating-emom.md:0","blockContentId":"bc-4108183a","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/syntax/alternating-emom.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/basic-emom.md","content":"---\nsearch: hidden\ntitle: \"Basic EMOM\"\nsubtitle: \"Rounds plus an interval timer define the minute windows\"\nsection: protocols\norder: 9\n---\n```time\n(10) :60 EMOM\n 3 Clean & Jerk 135lb\n```\n","blocks":{"seed:markdown/canvas/syntax/basic-emom.md:0":{"id":"seed:markdown/canvas/syntax/basic-emom.md:0","kind":"wod","from":139,"to":187,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/basic-emom.md:seed:markdown/canvas/syntax/basic-emom.md:0","noteId":"markdown/canvas/syntax/basic-emom.md","blockId":"seed:markdown/canvas/syntax/basic-emom.md:0","blockVersion":1,"sourceRevision":1,"from":139,"to":187,"position":0,"dataType":"wod","blockContentId":"bc-0797e064","rawContent":"```time\n(10) :60 EMOM\n 3 Clean & Jerk 135lb\n```","noteTitle":"Basic Emom","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/basic-emom","sourcePath":"markdown/canvas/syntax/basic-emom.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/basic-emom.md:seed:markdown/canvas/syntax/basic-emom.md:0:clean-jerk","noteId":"markdown/canvas/syntax/basic-emom.md","blockId":"seed:markdown/canvas/syntax/basic-emom.md:0","blockContentId":"bc-0797e064","effortSlug":"clean-jerk","isStatic":true,"sourcePath":"markdown/canvas/syntax/basic-emom.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/calculated-metrics.md","content":"---\nsearch: hidden\ntitle: \"Calculated Metrics\"\nsubtitle: \"Document-level formulas derive summary values\"\nsection: document\norder: 6\n---\n\n# Tuesday — Pull Day\n\n```time\nrpe: 8\n(5 Sets)\n 5 Deadlifts 225lb\n 5 Deadlifts ?lb\n```\n\n```calculate\ntotalLoad = sum(reps * weight)\navgRPE = mean(rpe)\nsetCount = count(reps)\n```\n\nThe unknown load on the second deadlift set is skipped by the calculator, so the derived total only uses rows with complete inputs.\n","blocks":{"seed:markdown/canvas/syntax/calculated-metrics.md:0":{"id":"seed:markdown/canvas/syntax/calculated-metrics.md:0","kind":"wod","from":159,"to":224,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/calculated-metrics.md:seed:markdown/canvas/syntax/calculated-metrics.md:0","noteId":"markdown/canvas/syntax/calculated-metrics.md","blockId":"seed:markdown/canvas/syntax/calculated-metrics.md:0","blockVersion":1,"sourceRevision":1,"from":159,"to":224,"position":0,"dataType":"wod","blockContentId":"bc-63335a73","rawContent":"```time\nrpe: 8\n(5 Sets)\n 5 Deadlifts 225lb\n 5 Deadlifts ?lb\n```","noteTitle":"Calculated Metrics","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/calculated-metrics","sourcePath":"markdown/canvas/syntax/calculated-metrics.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/calculated-metrics.md:seed:markdown/canvas/syntax/calculated-metrics.md:0:deadlifts","noteId":"markdown/canvas/syntax/calculated-metrics.md","blockId":"seed:markdown/canvas/syntax/calculated-metrics.md:0","blockContentId":"bc-63335a73","effortSlug":"deadlifts","isStatic":true,"sourcePath":"markdown/canvas/syntax/calculated-metrics.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/classic-amrap.md","content":"---\nsearch: hidden\ntitle: \"Classic AMRAP\"\nsubtitle: \"A fixed time window with unbounded rounds\"\nsection: protocols\norder: 6\n---\n```time\n20:00 AMRAP\n 5 Pullups\n 10 Pushups\n 15 Air Squats\n```\n","blocks":{"seed:markdown/canvas/syntax/classic-amrap.md:0":{"id":"seed:markdown/canvas/syntax/classic-amrap.md:0","kind":"wod","from":128,"to":192,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/classic-amrap.md:seed:markdown/canvas/syntax/classic-amrap.md:0","noteId":"markdown/canvas/syntax/classic-amrap.md","blockId":"seed:markdown/canvas/syntax/classic-amrap.md:0","blockVersion":1,"sourceRevision":1,"from":128,"to":192,"position":0,"dataType":"wod","blockContentId":"bc-a8ec9216","rawContent":"```time\n20:00 AMRAP\n 5 Pullups\n 10 Pushups\n 15 Air Squats\n```","noteTitle":"Classic Amrap","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/classic-amrap","sourcePath":"markdown/canvas/syntax/classic-amrap.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/classic-amrap.md:seed:markdown/canvas/syntax/classic-amrap.md:0:pullups","noteId":"markdown/canvas/syntax/classic-amrap.md","blockId":"seed:markdown/canvas/syntax/classic-amrap.md:0","blockContentId":"bc-a8ec9216","effortSlug":"pullups","isStatic":true,"sourcePath":"markdown/canvas/syntax/classic-amrap.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/classic-amrap.md:seed:markdown/canvas/syntax/classic-amrap.md:0:pushups","noteId":"markdown/canvas/syntax/classic-amrap.md","blockId":"seed:markdown/canvas/syntax/classic-amrap.md:0","blockContentId":"bc-a8ec9216","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/syntax/classic-amrap.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/classic-amrap.md:seed:markdown/canvas/syntax/classic-amrap.md:0:air-squats","noteId":"markdown/canvas/syntax/classic-amrap.md","blockId":"seed:markdown/canvas/syntax/classic-amrap.md:0","blockContentId":"bc-a8ec9216","effortSlug":"air-squats","isStatic":true,"sourcePath":"markdown/canvas/syntax/classic-amrap.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/complex-barbell-cycling.md","content":"---\nsearch: hidden\ntitle: \"Barbell Cycling\"\nsubtitle: \"Back-to-back EMOM windows with plate-change actions\"\nsection: complex\norder: 7\n---\n```time\n(5) :60 EMOM\n 3 Power Clean 135lb\n\n(Change Plates)\n\n(5) :60 EMOM\n 2 Power Clean 155lb\n```\n","blocks":{"seed:markdown/canvas/syntax/complex-barbell-cycling.md:0":{"id":"seed:markdown/canvas/syntax/complex-barbell-cycling.md:0","kind":"wod","from":138,"to":237,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/complex-barbell-cycling.md:seed:markdown/canvas/syntax/complex-barbell-cycling.md:0","noteId":"markdown/canvas/syntax/complex-barbell-cycling.md","blockId":"seed:markdown/canvas/syntax/complex-barbell-cycling.md:0","blockVersion":1,"sourceRevision":1,"from":138,"to":237,"position":0,"dataType":"wod","blockContentId":"bc-720fc8b6","rawContent":"```time\n(5) :60 EMOM\n 3 Power Clean 135lb\n\n(Change Plates)\n\n(5) :60 EMOM\n 2 Power Clean 155lb\n```","noteTitle":"Complex Barbell Cycling","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/complex-barbell-cycling","sourcePath":"markdown/canvas/syntax/complex-barbell-cycling.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/complex-barbell-cycling.md:seed:markdown/canvas/syntax/complex-barbell-cycling.md:0:power-clean","noteId":"markdown/canvas/syntax/complex-barbell-cycling.md","blockId":"seed:markdown/canvas/syntax/complex-barbell-cycling.md:0","blockContentId":"bc-720fc8b6","effortSlug":"power-clean","isStatic":true,"sourcePath":"markdown/canvas/syntax/complex-barbell-cycling.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/complex-full-session.md","content":"---\nsearch: hidden\ntitle: \"Full Training Session\"\nsubtitle: \"A complete note with warmup, strength, conditioning, and cooldown\"\nsection: complex\norder: 6\n---\n# Thursday Session\n\n```time\n// Warmup\n 400m Run\n 10 Air Squats\n\n// Strength\n (5 Sets)\n 3 Back Squat 225lb\n *2:00 Rest\n\n// Conditioning\n 10:00 AMRAP\n 5 Pullups\n 10 Pushups\n\n// Cool-down\n 5:00 Walk\n```\n","blocks":{"seed:markdown/canvas/syntax/complex-full-session.md:0":{"id":"seed:markdown/canvas/syntax/complex-full-session.md:0","kind":"wod","from":178,"to":374,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/complex-full-session.md:seed:markdown/canvas/syntax/complex-full-session.md:0","noteId":"markdown/canvas/syntax/complex-full-session.md","blockId":"seed:markdown/canvas/syntax/complex-full-session.md:0","blockVersion":1,"sourceRevision":1,"from":178,"to":374,"position":0,"dataType":"wod","blockContentId":"bc-28a484de","rawContent":"```time\n// Warmup\n 400m Run\n 10 Air Squats\n\n// Strength\n (5 Sets)\n 3 Back Squat 225lb\n *2:00 Rest\n\n// Conditioning\n 10:00 AMRAP\n 5 Pullups\n 10 Pushups\n\n// Cool-down\n 5:00 Walk\n```","noteTitle":"Complex Full Session","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/complex-full-session","sourcePath":"markdown/canvas/syntax/complex-full-session.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/complex-full-session.md:seed:markdown/canvas/syntax/complex-full-session.md:0:run","noteId":"markdown/canvas/syntax/complex-full-session.md","blockId":"seed:markdown/canvas/syntax/complex-full-session.md:0","blockContentId":"bc-28a484de","effortSlug":"run","isStatic":true,"sourcePath":"markdown/canvas/syntax/complex-full-session.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/complex-full-session.md:seed:markdown/canvas/syntax/complex-full-session.md:0:air-squats","noteId":"markdown/canvas/syntax/complex-full-session.md","blockId":"seed:markdown/canvas/syntax/complex-full-session.md:0","blockContentId":"bc-28a484de","effortSlug":"air-squats","isStatic":true,"sourcePath":"markdown/canvas/syntax/complex-full-session.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/complex-full-session.md:seed:markdown/canvas/syntax/complex-full-session.md:0:back-squat","noteId":"markdown/canvas/syntax/complex-full-session.md","blockId":"seed:markdown/canvas/syntax/complex-full-session.md:0","blockContentId":"bc-28a484de","effortSlug":"back-squat","isStatic":true,"sourcePath":"markdown/canvas/syntax/complex-full-session.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/complex-full-session.md:seed:markdown/canvas/syntax/complex-full-session.md:0:pullups","noteId":"markdown/canvas/syntax/complex-full-session.md","blockId":"seed:markdown/canvas/syntax/complex-full-session.md:0","blockContentId":"bc-28a484de","effortSlug":"pullups","isStatic":true,"sourcePath":"markdown/canvas/syntax/complex-full-session.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/complex-full-session.md:seed:markdown/canvas/syntax/complex-full-session.md:0:pushups","noteId":"markdown/canvas/syntax/complex-full-session.md","blockId":"seed:markdown/canvas/syntax/complex-full-session.md:0","blockContentId":"bc-28a484de","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/syntax/complex-full-session.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/complex-full-session.md:seed:markdown/canvas/syntax/complex-full-session.md:0:walk","noteId":"markdown/canvas/syntax/complex-full-session.md","blockId":"seed:markdown/canvas/syntax/complex-full-session.md:0","blockContentId":"bc-28a484de","effortSlug":"walk","isStatic":true,"sourcePath":"markdown/canvas/syntax/complex-full-session.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/complex-nested-protocols.md","content":"---\nsearch: hidden\ntitle: \"Nested Protocols\"\nsubtitle: \"Rounds can wrap a protocol block and a strength block\"\nsection: complex\norder: 5\n---\n```time\n(3)\n 5:00 AMRAP\n 5 Pullups\n 10 Pushups\n// Strength\n 3 Back Squat 225lb\n *2:00 Rest\n```\n","blocks":{"seed:markdown/canvas/syntax/complex-nested-protocols.md:0":{"id":"seed:markdown/canvas/syntax/complex-nested-protocols.md:0","kind":"wod","from":141,"to":244,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/complex-nested-protocols.md:seed:markdown/canvas/syntax/complex-nested-protocols.md:0","noteId":"markdown/canvas/syntax/complex-nested-protocols.md","blockId":"seed:markdown/canvas/syntax/complex-nested-protocols.md:0","blockVersion":1,"sourceRevision":1,"from":141,"to":244,"position":0,"dataType":"wod","blockContentId":"bc-4c58ae00","rawContent":"```time\n(3)\n 5:00 AMRAP\n 5 Pullups\n 10 Pushups\n// Strength\n 3 Back Squat 225lb\n *2:00 Rest\n```","noteTitle":"Complex Nested Protocols","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/complex-nested-protocols","sourcePath":"markdown/canvas/syntax/complex-nested-protocols.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/complex-nested-protocols.md:seed:markdown/canvas/syntax/complex-nested-protocols.md:0:pullups","noteId":"markdown/canvas/syntax/complex-nested-protocols.md","blockId":"seed:markdown/canvas/syntax/complex-nested-protocols.md:0","blockContentId":"bc-4c58ae00","effortSlug":"pullups","isStatic":true,"sourcePath":"markdown/canvas/syntax/complex-nested-protocols.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/complex-nested-protocols.md:seed:markdown/canvas/syntax/complex-nested-protocols.md:0:pushups","noteId":"markdown/canvas/syntax/complex-nested-protocols.md","blockId":"seed:markdown/canvas/syntax/complex-nested-protocols.md:0","blockContentId":"bc-4c58ae00","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/syntax/complex-nested-protocols.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/complex-nested-protocols.md:seed:markdown/canvas/syntax/complex-nested-protocols.md:0:back-squat","noteId":"markdown/canvas/syntax/complex-nested-protocols.md","blockId":"seed:markdown/canvas/syntax/complex-nested-protocols.md:0","blockContentId":"bc-4c58ae00","effortSlug":"back-squat","isStatic":true,"sourcePath":"markdown/canvas/syntax/complex-nested-protocols.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/complex-partner-workout.md","content":"---\nsearch: hidden\ntitle: \"Partner Workout\"\nsubtitle: \"Separate named windows keep each partner's work distinct\"\nsection: complex\norder: 8\n---\n# Partner Intervals\n\n```time\n// Partner A\n 5:00 AMRAP\n 5 Pullups\n 10 Pushups\n\n// Partner B\n 5:00 AMRAP\n 10 Air Squats\n 8 Burpees\n```\n","blocks":{"seed:markdown/canvas/syntax/complex-partner-workout.md:0":{"id":"seed:markdown/canvas/syntax/complex-partner-workout.md:0","kind":"wod","from":164,"to":289,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/complex-partner-workout.md:seed:markdown/canvas/syntax/complex-partner-workout.md:0","noteId":"markdown/canvas/syntax/complex-partner-workout.md","blockId":"seed:markdown/canvas/syntax/complex-partner-workout.md:0","blockVersion":1,"sourceRevision":1,"from":164,"to":289,"position":0,"dataType":"wod","blockContentId":"bc-8c7b43c3","rawContent":"```time\n// Partner A\n 5:00 AMRAP\n 5 Pullups\n 10 Pushups\n\n// Partner B\n 5:00 AMRAP\n 10 Air Squats\n 8 Burpees\n```","noteTitle":"Complex Partner Workout","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/complex-partner-workout","sourcePath":"markdown/canvas/syntax/complex-partner-workout.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/complex-partner-workout.md:seed:markdown/canvas/syntax/complex-partner-workout.md:0:pullups","noteId":"markdown/canvas/syntax/complex-partner-workout.md","blockId":"seed:markdown/canvas/syntax/complex-partner-workout.md:0","blockContentId":"bc-8c7b43c3","effortSlug":"pullups","isStatic":true,"sourcePath":"markdown/canvas/syntax/complex-partner-workout.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/complex-partner-workout.md:seed:markdown/canvas/syntax/complex-partner-workout.md:0:pushups","noteId":"markdown/canvas/syntax/complex-partner-workout.md","blockId":"seed:markdown/canvas/syntax/complex-partner-workout.md:0","blockContentId":"bc-8c7b43c3","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/syntax/complex-partner-workout.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/complex-partner-workout.md:seed:markdown/canvas/syntax/complex-partner-workout.md:0:air-squats","noteId":"markdown/canvas/syntax/complex-partner-workout.md","blockId":"seed:markdown/canvas/syntax/complex-partner-workout.md:0","blockContentId":"bc-8c7b43c3","effortSlug":"air-squats","isStatic":true,"sourcePath":"markdown/canvas/syntax/complex-partner-workout.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/complex-partner-workout.md:seed:markdown/canvas/syntax/complex-partner-workout.md:0:burpees","noteId":"markdown/canvas/syntax/complex-partner-workout.md","blockId":"seed:markdown/canvas/syntax/complex-partner-workout.md:0","blockContentId":"bc-8c7b43c3","effortSlug":"burpees","isStatic":true,"sourcePath":"markdown/canvas/syntax/complex-partner-workout.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/complex-swimming.md","content":"---\nsearch: hidden\ntitle: \"Swimming Intervals\"\nsubtitle: \"Multi-set swimming intervals with rest recovery\"\nsection: complex\norder: 5\ndomain: swimming\n---\n```time\n(4) Power Sprints\n 25m Freestyle Sprint\n 1:30 Rest\n\n(6) IM Main Set\n 100m IM\n :45 Rest\n\n150m Cooldown\n```\n","blocks":{"seed:markdown/canvas/syntax/complex-swimming.md:0":{"id":"seed:markdown/canvas/syntax/complex-swimming.md:0","kind":"wod","from":154,"to":271,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/complex-swimming.md:seed:markdown/canvas/syntax/complex-swimming.md:0","noteId":"markdown/canvas/syntax/complex-swimming.md","blockId":"seed:markdown/canvas/syntax/complex-swimming.md:0","blockVersion":1,"sourceRevision":1,"from":154,"to":271,"position":0,"dataType":"wod","blockContentId":"bc-37778bd2","rawContent":"```time\n(4) Power Sprints\n 25m Freestyle Sprint\n 1:30 Rest\n\n(6) IM Main Set\n 100m IM\n :45 Rest\n\n150m Cooldown\n```","noteTitle":"Complex Swimming","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/complex-swimming","sourcePath":"markdown/canvas/syntax/complex-swimming.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/complex-swimming.md:seed:markdown/canvas/syntax/complex-swimming.md:0:power-sprints","noteId":"markdown/canvas/syntax/complex-swimming.md","blockId":"seed:markdown/canvas/syntax/complex-swimming.md:0","blockContentId":"bc-37778bd2","effortSlug":"power-sprints","isStatic":true,"sourcePath":"markdown/canvas/syntax/complex-swimming.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/complex-swimming.md:seed:markdown/canvas/syntax/complex-swimming.md:0:freestyle-sprint","noteId":"markdown/canvas/syntax/complex-swimming.md","blockId":"seed:markdown/canvas/syntax/complex-swimming.md:0","blockContentId":"bc-37778bd2","effortSlug":"freestyle-sprint","isStatic":true,"sourcePath":"markdown/canvas/syntax/complex-swimming.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/complex-swimming.md:seed:markdown/canvas/syntax/complex-swimming.md:0:im-main-set","noteId":"markdown/canvas/syntax/complex-swimming.md","blockId":"seed:markdown/canvas/syntax/complex-swimming.md:0","blockContentId":"bc-37778bd2","effortSlug":"im-main-set","isStatic":true,"sourcePath":"markdown/canvas/syntax/complex-swimming.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/complex-swimming.md:seed:markdown/canvas/syntax/complex-swimming.md:0:im","noteId":"markdown/canvas/syntax/complex-swimming.md","blockId":"seed:markdown/canvas/syntax/complex-swimming.md:0","blockContentId":"bc-37778bd2","effortSlug":"im","isStatic":true,"sourcePath":"markdown/canvas/syntax/complex-swimming.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/core-rules.md","content":"---\nsearch: hidden\ntitle: \"Core Rules\"\nsubtitle: \"Fence, one statement per line, indent to nest\"\nsection: basics\norder: 1\n---\n```time\n(3)\n 10 Pushups\n 15 Air Squats\n```\n","blocks":{"seed:markdown/canvas/syntax/core-rules.md:0":{"id":"seed:markdown/canvas/syntax/core-rules.md:0","kind":"wod","from":126,"to":170,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/core-rules.md:seed:markdown/canvas/syntax/core-rules.md:0","noteId":"markdown/canvas/syntax/core-rules.md","blockId":"seed:markdown/canvas/syntax/core-rules.md:0","blockVersion":1,"sourceRevision":1,"from":126,"to":170,"position":0,"dataType":"wod","blockContentId":"bc-36c6b543","rawContent":"```time\n(3)\n 10 Pushups\n 15 Air Squats\n```","noteTitle":"Core Rules","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/core-rules","sourcePath":"markdown/canvas/syntax/core-rules.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/core-rules.md:seed:markdown/canvas/syntax/core-rules.md:0:pushups","noteId":"markdown/canvas/syntax/core-rules.md","blockId":"seed:markdown/canvas/syntax/core-rules.md:0","blockContentId":"bc-36c6b543","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/syntax/core-rules.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/core-rules.md:seed:markdown/canvas/syntax/core-rules.md:0:air-squats","noteId":"markdown/canvas/syntax/core-rules.md","blockId":"seed:markdown/canvas/syntax/core-rules.md:0","blockContentId":"bc-36c6b543","effortSlug":"air-squats","isStatic":true,"sourcePath":"markdown/canvas/syntax/core-rules.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/custom-and-calculated-metrics.md","content":"---\nsearch: hidden\ntitle: \"Custom & Calculated Metrics\"\nsubtitle: \"Property statements become metrics; calculate blocks derive summaries\"\nsection: advanced\norder: 5\n---\n\nCustom metrics let you attach line-local metadata without inventing new syntax for every field.\nCalculated metrics let you derive summary values from the workout after the parser has collected the raw statements.\n\n## Custom metric statements\n\nA property line is a top-level statement in the form `key: value`.\nIt accepts scalar values only:\n\n- numbers\n- bare identifiers\n- quoted strings\n\nKnown keys map to canonical metric types:\n\n- `rpe` → session RPE\n- `rir` → reps in reserve\n- `intensity` → intensity\n- `load` → load\n- `volume` → volume\n- `work` → work\n\nAny other key stays visible as a custom metric.\nThat includes coach-specific fields like `location`, `surface`, or `note`.\n\n```time\nrpe: 8\nlocation: \"Garage\"\nsurface: indoor\n(5 Sets)\n 5 Deadlifts 225lb\n *2:00 Rest\n```\n\nNotes:\n\n- property lines are statement-local, not nested under child lines\n- nested objects and arrays are not part of v1\n- custom metrics stay visible even when there is no canonical mapping\n\n## Calculated metrics\n\nA `calculate` block is document-level, not nested inside `wod`.\nEach line uses the shape `target = expression`.\nSupported functions are:\n\n- `sum`\n- `mean`\n- `max`\n- `min`\n- `count`\n\nSupported operators are `+`, `-`, `*`, `/`, `^`, and parentheses.\n\n```time\nrpe: 8\n(5 Sets)\n 5 Deadlifts 225lb\n 5 Deadlifts ?lb\n```\n\n```calculate\ntotalLoad = sum(reps * weight)\navgRPE = mean(rpe)\nsetCount = count(reps)\n```\n\nNotes:\n\n- rows with missing inputs are skipped for that calculation\n- if a definition cannot resolve to a finite number, it is omitted\n- calculations can reference numeric custom metrics and mapped properties\n- cross-workout aggregation is out of scope for this v1 syntax\n\n## Example fixtures\n\n- [Custom Metrics Example](/guide/metrics?h=custom-metrics)\n- [Calculated Metrics Example](./calculated-metrics.md)\n- [Core Syntax](../../../docs/language/syntax-reference.md)\n","blocks":{"seed:markdown/canvas/syntax/custom-and-calculated-metrics.md:0":{"id":"seed:markdown/canvas/syntax/custom-and-calculated-metrics.md:0","kind":"wod","from":853,"to":948,"sourceRevision":1,"version":1,"dialect":"time"},"seed:markdown/canvas/syntax/custom-and-calculated-metrics.md:1":{"id":"seed:markdown/canvas/syntax/custom-and-calculated-metrics.md:1","kind":"wod","from":1415,"to":1480,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/custom-and-calculated-metrics.md:seed:markdown/canvas/syntax/custom-and-calculated-metrics.md:0","noteId":"markdown/canvas/syntax/custom-and-calculated-metrics.md","blockId":"seed:markdown/canvas/syntax/custom-and-calculated-metrics.md:0","blockVersion":1,"sourceRevision":1,"from":853,"to":948,"position":0,"dataType":"wod","blockContentId":"bc-03b21bf9","rawContent":"```time\nrpe: 8\nlocation: \"Garage\"\nsurface: indoor\n(5 Sets)\n 5 Deadlifts 225lb\n *2:00 Rest\n```","noteTitle":"Custom and Calculated Metrics","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/custom-and-calculated-metrics","sourcePath":"markdown/canvas/syntax/custom-and-calculated-metrics.md"},{"id":"markdown/canvas/syntax/custom-and-calculated-metrics.md:seed:markdown/canvas/syntax/custom-and-calculated-metrics.md:1","noteId":"markdown/canvas/syntax/custom-and-calculated-metrics.md","blockId":"seed:markdown/canvas/syntax/custom-and-calculated-metrics.md:1","blockVersion":1,"sourceRevision":1,"from":1415,"to":1480,"position":1,"dataType":"wod","blockContentId":"bc-63335a73","rawContent":"```time\nrpe: 8\n(5 Sets)\n 5 Deadlifts 225lb\n 5 Deadlifts ?lb\n```","noteTitle":"Custom and Calculated Metrics","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/custom-and-calculated-metrics","sourcePath":"markdown/canvas/syntax/custom-and-calculated-metrics.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/custom-and-calculated-metrics.md:seed:markdown/canvas/syntax/custom-and-calculated-metrics.md:0:deadlifts","noteId":"markdown/canvas/syntax/custom-and-calculated-metrics.md","blockId":"seed:markdown/canvas/syntax/custom-and-calculated-metrics.md:0","blockContentId":"bc-03b21bf9","effortSlug":"deadlifts","isStatic":true,"sourcePath":"markdown/canvas/syntax/custom-and-calculated-metrics.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/custom-and-calculated-metrics.md:seed:markdown/canvas/syntax/custom-and-calculated-metrics.md:1:deadlifts","noteId":"markdown/canvas/syntax/custom-and-calculated-metrics.md","blockId":"seed:markdown/canvas/syntax/custom-and-calculated-metrics.md:1","blockContentId":"bc-63335a73","effortSlug":"deadlifts","isStatic":true,"sourcePath":"markdown/canvas/syntax/custom-and-calculated-metrics.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/custom-intervals.md","content":"---\nsearch: hidden\ntitle: \"Custom Intervals\"\nsubtitle: \"Change the work and rest lengths to fit the session\"\nsection: protocols\norder: 12\n---\n```time\n(5)\n :40 Bike\n *:20 Rest\n```\n","blocks":{"seed:markdown/canvas/syntax/custom-intervals.md:0":{"id":"seed:markdown/canvas/syntax/custom-intervals.md:0","kind":"wod","from":142,"to":180,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/custom-intervals.md:seed:markdown/canvas/syntax/custom-intervals.md:0","noteId":"markdown/canvas/syntax/custom-intervals.md","blockId":"seed:markdown/canvas/syntax/custom-intervals.md:0","blockVersion":1,"sourceRevision":1,"from":142,"to":180,"position":0,"dataType":"wod","blockContentId":"bc-db006994","rawContent":"```time\n(5)\n :40 Bike\n *:20 Rest\n```","noteTitle":"Custom Intervals","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/custom-intervals","sourcePath":"markdown/canvas/syntax/custom-intervals.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/custom-intervals.md:seed:markdown/canvas/syntax/custom-intervals.md:0:bike","noteId":"markdown/canvas/syntax/custom-intervals.md","blockId":"seed:markdown/canvas/syntax/custom-intervals.md:0","blockContentId":"bc-db006994","effortSlug":"bike","isStatic":true,"sourcePath":"markdown/canvas/syntax/custom-intervals.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/custom-metrics-1.md","content":"---\nsearch: hidden\ntitle: \"Intensity\"\nsubtitle: \"Attach a percentage or scale to any movement\"\nsection: custom-metrics\norder: 1\n---\n```time\n5 Back Squat 225lb {\"intensity\": 80}\n```\n","blocks":{"seed:markdown/canvas/syntax/custom-metrics-1.md:0":{"id":"seed:markdown/canvas/syntax/custom-metrics-1.md:0","kind":"wod","from":132,"to":180,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/custom-metrics-1.md:seed:markdown/canvas/syntax/custom-metrics-1.md:0","noteId":"markdown/canvas/syntax/custom-metrics-1.md","blockId":"seed:markdown/canvas/syntax/custom-metrics-1.md:0","blockVersion":1,"sourceRevision":1,"from":132,"to":180,"position":0,"dataType":"wod","blockContentId":"bc-5e3affed","rawContent":"```time\n5 Back Squat 225lb {\"intensity\": 80}\n```","noteTitle":"Custom Metrics 1","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/custom-metrics-1","sourcePath":"markdown/canvas/syntax/custom-metrics-1.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/custom-metrics-1.md:seed:markdown/canvas/syntax/custom-metrics-1.md:0:back-squat","noteId":"markdown/canvas/syntax/custom-metrics-1.md","blockId":"seed:markdown/canvas/syntax/custom-metrics-1.md:0","blockContentId":"bc-5e3affed","effortSlug":"back-squat","isStatic":true,"sourcePath":"markdown/canvas/syntax/custom-metrics-1.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/custom-metrics-2.md","content":"---\nsearch: hidden\ntitle: \"RPE & RIR\"\nsubtitle: \"Rate effort and reps in reserve per set\"\nsection: custom-metrics\norder: 2\n---\n```time\n(3 Sets)\n 8 Bench Press 185lb {\"rpe\": 8, \"rir\": 2}\n *2:00 Rest\n```\n","blocks":{"seed:markdown/canvas/syntax/custom-metrics-2.md:0":{"id":"seed:markdown/canvas/syntax/custom-metrics-2.md:0","kind":"wod","from":127,"to":203,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/custom-metrics-2.md:seed:markdown/canvas/syntax/custom-metrics-2.md:0","noteId":"markdown/canvas/syntax/custom-metrics-2.md","blockId":"seed:markdown/canvas/syntax/custom-metrics-2.md:0","blockVersion":1,"sourceRevision":1,"from":127,"to":203,"position":0,"dataType":"wod","blockContentId":"bc-1801abfd","rawContent":"```time\n(3 Sets)\n 8 Bench Press 185lb {\"rpe\": 8, \"rir\": 2}\n *2:00 Rest\n```","noteTitle":"Custom Metrics 2","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/custom-metrics-2","sourcePath":"markdown/canvas/syntax/custom-metrics-2.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/custom-metrics-2.md:seed:markdown/canvas/syntax/custom-metrics-2.md:0:bench-press","noteId":"markdown/canvas/syntax/custom-metrics-2.md","blockId":"seed:markdown/canvas/syntax/custom-metrics-2.md:0","blockContentId":"bc-1801abfd","effortSlug":"bench-press","isStatic":true,"sourcePath":"markdown/canvas/syntax/custom-metrics-2.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/custom-metrics-3.md","content":"---\nsearch: hidden\ntitle: \"Heart Rate Zone\"\nsubtitle: \"Tag conditioning work with a target zone\"\nsection: custom-metrics\norder: 3\n---\n```time\n(4)\n 400m Run {\"hrZone\": 4}\n *1:00 Rest\n```\n","blocks":{"seed:markdown/canvas/syntax/custom-metrics-3.md:0":{"id":"seed:markdown/canvas/syntax/custom-metrics-3.md:0","kind":"wod","from":134,"to":187,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/custom-metrics-3.md:seed:markdown/canvas/syntax/custom-metrics-3.md:0","noteId":"markdown/canvas/syntax/custom-metrics-3.md","blockId":"seed:markdown/canvas/syntax/custom-metrics-3.md:0","blockVersion":1,"sourceRevision":1,"from":134,"to":187,"position":0,"dataType":"wod","blockContentId":"bc-7fc8dde3","rawContent":"```time\n(4)\n 400m Run {\"hrZone\": 4}\n *1:00 Rest\n```","noteTitle":"Custom Metrics 3","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/custom-metrics-3","sourcePath":"markdown/canvas/syntax/custom-metrics-3.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/custom-metrics-3.md:seed:markdown/canvas/syntax/custom-metrics-3.md:0:run","noteId":"markdown/canvas/syntax/custom-metrics-3.md","blockId":"seed:markdown/canvas/syntax/custom-metrics-3.md:0","blockContentId":"bc-7fc8dde3","effortSlug":"run","isStatic":true,"sourcePath":"markdown/canvas/syntax/custom-metrics-3.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/custom-metrics-4.md","content":"---\nsearch: hidden\ntitle: \"Mixed Custom Metrics\"\nsubtitle: \"Combine multiple metrics on one line\"\nsection: custom-metrics\norder: 4\n---\n```time\n(5 Sets)\n 5 Deadlift 315lb {\"intensity\": 85, \"rpe\": 9, r}\n *3:00 Rest\n```\n","blocks":{"seed:markdown/canvas/syntax/custom-metrics-4.md:0":{"id":"seed:markdown/canvas/syntax/custom-metrics-4.md:0","kind":"wod","from":135,"to":218,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/custom-metrics-4.md:seed:markdown/canvas/syntax/custom-metrics-4.md:0","noteId":"markdown/canvas/syntax/custom-metrics-4.md","blockId":"seed:markdown/canvas/syntax/custom-metrics-4.md:0","blockVersion":1,"sourceRevision":1,"from":135,"to":218,"position":0,"dataType":"wod","blockContentId":"bc-57f8f366","rawContent":"```time\n(5 Sets)\n 5 Deadlift 315lb {\"intensity\": 85, \"rpe\": 9, r}\n *3:00 Rest\n```","noteTitle":"Custom Metrics 4","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/custom-metrics-4","sourcePath":"markdown/canvas/syntax/custom-metrics-4.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/custom-metrics-4.md:seed:markdown/canvas/syntax/custom-metrics-4.md:0:deadlift","noteId":"markdown/canvas/syntax/custom-metrics-4.md","blockId":"seed:markdown/canvas/syntax/custom-metrics-4.md:0","blockContentId":"bc-57f8f366","effortSlug":"deadlift","isStatic":true,"sourcePath":"markdown/canvas/syntax/custom-metrics-4.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/custom-metrics-5.md","content":"---\nsearch: hidden\ntitle: \"Calculated Metrics\"\nsubtitle: \"Derive values from custom metrics across a workout\"\nsection: custom-metrics\norder: 5\n---\n```time\n(5 Sets)\n 5 Back Squat 225lb {\"rpe\": 8}\n *2:00 Rest\n\ncalculate\n totalLoad = sum(load)\n avgRPE = mean(rpe)\n```\n","blocks":{"seed:markdown/canvas/syntax/custom-metrics-5.md:0":{"id":"seed:markdown/canvas/syntax/custom-metrics-5.md:0","kind":"wod","from":147,"to":268,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/custom-metrics-5.md:seed:markdown/canvas/syntax/custom-metrics-5.md:0","noteId":"markdown/canvas/syntax/custom-metrics-5.md","blockId":"seed:markdown/canvas/syntax/custom-metrics-5.md:0","blockVersion":1,"sourceRevision":1,"from":147,"to":268,"position":0,"dataType":"wod","blockContentId":"bc-3d082dba","rawContent":"```time\n(5 Sets)\n 5 Back Squat 225lb {\"rpe\": 8}\n *2:00 Rest\n\ncalculate\n totalLoad = sum(load)\n avgRPE = mean(rpe)\n```","noteTitle":"Custom Metrics 5","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/custom-metrics-5","sourcePath":"markdown/canvas/syntax/custom-metrics-5.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/custom-metrics-5.md:seed:markdown/canvas/syntax/custom-metrics-5.md:0:back-squat","noteId":"markdown/canvas/syntax/custom-metrics-5.md","blockId":"seed:markdown/canvas/syntax/custom-metrics-5.md:0","blockContentId":"bc-3d082dba","effortSlug":"back-squat","isStatic":true,"sourcePath":"markdown/canvas/syntax/custom-metrics-5.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/dialect-climb-bouldering.md","content":"---\nsearch: hidden\ntitle: \"Dialect: Climb Bouldering\"\n---\n```log:climbing\ndate: 2026-05-26\nlocation: \"Sender One LAX\"\ndiscipline: bouldering\nduration: 2.5\nrpe: 8\nenergy: 7\n\n(Warmup)\n [Slab Warmup] V0 flash @1 // quiet feet\n [Jug Ladder] V2 flash @1\n\n(Project)\n [The Shield] V7 redpoint @12 // engage core before crux reach\n```\n","blocks":{"seed:markdown/canvas/syntax/dialect-climb-bouldering.md:0":{"id":"seed:markdown/canvas/syntax/dialect-climb-bouldering.md:0","kind":"wod","from":58,"to":329,"sourceRevision":1,"version":1,"dialect":"log","sport":"climbing"}},"blockIndex":[{"id":"markdown/canvas/syntax/dialect-climb-bouldering.md:seed:markdown/canvas/syntax/dialect-climb-bouldering.md:0","noteId":"markdown/canvas/syntax/dialect-climb-bouldering.md","blockId":"seed:markdown/canvas/syntax/dialect-climb-bouldering.md:0","blockVersion":1,"sourceRevision":1,"from":58,"to":329,"position":0,"dataType":"wod","blockContentId":"bc-79df5117","rawContent":"```log:climbing\ndate: 2026-05-26\nlocation: \"Sender One LAX\"\ndiscipline: bouldering\nduration: 2.5\nrpe: 8\nenergy: 7\n\n(Warmup)\n [Slab Warmup] V0 flash @1 // quiet feet\n [Jug Ladder] V2 flash @1\n\n(Project)\n [The Shield] V7 redpoint @12 // engage core before crux reach\n```","noteTitle":"Dialect Climb Bouldering","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/dialect-climb-bouldering","sourcePath":"markdown/canvas/syntax/dialect-climb-bouldering.md"}],"blockEfforts":[]},{"path":"markdown/canvas/syntax/dialect-climb-hangboard.md","content":"---\nsearch: hidden\ntitle: \"Dialect: Climb Hangboard\"\n---\n```log:climbing\ndate: 2026-05-22\nlocation: Home Training Setup\ndiscipline: hangboard\nprotocol: max hangs\nduration: 1.25\nrpe: 8\nenergy: 8\n\n[Open hand] 20mm +30lb 7s @3 // all reps completed\n[Half crimp] 20mm +25lb 7s @3 // third rep slipped at 6s\n[Wide pinch] 45mm +15lb 7s @3 // strong today\n[Sloper rail] bw 7s @3 // failed reps 2 and 3\n```\n","blocks":{"seed:markdown/canvas/syntax/dialect-climb-hangboard.md:0":{"id":"seed:markdown/canvas/syntax/dialect-climb-hangboard.md:0","kind":"wod","from":57,"to":398,"sourceRevision":1,"version":1,"dialect":"log","sport":"climbing"}},"blockIndex":[{"id":"markdown/canvas/syntax/dialect-climb-hangboard.md:seed:markdown/canvas/syntax/dialect-climb-hangboard.md:0","noteId":"markdown/canvas/syntax/dialect-climb-hangboard.md","blockId":"seed:markdown/canvas/syntax/dialect-climb-hangboard.md:0","blockVersion":1,"sourceRevision":1,"from":57,"to":398,"position":0,"dataType":"wod","blockContentId":"bc-6fdd423d","rawContent":"```log:climbing\ndate: 2026-05-22\nlocation: Home Training Setup\ndiscipline: hangboard\nprotocol: max hangs\nduration: 1.25\nrpe: 8\nenergy: 8\n\n[Open hand] 20mm +30lb 7s @3 // all reps completed\n[Half crimp] 20mm +25lb 7s @3 // third rep slipped at 6s\n[Wide pinch] 45mm +15lb 7s @3 // strong today\n[Sloper rail] bw 7s @3 // failed reps 2 and 3\n```","noteTitle":"Dialect Climb Hangboard","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/dialect-climb-hangboard","sourcePath":"markdown/canvas/syntax/dialect-climb-hangboard.md"}],"blockEfforts":[]},{"path":"markdown/canvas/syntax/dialect-climb-sport.md","content":"---\nsearch: hidden\ntitle: \"Dialect: Climb Sport\"\n---\n```log:climbing\ndate: 2026-05-20\nlocation: Red Rock Canyon\narea: Calico Basin\ndiscipline: sport\ngrade_system: yds\nduration: 8\nrpe: 7\nconditions: sunny warm light wind\n\n[The Gift] 5.10b onsight @1 // bolt 5 step-up crux\n[Plumber's Crack] 5.11a redpoint @3 // stem instead of layback\n[Black Magic] 5.11d redpoint @4 // crux at bolt 6\n```\n","blocks":{"seed:markdown/canvas/syntax/dialect-climb-sport.md:0":{"id":"seed:markdown/canvas/syntax/dialect-climb-sport.md:0","kind":"wod","from":53,"to":388,"sourceRevision":1,"version":1,"dialect":"log","sport":"climbing"}},"blockIndex":[{"id":"markdown/canvas/syntax/dialect-climb-sport.md:seed:markdown/canvas/syntax/dialect-climb-sport.md:0","noteId":"markdown/canvas/syntax/dialect-climb-sport.md","blockId":"seed:markdown/canvas/syntax/dialect-climb-sport.md:0","blockVersion":1,"sourceRevision":1,"from":53,"to":388,"position":0,"dataType":"wod","blockContentId":"bc-55961e77","rawContent":"```log:climbing\ndate: 2026-05-20\nlocation: Red Rock Canyon\narea: Calico Basin\ndiscipline: sport\ngrade_system: yds\nduration: 8\nrpe: 7\nconditions: sunny warm light wind\n\n[The Gift] 5.10b onsight @1 // bolt 5 step-up crux\n[Plumber's Crack] 5.11a redpoint @3 // stem instead of layback\n[Black Magic] 5.11d redpoint @4 // crux at bolt 6\n```","noteTitle":"Dialect Climb Sport","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/dialect-climb-sport","sourcePath":"markdown/canvas/syntax/dialect-climb-sport.md"}],"blockEfforts":[]},{"path":"markdown/canvas/syntax/dialect-log.md","content":"---\nsearch: hidden\ntitle: \"Dialect: Log\"\n---\n```log\ndate: 2026-05-25\nrpe: 7\n\n5 Back Squat 225lb hard\n5 Back Squat 225lb harder\n5 Back Squat 225lb max effort\n\n// Finished all prescribed sets, bar speed slowed on set 3.\n```\n","blocks":{"seed:markdown/canvas/syntax/dialect-log.md:0":{"id":"seed:markdown/canvas/syntax/dialect-log.md:0","kind":"wod","from":45,"to":221,"sourceRevision":1,"version":1,"dialect":"log"}},"blockIndex":[{"id":"markdown/canvas/syntax/dialect-log.md:seed:markdown/canvas/syntax/dialect-log.md:0","noteId":"markdown/canvas/syntax/dialect-log.md","blockId":"seed:markdown/canvas/syntax/dialect-log.md:0","blockVersion":1,"sourceRevision":1,"from":45,"to":221,"position":0,"dataType":"wod","blockContentId":"bc-7f84c346","rawContent":"```log\ndate: 2026-05-25\nrpe: 7\n\n5 Back Squat 225lb hard\n5 Back Squat 225lb harder\n5 Back Squat 225lb max effort\n\n// Finished all prescribed sets, bar speed slowed on set 3.\n```","noteTitle":"Dialect Log","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/dialect-log","sourcePath":"markdown/canvas/syntax/dialect-log.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/dialect-log.md:seed:markdown/canvas/syntax/dialect-log.md:0:back-squat","noteId":"markdown/canvas/syntax/dialect-log.md","blockId":"seed:markdown/canvas/syntax/dialect-log.md:0","blockContentId":"bc-7f84c346","effortSlug":"back-squat","isStatic":true,"sourcePath":"markdown/canvas/syntax/dialect-log.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/dialect-plan.md","content":"---\nsearch: hidden\ntitle: \"Dialect: Plan\"\n---\n```time\n(Strength)\n 5 Back Squat ?lb\n 5 Bench Press ?lb\n\n(Conditioning)\n 12:00\n (AMRAP)\n 10 Burpees\n 15 Air Squats\n```\n","blocks":{"seed:markdown/canvas/syntax/dialect-plan.md:0":{"id":"seed:markdown/canvas/syntax/dialect-plan.md:0","kind":"wod","from":46,"to":180,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/dialect-plan.md:seed:markdown/canvas/syntax/dialect-plan.md:0","noteId":"markdown/canvas/syntax/dialect-plan.md","blockId":"seed:markdown/canvas/syntax/dialect-plan.md:0","blockVersion":1,"sourceRevision":1,"from":46,"to":180,"position":0,"dataType":"wod","blockContentId":"bc-3ddb4592","rawContent":"```time\n(Strength)\n 5 Back Squat ?lb\n 5 Bench Press ?lb\n\n(Conditioning)\n 12:00\n (AMRAP)\n 10 Burpees\n 15 Air Squats\n```","noteTitle":"Dialect Plan","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/dialect-plan","sourcePath":"markdown/canvas/syntax/dialect-plan.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/dialect-plan.md:seed:markdown/canvas/syntax/dialect-plan.md:0:back-squat","noteId":"markdown/canvas/syntax/dialect-plan.md","blockId":"seed:markdown/canvas/syntax/dialect-plan.md:0","blockContentId":"bc-3ddb4592","effortSlug":"back-squat","isStatic":true,"sourcePath":"markdown/canvas/syntax/dialect-plan.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/dialect-plan.md:seed:markdown/canvas/syntax/dialect-plan.md:0:bench-press","noteId":"markdown/canvas/syntax/dialect-plan.md","blockId":"seed:markdown/canvas/syntax/dialect-plan.md:0","blockContentId":"bc-3ddb4592","effortSlug":"bench-press","isStatic":true,"sourcePath":"markdown/canvas/syntax/dialect-plan.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/dialect-plan.md:seed:markdown/canvas/syntax/dialect-plan.md:0:burpees","noteId":"markdown/canvas/syntax/dialect-plan.md","blockId":"seed:markdown/canvas/syntax/dialect-plan.md:0","blockContentId":"bc-3ddb4592","effortSlug":"burpees","isStatic":true,"sourcePath":"markdown/canvas/syntax/dialect-plan.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/dialect-plan.md:seed:markdown/canvas/syntax/dialect-plan.md:0:air-squats","noteId":"markdown/canvas/syntax/dialect-plan.md","blockId":"seed:markdown/canvas/syntax/dialect-plan.md:0","blockContentId":"bc-3ddb4592","effortSlug":"air-squats","isStatic":true,"sourcePath":"markdown/canvas/syntax/dialect-plan.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/dialect-wod.md","content":"---\nsearch: hidden\ntitle: \"Dialect: WOD\"\n---\n```time\n(3)\n 10 Pushups\n 15 Air Squats\n :30 Rest\n\n5:00 Run hard\n```\n","blocks":{"seed:markdown/canvas/syntax/dialect-wod.md:0":{"id":"seed:markdown/canvas/syntax/dialect-wod.md:0","kind":"wod","from":45,"to":115,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/dialect-wod.md:seed:markdown/canvas/syntax/dialect-wod.md:0","noteId":"markdown/canvas/syntax/dialect-wod.md","blockId":"seed:markdown/canvas/syntax/dialect-wod.md:0","blockVersion":1,"sourceRevision":1,"from":45,"to":115,"position":0,"dataType":"wod","blockContentId":"bc-cc9892cd","rawContent":"```time\n(3)\n 10 Pushups\n 15 Air Squats\n :30 Rest\n\n5:00 Run hard\n```","noteTitle":"Dialect Wod","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/dialect-wod","sourcePath":"markdown/canvas/syntax/dialect-wod.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/dialect-wod.md:seed:markdown/canvas/syntax/dialect-wod.md:0:pushups","noteId":"markdown/canvas/syntax/dialect-wod.md","blockId":"seed:markdown/canvas/syntax/dialect-wod.md:0","blockContentId":"bc-cc9892cd","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/syntax/dialect-wod.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/dialect-wod.md:seed:markdown/canvas/syntax/dialect-wod.md:0:air-squats","noteId":"markdown/canvas/syntax/dialect-wod.md","blockId":"seed:markdown/canvas/syntax/dialect-wod.md:0","blockContentId":"bc-cc9892cd","effortSlug":"air-squats","isStatic":true,"sourcePath":"markdown/canvas/syntax/dialect-wod.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/dialect-wod.md:seed:markdown/canvas/syntax/dialect-wod.md:0:run-hard","noteId":"markdown/canvas/syntax/dialect-wod.md","blockId":"seed:markdown/canvas/syntax/dialect-wod.md:0","blockContentId":"bc-cc9892cd","effortSlug":"run-hard","isStatic":true,"sourcePath":"markdown/canvas/syntax/dialect-wod.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/distance-intervals.md","content":"---\nsearch: hidden\ntitle: \"Intervals with Distance\"\nsubtitle: \"Timed windows can include distance targets\"\nsection: protocols\norder: 13\n---\n```time\n(4)\n 3:00 Run 800m\n 2:00 Rest\n```\n","blocks":{"seed:markdown/canvas/syntax/distance-intervals.md:0":{"id":"seed:markdown/canvas/syntax/distance-intervals.md:0","kind":"wod","from":140,"to":183,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/distance-intervals.md:seed:markdown/canvas/syntax/distance-intervals.md:0","noteId":"markdown/canvas/syntax/distance-intervals.md","blockId":"seed:markdown/canvas/syntax/distance-intervals.md:0","blockVersion":1,"sourceRevision":1,"from":140,"to":183,"position":0,"dataType":"wod","blockContentId":"bc-060cdd11","rawContent":"```time\n(4)\n 3:00 Run 800m\n 2:00 Rest\n```","noteTitle":"Distance Intervals","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/distance-intervals","sourcePath":"markdown/canvas/syntax/distance-intervals.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/distance-intervals.md:seed:markdown/canvas/syntax/distance-intervals.md:0:run","noteId":"markdown/canvas/syntax/distance-intervals.md","blockId":"seed:markdown/canvas/syntax/distance-intervals.md:0","blockContentId":"bc-060cdd11","effortSlug":"run","isStatic":true,"sourcePath":"markdown/canvas/syntax/distance-intervals.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/document-1.md","content":"---\nsearch: hidden\ntitle: \"Headers & Notes\"\nsubtitle: \"Markdown outside the wod block\"\nsection: document\norder: 1\n---\n# Tuesday — Upper Body\n\nFocusing on horizontal pushing strength.\nGoal: stay tight, control the descent.\n\n```time\n5:00 (AMRAP)\n 5 Pushups\n 10 Air Squats\n```\n","blocks":{"seed:markdown/canvas/syntax/document-1.md:0":{"id":"seed:markdown/canvas/syntax/document-1.md:0","kind":"wod","from":223,"to":275,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/document-1.md:seed:markdown/canvas/syntax/document-1.md:0","noteId":"markdown/canvas/syntax/document-1.md","blockId":"seed:markdown/canvas/syntax/document-1.md:0","blockVersion":1,"sourceRevision":1,"from":223,"to":275,"position":0,"dataType":"wod","blockContentId":"bc-6d20a31f","rawContent":"```time\n5:00 (AMRAP)\n 5 Pushups\n 10 Air Squats\n```","noteTitle":"Document 1","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/document-1","sourcePath":"markdown/canvas/syntax/document-1.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/document-1.md:seed:markdown/canvas/syntax/document-1.md:0:pushups","noteId":"markdown/canvas/syntax/document-1.md","blockId":"seed:markdown/canvas/syntax/document-1.md:0","blockContentId":"bc-6d20a31f","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/syntax/document-1.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/document-1.md:seed:markdown/canvas/syntax/document-1.md:0:air-squats","noteId":"markdown/canvas/syntax/document-1.md","blockId":"seed:markdown/canvas/syntax/document-1.md:0","blockContentId":"bc-6d20a31f","effortSlug":"air-squats","isStatic":true,"sourcePath":"markdown/canvas/syntax/document-1.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/document-2.md","content":"---\nsearch: hidden\ntitle: \"Warmup Checklist\"\nsubtitle: \"- [ ] tasks before the session\"\nsection: document\norder: 2\n---\n## Warmup\n- [x] 5 min easy bike\n- [ ] Shoulder CARs x 10\n- [ ] Band pull-aparts x 20\n\n```time\n(5 Sets)\n 5 Bench Press 185lb\n *3:00 Rest\n```\n","blocks":{"seed:markdown/canvas/syntax/document-2.md:0":{"id":"seed:markdown/canvas/syntax/document-2.md:0","kind":"wod","from":205,"to":260,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/document-2.md:seed:markdown/canvas/syntax/document-2.md:0","noteId":"markdown/canvas/syntax/document-2.md","blockId":"seed:markdown/canvas/syntax/document-2.md:0","blockVersion":1,"sourceRevision":1,"from":205,"to":260,"position":0,"dataType":"wod","blockContentId":"bc-887269e9","rawContent":"```time\n(5 Sets)\n 5 Bench Press 185lb\n *3:00 Rest\n```","noteTitle":"Document 2","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/document-2","sourcePath":"markdown/canvas/syntax/document-2.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/document-2.md:seed:markdown/canvas/syntax/document-2.md:0:bench-press","noteId":"markdown/canvas/syntax/document-2.md","blockId":"seed:markdown/canvas/syntax/document-2.md:0","blockContentId":"bc-887269e9","effortSlug":"bench-press","isStatic":true,"sourcePath":"markdown/canvas/syntax/document-2.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/document-3.md","content":"---\nsearch: hidden\ntitle: \"Multiple Workouts\"\nsubtitle: \"Many wod blocks per document\"\nsection: document\norder: 3\n---\n# Monday — Strength + Metcon\n\n## Strength\n```time\n(5 Sets)\n 3 Back Squat 225lb\n *2:00 Rest\n```\n\n## Metcon\n```time\n20:00 (AMRAP)\n 10 KB Swings 24kg\n 10 Box Jumps\n 10 Situps\n```\n","blocks":{"seed:markdown/canvas/syntax/document-3.md:0":{"id":"seed:markdown/canvas/syntax/document-3.md:0","kind":"wod","from":160,"to":214,"sourceRevision":1,"version":1,"dialect":"time"},"seed:markdown/canvas/syntax/document-3.md:1":{"id":"seed:markdown/canvas/syntax/document-3.md:1","kind":"wod","from":226,"to":298,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/document-3.md:seed:markdown/canvas/syntax/document-3.md:0","noteId":"markdown/canvas/syntax/document-3.md","blockId":"seed:markdown/canvas/syntax/document-3.md:0","blockVersion":1,"sourceRevision":1,"from":160,"to":214,"position":0,"dataType":"wod","blockContentId":"bc-aedf8ee3","rawContent":"```time\n(5 Sets)\n 3 Back Squat 225lb\n *2:00 Rest\n```","noteTitle":"Document 3","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/document-3","sourcePath":"markdown/canvas/syntax/document-3.md"},{"id":"markdown/canvas/syntax/document-3.md:seed:markdown/canvas/syntax/document-3.md:1","noteId":"markdown/canvas/syntax/document-3.md","blockId":"seed:markdown/canvas/syntax/document-3.md:1","blockVersion":1,"sourceRevision":1,"from":226,"to":298,"position":1,"dataType":"wod","blockContentId":"bc-5262ea56","rawContent":"```time\n20:00 (AMRAP)\n 10 KB Swings 24kg\n 10 Box Jumps\n 10 Situps\n```","noteTitle":"Document 3","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/document-3","sourcePath":"markdown/canvas/syntax/document-3.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/document-3.md:seed:markdown/canvas/syntax/document-3.md:0:back-squat","noteId":"markdown/canvas/syntax/document-3.md","blockId":"seed:markdown/canvas/syntax/document-3.md:0","blockContentId":"bc-aedf8ee3","effortSlug":"back-squat","isStatic":true,"sourcePath":"markdown/canvas/syntax/document-3.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/document-3.md:seed:markdown/canvas/syntax/document-3.md:1:kb-swings","noteId":"markdown/canvas/syntax/document-3.md","blockId":"seed:markdown/canvas/syntax/document-3.md:1","blockContentId":"bc-5262ea56","effortSlug":"kb-swings","isStatic":true,"sourcePath":"markdown/canvas/syntax/document-3.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/document-3.md:seed:markdown/canvas/syntax/document-3.md:1:box-jumps","noteId":"markdown/canvas/syntax/document-3.md","blockId":"seed:markdown/canvas/syntax/document-3.md:1","blockContentId":"bc-5262ea56","effortSlug":"box-jumps","isStatic":true,"sourcePath":"markdown/canvas/syntax/document-3.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/document-3.md:seed:markdown/canvas/syntax/document-3.md:1:situps","noteId":"markdown/canvas/syntax/document-3.md","blockId":"seed:markdown/canvas/syntax/document-3.md:1","blockContentId":"bc-5262ea56","effortSlug":"situps","isStatic":true,"sourcePath":"markdown/canvas/syntax/document-3.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/document-4.md","content":"---\nsearch: hidden\ntitle: \"Equipment Table\"\nsubtitle: \"Markdown tables for setup\"\nsection: document\norder: 4\n---\n# Equipment Needed\n\n| Item | Spec | Qty |\n|------|------|-----|\n| Barbell | 45lb | 1 |\n| Plates | 45lb | 4 |\n| Kettlebell | 24kg | 1 |\n\n```time\nFOR TIME\n 50 Kettlebell Swings 24kg\n 400m Run\n 25 Kettlebell Swings 24kg\n```\n","blocks":{"seed:markdown/canvas/syntax/document-4.md:0":{"id":"seed:markdown/canvas/syntax/document-4.md:0","kind":"wod","from":249,"to":336,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/document-4.md:seed:markdown/canvas/syntax/document-4.md:0","noteId":"markdown/canvas/syntax/document-4.md","blockId":"seed:markdown/canvas/syntax/document-4.md:0","blockVersion":1,"sourceRevision":1,"from":249,"to":336,"position":0,"dataType":"wod","blockContentId":"bc-4730d62f","rawContent":"```time\nFOR TIME\n 50 Kettlebell Swings 24kg\n 400m Run\n 25 Kettlebell Swings 24kg\n```","noteTitle":"Document 4","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/document-4","sourcePath":"markdown/canvas/syntax/document-4.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/document-4.md:seed:markdown/canvas/syntax/document-4.md:0:kettlebell-swings","noteId":"markdown/canvas/syntax/document-4.md","blockId":"seed:markdown/canvas/syntax/document-4.md:0","blockContentId":"bc-4730d62f","effortSlug":"kettlebell-swings","isStatic":true,"sourcePath":"markdown/canvas/syntax/document-4.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/document-4.md:seed:markdown/canvas/syntax/document-4.md:0:run","noteId":"markdown/canvas/syntax/document-4.md","blockId":"seed:markdown/canvas/syntax/document-4.md:0","blockContentId":"bc-4730d62f","effortSlug":"run","isStatic":true,"sourcePath":"markdown/canvas/syntax/document-4.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/effort-notes.md","content":"---\nsearch: hidden\ntitle: \"Effort\"\nsubtitle: \"Free-form effort text after the movement\"\nsection: basics\norder: 4\n---\n```time\n5 Back Squat 225lb hard\n400m Run easy\n```\n","blocks":{"seed:markdown/canvas/syntax/effort-notes.md:0":{"id":"seed:markdown/canvas/syntax/effort-notes.md:0","kind":"wod","from":117,"to":166,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/effort-notes.md:seed:markdown/canvas/syntax/effort-notes.md:0","noteId":"markdown/canvas/syntax/effort-notes.md","blockId":"seed:markdown/canvas/syntax/effort-notes.md:0","blockVersion":1,"sourceRevision":1,"from":117,"to":166,"position":0,"dataType":"wod","blockContentId":"bc-50f2dd17","rawContent":"```time\n5 Back Squat 225lb hard\n400m Run easy\n```","noteTitle":"Effort Notes","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/effort-notes","sourcePath":"markdown/canvas/syntax/effort-notes.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/effort-notes.md:seed:markdown/canvas/syntax/effort-notes.md:0:back-squat","noteId":"markdown/canvas/syntax/effort-notes.md","blockId":"seed:markdown/canvas/syntax/effort-notes.md:0","blockContentId":"bc-50f2dd17","effortSlug":"back-squat","isStatic":true,"sourcePath":"markdown/canvas/syntax/effort-notes.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/effort-notes.md:seed:markdown/canvas/syntax/effort-notes.md:0:run-easy","noteId":"markdown/canvas/syntax/effort-notes.md","blockId":"seed:markdown/canvas/syntax/effort-notes.md:0","blockContentId":"bc-50f2dd17","effortSlug":"run-easy","isStatic":true,"sourcePath":"markdown/canvas/syntax/effort-notes.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/groups-1.md","content":"---\nsearch: hidden\ntitle: \"Simple Rounds\"\nsubtitle: \"Parentheses repeat everything inside\"\nsection: groups\norder: 1\n---\n```time\n(3)\n 10 Pushups\n 15 Situps\n 20 Air Squats\n```\n","blocks":{"seed:markdown/canvas/syntax/groups-1.md:0":{"id":"seed:markdown/canvas/syntax/groups-1.md:0","kind":"wod","from":120,"to":176,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/groups-1.md:seed:markdown/canvas/syntax/groups-1.md:0","noteId":"markdown/canvas/syntax/groups-1.md","blockId":"seed:markdown/canvas/syntax/groups-1.md:0","blockVersion":1,"sourceRevision":1,"from":120,"to":176,"position":0,"dataType":"wod","blockContentId":"bc-61708c89","rawContent":"```time\n(3)\n 10 Pushups\n 15 Situps\n 20 Air Squats\n```","noteTitle":"Groups 1","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/groups-1","sourcePath":"markdown/canvas/syntax/groups-1.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/groups-1.md:seed:markdown/canvas/syntax/groups-1.md:0:pushups","noteId":"markdown/canvas/syntax/groups-1.md","blockId":"seed:markdown/canvas/syntax/groups-1.md:0","blockContentId":"bc-61708c89","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/syntax/groups-1.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/groups-1.md:seed:markdown/canvas/syntax/groups-1.md:0:situps","noteId":"markdown/canvas/syntax/groups-1.md","blockId":"seed:markdown/canvas/syntax/groups-1.md:0","blockContentId":"bc-61708c89","effortSlug":"situps","isStatic":true,"sourcePath":"markdown/canvas/syntax/groups-1.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/groups-1.md:seed:markdown/canvas/syntax/groups-1.md:0:air-squats","noteId":"markdown/canvas/syntax/groups-1.md","blockId":"seed:markdown/canvas/syntax/groups-1.md:0","blockContentId":"bc-61708c89","effortSlug":"air-squats","isStatic":true,"sourcePath":"markdown/canvas/syntax/groups-1.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/groups-2.md","content":"---\nsearch: hidden\ntitle: \"Rep Sequence\"\nsubtitle: \"Dash-separated targets per round\"\nsection: groups\norder: 2\n---\n```time\n(21-15-9)\n Thrusters 95lb\n Pullups\n```\n","blocks":{"seed:markdown/canvas/syntax/groups-2.md:0":{"id":"seed:markdown/canvas/syntax/groups-2.md:0","kind":"wod","from":115,"to":163,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/groups-2.md:seed:markdown/canvas/syntax/groups-2.md:0","noteId":"markdown/canvas/syntax/groups-2.md","blockId":"seed:markdown/canvas/syntax/groups-2.md:0","blockVersion":1,"sourceRevision":1,"from":115,"to":163,"position":0,"dataType":"wod","blockContentId":"bc-afebf0ed","rawContent":"```time\n(21-15-9)\n Thrusters 95lb\n Pullups\n```","noteTitle":"Groups 2","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/groups-2","sourcePath":"markdown/canvas/syntax/groups-2.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/groups-2.md:seed:markdown/canvas/syntax/groups-2.md:0:thrusters","noteId":"markdown/canvas/syntax/groups-2.md","blockId":"seed:markdown/canvas/syntax/groups-2.md:0","blockContentId":"bc-afebf0ed","effortSlug":"thrusters","isStatic":true,"sourcePath":"markdown/canvas/syntax/groups-2.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/groups-2.md:seed:markdown/canvas/syntax/groups-2.md:0:pullups","noteId":"markdown/canvas/syntax/groups-2.md","blockId":"seed:markdown/canvas/syntax/groups-2.md:0","blockContentId":"bc-afebf0ed","effortSlug":"pullups","isStatic":true,"sourcePath":"markdown/canvas/syntax/groups-2.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/groups-3.md","content":"---\nsearch: hidden\ntitle: \"Work / Rest Loop\"\nsubtitle: \"Timed intervals inside rounds\"\nsection: groups\norder: 3\n---\n```time\n(4)\n :40 Work\n :20 Rest\n Air Squats\n```\n","blocks":{"seed:markdown/canvas/syntax/groups-3.md:0":{"id":"seed:markdown/canvas/syntax/groups-3.md:0","kind":"wod","from":116,"to":166,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/groups-3.md:seed:markdown/canvas/syntax/groups-3.md:0","noteId":"markdown/canvas/syntax/groups-3.md","blockId":"seed:markdown/canvas/syntax/groups-3.md:0","blockVersion":1,"sourceRevision":1,"from":116,"to":166,"position":0,"dataType":"wod","blockContentId":"bc-3dc5a5cc","rawContent":"```time\n(4)\n :40 Work\n :20 Rest\n Air Squats\n```","noteTitle":"Groups 3","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/groups-3","sourcePath":"markdown/canvas/syntax/groups-3.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/groups-3.md:seed:markdown/canvas/syntax/groups-3.md:0:air-squats","noteId":"markdown/canvas/syntax/groups-3.md","blockId":"seed:markdown/canvas/syntax/groups-3.md:0","blockContentId":"bc-3dc5a5cc","effortSlug":"air-squats","isStatic":true,"sourcePath":"markdown/canvas/syntax/groups-3.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/groups-4.md","content":"---\nsearch: hidden\ntitle: \"Nested Groups\"\nsubtitle: \"Rounds inside rounds\"\nsection: groups\norder: 4\n---\n```time\n(3)\n (4)\n :20 Work\n :10 Rest\n Burpees\n 1:00 Rest\n```\n","blocks":{"seed:markdown/canvas/syntax/groups-4.md:0":{"id":"seed:markdown/canvas/syntax/groups-4.md:0","kind":"wod","from":104,"to":175,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/groups-4.md:seed:markdown/canvas/syntax/groups-4.md:0","noteId":"markdown/canvas/syntax/groups-4.md","blockId":"seed:markdown/canvas/syntax/groups-4.md:0","blockVersion":1,"sourceRevision":1,"from":104,"to":175,"position":0,"dataType":"wod","blockContentId":"bc-e6fb5023","rawContent":"```time\n(3)\n (4)\n :20 Work\n :10 Rest\n Burpees\n 1:00 Rest\n```","noteTitle":"Groups 4","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/groups-4","sourcePath":"markdown/canvas/syntax/groups-4.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/groups-4.md:seed:markdown/canvas/syntax/groups-4.md:0:burpees","noteId":"markdown/canvas/syntax/groups-4.md","blockId":"seed:markdown/canvas/syntax/groups-4.md:0","blockContentId":"bc-e6fb5023","effortSlug":"burpees","isStatic":true,"sourcePath":"markdown/canvas/syntax/groups-4.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/longer-duration.md","content":"---\nsearch: hidden\ntitle: \"Longer Duration\"\nsubtitle: \"Use H:MM:SS when a session runs longer than an hour\"\nsection: timers\norder: 7\n---\n```time\n1:30:00 Long Row\n```\n","blocks":{"seed:markdown/canvas/syntax/longer-duration.md:0":{"id":"seed:markdown/canvas/syntax/longer-duration.md:0","kind":"wod","from":137,"to":165,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/longer-duration.md:seed:markdown/canvas/syntax/longer-duration.md:0","noteId":"markdown/canvas/syntax/longer-duration.md","blockId":"seed:markdown/canvas/syntax/longer-duration.md:0","blockVersion":1,"sourceRevision":1,"from":137,"to":165,"position":0,"dataType":"wod","blockContentId":"bc-7fdd1ec5","rawContent":"```time\n1:30:00 Long Row\n```","noteTitle":"Longer Duration","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/longer-duration","sourcePath":"markdown/canvas/syntax/longer-duration.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/longer-duration.md:seed:markdown/canvas/syntax/longer-duration.md:0:long-row","noteId":"markdown/canvas/syntax/longer-duration.md","blockId":"seed:markdown/canvas/syntax/longer-duration.md:0","blockContentId":"bc-7fdd1ec5","effortSlug":"long-row","isStatic":true,"sourcePath":"markdown/canvas/syntax/longer-duration.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/longer-intervals.md","content":"---\nsearch: hidden\ntitle: \"Longer Intervals\"\nsubtitle: \"Use a bigger interval when the work needs more room\"\nsection: protocols\norder: 10\n---\n```time\n(5) 2:00 EMOM\n 5 Deadlifts 225lb\n```\n","blocks":{"seed:markdown/canvas/syntax/longer-intervals.md:0":{"id":"seed:markdown/canvas/syntax/longer-intervals.md:0","kind":"wod","from":142,"to":187,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/longer-intervals.md:seed:markdown/canvas/syntax/longer-intervals.md:0","noteId":"markdown/canvas/syntax/longer-intervals.md","blockId":"seed:markdown/canvas/syntax/longer-intervals.md:0","blockVersion":1,"sourceRevision":1,"from":142,"to":187,"position":0,"dataType":"wod","blockContentId":"bc-7085a03b","rawContent":"```time\n(5) 2:00 EMOM\n 5 Deadlifts 225lb\n```","noteTitle":"Longer Intervals","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/longer-intervals","sourcePath":"markdown/canvas/syntax/longer-intervals.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/longer-intervals.md:seed:markdown/canvas/syntax/longer-intervals.md:0:deadlifts","noteId":"markdown/canvas/syntax/longer-intervals.md","blockId":"seed:markdown/canvas/syntax/longer-intervals.md:0","blockContentId":"bc-7085a03b","effortSlug":"deadlifts","isStatic":true,"sourcePath":"markdown/canvas/syntax/longer-intervals.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/measurements.md","content":"---\nsearch: hidden\ntitle: \"Measurements\"\nsubtitle: \"Weights and distances live on the movement line\"\nsection: basics\norder: 3\n---\n```time\n5 Back Squat 225lb\n400m Run\n2000m Row\n```\n","blocks":{"seed:markdown/canvas/syntax/measurements.md:0":{"id":"seed:markdown/canvas/syntax/measurements.md:0","kind":"wod","from":130,"to":179,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/measurements.md:seed:markdown/canvas/syntax/measurements.md:0","noteId":"markdown/canvas/syntax/measurements.md","blockId":"seed:markdown/canvas/syntax/measurements.md:0","blockVersion":1,"sourceRevision":1,"from":130,"to":179,"position":0,"dataType":"wod","blockContentId":"bc-7fe7dc87","rawContent":"```time\n5 Back Squat 225lb\n400m Run\n2000m Row\n```","noteTitle":"Measurements","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/measurements","sourcePath":"markdown/canvas/syntax/measurements.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/measurements.md:seed:markdown/canvas/syntax/measurements.md:0:back-squat","noteId":"markdown/canvas/syntax/measurements.md","blockId":"seed:markdown/canvas/syntax/measurements.md:0","blockContentId":"bc-7fe7dc87","effortSlug":"back-squat","isStatic":true,"sourcePath":"markdown/canvas/syntax/measurements.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/measurements.md:seed:markdown/canvas/syntax/measurements.md:0:run","noteId":"markdown/canvas/syntax/measurements.md","blockId":"seed:markdown/canvas/syntax/measurements.md:0","blockContentId":"bc-7fe7dc87","effortSlug":"run","isStatic":true,"sourcePath":"markdown/canvas/syntax/measurements.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/measurements.md:seed:markdown/canvas/syntax/measurements.md:0:row","noteId":"markdown/canvas/syntax/measurements.md","blockId":"seed:markdown/canvas/syntax/measurements.md:0","blockContentId":"bc-7fe7dc87","effortSlug":"row","isStatic":true,"sourcePath":"markdown/canvas/syntax/measurements.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/metrics-1.md","content":"---\nsearch: hidden\ntitle: \"Reps\"\nsubtitle: \"Count repetitions\"\nsection: metrics\norder: 1\n---\n```time\n10 Pushups\n15 Situps\n20 Air Squats\n```\n","blocks":{"seed:markdown/canvas/syntax/metrics-1.md:0":{"id":"seed:markdown/canvas/syntax/metrics-1.md:0","kind":"wod","from":93,"to":139,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/metrics-1.md:seed:markdown/canvas/syntax/metrics-1.md:0","noteId":"markdown/canvas/syntax/metrics-1.md","blockId":"seed:markdown/canvas/syntax/metrics-1.md:0","blockVersion":1,"sourceRevision":1,"from":93,"to":139,"position":0,"dataType":"wod","blockContentId":"bc-272bc1cf","rawContent":"```time\n10 Pushups\n15 Situps\n20 Air Squats\n```","noteTitle":"Metrics 1","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/metrics-1","sourcePath":"markdown/canvas/syntax/metrics-1.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/metrics-1.md:seed:markdown/canvas/syntax/metrics-1.md:0:pushups","noteId":"markdown/canvas/syntax/metrics-1.md","blockId":"seed:markdown/canvas/syntax/metrics-1.md:0","blockContentId":"bc-272bc1cf","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/syntax/metrics-1.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/metrics-1.md:seed:markdown/canvas/syntax/metrics-1.md:0:situps","noteId":"markdown/canvas/syntax/metrics-1.md","blockId":"seed:markdown/canvas/syntax/metrics-1.md:0","blockContentId":"bc-272bc1cf","effortSlug":"situps","isStatic":true,"sourcePath":"markdown/canvas/syntax/metrics-1.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/metrics-1.md:seed:markdown/canvas/syntax/metrics-1.md:0:air-squats","noteId":"markdown/canvas/syntax/metrics-1.md","blockId":"seed:markdown/canvas/syntax/metrics-1.md:0","blockContentId":"bc-272bc1cf","effortSlug":"air-squats","isStatic":true,"sourcePath":"markdown/canvas/syntax/metrics-1.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/metrics-2.md","content":"---\nsearch: hidden\ntitle: \"Weight\"\nsubtitle: \"lb, kg, or bodyweight\"\nsection: metrics\norder: 2\n---\n```time\n5 Back Squat 225lb\n3 Deadlift 140kg\nDip bw\n```\n","blocks":{"seed:markdown/canvas/syntax/metrics-2.md:0":{"id":"seed:markdown/canvas/syntax/metrics-2.md:0","kind":"wod","from":99,"to":153,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/metrics-2.md:seed:markdown/canvas/syntax/metrics-2.md:0","noteId":"markdown/canvas/syntax/metrics-2.md","blockId":"seed:markdown/canvas/syntax/metrics-2.md:0","blockVersion":1,"sourceRevision":1,"from":99,"to":153,"position":0,"dataType":"wod","blockContentId":"bc-08e1ac7b","rawContent":"```time\n5 Back Squat 225lb\n3 Deadlift 140kg\nDip bw\n```","noteTitle":"Metrics 2","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/metrics-2","sourcePath":"markdown/canvas/syntax/metrics-2.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/metrics-2.md:seed:markdown/canvas/syntax/metrics-2.md:0:back-squat","noteId":"markdown/canvas/syntax/metrics-2.md","blockId":"seed:markdown/canvas/syntax/metrics-2.md:0","blockContentId":"bc-08e1ac7b","effortSlug":"back-squat","isStatic":true,"sourcePath":"markdown/canvas/syntax/metrics-2.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/metrics-2.md:seed:markdown/canvas/syntax/metrics-2.md:0:deadlift","noteId":"markdown/canvas/syntax/metrics-2.md","blockId":"seed:markdown/canvas/syntax/metrics-2.md:0","blockContentId":"bc-08e1ac7b","effortSlug":"deadlift","isStatic":true,"sourcePath":"markdown/canvas/syntax/metrics-2.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/metrics-2.md:seed:markdown/canvas/syntax/metrics-2.md:0:dip-bw","noteId":"markdown/canvas/syntax/metrics-2.md","blockId":"seed:markdown/canvas/syntax/metrics-2.md:0","blockContentId":"bc-08e1ac7b","effortSlug":"dip-bw","isStatic":true,"sourcePath":"markdown/canvas/syntax/metrics-2.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/metrics-3.md","content":"---\nsearch: hidden\ntitle: \"Distance\"\nsubtitle: \"m, km, ft, miles\"\nsection: metrics\norder: 3\n---\n```time\nRun 400m\nRow 2000m\nBike 10 miles\nSwim 500m\n```\n","blocks":{"seed:markdown/canvas/syntax/metrics-3.md:0":{"id":"seed:markdown/canvas/syntax/metrics-3.md:0","kind":"wod","from":96,"to":150,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/metrics-3.md:seed:markdown/canvas/syntax/metrics-3.md:0","noteId":"markdown/canvas/syntax/metrics-3.md","blockId":"seed:markdown/canvas/syntax/metrics-3.md:0","blockVersion":1,"sourceRevision":1,"from":96,"to":150,"position":0,"dataType":"wod","blockContentId":"bc-ef9c9a94","rawContent":"```time\nRun 400m\nRow 2000m\nBike 10 miles\nSwim 500m\n```","noteTitle":"Metrics 3","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/metrics-3","sourcePath":"markdown/canvas/syntax/metrics-3.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/metrics-3.md:seed:markdown/canvas/syntax/metrics-3.md:0:run","noteId":"markdown/canvas/syntax/metrics-3.md","blockId":"seed:markdown/canvas/syntax/metrics-3.md:0","blockContentId":"bc-ef9c9a94","effortSlug":"run","isStatic":true,"sourcePath":"markdown/canvas/syntax/metrics-3.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/metrics-3.md:seed:markdown/canvas/syntax/metrics-3.md:0:row","noteId":"markdown/canvas/syntax/metrics-3.md","blockId":"seed:markdown/canvas/syntax/metrics-3.md:0","blockContentId":"bc-ef9c9a94","effortSlug":"row","isStatic":true,"sourcePath":"markdown/canvas/syntax/metrics-3.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/metrics-3.md:seed:markdown/canvas/syntax/metrics-3.md:0:bike","noteId":"markdown/canvas/syntax/metrics-3.md","blockId":"seed:markdown/canvas/syntax/metrics-3.md:0","blockContentId":"bc-ef9c9a94","effortSlug":"bike","isStatic":true,"sourcePath":"markdown/canvas/syntax/metrics-3.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/metrics-3.md:seed:markdown/canvas/syntax/metrics-3.md:0:swim","noteId":"markdown/canvas/syntax/metrics-3.md","blockId":"seed:markdown/canvas/syntax/metrics-3.md:0","blockContentId":"bc-ef9c9a94","effortSlug":"swim","isStatic":true,"sourcePath":"markdown/canvas/syntax/metrics-3.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/metrics-4.md","content":"---\nsearch: hidden\ntitle: \"Combined\"\nsubtitle: \"Multiple metrics on one line\"\nsection: metrics\norder: 4\n---\n```time\n10 Thrusters 95lb\n5 Deadlifts 225lb\n400m Run\n```\n","blocks":{"seed:markdown/canvas/syntax/metrics-4.md:0":{"id":"seed:markdown/canvas/syntax/metrics-4.md:0","kind":"wod","from":108,"to":164,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/metrics-4.md:seed:markdown/canvas/syntax/metrics-4.md:0","noteId":"markdown/canvas/syntax/metrics-4.md","blockId":"seed:markdown/canvas/syntax/metrics-4.md:0","blockVersion":1,"sourceRevision":1,"from":108,"to":164,"position":0,"dataType":"wod","blockContentId":"bc-79e27266","rawContent":"```time\n10 Thrusters 95lb\n5 Deadlifts 225lb\n400m Run\n```","noteTitle":"Metrics 4","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/metrics-4","sourcePath":"markdown/canvas/syntax/metrics-4.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/metrics-4.md:seed:markdown/canvas/syntax/metrics-4.md:0:thrusters","noteId":"markdown/canvas/syntax/metrics-4.md","blockId":"seed:markdown/canvas/syntax/metrics-4.md:0","blockContentId":"bc-79e27266","effortSlug":"thrusters","isStatic":true,"sourcePath":"markdown/canvas/syntax/metrics-4.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/metrics-4.md:seed:markdown/canvas/syntax/metrics-4.md:0:deadlifts","noteId":"markdown/canvas/syntax/metrics-4.md","blockId":"seed:markdown/canvas/syntax/metrics-4.md:0","blockContentId":"bc-79e27266","effortSlug":"deadlifts","isStatic":true,"sourcePath":"markdown/canvas/syntax/metrics-4.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/metrics-4.md:seed:markdown/canvas/syntax/metrics-4.md:0:run","noteId":"markdown/canvas/syntax/metrics-4.md","blockId":"seed:markdown/canvas/syntax/metrics-4.md:0","blockContentId":"bc-79e27266","effortSlug":"run","isStatic":true,"sourcePath":"markdown/canvas/syntax/metrics-4.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/metrics-5.md","content":"---\nsearch: hidden\ntitle: \"Unknown Load\"\nsubtitle: \"? prompts user at runtime\"\nsection: metrics\norder: 5\n---\n```time\n5 Deadlifts ?lb\n3 Back Squat ?kg\n```\n","blocks":{"seed:markdown/canvas/syntax/metrics-5.md:0":{"id":"seed:markdown/canvas/syntax/metrics-5.md:0","kind":"wod","from":109,"to":153,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/metrics-5.md:seed:markdown/canvas/syntax/metrics-5.md:0","noteId":"markdown/canvas/syntax/metrics-5.md","blockId":"seed:markdown/canvas/syntax/metrics-5.md:0","blockVersion":1,"sourceRevision":1,"from":109,"to":153,"position":0,"dataType":"wod","blockContentId":"bc-55ae2bf6","rawContent":"```time\n5 Deadlifts ?lb\n3 Back Squat ?kg\n```","noteTitle":"Metrics 5","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/metrics-5","sourcePath":"markdown/canvas/syntax/metrics-5.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/metrics-5.md:seed:markdown/canvas/syntax/metrics-5.md:0:deadlifts","noteId":"markdown/canvas/syntax/metrics-5.md","blockId":"seed:markdown/canvas/syntax/metrics-5.md:0","blockContentId":"bc-55ae2bf6","effortSlug":"deadlifts","isStatic":true,"sourcePath":"markdown/canvas/syntax/metrics-5.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/metrics-5.md:seed:markdown/canvas/syntax/metrics-5.md:0:back-squat","noteId":"markdown/canvas/syntax/metrics-5.md","blockId":"seed:markdown/canvas/syntax/metrics-5.md:0","blockContentId":"bc-55ae2bf6","effortSlug":"back-squat","isStatic":true,"sourcePath":"markdown/canvas/syntax/metrics-5.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/mixed-sections.md","content":"---\nsearch: hidden\ntitle: \"Mixed Sections\"\nsubtitle: \"Warmup, strength, and conditioning in one note\"\nsection: groups\norder: 6\n---\n```time\n// Warmup\n 500m Row\n 10 Lunges\n\n// Strength\n 5 Back Squat 225lb\n *2:00 Rest\n\n// Conditioning\n 10:00 AMRAP\n 5 Pullups\n 10 Pushups\n```\n","blocks":{"seed:markdown/canvas/syntax/mixed-sections.md:0":{"id":"seed:markdown/canvas/syntax/mixed-sections.md:0","kind":"wod","from":131,"to":282,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/mixed-sections.md:seed:markdown/canvas/syntax/mixed-sections.md:0","noteId":"markdown/canvas/syntax/mixed-sections.md","blockId":"seed:markdown/canvas/syntax/mixed-sections.md:0","blockVersion":1,"sourceRevision":1,"from":131,"to":282,"position":0,"dataType":"wod","blockContentId":"bc-d1587b80","rawContent":"```time\n// Warmup\n 500m Row\n 10 Lunges\n\n// Strength\n 5 Back Squat 225lb\n *2:00 Rest\n\n// Conditioning\n 10:00 AMRAP\n 5 Pullups\n 10 Pushups\n```","noteTitle":"Mixed Sections","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/mixed-sections","sourcePath":"markdown/canvas/syntax/mixed-sections.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/mixed-sections.md:seed:markdown/canvas/syntax/mixed-sections.md:0:row","noteId":"markdown/canvas/syntax/mixed-sections.md","blockId":"seed:markdown/canvas/syntax/mixed-sections.md:0","blockContentId":"bc-d1587b80","effortSlug":"row","isStatic":true,"sourcePath":"markdown/canvas/syntax/mixed-sections.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/mixed-sections.md:seed:markdown/canvas/syntax/mixed-sections.md:0:lunges","noteId":"markdown/canvas/syntax/mixed-sections.md","blockId":"seed:markdown/canvas/syntax/mixed-sections.md:0","blockContentId":"bc-d1587b80","effortSlug":"lunges","isStatic":true,"sourcePath":"markdown/canvas/syntax/mixed-sections.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/mixed-sections.md:seed:markdown/canvas/syntax/mixed-sections.md:0:back-squat","noteId":"markdown/canvas/syntax/mixed-sections.md","blockId":"seed:markdown/canvas/syntax/mixed-sections.md:0","blockContentId":"bc-d1587b80","effortSlug":"back-squat","isStatic":true,"sourcePath":"markdown/canvas/syntax/mixed-sections.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/mixed-sections.md:seed:markdown/canvas/syntax/mixed-sections.md:0:pullups","noteId":"markdown/canvas/syntax/mixed-sections.md","blockId":"seed:markdown/canvas/syntax/mixed-sections.md:0","blockContentId":"bc-d1587b80","effortSlug":"pullups","isStatic":true,"sourcePath":"markdown/canvas/syntax/mixed-sections.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/mixed-sections.md:seed:markdown/canvas/syntax/mixed-sections.md:0:pushups","noteId":"markdown/canvas/syntax/mixed-sections.md","blockId":"seed:markdown/canvas/syntax/mixed-sections.md:0","blockContentId":"bc-d1587b80","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/syntax/mixed-sections.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/mixed-timers.md","content":"---\nsearch: hidden\ntitle: \"Mixed Timers\"\nsubtitle: \"Timed and untimed work can share the same note\"\nsection: timers\norder: 8\n---\n```time\n5:00 Run\n10 Burpees\n*:30 Rest\n:? Max Effort Pushups\n```\n","blocks":{"seed:markdown/canvas/syntax/mixed-timers.md:0":{"id":"seed:markdown/canvas/syntax/mixed-timers.md:0","kind":"wod","from":129,"to":192,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/mixed-timers.md:seed:markdown/canvas/syntax/mixed-timers.md:0","noteId":"markdown/canvas/syntax/mixed-timers.md","blockId":"seed:markdown/canvas/syntax/mixed-timers.md:0","blockVersion":1,"sourceRevision":1,"from":129,"to":192,"position":0,"dataType":"wod","blockContentId":"bc-fc630d08","rawContent":"```time\n5:00 Run\n10 Burpees\n*:30 Rest\n:? Max Effort Pushups\n```","noteTitle":"Mixed Timers","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/mixed-timers","sourcePath":"markdown/canvas/syntax/mixed-timers.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/mixed-timers.md:seed:markdown/canvas/syntax/mixed-timers.md:0:run","noteId":"markdown/canvas/syntax/mixed-timers.md","blockId":"seed:markdown/canvas/syntax/mixed-timers.md:0","blockContentId":"bc-fc630d08","effortSlug":"run","isStatic":true,"sourcePath":"markdown/canvas/syntax/mixed-timers.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/mixed-timers.md:seed:markdown/canvas/syntax/mixed-timers.md:0:burpees","noteId":"markdown/canvas/syntax/mixed-timers.md","blockId":"seed:markdown/canvas/syntax/mixed-timers.md:0","blockContentId":"bc-fc630d08","effortSlug":"burpees","isStatic":true,"sourcePath":"markdown/canvas/syntax/mixed-timers.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/mixed-timers.md:seed:markdown/canvas/syntax/mixed-timers.md:0:max-effort-pushups","noteId":"markdown/canvas/syntax/mixed-timers.md","blockId":"seed:markdown/canvas/syntax/mixed-timers.md:0","blockContentId":"bc-fc630d08","effortSlug":"max-effort-pushups","isStatic":true,"sourcePath":"markdown/canvas/syntax/mixed-timers.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/multiple-amrap-windows.md","content":"---\nsearch: hidden\ntitle: \"Multiple AMRAP Windows\"\nsubtitle: \"Chain separate AMRAP blocks in one session\"\nsection: protocols\norder: 8\n---\n```time\n10:00 AMRAP\n 5 Pullups\n 10 Pushups\n\n5:00 AMRAP\n 10 Burpees\n 15 Air Squats\n```\n","blocks":{"seed:markdown/canvas/syntax/multiple-amrap-windows.md:0":{"id":"seed:markdown/canvas/syntax/multiple-amrap-windows.md:0","kind":"wod","from":138,"to":227,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/multiple-amrap-windows.md:seed:markdown/canvas/syntax/multiple-amrap-windows.md:0","noteId":"markdown/canvas/syntax/multiple-amrap-windows.md","blockId":"seed:markdown/canvas/syntax/multiple-amrap-windows.md:0","blockVersion":1,"sourceRevision":1,"from":138,"to":227,"position":0,"dataType":"wod","blockContentId":"bc-37a58f7e","rawContent":"```time\n10:00 AMRAP\n 5 Pullups\n 10 Pushups\n\n5:00 AMRAP\n 10 Burpees\n 15 Air Squats\n```","noteTitle":"Multiple Amrap Windows","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/multiple-amrap-windows","sourcePath":"markdown/canvas/syntax/multiple-amrap-windows.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/multiple-amrap-windows.md:seed:markdown/canvas/syntax/multiple-amrap-windows.md:0:pullups","noteId":"markdown/canvas/syntax/multiple-amrap-windows.md","blockId":"seed:markdown/canvas/syntax/multiple-amrap-windows.md:0","blockContentId":"bc-37a58f7e","effortSlug":"pullups","isStatic":true,"sourcePath":"markdown/canvas/syntax/multiple-amrap-windows.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/multiple-amrap-windows.md:seed:markdown/canvas/syntax/multiple-amrap-windows.md:0:pushups","noteId":"markdown/canvas/syntax/multiple-amrap-windows.md","blockId":"seed:markdown/canvas/syntax/multiple-amrap-windows.md:0","blockContentId":"bc-37a58f7e","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/syntax/multiple-amrap-windows.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/multiple-amrap-windows.md:seed:markdown/canvas/syntax/multiple-amrap-windows.md:0:burpees","noteId":"markdown/canvas/syntax/multiple-amrap-windows.md","blockId":"seed:markdown/canvas/syntax/multiple-amrap-windows.md:0","blockContentId":"bc-37a58f7e","effortSlug":"burpees","isStatic":true,"sourcePath":"markdown/canvas/syntax/multiple-amrap-windows.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/multiple-amrap-windows.md:seed:markdown/canvas/syntax/multiple-amrap-windows.md:0:air-squats","noteId":"markdown/canvas/syntax/multiple-amrap-windows.md","blockId":"seed:markdown/canvas/syntax/multiple-amrap-windows.md:0","blockContentId":"bc-37a58f7e","effortSlug":"air-squats","isStatic":true,"sourcePath":"markdown/canvas/syntax/multiple-amrap-windows.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/multiple-sets.md","content":"---\nsearch: hidden\ntitle: \"Multiple Sets\"\nsubtitle: \"Repeat the same work with built-in rest\"\nsection: groups\norder: 7\n---\n```time\n(5 Sets)\n 3 Back Squat 225lb\n *2:00 Rest\n```\n","blocks":{"seed:markdown/canvas/syntax/multiple-sets.md:0":{"id":"seed:markdown/canvas/syntax/multiple-sets.md:0","kind":"wod","from":123,"to":177,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/multiple-sets.md:seed:markdown/canvas/syntax/multiple-sets.md:0","noteId":"markdown/canvas/syntax/multiple-sets.md","blockId":"seed:markdown/canvas/syntax/multiple-sets.md:0","blockVersion":1,"sourceRevision":1,"from":123,"to":177,"position":0,"dataType":"wod","blockContentId":"bc-aedf8ee3","rawContent":"```time\n(5 Sets)\n 3 Back Squat 225lb\n *2:00 Rest\n```","noteTitle":"Multiple Sets","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/multiple-sets","sourcePath":"markdown/canvas/syntax/multiple-sets.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/multiple-sets.md:seed:markdown/canvas/syntax/multiple-sets.md:0:back-squat","noteId":"markdown/canvas/syntax/multiple-sets.md","blockId":"seed:markdown/canvas/syntax/multiple-sets.md:0","blockContentId":"bc-aedf8ee3","effortSlug":"back-squat","isStatic":true,"sourcePath":"markdown/canvas/syntax/multiple-sets.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/named-groups.md","content":"---\nsearch: hidden\ntitle: \"Named Groups\"\nsubtitle: \"Use labels to organize a session\"\nsection: groups\norder: 5\n---\n```time\n// Warmup\n 400m Run\n 10 Air Squats\n\n// Strength\n 5 Back Squat 225lb\n```\n","blocks":{"seed:markdown/canvas/syntax/named-groups.md:0":{"id":"seed:markdown/canvas/syntax/named-groups.md:0","kind":"wod","from":115,"to":197,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/named-groups.md:seed:markdown/canvas/syntax/named-groups.md:0","noteId":"markdown/canvas/syntax/named-groups.md","blockId":"seed:markdown/canvas/syntax/named-groups.md:0","blockVersion":1,"sourceRevision":1,"from":115,"to":197,"position":0,"dataType":"wod","blockContentId":"bc-68dae5cf","rawContent":"```time\n// Warmup\n 400m Run\n 10 Air Squats\n\n// Strength\n 5 Back Squat 225lb\n```","noteTitle":"Named Groups","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/named-groups","sourcePath":"markdown/canvas/syntax/named-groups.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/named-groups.md:seed:markdown/canvas/syntax/named-groups.md:0:run","noteId":"markdown/canvas/syntax/named-groups.md","blockId":"seed:markdown/canvas/syntax/named-groups.md:0","blockContentId":"bc-68dae5cf","effortSlug":"run","isStatic":true,"sourcePath":"markdown/canvas/syntax/named-groups.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/named-groups.md:seed:markdown/canvas/syntax/named-groups.md:0:air-squats","noteId":"markdown/canvas/syntax/named-groups.md","blockId":"seed:markdown/canvas/syntax/named-groups.md:0","blockContentId":"bc-68dae5cf","effortSlug":"air-squats","isStatic":true,"sourcePath":"markdown/canvas/syntax/named-groups.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/named-groups.md:seed:markdown/canvas/syntax/named-groups.md:0:back-squat","noteId":"markdown/canvas/syntax/named-groups.md","blockId":"seed:markdown/canvas/syntax/named-groups.md:0","blockContentId":"bc-68dae5cf","effortSlug":"back-squat","isStatic":true,"sourcePath":"markdown/canvas/syntax/named-groups.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/protocols-1.md","content":"---\nsearch: hidden\ntitle: \"AMRAP\"\nsubtitle: \"Countdown, unbounded rounds\"\nsection: protocols\norder: 1\n---\n```time\n20:00 (AMRAP)\n 5 Pullups\n 10 Pushups\n 15 Air Squats\n```\n","blocks":{"seed:markdown/canvas/syntax/protocols-1.md:0":{"id":"seed:markdown/canvas/syntax/protocols-1.md:0","kind":"wod","from":106,"to":172,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/protocols-1.md:seed:markdown/canvas/syntax/protocols-1.md:0","noteId":"markdown/canvas/syntax/protocols-1.md","blockId":"seed:markdown/canvas/syntax/protocols-1.md:0","blockVersion":1,"sourceRevision":1,"from":106,"to":172,"position":0,"dataType":"wod","blockContentId":"bc-79291699","rawContent":"```time\n20:00 (AMRAP)\n 5 Pullups\n 10 Pushups\n 15 Air Squats\n```","noteTitle":"Protocols 1","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/protocols-1","sourcePath":"markdown/canvas/syntax/protocols-1.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/protocols-1.md:seed:markdown/canvas/syntax/protocols-1.md:0:pullups","noteId":"markdown/canvas/syntax/protocols-1.md","blockId":"seed:markdown/canvas/syntax/protocols-1.md:0","blockContentId":"bc-79291699","effortSlug":"pullups","isStatic":true,"sourcePath":"markdown/canvas/syntax/protocols-1.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/protocols-1.md:seed:markdown/canvas/syntax/protocols-1.md:0:pushups","noteId":"markdown/canvas/syntax/protocols-1.md","blockId":"seed:markdown/canvas/syntax/protocols-1.md:0","blockContentId":"bc-79291699","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/syntax/protocols-1.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/protocols-1.md:seed:markdown/canvas/syntax/protocols-1.md:0:air-squats","noteId":"markdown/canvas/syntax/protocols-1.md","blockId":"seed:markdown/canvas/syntax/protocols-1.md:0","blockContentId":"bc-79291699","effortSlug":"air-squats","isStatic":true,"sourcePath":"markdown/canvas/syntax/protocols-1.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/protocols-2.md","content":"---\nsearch: hidden\ntitle: \"EMOM\"\nsubtitle: \"Per-minute intervals, fixed count\"\nsection: protocols\norder: 2\n---\n```time\n10:00 (EMOM)\n 3 Clean & Jerk 135lb\n```\n","blocks":{"seed:markdown/canvas/syntax/protocols-2.md:0":{"id":"seed:markdown/canvas/syntax/protocols-2.md:0","kind":"wod","from":111,"to":158,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/protocols-2.md:seed:markdown/canvas/syntax/protocols-2.md:0","noteId":"markdown/canvas/syntax/protocols-2.md","blockId":"seed:markdown/canvas/syntax/protocols-2.md:0","blockVersion":1,"sourceRevision":1,"from":111,"to":158,"position":0,"dataType":"wod","blockContentId":"bc-5a221802","rawContent":"```time\n10:00 (EMOM)\n 3 Clean & Jerk 135lb\n```","noteTitle":"Protocols 2","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/protocols-2","sourcePath":"markdown/canvas/syntax/protocols-2.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/protocols-2.md:seed:markdown/canvas/syntax/protocols-2.md:0:clean-jerk","noteId":"markdown/canvas/syntax/protocols-2.md","blockId":"seed:markdown/canvas/syntax/protocols-2.md:0","blockContentId":"bc-5a221802","effortSlug":"clean-jerk","isStatic":true,"sourcePath":"markdown/canvas/syntax/protocols-2.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/protocols-3.md","content":"---\nsearch: hidden\ntitle: \"FOR TIME\"\nsubtitle: \"Stopwatch to completion\"\nsection: protocols\norder: 3\n---\n```time\nFOR TIME\n 21 Thrusters 95lb\n 21 Pullups\n 15 Thrusters 95lb\n 15 Pullups\n 9 Thrusters 95lb\n 9 Pullups\n```\n","blocks":{"seed:markdown/canvas/syntax/protocols-3.md:0":{"id":"seed:markdown/canvas/syntax/protocols-3.md:0","kind":"wod","from":105,"to":222,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/protocols-3.md:seed:markdown/canvas/syntax/protocols-3.md:0","noteId":"markdown/canvas/syntax/protocols-3.md","blockId":"seed:markdown/canvas/syntax/protocols-3.md:0","blockVersion":1,"sourceRevision":1,"from":105,"to":222,"position":0,"dataType":"wod","blockContentId":"bc-d1f473ce","rawContent":"```time\nFOR TIME\n 21 Thrusters 95lb\n 21 Pullups\n 15 Thrusters 95lb\n 15 Pullups\n 9 Thrusters 95lb\n 9 Pullups\n```","noteTitle":"Protocols 3","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/protocols-3","sourcePath":"markdown/canvas/syntax/protocols-3.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/protocols-3.md:seed:markdown/canvas/syntax/protocols-3.md:0:thrusters","noteId":"markdown/canvas/syntax/protocols-3.md","blockId":"seed:markdown/canvas/syntax/protocols-3.md:0","blockContentId":"bc-d1f473ce","effortSlug":"thrusters","isStatic":true,"sourcePath":"markdown/canvas/syntax/protocols-3.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/protocols-3.md:seed:markdown/canvas/syntax/protocols-3.md:0:pullups","noteId":"markdown/canvas/syntax/protocols-3.md","blockId":"seed:markdown/canvas/syntax/protocols-3.md:0","blockContentId":"bc-d1f473ce","effortSlug":"pullups","isStatic":true,"sourcePath":"markdown/canvas/syntax/protocols-3.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/protocols-4.md","content":"---\nsearch: hidden\ntitle: \"Tabata\"\nsubtitle: \"20s work / 10s rest preset\"\nsection: protocols\norder: 4\n---\n```time\n(8)\n :20 Max Effort Burpees\n :10 Rest\n```\n","blocks":{"seed:markdown/canvas/syntax/protocols-4.md:0":{"id":"seed:markdown/canvas/syntax/protocols-4.md:0","kind":"wod","from":106,"to":157,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/protocols-4.md:seed:markdown/canvas/syntax/protocols-4.md:0","noteId":"markdown/canvas/syntax/protocols-4.md","blockId":"seed:markdown/canvas/syntax/protocols-4.md:0","blockVersion":1,"sourceRevision":1,"from":106,"to":157,"position":0,"dataType":"wod","blockContentId":"bc-73981dd5","rawContent":"```time\n(8)\n :20 Max Effort Burpees\n :10 Rest\n```","noteTitle":"Protocols 4","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/protocols-4","sourcePath":"markdown/canvas/syntax/protocols-4.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/protocols-4.md:seed:markdown/canvas/syntax/protocols-4.md:0:max-effort-burpees","noteId":"markdown/canvas/syntax/protocols-4.md","blockId":"seed:markdown/canvas/syntax/protocols-4.md:0","blockContentId":"bc-73981dd5","effortSlug":"max-effort-burpees","isStatic":true,"sourcePath":"markdown/canvas/syntax/protocols-4.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/protocols-5.md","content":"---\nsearch: hidden\ntitle: \"Implicit EMOM\"\nsubtitle: \"Rounds + timer auto-detects EMOM\"\nsection: protocols\norder: 5\n---\n```time\n(10)\n 1:00 Kettlebell Swings 24kg\n```\n","blocks":{"seed:markdown/canvas/syntax/protocols-5.md:0":{"id":"seed:markdown/canvas/syntax/protocols-5.md:0","kind":"wod","from":119,"to":165,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/protocols-5.md:seed:markdown/canvas/syntax/protocols-5.md:0","noteId":"markdown/canvas/syntax/protocols-5.md","blockId":"seed:markdown/canvas/syntax/protocols-5.md:0","blockVersion":1,"sourceRevision":1,"from":119,"to":165,"position":0,"dataType":"wod","blockContentId":"bc-715b46d1","rawContent":"```time\n(10)\n 1:00 Kettlebell Swings 24kg\n```","noteTitle":"Protocols 5","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/protocols-5","sourcePath":"markdown/canvas/syntax/protocols-5.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/protocols-5.md:seed:markdown/canvas/syntax/protocols-5.md:0:kettlebell-swings","noteId":"markdown/canvas/syntax/protocols-5.md","blockId":"seed:markdown/canvas/syntax/protocols-5.md:0","blockContentId":"bc-715b46d1","effortSlug":"kettlebell-swings","isStatic":true,"sourcePath":"markdown/canvas/syntax/protocols-5.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/single-movement.md","content":"---\nsearch: hidden\ntitle: \"Single Movement\"\nsubtitle: \"The smallest valid workout line\"\nsection: basics\norder: 2\n---\n```time\nPushups\n```\n","blocks":{"seed:markdown/canvas/syntax/single-movement.md:0":{"id":"seed:markdown/canvas/syntax/single-movement.md:0","kind":"wod","from":117,"to":136,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/single-movement.md:seed:markdown/canvas/syntax/single-movement.md:0","noteId":"markdown/canvas/syntax/single-movement.md","blockId":"seed:markdown/canvas/syntax/single-movement.md:0","blockVersion":1,"sourceRevision":1,"from":117,"to":136,"position":0,"dataType":"wod","blockContentId":"bc-40d05391","rawContent":"```time\nPushups\n```","noteTitle":"Single Movement","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/single-movement","sourcePath":"markdown/canvas/syntax/single-movement.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/single-movement.md:seed:markdown/canvas/syntax/single-movement.md:0:pushups","noteId":"markdown/canvas/syntax/single-movement.md","blockId":"seed:markdown/canvas/syntax/single-movement.md:0","blockContentId":"bc-40d05391","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/syntax/single-movement.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/supplemental-1.md","content":"---\nsearch: hidden\ntitle: \"Actions\"\nsubtitle: \"(Parentheses) = non-movement steps\"\nsection: supplemental\norder: 1\n---\n```time\n(5 Sets)\n 5 Back Squat ?lb\n (Adjust plates)\n *2:00 Rest\n```\n","blocks":{"seed:markdown/canvas/syntax/supplemental-1.md:0":{"id":"seed:markdown/canvas/syntax/supplemental-1.md:0","kind":"wod","from":118,"to":188,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/supplemental-1.md:seed:markdown/canvas/syntax/supplemental-1.md:0","noteId":"markdown/canvas/syntax/supplemental-1.md","blockId":"seed:markdown/canvas/syntax/supplemental-1.md:0","blockVersion":1,"sourceRevision":1,"from":118,"to":188,"position":0,"dataType":"wod","blockContentId":"bc-e72c1d70","rawContent":"```time\n(5 Sets)\n 5 Back Squat ?lb\n (Adjust plates)\n *2:00 Rest\n```","noteTitle":"Supplemental 1","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/supplemental-1","sourcePath":"markdown/canvas/syntax/supplemental-1.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/supplemental-1.md:seed:markdown/canvas/syntax/supplemental-1.md:0:back-squat","noteId":"markdown/canvas/syntax/supplemental-1.md","blockId":"seed:markdown/canvas/syntax/supplemental-1.md:0","blockContentId":"bc-e72c1d70","effortSlug":"back-squat","isStatic":true,"sourcePath":"markdown/canvas/syntax/supplemental-1.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/supplemental-2.md","content":"---\nsearch: hidden\ntitle: \"Rest Periods\"\nsubtitle: \"* marks an explicit rest block\"\nsection: supplemental\norder: 2\n---\n```time\n(3)\n Run 400m\n *2:00 Rest\n 10 Pullups\n *1:00 Rest\n```\n","blocks":{"seed:markdown/canvas/syntax/supplemental-2.md:0":{"id":"seed:markdown/canvas/syntax/supplemental-2.md:0","kind":"wod","from":119,"to":184,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/supplemental-2.md:seed:markdown/canvas/syntax/supplemental-2.md:0","noteId":"markdown/canvas/syntax/supplemental-2.md","blockId":"seed:markdown/canvas/syntax/supplemental-2.md:0","blockVersion":1,"sourceRevision":1,"from":119,"to":184,"position":0,"dataType":"wod","blockContentId":"bc-6d7ac2b8","rawContent":"```time\n(3)\n Run 400m\n *2:00 Rest\n 10 Pullups\n *1:00 Rest\n```","noteTitle":"Supplemental 2","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/supplemental-2","sourcePath":"markdown/canvas/syntax/supplemental-2.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/supplemental-2.md:seed:markdown/canvas/syntax/supplemental-2.md:0:run","noteId":"markdown/canvas/syntax/supplemental-2.md","blockId":"seed:markdown/canvas/syntax/supplemental-2.md:0","blockContentId":"bc-6d7ac2b8","effortSlug":"run","isStatic":true,"sourcePath":"markdown/canvas/syntax/supplemental-2.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/supplemental-2.md:seed:markdown/canvas/syntax/supplemental-2.md:0:pullups","noteId":"markdown/canvas/syntax/supplemental-2.md","blockId":"seed:markdown/canvas/syntax/supplemental-2.md:0","blockContentId":"bc-6d7ac2b8","effortSlug":"pullups","isStatic":true,"sourcePath":"markdown/canvas/syntax/supplemental-2.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/supplemental-3.md","content":"---\nsearch: hidden\ntitle: \"Comments\"\nsubtitle: \"// inline coach annotations\"\nsection: supplemental\norder: 3\n---\n```time\n(5 Sets)\n 5 Back Squat 225lb\n // Drive knees out, brace hard\n *3:00 Rest\n```\n","blocks":{"seed:markdown/canvas/syntax/supplemental-3.md:0":{"id":"seed:markdown/canvas/syntax/supplemental-3.md:0","kind":"wod","from":112,"to":199,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/supplemental-3.md:seed:markdown/canvas/syntax/supplemental-3.md:0","noteId":"markdown/canvas/syntax/supplemental-3.md","blockId":"seed:markdown/canvas/syntax/supplemental-3.md:0","blockVersion":1,"sourceRevision":1,"from":112,"to":199,"position":0,"dataType":"wod","blockContentId":"bc-db436334","rawContent":"```time\n(5 Sets)\n 5 Back Squat 225lb\n // Drive knees out, brace hard\n *3:00 Rest\n```","noteTitle":"Supplemental 3","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/supplemental-3","sourcePath":"markdown/canvas/syntax/supplemental-3.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/supplemental-3.md:seed:markdown/canvas/syntax/supplemental-3.md:0:back-squat","noteId":"markdown/canvas/syntax/supplemental-3.md","blockId":"seed:markdown/canvas/syntax/supplemental-3.md:0","blockContentId":"bc-db436334","effortSlug":"back-squat","isStatic":true,"sourcePath":"markdown/canvas/syntax/supplemental-3.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/supplemental-4.md","content":"---\nsearch: hidden\ntitle: \"Unknown Values\"\nsubtitle: \"? captures user input at runtime\"\nsection: supplemental\norder: 4\n---\n```time\n(5 Sets)\n 5 Deadlifts ?lb\n // Choose a challenging working weight\n *2:30 Rest\n```\n","blocks":{"seed:markdown/canvas/syntax/supplemental-4.md:0":{"id":"seed:markdown/canvas/syntax/supplemental-4.md:0","kind":"wod","from":123,"to":215,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/supplemental-4.md:seed:markdown/canvas/syntax/supplemental-4.md:0","noteId":"markdown/canvas/syntax/supplemental-4.md","blockId":"seed:markdown/canvas/syntax/supplemental-4.md:0","blockVersion":1,"sourceRevision":1,"from":123,"to":215,"position":0,"dataType":"wod","blockContentId":"bc-2ea09ee4","rawContent":"```time\n(5 Sets)\n 5 Deadlifts ?lb\n // Choose a challenging working weight\n *2:30 Rest\n```","noteTitle":"Supplemental 4","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/supplemental-4","sourcePath":"markdown/canvas/syntax/supplemental-4.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/supplemental-4.md:seed:markdown/canvas/syntax/supplemental-4.md:0:deadlifts","noteId":"markdown/canvas/syntax/supplemental-4.md","blockId":"seed:markdown/canvas/syntax/supplemental-4.md:0","blockContentId":"bc-2ea09ee4","effortSlug":"deadlifts","isStatic":true,"sourcePath":"markdown/canvas/syntax/supplemental-4.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/time-cap.md","content":"---\nsearch: hidden\ntitle: \"Time Cap\"\nsubtitle: \"A bare timer can cap the work nested beneath it\"\nsection: protocols\norder: 7\n---\n```time\n20:00\n (21-15-9)\n Thrusters 95lb\n Pullups\n```\n","blocks":{"seed:markdown/canvas/syntax/time-cap.md:0":{"id":"seed:markdown/canvas/syntax/time-cap.md:0","kind":"wod","from":129,"to":189,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/time-cap.md:seed:markdown/canvas/syntax/time-cap.md:0","noteId":"markdown/canvas/syntax/time-cap.md","blockId":"seed:markdown/canvas/syntax/time-cap.md:0","blockVersion":1,"sourceRevision":1,"from":129,"to":189,"position":0,"dataType":"wod","blockContentId":"bc-c6d64dbb","rawContent":"```time\n20:00\n (21-15-9)\n Thrusters 95lb\n Pullups\n```","noteTitle":"Time Cap","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/time-cap","sourcePath":"markdown/canvas/syntax/time-cap.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/time-cap.md:seed:markdown/canvas/syntax/time-cap.md:0:thrusters","noteId":"markdown/canvas/syntax/time-cap.md","blockId":"seed:markdown/canvas/syntax/time-cap.md:0","blockContentId":"bc-c6d64dbb","effortSlug":"thrusters","isStatic":true,"sourcePath":"markdown/canvas/syntax/time-cap.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/time-cap.md:seed:markdown/canvas/syntax/time-cap.md:0:pullups","noteId":"markdown/canvas/syntax/time-cap.md","blockId":"seed:markdown/canvas/syntax/time-cap.md:0","blockContentId":"bc-c6d64dbb","effortSlug":"pullups","isStatic":true,"sourcePath":"markdown/canvas/syntax/time-cap.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/timer-modifiers.md","content":"---\nsearch: hidden\ntitle: \"Timer Modifiers\"\nsubtitle: \"Use ^ for count-up, * for required timers, and :? for collectible time\"\nsection: basics\norder: 6\n---\n```time\n^5:00 Row\n*:30 Rest\n:? Bike\n```\n","blocks":{"seed:markdown/canvas/syntax/timer-modifiers.md:0":{"id":"seed:markdown/canvas/syntax/timer-modifiers.md:0","kind":"wod","from":156,"to":195,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/timer-modifiers.md:seed:markdown/canvas/syntax/timer-modifiers.md:0","noteId":"markdown/canvas/syntax/timer-modifiers.md","blockId":"seed:markdown/canvas/syntax/timer-modifiers.md:0","blockVersion":1,"sourceRevision":1,"from":156,"to":195,"position":0,"dataType":"wod","blockContentId":"bc-bb9eaeed","rawContent":"```time\n^5:00 Row\n*:30 Rest\n:? Bike\n```","noteTitle":"Timer Modifiers","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/timer-modifiers","sourcePath":"markdown/canvas/syntax/timer-modifiers.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/timer-modifiers.md:seed:markdown/canvas/syntax/timer-modifiers.md:0:row","noteId":"markdown/canvas/syntax/timer-modifiers.md","blockId":"seed:markdown/canvas/syntax/timer-modifiers.md:0","blockContentId":"bc-bb9eaeed","effortSlug":"row","isStatic":true,"sourcePath":"markdown/canvas/syntax/timer-modifiers.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/timer-modifiers.md:seed:markdown/canvas/syntax/timer-modifiers.md:0:bike","noteId":"markdown/canvas/syntax/timer-modifiers.md","blockId":"seed:markdown/canvas/syntax/timer-modifiers.md:0","blockContentId":"bc-bb9eaeed","effortSlug":"bike","isStatic":true,"sourcePath":"markdown/canvas/syntax/timer-modifiers.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/timers-1.md","content":"---\nsearch: hidden\ntitle: \"Countdown\"\nsubtitle: \"Explicit duration → counts down\"\nsection: timers\norder: 1\n---\n```time\n5:00 Run\n:30 Jumping Jacks\n1:30:00 Long Row\n```\n","blocks":{"seed:markdown/canvas/syntax/timers-1.md:0":{"id":"seed:markdown/canvas/syntax/timers-1.md:0","kind":"wod","from":111,"to":166,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/timers-1.md:seed:markdown/canvas/syntax/timers-1.md:0","noteId":"markdown/canvas/syntax/timers-1.md","blockId":"seed:markdown/canvas/syntax/timers-1.md:0","blockVersion":1,"sourceRevision":1,"from":111,"to":166,"position":0,"dataType":"wod","blockContentId":"bc-336d55ee","rawContent":"```time\n5:00 Run\n:30 Jumping Jacks\n1:30:00 Long Row\n```","noteTitle":"Timers 1","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/timers-1","sourcePath":"markdown/canvas/syntax/timers-1.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/timers-1.md:seed:markdown/canvas/syntax/timers-1.md:0:run","noteId":"markdown/canvas/syntax/timers-1.md","blockId":"seed:markdown/canvas/syntax/timers-1.md:0","blockContentId":"bc-336d55ee","effortSlug":"run","isStatic":true,"sourcePath":"markdown/canvas/syntax/timers-1.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/timers-1.md:seed:markdown/canvas/syntax/timers-1.md:0:jumping-jacks","noteId":"markdown/canvas/syntax/timers-1.md","blockId":"seed:markdown/canvas/syntax/timers-1.md:0","blockContentId":"bc-336d55ee","effortSlug":"jumping-jacks","isStatic":true,"sourcePath":"markdown/canvas/syntax/timers-1.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/timers-1.md:seed:markdown/canvas/syntax/timers-1.md:0:long-row","noteId":"markdown/canvas/syntax/timers-1.md","blockId":"seed:markdown/canvas/syntax/timers-1.md:0","blockContentId":"bc-336d55ee","effortSlug":"long-row","isStatic":true,"sourcePath":"markdown/canvas/syntax/timers-1.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/timers-2.md","content":"---\nsearch: hidden\ntitle: \"Count-up Override\"\nsubtitle: \"^ prefix forces count-up\"\nsection: timers\norder: 2\n---\n```time\n^5:00 Row\n```\n","blocks":{"seed:markdown/canvas/syntax/timers-2.md:0":{"id":"seed:markdown/canvas/syntax/timers-2.md:0","kind":"wod","from":112,"to":133,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/timers-2.md:seed:markdown/canvas/syntax/timers-2.md:0","noteId":"markdown/canvas/syntax/timers-2.md","blockId":"seed:markdown/canvas/syntax/timers-2.md:0","blockVersion":1,"sourceRevision":1,"from":112,"to":133,"position":0,"dataType":"wod","blockContentId":"bc-cc7a397a","rawContent":"```time\n^5:00 Row\n```","noteTitle":"Timers 2","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/timers-2","sourcePath":"markdown/canvas/syntax/timers-2.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/timers-2.md:seed:markdown/canvas/syntax/timers-2.md:0:row","noteId":"markdown/canvas/syntax/timers-2.md","blockId":"seed:markdown/canvas/syntax/timers-2.md:0","blockContentId":"bc-cc7a397a","effortSlug":"row","isStatic":true,"sourcePath":"markdown/canvas/syntax/timers-2.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/timers-3.md","content":"---\nsearch: hidden\ntitle: \"Collectible Timer\"\nsubtitle: \":? records the actual time taken\"\nsection: timers\norder: 3\n---\n```time\n:? Max Effort Pushups\n:? 1 Mile Run\n```\n","blocks":{"seed:markdown/canvas/syntax/timers-3.md:0":{"id":"seed:markdown/canvas/syntax/timers-3.md:0","kind":"wod","from":120,"to":167,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/timers-3.md:seed:markdown/canvas/syntax/timers-3.md:0","noteId":"markdown/canvas/syntax/timers-3.md","blockId":"seed:markdown/canvas/syntax/timers-3.md:0","blockVersion":1,"sourceRevision":1,"from":120,"to":167,"position":0,"dataType":"wod","blockContentId":"bc-5f7c6c9a","rawContent":"```time\n:? Max Effort Pushups\n:? 1 Mile Run\n```","noteTitle":"Timers 3","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/timers-3","sourcePath":"markdown/canvas/syntax/timers-3.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/timers-3.md:seed:markdown/canvas/syntax/timers-3.md:0:max-effort-pushups","noteId":"markdown/canvas/syntax/timers-3.md","blockId":"seed:markdown/canvas/syntax/timers-3.md:0","blockContentId":"bc-5f7c6c9a","effortSlug":"max-effort-pushups","isStatic":true,"sourcePath":"markdown/canvas/syntax/timers-3.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/timers-3.md:seed:markdown/canvas/syntax/timers-3.md:0:run","noteId":"markdown/canvas/syntax/timers-3.md","blockId":"seed:markdown/canvas/syntax/timers-3.md:0","blockContentId":"bc-5f7c6c9a","effortSlug":"run","isStatic":true,"sourcePath":"markdown/canvas/syntax/timers-3.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/timers-4.md","content":"---\nsearch: hidden\ntitle: \"Rest Marker\"\nsubtitle: \"* marks an explicit rest period\"\nsection: timers\norder: 4\n---\n```time\n(5 Sets)\n 5 Back Squat 185lb\n *3:00 Rest\n```\n","blocks":{"seed:markdown/canvas/syntax/timers-4.md:0":{"id":"seed:markdown/canvas/syntax/timers-4.md:0","kind":"wod","from":113,"to":167,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/timers-4.md:seed:markdown/canvas/syntax/timers-4.md:0","noteId":"markdown/canvas/syntax/timers-4.md","blockId":"seed:markdown/canvas/syntax/timers-4.md:0","blockVersion":1,"sourceRevision":1,"from":113,"to":167,"position":0,"dataType":"wod","blockContentId":"bc-cdd49e27","rawContent":"```time\n(5 Sets)\n 5 Back Squat 185lb\n *3:00 Rest\n```","noteTitle":"Timers 4","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/timers-4","sourcePath":"markdown/canvas/syntax/timers-4.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/timers-4.md:seed:markdown/canvas/syntax/timers-4.md:0:back-squat","noteId":"markdown/canvas/syntax/timers-4.md","blockId":"seed:markdown/canvas/syntax/timers-4.md:0","blockContentId":"bc-cdd49e27","effortSlug":"back-squat","isStatic":true,"sourcePath":"markdown/canvas/syntax/timers-4.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/timers-5.md","content":"---\nsearch: hidden\ntitle: \"No Timer\"\nsubtitle: \"Stopwatch mode — just track reps\"\nsection: timers\norder: 5\n---\n```time\n10 Pushups\n15 Situps\n20 Air Squats\n```\n","blocks":{"seed:markdown/canvas/syntax/timers-5.md:0":{"id":"seed:markdown/canvas/syntax/timers-5.md:0","kind":"wod","from":111,"to":157,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/timers-5.md:seed:markdown/canvas/syntax/timers-5.md:0","noteId":"markdown/canvas/syntax/timers-5.md","blockId":"seed:markdown/canvas/syntax/timers-5.md:0","blockVersion":1,"sourceRevision":1,"from":111,"to":157,"position":0,"dataType":"wod","blockContentId":"bc-272bc1cf","rawContent":"```time\n10 Pushups\n15 Situps\n20 Air Squats\n```","noteTitle":"Timers 5","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/timers-5","sourcePath":"markdown/canvas/syntax/timers-5.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/timers-5.md:seed:markdown/canvas/syntax/timers-5.md:0:pushups","noteId":"markdown/canvas/syntax/timers-5.md","blockId":"seed:markdown/canvas/syntax/timers-5.md:0","blockContentId":"bc-272bc1cf","effortSlug":"pushups","isStatic":true,"sourcePath":"markdown/canvas/syntax/timers-5.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/timers-5.md:seed:markdown/canvas/syntax/timers-5.md:0:situps","noteId":"markdown/canvas/syntax/timers-5.md","blockId":"seed:markdown/canvas/syntax/timers-5.md:0","blockContentId":"bc-272bc1cf","effortSlug":"situps","isStatic":true,"sourcePath":"markdown/canvas/syntax/timers-5.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/timers-5.md:seed:markdown/canvas/syntax/timers-5.md:0:air-squats","noteId":"markdown/canvas/syntax/timers-5.md","blockId":"seed:markdown/canvas/syntax/timers-5.md:0","blockContentId":"bc-272bc1cf","effortSlug":"air-squats","isStatic":true,"sourcePath":"markdown/canvas/syntax/timers-5.md","createdAt":1792027033000}]},{"path":"markdown/canvas/syntax/timers-rest.md","content":"---\nsearch: hidden\ntitle: \"Timers and Rest\"\nsubtitle: \"Countdowns, movement lines, and forced rest\"\nsection: timers\norder: 6\n---\n```time\n5:00 Run\n*:30 Rest\n10 Burpees\n```\n","blocks":{"seed:markdown/canvas/syntax/timers-rest.md:0":{"id":"seed:markdown/canvas/syntax/timers-rest.md:0","kind":"wod","from":129,"to":170,"sourceRevision":1,"version":1,"dialect":"time"}},"blockIndex":[{"id":"markdown/canvas/syntax/timers-rest.md:seed:markdown/canvas/syntax/timers-rest.md:0","noteId":"markdown/canvas/syntax/timers-rest.md","blockId":"seed:markdown/canvas/syntax/timers-rest.md:0","blockVersion":1,"sourceRevision":1,"from":129,"to":170,"position":0,"dataType":"wod","blockContentId":"bc-88699fb3","rawContent":"```time\n5:00 Run\n*:30 Rest\n10 Burpees\n```","noteTitle":"Timers Rest","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:syntax/timers-rest","sourcePath":"markdown/canvas/syntax/timers-rest.md"}],"blockEfforts":[{"id":"markdown/canvas/syntax/timers-rest.md:seed:markdown/canvas/syntax/timers-rest.md:0:run","noteId":"markdown/canvas/syntax/timers-rest.md","blockId":"seed:markdown/canvas/syntax/timers-rest.md:0","blockContentId":"bc-88699fb3","effortSlug":"run","isStatic":true,"sourcePath":"markdown/canvas/syntax/timers-rest.md","createdAt":1792027033000},{"id":"markdown/canvas/syntax/timers-rest.md:seed:markdown/canvas/syntax/timers-rest.md:0:burpees","noteId":"markdown/canvas/syntax/timers-rest.md","blockId":"seed:markdown/canvas/syntax/timers-rest.md:0","blockContentId":"bc-88699fb3","effortSlug":"burpees","isStatic":true,"sourcePath":"markdown/canvas/syntax/timers-rest.md","createdAt":1792027033000}]},{"path":"markdown/canvas/wql-presets/aggregate-by-effort.md","content":"# Query sandbox\n\n```query\nsum:totalVolume{} by {effort} last 6w\n```\n","blocks":{"seed:markdown/canvas/wql-presets/aggregate-by-effort.md:0":{"id":"seed:markdown/canvas/wql-presets/aggregate-by-effort.md:0","kind":"query","from":17,"to":67,"sourceRevision":1,"version":1}},"blockIndex":[{"id":"markdown/canvas/wql-presets/aggregate-by-effort.md:seed:markdown/canvas/wql-presets/aggregate-by-effort.md:0","noteId":"markdown/canvas/wql-presets/aggregate-by-effort.md","blockId":"seed:markdown/canvas/wql-presets/aggregate-by-effort.md:0","blockVersion":1,"sourceRevision":1,"from":17,"to":67,"position":0,"dataType":"query","rawContent":"```query\nsum:totalVolume{} by {effort} last 6w\n```","noteTitle":"Aggregate by Effort","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:wql-presets/aggregate-by-effort","sourcePath":"markdown/canvas/wql-presets/aggregate-by-effort.md"}],"blockEfforts":[]},{"path":"markdown/canvas/wql-presets/aggregate-by-week.md","content":"# Query sandbox\n\n```query\nsum:totalVolume{discipline:strength} by {week} last 6w\n```\n","blocks":{"seed:markdown/canvas/wql-presets/aggregate-by-week.md:0":{"id":"seed:markdown/canvas/wql-presets/aggregate-by-week.md:0","kind":"query","from":17,"to":84,"sourceRevision":1,"version":1}},"blockIndex":[{"id":"markdown/canvas/wql-presets/aggregate-by-week.md:seed:markdown/canvas/wql-presets/aggregate-by-week.md:0","noteId":"markdown/canvas/wql-presets/aggregate-by-week.md","blockId":"seed:markdown/canvas/wql-presets/aggregate-by-week.md:0","blockVersion":1,"sourceRevision":1,"from":17,"to":84,"position":0,"dataType":"query","rawContent":"```query\nsum:totalVolume{discipline:strength} by {week} last 6w\n```","noteTitle":"Aggregate by Week","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:wql-presets/aggregate-by-week","sourcePath":"markdown/canvas/wql-presets/aggregate-by-week.md"}],"blockEfforts":[]},{"path":"markdown/canvas/wql-presets/content-fran.md","content":"# Query sandbox\n\n```query\n:block{text:fran,source:feeds}\n```\n","blocks":{"seed:markdown/canvas/wql-presets/content-fran.md:0":{"id":"seed:markdown/canvas/wql-presets/content-fran.md:0","kind":"query","from":17,"to":60,"sourceRevision":1,"version":1}},"blockIndex":[{"id":"markdown/canvas/wql-presets/content-fran.md:seed:markdown/canvas/wql-presets/content-fran.md:0","noteId":"markdown/canvas/wql-presets/content-fran.md","blockId":"seed:markdown/canvas/wql-presets/content-fran.md:0","blockVersion":1,"sourceRevision":1,"from":17,"to":60,"position":0,"dataType":"query","rawContent":"```query\n:block{text:fran,source:feeds}\n```","noteTitle":"Content Fran","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:wql-presets/content-fran","sourcePath":"markdown/canvas/wql-presets/content-fran.md"}],"blockEfforts":[]},{"path":"markdown/canvas/wql-presets/filter-combos.md","content":"# Query sandbox\n\n```query\nsum:totalVolume{!discipline:recovery, intensity:high} by {week} last 8w\n```\n","blocks":{"seed:markdown/canvas/wql-presets/filter-combos.md:0":{"id":"seed:markdown/canvas/wql-presets/filter-combos.md:0","kind":"query","from":17,"to":101,"sourceRevision":1,"version":1}},"blockIndex":[{"id":"markdown/canvas/wql-presets/filter-combos.md:seed:markdown/canvas/wql-presets/filter-combos.md:0","noteId":"markdown/canvas/wql-presets/filter-combos.md","blockId":"seed:markdown/canvas/wql-presets/filter-combos.md:0","blockVersion":1,"sourceRevision":1,"from":17,"to":101,"position":0,"dataType":"query","rawContent":"```query\nsum:totalVolume{!discipline:recovery, intensity:high} by {week} last 8w\n```","noteTitle":"Filter Combos","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:wql-presets/filter-combos","sourcePath":"markdown/canvas/wql-presets/filter-combos.md"}],"blockEfforts":[]},{"path":"markdown/canvas/wql-presets/pipes-limit.md","content":"# Query sandbox\n\n```query\n:note{tags:pr,source:journal} last 8w | limit 5\n```\n","blocks":{"seed:markdown/canvas/wql-presets/pipes-limit.md:0":{"id":"seed:markdown/canvas/wql-presets/pipes-limit.md:0","kind":"query","from":17,"to":77,"sourceRevision":1,"version":1}},"blockIndex":[{"id":"markdown/canvas/wql-presets/pipes-limit.md:seed:markdown/canvas/wql-presets/pipes-limit.md:0","noteId":"markdown/canvas/wql-presets/pipes-limit.md","blockId":"seed:markdown/canvas/wql-presets/pipes-limit.md:0","blockVersion":1,"sourceRevision":1,"from":17,"to":77,"position":0,"dataType":"query","rawContent":"```query\n:note{tags:pr,source:journal} last 8w | limit 5\n```","noteTitle":"Pipes Limit","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:wql-presets/pipes-limit","sourcePath":"markdown/canvas/wql-presets/pipes-limit.md"}],"blockEfforts":[]},{"path":"markdown/canvas/wql-presets/session-rpe.md","content":"# Query sandbox\n\n```query\navg:session-rpe{} by {week} last 8w\n```\n","blocks":{"seed:markdown/canvas/wql-presets/session-rpe.md:0":{"id":"seed:markdown/canvas/wql-presets/session-rpe.md:0","kind":"query","from":17,"to":65,"sourceRevision":1,"version":1}},"blockIndex":[{"id":"markdown/canvas/wql-presets/session-rpe.md:seed:markdown/canvas/wql-presets/session-rpe.md:0","noteId":"markdown/canvas/wql-presets/session-rpe.md","blockId":"seed:markdown/canvas/wql-presets/session-rpe.md:0","blockVersion":1,"sourceRevision":1,"from":17,"to":65,"position":0,"dataType":"query","rawContent":"```query\navg:session-rpe{} by {week} last 8w\n```","noteTitle":"Session Rpe","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:wql-presets/session-rpe","sourcePath":"markdown/canvas/wql-presets/session-rpe.md"}],"blockEfforts":[]},{"path":"markdown/canvas/wql-presets/source-journal.md","content":"# Query sandbox\n\n```query\n:note{tags:pr,source:journal} last 8w\n```\n","blocks":{"seed:markdown/canvas/wql-presets/source-journal.md:0":{"id":"seed:markdown/canvas/wql-presets/source-journal.md:0","kind":"query","from":17,"to":67,"sourceRevision":1,"version":1}},"blockIndex":[{"id":"markdown/canvas/wql-presets/source-journal.md:seed:markdown/canvas/wql-presets/source-journal.md:0","noteId":"markdown/canvas/wql-presets/source-journal.md","blockId":"seed:markdown/canvas/wql-presets/source-journal.md:0","blockVersion":1,"sourceRevision":1,"from":17,"to":67,"position":0,"dataType":"query","rawContent":"```query\n:note{tags:pr,source:journal} last 8w\n```","noteTitle":"Source Journal","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:wql-presets/source-journal","sourcePath":"markdown/canvas/wql-presets/source-journal.md"}],"blockEfforts":[]},{"path":"markdown/canvas/wql-presets/tis-trend.md","content":"# Query sandbox\n\n```query\navg:tis{} by {week} last 8w\n```\n","blocks":{"seed:markdown/canvas/wql-presets/tis-trend.md:0":{"id":"seed:markdown/canvas/wql-presets/tis-trend.md:0","kind":"query","from":17,"to":57,"sourceRevision":1,"version":1}},"blockIndex":[{"id":"markdown/canvas/wql-presets/tis-trend.md:seed:markdown/canvas/wql-presets/tis-trend.md:0","noteId":"markdown/canvas/wql-presets/tis-trend.md","blockId":"seed:markdown/canvas/wql-presets/tis-trend.md:0","blockVersion":1,"sourceRevision":1,"from":17,"to":57,"position":0,"dataType":"query","rawContent":"```query\navg:tis{} by {week} last 8w\n```","noteTitle":"Tis Trend","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:wql-presets/tis-trend","sourcePath":"markdown/canvas/wql-presets/tis-trend.md"}],"blockEfforts":[]},{"path":"markdown/canvas/wql-presets/where-join.md","content":"# Query sandbox\n\n```query\n:note{tags:pr,source:journal} last 8w where sum:totalVolume{} > 5000\n```\n","blocks":{"seed:markdown/canvas/wql-presets/where-join.md:0":{"id":"seed:markdown/canvas/wql-presets/where-join.md:0","kind":"query","from":17,"to":98,"sourceRevision":1,"version":1}},"blockIndex":[{"id":"markdown/canvas/wql-presets/where-join.md:seed:markdown/canvas/wql-presets/where-join.md:0","noteId":"markdown/canvas/wql-presets/where-join.md","blockId":"seed:markdown/canvas/wql-presets/where-join.md:0","blockVersion":1,"sourceRevision":1,"from":17,"to":98,"position":0,"dataType":"query","rawContent":"```query\n:note{tags:pr,source:journal} last 8w where sum:totalVolume{} > 5000\n```","noteTitle":"Where Join","createdAt":1792027033000,"isStatic":true,"sourceId":"guides:wql-presets/where-join","sourcePath":"markdown/canvas/wql-presets/where-join.md"}],"blockEfforts":[]}]
|