Upgrade to Pro — share decks privately, control downloads, hide ads and more …

【AI×DevOps Study #23】AIエージェントが Google Slides を組...

Avatar for Scalar, Inc. Scalar, Inc. PRO
September 18, 2026
2

【AI×DevOps Study #23】AIエージェントが Google Slides を組み上げる方法と、その工夫

■AI×DevOps Study #22の概要
2026年9月9日に開催した「AI×DevOps Study」第23回の勉強会資料です。

「AI×DevOps Study」は、AI駆動開発やそこに関係するマイクロサービスについて理解を深める場になります。
株式会社ScalarではAIを使ったチーム開発を進めており、参画しているメンバーや協力会社の方から、具体的なAI駆動開発を実施する方法、その中で生まれたマイクロサービスアーキテクチャを使用したAI駆動開発の事例や実際に使えるエージェントについてお話頂き、参加者の皆様と知識の共有や交換を目的としています。
(弊社製品であるScalarDBも絡んだお話も一部出てきますが、汎用的な内容となっておりますのでフラットにお楽しみいいただけます)

■今回のテーマ
今回のテーマは、AIエージェントが Google Slides を組み上げる方法と、その工夫です。
AIを利用し、GoogleスライドやPower Point(パワポ)を生成するしくみとスライド作成を効率化するしくみについてお話します。

※ご紹介するAIエージェント(下記リンク先よりご利用いただけます。) https://github.com/wfukatsu/slide-forge

■登壇者情報(敬称略)
深津航
株式会社Scalar Founder & CEO。日本オラクル株式会社、決済系のスタートアップを経て、株式会社Scalarを創業。

■関連コンテンツ
・Youtube(過去の勉強会動画も公開中!)
www.youtube.com/@scalar-labs

・Zenn ブログ
https://zenn.dev/p/scalar_sol_blog

・イベントページ(connpass)
https://scalar.connpass.com/

Avatar for Scalar, Inc.

Scalar, Inc. PRO

September 18, 2026

More Decks by Scalar, Inc.

Transcript

  1. AIxDevOps slide-forge(スライド鋳造機) の仕組み AI エージェントが Google Slides / Power Point

    を 組み上げる方法と、その工夫 2026年9月9日 解説資料(この資料自体も slide-forge で生成) 株式会社Scalar 深津航
  2. 自己紹介 名前:深津航 所属:株式会社 Scalar CEO, Co-Founder 主な関心事項 • 日本のIT強化 •

    アーキテクチャ /設計 • DevSecOps, FinOps • AIが与える各種業界へのインパクト ◦ ▪ 株式会社 Scalar としての活動 株式会社Scalarは、分散トランザクションマネージャー のScalarDBと改ざん検知ソフトウェアの ScalarDLを展 開中。マイクロサービス化におけるシステムの課題や AI などのデータ基盤の信頼性を担保するソリューションを 展開しています。 ソフトウェア開発、システム開発、マーケティング、営 業、経営など様々な役割で活動中。 データ中心のレガシーモダナイゼーション LinkedIn: https://www.linkedin.com/in/wataru-fukatsu-1692655/ AIxDevOps 2 © 2026 Scalar, inc.
  3. 資料作成に就業時間の約2割、100⼈組織なら年約36,000時間 スライド作成とグラフ作成が就業時間に占める割合。課⻑職は⼀般社員より約5ポイント⾼い。 ⼀般社員 課⻑職 経営上の⽬安 23% スライドを作る社員1⼈あたり⽉15 時間前後、グラフ作成込みで⽉30 18.2% 時間前後。

    11.7% 9.3% 11.3% • ⼀般社員:年約380時間 8.9% • 課⻑職:年約480時間 • 100⼈組織:年約36,000時間 スライド‧資料作成 グラフ‧チャート作成 合計 ※ 対象は PowerPoint / Excel で⽉1回以上資料を作る⼈に限定。年間換算は週40時間×52週の単純計算で、構成検討‧情報収集‧レビュー会議の扱いにより数値は変動する 出典: think-cell Japan「プレゼン資料作成に関する調査」(2023年、全国の20〜60歳の会社員712⼈) AIxDevOps © 2026 Scalar, inc. 1
  4. 会話と素材から、検証済みの Google Slides / Power Point を作るエージェント基盤 状況 課題 答え

    資料作りは「構成を考える」「図を描く」「体裁を整える」「崩れを直す」の反復で、⽣成 AI に丸投げすると体裁の崩 れと根拠のない数字が残る Slides API は座標を無検証で受け取るため、⽮印の浮きや⽂字あふれは⽣成してサムネイルを⾒るまで分からない。作 り直しのたびに API 課⾦と時間がかかる slide-forge は「AI が判断し、Python が計算して拒否する」役割分担で、⽣成前に座標で分かる⽋陥を落とし、⽣成 後に AI がサムネイルを⽬視して残りを直す 答えを⽀える論点 23 スキル‧69 種の図部品‧92 の単⼀スライドテンプレートを 1 つの Python エンジンで共有する spec JSON → オフライン検証 → ⼀括 batchUpdate → サムネイル QA → PowerPoint / draw.io / Excel へ書き出す⼀本道 重なり‧コネクタ‧⽂字あふれの検知は実測した定数(0.22in / 0.06in / ⾏⾼ 1.45)で判定する 出典: slide-forge リポジトリ README.md / references/*.md / scripts/*.py(v1.30.0、2026-09-06 時点) AIxDevOps © 2026 Scalar, inc. 2
  5. この資料は 4 章。できること → 仕組み → AI のスキル → ⼯夫の順に読む

    4 第 1 章 何ができるか: 出⼒形式と、7 カテゴリのサンプルスライドを⼊⼒と出⼒の対で⾒る 14 第 2 章 スライドを作る仕組み: spec JSON が batchUpdate になるまでの処理を追う 25 第 3 章 AI のスキル: 23 スキルと /forge の流れ、構成の決め⽅、視覚 QA 37 第 4 章 Tips: 重なり検知‧コネクタ検知‧⽂字あふれ推定‧API の落とし⽳‧性能‧安全策 読み⽅ 具体例 サンプル 各ページのタイトルは結論⽂。タイトルだ 各ページに実際の spec‧コード‧数値を 第 1 章のサムネイルは Drive の けを順に読むと全体の論旨になる 載せ、数字には出典⾏を付ける 「slide-forge 解説 / samples」フォルダに 実物がある AIxDevOps © 2026 Scalar, inc. 3
  6. ⼊⼒は会話‧素材‧spec、出⼒は Slides / PowerPoint / draw.io / Excel ✓ 依頼‧素材

    AI が執筆 オフライン検証 Slides API 成果物 段階 ⼊⼒(インプット) 出⼒(アウトプット) 依頼 テーマ‧⽤途‧枚数‧テンプレート、議事録や資料 アウトライン(枚数‧レイアウト‧結論⽂) 執筆 承認済みアウトライン、references の設計規則 deck.json(spec)または deck.py 検証 spec と template.json はみ出し‧重なり‧⽂字あふれの指摘 ⽣成 検証済み spec、Drive フォルダ Slides のデッキと、同フォルダの編集⽤ spec 納品 ⽣成済みデッキ QA 結果、.pptx、⾒積 .xlsx / Sheets、.drawio 出典: references/workflow-contract.md「Required states」、README.md「Repository layout」 AIxDevOps © 2026 Scalar, inc. 5
  7. 出⼒形式: Slides のほか PowerPoint / draw.io / Excel / Markdown

    / PNG 出⼒形式 作り⽅(スクリプト / スキル) ⽤途 Google Slides build_deck.py が Drive に⽣成。編集元の spec も同じフォルダに置く 共同編集‧共有。URL は 1 つに保つ PowerPoint(.pptx) export_pptx.py で書き出し。10MB 超は exportLinks に⾃動切替 社外配布、PowerPoint 環境への納品 draw.io(.drawio + PNG) drawio_export.py で PNG 化し、編集⽤の .drawio は Drive に保存 密なクラウド構成図‧データフロー図 Excel / Google Sheets build_sheet.py --gsheet。.xlsx と Sheets を同時⽣成、⾦額は実数式 ⾒積‧BOM‧コスト内訳 Markdown hearing_sheet.py、export_ledger_md.py、段階記録‧ナーチャリング設計 CRM 貼り付け、社内共有、Git 管理 PNG fetch_thumbnails.py、html_shot.py、mermaid_export.py QA、ブログ‧資料への埋め込み 切り替えと配置 成果物の⾏き先は config/settings.json の output スイッチ(google / local)で切り替える。local ではデッキ⽣成の最後に .pptx をローカルフォルダ へ書き出す。draw.io と Excel はデッキと同じ Drive フォルダに並べ、編集元を失わない。 出典: scripts/export_pptx.py、scripts/drawio_export.py、scripts/build_sheet.py、scripts/hearing/hearing_sheet.py、references/settings.md AIxDevOps © 2026 Scalar, inc. 6
  8. ①テンプレート準拠デッキ: マスターを複製し、装飾を継承して中⾝だけ⼊れる ⼊⼒と出⼒ ⼊⼒: 7 ページ分の spec JSON と templates/aixdevops.json。

    出⼒: 7 枚のデッキ。427 リクエストを 1 回の batchUpdate で送る。 表紙: TITLE / SUBTITLE / BODY に流し込む 課題: iceberg + so_what(⾻格 B) ロゴ‧フッター‧配⾊は複製で継承し、 spec には書かない。 ‧⽤途 = 提案 → *_PROPOSAL 系レイア ウト ‧本⽂ 13pt / ⾏送り 115% を defaults で ⼀括指定 解決策: icon_flow + cards を縦に積む 計画: gantt。開始 = 終了の⾏は ◆ 出典: サンプル: https://docs.google.com/presentation/d/1-Um8KKbRsgnfh_CoLFVomPQG1tqKf1JZxZFM3LLr4rs/edit(架空データ、本セッションで⽣成) AIxDevOps © 2026 Scalar, inc. 7
  9. ②図解ライブラリ: 69 種の部品を spec の 1 要素で呼び出し、同じ配⾊で描く ⼊⼒と出⼒ ⼊⼒: {"type":

    "hub", "center": "共有台 帳", "items": ["注⽂", "在庫", …]} と座 標。 出⼒: 図形‧線‧テキストの集合。Slides 上で編集できる。 flow + cards: ⼯程とカード icon_flow / icon_row: ピクトグラム 32 種 配⾊は template.json から作る。 ‧⽐喩図 15‧構造図 5‧フレームワーク 9‧ページ部品 11 ‧オフラインで座標に展開して検証 steps / layers: 段階と積層 hub: 中⼼と放射 出典: サンプル: examples/design-catalog.json を scalar-2026 で⽣成 https://docs.google.com/presentation/d/1G3niAOzAsufJAUbLlakegFx5MxX8k-UgU0pgTRuwMNk/edit AIxDevOps © 2026 Scalar, inc. 8
  10. ③表‧グラフ‧コード: 表は編集可のネイティブ、グラフは基線ゼロを強制する ⼊⼒と出⼒ ⼊⼒: {"type": "vbars", "items": [["2023", 120], ["2024",

    210]]} 出⼒: 棒‧数値ラベル‧カテゴリラベルの 図形群。 table: ⽣成後に編集できるネイティブ表 vbars: 基線ゼロ固定の棒グラフ ⼆重軸は意図的に⾮対応。系列⾊は⾊覚 検証済みの固定順。 ‧表は 1 枚 10 ⾏前後が上限(フッター帯 で⽌まる) ‧コードは java / graphql / json / bash を 塗り分け pie: SVG → PNG を画像として貼る code_block: 範囲着⾊でハイライト 出典: サンプル: examples/design-catalog.json 第 2 章‧第 7 章 https://docs.google.com/presentation/d/1G3niAOzAsufJAUbLlakegFx5MxX8k-UgU0pgTRuwMNk/edit AIxDevOps © 2026 Scalar, inc. 9
  11. ④クラウド構成図: 公式アイコン 1,757 種の部品か draw.io の 2 経路 ⼊⼒と使い分け ⼊⼒:

    {"type": "cloud_icon_row", "items": [["aws:rds", "RDS"], …]} 名前は cloud_icons.py --search で必ず確 認。⾊変更‧回転は利⽤条件で禁⽌。 draw.io 経路の⽬安: ⼊れ⼦ 2 段、ノード draw.io 経路: .drawio を headless で PNG に書き出し、image として貼る(編集元は Drive に保存) 10、辺 15 以上。 ‧アイコンは再配布不可のため fetch_cloud_icons.py で各⾃取得 ‧ベンダー: aws / gcp / azure cloud_zone + cloud_icon_row cloud_icon_flow 出典: examples/scalar-proposal-envs.png(drawio-diagrams スキルの出⼒例)、references/cloud-icons.md、skills/drawio-diagrams/SKILL.md AIxDevOps © 2026 Scalar, inc. 10
  12. ⑤単⼀スライドテンプレート 92 種: スロットを埋めるだけで 1 枚が完成する analysis/fishbone-diagram analysis/pareto-analysis marketing-analysis/swot b2b-sales/influence-map

    planning/gantt-schedule read-alone/exec-summary business-plan/revenue-plan scalar-ae/license-estimate ⼊⼒と出⼒ ⼊⼒: slots へのデータ JSON。render_slide_template.py --template analysis/fishbone-diagram --data data.json で 1 ページ分の spec が出る。 出典: slide-templates/manifest.json(92 templates / 13 packs)、references/slide-template-catalog.md の収録画像 AIxDevOps © 2026 Scalar, inc. 11
  13. ⑥営業⽀援: 台帳 JSON から商談レビュー‧活動計画‧ヒアリング資料を⽣成する ⼊⼒と出⼒ ⼊⼒: account.json(事実は said / observed

    / assumed)と b2b-sales の 8 テンプレート。 出⼒: 内部向け商談レビュー 13 枚。活動 計画は --into で URL を保って差し替え。 エグゼクティブサマリー: 停滞要因を 1 ⽂で influence-map: 影響⼒ × 賛否の 2 軸 顧客向けに⼈物評価は載せない。 ‧hearing-sheet: JSON ↔ Markdown / xlsx / Sheets discovery-map: MEDDPICC の確認状況 discovery-gaps: 誰に‧いつまでに聞くか 出典: サンプル: examples/b2b-account-review.json(匿名サンプルデータ) https://docs.google.com/presentation/d/16aN7FsTEmtGkDiof5RYhrM_wITmgTwgd8xncV_YYyQQ/edit AIxDevOps © 2026 Scalar, inc. 12
  14. ⑦派⽣成果物: イベント告知、⾒積シート、PPTX、AI 画像、新規マスター そのほかの出⼒ ⾒積: build_sheet.py --gsheet で .xlsx と

    Google Sheets(2 シート‧10 明細、⼩ 計‧税‧合計は実数式)。 PPTX: export_pptx.py が Drive API で書 き出し、10MB 超は exportLinks に⾃動 event_* 部品(corporate テンプレート) プログラム: 講演 2 本とパネル で切り替える。 新規マスター: template-forge が既定マス ターを複製し、ブランド⾊‧ロゴで再ス タイルして登録する。 aiImage: Gemini で枠に合わせて⽣成 image: ⼿持ち画像を contain / cover で配置 出典: サンプル: https://docs.google.com/presentation/d/1eRPRKFL0ryptdq_CvNBAAt4WDY2JVHtUZMMtAdKp9es/edit(⾒積 Sheets と .pptx は samples フォルダ) AIxDevOps © 2026 Scalar, inc. 13
  15. AIxDevOps 第 2 章 スライドを作る仕組み spec JSON が Google Slides

    の batchUpdate に なるまで AIxDevOps © 2026 Scalar, inc.
  16. 役割分担: AI は「判断」を担い、Python は「計算と拒否」を担う AI(Claude / Codex)が⾏うこと Python エンジンが⾏うこと 利⽤者に渡さないこと

    ‧要件を聞き、テンプレート‧⽤途‧ ‧マスターの複製とロール解決 ‧座標‧フォント‧⾊の決定(AI の責 枚数を決める ‧spec を座標に展開し、4 監査で拒否 任) ‧アウトラインと全ページの結論⽂を する ‧出典の無い数字(source_note が例 書く ‧batchUpdate を最少回数で送り、後 外) ‧⾻格と部品を選び、spec JSON を執 で補正する ‧⽣成成功を QA 完了とみなすこと 筆する ‧サムネイル取得‧PPTX 書き出し ‧サムネイルを⽬視し、spec を直す ‧QA 削除 ⽰唆 創造的な決定は Markdown(skills/、references/)に、証明できる決定は Python(scripts/)に置く。同じ spec からは毎回同じ絵が出る。 出典: references/workflow-contract.md、references/interactive-intake.md §0、scripts/pages.py source_note AIxDevOps © 2026 Scalar, inc. 15
  17. 8 状態のパイプライン: 承認は 1 回だけで、以降は納品まで⽌まらない Route Intake Approve Author Validate

    Generate Verify 状態 何をするか 使うもの‧出⼒ Route ⽣成スキルを 1 つだけ選び、その SKILL.md を全部読む commands/forge.md の 10 ⾏の振り分け表 Intake settings.json を先に読み、⾜りない分岐だけ最⼤ 4 問 × 3 往復で聞く scripts/settings.py --show、interactive-intake.md Approve 枚数‧レイアウト‧全ページの結論⽂を⾒せて承認を得る アウトライン(唯⼀の承認ゲート) Author spec JSON か deck.py を書く。必要な参照節だけ読む out/<deck>/deck.json Validate API を呼ばずに座標へ展開し、4 監査を通す build_deck.py --dry-run --strict Generate Drive フォルダを先に作り、⽣成し、編集元を同フォルダへ build_deck.py --folder、drive_folder.py upload Verify サムネイルを全ページ⽬視し、spec を直して再⽣成 fetch_thumbnails.py、slide-qa、cleanup_qa.py Deliver 最終デッキに対してだけ PPTX / ⾒積を作り、URL を 1 つ報告 export_pptx.py、build_sheet.py Deliver 出典: references/workflow-contract.md「Required states」「Invariants」 AIxDevOps © 2026 Scalar, inc. 16
  18. ⼊⼒の spec JSON: 1 ページは layout‧title‧body‧figures の 4 要素で書く 読み⽅

    { layout はロール名かレイアウトキー。 roles で実レイアウトに解決する。 "title": "受発注データ連携の刷新提案", "defaults": { "bodyFontSize": 13, "bodyLineSpacing": 115 }, "slides": [ { "layout": "COVER", "title": "…", "subtitle": "…" }, { "layout": "CONTENT_PROPOSAL", "title": "要旨:二重入力の解消で月次締めを3 営業日短縮", "body": [ { "text": "状況", "role": "heading" }, "受注と発注を別々に入力し、月 5 営業日かけて突合" ] }, { "layout": "TITLE_ONLY_PROPOSAL", "title": "見えている遅延の下に転記ミスがある ", "figures": [ { "type": "iceberg", "x": 0.5, "y": 1.2, "w": 5.9, "h": 3.4, "above": ["月次締めに 5 営業日"], "below": ["受注・発注の二重入力", "転記ミスの手作業修正"] }, { "type": "so_what", "x": 6.6, "y": 1.2, "w": 2.9, "h": 3.4, "text": "遅延だけ短縮しても再発する" }, { "type": "source_note", "x": 0.5, "y": 4.8, "w": 9.0, "source": "情報システム部ヒアリング(2026 年 8 月)" } ] } ] } 座標はインチ、原点は左上。内部で 1in = 914,400 EMU。 body の⾏は role で heading / strong / note を付ける。⾏内記法は **強調** と [表⽰](#12) だけ。 ‧imageSlots があるレイアウトでは x/y/w/h を省略 出典: references/template-schema.md §2、第 1 章①のサンプル spec(out/showcase/proposal-sample.json)から抜粋 AIxDevOps © 2026 Scalar, inc. 17
  19. テンプレート登録: マスターを解析し、ロールと画像枠を実物から推定する placeholder と座標 を抽出 presentations.get 推定ルール 役割を推定 画像枠を合成 templates/<id>.jso

    n 内容 具体例 ① 表⽰名 title / 表紙 → COVER、section / 中扉 → SECTION、thank → CLOSING ② 構成 TITLE+SUBTITLE → COVER、TITLE+BODY → CONTENT、TITLE → TITLE_ONLY この資料の aixdevops.json では COVER = TITLE_SLIDE、SECTION = TITLE_AND_2_COLUMNS_1 に解決さ ③ 画像枠 同梱スライドの画像を重なり ≥ 0.5 で束ね、2 回以上出た枠だけ採⽤ ④ 上限 枠は⾯積順に 1 レイアウト 4 つまで。確認済み roles は引き継ぐ ⑤ ⽬視 roles はレイアウトのサムネイルで必ず確認する(--thumbnails) れ、表紙に右下 3.05 × 2.03in の画像枠が ⾒つかっている。 複製⽅式(copy)で、マスターを新規作 成できない API の制約を回避する。 出典: scripts/inspect_template.py guess_role / merge_image_slots(SAMPLE_SLOT_MIN = 2、MAX_SLOTS_PER_LAYOUT = 4)、templates/aixdevops.json AIxDevOps © 2026 Scalar, inc. 18
  20. ⽣成の処理順: 複製 → 全削除 → リクエストを積む → 最後に 1 回で送る

    # 処理 順序の理由‧具体例 1 files.copy でマスターを複製 ロゴ‧配⾊‧フッターは複製で継承する。spec には書かない 2 同梱スライドを全削除 existingSlideIds は参考値。実在する全スライドを消し、ずれていれば警告 3 spec を事前検証 TITLE の有無や bodies の数をリクエストを積む前に全部検査する 4 createSlide + placeholderIdMappings レイアウトの TITLE / BODY に⾃分の objectId を割り当てる 5 insertText → ALL スタイル → ⾏ロール 空シェイプへのスタイルは insertText で消える。FIXED_RANGE は最後 6 figures を Canvas で描画 座標に展開して図形‧線‧テキストのリクエストを積む 7 ページ番号を TEXT_BOX で描く SLIDE_NUMBER placeholder は API が黙って無視するため 8 commit: batchUpdate 10,000 件 / 5MB まで 1 回で送る。第 1 章①は 427 件を 1 バッチ 出典: scripts/build_deck.py TemplateDeck.create / add_slide / add_page_numbers / commit(上限は MAX_REQUESTS_PER_BATCH / MAX_BATCH_BYTES) AIxDevOps © 2026 Scalar, inc. 19
  21. ⽣成後の第 2 パス: 実サイズを読み戻して画像の fit とノートを補正する batchUpdate ① (全ページ) presentations.getで

    実サイズとnotesのIDを取得 createImage の挙動 batchUpdate ②(補正) _post_pass の補正 ⼀時アップロード画像を削除 この資料での実例 この資料は 40 枚超のサムネイルを image ‧要求サイズを無視し元の⽐率を保つ ‧get() で size.magnitude を読む で貼る。AssetStore が Drive に⼀時アッ ‧4.30 × 2.90 の枠に 4.30 × 2.42 で ‧Transform を ABSOLUTE で上書き プロードし、リンク閲覧可にして ⼊る ‧scaleX = inches(w) / 実幅 で枠に合 createImage へ渡し、commit 直後に削 ‧cover / stretch を⽣成時に実現でき わせる 除する。Slides は挿⼊時に画像をコピー ない ‧notes の ID を得てから流し込む するので元は残さない。 ‧notes の ID が createSlide の応答に 無い 出典: scripts/build_deck.py _post_pass、scripts/images.py AssetStore、references/api-notes.md「createImage」 AIxDevOps © 2026 Scalar, inc. 20
  22. Canvas の 4 つの台帳: 描いた図形をすべて記録し、それが監査の⼊⼒になる class Canvas(IllustrationMixin, IconLibraryMixin, CloudIconMixin, ImageMixin,

    ChartMixin, PatternMixin, PageMixin, EventMixin): def __init__(self, deck, slide_id, template): self.rects = {} # oid -> (x, y, w, h, kind) 全図形の実座標 self.connectors = [] # {oid, p1, p2, free, anchored, seq} self.texts = {} # 文字を持つ図形(overlap / text_fit 用) self.solids = [] # 塗りつぶし図形(後に描くと下を隠す) self._seq = 0 # 描画順。Slides は後の要素が上に来る def audit_all(self, *, connectors=True): out = self.audit_bounds() if connectors: out += self.audit_connectors() return out + self.audit_overlaps() + self.audit_text_fit() 要点 1 スライド = 1 Canvas。flow も pie も cloud_zone も同じ台帳に記録する。 回転は⾓度フィールドが無いためアフィ ン変換で表現し、_aabb() が回転後の外 接矩形を返す。監査はこれを使う。 4 監査は 1 つずつ呼ぶと落とされるので audit_all でセットにする。 deck spec(JSON) / deck.py(DSL) 何を描くかを書く Canvas + 8 Mixin(69 部品) 座標に展開し、台帳に記録し、監査する Slides API batchUpdate 図形‧線‧テキストとして描く 出典: scripts/diagrams.py Canvas.__init__ / _elem_props / _aabb / audit_all(⾏番号は v1.30.0) AIxDevOps © 2026 Scalar, inc. 21
  23. スロット機構: $slot と $density で、同じ⾻格を印刷⽤と登壇⽤に分岐する 検証の中⾝ 順序: ① density 解決

    ② validate_input // slide-templates/analysis/fishbone-diagram/template.json(抜粋) { "schemaVersion": 1, "slots": { "effect": { "type": "string", "required": true, "maxLength": 24 }, "categories": { "type": "array", "minLength": 2, "maxLength": 6 }, "source": { "type": "string", "required": true } }, "slide": { "layout": "TITLE_ONLY_PROPOSAL", "title": { "$slot": "title" }, "figures": [ { "type": "fishbone", "x": 0.5, "y": 1.1, "w": 9.0, "h": 3.4, "effect": { "$slot": "effect" }, "categories": { "$slot": "categories" }, "size": { "$density": { "print": 9, "presentation": 11 } } }, { "type": "source_note", "x": 0.5, "y": 4.8, "w": 9.0, "source": { "$slot": "source" } } ] } } // 利用側: データ JSON を渡すだけ $ render_slide_template.py --template analysis/fishbone-diagram \ --data data.json --density print --out out/page.json (未知‧必須‧型)③ 値の無いスロット を拒否 ④ default に data を上書き ⑤ $slot 置換。 headers と rows の要素数⼀致も検査。 $density はスカラーか平坦配列のみ。 ‧$slot に兄弟キーがあれば曖昧としてエ ラー ‧manifest はプロセス内で 1 回読む 出典: scripts/slide_templates.py render_template / validate_input / arity_rules、slide-templates/manifest.json(例は説明⽤に簡略化) AIxDevOps © 2026 Scalar, inc. 22
  24. code-first 経路: 図が主役のデッキは Python DSL で書いて検査する 仕組み from deckkit import

    slide, Canvas # examples/scalardb-scalardl/deck.py の書き方 @slide("3 層構成: アプリ → ScalarDB Cluster → 各 DB", layout="TITLE_ONLY_PROPOSAL") def s_architecture(d: Canvas): app = d.shape(0.6, 1.0, 2.4, 0.7, text="アプリケーション") db = d.shape(3.8, 1.0, 2.4, 0.7, text="ScalarDB Cluster") pg = d.shape(7.0, 0.7, 2.4, 0.6, text="PostgreSQL") dy = d.shape(7.0, 1.5, 2.4, 0.6, text="DynamoDB") d.connect(app, db) # API コネクタ。図形を動かすと追従 d.connect(db, pg, category="BENT") # エルボーで 1 対多の交差を避ける d.connect(db, dy, category="BENT") # $ validate_layout.py deck.py → 座標だけで 8 種の検査 # $ render_deck.py deck.py --dry-run → 構成を列挙 # $ render_deck.py deck.py → 生成(検証に失敗すると中止) @slide が SLIDES に登録し、1 モジュー ル = 1 デッキ。 validate_layout.py は TrackedCanvas で 全図形の端を追跡する。フッター固定要 素は除外。 55 枚(図 46 枚)の ScalarDB 解説デッキ が実例。 ‧--skip-validate は使わない 出典: scripts/deckkit.py、scripts/validate_layout.py、examples/scalardb-scalardl/README.md AIxDevOps © 2026 Scalar, inc. 23
  25. オフライン検査は 8 種: 座標だけで分かる⽋陥を API 課⾦の前にすべて落とす 検査 何を⾒るか 判定値(インチ) レイアウト解決

    layout が roles / layouts のキーとして解決できるか — プレースホルダ TITLE / SUBTITLE の有無、bodies の数 ≤ BODY 枠数 — タイトル折返し 全⾓換算幅が 1 ⾏に収まるか(2 ⾏になると図に重なる) TITLE_EM_MAX = 30.5 描画例外 図の座標計算で例外が出ないか(try で包む) — フッター侵⼊ 描画の下端が本⽂域を越えないか DY1 = 4.30(+0.001) 左右はみ出し 中央揃えラベルの張り出しを許容しつつ端を⾒る X0 − 0.25 / XE + 0.25 audit_bounds 各図形の 4 辺とコネクタ端点がページ内か BOUNDS_SLACK = 0.02 audit_connectors ほか 2 種 浮き‧埋没 / 隠蔽‧衝突‧線の貫通 / あふれ‧孤⽴⾏(overlaps / text_fit) 第 4 章で詳述 本セッションの実例 第 1 章①の執筆時、--dry-run --strict は「slides[5]: A line runs across text (0.18in inside): "対象業務と製品を決める"」を指摘した。ガントのバーに⼊ らないラベルが右へ押し出され線と交差していた。ラベルを外して再検証し、指摘ゼロで⽣成した。 出典: scripts/validate_layout.py check()、scripts/deckkit.py の定数、本セッションの実⾏ログ(2026-09-06) AIxDevOps © 2026 Scalar, inc. 24
  26. 23 スキルは 6 カテゴリ。description の Use / Not で排他に振り分ける デッキ⽣成(6)

    テンプレート作成(3) 図と画像(2) google-slides-template / google-slides / template-forge(新規マスター)/ drawio-diagrams(密な構成図)/ scalar-product-slides / slide-template-creator(単⼀スライド)/ image-slots(既存デッキの空き画像枠を scalar-proposal-slides / nexus-report-slides analysis-template-creator(分析フレーム Gemini で埋める) / hearing-slides ワーク) QA と出⼒(4) 営業と分析(8) 振り分けの書式 slide-qa(サムネイル⽬視)/ pptx-export / scalar-account-plan / frontmatter は name と description の 2 spreadsheets(⾒積‧BOM)/ settings(2 scalar-account-planning-session / キーのみ。description に「Use for: ⽇英ト つのスイッチ) scalar-ae-materials / scalar-deal-intake / リガー」と「Not: 隣のスキル名」を書き、 scalar-nurture-intake / b2b-account-maps / 23 個が互いを排他にする current-state-analysis / hearing-sheet 出典: skills/*/SKILL.md、AGENTS.md「Skill routing」、.claude-plugin/marketplace.json(v1.30.0) AIxDevOps © 2026 Scalar, inc. 26
  27. /forge の流れ: 4 問 × 3 往復で聞き、承認の後は無停⽌で納品する テンプレート‧⽤途‧構成 ‧分量 枚数

    / レイアウト / 全結論 ⽂ サムネイル⽬視、PPTX、 URL は 1 つ Q1 セット 承認 ⽣成 → QA → 納品 Q2 セット 執筆 → 検証 図の使い⽅‧素材‧保存先 ‧QA‧出⼒形式 spec、--dry-run --strict 質問 選択肢の作り⽅ 決まること テンプレート list_templates.py --json の上位 3 + 「URL を登録」 roles / imageSlots / 配⾊ ⽤途 提案‧営業 / 講演 / 社内共有 レイアウト系統(PROPOSAL / PRESENTATION)と密度 構成 deck-outlines.md の 3 型 + 「内容に合わせる」 章⽴てと部品の当て 分量 約 10(15 分)/ 約 20(30 分)/ 40 枚以上 章の粒度、付録の有無 出典: commands/forge.md、references/interactive-intake.md §1〜§3(settings.json が答える質問は聞かない) AIxDevOps © 2026 Scalar, inc. 27
  28. 参照は段階読み込み: 選んだスキルを全部読み、references は必要な節だけ開く きっかけ 読むもの intake の分岐が⾜りない interactive-intake.md の該当節 spec

    の書式‧プレースホルダ template-schema.md Canvas / コネクタ diagrams.md(レシピは diagram-cookbook.md) 表‧グラフ / フレームワーク charts.md / patterns.md の該当部品 ページの⾻格 slide-patterns.md の該当⾻格 $template list_slide_templates.py --tag → その template.json 断の質を保つこと。 API エラー api-notes.md を検索。未解決なら google-slides-api.md ‧未選択の⽣成スキルは先読みしない ⼤規模デッキ parallel-generation.md 視覚 QA slide-qa/SKILL.md と validation.md Gate 2 なぜ段階読み込みか description は全セッションに読み込まれ るので短く保ち、本⽂は選ばれた 1 つだ け全⽂を読む。 カタログや API マニュアルは節を検索し てから開く。 狙いは主エージェントの⽂脈を空けて判 ‧references は⽇英の対訳 出典: references/workflow-contract.md「Progressive reference loading」(16 ⾏) AIxDevOps © 2026 Scalar, inc. 28
  29. 構成の決め⽅: 4 つのアウトライン型 × 6 つの⾻格 × 35 の部品型から選ぶ この資料での適⽤

    第 1 層 アウトライン型(4) 問題解決型提案 12‒20 枚 / 新規事業稟議 20‒60 枚 (15 節)/ 製品紹介 10‒20 枚 / 講演 15‒30 枚 この資料の第 1 章は⾻格 B の連続。左 5.9in にサムネイル 2 × 2、右 2.9in に so_what。座標は標準値(図 x 0.5 w 5.9、so_what x 6.6 w 2.9、source_note y 4.8)を使う。 第 2 層 ページの⾻格(6) 第 3 層 部品型(35 / 7 分野) A 全幅 1 図 / B 左図+右⽰唆 / C 左右 2 図 / D 上下 2 段 / E 全幅図+下帯 / F ⽂字のみ ⽤途で変えるのは⾻格ではなく密度。登 壇⽤は A‧F、配布⽤は B が最頻。 構成‧定量‧⽐較評価‧構造論理‧計画体制‧定性 技術‧締め付録。標準座標は実測済みで、そのまま 使えば audit を通る 出典: references/deck-outlines.md、references/slide-patterns.md「⾻格の標準座標」、examples/slide-pattern-index.json(59 枚) AIxDevOps © 2026 Scalar, inc. 29
  30. 6 つの⾻格はこれだけ。どのデッキでも同じで、変わるのは 1 枚に載せる量 A 全幅 1 図: 表や⼤きなツリー B

    左図+右⽰唆: 最頻‧標準 C 左右 2 図: 2 つの事実を対にする D 上下 2 段: 流れと内訳 E 全幅図+下⽰唆帯: matrix / posmap F ⽂字のみ: 前提‧定義‧条件 出典: references/images/slide-patterns/skeleton-*.png(リポジトリ同梱のカタログ画像)、references/slide-patterns.md AIxDevOps © 2026 Scalar, inc. 30
  31. デザインルール: 結論⽂のタイトル、1 枚 1 メッセージ、数値には出典 ルール 内容 誰が守らせるか アクションタイトル 結論の⽂。全⾓

    40 字 / ⾏、2 ⾏まで。順に読むと論旨になる AI(承認ゲートで⼈が⾒る) 縦の論理 タイトルだけ読んでも図だけ⾒ても同じ結論に着地する AI + 視覚 QA 1 枚 1 メッセージ 箇条書き 6 ⾏以下、登壇⽤は 3 ⾏ AI 数値には出典⾏ source が空なら ValueError。出典の無い数字は載せない コード(pages.py) グラフの誠実さ 基線ゼロ固定、⼆重軸なし、合計不⼀致は例外 コード(charts.py / pages.py) ⽰唆ボックス 全体の 2 割以下。タイトルの焼き直しは書かない AI 可読性 本⽂ 12pt‧タイトル 20pt 以上、コントラスト 4.5:1、3 ⾊まで AI + colors.readable_on() ⽂字量 1 ⾏の全⾓数 = (幅 − 0.2in) × 72 ÷ pt。9in‧12pt で 54 コード(audit_text_fit) ⽰唆 形が権威的に⾒える図ほど根拠の無い内容が危ないため、lean_canvas や posmap は出典のある値だけ、testimonial は実在の発⾔のみ。⼈が⾒る規 則とコードが⽌める規則は表で分けてある。 出典: references/slide-patterns.md「設計の根拠(2026-08 調査)」「アンチパターン」、references/charts.md、references/patterns.md AIxDevOps © 2026 Scalar, inc. 31
  32. 視覚 QA: AI がサムネイルを⾒て 14 項⽬を点検し、spec を直して再⽣成する fetch_thumbnails. py --size

    LARGE チェック項⽬(抜粋) Read で PNG を開く (全ページ) 14 項⽬ + ⽬を細める テスト spec を直す → dry-run → 再⽣成 cleanup_qa.py 座標監査では拾えない理由 運⽤ルール 1 ⽂字だけ次⾏に落ちる「〜へ」 折返し位置はレンダラ依存 ⽮印が別の図形の上を横切る 接続の有無は分かるが経路品質は不可 A→B のつもりが A→C に付いた 意味の正しさは座標に無い ラベルが • や棒の端に密着 重なっていないが窮屈 表の列揃え(年は中央、数値は右) 既定の揃えが内容に合わないことがある ⾒る順番: 要素が多い⾴ → 複雑な図 → 表 → 章の先頭 → 表紙。全ページを⾒る。 再⽣成した古いデッキは削除して URL を 1 つにする。固定 URL のデッキは削除し ない。 直した点と直さなかった点を報告する。 淡⾊の上の淡⾊ コントラストは監査対象外 ロゴ‧フッターの⼆重描画 複製で継承済みのものを再描画 ⽬を細めて最初に⽬に⼊るのが主張か 図が伝わるかは⼈(AI)が⾒る 出典: skills/slide-qa/SKILL.md、references/validation.md Gate 2(14 ⾏のチェック表) AIxDevOps © 2026 Scalar, inc. 32
  33. 視覚 QA のチェックリスト 15 項⽬: 座標監査が証明できないものを⽬で確かめる ⾒る場所 よくある不具合 → 直し⽅

    ⾒る場所 よくある不具合 → 直し⽅ 箱の中の⽂字 1 ⽂字だけ次⾏に落ちる → ⽂⾔を短くする ⾊ 淡⾊に淡⾊で 4.5:1 未満 → readable_on() タイトル 2 ⾏に折り返し図を覆う → 全⾓ 30.5 字以内に フッター ロゴ‧著作権に⾃前の描画が重なる → DY1 より上 ⽮印の経路 別の図形を横切る → 図形を並べ直す 余⽩ 図が上に寄り下が空く → ブロックの⾼さを増やす ⽮印の端点 A→B のつもりが A→C → 意味を⽬で確認 プレースホルダ 本⽂が溢れる‧切れる → ⽂字量か bodyFontSize パネルの幅 右端が狭く⽂字が溢れる → 幅を配り直す ページ番号 無い‧2 桁で切れる → 位置と幅を確認 ラベル ⽮印‧罫線に重なる → align で外へ押し出す ロゴ‧フッター ⼆重に描かれる → ⾃前の描画を削除 マーカー隣 • ◆ 棒端に⽂字が密着 → valign MIDDLE レイアウト系統 Proposal と Presentation が混在 → layout を直す 表の列揃え 年は CENTER‧数値は END‧⽂は START 仕上げの⾒⽅と、監査の限界 ⽬を細めるテスト: SMALL サムネイルで最初に⽬に⼊るものが主張か。座標監査で拾えない 6 つ(不⾃然な折り返し‧意味的な接続‧経路の横切り‧ ⽮印の向き‧コントラスト‧伝わるか)は必ず⽬で⾒る。 出典: references/validation.md ゲート 2「チェックリスト」「⽬を細めるテスト」「何を検出できないか」 AIxDevOps © 2026 Scalar, inc. 33
  34. 本セッションの視覚 QA: 6 種の⽋陥を⽬視で拾い、spec を直して再⽣成した ⾒つかった⽋陥 なぜ --dry-run で拾えないか 直し⽅

    サムネイル説明⽂が 2 ⾏に折り返し、下段の画像に 隠れた image は実ファイルが要るため座標監査の対象外 captionSize 8、説明⽂を全⾓ 23 字以内に 表の最終⾏が⽰唆ボックスの下に隠れた 表の実⾏⾼(最⼩ 0.33in)と後続図形の重なりは未監査 rowH を実値で書き、ボックスと出典⾏を下げる 表の最終⾏が出典⾏に接触した 同上。⾏が折り返すと表が伸びる セルを 1 ⾏に収め、⾏数を減らす flow の箱で Approve の e だけが 2 ⾏⽬に 折り返し位置はレンダラ依存(孤⽴⾏は推定のみ) size 9‧gap 0.2 で箱を広げる 終了ページのロゴ⽋けと迷⼦のハイフン テンプレートの FINAL_SLIDE ⾃体の装飾 BLANK レイアウトに metric で締めを描く タイトルが 20pt 1 ⾏に⼊らない(最⻑ 46 字) spec 経路はタイトル幅を監査しない titleFontSize 16、全⾓ 38 字以内に短縮 QA の分担と再取得 44 枚を 3 エージェント(sonnet)に分け、返答は「ページ番号: 症状」の 1 ⾏だけにした。修正後は変更ページと隣接ページだけ再取得し、旧版は Drive で削除して URL を 1 つに保った。 出典: 本セッションの QA ログ(2026-09-06)、references/parallel-generation.md §6、skills/slide-qa/SKILL.md Phase 3 AIxDevOps © 2026 Scalar, inc. 34
  35. ⼤規模デッキ: 10 刻みの fragment に分けて並列執筆し、assemble して検証 分担の規則 17 枚までは 1

    エージェント、18〜20 枚 out/<deck>/pages/ 0010-cover.json ← 番号は 10 刻み(間に挿入できる) 0020-exec-summary.json 0120-cost-bars.json ← 1 worker = 2〜3 ページ、参照は 2 節まで 0130-cost-table.json ... $ assemble_spec.py --out out/<deck>/deck.json --title "…" out/<deck>/pages $ build_deck.py --template templates/<id>.json --spec out/<deck>/deck.json \ --dry-run --strict # 重複番号・図表番号の欠番・defaults 不一致も見る で分割を検討。分割は総トークンを増や すので、狙いは主エージェントの⽂脈と 待ち時間。 worker は fragment を⾃⼰検査し、パス と 1 ⾏要約だけ返す。 モデル: 章扉は haiku、⾻格 B〜E は sonnet、座標をゼロから設計する図だけ opus。QA は sonnet 固定。 分けないもの 理由 アウトラインと結論⽂ 順に読んで論旨になる必要があり、主エージェントが全部決める 数字と出典 主エージェントが引⽤⽂字列ごと渡す。worker は数字を書かない 組み⽴てと⽣成 1 か所で assemble → 検証 → ⽣成 出典: references/parallel-generation.md、scripts/assemble_spec.py AIxDevOps © 2026 Scalar, inc. 35
  36. この資料の作り⽅: 第 1 章の各ページはサムネイル 4 枚 + so_what の spec

    このデッキの⼯程 ⼿順: ① サンプル 4 デッキ⽣成(49 枚の カタログは 2,781 リクエストを 1 バッ { "layout": "TITLE_ONLY_PROPOSAL", "title": "②図解ライブラリ : 69 種の部品を spec の 1 要素で呼び出し、同じ配色で描く ", "figures": [ { "type": "image", "x": 0.5, "y": 0.95, "w": 2.85, "h": 1.55, "source": "out/showcase/thumbs/catalog/slide-04.png", "fit": "contain", "captionAt": "box", "outline": "#D6E4F2", "caption": "flow + cards: 工程の流れとカード …" }, { "type": "image", "x": 3.55, "y": 0.95, "w": 2.85, "h": 1.55, "source": "…/slide-15.png", … }, { "type": "image", "x": 0.5, "y": 2.78, "w": 2.85, "h": 1.55, "source": "…/slide-20.png", … }, { "type": "image", "x": 3.55, "y": 2.78, "w": 2.85, "h": 1.55, "source": "…/slide-21.png", … }, { "type": "so_what", "x": 6.6, "y": 0.95, "w": 2.9, "h": 3.6, "label": "入力と出力 ", "text": "入力: {\"type\": \"hub\", …}", "points": ["比喩図 15・構造図 5・…", "オフラインで座標に展開して検証できる "] }, { "type": "source_note", "x": 0.5, "y": 4.8, "w": 9.0, "source": "サンプル: examples/design-catalog.json を scalar-2026 で生成 …" } ] } チ)② 73 枚のサムネイル取得 ③ Python で spec ⽣成 ④ --dry-run --strict ⑤ ⽣成 ⑥ ⽬視 QA。 spec は Python の build_spec.py で⽣成 した。 ‧captionAt = box で並べた画像の説明⾏ を揃える ‧image は dry-run の対象外。座標だけ 検査 出典: out/showcase/build_spec.py(本資料の spec ⽣成スクリプト)、本セッションの実⾏ログ AIxDevOps © 2026 Scalar, inc. 36
  37. Tip 1 重なり検知: 箱ではなく「⽂字が実際に占める矩形」で AABB 交差を判定する ※AABB(Axis-Aligned Bounding Box) OVERLAP_MIN,

    OVERLAP_RATIO, LINE_CROSS_MIN = 0.010, 0.06, 0.06 # in², 比, in @staticmethod def _overlap_area(a, b): # 軸平行矩形(AABB)の交差面積 ox = min(a[0]+a[2], b[0]+b[2]) - max(a[0], b[0]) oy = min(a[1]+a[3], b[1]+b[3]) - max(a[1], b[1]) return (ox * oy) if (ox > 0 and oy > 0) else 0.0 def _glyph_rect(self, m): # 文字そのものの外接矩形 tw = min(w, min(longest, per) * size / 72 + inset) th = min(h, lines * size * LINE_EM * ls / 100 / 72) # align (CENTER / END) と valign (MIDDLE / BOTTOM) でオフセット なぜこの設計か 箱で判定すると余⽩の広いラベルが触れ ただけで偽陽性の洪⽔になる。塗りの無 い⽂字は _glyph_rect、塗りのあるパネ ルは箱全体で⾒る。 描画順を使うので、線を引いてから箱を 被せる hub は報告しない。塗りが⽂字を 完全に覆うときだけ抑制する。 結果はキャッシュして全ペア⽐較を抑え 3 系統 判定 隠蔽 後に描かれた塗り図形が⽂字を覆う。⾯積 0.010in² 以上かつ⽂字⾯積の 6% 以上 衝突 塗りの無いラベル同⼠。⼩さい⽅の⾯積に対する⽐で⾒る 線の貫通 線分の矩形内の⻑さを Liang‒Barsky でクリップし、0.06in 以上なら報告 る。 出典: scripts/diagrams.py audit_overlaps / _overlap_area / _glyph_rect / _ink_rect / _segment_in_rect AIxDevOps © 2026 Scalar, inc. 38
  38. Tip 2 コネクタ検知: 符号付き距離で浮き 0.22in‧埋没 0.06in を⾒つける CONN_REACH, CONN_BURY, CONN_CONTAINER

    = 0.22, 0.06, 6.0 # in, in, in² @staticmethod def _dist_to_rect(px, py, rect): """点から矩形境界までの符号付き距離。負は内側(めり込み量) """ x, y, w, h = rect[:4] dx = max(x - px, 0.0, px - (x + w)) dy = max(y - py, 0.0, py - (y + h)) if dx > 0 or dy > 0: return (dx*dx + dy*dy) ** 0.5 return -min(px - x, (x + w) - px, py - y, (y + h) - py) 設計意図 createLine は座標を無検証で受け取る。 ⽮印が浮いていても API は成功を返す。 図形どうしの線は connect()(追従するコ ネクタ)か link()(辺との交点)で引く。 接しない線は free=True で宣⾔。 # 各端点で全図形への距離を取り key=abs で最小を選ぶ # > CONN_REACH → 「どの図形にも接していない」 # < -CONN_BURY → 「図形に埋まっている」 0.22in / 0.06in は誤検出と⾒逃しの均衡 点。 判定から外すもの 理由 free=True の線 軸‧⽬盛‧引出線は接しないのが正しい connect() / link() の線 定義上必ず図形に触れている TEXT_BOX と⾯積 6in² 超 可視境界が無い / ⽮印が容器を貫くのは正常 出典: scripts/diagrams.py audit_connectors / _dist_to_rect / connect / link、references/diagrams.md「図形を結ぶ線」 AIxDevOps © 2026 Scalar, inc. 39
  39. Tip 3 ⽂字あふれ推定: 全⾓換算幅‧⾏⾼ 1.45‧内側余⽩ 0.1in で⾏数を計算する # scripts/_text.py —

    計測の定義は 1 か所だけ _WIDE = "WFA" # East_Asian_Width: Wide / Fullwidth / Ambiguous @lru_cache(maxsize=8192) def em(s): # 全角換算幅。len() は ASCII で 2 倍ずれる return sum(1.0 if unicodedata.east_asian_width(c) in _WIDE else 0.5 for c in s) # scripts/diagrams.py — audit_text_fit TEXT_INSET_X, LINE_EM, TEXT_SLACK, ORPHAN_EM = 0.10, 1.45, 0.04, 1.0 per = ((w - inset*2) * 72.0) / size # 1 行に入る全角数 n = sum(ceil(em(line) / per) for line in lines) need = n * size * LINE_EM * (ls / 100.0) / 72.0 if need > h + TEXT_SLACK: report("箱に対して文字が多すぎる") if 0 < em(line) % per <= ORPHAN_EM: report("最終行に 1 文字だけ残る") なぜ 1 か所か 監査‧執筆補助‧スロット構築が別々の 計測を持つと結論が⾷い違う。em() は _text.py に 1 つだけ置く。 本⽂は audit_body_fit が (幅 − 0.2) × 72 ÷ pt で 1 ⾏の字数を⾒積もり、⾒逃し側 に倒す。 タイトルは TITLE_EM_MAX = 30.5。実測 で 31.0 は 1 ⾏、33.0 は折り返した。 実測した定数 由来 ⾏⾼ = pt × 1.45 Noto Sans JP フォールバック時の実測 横の内側余⽩ 0.10in Slides が全テキスト枠に焼き込む⾒えない余⽩ 縦は引かない 縦のあふれはクリップされない。引くと 1 ⾏ラベルが偽陽性になる 出典: scripts/_text.py、scripts/diagrams.py audit_text_fit / _text_lines、scripts/build_deck.py audit_body_fit、references/api-notes.md「内側余⽩」 AIxDevOps © 2026 Scalar, inc. 40
  40. Tip 4 Slides API の落とし⽳: 実測した制約を回避策に置き換える 制約(実測) 症状 エンジンの回避策 マスター

    / レイアウトを作れない Request 型に Master / Layout が無い 既存マスターを files.copy で複製して再スタイル SLIDE_NUMBER が無視される createSlide が黙って捨てる。エラー無し TEXT_BOX を⾃前で描く。幅 0.5in 以上‧右端固定 createImage が⽐率を保つ 4.30 × 2.90 の枠に 4.30 × 2.42 で⼊る get() で実サイズを読み ABSOLUTE 変換で上書き colorScheme が変更不可 Resetting the color scheme is not supported 派⽣マスターはテーマ⾊参照を RGB に全置換 TRAPEZOID の斜辺が固定 表⽰⾼ × 0.25 / 辺。⾓度を変えられない 矩形 + RIGHT_TRIANGLE 2 つで台形を描く(_taper) 扇形プリミティブが無い 円グラフ‧ハーヴェイボールが描けない pie は SVG → PNG。評価はドットの数で表す propertyState: NOT_RENDERED 透明な全⾯矩形に⾊を付けるとロゴが消える 「⾊はあるが描かない」状態を保持して扱う ゼロのチャンネルが省略される {red:1, blue:1} は紫、黒は {} c.get("green", 0) で読む ⽂字枠の内側余⽩を設定できない 左右 0.1in‧上下 0.05in が常に付く 負のインデント 3 つ(Start / FirstLine / End) 出典: references/api-notes.md(すべて実機で再現した記録)、scripts/build_deck.py、scripts/illustrations.py _taper、scripts/_auth.py indent_style AIxDevOps © 2026 Scalar, inc. 41
  41. Tip 5 性能は実測で決める: 1 バッチ 6.3 秒、16 分割 18.2 秒、並列化は逆効果

    読み取り⽅ 20.1秒 18.2秒 batchUpdate は 10,000 件 / 5MB まで詰 めて 1 回で送る。並列化は同じプレゼン への書き込みが競合して遅くなる。 12.2秒 getThumbnail は 60 回 / 分の固定クォー タ。無制限に叩くと 60 枚超で必ず 429 に 6.3秒 なるので、55/分で⾃⼰制限し指数バック オフを⼊れる。 16 バッチ×500 4 バッチ×2000 1 バッチ×8000 その他の実測 効果 createShape 既定値と同じ指定を送らない リクエスト数 約 19% 減 サムネイル 55/分 + 8 並列 31 枚 31 秒 → 7.3 秒(quota 60/分) 4 並列×2000 出典: scripts/build_deck.py 396〜406 ⾏のコメント(8,000 リクエストの実測)、scripts/fetch_thumbnails.py _RateLimiter、references/api-notes.md AIxDevOps © 2026 Scalar, inc. 42
  42. Tip 6 安全策: 編集前スナップショット、再送の禁⽌、削除は out/ の中だけ 編集前に版を確保 マスターを上書きしない タイムアウトは再送しない snapshot_version.py

    が編集前のリビジョン --into の対象が template.presentationId と batchUpdate は⾮冪等。応答が消えただけ ID を印字し、keepForever でピン留めを試 同じなら即エラー。レイアウト objectId の で適⽤済みの可能性があるため、「デッキが み、PPTX をローカルに退避する。--into に ⼀致で同じマスター由来かも確認する 更新されたか確認せよ」と⽌める 部分更新は原⼦的に 削除の範囲を限定 URL は 1 つ --update-slides は挿⼊と旧ページ削除を同 cleanup_qa.py はリポジトリの out/ 配下し 再⽣成で古いデッキは削除し、利⽤者が持つ ⼀バッチに積み、上限超過なら実⾏前に拒否 か消さない(外は skip)。⼀時アップロード URL を 1 つにする。書き出しは .part に書い する。ページ数が spec と合わなければ動か 画像は commit の finally で必ず削除 て os.replace し、壊れた .pptx を残さない よる差し替えの前に必須 ない 出典: scripts/snapshot_version.py、build_deck.py open / open_partial / _retry、cleanup_qa.py、export_pptx.py、workflow-contract.md「Invariants」 AIxDevOps © 2026 Scalar, inc. 43
  43. Tip 7 ルールをコードで強制: 出典なしの数値や切り詰めた軸は例外で⽌める やりがちな失敗 ⽌め⽅ 出典の無い数字 source_note は source

    が空だと ValueError 棒グラフの基線ずらし charts は基線ゼロ固定。切り詰めは ValueError ⼆重軸で相関を演出 linechart は⼆重軸を持たない(仕様) の不注意」で⽌めない、など。 ウォーターフォールの合計不⼀致 最後の total が積算と合わないと ValueError 因果を主張できるのは因果連鎖を描く⼿ 体制図の詰め込み orgchart は葉 8‧深さ 3‧列 0.85in 未満で ValueError 3 ⾏タイトル governing_message が全⾓ 40 字 × 2 ⾏超で警告 ⽂字あふれ‧重なり --dry-run --strict で 1 件でも⾮ゼロ終了 ⾊覚に依存する系列⾊ 隣接⾊差 ΔE ≥ 9.2 の固定順。凡例は外せない コードで守る範囲を広げる 分析テンプレートは各⼿法に「よくある 誤⽤」を 3 つ以上エンコードする。パ レートに率を混ぜない、なぜなぜを「⼈ 法だけ。 営業側では assumed は confirmed に昇 格できない。 出典: scripts/pages.py、scripts/charts.py、scripts/patterns.py、skills/analysis-template-creator/SKILL.md、commands/account.md AIxDevOps © 2026 Scalar, inc. 44
  44. まとめ: 判断は AI、計算と拒否は Python。⽣成前に落とし、⽣成後に⾒る 何ができるか どう作るか AI のスキル テンプレート準拠デッキ、69 部品の図解、

    spec JSON → オフライン 8 検査 → 1 回の 23 スキルを description で排他に振り分け、 表‧グラフ‧コード、クラウド構成図、92 batchUpdate → 第 2 パス補正 → サムネイル 4 問 × 3 往復の intake と 1 回の承認で無停 テンプレート、営業⽀援。出⼒は Slides / QA → 派⽣成果物 ⽌納品。参照は必要な節だけ読む ⼯夫 守り 次に読むもの ⽂字の実占有矩形で重なりを⾒る。符号付き 実測に基づく 1 バッチ送信と 55/分の⾃⼰制 README.md → 距離でコネクタを⾒る。em 幅と⾏⾼ 1.45 で 限。編集前スナップショット、⾮冪等再送の references/workflow-contract.md → 選んだ あふれを⾒る。API の制約は回避策に置き換 禁⽌、out/ 限定の削除、URL は 1 つ SKILL.md → 必要な references の節。サンプ PowerPoint / draw.io / Excel / Markdown える ルは Drive の samples フォルダ 出典: 本資料全体。⽣成物: Drive「slide-forge 解説」フォルダ(本デッキ、samples/ に 4 デッキ‧⾒積 Sheets‧.pptx) AIxDevOps © 2026 Scalar, inc. 45
  45. Please give us a star on GitH ub! udy AIxDevOps

    St 催 開 週 隔 or 週 毎 GitHub scalar-labs/scalardb connpass Scalar AIxDevOps © 2026 Scalar, inc.