# Checklist

> The self-check to run on a MakoDeck deck before handing it over: most items by reading the files, one in a browser.

Run every item; fix and re-run until all pass. Items marked **(browser)** need a browser: if you have none, say so in the handover. Then tell the person what you checked and what you couldn't.

**Format** (https://makodeck.com/ai/format.md)

1. `index.html` is at the top of the folder, and its `<html>` has `data-mako-deck` and a `lang`.
2. There is exactly one `.deck`, and every slide is a `<section class="slide …">` directly inside it with one of `slide--title`, `slide--section`, `slide--content`, `slide--closing`. Nothing else has the class `slide`, and nothing else in `<body>` shows (a header outside the `.deck`, a wrapper around a slide).
3. No navigation script, no `is-active`, no print CSS — MakoDeck runs the slides. No CSS of yours hides a `.slide` (`display`, `visibility`, `opacity`).
4. Every slide has a title (`aria-labelledby` pointing at its heading's `id`), and speaker notes are in `<aside class="notes">` where the talk needs them.
5. The `#mako-manifest`, if present, is valid JSON inside `<script type="application/json">`, with `dataAsOf` as `YYYY-MM-DD`.

**Content**

6. List every number on the slides with where it comes from: a line of the brief, or arithmetic on the brief's numbers. Delete every number whose source is anything else ("estimated", "distributed", "for the layout"), and every name, date or source you made up. Sample content is labelled "Fictional example" on the slide, recommendations the brief didn't give "Draft for discussion", and every assumption is listed for the handover.
7. Data slides name their source and date.

**Files and paths** (https://makodeck.com/ai/packaging.md)

8. Every `src`, `href`, `url(…)`, `fetch(…)` and `import` path is relative and names a file that exists in the folder, spelled exactly (capitals included).
9. Relative paths only: none starts with `/`, `file:` or a drive letter (a `/path` in HTML or CSS is rewritten when that file is in the upload, but a script's `fetch()` or `import` of a `/…` path never loads); no file or folder name contains `%`, `?`, `#`, a backslash or an invisible character (zero-width, bidi or tag); no two names differ only in case.
10. Nothing the deck loads comes from an `http://` or `https://` URL: no CDN scripts, stylesheets, images, fonts or API calls. Only `<a href>` links, `xmlns` attributes and a Google Fonts `<link>` may name another site.
11. Site libraries are loaded from `_mako/lib/…` exactly as listed in https://makodeck.com/ai/interactive.md, and there is no top-level `_mako/` folder of your own.
12. Every file is an allowed type, images are at most 3840 px on the long edge, and the total is well under the limits.

**Fonts and brand** (https://makodeck.com/ai/brand-and-design.md)

13. The brand fonts are first in `--brand-font` and `--brand-heading-font` (and every other `font-family` list), and each is Inter, a Google Fonts family, a workspace font (named exactly), or bundled with `@font-face` and a relative `url()` to a file that exists — with its licence file.
14. No `@font-face` uses only `local()`, and no font comes from a URL on another site. A `data:` font works but is moved into a file, with a `font_externalized` warning: bundle the font as a file instead.
15. `--brand-accent-strong` and every other text colour reach 4.5:1 on their backgrounds (compute it from the token values); chart marks and icons that carry meaning reach 3:1; every status is written as a word.
16. Every chart has a text alternative (`<title>` and `<desc>`, or an `aria-label`), and every `<img>` has `alt`. No invented logo.

**In a browser** — with `mako-preview.js` first in `<head>` (https://makodeck.com/ai/interactive.md), serve the folder and open it in a 1920×1080 window

17. **(browser)** Nothing overflows a slide and no text is under 18px (body text at least 20px). Paste this into the console; it steps through every slide and lists offenders (a few pixels of glyph overshoot are ignored; check SVG text sizes by eye):

```js
await __mako.ready;
for (const [i, s] of [...document.querySelector(".deck").querySelectorAll(".slide")].entries()) {
  await __mako.goto(i);
  const box = s.getBoundingClientRect(), overflow = [], small = [];
  for (const el of s.querySelectorAll("*")) {
    const r = el.getBoundingClientRect();
    if (!r.width || !r.height) continue;
    if (r.left < box.left - 1 || r.top < box.top - 1 || r.right > box.right + 1 || r.bottom > box.bottom + 1
      || el.scrollHeight > el.clientHeight + 12 || el.scrollWidth > el.clientWidth + 12) overflow.push(el);
    if ([...el.childNodes].some((n) => n.nodeType === 3 && n.textContent.trim()) && parseFloat(getComputedStyle(el).fontSize) < 18) small.push(el);
  }
  console.log(`slide ${i + 1}`, { overflow, small });
}
```

**Code and safety** (https://makodeck.com/ai/sandbox.md)

18. Code-drawn slides use `Mako.onSlide`, draw their final state at once when `still` is true, finish drawing within about 3 seconds, and use `ctx.random()` rather than `Math.random`. Any preview-only `_mako/` copy is deleted.
19. Widgets are marked `data-interactive` on their whole container; there are no forms that submit, pop-ups, `alert`s, or links to other HTML files of the deck.
20. No secrets, keys, passwords, personal data or private notes anywhere in the folder — code and comments included.

**The ZIP** (https://makodeck.com/ai/workflow.md)

21. `unzip -l deck.zip` shows `index.html` with no folder in front of it and every file the deck uses. Frozen data files the deck loads (JSON, CSV) are fine; private working files — spreadsheets you worked from, notes, drafts, `.env` files — are not.
