Repository navigation
スプリント s2065 - #2070
スプリント s2065#2070
Conversation
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…#2065) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…うにする (#2065) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…2065) 2026-08-06 の資料の md・html・pdf は発表日時点の記録として残す。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…2065) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
8 ページ目の段の続きの矢印を見出しの列へ移し(工程の箱の間にあると箱どうしの流れに読める)、 箱の文字を 8.5pt にした。12 ページ目の箱の文字を 9pt、22 ページ目の「る」だけの行を解消した。 9・18・20 ページ目は本文の領域の下に偏った空白を、区画と表の高さで埋めた。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…2065) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
#2065 を実装する(スプリント s2065)
…frame.js#mergeTheme Item-Id: I-001 Impl-Runtime: claude Impl-Model: claude-opus-5-5 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ib/deck-frame.js#mergeTheme font・colors/sizes の 1 グループ・copyright・logo の検証と代入を mergeFont / mergeGroup / mergeCopyright / resolveLogo へ抽出し、mergeTheme を既定値の複製・形の検証・未知キーの検査と 抽出した関数の呼び出しだけにする。docs/presentations/ の写しは変えない。 Item-Id: I-001 Impl-Runtime: claude Impl-Model: claude-opus-5-5 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
…ce/scripts/gws_common.py#EXIT_UNAUTHENTICATED gws-check.py と slides-thumbnails.py に別々にあった未認証の終了コード(EXIT_UNAUTHENTICATED)と gws の待ち時間(TIMEOUT)を gws_common.py の EXIT_UNAUTHENTICATED / GWS_TIMEOUT へ集め、 両スクリプトはそこから読み込む。slides-thumbnails.py の docstring の同期の注記も参照先へ書き換える。 Item-Id: I-002 Impl-Runtime: claude Impl-Model: claude-opus-5-5 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
改修計画 — devbasex/ai-plugins #2070
改善項目I-001 —
|
| 兆候 | 手法 | 重要度 | 等級 | 提案元 | 状態 | コミット |
|---|---|---|---|---|---|---|
| long_method | extract_method | major | high | claude / codex / kiro | 取り消し | 2 |
なぜ: 1 関数に theme.json 全体の検証・colors/sizes の項目別検証・font/copyright/logo の検証が同居し、CC30・認知的複雑度30・51 行・分岐が深い(指標の本体最上位)。colors と sizes のループは group ごとに型と値の判定と失敗メッセージを分岐で持ち、logo は存在確認まで抱える。値の検証を group 単位の小関数(validateFont / validateColorSizeGroup / validateLogo)へ抽出すれば、mergeTheme は『既定へ重ねる』骨格だけになる。既存テスト(test_slide_template.py の test_bad_theme_stops_with_1・test_partial_theme_keeps_other_defaults 等)が振る舞いを守る。注意: このファイルは『写して使う』正本で、変更すると presentation 側の写し(docs/.../slides/lib/deck-frame.js)の再コピーと README.md の sha256 ハッシュ更新が連鎖する。見積りはその連鎖分を含む。
手順: 1. 現状固定テストを足す: node -e で require('./lib/deck-frame').mergeTheme を呼び、未検証の経路(override が配列・font が空文字・sizes が 0 以下・colors がオブジェクトでない・copyright が数値・logo が空文字・logo のファイルが無い・logo が null)の DeckError の code と message、正常時の戻り値を記録する(test_slide_template.py に parametrize で 1 本)
2. font の検証と代入を mergeFont(t, override) として抽出
3. colors / sizes の 1 グループ分を mergeGroup(t, group, g) として抽出
4. copyright を mergeCopyright、logo を resolveLogo(value, baseDir) として抽出(戻り値を t.logo へ代入)
5. mergeTheme は既定値の複製・形の検証・未知キーの検査のあと、抽出した関数を順に呼ぶだけにする
6. docs/presentations/ の写しは変更しない(test_deck_uses_copied_frame のハッシュが落ちるため)
7. 全体テストと check-lint を通す
取り消した理由: 最終ゲート修正を打ち切った後に、着手前の木へ戻した(案 B)
I-002 — plugins/ndf/skills/google-workspace/scripts/gws_common.py#EXIT_UNAUTHENTICATED
| 兆候 | 手法 | 重要度 | 等級 | 提案元 | 状態 | コミット |
|---|---|---|---|---|---|---|
| duplication | consolidate_duplication | major | high | claude | 取り消し | 1 |
なぜ: 未認証の終了コード EXIT_UNAUTHENTICATED = sr.EXIT_GATE + 1 と TIMEOUT = 120 が gws-check.py と slides-thumbnails.py に別々に定義され、slides-thumbnails.py の docstring は『gws-check.py と同じ値』と文章で同期を求めている。共有部品の gws_common.py が既にあるのに、同じ役割の定数が 2 つの Skill スクリプトに分かれている
手順: 1. gws_common.py に EXIT_UNAUTHENTICATED = sr.EXIT_GATE + 1 と GWS_TIMEOUT = 120 を定義
2. gws-check.py と slides-thumbnails.py の定義を消し、gws_common から import する(gws-check の TIMEOUT は _run の既定値、slides-thumbnails の TIMEOUT は gws と curl の両方で使っているので名前の置き換えを漏らさない)
3. slides-thumbnails.py の docstring の『gws-check.py と同じ値』を『gws_common.EXIT_UNAUTHENTICATED』へ書き換える
4. test_gws_check.py と test_slides_thumbnails.py の 11 を返すテストが通ることを確かめる
取り消した理由: 最終ゲート修正を打ち切った後に、着手前の木へ戻した(案 B)
指標の測定
- 状態: written / 言語とツールの対応: 既定(.ndf/code-metrics.json は無い) / 所要: 1.9 秒(使えた時間 90 秒 / 上限 90 秒)
- 指標のファイル: /tmp/ndf-worktrees/devbasex--ai-plugins/rf2070/work/.cross_refactoring/code-metrics-rf2070.md
| 言語 | ツール | 版 | ランナー | ファイル | 秒 | 結果 |
|---|---|---|---|---|---|---|
| javascript | lizard | lizard 1.24.0 | uvx | 6 | 0.2 | 測った |
| python | ruff-complexipy | ruff 0.16.9 / complexipy 8.0.1 | uvx | 13 | 0.4 | 測った |
| shell | — | — | — | 13 | — | unsupported_language |
| 重複: python | symilar | pylint 4.0.9 | uvx | 13 | 0.6 | 測った(0 箇所) |
| 重複: javascript, shell | jscpd | jscpd 4.3.0 | npx | 19 | 0.7 | 測った(2 箇所) |
時間の上限
| 値 | 中身 |
|---|---|
| 提案の枠の終わり(監視の上限 = 残り + 余裕) | 2026-10-18T00:06:18+00:00 |
| 改修計画の枠の終わり(同上) | 2026-10-18T00:09:18+00:00 |
| テストの追加の終わり = 実装の終わり − Σ(採っていて未検証の項目の実装の見積り) | 2026-10-18T00:07:04+00:00 |
| 実装の終わり = 最終ゲートの修正の打ち切り − バッファ − Σ(採っていて未検証の項目の検証の見積り) | 2026-10-18T00:08:27+00:00 |
| 直しの試行の打ち切り | 2026-10-18T00:13:26+00:00 |
| 想定最大時間の終わり H(子プロセスはすべてここまでに止まる) | 2026-10-18T00:22:36+00:00 |
| 確かめの開始の締め切り = H − 確かめの見込み(最終ゲート修正と打ち切りの後の取り消しもここまで) | 2026-10-18T00:14:53+00:00 |
| 確かめの見込み(秒。最終ゲートの確かめ 1 回。バッファの最終ゲートの全体テスト) | 463 |
| 最終ゲート修正 1 回の見込み(秒。バッファの final_fix。起動は今 + この値が確かめの開始の締め切り以前のときだけ) | 88 |
| 指標の測定の上限(秒。提案の枠の中から割く) | 90 |
| 着手前のテスト 1 回の上限(秒) | 1280 |
| 範囲テスト 1 回の上限(秒) | 1388 |
| 手元の全体テスト 1 回の上限(秒) | 1280 |
| CI の待ちの上限(秒) | 2040 |
| 余裕(秒。手順の上限と CLI の上限に足す) | 90 |
入力: 予算 30 分 / 全体テストの所要 w 426.4(ndf-record) / 着手前の実測 x 462.5 / CI の壁時計 c 680.0 / 範囲テストの所要 s None(—) / 戦略 local-full
無音の打ち切りは手順の監視の上限と同じ値である。項目ごとの期限は持たない(実装を止めるのは実装の終わりだけ)。
見送った提案
| 対象 | 兆候 | 理由 | 根拠(MVV) | 補足 |
|---|---|---|---|---|
plugins/ndf/skills/release/assets/slides/lib/deck-frame.js#mergeTheme |
conditional_chain | duplicate | Value 6 / Value 1 | C-001 と同じ変更 |
plugins/ndf/skills/release/assets/slides/lib/deck-frame.js#createDeck |
duplication | budget | Value 6 | 見積り 2.4 分が残りに入らない |
plugins/ndf/skills/google-workspace/scripts/gws_common.py#LIB |
duplication | budget | Value 6 | 見積り 2.5 分が残りに入らない |
plugins/ndf/skills/google-workspace/scripts/gws_common.py#output_tail |
duplication | budget | Value 6 | 見積り 2.5 分が残りに入らない |
plugins/ndf/skills/release/assets/slides/lib/deck-frame.js#parseScript |
long_method | budget | Value 3 / Value 1 / Value 6 | 見積り 3.0 分が残りに入らない |
tests/runtime-smoke/lib/codex-hooks-list.py#main |
long_method | budget | Value 1 / Value 3 / Value 6 | 見積り 3.0 分が残りに入らない |
plugins/ndf/skills/google-workspace/scripts/slides-thumbnails.py#_gws |
magic_value | budget | Value 1 | 見積り 2.2 分が残りに入らない |
plugins/ndf/skills/release/assets/slides/lib/script-time.js#parseArgs |
magic_value | budget | Value 7 / Value 1 | 見積り 2.2 分が残りに入らない |
plugins/ndf/skills/release/assets/slides/lib/deck-frame.js#createDeck.cover |
duplication | budget | Value 6 | 見積り 2.4 分が残りに入らない |
plugins/ndf/skills/release/tests/slide_deck_support.py#read_pptx |
deep_nesting | budget | Value 1 | 見積り 2.4 分が残りに入らない |
plugins/ndf/skills/google-workspace/scripts/gws-check.py#_halt |
inconsistent_naming | budget | Value 8 | 見積り 2.5 分が残りに入らない |
plugins/ndf/skills/google-workspace/tests/test_gws_check.py#test_never_calls_gws_other_than_auth_status |
duplication | budget | Value 1 | 見積り 2.5 分が残りに入らない |
plugins/ndf/skills/release/tests/test_slide_template.py#_build |
duplication | budget | Value 1 | 見積り 2.5 分が残りに入らない |
conftest.py#_isolated_git_identity |
duplication | budget | Value 1 / Value 6 | 見積り 3.1 分が残りに入らない |
plugins/ndf/skills/release/assets/slides/lib/deck-frame.js#createDeck.resolve |
deep_nesting | budget | Value 1 | 見積り 3.4 分が残りに入らない |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | codex | REQUEST_CHANGES
修正が必要な指摘は3件です。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 1 | kiro | REQUEST_CHANGES
スライド生成スクリプト(pptxgenjs)の新設と Marp 経路の撤去。仕様(requirements/design/decisions)とコード・テストは整合しており、決定 12・13 が決定 3 を置き換える記述、4 つの規約ファイル・autoloader・layout 系の単一経路化、lib/ の写しと README ハッシュ(86c3acf…)の一致、exit コード契約も確認できた。1 点、未認証の判定方式が gws-check.py と slides-thumbnails.py で食い違う(下記)。
- form-slide.md: Google Slides への変換を下書き先が gdrive のときだけにする - google-workspace: files copy に ignoreDefaultVisibility を付けて非公開を保つ - 資料の package.json の scripts.time を ../script.md に直し、写す手順に足す - slides-thumbnails.py: 未認証の判定を gws auth status の credential_source へ揃える Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
🔧 /ndf:fix サマリ | round 1 | commit bce04a3対応件数: critical=0 / major=4 / minor=0(合計 4 件) |
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | claude | REQUEST_CHANGES
pptx を Google Slides へ変換する 2 手の手順のうち、1 手目のアップロードがドメイン内共有の既定値を外せない。あわせて、削除した build.sh を前例として指す記述が配布している Skill に残っている。
差分の外を指す指摘
plugins/ndf/skills/google-workspace/SKILL.md:70[major] [major / データ保護] 変換の 1 手目をgws drive +uploadからgws drive files create --params '{"ignoreDefaultVisibility":true}' --json '{"name":"<名前>"}' --upload <ファイル>.pptxに替えてください(system-gdrive.md の「新しく作る」も同じ)。+uploadには ignoreDefaultVisibility を渡す手段がありません。このため、Workspace の管理者がアップロードをドメイン内共有にする既定値を設定していると、Drive に残る承認前の pptx がドメインに見えてしまいます。複製にだけ指定しても「非公開」は保てません。plugins/ndf/skills/document-systems/references/system-repo.md:5[major] [major / 削除の参照残り] この PR で消したdocs/presentations/build.shを前例として指す 5〜7 行目を書き直してください。現在の前例は「2026-08-06 の資料は Marp で作った記録として pdf・html を残している」ことだけです。配布している Skill がこの行を読むと、存在しない build.sh を前例として探して従おうとします(決定 12 で Marp の経路を外したこととも食い違います)。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 2 | kiro | APPROVE
round 1 の 4 件(form-slide.md の gdrive 限定、SKILL.md の ignoreDefaultVisibility、package.json の ../script.md、slides-thumbnails.py の未認証判定を gws auth status の JSON へ揃える)は bce04a3 で解消を確認。slides-thumbnails.py は credential_source==none で判定し、stderr 文言に依存しない回帰テスト(test_unauthenticated_returns_11 / 偽 gws が『the wording is not relied on』を返す)で exit 11 の契約が守られる。設計文書は決定 12・13 が決定 3 を置き換える記述・要求の受け入れ条件 16/17・layout-slide/layout-common/distribution-forms/autoloader の単一経路化が整合。Marp 撤去は build.sh 削除と許容された 2026-08-06 の記録行のみ残存で完結、lib/ ハッシュ 86c3acf… が両写しと README で一致。追加で指摘する critical/major は無い。
…em-repo の消えた build.sh への参照を直す (#2070) Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
🔧 /ndf:fix サマリ | round 2 | commit 836d04b対応件数: critical=0 / major=2 / minor=0(合計 2 件) レビュー本文の指摘への返事:
|
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 3 | claude | APPROVE
round 2 の 2 件(変換の 1 手目を ignoreDefaultVisibility 付きの files create へ替える・system-repo.md の消えた build.sh への参照)は 836d04b で解消を確認した。42 ファイルを見直し、追加で直すべき critical / major は無い。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 3 | codex | APPROVE
新規の critical / major 指摘はありません。判断根拠: Value 1・Value 3・Value 6、C1・C2・C3。
🔧 /ndf:fix サマリ | commit (なし)対応件数: critical=0 / major=0 / minor=0(合計 0 件) |
汎用テンプレートの section は台本のページを消費しない。見本の台本から章扉の区切りを外し、 テストに章扉のノート・ページ番号・照合の振る舞いを足した。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
ページには 1 つのメッセージと短い句だけを置き、内部の語は言い換えるか一言で説明した。 17 ページは導入したプロジェクトの Issue の一覧を整理し続ける趣旨へ直した。枠組み lib/ を 写し直し、README のハッシュと構成メモの表・章立てを合わせた。台本は変えていない。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
体裁設計にページの文言と章立ての項目を、生成の手順にページの文言を書く節と章扉が台本の ページを消費しないことを、体裁レビューに聞き手の目で文言が読めるかの観点を足した。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
サムネイルで全ページを見て、補足の文を注へ回すか落とし、文字の大きさと区画の高さを合わせた。 数値と台本は変えていない。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
指摘の再現率(0.21 / 0.49 / 0.91)は測り直すと再現せず、指標が修正担当の判断を正解にした 自己採点だった(#2071 で指標を決め直す)。指標が決まるまでページと台本に数値を載せない。 - 生成スクリプト: 棒グラフと見出しを外し、AI の入れ替えと観点の切り替えの 2 区画に置き換える - 台本: 12 ページの読み上げから数値の 1 文を外す(正本の Google ドキュメントからも同じ 1 文を消した) - 構成メモ: 根拠の列と尺(5,261 字・15 分 2 秒)を合わせる Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JmtvCAsKEdaC7W9gdwjiaN
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JmtvCAsKEdaC7W9gdwjiaN
Anthropic と OpenAI の公式はスキル(作る単位)とプラグイン(配る単位)を呼び分け、 「スキルプラグイン」という語を使わない。題を「独自プラグイン開発の薦め」にし、 台本 4 のページを「スキルとプラグイン」に作り直して Codex と Agent Skills 規格の公式リンクを足した。 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01JmtvCAsKEdaC7W9gdwjiaN
- 台本の 10・11(requirements-design・design と document-restructuring)を 1 ページ「コードの前に、読める文書を」へ - 台本の 12・13(cross-review と cross-refactoring)を 1 ページ「複数の AI で、見て直す」へ - 以後の番号を詰め、台本の写し・構成メモ・README・索引・テストを 21 ページ(章扉を含め 27 ページ)に合わせた - 尺は 5,306 字・15 分 10 秒 → 4,955 字・14 分 09 秒 Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SyiLCs8wNrE2PKfeeqZDyT
- 台本 20 の読み上げ「始め方は 3 段階です」を「3 ステップです」へ(写しと正本の両方。スピーカーノートにも入る) - 構成メモの「階段の図」を「斜めに下げて並べた図」へ、尺の表を合わせた(4,957 字・14 分 10 秒) - 生成スクリプトのコメントの「段」を言い換えた Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SyiLCs8wNrE2PKfeeqZDyT
発表資料の文言をスライドの言葉遣いへ直し、章扉と公式リンクを入れ、呼び方を公式の語へ揃える(#2065)
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 4 | codex | APPROVE
新規の critical / major 指摘はありません。判断根拠: Value 1・Value 3・Value 6、C1・C2・C3。
takemi-ohama
left a comment
There was a problem hiding this comment.
🤖 cross-review | round 4 | kiro | APPROVE
42 ファイルを確認。round 1〜3 の 6 件(slides-thumbnails.py の未認証判定を gws auth status の JSON へ・SKILL.md と system-gdrive.md の変換 1 手目/2 手目に ignoreDefaultVisibility:true・form-slide.md の Google Slides 変換を draft.system==gdrive に限定・system-repo.md の削除済み build.sh への参照除去・package.json scripts.time を ../script.md)は head 8db8a89 で解消を確認した。deck-frame.js/script-time.js の release asset と presentation 写しは byte 同一で README のハッシュ e1fbac16… と一致。設計文書は決定 12・13・14 が決定 3 を置き換える記述・受け入れ条件 16/17・layout-slide/layout-common/distribution-forms/autoloader/ndf-documentation-mode/ndf-google-workspace-gws の単一経路化が整合し、発表資料は script 21 ページ・notes 21 行・section 6 で test_skill_plugin_development_has_21_pages_and_6_sections と一致。gws-check.py は _tail/TAIL_LINES を gws_common へ寄せ、exit 11 契約は維持。Marp 参照は許容された 2026-08-06 の記録行とテスト fixture のみ。追加で直すべき critical / major は無い。
スプリント s2065 の課題を develop へ取り込む。
利用者向けの変化
移行の手順
課題と設計
コミット
変更の統計
テスト(supervise.py の run のステップ)
集めた実装の PR
閉じる課題
Closes #2065
手動確認
モード: standard / 通した工程: 実装 → Pull Request
🤖 Generated with Claude Code