Plannotator Visual Explainer
backnotprop/plannotator
Builds self-contained HTML explainers for plans, pull requests and technical concepts in Plannotator's theme, then opens them in its annotation view.
HTMLを最終成果物として生成・検証・プレビューしたい時に使う共通レンダラー。Use this shared renderer when the user wants content turned into a final, validated, previewable HTML artifact.
$ npx skills add u-ichi/reviewable-html-workbench --skill visual-html-renderer -a claude-codeProject install by default; add -g for ~/.claude/skills/.
$ gh skill install u-ichi/reviewable-html-workbench visual-html-renderer --agent claude-codeProject scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).
$ git clone --depth 1 https://github.com/u-ichi/reviewable-html-workbench.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/visual-html-renderer .claude/skills/visual-html-renderer && rm -rf skills-srcUse ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.
Claude Code skills documentation · loads skills from .claude/skills/
Install the "visual-html-renderer" agent skill from https://github.com/u-ichi/reviewable-html-workbench/tree/main/skills/visual-html-renderer into .claude/skills/visual-html-renderer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "visual-html-renderer", then confirm the skill loads.Claude Code copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$skill-installer install https://github.com/u-ichi/reviewable-html-workbench/tree/main/skills/visual-html-rendererType this inside Codex. $skill-installer <name> installs a curated skill from openai/skills. The installer writes to $CODEX_HOME/skills (default ~/.codex/skills). Restart Codex if the skill does not show up.
$ npx skills add u-ichi/reviewable-html-workbench --skill visual-html-renderer -a codexProject install goes to .agents/skills/; add -g for ~/.codex/skills/.
$ gh skill install u-ichi/reviewable-html-workbench visual-html-renderer --agent codexProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/u-ichi/reviewable-html-workbench.git skills-src && mkdir -p .agents/skills && cp -r skills-src/skills/visual-html-renderer .agents/skills/visual-html-renderer && rm -rf skills-srcUse ~/.agents/skills/ instead of .agents/skills for a personal install.
Codex skills documentation · loads skills from .agents/skills/
Install the "visual-html-renderer" agent skill from https://github.com/u-ichi/reviewable-html-workbench/tree/main/skills/visual-html-renderer into .agents/skills/visual-html-renderer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "visual-html-renderer", then confirm the skill loads.Codex copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add u-ichi/reviewable-html-workbench --skill visual-html-renderer -a cursorProject install goes to .agents/skills/; add -g for ~/.cursor/skills/.
$ gh skill install u-ichi/reviewable-html-workbench visual-html-renderer --agent cursorProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/u-ichi/reviewable-html-workbench.git skills-src && mkdir -p .cursor/skills && cp -r skills-src/skills/visual-html-renderer .cursor/skills/visual-html-renderer && rm -rf skills-srcUse ~/.cursor/skills/ instead of .cursor/skills for a personal install.
Cursor skills documentation · loads skills from .cursor/skills/, .agents/skills/, .claude/skills/, .codex/skills/
Install the "visual-html-renderer" agent skill from https://github.com/u-ichi/reviewable-html-workbench/tree/main/skills/visual-html-renderer into .cursor/skills/visual-html-renderer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "visual-html-renderer", then confirm the skill loads.Cursor copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gemini skills install https://github.com/u-ichi/reviewable-html-workbench.git --path skills/visual-html-renderer--scope user (default) or --scope workspace; --path is the subfolder of the repo that holds the skill; --consent skips the security confirmation prompt.
$ npx skills add u-ichi/reviewable-html-workbench --skill visual-html-renderer -a gemini-cliProject install goes to .agents/skills/; add -g for ~/.gemini/skills/.
$ gh skill install u-ichi/reviewable-html-workbench visual-html-renderer --agent gemini-cliProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/u-ichi/reviewable-html-workbench.git skills-src && mkdir -p .gemini/skills && cp -r skills-src/skills/visual-html-renderer .gemini/skills/visual-html-renderer && rm -rf skills-srcUse ~/.gemini/skills/ instead of .gemini/skills for a personal install, then run /skills reload.
Gemini CLI skills documentation · loads skills from .gemini/skills/, .agents/skills/
Install the "visual-html-renderer" agent skill from https://github.com/u-ichi/reviewable-html-workbench/tree/main/skills/visual-html-renderer into .gemini/skills/visual-html-renderer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "visual-html-renderer", then confirm the skill loads.Gemini CLI copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ gh skill install u-ichi/reviewable-html-workbench visual-html-rendererInstalls for Copilot at project scope by default; add --scope user for a personal install. Preview a skill first with gh skill preview. Needs GitHub CLI 2.90.0 or later (public preview).
$ npx skills add u-ichi/reviewable-html-workbench --skill visual-html-renderer -a github-copilotProject install goes to .agents/skills/; add -g for ~/.copilot/skills/.
$ git clone --depth 1 https://github.com/u-ichi/reviewable-html-workbench.git skills-src && mkdir -p .github/skills && cp -r skills-src/skills/visual-html-renderer .github/skills/visual-html-renderer && rm -rf skills-srcUse ~/.copilot/skills/ instead of .github/skills for a personal install. Commit .github/skills so cloud agent and code review can use it.
GitHub Copilot skills documentation · loads skills from .github/skills/, .claude/skills/, .agents/skills/
Install the "visual-html-renderer" agent skill from https://github.com/u-ichi/reviewable-html-workbench/tree/main/skills/visual-html-renderer into .github/skills/visual-html-renderer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "visual-html-renderer", then confirm the skill loads.GitHub Copilot copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
$ npx skills add u-ichi/reviewable-html-workbench --skill visual-html-renderer -a opencodeOpenCode documents no install command of its own. Project install goes to .agents/skills/; add -g for ~/.config/opencode/skills/.
$ gh skill install u-ichi/reviewable-html-workbench visual-html-renderer --agent opencodeProject scope by default (.agents/skills/); add --scope user for a personal install.
$ git clone --depth 1 https://github.com/u-ichi/reviewable-html-workbench.git skills-src && mkdir -p .opencode/skills && cp -r skills-src/skills/visual-html-renderer .opencode/skills/visual-html-renderer && rm -rf skills-srcUse ~/.config/opencode/skills/ instead of .opencode/skills for a personal install.
OpenCode skills documentation · loads skills from .opencode/skills/, .claude/skills/, .agents/skills/
Install the "visual-html-renderer" agent skill from https://github.com/u-ichi/reviewable-html-workbench/tree/main/skills/visual-html-renderer into .opencode/skills/visual-html-renderer/ in this project. Copy the whole folder (SKILL.md and every file beside it), keep the folder name "visual-html-renderer", then confirm the skill loads.OpenCode copies the folder itself, the same result as the manual copy. Check what it changed before you commit it.
visual-html-rendererHTMLを最終成果物として生成・検証・プレビューしたい時に使う共通レンダラー。Use this shared renderer when the user wants content turned into a final, validated, previewable HTML artifact.
Visual HTML Renderer is an agent skill from u-ichi/reviewable-html-workbench. HTMLを最終成果物として生成・検証・プレビューしたい時に使う共通レンダラー。Use this shared renderer when the user wants content turned into a final, validated, previewable HTML artifact. 現行rendererの表現能力を前提にagentが文書モデルを直接設計し、表・リスト・コード・注記・図・生成画像を選んだHTML bundleとセッション限定のプレビューURLを提示する。Triggers: html出力して, HTMLにして, HTMLで出して, この内容をHTMLで出して, HTMLでプレビューして, HTMLレンダラー, HTML出力を共通化, 図示つきHTML, visual HTML renderer, render this as HTML, turn this into HTML, create an HTML preview, generate a visual HTML report, make this a reviewable HTML document, diagrammed HTML…
Its SKILL.md is about 8.7k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files (for example `agents/openai.yaml`).
It sits in Agent Workflows, covering Planning and HTML artifacts. It works with Notion and Python. The repository describes itself as: Claude Code / Codex CLI plugin for generating reviewable HTML documents with preview, inline review comments, and agent feedback ingestion. The licence is MIT.
12 steps, taken from the first numbered list in SKILL.md.
Read from SKILL.md and the folder at commit 60bde37. It shows what the files ask for, not the result of running them.
Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.
From allowed-tools in the SKILL.md frontmatter.
Shell commands in SKILL.md call:
python3makeFrom the folder's file list and the shell code blocks in SKILL.md.
Links to these hosts (documentation or services it may open):
mermaid.js.orgFrom URLs in SKILL.md, links to its own repository left out.
Names no API keys, tokens, secrets or passwords.
From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.
Visual HTML Renderer loads about 8.7k tokens when it runs. Until then it costs about 191 tokens; SKILL.md has 3,038 words of instructions outside code blocks.
Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.
The automated check found no risky patterns in SKILL.md.
Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.
The full file from u-ichi/reviewable-html-workbench at commit 60bde37, republished under its MIT licence (© u-ichi). 3,038 words, ~8,731 tokens.
.claude/skills/visual-html-renderer/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.HTML出力系skillの共通レンダラーとして、個別HTML生成ロジックを置き換える。
重い処理は scripts/html_review_workbench/ のPython実装に委譲し、このskillは入力確認、呼び出し順、ガード、検証を担当する。
Use this skill as the shared renderer for HTML-output workflows. It replaces one-off HTML generation logic with a fixed flow: understand the requested content, design the document model, run the shared CLI, validate the bundle, and return a preview URL. Heavy implementation stays in scripts/html_review_workbench/; this skill owns input handling, workflow order, gates, and verification.
Plan Mode 中の計画確認プレビューには、このskillを使わない。その場合は plan-preview を使い、一時HTML previewとして扱う。visual-html-renderer は通常の最終HTML成果物、レポート、レビュー可能な文書のbundle生成だけを担当する。
Do not use this skill for Plan Mode proposal previews. Route those requests to plan-preview; this skill is only for final HTML artifacts, reports, and reviewable document bundles.
check-model CLI、Completion receipt。Follow the language of the latest user request for progress updates, final responses, preview handoff text, and user-facing summaries. 日本語の依頼には日本語で、英語の依頼には英語で返す。入力本文や引用内容は、ユーザーが翻訳を求めない限り勝手に翻訳しない。HTML内の見出しや本文は、元資料の言語、ユーザーの指定、レビュー対象読者に合わせる。
<proposed_plan> の視覚確認、計画URLの追加が目的なら、このskillではなく plan-preview を使う。document-model.json を直接作る。build-model で source-capture draft を作ってよい。ただし draft は最終モデルではないため、そのまま render へ渡さない。document-model.json を読み返し、未再構成テキストの流し込みやrenderer非対応型の使用がないことを確認する。image.generation_status=requested のブロックがある場合は、imagegen skillで画像を生成し、attach-image CLIで文書モデルへ添付する。check-model CLIで最終render前の文書モデル品質を検査する。render CLIでHTML bundleを生成する。validate CLIでHTML、asset、comment schema、図・画像の非空を検証する。preview CLIを --mode auto で起動し、返却JSONの url と stop_command を最終応答に必ず書く。watch-comments を開始する。これによりブラウザからのコメントを自動検知できるようになる。Monitor 起動コマンド: python3 -m scripts.html_review_workbench.cli watch-comments --root <output-dir>。自前の polling スクリプトではなく、この CLI を使うこと。イベント受信後の処理は reviewable-design-doc skill の「コメント自動回答と解決待ちゲート」セクションに従う。<proposed_plan> visual check, or plan preview URL request, use plan-preview instead of this skill.document-model.json is provided, inspect the user's content or the latest artifact and design the HTML structure yourself.document-model.json directly using the renderer-supported block types.build-model only as a source-capture draft when temporary input storage is needed; never pass that draft straight to render.imagegen skill and attach images with attach-image.check-model, then render, then validate, then preview.preview --mode auto by default and include the returned url and stop_command in the final response.watch-comments immediately after preview startup so browser comments can be detected.HTML出力はテキスト変換ではなく、最終HTML bundleの情報設計として扱う。
<!-- BEGIN SHARED: md-file-prohibition -->
.md は使わない。source.txt, input.txt, source-content.txt のようなプレーンテキスト名を使う。.md やMarkdownという語をHTML出力の前提として扱わない。<!-- END SHARED: md-file-prohibition -->
現行rendererで最終HTMLに使う表現は、実装上の描画挙動に合わせて選ぶ。
| block type | rendererの扱い | contentに書くもの |
|---|---|---|
html | HTML片をそのまま挿入する | agentが設計した <p>, <table>, <ul>, <ol>, <pre><code> 等の構造化HTML |
callout | HTML escapeしてcallout表示する | 決定、注意、前提などの短いプレーンテキスト。HTMLタグは書かない |
diagram | Mermaid sourceを保存し、同梱 mermaid.js のブラウザ描画、または生成画像を表示する | diagram_source または diagram.source にMermaid v11系のsource。sourceに無い関係を画像側で追加しない |
image | 添付済み生成画像を表示する | image.prompt, image.alt, image.caption, image.source_path |
section / text / table | 専用描画なし。通常段落へescapeされる | 最終HTMLモデルでは使わない。表は html block内の <table> で表現する |
html blockはraw insertされるため、外部入力をそのまま混ぜない。入力由来の文字列はagentが意味単位へ再構成し、必要な箇所だけescape済みHTMLとして入れる。
<!-- BEGIN SHARED: html-style-classes -->
同梱の style.css には、html block 内でそのまま使える表現 class が実装済みである。比較・評価・推奨・決定がある内容では、素の <table> / <p> で終えず、該当する部品を選ぶ。
| 用途 | class | 書き方 |
|---|---|---|
| 表番号 + 表題 | table-wrap / table-cap / t-no / t-title / table-scroll | <figure class="table-wrap"><figcaption class="table-cap"><span class="t-no">表 1</span><span class="t-title">3 案の比較</span></figcaption><div class="table-scroll"><table>…</table></div></figure> |
| 表ヘッダの補助説明 | axis-sub | <th scope="col">実装量<span class="axis-sub">行数の目安</span></th> |
| 5 段階評価 | rate + good/mid/low + r1〜r5 + pips / pip | <span class="rate good r4"><span class="pips"><i class="pip"></i><i class="pip"></i><i class="pip"></i><i class="pip"></i><i class="pip"></i></span>容易</span> (pip は常に 5 個。rN が塗る数、good/mid/low が色) |
| 可否・対応状況 | tag-yes / tag-no / tag-cell-note | <td><span class="tag-yes">対応</span><span class="tag-cell-note">v2.0 以降</span></td> |
| 桁揃え数値 | num | <td><span class="num">1,024</span></td> (表中の数値列に使う) |
| 推奨パネル | reco / reco-tag | <div class="reco"><span class="reco-tag">推奨</span><p>案 B を採る。理由は…</p></div> |
| 決定の枠囲み | decision-panel | <div class="decision-panel"><p>…</p></div> |
| コード内の着色 (新規は language-* 既定) | language-* (自動) / 互換の tok-k / tok-f / tok-s / tok-c / tok-n | 新規: <pre><code class="language-python">def main():</code></pre>。手動着色 (互換): <pre><code><span class="tok-k">def</span> …</code></pre>。同梱 highlight.js が language-* を自動着色する。tok-* を含む code / pre.diff / .nohighlight は自動着色しない |
| コード差分 | pre.diff + .add / .del / .ctx | <pre class="diff"><span class="ctx"> context</span><span class="del">removed</span><span class="add">added</span></pre>。変更理由を散文で説明してから、必要な断片だけ示す |
| 用語集 | dl.glossary | <dl class="glossary"><dt>用語</dt><dd>定義</dd></dl>。文書冒頭の html block に置く。専門用語は本文で使う前に 1〜2 文で定義し、前提用語が多い文書は用語集を置く |
table.cmp)軸が 3 つ以上ある比較、または行数が多くて横スクロールが要る比較には <table class="cmp"> を使う。通常の <table> と違い、ヘッダ行と最初の列 (比較軸) がスクロール中も固定され、推奨案の列を緑で浮かせられる。
| class | 効果 |
|---|---|
cmp (table に付ける) | 比較表本体。thead th が sticky ヘッダになる。最小幅 720px のため table-scroll の中に入れる |
axis (最初の列の th / td に付ける) | 比較軸の列が横スクロール中も左端に残る |
pick (<col> / th / td に付ける) | 推奨する案の列を緑系で強調する。<colgroup><col><col class="pick"></colgroup> で列単位、または個別セルに付ける |
<figure class="table-wrap">
<figcaption class="table-cap"><span class="t-no">表 1</span><span class="t-title">3 案の比較</span></figcaption>
<div class="table-scroll">
<table class="cmp">
<colgroup><col><col><col class="pick"><col></colgroup>
<thead><tr>
<th scope="col" class="axis">評価軸</th>
<th scope="col">案 A</th><th scope="col" class="pick">案 B</th><th scope="col">案 C</th>
</tr></thead>
<tbody>
<tr><th scope="row" class="axis">実装量<span class="axis-sub">行数の目安</span></th>
<td><span class="num">40</span></td><td class="pick"><span class="num">180</span></td><td><span class="num">920</span></td></tr>
</tbody>
</table>
</div>
</figure>軸が 2 つだけ、または行が少なく横スクロールが不要な表では、cmp を使わず素の <table> にする。sticky と最小幅は狭い表では邪魔になる。
使い分けの基準:
table-wrap + table-cap で番号と表題を付ける。本文からの参照は「表 1」で行う。table.cmp + axis を使い、推奨案の列に pick を付ける。rate の点表示でも符号化する。reco または decision-panel で独立させる。reco / decision-panel / callout block のうち内容に合うものを使う。文書全体の導入は metadata.deck が担うので、節ごとに導入段落を作らない。style 属性の直書きで同等の見た目を再実装しない。metadata.palette の brand / brand_soft だけ主題に合わせて上書きできる。コントラスト比は check-model / render / validate が WCAG 4.5:1 で検査し、不足すると error で止まる (brand は最も薄い地色との比、brand_soft は本文色との比、両方指定時は 2 色の相互比も見る)。The bundled style.css ships ready-to-use presentation classes for html blocks. When the content contains comparisons, ratings, recommendations, or decisions, do not stop at bare <table> / <p>: use table-wrap + table-cap (numbered table captions), axis-sub (header sub-labels), rate good|mid|low r1..r5 with five pip elements (dot ratings), tag-yes / tag-no / tag-cell-note (availability cells), num (tabular figures), reco + reco-tag (recommendation panel), decision-panel (decision box), language-* on <pre><code> for automatic syntax highlighting via bundled highlight.js (default for new docs; keep tok-k / tok-f / tok-s / tok-c / tok-n only for compatibility with manually colored spans), pre.diff with .add / .del / .ctx for code diffs (explain the change in prose first, then show only the needed fragment), and dl.glossary for term definitions at the top of the document. Automatic highlighting skips pre.diff, .nohighlight, and any code that already has tok-* descendants. Reference numbered tables from body text as "表 1" / "Table 1". These work by class alone; do not re-implement the same look with inline style attributes. Do not emphasize a paragraph by making its type larger — if a paragraph deserves emphasis it is a recommendation, a decision, or a warning, so use reco, decision-panel, or a callout block instead. The document-level intro is metadata.deck; do not add a per-section intro paragraph.
For comparisons with three or more axes, use <table class="cmp"> inside table-scroll: the header row stays sticky while scrolling, axis on the first column keeps the comparison axis pinned during horizontal scroll, and pick on a <col>, th, or td tints the recommended option's column green. Keep plain <table> for narrow two-column comparisons — the sticky behavior and 720px minimum width get in the way there.
<!-- END SHARED: html-style-classes -->
<!-- BEGIN SHARED: html-design-guidance -->
見た目の判断に迷った時は、次の 4 つに従う。ユーザーが見た目の方向を明示した場合は、その指定が常に優先する。
gap を持つ flex / grid で作り、要素ごとの margin を積まない。幅の広い表・コード・図は自前の overflow-x: auto コンテナ (表は table-scroll) に入れ、ページ全体を横スクロールさせない。mindmap を使わない。 mindmap は日本語などの CJK ラベルで箱の採寸を誤り、文字が箱からはみ出し・重なって崩れる (2026-08-06 実測)。放射状の分類は flowchart の中心ノード + 枝で表現する。fill="currentColor" / stroke="currentColor" で書き、#333 のような固定色を直書きしない。固定色は light theme でしか読めず、dark theme では紙面と同化して消える。塗りつぶした図形 (rect / path) 自体の色と、その塗りの上に重ねる文字は、両 theme で読める固定色でよい。ブラウザの印刷ダイアログ (@media print) で topbar / toc / comment rail 等の操作 UI が消え、横スクロールしていた表・コードは折り返して全内容が残る。PDF 化が必要な時だけ python3 -m scripts.html_review_workbench.cli export-pdf --root <output-dir> [--output <pdf-path>] を実行する (headless Chrome 必須。不在時は error JSON)。preview URL の提示が既定であり、ユーザーが PDF を明示依頼した時だけ export-pdf する。
When unsure about visual choices, follow four rules; explicit user direction always wins. (1) Avoid stereotypical AI-generated looks — cream (#F4F1EA) with serif display and terracotta accent, near-black with a lone acid-green pop, emoji as section markers, centering everything, uniformly large border radii, accent bars on rounded cards. (2) Structural devices must encode facts: numbered markers (01/02/03) only when the content truly is a sequence; rules, eyebrows, and labels only when they mark real divisions. (3) Documents are read, dashboards are scanned: put summaries before detail and encode state in form (rating dots, tag colors, callout stripes), not numbers alone. (4) Create spacing with gap in flex/grid rather than stacked per-element margins, and give wide tables/code/diagrams their own overflow-x: auto container (table-scroll for tables) so the page body never scrolls sideways.
Diagram and procedure guidance: (a) Prefer citing an original figure with attribution over redrawing it. (b) Do not use arrow characters or emoji as diagram symbols — use a Mermaid diagram block or inline SVG when a figure is needed. (c) Do not turn a simple linear procedure into a flowchart; use a numbered list. (d) Do not use Mermaid mindmap: it mis-measures CJK labels so text overflows and overlaps its node boxes (observed 2026-08-06); express radial groupings as a flowchart with a central node and branches. (e) In inline SVG, draw text and strokes that sit directly on the page (axis labels, row/column headings, legend captions, rules) with fill="currentColor" / stroke="currentColor" instead of hard-coded colors such as #333, which are legible only in the light theme and disappear against the dark theme's paper; fills of shapes and the text placed on top of those fills may keep fixed colors as long as both themes can read them.
Print and PDF: browser print (@media print) hides chrome (topbar, toc, comment rail) and unwraps horizontal-scroll tables/code so content is preserved. Run export-pdf only when the user explicitly asks for a PDF (python3 -m scripts.html_review_workbench.cli export-pdf --root <output-dir>); preview URLs remain the default. Headless Chrome is required; missing Chrome returns an error JSON (no external service fallback).
<!-- END SHARED: html-design-guidance -->
<!-- BEGIN SHARED: html-interactive-controls -->
読むだけでなく触って決める資料では、html block に操作部品を直接書ける。値を試すスライダー、切り替えのトグル、並べ替えできるカードなどが対象。
html block の中に <script> を inline で書ける。onclick= 等の inline event handler も使える。check-model が error にする (<script src="…"> と <link rel="stylesheet" href="https://…"> の両方)。bundle が手元で完結する性質を保つため。図表の描画ライブラリが要る場合は Mermaid の diagram block を使う。rate / tag-yes / num 等) と揃える。inline style の直書きは最小限にする。同梱の RHWState を使う。preview server があれば PUT /annotations/state/<name>.json で保存し、端末をまたいで同じ状態を見せる。server が無い場合 (publish した standalone、file:// で開いた場合) は localStorage に落ち、どちらも使えない環境ではメモリ上だけで動く。操作そのものは止まらない。
<label>duration <input type="range" id="dur" min="0" max="2000" value="300"></label>
<output id="durOut">300</output>ms
<script>
(async function () {
var dur = document.getElementById("dur");
var out = document.getElementById("durOut");
// 保存済みの値があれば復元する
var saved = await window.RHWState.load("tuning");
if (saved && saved.duration) { dur.value = saved.duration; out.textContent = saved.duration; }
dur.addEventListener("input", function () {
out.textContent = dur.value;
// 動かしている間の表示更新と一緒に呼んでよい。debounce が server への PUT をまとめる
window.RHWState.save("tuning", { duration: dur.value }, { debounce: 300 });
});
})();
</script><name> は英数字とハイフン・アンダースコアだけ (最大 64 文字)。保存した内容は agent が annotations/state/<name>.json として読める。触って決めた結果を作業へ戻す経路がこれになる。文書の中で用途ごとに名前を分ける (tuning / priority-order など)。
連続して動く部品 (スライダー、テキスト入力) では { debounce: 300 } を渡す。手元の保存 (localStorage) は毎回すぐ行い、server への書き込みだけを入力が止まってから 1 回にまとめる。これを渡さずに input で呼ぶと、つまみを端から端まで動かすだけで PUT が 100 回以上飛ぶ。
逆に debounce を渡さないのは、操作が 1 回で完結する部品 (ボタン、dragend、チェックボックス) のとき。その場で保存され、戻り値の saved が remote / local / memory のどれかになる。
debounce 付きで待っている間の戻り値は superseded になる (新しい値で予約が取り直された、という意味)。最後の呼び出しだけが実際の保存結果を返す。画面に保存状態を出す場合は superseded を「保存中」として扱う。
RHWState.save() を必ず呼ぶ。呼ばないと結果は画面上だけで消える。preview で server 越しに開いて動作を確認する。file:// で開くと状態が端末間で共有されない状態の確認になる。For documents where the reader decides by manipulating rather than only reading, write controls directly into an html block: sliders for trying values, toggles, reorderable cards.
Inline <script> and inline event handlers are allowed inside html blocks. Loading from an external host is rejected by check-model — both <script src="…"> and <link rel="stylesheet" href="https://…"> — so the bundle stays self-contained. Use the diagram block when you need diagram rendering.
To persist what the reader manipulated, use the bundled RHWState. With a preview server it saves through PUT /annotations/state/<name>.json so state is shared across devices; without one (published standalone, opened via file://) it falls back to localStorage, and to memory when neither is available. The interaction never breaks.
<label>duration <input type="range" id="dur" min="0" max="2000" value="300"></label>
<output id="durOut">300</output>ms
<script>
(async function () {
var dur = document.getElementById("dur");
var out = document.getElementById("durOut");
var saved = await window.RHWState.load("tuning");
if (saved && saved.duration) { dur.value = saved.duration; out.textContent = saved.duration; }
dur.addEventListener("input", function () {
out.textContent = dur.value;
window.RHWState.save("tuning", { duration: dur.value }, { debounce: 300 });
});
})();
</script><name> accepts alphanumerics, hyphens, and underscores (64 chars max). Saved state is readable by the agent at annotations/state/<name>.json — that is the path by which a decision made in the browser returns to the session. Use distinct names per purpose (tuning, priority-order). For continuously moving controls (sliders, text inputs) pass { debounce: 300 }: local storage is written on every call, while the server write is coalesced into one after input stops. Omit debounce for one-shot interactions (buttons, dragend, checkboxes). While a debounced write is waiting, save() resolves with saved: "superseded" — treat that as "saving" in any status display; only the final call reports the real result.
Add controls only when the reader needs to try values, decide an order, or narrow options; leave them out of read-only documents. If the agent must receive the outcome, RHWState.save() is required — otherwise the result stays on screen and disappears. Verify interactive documents through preview over the server, since opening via file:// exercises the fallback path instead.
<!-- END SHARED: html-interactive-controls -->
<!-- BEGIN SHARED: mermaid-kinds -->
diagramブロックのMermaid sourceは、mermaid.js v11系が対応する記法から選ぶ。同梱済み mermaid.min.js がHTML上でSVGに置換する。
主要 kind:
| kind | 用途 |
|---|---|
flowchart / graph | 処理・依存関係のフロー |
sequenceDiagram | 相互作用・時系列メッセージ |
stateDiagram-v2 | 状態遷移 |
classDiagram | クラス構造・継承・関連 |
erDiagram | エンティティ関係 |
gantt | 期間・スケジュール |
journey | ユーザー体験の順序 |
timeline | 時系列イベント |
mindmap | 概念マップ・分類 |
pie | 割合 |
gitGraph | ブランチ・マージ |
requirementDiagram | 要件・トレーサビリティ |
quadrantChart | 2軸マトリクス |
sankey | フロー量 |
xychart-beta | 2次元数値プロット |
architecture-beta | システム構成 |
block-beta | ブロック配置 |
packet-beta | パケット構造 |
kanban | カンバンボード |
radar | レーダーチャート |
treemap | 階層構造の面積表現 |
zenuml | ZenUML記法 |
最小サンプル:
erDiagram
erDiagram
CUSTOMER ||--o{ ORDER : places
CUSTOMER {
string id PK
string name
}
ORDER {
string id PK
string customer_id FK
}sequenceDiagram
sequenceDiagram
participant User
participant API
User->>API: request
API-->>User: responsestateDiagram-v2
stateDiagram-v2
[*] --> Idle
Idle --> Running: start
Running --> Idle: stopflowchart LR
flowchart LR
A[Input] --> B{Decide}
B -->|yes| C[Do it]
B -->|no| D[Skip]sourceの記法が不確かな場合は mermaid.js 公式docs (https://mermaid.js.org/) を参照する。schemaの diagram_kind は表示ラベル用のグループ名で、Mermaidの内部kind名と一致させる必要はない。
Use Mermaid source supported by mermaid.js v11. The bundled mermaid.min.js renders diagram blocks into SVG in the browser, and rendered Mermaid diagrams can be opened from the zoom button for full-screen pan / zoom inspection. Common kinds include flowchart / graph, sequenceDiagram, stateDiagram-v2, classDiagram, erDiagram, gantt, journey, timeline, mindmap, pie, gitGraph, requirementDiagram, quadrantChart, sankey, xychart-beta, architecture-beta, block-beta, packet-beta, kanban, radar, treemap, and zenuml. If syntax is uncertain, check the Mermaid docs. The schema diagram_kind is a display grouping label and does not need to match Mermaid's internal kind name.
<!-- END SHARED: mermaid-kinds -->
rendererは <h1> を文書タイトルに使う。本文ブロックの見出しは heading_level フィールドで制御する。
| heading_level | HTML タグ | 用途 |
|---|---|---|
2 | <h2> | 章見出し。文書を大きく区切る上位セクション。読者が目次で選ぶ単位 |
3 | <h3> | 節見出し。章の中を細分化するサブセクション |
4 | <h4> | 項見出し。節の中をさらに分けるサブサブセクション |
heading_level は必須。2(章)、3(直前の章の配下の節)、4(直前の節の配下の項)のいずれかを指定する。1. / 1.2 / 1.2.3)。既定は 2 階層で足りる文書が多く、4 は章・節・項の 3 段が内容として実在する場合だけ使う。title に章番号を書かない。 番号は renderer が heading_level と blocks の並びから自動で振る。"3. 解決すべき顧客・業界の課題" と書くと、本文でも目次でも番号が二重になる(3. 3. 解決すべき…)。元の資料が番号付きの構成でも title は "解決すべき顧客・業界の課題" とし、順序と階層は blocks の並びと heading_level で表す。<h2> や <h3> を直接書かない。小見出しが必要な場合は <h4> を使う(renderer が block の階層に合わせて自動シフトする。節の中では <h4> のまま、項の中では <h5> になる)。html block の content に書く HTML は、セマンティックな構造を意識する。
<table> に <thead> と <tbody> を含め、ヘッダセルは <th scope="col"> または <th scope="row"> にする。<ol>、並列項目は <ul>、用語と説明の対は <dl> にする。<p> で段落分けし、<div> に流し込まない。<strong>(重要)と <em>(ニュアンス)を使い分ける。文書モデルを作る前に、agentは次を決める。
heading_level: 2)でどのブロックが節(heading_level: 3)かを先に決める。1つの章に節が偏りすぎないようバランスを取る。type, title, heading_level, content, review_required。heading_level: 2 ブロックの冒頭に、その章で扱う内容の文脈を示す導入段落を置く。html block内で使う表、番号付きリスト、箇条書き、コードブロック、通常本文の構成。metadata.palette に light / dark 別の brand / brand_soft として書く。決められない場合は palette を書かず既定 (青系) のままにする。大胆さは 1 箇所に集中させ、周囲は静かに保つ。accent が地色と競う場合は、色相を近づけるか彩度を落とす。コントラスト比 (WCAG 4.5:1) は check-model / render / validate が機械検査し、不足は error で止まる。"metadata": {
"palette": {
"light": { "brand": "#2f6093", "brand_soft": "#e8eff7" },
"dark": { "brand": "#7fb0e6", "brand_soft": "#1b2b3d" }
}
}上書きできるのは brand / brand_soft だけ。中立色・地色・レビュー状態色 (open / reply / resolved) は固定で、変更できない。
入力がMarkdownや箇条書きで整理されていても、記号構造をそのまま変換しない。最終HTMLで読みやすい単位へ組み替えてから文書モデルにする。
Treat HTML output as information design for the final bundle, not as text conversion. Identify the audience, purpose, comparison axes, chronology, dependencies, steps, decisions, assumptions, and unresolved issues before writing the model. Use tables for comparisons, ordered lists for procedures, lists for parallel items, callouts for decisions or cautions, diagrams for flows and dependencies, images for useful visual explanations, and code blocks for commands or logs. Even when the input is Markdown or a list, restructure it into readable HTML blocks instead of mechanically converting the symbols.
ユーザーが「html出力して」「HTMLにして」「HTMLで出して」「render this as HTML」「turn this into HTML」「create an HTML preview」「generate a visual HTML report」「make this a reviewable HTML document」「diagrammed HTML report」のように自然文で依頼し、document-model.json を指定していない場合も、このskillを発火させる。
その場合は、次の順で入力を決める。
output/tmp/<purpose>/document-model.json または output/<YYYY-MM-DD>_<name>/document-model.json を直接作る。schema_version, document_id, title, generated_at, blocks を必ず持つ。image.generation_status=requested のブロックがある場合は画像生成と attach-image を完了してから、check-model → render → validate → preview まで進める。build-model は最終HTMLモデルを作るplannerではない。入力を安全に保持する source-capture draft を作るだけで、Markdown表・リスト・コード等の機械変換や、内容に応じた表現選択は行わない。最終HTML出力では、agentがHTML表現設計フェーズで文書モデルを直接設計する。画像生成が外部サービス送信・機密情報・ユーザー承認を要する条件に当たる場合は、該当する承認ゲートに従う。設計判断、要求整理、レビュー観点の作成が主目的の場合は reviewable-design-doc を使う。
Natural requests such as render this as HTML, turn this into HTML, create an HTML preview, generate a visual HTML report, make this a reviewable HTML document, and diagrammed HTML report should still trigger this skill. Use the explicitly named file, pasted content, or latest artifact as the HTML source. Ask only when the target cannot be identified. If the target is clear, proceed into HTML information design and create output/tmp/<purpose>/document-model.json or output/<YYYY-MM-DD>_<name>/document-model.json directly.
render CLIを呼ぶ前に、文書モデルを読み返して次を確認する。
heading_level: 2 のブロックが少なくとも1つある。heading_level: 3 のブロックが最初の heading_level: 2 ブロックより前に出現していない。heading_level: 2 ブロックの content が導入段落で始まっている。html block の <table> に <thead> と <th> がある。content 内に <h2> や <h3> を直接書いていない。html blockが未再構成テキストを <p> または <pre> だけで抱えていない。html block内の <table> 等で比較軸を明示している。html block内の <ol> 等で順序を明示している。callout または専用の html blockとして本文に埋もれないようにしている。callout blockの content にHTMLタグを書いていない。section, text, table block typeを最終モデルで使っていない。diagram blockは有効なMermaid sourceを持ち、画像生成promptはsourceに無い事実を追加していない。image blockは source_path が添付済みになるまで render しない。table-wrap + table-cap で表に番号と表題を付けている。評価軸があるなら rate 等で視覚化している。reco または decision-panel で独立させている。Before calling render, read the model back and confirm the heading hierarchy, introductory paragraphs, supported block types, table semantics, ordered steps, callouts, diagram sources, attached images, and absence of raw unstructured dumps. Do not render until requested images have been attached and unsupported block types have been removed.
assets/diagrams/*.mmd に保存し、HTML上は生成画像を主表示にする。生成画像が未添付の場合だけMermaid fallbackを表示する。このskillは、低レベル実装へ直接importせず、共通CLIだけを呼ぶ。
<!-- BEGIN SHARED: repo-root-resolution -->
CLI実行前に、この SKILL.md の配置から renderer repo root を決める。
skills/visual-html-renderer/SKILL.md の2階層上が renderer repo root であり、
そこに scripts/html_review_workbench/cli.py が存在することを確認する。
すべての python3 -m scripts.html_review_workbench.cli ... は renderer repo root を
作業ディレクトリにして実行する。現在のチャットやworkspaceのcwdをrepo rootとして扱わない。
cwdに scripts/html_review_workbench/cli.py が無い場合は、代替HTMLを作らず、
renderer repo rootへ移動してCLIを実行する。
<!-- END SHARED: repo-root-resolution -->
<!-- BEGIN SHARED: cli-commands-core -->
python3 -m scripts.html_review_workbench.cli build-model \
--text "<content>" \
--output <document-model.json>
python3 -m scripts.html_review_workbench.cli attach-image \
--model <document-model.json> \
--block-id <generated-image-block-id> \
--image <generated-image-path>
python3 -m scripts.html_review_workbench.cli check-model \
--model <document-model.json>
python3 -m scripts.html_review_workbench.cli render \
--model <document-model.json> \
--output <output-dir>
python3 -m scripts.html_review_workbench.cli validate \
--root <output-dir>
python3 -m scripts.html_review_workbench.cli preview \
--root <output-dir> \
--mode auto
python3 -m scripts.html_review_workbench.cli publish \
--root <rendered-bundle-dir> \
--output <publish-output-dir><!-- END SHARED: cli-commands-core -->
<!-- BEGIN SHARED: preview-owner-pid-note -->
Codex / Claude では preview コマンドを一回限りの shell から起動することがあるため、標準手順では --owner-pid を渡さない。preview server は 24時間アクセスが無い場合に idle timeout で自動停止する。
<!-- END SHARED: preview-owner-pid-note -->
<!-- BEGIN SHARED: tailscale-sandbox-fallback -->
Codex sandbox内で tailscale ip -4 が設定ファイル読み取りに失敗する場合は、preview本体をsandbox内で起動したまま、IPだけを小さいresolverで先に取得して渡す。
python3 -m scripts.html_review_workbench.preview_host_resolve
HTML_REVIEW_WORKBENCH_TAILSCALE_IP=<tailscale-ip> \
python3 -m scripts.html_review_workbench.cli preview \
--root <output-dir> \
--mode auto<!-- END SHARED: tailscale-sandbox-fallback -->
長寿命の所有プロセスが明確に分かる場合だけ --owner-pid <pid> を使ってよい。一回限りの shell の $$ や $PPID は短命プロセスを指すため使わない。
ユーザーが明示的にプレビュー不要と言った場合、または自動テスト・fixture検証で副作用を抑える場合だけ --mode off を使う。ユーザー向け成果物では --mode off を既定にしない。
成果物はユーザーが直接読む最終HTMLなら output/<YYYY-MM-DD>_<name>/、再利用しない検証なら output/tmp/<purpose>/ に置く。
Call only the shared CLI. Resolve the renderer repo root from this SKILL.md: two levels above skills/visual-html-renderer/SKILL.md. Run every python3 -m scripts.html_review_workbench.cli ... command from that repo root. If the current workspace does not contain scripts/html_review_workbench/cli.py, move to the renderer repo root instead of creating fallback HTML. Use --mode off only for explicit no-preview requests or tests; user-facing artifacts should default to --mode auto.
preview が status: running を返した場合、最終応答に url を必ず含める。ファイルパスだけで完了しない。preview が status: off または status: failed の場合、URLが無い理由を明示し、可能なら --mode auto で再実行してURL提示まで進める。--owner-pid を渡さず、24時間アクセスが無い場合に idle timeout で自動停止させる。長寿命の所有プロセスが明確な場合だけ --owner-pid <pid> を使う。stop_command を使う。PIDなしで全previewを停止しない。When preview returns status: running, include the url in the final response; a file path alone is not completion. If preview is off or failed, state the reason and try --mode auto when appropriate. Do not pass --owner-pid by default; the preview server stops after 24 hours without access. Use the returned stop_command only when manual cleanup is needed.
index.html と renderer-manifest.json が生成されている。validate が status: ok を返している。0.0.0.0 にbindしていない。自動テスト pass と CLI の JSON 出力確認は、実シナリオ検証ではない。「動作確認」を求められた場合、以下を実行する。
document-model.json を作り、render → validate → preview を実行する。検証の完了条件: ユーザーがブラウザ上で最終 HTML の表示を確認した時点。validate が status: ok を返したことではない。
Passing unit tests and receiving valid CLI JSON are prerequisites, not real scenario verification. When the user asks for an operational check, create a real document-model.json, run render -> validate -> preview, provide the preview URL, and have the user confirm the rendered HTML in the browser. Verification is complete only after the browser-visible result is accepted.
最終応答には次を含める。
index.html と renderer-manifest.json の場所。validate の結果。stop_command。Final responses must include: HTML design choices, generated index.html and renderer-manifest.json paths, validation result, preview URL/bind/PID/stop_command, and any unperformed verification layers with reasons.
0.0.0.0 にbindしない。The renderer does not invent content decisions. Diagrams only support the provided structure. Do not open the browser automatically; return the URL. Never bind Preview Runtime to 0.0.0.0. Any external posting, upload, or service transmission requires the appropriate approval gate.
© u-ichi, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file
SKILL.md and 1 other file in skills/visual-html-renderer of u-ichi/reviewable-html-workbench.
Open the folder on GitHubat commit 60bde37
We found 1 copy of this SKILL.md (exact, near-identical or edited) in other folders, from 1 other GitHub owner. This page covers the copy in u-ichi/reviewable-html-workbench, which our catalogue first saw on October 7, 2026.
Visual HTML Renderer next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.
| Skill | Stars | Used in | Tokens | Auto-check | Licence | Repo updated |
|---|---|---|---|---|---|---|
| Visual HTML Renderer this skillu-ichi/reviewable-html-workbench | 298 | 1 repos | ~8.7k | Automated safety check: Pass | MIT | |
| Plannotator Visual Explainerbacknotprop/plannotator | 9.2k | — | ~1.7k | Automated safety check: Pass | Apache-2.0 | |
| Plannotator Planning Analysisbacknotprop/plannotator | 9.2k | — | ~6.7k | Automated safety check: Pass | Apache-2.0 | |
| Deep Research PlanMagicCube/helixent | 680 | — | ~2.1k | Automated safety check: Pass | None | |
| Planowainlewis/youtube-tutorials | 402 | — | ~1k | Automated safety check: Pass | MIT | |
| Htmlvspecdisler/pi-agent-observability | 145 | — | ~4.7k | Automated safety check: Notes | MIT |
backnotprop/plannotator
Builds self-contained HTML explainers for plans, pull requests and technical concepts in Plannotator's theme, then opens them in its annotation view.
backnotprop/plannotator
Mines a Plannotator archive of denied plans for feedback patterns and prompt improvements, then writes an HTML dashboard report, with a Claude Code fallback.
MagicCube/helixent
Enter "plan mode" for a deep-research or article-writing task — search the web, fetch sources, optionally run experiments in Python/Node, design one recommended outline and research strategy, then…
owainlewis/youtube-tutorials
Write a short implementation plan or a longer execution plan before coding.
disler/pi-agent-observability
Creates a visual engineering implementation plan as a single self-contained HTML page saved to specs/<name.html — the plan authored directly in styled HTML, with one AI-generated diagram image per…
OthmanAdi/planning-with-files
Arabic edition of a file-based planning skill that keeps task_plan.md, findings.md and progress.md on disk so multi-step agent work survives lost context.
u-ichi/reviewable-html-workbench
Plan Mode の <proposedplan を出す直前に、計画の段階・依存関係・検証観点を一時HTMLで視覚確認したい時に使う agent-internal skill。Use this agent-internal skill to create a temporary HTML preview for a plan just before presenting…
u-ichi/reviewable-html-workbench
要求・設計・アーキテクチャ・未決事項を整理し、レビュー可能な設計資料HTMLを作りたい時に使う。Use this skill to structure requirements, design, architecture, alternatives, decisions, and unresolved issues into a review-ready HTML design document.
Categories
HTMLを最終成果物として生成・検証・プレビューしたい時に使う共通レンダラー。Use this shared renderer when the user wants content turned into a final, validated, previewable HTML artifact. Visual HTML Renderer is an agent skill from u-ichi/reviewable-html-workbench. HTMLを最終成果物として生成・検証・プレビューしたい時に使う共通レンダラー。Use this shared renderer when the user wants content turned into a final, validated, previewable HTML artifact.
Visual HTML Renderer fits situations like: wants content turned into a final; previewable HTML artifact; : Plan Mode proposal previews; creating the design content itself.
Run `npx skills add u-ichi/reviewable-html-workbench --skill visual-html-renderer -a claude-code`. Or copy the skill folder (skills/visual-html-renderer in u-ichi/reviewable-html-workbench) into .claude/skills/visual-html-renderer in your project. Claude Code loads it when a task matches its description.
Run `npx skills add u-ichi/reviewable-html-workbench --skill visual-html-renderer -a codex`. Or copy the skill folder (skills/visual-html-renderer in u-ichi/reviewable-html-workbench) into .agents/skills/visual-html-renderer in your project. Codex loads it when a task matches its description.
Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add u-ichi/reviewable-html-workbench --skill visual-html-renderer -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/visual-html-renderer, .gemini/skills/visual-html-renderer, .github/skills/visual-html-renderer and .opencode/skills/visual-html-renderer in your project.
Going by SKILL.md and its folder, Visual HTML Renderer needs the command-line tools its instructions call (python3 and make). Our summary lists: Python 3.
SKILL.md names 1 domain. As links in the text: mermaid.js.org. This is read from the text; nothing was executed.
Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.
Visual HTML Renderer is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.
About 8.7k tokens (SKILL.md is roughly 35k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.
Skills that share tags, products or a category with Visual HTML Renderer: Plannotator Visual Explainer (backnotprop/plannotator, 9.2k stars), Plannotator Planning Analysis (backnotprop/plannotator, 9.2k stars), Deep Research Plan (MagicCube/helixent, 680 stars) and Plan (owainlewis/youtube-tutorials, 402 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.
u-ichi (a GitHub user) maintains it in u-ichi/reviewable-html-workbench, which has 298 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on September 10, 2026.
Source: u-ichi/reviewable-html-workbench on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.