Repository navigation
Description
移した先: https://github.com/volareinc/nd-factory/issues/26(Factory の開発は移した先で続ける。手順は #2646)
親: #2168(Neural Development Factory)。前提: #2169(v10.25.0 で完了)。
形と契約は #2169 の確定仕様 docs/specifications/ndf-factory-service-boundary.md の「サービス全体の契約(子課題が実装する)」にある。この課題は集約「アカウント」(根: アカウント、エンティティ: 席、値オブジェクト: プラン・使える量・実行の形態)の持ち主である。
依頼(原文)
- Cognitoによる認証(Google, Githubの認証に対応)
- Claude.aiと類似の認証・課金モデル(Free, 個人PRo, 個人Max, Team(standard/premium sear) etc)
(書き手: 利用者、日付: 2026-10-30。#2168 の構想を伝えた会話の原文のうち、この課題が受け持つ 2 行。全文は #2169 の「依頼(原文)」にある)
親+機能別の子課題(#2168 を親に子課題 6 本。最初のスプリントは置き場・ライセンスの切り離し・全体設計)
(書き手: 利用者、日付: 2026-10-30。分け方の問いへの回答)
factory/の TypeScript のパッケージの管理の道具(npm・pnpm)を決める課題を #2171 から #2170 へ移す。最初に TypeScript のコード(factory/web/・factory/api/)を置くのは #2170 であり、道具はその時点で決まっている必要がある。
(書き手: 起票者、日付: 2026-10-30。PR #2185 #2185 の本文が「2026-10-30 の利用者の決定」として記録した文。利用者の原文は確かめられないため、利用者の文としては扱わず、決定の中身(道具を決める課題を #2170 が持つ)だけを利用者の決定として読む)
ランナーが Claude を呼ぶ方法を、アカウントごとに ①
local手元のランナー・②byokキーの持ち込み・③managedサービスの Bedrock の 3 つから選ぶ。Free は ① と ② だけを選べる。同時のスプリントの数の上限は全形態に掛かり、月の token の上限は ③ だけに掛かる。
(書き手: 起票者、日付: 2026-10-30。PR #2190 #2190 の確定仕様 docs/specifications/ndf-factory-service-boundary.md の「実行の形態」が「2026-10-30 の利用者の決定」として記録した内容の要約。claude.ai のログインをサービスが預かる形は Anthropic の規約が認めないため。この課題が受け持つのは形態の値と選べる条件だけで、ランナーとキーの保存は #2186・#2189、課金は #2174 が持つ)
起票者の推定
題・本文のうち、利用者の指示の原文に無く起票者が推して足した条件。承認ゲート 1 で利用者が確かめるまで、利用者の決定として扱わない。
| # | 条件 | 推した出所 | この要求での扱い |
|---|---|---|---|
| S1 | 使える量は「同時に流せるスプリントの数」と「月の token の上限」の 2 つ | #2169 の確定仕様の「受け持つ課題」の表(起票者が、並列の実行と token 課金から推した) | 受け入れ条件 6〜8。ほかの量(リポジトリの数など)は含まない |
| S2 | 上限に達した操作は断られ、理由が出る | この課題の旧本文の受け入れ条件 2 | 受け入れ条件 7。断る操作そのもの(スプリントの開始)は #2186 が持ち、この課題は判定を返す |
| S3 | Team では席(standard / premium)ごとに使える量が分かれる | 原文「Team(standard/premium sear)」の「sear」を「seat(席)」と読んだ | 受け入れ条件 9〜11・前提 5 |
| S4 | 認可の token から account_id が取れ、#2171・#2186・#2174 が使う |
#2169 の確定仕様の「受け持つ課題」の表 | 受け入れ条件 4・5 |
| S5 | 画面は factory/web/(React の SPA)、API は factory/api/(Node の Lambda)に TypeScript で置く |
#2169 の確定仕様の「構成と言語」(決定 2。ゲート 1 で利用者が承認済み) | 前提とする取り決め |
| S6 | Cognito の利用者プールなどインフラの定義と決済は範囲外 | #2168 の方針(インフラは private リポジトリ)と子課題の分け方(決済は #2174) | 含まない |
| S7 | 個人 Pro・個人 Max の「個人」はアカウントが 1 人のものを指し、Team はアカウントが複数の席を持つ | 原文「個人PRo, 個人Max, Team(…)」 | 前提 4 |
目的
- Google か GitHub のアカウントで Neural Development Factory にログインでき、ログインした人がどのアカウント(個人かチーム)として操作しているかを、ほかの子課題が token 1 つから確かめられる状態にする
- プランと席ごとに使える量を 1 か所で決め、実行の制御(NDF Factory: スプリントの実行の制御とランナー #2186)と課金(NDF Factory: サブスクリプションと Bedrock の token 課金 #2174)が同じ値を問い合わせて使える状態にする
factory/に TypeScript のパッケージの管理の道具を決め、後続の子課題(NDF Factory: contracts と進捗の受け口 #2171・NDF Factory: スプリントの一覧(フェーズ)と詳細(工程・PR・CI・承認ゲート) #2172〜NDF Factory: サブスクリプションと Bedrock の token 課金 #2174・NDF Factory: スプリントの実行の制御とランナー #2186)が同じ形でfactory/web/・factory/api/にコードを足せる状態にする
前提
- 前提 1: Cognito の利用者プール・アプリのクライアント・外部の IdP(Google・GitHub)の登録・ドメインはインフラであり、private リポジトリが作る。この課題はその定義を書かず、受け取る変数の名前を
factory/.env.exampleに足すだけにする(確定仕様の「データ・設定」。値は書かない、I6) - 前提 2: GitHub のログインを Cognito へつなぐ形(Cognito の OIDC の IdP として直に登録できるか、OIDC の仲立ちのプログラムが要るか)は設計で確かめる。仲立ちが要り、それがインフラでなくサービスのコードなら
factory/api/に置く。仲立ちの秘密(GitHub の OAuth の client secret)は Secrets Manager の ARN(*_SECRET_ARN)だけで受ける - 前提 3: 1 人の人が Google と GitHub の両方でログインしたとき、2 つは別の利用者として扱い、自動で 1 つにまとめない(メールアドレスの一致でまとめると、片方の IdP でメールを偽れたときに他人のアカウントへ入れるため)。まとめる機能はこの課題に含めない
- 前提 4: アカウントは「個人」か「チーム」のどちらか。初めてログインした利用者には、その人だけの個人のアカウントがプラン Free で 1 つ作られる。チームのアカウントは席を持ち、席はそれぞれ 1 人の利用者と種類(standard / premium)を持つ。個人のアカウントは席を持たない(使える量はプランから決まる)
- 前提 5: チームへ人を入れるのは、チームの持ち主(チームを作った利用者)が、既に 1 度ログインした利用者を指して席を足す操作だけにする。招待のメールの送信はこの課題に含めない
- 前提 6: プランごと・席の種類ごとの使える量の値(同時のスプリントの数・月の token の上限)は、コードの分岐でなく 1 つの表(設定かデータ)で持つ。初めの値は設計で案を出し、ゲート 1 で利用者が決める。値を変えるのは表の 1 か所だけで済む
- 前提 7: 使える量の判定に要る「今の値」(動いているスプリントの実行の数・その月に使った token の数)は、この課題が持たない(スプリントの実行は NDF Factory: スプリントの実行の制御とランナー #2186、使用量の台帳は NDF Factory: サブスクリプションと Bedrock の token 課金 #2174 の集約)。判定は呼び出す側が今の値を渡し、この課題は上限と照らした結果を返す。これで確定仕様の「使う契約は無い」を保つ
- 前提 8: プランを Free 以外へ変える経路(決済の後に誰が何を呼ぶか)は NDF Factory: サブスクリプションと Bedrock の token 課金 #2174 が決める。この課題は、アカウントのプランを書き換える操作を API の内側の関数として持つが、利用者が画面から自分のプランを変える経路は持たない
- 前提 9: 月の境目は UTC の暦月で数える(使用量の事象の
atが UTC のため、確定仕様の「進捗の正本」) - 前提 10: 実行の形態(
local/byok/managed)はアカウントの値で、この課題は値と選べる条件だけを持つ。形態ごとのランナー・持ち込んだキーの保存・実行は NDF Factory: スプリントの実行の制御とランナー #2186・NDF Factory: 手元のマシン(利用者の環境で、利用者の claude ログインで実行する) #2189、managedの token の課金は NDF Factory: サブスクリプションと Bedrock の token 課金 #2174 が持つ(確定仕様の「実行の形態」)
対象範囲
含む:
- 画面(
factory/web/): Google か GitHub でログイン・ログアウトする画面と、自分のアカウント(プラン・使える量・チームなら席)を見る画面 - API(
factory/api/): Cognito の token の検証とaccount_idの解決、アカウント・席・プラン・実行の形態の読み書き、使える量の問い合わせと判定 - チームのアカウントの作成と、席の追加・種類の変更・削除(チームの持ち主だけ)
factory/の TypeScript のパッケージの管理の道具の決定と、factory/web/・factory/api/の雛形(依存の宣言・ロックファイル・型検査・テストのコマンド)factory/web/・factory/api/のテストと型検査を Pull Request で走らせる CI のジョブfactory/.env.exampleへの変数の名前の追加と、用語集への語の追加
含まない:
- Cognito の利用者プールなどインフラの定義(private リポジトリ側。前提 1)
- 決済・料金・請求の画面と、プランを有料へ変える経路(NDF Factory: サブスクリプションと Bedrock の token 課金 #2174。前提 8)
- 使用量の台帳と、その月に使った token の集計(NDF Factory: サブスクリプションと Bedrock の token 課金 #2174。前提 7)
- スプリントの開始を断る処理そのもの(NDF Factory: スプリントの実行の制御とランナー #2186。この課題は判定を返す)
- 実行の形態ごとのランナー・持ち込んだキーの保存・Claude の呼び出し(NDF Factory: スプリントの実行の制御とランナー #2186・NDF Factory: 手元のマシン(利用者の環境で、利用者の claude ログインで実行する) #2189。前提 10)
- 2 つの IdP の利用者を 1 つにまとめる機能(前提 3)・招待のメール(前提 5)
- 確定仕様の契約の形の変更。変えるなら設計 Pull Request で確定仕様を先に直す(確定仕様の「サービス全体の契約」の冒頭)
提供する契約
| 契約 | 中身 | 使う課題 |
|---|---|---|
認可の token と account_id |
検証を通った token と要求から、操作しているアカウントの account_id を得る関数(受け入れ条件 4・5) |
#2171・#2186・#2174 |
| 使える量の問い合わせと判定 | 上限の問い合わせと、今の値を渡した判定(受け入れ条件 6・7) | #2186・#2174 |
| アカウントの実行の形態 | アカウントの実行の形態(local / byok / managed)の読み出し(受け入れ条件 18) |
#2186・#2189・#2174 |
ドメインイベント
| # | イベント | 引き金 | 失敗したとき | 順序の前提 |
|---|---|---|---|---|
| E1 | 利用者が Google か GitHub でログインした | 画面のログインの操作 | IdP が拒んだ・利用者が取り消した → 画面がログインの画面へ戻り、理由を出す(受け入れ条件 2) | — |
| E2 | 初めてログインした利用者に、個人のアカウント(Free)を作った | E1 の後、その利用者にアカウントが無い | 作れなかった → API は 5xx を返し、次のログインで作り直す。同じ利用者に 2 つ作らない(受け入れ条件 12) | E1 |
| E3 | API が token を検証し、account_id を解決した |
画面か他の子課題の API への要求 | token が無い・壊れている・期限切れ・別の利用者プールのもの → 401(受け入れ条件 4) | E2 |
| E4 | 利用者がチームのアカウントを作った | 画面の操作 | — | E2 |
| E5 | チームの持ち主が席を足した・種類を変えた・外した | 画面の操作 | 持ち主でない → 403。相手が未ログイン・既に席を持つ → 断り、理由を出す(受け入れ条件 10・11) | E4 |
| E6 | アカウントのプランを変えた | #2174 が呼ぶ内側の関数(前提 8) | 知らないプラン → 変えずに失敗を返す | E2 か E4 |
| E7 | 使える量を問い合わせた・判定した | #2186(スプリントの開始)か画面 | 上限に達した → 断る結果と理由を返す(受け入れ条件 7・8) | E3 |
| E8 | ログアウトした | 画面の操作 | — | E1 |
| E9 | アカウントの持ち主が実行の形態を変えた | 画面か API の操作 | 持ち主でない → 403。Free で managed → 断り、理由を出す(受け入れ条件 19) |
E2 か E4 |
用語
| 用語 | 意味 |
|---|---|
| アカウント | Neural Development Factory で、プランと使える量を持ち、リポジトリの登録とスプリントの実行を持つ単位。個人とチームの 2 種類。account_id で指す |
| 席 | チームのアカウントの中で、1 人の利用者に割り当てる枠。種類は standard と premium |
| プラン | アカウントの契約の種類。Free・個人 Pro・個人 Max・Team の 4 つ。Team の使える量は席の種類で決まる |
| 使える量 | プランか席の種類ごとに決まる上限。同時に動かせるスプリントの実行の数と、月の token の上限の 2 つ |
| 実行の形態 | アカウントのランナーが Claude をどう呼ぶか。local(手元のランナー)・byok(キーの持ち込み)・managed(サービスの Bedrock)の 3 つで、アカウントごとに 1 つ持つ。Free は managed を選べず、月の token の上限は managed だけに掛かる |
受け入れ条件
ログイン:
- 1. ログインの画面に Google と GitHub の 2 つのログインの操作があり、どちらでも Cognito を経てログインでき、ログイン後の画面に自分のアカウントのプランが出る
- 2. IdP の画面で利用者が取り消したか IdP が拒んだとき、ログインの画面へ戻り、ログインできなかったことが出る。token は保存されない
- 3. ログアウトすると、画面が保存した token が消え、API を呼ぶ画面を開くとログインの画面へ移る
認可の token と account_id:
- 4. API は Cognito の token を署名・発行元・対象のクライアント・期限で検証する。token が無い・署名が違う・期限切れ・別の利用者プールかクライアントのもののどれでも 401 を返し、アカウントの中身を返さない。それぞれを 1 つずつ入れたテストで確かめる
- 5. 検証を通った token から、その利用者が操作しているアカウントの
account_idを得る関数がfactory/api/にあり、NDF Factory: contracts と進捗の受け口 #2171・NDF Factory: スプリントの実行の制御とランナー #2186・NDF Factory: サブスクリプションと Bedrock の token 課金 #2174 の API が同じ関数を呼んで使える。チームのアカウントを指す要求で、その利用者がチームの席を持たなければ 403 を返す
プランと使える量:
- 6. 使える量の問い合わせに
account_id(チームなら席の利用者も)を渡すと、同時に動かせるスプリントの実行の数と月の token の上限が返る。値はプラン(個人のアカウント)か席の種類(チームのアカウント)で決まり、Free・個人 Pro・個人 Max・Team standard・Team premium の 5 つで、表(前提 6)の値と一致する - 7. 使える量の判定に今の値(動いているスプリントの実行の数・その月の token の数)を渡すと、上限より小さければ許す結果、上限に達していれば断る結果と理由(どの量が・上限がいくつで・今がいくつか)が返る。上限ちょうど・上限より 1 少ない・上限より多いの 3 つの境目をテストで確かめる。月の token を照らすのは実行の形態が
managedのときだけである(受け入れ条件 20) - 8. 画面の自分のアカウントの画面に、使える量の 2 つの上限が出る
チームと席:
- 9. 利用者がチームのアカウントを作ると、作った利用者がチームの持ち主になり、持ち主自身の席が 1 つ(種類は作るときに選ぶ)できる
- 10. チームの持ち主は、既に 1 度ログインした利用者を指して席を足し、席の種類を変え、席を外せる。持ち主でない利用者が同じ操作をすると 403 で、席は変わらない
- 11. 未ログインの利用者を指して席を足す・同じチームに既に席を持つ利用者を足す・持ち主自身の席を外すのどれも断られ、理由が出る。席は変わらない
起きてはいけないこと:
- 12. 同じ利用者が何度ログインしても、個人のアカウントは 1 つだけである(並べて 2 回ログインしても 2 つにならない)
- 13. 利用者 A の token で、A が席を持たないアカウント(他人の個人のアカウント・入っていないチーム)のプラン・使える量・席を読もうとしても書こうとしても 403 で、相手のアカウントの有無と中身が応答に出ない
- 14. このリポジトリに、Cognito の利用者プールなどインフラの定義・秘密・
.envの実ファイルが入らない。境界の検査(python3 scripts/check-service-boundary.py)が 0 で終わる
パッケージの管理と検査:
- 15.
factory/の TypeScript のパッケージの管理の道具が 1 つに決まり、factory/web/・factory/api/に依存の宣言とロックファイルがある。決めた道具と理由が設計文書にあり、後続の子課題が従う規則としてfactory/README.mdに書いてある - 16.
factory/web/・factory/api/の型検査とテストが、それぞれ 1 つのコマンドで手元と CI の両方で走る。CI のジョブはfactory/を変える Pull Request で走り、落ちれば Pull Request が赤になる - 17. 既存のテスト(
uv run --frozen --project . --all-extras pytest . -q -n 4)・claude plugin validate .・既存の CI の必須チェックが、この変更の前と同じに通る。プラグインの配布物と CLI だけで使う人の振る舞いは変わらない
実行の形態:
- 18. アカウントは実行の形態(
local/byok/managed)を 1 つ持ち、アカウントを読む API の応答に出る。NDF Factory: スプリントの実行の制御とランナー #2186・NDF Factory: 手元のマシン(利用者の環境で、利用者の claude ログインで実行する) #2189・NDF Factory: サブスクリプションと Bedrock の token 課金 #2174 は同じ値をaccount_idから読める - 19. アカウントの持ち主(個人なら本人、チームならチームの持ち主)は実行の形態を変えられる。持ち主でない利用者が変えようとすると 403 で、形態は変わらない。プランが Free のアカウントで
managedを選ぶと断られ、理由(Free ではmanagedを選べない)が出て、形態は変わらない - 20. 使える量の判定は、実行の形態が
managedのときだけ月の token の上限を照らす。localとbyokでは、その月の token が上限を超えていても月の token を理由に断らない。同時に動かせるスプリントの実行の数は 3 つの形態すべてで照らす
非機能の条件
| 大項目 | 条件 |
|---|---|
| セキュリティ | token は API で毎回検証し、画面の判定だけで認可しない(受け入れ条件 4・13)。秘密は Secrets Manager の ARN だけで受け、値をコード・ログ・応答に出さない。token と利用者のメールアドレスをログに出さない。この変更は共通原則の C2(認証・認可を変える)に当たる |
| 運用・保守性 | 使える量の値は表の 1 か所で変える(前提 6)。断った判定の理由は、利用者に出す文と同じ中身を API の応答に構造で返す |
| システム環境 | 画面は React の SPA(Vite)、API は Node の Lambda、TypeScript(確定仕様の「構成と言語」)。Node の版は設計で決め、factory/ の中で 1 つに揃える |
影響
| 対象 | 影響 |
|---|---|
| 公開インタフェース | プラグインの Skill・hook・スクリプトは変わらない。factory/api/ に新しい API ができる(初めての公開で、互換を保つ前の版は無い) |
| データ | 新しい表(アカウント・席)。既存のデータの移行は無い |
| 既存の振る舞い | CI に factory/ のテストと型検査のジョブが 1 つ増える。factory/.env.example に変数の名前が増える |
検証手段
| 項目 | 手段 |
|---|---|
| テスト | factory/web/・factory/api/ のテストのコマンド(道具と一緒に設計で決める)。Cognito の token は、テストの中で作った鍵で署名した token と、偽の公開鍵の一覧で確かめる。既存は uv run --frozen --project . --all-extras pytest . -q -n 4 |
| 静的解析・型検査 | factory/ の型検査のコマンド(設計で決める)・python3 scripts/check-service-boundary.py・claude plugin validate .・python3 plugins/ndf/scripts/instructions-check.py --root . |
| 手動確認 | private リポジトリのインフラが利用者プールを作った後、実際の Google と GitHub のアカウントでログインし、プラン Free のアカウントができることを見る(インフラがそろうまで確かめられないため、リリース後テストへ回す) |
前提とする取り決め
| 項目 | 参照先 / 決めたこと |
|---|---|
| プロジェクト構造 | 確定仕様の「構成と言語」と factory/README.md の「置くもの」。画面は factory/web/、API は factory/api/。plugins/ からは参照しない(境界の検査の I1)。インフラの定義は置かない(I3) |
| コーディング規約 | AGENTS.md の「最小限のコード実装」。TypeScript の型検査を通す。形の正は確定仕様で、契約を変えるときは確定仕様を先に直す |
| テスト戦略 | token の検証・account_id の解決・使える量の判定・席の操作の権限を単体テストで、画面のログインの流れはテストの中の偽の Cognito で確かめる。.md の文言を照合するテストは書かない |
境界
| 区分 | 内容 |
|---|---|
| 常に行う | 既存テスト・claude plugin validate .・境界の検査の実行。使うコマンドとライブラリの挙動を書く前に確かめる |
| 確認してから行う | パッケージの管理の道具・使える量の初めの値・GitHub のログインのつなぎ方・CI のジョブの追加(どれもゲート 1 の承認資料に載せ、承認ゲートで人が見る) |
| 行わない | private リポジトリへの書き込み、秘密の値の記入、決済とプランの有料化の経路、#2171・#2172〜#2174・#2186 の実装の先取り |
承認の扱い: この変更は共通原則の C2(認証・認可を変える)に当たるため、ゲート 1・2 を MVV の判定で自動に通さず、人が承認ゲートで見る(.ndf/pace.json の fast / auto でも同じ)。承認の工程は足さない。
未決
| 項目 | 誰が決めるか | 期限 |
|---|---|---|
| パッケージの管理の道具(npm か pnpm)と Node の版 | 設計(ゲート 1 で利用者が承認) | #2170 の設計 Pull Request |
| 使える量の初めの値(5 つのプランと席の種類ごとの同時のスプリントの数・月の token の上限) | 設計が案を出し、ゲート 1 で利用者が決める | #2170 の設計 Pull Request |
| GitHub のログインを Cognito へつなぐ形と、仲立ちが要るときの置き場(前提 2) | 設計(ゲート 1 で利用者が承認) | #2170 の設計 Pull Request |
| 1 人が個人とチームの両方のアカウントを持つとき、要求がどちらのアカウントとして操作するかを画面と API がどう示すか(受け入れ条件 5) | 設計 | #2170 の設計 Pull Request |
account_id を token の主張に載せるか(Cognito の token を作る前の Lambda)、API が利用者の識別子から引くか |
設計 | #2170 の設計 Pull Request |
| プランを有料へ変える経路(前提 8) | #2174 の設計 | #2174 |
進行
モード: —
- 要求と受け入れ条件 — 2026-10-30 08:50
- 作業場所の用意 — 2026-10-30 11:37
- 設計 — 2026-10-30 08:54
- 素材の収集と出典の確定
- ドキュメント再構成
- ドキュメントレビュー
- 計画 — 2026-10-30 11:37
- 実装 — 2026-10-30 11:38
- 構造改善 — 2026-10-30 12:29
- 実装レビュー — 2026-10-30 13:14
- 完了判定 — 2026-10-30 12:02
- Pull Request — 2026-10-30 12:14
- 確定仕様化 — 2026-10-30 14:29
- 後片付け — 2026-10-30 14:29
- 配布 — 2026-10-30 13:50
- 体裁レビュー
- リリース後テスト — 2026-10-30 14:28
- 振り返り — 2026-10-30 15:00
- 棚卸し — 2026-10-30 15:00
振り返り: #2170 (comment)
残っていること
実装・配布(ndf v10.26.0、PR https://github.com/devbasex/ai-plugins/pull/2195)は済んでいる。残りは、実環境の Cognito・Google・GitHub・DynamoDB が要る受け入れ条件 1・2・3・4・12 のリリース後テストだけである。インフラ(Cognito の利用者プール・IdP・秘密)は private リポジトリの認証の課題が作り、それができた時点で実際のアカウントでログインして確かめる。
Activity
Merge pull request #2185 from devbasex/docs/factory-decision2-to-2170
docs(#2170): 確定仕様の account_id の契約を resolveAccount へ直し、インフラへ渡す形に IdP の…
Docs: 使える量の token を cache を含めて数えると決め、Bedrock の費用の目安を足す(#2170)
Docs: 認証とプランの設計に実行の形態の値と選べる条件を足す(#2170)
Docs: GitHub の仲立ちで nonce を署名した state と code で運び、プランと形態の更新に版の条件を足す(#2170)
Docs: GitHub の仲立ちの /authorize で redirect_uri と client_id を設定と照らし、違えば …
docs(#2170): 置き場所の木の .env.example を 7 つの名前に揃える
Merge pull request #2188 from devbasex/design/issue-2170
Merge pull request #2191 from devbasex/feat/issue-2170-m2170
Merge pull request #2193 from devbasex/fix/m2170-factory-suite
Merge pull request #2197 from devbasex/docs/spec-2170
takemi-ohama commentedon Oct 30, 2026
振り返り(2026-10-30)
対象: issue #2170 / 設計 PR #2188 / 実装 PR #2191 / 検査 PR #2192 / 即時修正 PR #2193 / 配布 PR #2195
Neural Development Factory の最初の TypeScript のコードとして、
factory/を npm の workspaces にし、Cognito の access token の検証・アカウントと席・プランごとの使える量の判定・実行の形態(local/byok/managed)をfactory/api/に、ログインと自分のアカウントとチームの画面をfactory/web/に置いた。GitHub のログインは Cognito の OIDC の IdP として受ける仲立ちをfactory/api/に置いた。ndf v10.26.0 として配布した。何が起きたか
factory/の*.test.tsが pytest の suite へ振られて止まった。即時修正 PR #2193 で suitefactoryを宣言に足したが、宣言をメインディレクトリの未コミットの.ndf/project.jsonから先に読むため、まだ止まった(既知の #1709 の再発。#1709 に追記済み)。メインディレクトリへ同じ suite を足して回避し、その未コミットの差分が今度は開発版の verify の pull を止めた。プランの外の手当てが 2 度目の停止を生んだndf--v10.26.0を push した後に GitHub Release の作成が HTTP 500 で失敗した。打ち直すたびに「タグは既にある」で止まり、5 回の失敗で judge が stop した。Release を手で作り、record から再開した(#2198 として起票)standardのコードの変更で、対象の文書の種類に当たらない)context window の大きさ
測ったのは #2170 の取り込み以降を通した conductor のセッション 3 本(
--sessionを 3 回)。設計と実装の supervisor は supervise.py の queue で動いたため、この表に入っていない。用語集の変化
承認ゲートの差し戻し
gate-rejections.py count --issue 2170 --pr 2188 --pr 2195: 関門 1 が 0 件・関門 2 が 0 件。関門 1 は承認の後に利用者が方針を変えて取り直したが、差し戻しとしては記録されていない。差し戻しの記録の漏れに気づけない件は既存の #2183 が持つ。MVV を見直すか
project-mvv.py signals(版 3): 覆し 0 件(閾値 3)・判定できない 0 件(閾値 5)・続けて 0 回(閾値 3)・流出不具合 0 件(閾値 3)。どの兆候も閾値に届いていない。この起動は人に問えない(3 層の supervisor)ため、改訂するかの問いは conductor から利用者へ渡す。材料はこの集計で、推奨は「改訂しない」(兆候が 0 のため)。次に変えること
releaseの手順(release-steps.py)cross-refactoringの手順(宣言の読み方)途中で起票した課題
factory/の構造改善の提案 20 件が時間で見送られ、課題に残っていない