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
2 changes: 1 addition & 1 deletion .claude-plugin/marketplace.json
Original file line number Diff line number Diff line change
Expand Up @@ -41,7 +41,7 @@
{
"name": "spec-loop",
"source": "./plugins/spec-loop",
"version": "0.29.0",
"version": "0.30.0",
"author": { "name": "hdknr" },
"description": "要求側のループ(要求確定・仕様レビュー・実現性とコスト・提案書)と、dev-loop への引き渡しを担うプラグイン。現在のスキルは req-loop(Q&A 表への起票(推奨と理由つき)・回答の反映・レビュー会用 PPTX の生成で、利用者の回答待ちで止まる)と spec-review(開発者向けの仕様を書き下し、書き込みツールを持たない 3 つの判定役に別ティアでレビューさせ、利用者に見える結果が変わる指摘は共有の Q&A 表に差し戻し、費用・運用だけが変わる選択は内部の Q&A 表に記録し、範囲の外の場面と実現の手段の指摘は仕様に足さない。抜ける条件を満たさなければ抜けたと報告しない)と feasibility(規模から見積りとスケジュールを更新し、ガントチャートをスクリプトで生成し、費用付きの質問を Q&A 表に起票する。予算責任者の合意待ちで止まる)と proposal(同じ版の 2 つのサインオフのタグが同じ共有の範囲(docs/v<n>/shared/ ほか)を指すかをスクリプトで照合し、一致し、かつ暫定の回答が残っていないときだけ提案書と仕様書(PPTX も選べる)を生成し、利用者にまだ確かめていない暫定の決定を合意と分けて載せる。v2 以降は前の版との比較を載せた変更の提案書になる。決裁者の承認待ちで止まる)と scaffold(確定した仕様を中間表現 spec_ir.json に書き起こし、OpenAPI・型・実装が無いと失敗する Red テストと dev-loop に渡す Issue の本文をスクリプトで生成して、1 機能 = Issue 1 件で登録する。v2 以降は前の版と比べて機能を追加・変更・削除に分け、変わった機能だけを Issue にする。Issue の登録で止まる)の 5 本"
}
Expand Down
2 changes: 1 addition & 1 deletion CLAUDE.md
Original file line number Diff line number Diff line change
Expand Up @@ -67,7 +67,7 @@ Claude Code のセットアップガイドを mkdocs で構築・公開するプ
- `scripts/schedule-to-gantt.py` - `schedule.csv` からガントチャート(SVG)を作る(**同じ表から同じバイト**。
作れなければ**前の出力を消す**。テストは `scripts/test-schedule-to-gantt.py`)
- `scripts/check-signoff.py` - 同じ版の 2 つのサインオフのタグ(`signoff/v<n>/req-<k>`)の時点で、
共有の範囲(v1〜v<n> の `shared/` と `removed.csv`)が一致するかの照合(#262。**どちらかの時点に比べる中身が
2 つの承認が見た中身(v1〜v<n> の `shared/`・`requirements/`・`spec/`(`qa-dev.csv` を除く)と `removed.csv`。#375)が一致するかの照合(#262。**どちらかの時点に比べる中身が
無ければ 2**——`git diff` は比べる中身が無くても差分なしを返す。**要求確定のタグの時点に `暫定反映` の Q&A が
残れば 3**(#325。Q&A の行だけを版の順に重ね、重ね方はテストが `merge-versions.py` と突き合わせる。
**要求確定のタグの時点の `removed.csv` の共有の Q&A の行(内部の層の `D-` は除く)について `merge` が拒否する配置は 2——判定は `merge-versions.py` の `check_removed`**(#338)。
Expand Down
167 changes: 167 additions & 0 deletions docs/plans/issue-375.md

Large diffs are not rendered by default.

2 changes: 1 addition & 1 deletion plugins/spec-loop/.claude-plugin/plugin.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "spec-loop",
"description": "要求側のループ(要求確定・仕様レビュー・実現性とコスト・提案書)と、dev-loop への引き渡しを担うプラグイン。現在のスキルは req-loop(Q&A 表への起票(推奨と理由つき)・回答の反映・レビュー会用 PPTX の生成で、利用者の回答待ちで止まる)と spec-review(開発者向けの仕様を書き下し、書き込みツールを持たない 3 つの判定役に別ティアでレビューさせ、利用者に見える結果が変わる指摘は共有の Q&A 表に差し戻し、費用・運用だけが変わる選択は内部の Q&A 表に記録し、範囲の外の場面と実現の手段の指摘は仕様に足さない。抜ける条件を満たさなければ抜けたと報告しない)と feasibility(規模から見積りとスケジュールを更新し、ガントチャートをスクリプトで生成し、費用付きの質問を Q&A 表に起票する。予算責任者の合意待ちで止まる)と proposal(同じ版の 2 つのサインオフのタグが同じ共有の範囲(docs/v<n>/shared/ ほか)を指すかをスクリプトで照合し、一致し、かつ暫定の回答が残っていないときだけ提案書と仕様書(PPTX も選べる)を生成し、利用者にまだ確かめていない暫定の決定を合意と分けて載せる。v2 以降は前の版との比較を載せた変更の提案書になる。決裁者の承認待ちで止まる)と scaffold(確定した仕様を中間表現 spec_ir.json に書き起こし、OpenAPI・型・実装が無いと失敗する Red テストと dev-loop に渡す Issue の本文をスクリプトで生成して、1 機能 = Issue 1 件で登録する。v2 以降は前の版と比べて機能を追加・変更・削除に分け、変わった機能だけを Issue にする。Issue の登録で止まる)の 5 本",
"version": "0.29.0",
"version": "0.30.0",
"author": { "name": "hdknr" }
}
4 changes: 2 additions & 2 deletions plugins/spec-loop/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@
| `scripts/check-spec-exit.py` | 仕様レビューを抜ける条件のうち、機械で決まる条件 1 の判定(標準ライブラリのみ) |
| `scripts/check-feasibility-csv.py` | スケジュールと見積りの表が決まりどおりかの検査(標準ライブラリのみ) |
| `scripts/schedule-to-gantt.py` | スケジュールの表からガントチャート(SVG)を作る(標準ライブラリのみ) |
| `scripts/check-signoff.py` | 同じ版の 2 つのサインオフのタグの時点で、共有の範囲が一致するかの照合(標準ライブラリと `git`) |
| `scripts/check-signoff.py` | 同じ版の 2 つのサインオフのタグの時点で、2 つの承認が見た中身(`shared/`・`requirements/`・`spec/`・`removed.csv`)が一致するかの照合(標準ライブラリと `git`) |
| `scripts/build-proposal.py` | 照合が通ったときだけ、承認したタグの時点の中身から提案書と仕様書(`--pptx` で PPTX も)を作る(標準ライブラリと `git`) |
| `references/spec-ir.md` | 仕様の中間表現(`spec_ir.json`)の形 |
| `references/handoff-issue.md` | dev-loop に渡す Issue の本文の形 |
Expand Down Expand Up @@ -90,7 +90,7 @@
## `proposal` — 提案書のループ

`/spec-loop:proposal` で呼びます。**同じ版の 2 つのサインオフのタグ(`signoff/v<n>/req-<k>`・`signoff/v<n>/budget-<k>`)の時点で
共有の範囲(`docs/v<n>/shared/` ほか。`references/signoff-tags.md`)が一致するかをスクリプトで照合し、一致したときだけ提案書を生成します**(LLM に判断させません)。
2 つの承認が見た中身(`docs/v<n>/shared/`・`requirements/`・`spec/` ほか。`references/signoff-tags.md`)が一致するかをスクリプトで照合し、一致したときだけ提案書を生成します**(LLM に判断させません)。
提案書は**承認したタグの時点の中身**から作るので、承認の後に直した中身は入りません。
**v2 以降は、前の版との比較(追加・変更・削除)を載せた変更の提案書になります**(`references/versions.md` の「版の差分」)。
**提案書と一緒に仕様書(規模・構成の図・機能・決定表・範囲の外)も作ります。利用者にまだ確かめていない暫定の回答(`暫定反映`)が残るうちは作りません**(`references/tree.md` の「仕様書」・`references/qa-csv.md` の「暫定の行の判別」)。
Expand Down
29 changes: 22 additions & 7 deletions plugins/spec-loop/references/signoff-tags.md
Original file line number Diff line number Diff line change
Expand Up @@ -36,24 +36,30 @@

## 2 つの承認が同じ範囲を見ていたか

開発に進む前の関門では、**同じ版の最新の 2 つのタグの時点で、その版の共有の範囲が一致するか**を確かめる。
開発に進む前の関門では、**同じ版の最新の 2 つのタグの時点で、2 つの承認が見たその版の中身が一致するか**を確かめる。
プラグインに同梱の照合を使う(**LLM に判断させない**):

```bash
python3 <spec-loop の base ディレクトリ>/scripts/check-signoff.py # 作業中の版
python3 <spec-loop の base ディレクトリ>/scripts/check-signoff.py --version 1 # 版を指定
```

- **比べる場所は `docs/v1/shared/`〜`docs/v<n>/shared/` と `docs/v2/removed.csv`〜`docs/v<n>/removed.csv`。**
v<n> の時点の共有の範囲は、前の版の `shared/` と、行を消す `removed.csv` にも依る。
- **比べる場所は v1〜v<n> の `shared/`・`requirements/`・`spec/` と `removed.csv`(v1 のものも)。**
利用者は要求と仕様を承認し、予算責任者は `requirements/`・`spec/` から数えた見積りに合意する(feasibility)——
**そこが 2 つのタグの間で違えば、予算の合意は承認と別の中身を見ている**(#367・#375)。
v<n> の時点の中身は、前の版と、行を消す `removed.csv` にも依る。
凍結した版(`versions.md`)は動かないので、前の版を含めても誤って食い違うことはない。
**`removed.csv` は `shared/` に効く行だけを比べる**(種類 `Q&A` で対象が共有の表の番号(`Q-`)の行と、種類 `ファイル` で対象が `shared/` から始まる行)。**内部の Q&A 表(`spec/qa-dev.csv`。番号 `D-`)は比べない**——開発者が決めて記録するもので、サインオフの後に内部で決めても照合は割れない(`qa-csv.md` の「層」)。
`requirements/` や機能の削除は共有の範囲の外なので、それだけが違っても一致する。
**v1 の `removed.csv` は在ること自体を比べる**(v1 には置かない決まりなので、予算側にだけあっても一致と言わない。#372)。
**`removed.csv` は内部の層の Q&A の行(`D-`)を除いて全部比べる**——`feasibility/` などのファイルの行は
重ね合わせ(`versions.md`)が拒否するので、予算側だけにあっても一致と言わない(#372)。
**比べないのは、上の範囲の外の全部**(`feasibility/`・`proposal/` など、予算の合意と決裁の側が書くもの。重ね合わせも読まない)**と内部の層**——内部の Q&A 表
(`spec/qa-dev.csv`。番号 `D-`)は開発者が決めて記録するもので、2 つのタグの間に feasibility が費用の行を書く。
サインオフの後に内部で決めても照合は割れない(`qa-csv.md` の「層」)。
- **版を指定しなければ、作業中の版**(作業ツリーの `docs/` で番号が最大の版)。
- **最新**は、`<k>` を**数として**比べて最大のもの(`-10` は `-9` より新しい)。
**`signoff/v2/req-3-fix` のような、命名に合わないタグは数えない。**
- **どちらかの時点で比べる場所が無い・空なら、一致とは言わない**(判定していない)。
比べる中身が無いときも `git diff` は「差分なし」を返すので。**どちらかの時点に `docs/v<n>/` が無いときも同じ**
- **どちらかの時点で `shared/`(と `removed.csv`)にファイルが 1 つも無ければ、一致とは言わない**(判定していない)——
`requirements/`・`spec/` があっても。比べる中身が無いときも `git diff` は「差分なし」を返すので。**どちらかの時点に `docs/v<n>/` が無いときも同じ**
(前の版の `shared/` があっても、その時点に版 n はまだ無い)。
- **作業ツリーの版の並びが決まりに反すれば、版を指定しても判定しない。**

Expand All @@ -65,6 +71,15 @@ CI で走らせるなら、タグを取得できるよう履歴をすべて取
**タグはスキルが付けない。** 承認は人間の判断なので、スキルの仕事は
「どのコミットを承認してもらうか」をそろえて止まるところまでである。

### 範囲を広げた(spec-loop 0.30.0)

**spec-loop 0.30.0 で、比べる範囲に `requirements/`・`spec/`(`qa-dev.csv` を除く)と v1 の `removed.csv`、
`removed.csv` の範囲の外のファイルの行を足した**(#375)。0.29.x までに「一致する」だったタグの組が、
**2 つのタグの間で `requirements/`・`spec/` を直していれば 1 になる**(提案書も作らない)。
1 になったら、出力に出るパスを見て、**直したあとの中身で利用者の要求確定(`req-<k>`)を取り直し、予算の合意(`budget-<k>`)も取り直す**
——見積りは直したあとの `requirements/`・`spec/` から数えたものか、数え直してから合意してもらう。
0 のままの組は何もしなくてよい。

## 暫定の回答が残るうちは、要求確定のサインオフを付けない

Q&A 表に `暫定反映`(暫定の回答で仕様に反映し、利用者の確認待ち。`qa-csv.md`)の行が残っているうちは、
Expand Down
2 changes: 1 addition & 1 deletion plugins/spec-loop/references/tree.md
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@ hooks/spec_loop_pages.py # 表示用ページを CSV から作るフック
## 置き方の決まり

- **`shared/` には、両方の読者に見せてよいものだけを置く。** 2 つのサインオフが
同じ範囲を見ていたかは、`shared/` の中身で確かめる(`signoff-tags.md`)。
同じ中身を見ていたかは、`shared/`・`requirements/`・`spec/`(`qa-dev.csv` を除く)で確かめる(`signoff-tags.md`)。
- **内部の層の Q&A 表(`spec/qa-dev.csv`)は `shared/` に置かない。** 開発者が決めて記録する質問で、利用者に渡さず、
サインオフも比べない(`qa-csv.md` の「層」)。共有の表(`shared/qa.csv`)に置くのは利用者が決める質問だけ。
- **`requirements/` から `feasibility/` へはリンクしない。** 利用者に見せる費用は、
Expand Down
Loading
Loading