Current

deksample talk · 6 min

スライドを、
エージェントに任せる

画面が見えないエージェントでも、ひとりでループを回せる。そのための三つの約束。

測って返す 小さなファイル lint が止めどき

agent session · decks/with-agents

running

you

script.md のとおりにスライドを作って。はみ出しがないかも、確かめておいて。

agent

13 枚書いて、描画して測りました。エラーはありません。

$ dekc lint with-agents --visual
no diagnostics

dek sample · 2026.09.25

Problem

エージェントがスライドでつまずく、三つの理由

blind

画面が見えない

HTML は正しくても、描画すると文字が枠からはみ出す。書いた本人には、それが見えない。

huge file

ファイルが大きすぎる

資料全体がひとつのファイル。一枚を直すのに全体を読み、関係ないところまで崩す。

いい感じにして

これで完成…?

no finish line

終わりがわからない

どこまでやれば完成か、決まっていない。エージェントには止めどきがない。

スライドを、エージェントに任せる

Answer

dek の答えは、三つの約束

三つのつまずきに、ひとつずつ約束で答える。

画面が見えない

描画して、数字で返す

dekc lint --visual

measured verdicts

画面は、数字で返す

はみ出しとコントラストを、ブラウザで測って診断にする。

ファイルが大きすぎる

一枚を、一ファイルに

slides/<id>.html

small files

一枚は、小さなファイル

読むのも直すのも、その一枚と、使っている規則だけ。

終わりがわからない

エラーがなければ止める

no diagnostics

lint = stop

止めどきは、lint が決める

規約はすべて lint のルール。測れる問題がなくなったら、人に渡す。

スライドを、エージェントに任せる

Promise 1 · measured verdicts

画面は、数字で返す

slides/how-it-works.html · 1280 × 720

rendered
はみ出したリストのスライド

枠の外 · bottom 69px

ブラウザで描画して、枠の外に出た量を測る。スクリーンショットでは、この 69px は写らない。

terminal

1 error
$ dekc lint --visual --json
{ "ok": false, "error": { … }, "diagnostics": [ {
  "id": "DEK030",
  "severity": "error",
  "message": "ul \"One heading, one slide O…\" overflows the bottom edge by 69px at steps slides, beats",
  "path": "slides/how-it-works.html",
  "slug": "how-it-works",
  "hint": "cut it, split it across beats or slides, or give it a smaller size in slides/how-it-works.css",
  "data": {
    "box": "ul",
    "text": "One heading, one slide One beat, one pause …",
    "edges": { "bottom": 69 },
    "steps": ["slides", "beats"]
  }
} ] }

スライドを、エージェントに任せる

Promise 2 · small files

一枚は、小さなファイル

decks/with-agents/slides/

wc -l
  • htmlcover.html24
  • htmlwhy.html40
  • htmlanswer.html38
  • htmlmeasure.html33
  • htmlsmall.html44
  • csssmall.css119
  • tssmall.ts23
  • htmldone.html38
  • htmlloop.html47
  • … ほか 6 枚最長 52 行

terminal

ok
$ dekc show small --json
{
  "ok": true,
  "slug": "small",
  "title": "一枚は、小さなファイル",
  "script": "## 一枚は、小さなファイル {#small}\n\nスライドは…",
  "beats": [{ "id": "small-show", … }],
  "html": "<section class=\"slide\" data-layout…",
  "css": "/* The slide's own files on the left…",
  "ts": "// The dekc show panel slides in…",
  "theme": ".slide {\n  --fg: #0f172a;…",
  "assets": []
}

theme.css 全体600 行

show が返す規則294 行

スライドを、エージェントに任せる

Promise 3 · lint = stop

止めどきは、lint が決める

dek の規約は、すべて lint のルール。エラーがなければ、全体を一枚に並べて釣り合いを見て、止める。判断できなかったことは人に渡す。

  • 使ってよいクラス class="headline" DEK010
  • 色の指定のしかた color: #333 DEK014
  • 画像の置き場所 src="https://…" DEK020

terminal

exit 0
$ dekc lint with-agents --visual
no diagnostics
$ dekc shot with-agents --sheet
…/.cache/shots/sheets/…/sheet-1.png

止める

同じコマンドが、CI でも、エージェントでも、人の手元でも同じ答えを返す。

human=agent=CI

スライドを、エージェントに任せる

The loop

一往復で、
書いて、見て、直す

01書く

02確かめる

03直す

dekc check ok: true

slides/how-it-works.html

01 write
<section class="slide" data-layout="default">
  <h2 class="slide-title">How this file becomes slides</h2>
  <ul>
    <li data-step="slides">One heading, one slide</li>
    … 16 more <li>

terminal

02 check · 1 error
$ dekc check how-it-works --shot --json
{ "ok": false, …
  "diagnostics": [{ "id": "DEK030", … "bottom": 69 … }],
  "shot": "…/.cache/shots/how-it-works~beats.b8fd120c.png" }

agent

03 fix · 0 errors

hint は “cut it”。リストを 3 項目削って、もう一度確かめます。

$ dekc check how-it-works --shot --json
{ "ok": true, "slug": "how-it-works", "diagnostics": [],
  "shot": "…/.cache/shots/how-it-works~beats.75435466.png" }

スライドを、エージェントに任せる

Errors

失敗しても、次の一手を返す

ok: false何が起きたかと、次のコマンド

terminal

$ dekc show nope --json
{
  "ok": false,
  "error": {
    "message": "section \"nope\" not found",
    "path": "script.md",
    "hint": "did you mean `done`? run `dekc ls` for every slide"
  }
}

hint はそのまま実行できるコマンド。エージェントは、次に何をすればよいか迷わない。

skipped測れなかった検査は、合格にしない

terminal

$ dekc check how-it-works --voice --json
{
  "ok": true, "slug": "how-it-works", "diagnostics": [],
  "skipped": [{
    "check": "voice",
    "reason": "the deck has no voice/voice.toml",
    "hint": "create voice/voice.toml in the deck with a speaker, …"
  }]
}

声の検査は飛ばしたと明記される。飛ばした検査を、合格と取り違えることはない。

スライドを、エージェントに任せる

Pointing

指さしは、両方向

you · ブラウザで発表中

127.0.0.1:4987 · demo

3 / 4

The clock

このスライドの図を、小さくして

dekc current

dekc goto

agent · 同じプロジェクトで

terminal

$ dekc current
timing
$ dekc current --json
{"ok":true,"slug":"timing","slideIndex":2,"beatIndex":0,
 "viewers":1}

# slides/timing.html を直す

$ dekc goto timing
timing

直しました。いま、そのスライドを開いています。

スライドを、エージェントに任せる

Annotate

矢印一本まで、指して頼む

you · 開発サーバで a

127.0.0.1:4790 · plan

1 / 1

10

11

12

1

デザイン

開発

リリース

画面デザイン

デザインレビュー

要件整理

試作

本実装

リリース準備

段階リリース

12

agent · 貼られた注釈を読む

agent session

2 notes
## Notes on decks/plan
…
1. span.arrow.a2 at …/schedule.html:19:5 (box 980,412 10×100)
   > 矢じりをもう少し大きく

2. 2 elements:
   - p.chevron.c2 "デザインレビュー" at …/schedule.html:12:5 …
   - p.chevron.c1 "画面デザイン" at …/schedule.html:11:5 …
   > 右端を揃えて

To see it: `dekc shot plan schedule --step 0`

19 行目の矢印と、11・12 行目の矢羽を直して、shot で確かめます。

スライドを、エージェントに任せる

Refs

お手本は、よその発表から

terminal

pinned
$ dekc ref hajimism/dek/why-dek
pinned hajimism/dek/why-dek at bcf1db9
read it with `dekc ls hajimism/dek/why-dek` and `dekc show hajimism/dek/why-dek <slug>`

$ dekc ref --json
{ "ok": true, "action": "list", "refs": [{
  "name": "hajimism/dek/why-dek",
  "rev": "bcf1db9d7c42e52bad9126dc3b6633372383792d",
  "fetched": true,
  "title": "喋る順に、スライドを組み立てる",
  "slides": 14
}] }

dek.toml

[refs]
"hajimism/dek/why-dek" = "bcf1db9d7c42e52bad9126dc3b6633372383792d"

あの発表の、尺のグラフみたいに作って

dekc show hajimism/dek/why-dek timing

read-only
why-dek の timing スライド。尺の見積もりを棒グラフで示している

timing を読みました。このデッキのテーマで書き直します。

スライドを、エージェントに任せる

Setup

準備は、何もいらない

  • 専用のサーバ不要
  • ツールの定義不要
  • エージェントごとの設定不要

47行dekc init が書く AGENTS.md

36行dekc help --agent の全文

Claude CodeCodexOpenCodeshell があれば何でも

AGENTS.md

dekc init
<!-- dek:begin (dek rewrites this block; write your own notes outside it) -->
# dek

A build system for talks. Write what you will say; dek builds, measures, and ships the rest.

## Principles

- `script.md` is the source of truth for order, script, and timing.
- Each slide is a `<section class="slide">` fragment.
- Conventions are enforced by lint. A deck is not done while
  `dekc lint --visual` fails. Passing it means nothing measurable
  is wrong, not that the deck is good.

## Conventions

- One `##` heading is one slide. HTML lives in `slides/<id>.html`.
…
For commands, run `dekc help --agent`.
<!-- dek:end -->

スライドを、エージェントに任せる

Close

任せる前に、決めることは、ひとつだけ。

何を話すか。

script.md

you
## 任せる前に、決めること {#close}

エージェントに任せる前に決めることは、ひとつだけです。何を話すか。
台本さえ書けば、…

slides/close.html

agent
$ dekc check close --shot
no diagnostics
…/decks/with-agents/.cache/shots/close~0.….png

ありがとうございました

スライドを、エージェントに任せる

sスライド一覧p発表者ビュー