Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
15 changes: 15 additions & 0 deletions docs/glossary.md
Original file line number Diff line number Diff line change
Expand Up @@ -700,3 +700,18 @@ AI エージェントが実施する前提で、作業の A・H・L・C を類
| 見積もりの完了条件 | — | 見積もる作業がどこまで終われば完了かを、supervise のフェーズの名前(設計・実装・検査・配布(開発版)・配布(本番))で表したもの | — | — | `docs/specifications/ndf-estimate.md` |
| 尺度を超える | — | A の見込みと Size 1 の基準との比が、尺度の最大を超えたときの Size の値。最大へ潰さず、分割を検討する印にする | — | — | `docs/specifications/ndf-estimate.md` |
| Size 1 の基準 | — | Size を A の見込みから丸めるときの単位の秒。宣言が無ければ、実績のある課題のうち A の小さい 4 分の 1 の中央値 | — | — | `docs/specifications/ndf-estimate.md` |

## NDF のスライドの作成(`ndf-slide`)

スライドを生成スクリプトで作り、Google Slides へ変換して確かめるときの語

| 語 | 識別子 | 意味 | 廃止した語 | 廃止した識別子 | 正本 |
| --- | --- | --- | --- | --- | --- |
| トーン&マナー | — | スライドの書体・色・文字サイズ・著作権表示・ロゴの値の組。プロジェクトごとに差し替える | — | — | — |
| ページの枠組み | — | 見出し・罫線・ロゴ・著作権表示・ページ番号の位置を固定した、ページを作る共通の関数(page / box / note / tbl / section) | — | — | — |
| 生成スクリプト | — | pptx を出力するスクリプト(pptxgenjs の build-deck.js)。スライドの正本になる | — | — | — |
| 汎用テンプレート | — | 会社色を持たないトーン&マナーとページの枠組みを持つ、生成スクリプトの出発点 | — | — | — |
| 構成メモ | — | スライドのページごとの番号・見出し・役割・根拠の表と、構成の考え方を書いた文書 | — | — | — |
| 台本 | — | ページごとの見出しと読み上げの原稿。配分秒数は見出しに付けてよい(任意)。スピーカーノートへ入れる | — | — | — |
| トーン&マナーのファイル | — | プロジェクトのトーン&マナーの値を持つ JSON(slides/theme.json)。書いた項目だけが汎用テンプレートの既定値を上書きする | — | — | — |
| 尺 | — | 台本の読み上げにかかる時間。読み上げの字数を 350 字/分で割って出す | — | — | — |
61 changes: 61 additions & 0 deletions docs/glossary/glossary.json
Original file line number Diff line number Diff line change
Expand Up @@ -85,6 +85,11 @@
"id": "ndf-estimate",
"name": "NDF の工数の見積もり",
"meaning": "AI エージェントが実施する前提で、作業の A・H・L・C を類似の実績から見積もり、予測と実績を突き合わせるときの語"
},
{
"id": "ndf-slide",
"name": "NDF のスライドの作成",
"meaning": "スライドを生成スクリプトで作り、Google Slides へ変換して確かめるときの語"
}
],
"terms": [
Expand Down Expand Up @@ -4078,6 +4083,62 @@
"context": "ndf-release",
"meaning": "PR の本文の `## 利用者向けの変化` が「無し」(「なし」も同じ)だけを持つこと。承認資料の「含む PR」の行に印を付け、CHANGELOG の版の節と「配る中身」には載せない。節の無い本文(題名で代える)とは別に扱う",
"source": "docs/specifications/ndf-release-approval-included-prs.md"
},
{
"term": "トーン&マナー",
"context": "ndf-slide",
"meaning": "スライドの書体・色・文字サイズ・著作権表示・ロゴの値の組。プロジェクトごとに差し替える",
"source": "",
"pending_source": "issues/issue-2065-requirements.md"
},
{
"term": "ページの枠組み",
"context": "ndf-slide",
"meaning": "見出し・罫線・ロゴ・著作権表示・ページ番号の位置を固定した、ページを作る共通の関数(page / box / note / tbl / section)",
"source": "",
"pending_source": "issues/issue-2065-requirements.md"
},
{
"term": "生成スクリプト",
"context": "ndf-slide",
"meaning": "pptx を出力するスクリプト(pptxgenjs の build-deck.js)。スライドの正本になる",
"source": "",
"pending_source": "issues/issue-2065-requirements.md"
},
{
"term": "汎用テンプレート",
"context": "ndf-slide",
"meaning": "会社色を持たないトーン&マナーとページの枠組みを持つ、生成スクリプトの出発点",
"source": "",
"pending_source": "issues/issue-2065-requirements.md"
},
{
"term": "構成メモ",
"context": "ndf-slide",
"meaning": "スライドのページごとの番号・見出し・役割・根拠の表と、構成の考え方を書いた文書",
"source": "",
"pending_source": "issues/issue-2065-requirements.md"
},
{
"term": "台本",
"context": "ndf-slide",
"meaning": "ページごとの見出しと読み上げの原稿。配分秒数は見出しに付けてよい(任意)。スピーカーノートへ入れる",
"source": "",
"pending_source": "issues/issue-2065-design.md"
},
{
"term": "トーン&マナーのファイル",
"context": "ndf-slide",
"meaning": "プロジェクトのトーン&マナーの値を持つ JSON(slides/theme.json)。書いた項目だけが汎用テンプレートの既定値を上書きする",
"source": "",
"pending_source": "issues/issue-2065-design.md"
},
{
"term": "尺",
"context": "ndf-slide",
"meaning": "台本の読み上げにかかる時間。読み上げの字数を 350 字/分で割って出す",
"source": "",
"pending_source": "issues/issue-2065-design.md"
}
]
}
121 changes: 121 additions & 0 deletions issues/issue-2065-design-decisions.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,121 @@
# #2065 の設計: 決定の記録

設計文書は [issue-2065-design.md](issue-2065-design.md) にある。

## 決定の記録

### 決定 1: Skill の数を増やさないため、既存の 4 つの規約と google-workspace へ足す

利用者は新しい Skill の前に既存の規約への統合を優先すると決めた。体裁設計(`layout-slide.md`)・生成(`form-slide.md`)・
変換と描画(`system-gdrive.md` と `google-workspace`)・体裁レビュー(`layout-review`)の分担は今のまま成り立ち、
足すものはどれかの持ち場に収まる。gws のコマンドの正本は既に `google-workspace` の対応表にあるため、変換と
サムネイルの行もそこへ足す。

新しい Skill(例: スライドの作成)を作る案は、同じ手順の持ち場が 2 つになり、既存の 4 つの規約から辿る経路と
重なるため採らない。

根拠: Value 6・Value 7(MVV 版 2)

### 決定 2: すべてのランタイムで同じテンプレートを使うため、汎用テンプレートを release Skill の assets に置く

Skill のディレクトリは 4 ランタイムへディレクトリごと配られる(Kiro はリンク、agy はリンク、Codex と Claude Code は
プラグインのディレクトリ)。生成の手順を持つ `release` の配下に置けば、手順とテンプレートが同じ版で届く。
配布先のリポジトリはそこから資料のディレクトリへ写す。

`docs/` に置く案は、配布物に含まれず配布先のリポジトリから辿れないため採らない。新しい Skill の配下に置く案は決定 1 で採らない。

根拠: Value 5(MVV 版 2)

### 決定 3: 生成スクリプトの経路を規約で扱えるようにするため、スライドの生成の経路に「生成スクリプトを書く」を決定的な経路として足す

生成スクリプトは AI が書くが、同じスクリプトと台本と `theme.json` からは同じ pptx が出る。決定的なため、生成物は
保存しなくてよく、正本は生成スクリプトと台本になる。今の「変換器を使う」は正本の Markdown を前提にし、「AI エージェントが
組む」は非決定的を前提にするため、どちらにも入らない。足す先はスライドだけにし、文書・表計算・ページの形の経路は
変えない。

「変換器を使う」に含める案は、起点(正本の Markdown の直前の版)と 1 ページの区切り(`##` の見出し)が成り立たない
ため採らない。

根拠: Value 6・Value 8(MVV 版 2)

### 決定 4: 枠組みの更新でプロジェクトの値を失わないため、トーン&マナーは theme.json で上書きし、枠組みは写して書き換えない

既定値は枠組みのファイルが持ち、プロジェクトは変えたい項目だけを `theme.json` に書く。枠組みの更新は `lib/` を写し直す
だけで、`theme.json` には触れない。座標は枠組みの定数に固定し、トーン&マナーに含めない(I1)。

手本のように生成スクリプトの先頭の定数を書き換える案は、枠組みの更新を取り込むたびに書き換えが上書きされるため採らない。
環境変数か引数で値を渡す案は、資料ごとの値がリポジトリに残らず、同じ資料を作り直せないため採らない。

根拠: Value 5(MVV 版 2)

### 決定 5: 会社色を持たず配布先で同じ見え方にするため、既定の書体を Noto Sans JP、強調の色を 2B6CB0 にし、著作権表示とロゴは既定で描かない

Noto Sans JP は Google Slides の書体の一覧にあり、変換の後も代替が起きにくい。作業の端末の描画(Noto Sans CJK JP)とも
字形が揃う。強調の色は 1 色に絞る(`layout-slide.md`)。著作権表示とロゴは持ち主によって違うため、既定では描かず、
`theme.json` で足す。

手本の書体と色を既定にする案は会社色になるため採らない。Windows の既定の書体(BIZ UDP ゴシックなど)は Google Slides と
macOS で揃わないため採らない。

根拠: Mission・Value 5(MVV 版 2)

### 決定 6: スピーカーノートを台本と食い違わせないため、枠組みが台本を読んでページ番号でノートを付ける

生成スクリプトに読み上げを写すと、台本を直したときに片方だけが古くなる。枠組みが台本を読み、ページを作るたびに同じ番号の
読み上げをノートへ付け、保存の前にページ数を照合する(I4・I5)。台本は Markdown の 1 ファイルにし、区切りは台本の
第 7 稿の形(`## <番号>. <見出し>` と `>` の読み上げ)に合わせる。

生成スクリプトの各ページで `addNotes` に文を書く案(手本の形)は、台本と 2 か所に同じ文を持つため採らない。

根拠: Value 7(MVV 版 2)

### 決定 7: 台本の読み取りを 1 つにするため、尺の計算を枠組みと同じ JavaScript で持つ

尺の計算は台本の読み上げを数えるため、ノートの付与と同じ読み取りを使う。Python で別に書くと、同じ形を読む関数が 2 つの言語に
分かれ、片方だけが直る。計算は字数を数えて割るだけの決まった手順なので、スクリプトにする。

手本の 1 行の Python を README に書く案は、手順を文書に置き、読み取りを 2 つにするため採らない。

根拠: Value 4・Value 6(MVV 版 2)

### 決定 8: 全ページを決まった手順で見られるようにするため、サムネイルの取得をスクリプトにし、変換と差し替えは対応表のコマンドで打つ

サムネイルはページの ID を取り、ページごとに API を呼び、返った一時的な URL から画像を取る。ページ数だけ同じ手順を繰り返す
ため、`google-workspace` のスクリプトにする。変換(上げて複製)と差し替えは 1〜2 回打つだけで、アップロード先の共有範囲を
確かめる判断を挟むため、対応表のコマンドのまま AI が打つ。

PDF に書き出してから画像にする今の経路は、Google Slides の描画をそのまま見られるサムネイルより手順が多いため、
Google Slides では採らない(Google ドキュメントには残す)。

根拠: Value 4(MVV 版 2)

### 決定 9: 発表資料を発表日時点の記録にするため、資料は枠組みを写して持ち、汎用テンプレートを直接読まない

`docs/presentations/` の資料は発表日時点の記録で、以後の構成の変更に追随しない(`AGENTS.md` の「ドキュメント」の表)。
資料が `plugins/` の枠組みを直接読むと、枠組みを変えたときに過去の資料の生成結果が変わる。写して持つと、配布先と同じ手順を
このリポジトリでも通すことになる。

リポジトリの中の相対パスで汎用テンプレートを読む案は、写しを持たずに済むが、記録が後から変わるため採らない。

根拠: Value 7・Value 9(MVV 版 2)

### 決定 10: 成果物を 1 つにするため、pptx をコミットせず Google Slides を成果物にし、公開ページの入口に足さない

生成は決定的なため pptx は作り直せる(決定 3)。発表に使うのは利用者の Drive の Google Slides で、共有の設定はこの課題の
範囲外である。Pages で公開できる書き出し(PDF・HTML)を持たないため、`index.html` には足さず、
`docs/presentations/README.md` の資料一覧にだけ足す。

pptx か PDF をコミットして `index.html` から開ける案は、社外へ出す前の資料を公開の場所へ置くことになり、公開の判断
(C5 に準じる)を先取りするため採らない。

根拠: Value 1・C5(MVV 版 2)

### 決定 11: 生成のテストが CI で読み飛ばされないよう、pytest のジョブに Node.js 22 と npm ci を足す

生成のテストは pptxgenjs を要る。前提のコマンドが無いとき既定で失敗する根の `conftest.py` の仕組みへ `node` を足し、
CI の pytest のジョブで `actions/setup-node` の 22 と、汎用テンプレートと発表資料の `npm ci` を打つ。生成した pptx は
Python の標準ライブラリ(zip と XML)で検査する。

生成のテストを手元だけで回す案は、CI が版面と差し替えの壊れを見逃すため採らない。

根拠: Value 3(MVV 版 2)
Loading
Loading