Urazuke — コース、パート2:受け継いだプロジェクト。方法で生まれなかったシステムを正常化し、それから進化させる

著者:Pablo Kuschniroff、Claude Codeの支援による。第1版、2026年10月18日。これは コースのマニュアルの第二部だ:あなたが第一部をやったこと、少なくともレッスン0から8を読んだことを前提にしている。ここでは保留項目とは何か、赤のテストとは何か、セマンティックツリーとは何かを改めて説明しないからだ。このパートの方法は 進化・修正の道のページにある。ここにあるのは実践で、二つ目のガイドプロジェクトとともに。見慣れない言葉は主文書の用語集に、実際の事例は 参照文書にある。公開リポジトリ: github.com/pkuschnirof/urazuke。

始める前に

このパートは誰のためか

第一部をやって、現実には空のフォルダを渡されることなどほとんどないと気づいた人のため。渡されるのは既に動いているシステムで、それに依存するユーザーがいて、「これを直して」か「あれを足して」と言われる。そして数か月前に何かを「バイブコーディング」して、動いて、今は崩れないようにその上に構築を続けなければならない人のためでもある。二人は同じ場所にいる:レガシーとともに。たとえ片方はそれを自分で書いたのだとしても。

最後に何を手にするか

受け継いだのと同じシステムが、以前と同じことをしていて、しかし周りに方法が前提とするすべてを備えている:レガシーのルールを備えた共働の約束。各主張がどこから出たかの印とともに復元されたシステムの地図。コードがすることと業務が信じていることのあいだの食い違いの一覧。速度の印付きでバックログに変わった監査。匿名化されたデータを持つテスト環境。繰り返せるデプロイ。コードの外に出してローテーションした秘密。重要なフローを見張る特性化テスト群。既に世界へ作用しているものの上の錠。計測された数字によるサイジング。そして負債と顧客の依頼がモジュールごとに対になって同居するバックログ。その後に、赤のテストとともに修正された最初のバグと、完全な方法で構築された最初の新しい機能。

このパートの順序

段階レッスンほかに何をするか
1N0、N1、N2、N3読み取り。 何も変えない。復元されたツリーをオーナーと辿り、食い違いを一つずつ決め、監査を読む。締めに:地図と負債の棚卸し。
2N4、N5安全ベルト。 匿名化されたデータを持つテスト環境、二度のデプロイ、ローテーションした秘密、ミューテーションによる赤付きの特性化テスト群。既に作用しているものの上の錠を確認。締めに:システムがテスト環境で動き、テスト群が緑。
3N6、N7、R1測る、順序を付ける、直す。 計測したサイジング。二つの印を持つバックログ。最初のブロック:既知のバグを、対のものとともに修正モードで閉じる。
4R2進化させる。 二つ目のブロック:新しい機能を、完全な方法で(第一部のレッスン5から12)、特性化を回帰として構築する。
5と6第一部の13、14、15、20、16、17、18、19本番リリース。 定期監査、残りの錠、本番への道の締め、三つのマニュアル(レガシーにはなかった)、そしてデプロイ前の運用品質の四つの段:完全な可観測性、N6が計測したものによる永続化、ゲートとしての脆弱性の走査、破断点を伴う負荷テスト。
7第一部の23、21、22運用。 デプロイとともに組み立てる二つの監視、最初の読みをレガシーの基準線として。常駐エージェント。レガシー固有の質問を伴う振り返り:正常化にいくらかかったか。

ガイドプロジェクト:「受け継いだTurnera」

第一部と同じ診療所の、二年後、別の時間軸だ:彼らはTurneraを方法で作ることが決してなかった。その代わりに、責任者の甥が一夏で「Turnos」というウェブアプリケーションを作り、それ以来動いている。今日、二人の受付係と三人の専門職が毎日使っていて、約二万件の予約が入っていて、それを丸ごと理解している人は誰もいない:甥は外国に住むようになり、二週間に一度メッセージを返す。

あるもの。 コードの入ったGitHubのリポジトリ(ブランチは一つ、コミットのメッセージは「修正」など)、アプリケーションが動くのと同じサーバーの上のデータベース、FTPでファイルをコピーする手でのデプロイ、コードに書かれたデータベースのパスワード、テストはゼロ、毎晩リマインダーを送るサーバーの定期処理、そして責任者がデスクトップのツールでデータベースにつないで毎月落とす表計算。誰も復元したことのない「自動」のバックアップがある。

痛むもの。 二つ。一つ目はバグだ:患者が時々リマインダーを二度受け取り、時々一度も受け取らない。責任者はいつ起きるか分からないが、苦情を言う患者のスクリーンショットを持っている。二つ目は足りないものだ:ある種の予約について支払いリンクで手付金を求めたいし、表計算を落とさずに今月の予約数、欠席数、キャンセル数を見たい。

オーナー。 同じ責任者:事業についての判断力があり、一日十五分、コードは読まない。そして重要な新しい点が一つ:彼女はシステムがしないことをすると信じていて、システムが実際にしていることを知らない。レガシーではそれが普通であり、それこそレッスンN2が明るみに出すものだ。

重要なフロー、彼女の言葉で:「予約を登録する」「予約をキャンセルする」「リマインダーが届く」「患者を探す」「今月の表計算を落とす」。五つあり、それが特性化テスト群になる。

これで足りる。ほかのすべてはシステムの中にあり、それを読むのはエージェントだ。


正常化の区間:レッスンN0からN7

この八つのレッスンが、第一部になかった区間だ。最初の四つは読み取りのためのもの:何も変えないし、何かを変えたい誘惑は巨大になる。次の二つが安全ベルトを組む。最後の二つが測って順序を付ける。機能に触れるのはその後だ。

レッスン N0 — 既存システムの適格性:エージェントが実際に行って検証する前提条件

理解すべきこと。 レッスン0では基準に答えるのは調査だった。ここにはシステムがある。だから基準は、誰の意見も介さずに、エージェントが実際に行って検証できる:ソース、データ、永続化を含む完全な環境を立ち上げられるか。コードを理解できるか。コードだけから、機能のすべてを記述し、責任者が自分のシステムだと認める文書を書けるか。テスト用の道具で画面を操作し、エンドツーエンドのテストを走らせられるか。今日の道具で構築されているか。データを複製し匿名化でき、復元されたバックアップがあるか。連携にテストモードはあるか。七つの前提条件であり、新しいルールは、赤は「不可」ではないということだ:それは前段のプロジェクトであり、独自の範囲を持ち、そのシステムを適格にするためのものだ。

プロンプトを送る前に、あなたの手で:

  • docs/INITIAL_SURVEY.md、短く:責任者によればTurnosは何をして誰のためか、何が痛むか(二重のリマインダー、足りないもの)、誰が作ってどれだけで返事が来るか、どこで動いているか、誰がアクセスを持つか、そして誰も復元したことのない「自動」のバックアップがあること。半ページ。
  • docs/ELIGIBILITY_CRITERIA.md:レッスン0のシートに、レガシーの七つの前提条件を加えたもの(進化・修正の道のページ、ステーションN0から写すこと)。空の三列とともに:緑か赤か、証拠、前段のプロジェクト。
  • リポジトリへの読み取りアクセス、データベースの複製(または読み取り専用の本番)、そしてエージェントがシステムを立ち上げようと試せる場所(コースではあなたのマシンで足りる)。認証情報はチャットの外に。
  1. ステーションN0(進化・修正の道のページ)の最初のプロンプトを、そのまま貼ること。
  2. 時間がかかる:環境を立ち上げ、すべてを読み、docs/FUNCTIONALITY_RECOVERED.md を書き、テストを走らせなければならない。終わったら、その文書を責任者と読むこと:彼女が持っていると思っているシステムを記述しているか。一致しないものは書き留めること:最初の食い違いのリストだ。
  3. シートを見ること:各前提条件には、あなたの答えではなく、エージェントが行ったことの証拠がなければならない。

プロンプトを送る前に(締めのプロンプト):一行のあなたの決定、そして各赤について、前段のプロジェクトを今やるか、後でやるか、決してやらないか。

  1. ステーションN0の締めのプロンプトを貼ること。

完全性の検証。 各前提条件に、言われたのではなく行われた証拠があるか? 回復された機能の文書が存在し、責任者がそれを認めたか? 本物のエンドツーエンドのテストを走らせたか? 各赤にブロックする保留項目としての前段のプロジェクトがあるか?

提出物。 docs/ELIGIBILITY.md、docs/FUNCTIONALITY_RECOVERED.md、そしてあれば前段のプロジェクトのブロックする保留項目。

典型的な誤り。 エージェントが行わずに答えた緑を受け入れること(「はい、コードは理解できます」)。そして赤を拒絶として扱うこと:方法が求めるのは前段のプロジェクトであって、断念ではない。

ガイドプロジェクトでは。 エージェントはデータベースの複製とともにTurnosをあなたのマシンで立ち上げ(緑)、古いテンプレート言語で書かれたレポートのモジュールを除いてコードを理解し(緑、注記付き)、機能の文書を書き、責任者はそこでシステムがしていると知らなかったことを二つ発見し(緑:文書は彼女の記憶より優れている)、六つのうち四つの画面を操作し登録フローのテストを走らせ(赤:二つの画面が操作できない、前段のプロジェクト:「カレンダーと検索を操作できるようにする」)、PDFの生成器の死んだ依存関係を除いて今日の道具で構築し(赤:小さな前段のプロジェクト)、データを複製し匿名化し(緑)、だがバックアップは一度も復元されていない(赤:それを復元することがすべての中で最も安い前段のプロジェクトだ)、そしてメッセージの提供者にはテストモードがある(緑)。決定:可、三つの小さな前段のプロジェクトの後に。

レッスン N1 — レガシーのための共働の約束

理解すべきこと。 レッスン1の六つのルールに五つが加わる。それが存在するのは、他人のコードを前にしたモデルが反射的に三つのことをするからだ:並べ替える、悪いと思ったところを「直す」、そして自分の期待と違うことをコードがしていたらそれは誤りだと決めてかかる。レガシーのルールはその反射を塞ぐ:頼まれていないリファクタリングはしない、触れる前に読む、変なものは直さずに書き留める、オーナーが別のことを言うまで現在の挙動が仕様である、そして特性化が緑でなければ何も入らない。

プロンプトを送る前に、あなたの手で:

  • あなたの働き方の好み、レッスン1と同じく。そしてもう一つの決定:正常化のあいだにどれだけのリスクを受け入れるか。コースでは:エージェントは自分でテスト環境にデプロイしてよい。本番へは、レッスン15まで決して。
  • docs/ELIGIBILITY.md が締め済みであること。
  1. これを貼ること:

Before we touch anything, we are going to set the working agreement between you and me for a system that already exists and has users. Write docs/WORKING_AGREEMENT.md with the six rules of the method (my time is sacred; zero technical debt; exact scope; documentation in the same commit; never report as done what you have not verified; speak my language), each with one line explaining what it prevents, and these five rules for an inherited system: (7) Nothing is refactored that was not asked for, and no module is rewritten. (8) Code you do not understand is read before it is touched, and what you learn goes into the system map. (9) Anything strange you find (a secret in the code, a dead path, a duplicated rule, a query without an index) is logged as a pending item with its evidence, never fixed in passing. (10) Current behaviour is the specification until the owner says otherwise: a difference between what the code does and what the business says is a discrepancy for me to decide, not a bug for you to fix silently. (11) No change reaches the test environment without the characterization suite green. Add any rules you think this system needs, marked as proposals. If you need to know something about how I work in order to write this, ask me.

  1. 提案を読むこと。「触れるにつれてコードを現代化する」と言うものがあれば、理由とともに却下すること:それは変装した書き直しだ。

プロンプトを送る前に(締めのプロンプト):各提案についてのあなたの判定、一行の理由付きで。プロンプトの穴のためです。

  1. レッスン1の締めのプロンプトで、変更なしで締めること。

完全性の検証。 十一のルールが、それぞれ防ぐ失敗とともに揃っているか? リファクタリングや書き直しを許す提案はないか?

提出物。 日付と版の付いた docs/WORKING_AGREEMENT.md。

典型的な誤り。 妥当に聞こえるからと「漸進的な清掃」のルールを受け入れること。妥当に聞こえるし、それはエージェントが頼まれていないことを変える許可を自分に出す形だ。

ガイドプロジェクトでは。 エージェントが受け入れる価値のある独自のルールを二つ提案する:「このシステムではテスト環境から実際の送信は一切出ない:テストでのリマインダーは偽の受信箱へ行く」、そして「責任者が落とす月次の表計算はシステムの消費者であり、契約として数える」。二つ目は生産者・消費者の地図が早めに顔を出したものであり、それでいい。

レッスン N2 — システムの読み取り:復元された地図と食い違い

理解すべきこと。 コース全体で時間あたりの価値が最も高いレッスンだ。レッスン2ではプロジェクトファイルとツリーは調査から出てきた。ここではシステムそのものから出てきて、各主張がどこから出たかの印を帯びる:[コード]、[データベース]、[設定]、[文書]、 [業務]、または[推定]。印こそがコードを読まずに検証することを可能にする:推定されたものを見て、確認するか訂正する。そして新しい文書が現れる、食い違いの一覧だ:コードがすること、データベースが課すこと、業務が信じていることのあいだで合わないすべて。それは勝手には解決しない:一つずつがあなたの、日付付きの決定だ。レガシーには常に食い違いがある。一覧が空で出てきたら、エージェントは比較していない。

プロンプトを送る前に、あなたの手で、オーナーとともに:

  • すべてへのエージェントの読み取りアクセス:リポジトリ全体、データベースのスキーマ(読み取り専用、認証情報はチャットの外に)、秘密の値を伏せたサーバーの設定、最近のログ、そしてあるだけの文書(Turnosでは、甥の「変更の上げ方」というメールが一通)。
  • docs/INITIAL_SURVEY.md に、責任者とともに書く新しい節:彼女がシステムはこうすると信じていることを、ユースケースごとに。そして覚えているルール(「予約は二時間前を切ったらキャンセルできない」「リマインダーは夜八時に出る」)。それをシステムと照合しないでください:その比較はエージェントの仕事です。
  • リポジトリの外に住むものの一覧:リマインダーの定期処理と、データベースにつなぐ月次の表計算。
  • docs/WORKING_AGREEMENT.md が締め済みであること。
  1. これを貼ること:

We are going to recover the map of this system from what exists. Read the whole repository (every branch), the database schema (read-only), the configuration of each environment, the recent logs and whatever documentation there is; if some part cannot be read from where you are, tell me and mark it as a gap; do not fill it by guessing. Then write three things. First, complete docs/INITIAL_SURVEY.md in the form the method expects (what the system does and for whom; what it does NOT do; who uses it; the technology; the environments; what an error costs), with every statement tagged by its source: [code], [database], [configuration], [documentation], [business] for what the survey already says, or [inferred]. Second, PROJECT.md, three hundred lines at most, and docs/SEMANTIC_TREE.md: the domains and, under each one, the actors, the processes (each with trigger, steps, outcome and exceptions as the code actually implements them), the entities with the attributes, states and transitions the database and the code enforce, the screens, the external integrations and the scheduled jobs; every node tagged the same way. Third, docs/DISCREPANCIES.md: everything where the code, the database, the documentation and what the business says in the survey do not agree, with the evidence on each side. Do not resolve any discrepancy and do not fix anything: list them. Create docs/STATUS.md for the living state. Reply in my language.

求めているのは、すべてを読んで読めなかったものを申告すること、印付きの調査とツリー、コードが実装している通りの(あるべき姿ではない)プロセス、定期処理、そして解決せずに列挙された食い違いだ。

  1. 責任者とツリーをノードごとに辿ること。[推定]はそれぞれ確認するか訂正する。[コード]はそれぞれ彼女の信じていることと比べる:合わないところに食い違いがあり、エージェントが既に列挙しているかもしれないし、していなければあなたが加える。
  2. 食い違いを彼女と一つずつ、一行で、日付付きで決めること。答えは三つありうる:「システムが正しくて、業務が忘れていた」(確認されたルールとして残る)、「システムが間違っていて、変えなければならない」(保留項目を開く)、または「分からない、後で見る」(日付付きで開いたまま。多すぎないように)。

プロンプトを送る前に(締めのプロンプト):確認したノードと訂正したノードの一覧、そして食い違いの一覧を、あなたの決定と日付とともに、それぞれ一行で。

  1. これで締めること:

I confirm these nodes: [list]. Correct these: [list]. The discrepancies are decided as follows: [one line each: discrepancy, my decision, today's date]. Finalize docs/INITIAL_SURVEY.md, PROJECT.md and docs/SEMANTIC_TREE.md with today's date, keeping the source tags. Write each discrepancy decision in docs/DECISIONS.md with my exact words, and open a pending item in docs/PENDING.md for every discrepancy where I decided the system must change; for the ones where I decided the current behaviour stays, write it next to the node as a confirmed rule. Add to PROJECT.md the instruction to read this file, the tree and the working agreement at the start of every session.

  1. 読み取りテスト、レッスン2と同じく:新しいセッション、文脈なしで、「このシステムは何を *しない*か? どの処理が夜に独りで走るか?」。地図で答えられなければならない。

完全性の検証。 [推定]と印されたノードはあるか?(一つもないなら、エージェントは読んだものと推測したものを区別していない。)ツリーに定期処理が少なくとも一つあるか? 食い違いの一覧はゼロより多いか? それぞれに日付付きの決定があるか、意図的に開いたままか? 印は締めを生き延びたか? 読み取りテストを通ったか?

提出物。 印付きで完成した docs/INITIAL_SURVEY.md、PROJECT.md、 docs/SEMANTIC_TREE.md、決定済みの docs/DISCREPANCIES.md、決定の入った docs/DECISIONS.md、docs/STATUS.md。

典型的な誤り。 一つずつ決めずに、「責任者の言う通りになるようコードを直して」食い違いを解決すること:それらの食い違いのいくつかは、業務が忘れてコードが覚えていたルールだ。そして「その方がきれいだから」と締めのときにエージェントに印を消させること:印のないツリーは、もう検証できない。

ガイドプロジェクトでは。 Turnosのツリーには責任者が予期していたアジェンダのドメインと、予期していなかった二つのものがある:データベースには存在するがどの画面も表示しない「予定変更済み」という予約の状態[データベース]と、リマインダーを送るほかに一年以上前のキャンセル済みの予約を削除する定期処理[コード]。責任者はそれが削除されていることを知らなかった。典型的な食い違いは八つ:キャンセルの二時間ルールがコードに存在しない(いつでもキャンセルできる)。リマインダーは彼女によれば八時、設定によれば七時に出る。患者の電話は彼女が必須だと信じているのにデータベースでは必須でない。等々。削除のものが彼女を最も驚かせ、彼女は一分で決める:「それはもう削除しない」。保留項目だ。

レッスン N3 — 負債の棚卸しとしての監査

理解すべきこと。 レッスン13を、ただし最後ではなく最初に、そして発見ごとに項目を一つ加えて:ブロックするか(どんな変更よりも前に直さなければならない)、そのモジュールに触れたときに払うか、待てるか。その項目がなければ、監査されたレガシーには四十の発見があり、どれから始めるか誰も分からない。何がブロックするかを決めるのは監査人ではなくあなただ:一般には、露出した秘密、操作できない画面、繰り返せないデプロイ、バックアップの不在、そしてデータを損なうか過剰に請求しうるもの。

プロンプトを送る前に、あなたの手で:

  • エージェントの新しいセッション、きれいなクローンと「あなたは監査人です。このシステムを読んだこともなく、触れることもありません」と書いた指示ファイル付きで。データベースとサーバーへの読み取り専用アクセス。
  • N2の PROJECT.md、docs/SEMANTIC_TREE.md、docs/DISCREPANCIES.md。書かれたものを再発見しないためです。
  • 何がブロックするかのあなたの基準を二行で、プロンプトの穴のために。Turnosでは:露出した秘密、操作できない画面、繰り返せないデプロイ、試されていないバックアップ、制御なしに削除または送信するもの。
  1. これを貼ること:

Audit this system for integrity, security, performance, code quality and deployability, as the inventory of what must be normalized before and during its evolution. Read-only: change nothing except writing your report to docs/AUDIT_[date].md. If auditing some part requires access you lack (the database, the logs, the server), tell me and mark that part as not audited; do not pass it as fine. Go through all of the code, not a sample, and read docs/SEMANTIC_TREE.md and docs/DISCREPANCIES.md first so that you do not report what is already known. For every finding: where it is (file and line), the risk, the evidence that proves it (the command, the query, the number), its priority (P0 must be fixed now, P1 soon, P2 when possible), and one more field: whether it BLOCKS (must be fixed before any change, by my criteria: [an exposed secret, a screen that cannot be driven by a program, a deployment that cannot be repeated, no tested backup, anything that deletes or sends without control]), whether it is PAID WHEN TOUCHED (fixed together with the first change that enters its module), or whether it CAN WAIT. Grade every dimension you audited. End with every finding turned into a proposed pending item, blocking ones first. Reply in my language.

  1. 報告書を読むこと。発見を二つ選んで証拠を求めること。速度の印を見直すこと:あなたは理由を付けてどれでも上げ下げできる。

プロンプトを送る前に(締めのプロンプト):読んだ報告書、検証した二つの発見、そして開いた構築者のセッション(締めは監査人ではなく構築者へ行きます)。

  1. 構築者のセッションに戻り、レッスン13の締めのプロンプトを貼ること。最後にこう付け加えて:「Each pending item keeps the speed mark of its finding.」

完全性の検証。 何を監査できなかったか言っているか? 「ブロックする」が少なくとも一つあるか? 各発見にファイル、行、証拠はあるか? ブロックするものは既に保留項目になっているか?

提出物。 速度の印付きの docs/AUDIT_[fecha].md と、開かれたブロックする保留項目。

典型的な誤り。 迷惑をかけたくない監査人のせいで、すべてが「待てる」。あるいは怯えたオーナーのせいで、すべてが「ブロックする」:すると何も始められなくなる。小さいシステムではブロックするものが三つから八つが普通だ。

ガイドプロジェクトでは。 Turnosの監査はブロックするものとしてこれを見つける:コードの中のデータベースのパスワード(しかもgitの履歴の中にもあるので、移すだけでなくローテーションしなければならない)、どのバージョンが動いているかの記録のないFTPでのデプロイ、錠のないまま予約を削除する定期処理、操作できない二つの画面。「触れたときに払う」としては:インデックスのない患者の検索(患者のモジュール)、予約ごとに一回クエリを投げるその日のアジェンダの参照(アジェンダのモジュール)、冪等でないリマインダーの送信(メッセージのモジュール。バグの手がかりだ)。「待てる」としては:既知の脆弱性のない古い依存関係と、三か所に重複した日付の整形のコード。

レッスン N4 — 安全ベルト

理解すべきこと。 この道の硬いゲートだ:安全ベルトが緑になるまで、機能の一行も変えない。安全ベルトには五つの部品がある:匿名化されたデータを持つテスト環境、繰り返せるデプロイ、コードの外に出してローテーションした秘密、あるものを走らせる継続的インテグレーション、そして特性化テスト群。最後のものはレッスン8を裏返したものだ:テストは緑で生まれる。システムが今日していることを、欠陥も含めて捉えるからだ。そして役に立つことの証明は、わざとフローを壊したときに赤になることだ。そのミューテーションによる赤がなければ、何も見ていないから通るテストだ。

プロンプトを送る前に、あなたの手で、オーナーとともに:

  • docs/ENVIRONMENTS_SURVEY.md。エージェントがN2で印付きで起草し、あなたが完成させるもの:テスト環境がどこで動くことになるか(コースでは無料のサービスかあなたのマシンのコンテナで足ります)、今日どうデプロイしているか、秘密はサーバーのどこに住むことになるか。
  • 責任者との匿名化の決定:患者の氏名、電話、メール、身分証は偽の値に置き換え、日付と数量は保つ。法律上の義務であって技術的な細部ではありません。
  • 特性化のための重要なフローの一覧:責任者の五つ。
  • あなたのマシンで復元されたバックアップ(N0の条件)。やっていないなら今やること:エージェントは本番のデータベースをコピーするので、戻り道があると知っている必要があります。
  • サーバーへの読み取り専用アクセスと、テスト環境の場所への書き込みアクセス。認証情報はチャットの外に。
  1. これを貼ること:

We are going to build the safety belt around this system before changing anything in it. Read the environments survey, docs/AUDIT_[date].md and docs/SEMANTIC_TREE.md. Evaluate whether you have what is needed (read access to the server where it runs and to its database, write access to where the test environment will run, the way it is deployed today); if anything is missing, ask me before starting. Then set up, without touching any functionality: (1) a test environment that runs the system exactly as production does, with a copy of the data where the personal fields I listed are anonymized; (2) a reproducible deployment to that environment, run twice, showing me that the second run changed nothing; (3) every secret found in the repository or in the code moved to the server configuration (environment file or vault), with the list of what you moved so that I rotate each one; (4) continuous integration running whatever test suite exists today, even if it is a single smoke test, on every push; (5) docs/GATES.md with the gates of this project, including: nothing reaches the test environment without the characterization suite green, and nothing reaches production without the full suite green with the exact version. Document all of it in docs/DEPLOYMENT.md so that a person can do it by hand without you. Take a screenshot of the system running in the test environment and show it to me. Reply in my language.

  1. 行き来のある長い作業だ。スクリーンショットを見せられたら、あなた自身がURLを開くこと:データの入ったTurnosが見えなければならない。本物の患者を名前で探すこと:いてはいけない。
  2. 渡された一覧の秘密をそれぞれローテーションすること。あなたが、しかるべき管理画面で、今日。

プロンプトを送る前に(テスト群のプロンプト):あなたが開いたテスト環境、ローテーションした秘密、そしてプロンプトの穴のための五つの重要なフローの一覧。

  1. これを貼ること:

We are going to write the characterization tests of these critical flows: [load an appointment; cancel an appointment; the reminder reaches the patient; search a patient; download the monthly sheet]. A characterization test captures what the system does today, exactly as it does it, defects included; it is not a test of what the system should do. For each flow: drive it from the screen as a user would and check the effect in the backend (the row, the state, the message queued). Every test must pass against the current code. Then prove that each test actually watches its flow: break the flow deliberately with a temporary change, show me the red output, revert the change, show me the green. If a flow cannot be driven from the screen, do not simulate it: say so and open a pending item marked as blocking. If while writing these tests you find behaviour that looks wrong, do not fix it: add it to docs/DISCREPANCIES.md with the evidence. Record the command to run the suite in docs/STATUS.md, and make the suite the gate for the test environment as docs/GATES.md says. Reply in my language.

求めているのは、緑で生まれてミューテーションによる赤で役に立つことを証明するテスト。操作できないものを模擬することは一切なし。そして悪く見えるものは、直すのではなく食い違いとして書き留めること。

  1. 操作できない二つの画面(N0のブロックする保留項目)はここで、テスト群の前かその一部として解決する:レッスン8のルーチンでその保留項目を閉じ、その後にそれらのフローの特性化テストを書くよう頼むこと。
  2. あなた自身が docs/STATUS.md のコマンドでテスト群を走らせること。緑でなければならない。

完全性の検証。 テスト環境を開いて、本物の名前が見つからなかったか? デプロイは二度走り、二度目は何も変えなかったか? リポジトリでの秘密の検索は空で返ってきて、見つかったものをローテーションしたか? 五つのフローのそれぞれに自分のテストとミューテーションによる赤が見えているか? あなた自身がテスト群を走らせたか?

提出物。 匿名化されたデータで動いているテスト環境、docs/DEPLOYMENT.md、 docs/GATES.md、ローテーションした秘密、緑の継続的インテグレーション、そして五つの赤を実証した緑の特性化テスト群。

典型的な誤り。 テスト群を「後で」回してバグを直し始めること:中途半端な安全ベルトは、動いていたものを壊す原因の第一位だ。匿名化されたコピーではなく「見本の」テストデータ:レガシーのバグは実データの中に住んでいる(Turnosの二重のリマインダーは特定の患者でしか現れない)。そして秘密をローテーションせずに移すこと:gitの履歴の中にあったのだから、もう秘密ではない。

ガイドプロジェクトでは。 リマインダーの特性化テストが最も面白い:夜の処理が翌日の予約ごとに一通のメッセージを偽の受信箱へ送ることを捉え、通る。それを書いているあいだに、処理が二度走れば二度送ることにエージェントが気づき、証拠とともに食い違いとして書き留める。バグの手がかりであり、まだ直さない:現在の挙動がレッスンR1まで仕様だ。ミューテーションによる赤:エージェントがメッセージをキューに入れる行をコメントアウトし、テストが落ち、コメントを外し、通る。

レッスン N5 — コードからの錠と生産者・消費者の地図

理解すべきこと。 レッスン14と8を、既に存在するものの上に棚卸しで行う。何かを変える前に。エージェントは、システムが外へ向けてすると業務が覚えているよりも多くのものをコードの中に見つける:送信、削除、夜の処理。二つの一覧の比較が結果だ。そして各錠は「今」か「触れたとき」かの提案を帯びる:メッセージを送るものの上の錠は今行く。月次の書き出しの上のものは、そのモジュールに触れるブロックまで待てる。

プロンプトを送る前に、あなたの手で、オーナーとともに:

  • docs/INITIAL_SURVEY.md に、システムが外へ向けてすると責任者が知っていることの一覧:彼女によれば、リマインダーを送る、それだけ。
  • サーバーの定期タスクへのエージェントのアクセス。
  • リポジトリの外に住むものの一覧(月次の表計算)、地図のために。
  • N4のテスト環境が動いていること。
  1. これを貼ること:

Go through the code, the database triggers and the scheduled jobs of the server looking for everything that charges, sends, approves, deletes, notifies outwards or runs on a schedule, and write docs/CONSEQUENTIAL_ACTIONS_SURVEY.md with every statement tagged by its source. Compare it with the list the business wrote in docs/INITIAL_SURVEY.md: whatever the code does that the business did not list, or the other way round, ask me about before going on. For every action: what triggers it, whether it can run twice, whether it is reversible, what lock exists today if any, and what the way back is. In the same pass, build docs/PRODUCER_CONSUMER_MAP.md: for every contract in the system (a service, a table, a file format, a list of values), who produces it and who consumes it, including the things outside the repository I told you about. If there are parts you cannot see, say so instead of leaving them out. Present me the actions table with a proposed lock for each (explicit confirmation, double safety, dry-run mode, daily limit, a human in the loop) and a proposal of which locks go NOW, before any change, and which can go when the module is touched. Do not implement anything yet: I confirm lock by lock. Reply in my language.

  1. 責任者と錠を一つずつ確認すること。そしてそれぞれの「今」か「触れたとき」の印も。

プロンプトを送る前に(締めのプロンプト):行ごとのあなたの判定を書き込んだ表と、プロンプトの穴のための「今」の錠の一覧。

  1. レッスン14の締めのプロンプトで、「今」の錠だけを列挙して締めること。残りは印とともにバックログに残る。

完全性の検証。 エージェントの一覧は責任者のものより行動が多いか?(同じなら、定期タスクを見ていない。)「今」の錠はそれぞれ、錠のないバージョンに対する赤のテストを持つか?月次の表計算は消費者として地図に載っているか?

提出物。 docs/CONSEQUENTIAL_ACTIONS_SURVEY.md、docs/PRODUCER_CONSUMER_MAP.md、「今」の錠を実装し検証した docs/LOCKS.md。

典型的な誤り。 「ついでだから」とすべての錠を今実装すること:二つの速度のルールの違反であり、顧客が頼んだバグに充てられない時間だ。

ガイドプロジェクトでは。 エージェントは責任者が列挙しなかった三つの行動を見つける:古いキャンセル済みの予約の夜間の削除、予約がキャンセルされたときにシステムが専門職へ送るメール(彼女は知らなかった)、そして表計算を養う書き出し。「今」の錠:夜間の削除は彼女が決めるまでドライランモードに移り(削除したはずのものを記録する)、リマインダーの送信は一日の上限を受け取る。「触れたとき」:送信の冪等性(メッセージのモジュール、バグと一緒に入る)、キャンセルでの確認(アジェンダのモジュール)。地図には六つの契約があり、月次の表計算は予約のテーブルの消費者だ:誰かが列を一つ変えたら、表計算は黙って壊れる。

レッスン N6 — 実数でサイジングする

理解すべきこと。 レッスン3に利点が一つ:一次のデータはデータベースとログの中にある。聞くのではなく、テスト付きの計器で測る(レッスン7)。責任者が提供するのはどこにもないものだけだ:どれだけ成長すると見込むか、そしてシステムを他の診療所に売るのか。

プロンプトを送る前に、あなたの手で:

  • 本番データベースへの、またはN4の完全なコピーへの読み取り専用アクセス(匿名化は日付も数量も触っていません)、そしてアクセスログへの読み取り専用アクセス。
  • 業務の二つの答え:見込む成長(「今と同じ、せいぜい専門職が一人増えるくらい」)と「十倍」(「うまくいったら、姉がもう一つ診療所を持っている」)。
  • 計器のテストのための既知の事例:専門職の人数、三人。
  1. これを貼ること:

Before changing anything we are going to size this system with its real numbers. With read-only access to the production database (or the complete test copy) and to the logs, measure instead of asking: rows per table and growth per month from the timestamps, events per entity, peak concurrency from the access logs, data size today and projected at five years, and the slowest queries. Write a meter for each number (a script that lives in the repository, with a test against a known case I will give you) and show me every number together with the command that produces it; audit each meter in both directions (is everything that should be counted, counted? does everything counted exist?). Write docs/VOLUME_SURVEY.md with every figure tagged [database] or [log], and ask me only for what cannot be measured: the growth the business expects and whether the system will serve more than one site. Then write docs/SIZING.md: what breaks first if everything is multiplied by ten, which of the current architecture choices hold and which do not, and which asymmetric decisions we take now, before evolving, because they are cheap today and expensive later. Do not change any code. Reply in my language.

  1. あなた自身が計器を一つ走らせること(例えばテーブルごとの行数のもの)。同じ結果が出なければならない。計算を一つ手でやり直すこと。

プロンプトを送る前に(締めのプロンプト):一致したやり直しの計算、そして「十倍」に耐えないものがあれば、それについてのあなたの決定。

  1. レッスン3の締めのプロンプトで、提案された選択肢から選ぶか、現在のもので耐えると確認して締めること。

完全性の検証。 計器のない一次の数字はあるか? 一つあなたが走らせたか? 「十倍」は書かれているか?

提出物。 印付きの docs/VOLUME_SURVEY.md、テスト付きの計器、docs/SIZING.md。

典型的な誤り。 「データベースが大きすぎて数えられないので、十万くらいと推定します」を受け入れること。大きいデータベースはクエリで数える。それが計器だ。

ガイドプロジェクトでは。 二年で二万件の予約、月に千件でゆっくり増えている。メッセージは六万件。ピークで利用者二人。データベースの占有は小さい。最も遅いクエリは名前による患者の検索(インデックスなし、監査が既に言っていた)。「十倍」はその検索と、予約数に比例して時間のかかる夜間の送信を除いて、すべてで耐える。非対称な決定:メッセージ送信のインターフェースにキューを持たせる。今日は不要でも、手付金(レッスンR2)が同じ経路を使うからだ。

レッスン N7 — 顧客の依頼と対にした正常化のバックログ

理解すべきこと。 レッスン5に二つの列を加えたもの。負債(監査、食い違い、画面、未実装の錠、サイジングの決定)と顧客の依頼(失敗しているもの、足りないもの)が同居する一つのキュー。各保留項目は速度の印と種類を持ち、顧客の各保留項目は、同じモジュールに触れていて一緒に払うとよい正常化の保留項目の一覧を持つ。それが「触れたときに払う」のルールを運用可能にしたものだ。

プロンプトを送る前に、あなたの手で、オーナーとともに:

  • この段階に対する顧客の依頼を、docs/blocks/STAGE_01_REQUEST.md に、責任者の言葉で二つの一覧にして。失敗しているもの:「リマインダーが時々二度届いて、時々届かない。先週の患者三人のスクリーンショットがある」。足りないもの:「初診の予約で支払いリンクの手付金を求めたい」「表計算を落とさずに今月の数字を見たい」。
  • N2からN6までのすべての成果物が締め済みであること。どれかが欠けているならこのプロンプトを開かないでください。
  • N0、N3、N4のブロックする保留項目が閉じていること。
  1. これを貼ること:

We are going to turn the normalization and the client's request for this stage into one queue of numbered pending items in docs/PENDING.md, each with its full specification as the method asks (number, title, node of the semantic tree, origin, description, business rules with decision and date or marked as missing, data in and out, screens, edge cases, acceptance criteria as given, when, then, how it will be verified, status). Sources for the normalization items: docs/AUDIT_[date].md, the discrepancies I decided to change, the screens that cannot be driven by a program, the secrets to rotate, the locks that are not implemented yet, and the decisions in docs/SIZING.md; each one keeps its speed mark: BLOCKS, PAID WHEN TOUCHED, or CAN WAIT. Sources for the client's items: the client's request for this stage; each one marked CORRECTIVE (something that fails today, with the way to reproduce it in the client's words) or EVOLUTIVE (something new). For every client item, list the normalization items that touch the same modules and should be paid together with it. If the request is ambiguous on any point such that you cannot write a verifiable item, ask me; do not resolve it by assuming. Order: blocking items first, then the client's items in the priority I gave you, each with its paired normalization. Reply in my language.

  1. 顧客の各保留項目の仕様を、責任者になったつもりで読むこと。レッスン5と同じだ。そして対を見直すこと:その依頼とともにその負債を払うのは理にかなっているか?
  2. 約束に、レッスン5の各セッションのルーチンを変更なしで加えること。

完全性の検証。 「ブロックする」が開いたまま残っているか? 各修正は顧客の言葉で再現の仕方を言っているか? 顧客の各保留項目に対のものがあるか?

提出物。 すべてを入れた docs/PENDING.md と、約束の中のルーチン。

典型的な誤り。 「待てる」に五十の保留項目があるバックログ:一覧に変装した書き直しだ。払われないものは保管庫へ送って、そう言うこと。そして「小さいから」とブロックするものを開いたまま最初のブロックを開くこと。

ガイドプロジェクトでは。 Turnosのバックログには顧客の保留項目が三つ残る:二重のリマインダー(修正、メッセージのモジュール、送信の冪等性とサイジングのメッセージのキューと対になる)、手付金(進化、支払いの新しいモジュール、同じ画面に触れるのでキャンセルでの確認と対になる)、そして月次の報告(進化、報告のモジュール、患者のインデックスと、置き換えられる表計算の契約と対になる)。そして正常化のものが十二ほど、うち三つは「待てる」で、そう言われている。


レガシーの上のループ:レッスンR1とR2

レッスン R1 — 最初のブロック:バグを、修正モードで

理解すべきこと。 修正の保留項目は既知のバグだ。レッスン8では赤は作り出された。ここでは赤はバグそのものだ:報告したユーザーのようにフローを操作して失敗を再現するテストが、現在のコードに対して失敗しなければならない。失敗しないなら、別のバグを再現したのだ。その赤は正しいものを直していることの証明であり、「起きているに違いないこと」についてのエージェントのどんな説明よりも価値がある Ref. 22。そして根本原因は触れる前に散文で言われる。根本原因が誰も書かなかった業務ルールであることが時々あり、それを決めるのはあなただからだ。

プロンプトを送る前に、あなたの手で:

  • docs/PENDING.md の中の修正の保留項目を、責任者の言葉による再現とともに。そして具体的な事例:先週の三つのスクリーンショット、患者の名前(テストでは偽のもの)と日付付きで。事例がなければテストはありません。
  • 緑の特性化テスト群、コマンドは docs/STATUS.md に。
  • この保留項目の対のもの、その中に列挙されていること。
  • 今日あなたが業務の質問を一つすると責任者に知らせてあること。
  1. 各セッションのルーチンでブロックを開くこと:エージェントがどの保留項目を取るか宣言し、仕様を読み直す。
  2. これを貼ること:

This pending item is a correction: [some patients receive the reminder twice and some receive none; three cases from last week are attached in the item]. Before changing anything: (1) Reproduce the failure with a test that drives the flow from the screen and checks the effect in the backend, and show me that it fails against the current code; that red is the proof that you reproduced the right defect. If you cannot reproduce it, tell me what you tried and what you need; do not fix what you cannot see. (2) Find the root cause and tell me in prose, with the evidence, before fixing. If the root cause is a business rule nobody wrote down, stop and ask me. (3) Fix at the root, not where it hurts, and nothing else: anything else you find goes to a pending item. (4) Show me the test green, the characterization suite still green, and the regression of the neighbouring items. (5) If the fix changes a current behaviour that someone may depend on, say so explicitly: that is a decision for me, not a side effect. Close the paired normalization items of this module in the same block, each with its own evidence. The commit message says "proved red against [version]" and the test counts. Reply in my language.

求めているのは、診断の前の再現、触れる前の散文による根本原因、根とそれだけ、システム全体の回帰としての特性化、そして挙動の変更があなたの決定であること。

  1. 修正を許可する前に根本原因を読むこと。業務ルールを聞かれたら、責任者と決めて、レッスン6の締めの形式で答えること。
  2. 締めに:あなた自身が特性化テスト群を走らせること。そしてテスト環境でしばらく、受付係のようにシステムを使うこと:人間による目視は委譲しない。

完全性の検証。 バグを再現するテストの赤を、数字とともに見たか? 根本原因は修正の前に散文で書かれていたか? 特性化は緑のままか? 対のものはそれぞれ自分の証拠とともに閉じたか?コミットは「赤で証明」と言っているか?

提出物。 完全なルーチンで閉じたバグ、閉じた対のもの、そしてバグのテストで拡張された特性化テスト群。

典型的な誤り。 根本原因を読まずに修正を許可すること:Turnosでは、エージェントの最初の仮説はたいてい「処理が二度走っている」で、それは真実の半分だ。そして「ついでだから」とメッセージのモジュールを片付けさせること:ルール7だ。

ガイドプロジェクトでは。 テストは、予定変更された予約で二重の送信を再現する:夜の処理は翌日の予約の行ごとに一通のリマインダーを送り、予定変更された予約には行が二つある(どの画面も表示しない「予定変更済み」の状態の古い行と、新しい行)。一度も受け取らないのは、送信の後に予定変更された人たちだ。根本原因:レッスンN2で現れた「予定変更済み」の状態。業務の質問:「予定変更された予約は新しい予約か、同じ予約か?」。責任者が決める:同じ予約、履歴付きで。根での修正は送信ではなく状態に触れる。対になった冪等性は同じブロックで払われる。赤は「予約1件に対してメッセージ2通」と言い、緑は「予約1件に対してメッセージ1通」と言う。そして挙動の変更が申告される:予定変更された予約が月次の表計算に二度現れなくなる。表計算はテーブルの消費者だからだ。責任者がそれを承認する。

レッスン R2 — 二つ目のブロック:手付金を、進化モードで

理解すべきこと。 古いものの上の新しいものは、第一部のレッスン5から12そのままに、完全な方法で構築する:保留項目の中の仕様、日付付きの決定、赤のテスト、エンドツーエンドの検証、誠実な報告。違いは二つ。近隣の回帰はシステム全体であり、それを言うのは特性化テスト群だ。そしてブロックがあるモジュールに入るとき、そのモジュールの「触れたときに払う」と印された正常化の保留項目が、自分の証拠とともに一緒に入る。レガシーが古いモジュールにしたことを、新しいモジュールにしてはいけない。

プロンプトを送る前に、あなたの手で:

  • docs/PENDING.md の中の手付金の進化の保留項目を、あなたが読んだ完全な仕様、その対のもの、そして責任者が既に取れる業務の決定とともに:どの予約に手付金が付くか、いくらか、払われなかったらどうなるか。
  • 帰結のある行動の調査(N5)に「手付金を請求する」の行を加えたもの。世界へ作用する新しい行動だからです:レッスン14と同じく、構築の前に錠を。
  • 緑の特性化テスト群。
  1. レッスン5の開始のプロンプトで、手付金の依頼についてブロックを開き、責任者として仕様を読むこと。
  2. 構築の前に、錠:「手付金を請求する」の行動について、レッスン14の締めのプロンプトを、まずドライランモードで貼ること。
  3. レッスン8のルーチンで、保留項目ごとに、対のものを同じブロックに入れて構築すること。
  4. ブロックの締めに:完全なエンドツーエンドのテスト群(特性化のものに新しいテストを加えたもの)を、レッスン8のブロックの締めのプロンプトで。そしてあなたがシステムを使うしばらくの時間。

完全性の検証。 手付金には、請求が存在するより前に赤のテスト付きの錠があるか? ブロックの後も特性化は緑のままか? モジュールの対のものは払われたか? 古いモジュールで、保留項目なしに「改善」されたものはないか?

提出物。 テスト環境でドライランモードで動いている手付金、その仕様、その錠、そのテスト、そのエンドツーエンドの検証とともに。そして閉じた対のもの。

典型的な誤り。 収まりがいいからと「残りと同じやり方で、速く」手付金を構築すること:新しいモジュールは常に完全な方法とともに生まれる。そして「支払いリンクであって我々が請求するわけではない」と錠を忘れること:リンクは患者に送られる。それは外へ向かう行動だ。

ガイドプロジェクトでは。 手付金はリマインダーと同じ経路を使い、その経路には今やキューがある(N6の非対称な決定が独りで元を取っている)。錠:受付係の明示的な確認と専門職が定めた金額。しばらくのドライランモードで「手付金を求めたはずの相手」を記録する。キャンセルの画面の対のもの(確認)は、手付金がキャンセル時に起きることを変えるので、このブロックで払われる。締めに、テスト群は七つのフローを走る:特性化の五つ、R1のバグのもの、そして手付金のもの。


その後:本番リリースと運用

ここからは、レガシーは方法を持つシステムであり、第一部のレッスン13から22がそのまま当てはまる。注記が四つ。一つ目は運用品質の六つの段についてだ:最低限の可観測性と脆弱性の走査はもう安全ベルトとともに入っており、永続化の計測はもうN6にあり、負荷テストはその量で最初のデプロイの前に走らせる。二つの監視は最初の読みを基準線として始まり、初日にもう悪かったものはその印とともに保留項目になる。残り三つの注記はこれだ。レッスン13の監査はN3のものと比べる:負債をどれだけ払い、どれだけ残っているか。レッスン20のマニュアルはレガシーには存在しないことが多く、あるがままのシステムと、今や本当にやったことを文書化している閉じた保留項目から生成する。そしてレッスン23の振り返りにはこの道固有の質問がある:正常化にいくらかかったか(時間で、トークンで、最初の変更までの段階数で)、そして「待てる」と印した負債のうち、結局同じだけ高くついたのはどれか。その答えが、次の版でこのパートの順序を修正することになる。

正常化の区間の修了リスト

オーナーがコードを読まずに検証する、最初のブロックを開く前の八つの条件。進化・修正の道のページのものと同じだが、このパートの提出物なのでここで繰り返す。

  1. 前の段階のすべての入力(調査、適格性、約束、プロジェクトファイル、ツリー、環境、ボリューム、サイジング、ゲート)が出所の印付きで存在し、オーナーが推定の各ノードを確認した(N2)。
  2. 各食い違いに日付付きの決定があり、システムを変えるものには保留項目がある(N2)。
  3. 監査が存在し、各発見に速度の印がある(N3)。
  4. 安全ベルトが緑:匿名化されたデータを持つテスト環境、二度走ったデプロイ、外に出してローテーションした秘密、継続的インテグレーション、ミューテーションによる赤を実証した特性化テスト群(N4)。
  5. すべての帰結のある行動に判定があり、「今」の錠に赤のテストがある(N5)。
  6. 一次の数字が計器とテストとともに計測されていて、「十倍」が書かれている(N6)。
  7. 「ブロックする」が一つも開いておらず、顧客の各保留項目に対のものがある(N7)。
  8. 約束にレガシーの五つのルールがあり、新しいセッションが読み取りテストを通る(N1、N2)。

付録 — このパートにまだないもの