Skip to content

NDF Factory: Web サービスの置き場とライセンスの切り離し、全体設計(実行基盤・進捗の正本) #2169

Closed

Description

@takemi-ohama

親: #2168(Neural Development Factory)。最初のスプリント。 残りの子課題(#2170〜#2174)すべての前提になる。

依頼(原文)

ndfを「Neural Development Factory」として、WebUIで操作可能なSoftware Factoryサービスとして運営します。

  • ndfのpluginsとしての利用はOSSのまま
  • WebサービスのコードもOSS
    • ただしCDKなどのセキュリティに関わるインフラ部分は別のprivate repositoryに(owner=volare)
    • Webサービス部分はライセンスを切り離す可能性があるため、ディレクトリを明確に分離しておく
  • Webサービスそのものはサブスクリプション+AIモデルToken課金(bedrockの課金をそのままオン)
  • Cognitoによる認証(Google, Githubの認証に対応)
    • Claude.aiと類似の認証・課金モデル(Free, 個人PRo, 個人Max, Team(standard/premium sear) etc)
  • Devin, Claude Webと同様、github リポジトリをとりこんで開発を進められる
  • /ndf:development-workflow のsprintを並列で進めることが可能。
    • sprint一覧でそれぞれがどのフェーズを進めているかが化しかできる
  • sprint詳細で進捗状況が可視化できる。
  • 承認ゲートで通知。Slack通知も設定可能

この構想をissueを起こし、再起動して /goal /ndf:development-workflow で開発を進めてください

(書き手: 利用者、日付: 2026-10-30。会話の原文)

親+機能別の子課題(#2168 を親に子課題 6 本。最初のスプリントは置き場・ライセンスの切り離し・全体設計)

(書き手: 利用者、日付: 2026-10-30。分け方の問いへの回答)

この課題が受け持つのは、原文のうち「WebサービスのコードもOSS」「CDKなどの…インフラ部分は別のprivate repositoryに」「ライセンスを切り離す可能性があるため、ディレクトリを明確に分離しておく」「ndfのpluginsとしての利用はOSSのまま」の 4 つと、残りの項目を実装するための全体設計である。

起票者の推定

# 条件 推した出所 この要求での扱い
S1 別ライセンスにしても plugins/ と .claude-plugin/marketplace.json が影響を受けない 原文「ライセンスを切り離す可能性があるため、ディレクトリを明確に分離」 受け入れ条件 1・2
S2 インフラのコードと認証情報が無いことを CI が確かめる 原文「CDKなどの…インフラ部分は別のprivate repositoryに」。手で守る約束は崩れるため機械で見ると推した 受け入れ条件 4
S3 CLI だけで使う人の振る舞いが変わらない 原文「ndfのpluginsとしての利用はOSSのまま」 受け入れ条件 5
S4 全体設計で実行基盤・進捗の正本・決済の手段を決める #2168 の「未決」の節(起票者が書いた) 受け入れ条件 6(決済の手段は #2174 の設計へ回し、ここでは課金の境界だけ)
S5 フェーズの名前を「設計・実装・検査・取り込み・仕上げ」にする #2168 の方針の表(起票者が supervise.py のフェーズから当てた) 含まない(#2172 で決める)
S6 ライセンスは当面 MIT のまま、切り離すのは後で 原文「切り離す可能性がある」(今切り離すとは書いていない) 前提 1

目的

前提

  • 前提 1: ライセンスの切り離しは、この課題では行わない。Web サービスのディレクトリには根と同じ MIT の LICENSE を置き、差し替えはそのファイル 1 つ(と根の README.md の案内)で済む形にする。切り離す時期と新しいライセンスは利用者が決める
  • 前提 2: Web サービスは NDF を配布物(マーケットプレイスから導入したプラグイン)として使う。plugins/ のファイルをパスで読み込まない。これで、プラグインの版と配布の規則(docs/versioning-and-distribution.md)がサービスにもそのまま当たる
  • 前提 3: CDK のスタック・ネットワーク・秘密の管理は private リポジトリ(owner = volare)が持つ。この課題はそのリポジトリへ何も書かない。このリポジトリ側は、インフラへ渡す値(環境変数の名前など)の一覧を .env.example の形で持つだけにする
  • 前提 4: Web サービスのディレクトリの名前と置き場所、使う言語・フレームワークは設計で決め、ゲート 1 の承認資料に載せる
  • 前提 5: 既存のテストの入力に、秘密の形をした偽の値がある(plugins/ndf/scripts/tests/test_project_decl.py:22 の AKIA で始まる値。2026-10-30 に git grep -nE 'AKIA[0-9A-Z]{16}' で 1 件)。境界の検査はこれを許可の一覧で個別に除き、受け入れ条件 4 と 5 を両立させる。許可の一覧はファイルと値の組で持ち、ディレクトリごと除かない
  • 前提 6: .env.example(値を持たない雛形。既存は plugins/mcp/mcp-dbhub/・plugins/mcp/mcp-redash/ の 2 件)は受け入れ条件 4 の「.env の実ファイル」に当たらない

対象範囲

含む:

含まない:

ドメインイベント

# イベント 引き金 失敗したとき 順序の前提
E1 Web サービスのディレクトリを作った この課題の実装 — —
E2 Pull Request で境界の検査が走った develop 宛の Pull Request の作成・更新 検査が起動しない → 必須チェックが欠けてマージできない E1
E3 境界の違反を見つけて Pull Request を落とした E2 で、plugins/ などからサービスのディレクトリへの参照・インフラのコード・秘密のどれかが見つかった 見落とした → 受け入れ条件 4 のテストの入力で検出できることを確かめる E2
E4 プラグインを配布した リリース サービスのディレクトリの変更が配布物に混ざる → 受け入れ条件 1 で検出 E1
E5 サービスのディレクトリのライセンスを差し替えた(将来) 利用者の決定 差し替えが plugins/ や配布物へ波及する → 受け入れ条件 2 で検出 E1

用語

用語 意味
Neural Development Factory NDF を Web UI から操作できる Software Factory のサービスとして提供するときの名前。プラグインとしての NDF と区別するときに使う
サービスのディレクトリ Web サービスのコードを置く、プラグインと分けた 1 つのディレクトリ
境界の検査 サービスのディレクトリとプラグイン・配布物・インフラの境目が守られているかを CI で見る検査
実行基盤 Web サービスからスプリントを動かす、コンテナとジョブの仕組み

受け入れ条件

  • 1. サービスのディレクトリの中のファイルを足しても消しても、claude plugin validate . の結果と、各プラグインの配布物(.claude-plugin/marketplace.json の source が指す木)の中身が変わらない
  • 2. plugins/ の下と .claude-plugin/marketplace.json のどのファイルも、サービスのディレクトリを参照しない。参照を 1 つ足した Pull Request は境界の検査で落ちる
  • 3. サービスのディレクトリの LICENSE を別の文面へ差し替えても、受け入れ条件 1・2 の検査と既存のテストが通る
  • 4. 境界の検査は、リポジトリの中に次のどれかがあれば落ちる: CDK などインフラの定義(cdk.json・aws-cdk-lib への依存・CloudFormation / Terraform の定義)、秘密らしい値(AWS のアクセスキーの形・秘密鍵の PEM・.env の実ファイル)。それぞれを 1 つずつ入れたテストの入力で落ちることを確かめる
  • 5. 既存のテスト(uv run --frozen --project . --all-extras pytest . -q -n 4)・claude plugin validate .・既存の CI の必須チェックが、この変更の前と同じに通る。プラグインの利用者の手順と振る舞いは変わらない
  • 6. 設計文書が次を決めている: サービスのディレクトリの名前と置き場所、構成要素とその間の契約、実行基盤(スプリントの実行の単位、supervise.py のプランと進捗ログを Web へ渡す経路)、進捗の正本、NDF Factory: Cognito の認証(Google・GitHub)とプランごとの利用量 #2170〜NDF Factory: サブスクリプションと Bedrock の token 課金 #2174 がそれぞれ受け持つ範囲と、互いに依存する契約
  • 7. 設計文書が、ai-plugins の形(ブランチ名・テストのコマンド・配布の手段)を Web サービスの既定に埋め込まない。取り込むリポジトリごとの違いは、そのリポジトリの .ndf/ の設定で受ける(MVV の Value 5)

非機能の条件

大項目 条件
運用・保守性 境界の検査は 1 本のスクリプトで、手元でも CI と同じコマンドで走る。所要は 10 秒以内
セキュリティ このリポジトリに秘密・認証情報・インフラの定義を置かない(受け入れ条件 4)。.env.example は値を持たない

影響

対象 影響
公開インタフェース 変わらない(プラグインの Skill・hook・スクリプトの引数と出力は触らない)
データ 無し
既存の振る舞い CI に境界の検査が 1 つ増える。プラグインの振る舞いは変わらない

検証手段

項目 手段
テスト uv run --frozen --project . --all-extras pytest . -q -n 4(境界の検査のテストを含む)
静的解析 claude plugin validate .・境界の検査のスクリプト・python3 plugins/ndf/scripts/instructions-check.py --root .
手動確認(マージ前) 境界の検査が CI で必須チェックとして走り、違反を入れた検証用の Pull Request で落ちることを見る

前提とする取り決め

項目 参照先 / 決めたこと
プロジェクト構造 AGENTS.md の「マーケットプレイスの構造」。サービスのディレクトリは plugins/ の外に置く。境界の検査はリポジトリの検査なので scripts/(配布物でない側)に置く
コーディング規約 AGENTS.md の「最小限のコード実装」。検査のスクリプトは既存の scripts/check-*.sh / .py の形に揃える
テスト戦略 境界の検査は、違反を 1 つずつ入れた一時ディレクトリを入力にした単体テストで担保する。.md の文言を照合するテストは書かない

境界

区分 内容
常に行う 既存テストと claude plugin validate . の実行、検査のスクリプトを書く前に使うコマンドの挙動を確かめる
確認してから行う サービスのディレクトリの名前・言語・構成要素の分け方(ゲート 1 の承認資料に載せる)
行わない private リポジトリへの書き込み、ライセンスの差し替え、プラグインの配布の規則の変更、#2170〜#2174 の実装の先取り

未決

項目 誰が決めるか 期限
サービスのディレクトリの名前・言語・フレームワーク 設計(ゲート 1 で利用者が承認) #2169 の設計 Pull Request
ライセンスを切り離す時期と新しいライセンス 利用者 決めない(この課題の範囲外)
決済の手段(Stripe など) #2174 の設計 #2174
境界の検査を既存の必須チェックの job に入れるか、新しい必須チェックとして足すか(後者は ruleset の変更が要り、scripts/check-required-checks.py の突き合わせにも当たる) 設計(ゲート 1 で利用者が承認)。ruleset の変更が要るなら、利用者がゲート 2 の承認資料で見て行う #2169 の設計 Pull Request

進行

モード: —

  • 要求と受け入れ条件 — 2026-10-30 01:11
  • 作業場所の用意 — 2026-10-30 04:13
  • 設計 — 2026-10-30 01:16
  • 素材の収集と出典の確定
  • ドキュメント再構成
  • ドキュメントレビュー
  • 計画 — 2026-10-30 04:13
  • 実装 — 2026-10-30 04:13
  • 構造改善 — 2026-10-30 04:55
  • 実装レビュー — 2026-10-30 05:22
  • 完了判定 — 2026-10-30 04:29
  • Pull Request — 2026-10-30 04:40
  • 確定仕様化 — 2026-10-30 06:38
  • 後片付け — 2026-10-30 06:34
  • 配布 — 2026-10-30 06:00
  • 体裁レビュー
  • リリース後テスト — 2026-10-30 06:34
  • 振り返り — 2026-10-30 06:46
  • 棚卸し — 2026-10-30 06:47

🤖 Generated with Claude Code

振り返り: #2169 (comment)

Activity

  1. added 4 commits that reference this issue on Oct 30, 2026
  2. takemi-ohama commented on Oct 30, 2026

    @takemi-ohama
    ContributorAuthor

    振り返り(2026-10-30)

    対象: issue #2169 / 設計 PR #2175 / 実装 PR #2177 / スプリント PR #2178 / リリース PR #2181

    Neural Development Factory の最初のスプリントとして、Web サービスの置き場 factory/(LICENSE・README.md・.env.example・.gitignore)と、その境目を CI で見る境界の検査(scripts/check-service-boundary.py、ジョブ service-boundary-check)を作り、#2170〜#2174 が並列に進めるためのサービス全体の設計(構成要素・実行基盤・進捗の正本・構成要素の間の契約)を決めた。ndf v10.25.0 で正式版として出した。

    何が起きたか

    観点 事実
    受け入れ条件 途中で変えた条件は無い。7 つすべてがリリース後テストで合格(PR #2181 の記録)
    手戻り 設計 PR #2175 は cross-review を 3 ラウンド回した(major 7 件 → 5 件 → 0 件)。その後、承認ゲート 1 で利用者が GitHub の表示から mermaid の描画エラー 2 つ(subgraph の題の括弧・erDiagram の日本語の実体名)を見つけて差し戻した。設計の工程・3 ラウンドのレビュー・承認資料の組み立てのどれもこの構文エラーを見つけていない。リポジトリに mermaid の構文を解析する検査が無いためで、#2176 として起票済み
    見落とし リリース後テストで新しい不具合は出ていない。導入の確認(main 7995d2b から claude・codex・kiro へ導入して 10.25.0)は通った
    範囲 ライセンスの差し替え・CDK の実装・子課題の実装は含まないまま進めた。範囲を広げた判断は無い
    工程 pace: normal の工程を飛ばさずに通した。確定仕様化は normal のプランが持たないため、仕上げのフェーズへ移して通した
    記録の取りこぼし 承認ゲート 1 の差し戻しが差し戻しの記録(gate-rejections.jsonl)に残っていなかった(gate-rejections.py count が 0 件)。手順は approval-request.md の「答えを記録する」と pace.md の表にあるが、conductor が打っていない。振り返りの時点で gate-rejections.py record で 1 行足した
    利用者の作業 service-boundary-check を ruleset の必須チェックへ足すのは利用者の作業(設計の決定 11)。2026-10-30 15:40 JST 時点で ruleset「protect main and develop」に入っていない

    context window の大きさ

    測れたのは仕上げのフェーズを動かした conductor のセッション 2 つだけである。設計・実装・配布のフェーズは supervise.py のプラン(claude -p)で動いており、この表に入っていない。

    層 フェーズ モデル 件数 固定費の中央値 実作業の中央値 実作業 < 固定費 最大充填の最大 目印
    conductor - claude-opus-5-5 2 44048 108040 0 201682 割る候補
    supervisor 仕上げ claude-opus-5-5 1 48214 75269 0 123483
    worker その他 claude-opus-5-5 1 39214 66042 0 105256
    層 件数 固定費の合計 実作業の合計 総消費
    conductor 2 88097 216079 304176
    supervisor 1 48214 75269 123483
    worker 1 39214 66042 105256
    合計 4 175525 357390 532915
    フェーズ supervisor supervisor の実作業 worker の件数 supervisor と worker の固定費の合計 目印
    仕上げ 1 75269 1 87428 worker を使いすぎ
    • conductor の 割る候補: そのまま。2 つのセッションのうち 1 つが配布までの全フェーズを通しており、切り替えは中継の再起動で既に行っている
    • 仕上げの worker を使いすぎ: そのまま。測った時点の worker は確定仕様化(設計 498 行の書き直しとコードの照合)の 1 件で、その後に棚卸しの調べ(6 件の本文と設計の突き合わせ)の 1 件を足した。どちらも supervisor の文脈に入れると読み込みが重く、ほかの工程(リリース後テスト・振り返り)と並べて進めるために分けた

    用語集の変化

    コンテキスト 足した語 廃止した語 意味を変えた語
    ndf-factory Neural Development Factory・サービスのディレクトリ・境界の検査・実行基盤・ランナー・実行ジョブ・スプリントの実行・進捗の事象・承認の依頼(9 語) — —

    承認ゲートの差し戻し

    gate-rejections.py count --sprint .ndf/tmp/sprint-m2169/sprint.json: 関門 1 が 1 件・関門 2 が 0 件。

    MVV を見直すか

    project-mvv.py signals(版 3): 覆し 0 件(閾値 3)・判定できない 0 件(閾値 5)・続けて 0 回(閾値 3)・流出不具合 0 件(閾値 3)。どの兆候も閾値に届いていない。pace: normal で MVV 判定を承認に使っていないため、覆しはこのスプリントでは数えられない。無人の経路のため改訂するかの問いは conductor へ返す(推奨: 改訂しない。兆候が 0 件のため)。

    次に変えること

    変えること 落とし先 状態
    設計文書の mermaid を、承認ゲート 1 より前に構文解析器へ掛ける 文書検査(doc-check の diagrams)と CI #2176 として起票済み
    承認ゲートの差し戻しを、人の答えを受けた conductor の打ち忘れに頼らず記録へ残す development-workflow の手順(supervise.py / sprint-state.py の続け方) #2183 として起票

    途中で起票した課題

    番号 何を見つけたか 見つけた場面
    #2176 文書検査が mermaid の構文を解析せず、GitHub で描画できない図が承認ゲート 1 まで届く 承認ゲート 1
    #2183 承認ゲートの差し戻しを conductor が記録し忘れても気づけず、振り返りの差し戻しの件数が 0 になる 振り返り(取りこぼしではなく、振り返りの観点で見つけた進め方の欠け)
  3. takemi-ohama commented on Oct 30, 2026

    @takemi-ohama
    ContributorAuthor

    スプリントの終わりの工程を通りました

  4. added a commit that references this issue on Oct 30, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions