blind
画面が見えない
HTML は正しくても、描画すると文字が枠からはみ出す。書いた本人には、それが見えない。
deksample talk · 6 min
画面が見えないエージェントでも、ひとりでループを回せる。そのための三つの約束。
測って返す 小さなファイル lint が止めどき
agent session · decks/with-agents
runningyou
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
三つのつまずきに、ひとつずつ約束で答える。
画面が見えない
描画して、数字で返す
dekc lint --visual
measured verdicts
はみ出しとコントラストを、ブラウザで測って診断にする。
ファイルが大きすぎる
一枚を、一ファイルに
slides/<id>.html
small files
読むのも直すのも、その一枚と、使っている規則だけ。
終わりがわからない
エラーがなければ止める
no diagnostics
lint = stop
規約はすべて 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 -lterminal
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
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 errorshint は “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 / 4The 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 / 110
11
12
1
デザイン
開発
リリース
画面デザイン
デザインレビュー
要件整理
試作
本実装
リリース準備
段階リリース
section.slide › div.plan › p.chevron.c2
p.chevron.c2 "デザインレビュー" :12
p.chevron.c1 "画面デザイン" :11
右端を揃えて
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-onlytiming を読みました。このデッキのテーマで書き直します。
スライドを、エージェントに任せる
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
ありがとうございました
スライドを、エージェントに任せる