ライフスタイル
実践:既存プロジェクトを保守する
現状を記録し、一つの変更を実施して回帰確認と引き継ぎを残します。
読了目安 15 分 · 操作 30 分

Codex 学習目次に戻るCodex 学習ガイド:全記事の目次導入と最初のタスクから MD の指示、高度な連携まで、60 レッスン・十単元を予定しています。習熟度、環境、目的、コマンドで次の記事を探せます。未公開の記事には状態を表示します。記事全文を読む
目標と開始地点
この段落の教材・資料: 教材 · コード地図既存のコードベースを理解する読み取りで入口、データの流れ、テストを探し、ファイルに基づくプロジェクト地図を作ります。記事全文を読む · Git 復元Git・ブランチ・差分・復元Git は履歴、ブランチは変更のまとまり、diff は差分を扱います。会話の再開ではファイルは復元されません。記事全文を読む
手順1:書換え前に基準を記録する
maintenance-lab の5ファイル index.html・style.css・app.js・core.mjs・core.test.mjs を確認し、node --test core.test.mjs の3合格と Node 版・日付・場所を記録します。異なれば start・broken を使っていないか調べ、既存失敗を今回の責任にしません。ローカル Git 基準コミットか完全 baseline コピーを保存してから変更し、復元点を確保します。
変更前の画面基準も作ります。このフォルダーで後述の画面回帰節にある OS 別プレビューコマンドを使い、練習専用のブラウザープロファイルと接続元 URL を使います。Show で All tasks を選び、既存データがないことを確認します。既存データがあれば先に保存し、消去せず別の新規練習プロファイルで空の状態から始めます。Read・Build を追加して Read を完了にし、1 active / 2 total を確認します。ブラウザー開発者ツールの Application/Storage → Local Storage から mokaair-codex-todo-v1 の架空 JSON を保存し、2件の ID と完了状態を記録します。この2件、URL、プロファイルを変更後の比較まで保ちます。続いてデスクトップアプリで maintenance-lab を開いてタスクを作るか、このフォルダーの別の端末で codex を実行してから次の依頼を送ります。
Codex に app.js の #count 更新を読み取り専用で見せ、全件か絞込後か説明させます。基準は Completed 選択中も全件の active/total です。保存鍵 mokaair-codex-todo-v1、version 1、ID、completed の真偽値も確認します。集計責務だけを移し、形式変更・移行は追加しません。先に読むことで似たコードを統合して細部を変える事故を防ぎます。
手順2:確認可能な変更範囲を決める
| 項目 | 今回の変更 | 不変条件 |
|---|---|---|
| core.mjs | 純 countTasks(tasks) を追加 | 入力変更・DOM・保存なし |
| app.js | #count に新関数を使う | 表示文と全件計数は同じ |
| maintenance.test.mjs | 計数・不変性試験 | 元 core.test.mjs は保持 |
| HTML/CSS | 変更不要 | 操作・配置・焦点を保持 |
| 保存資料 | 移行なし | key・version・ID・状態保持 |
小範囲でも検証は必要で、失敗と変更を結び付けやすくします。
手順3:まず失敗する新試験を加える
下記 maintenance.test.mjs を元試験の隣に保存して両方を先に実行します。関数未実装のため新3件は失敗し、元3件は合格します。欠如を検知できる証拠としてこの期待失敗を保存し、教材不良と思ったり試験削除で緑にしたりしません。入力は既存 Task 契約に従い、任意資料の整理へ範囲を拡げません。
import test from 'node:test';
import assert from 'node:assert/strict';
import * as core from './core.mjs';
test('empty list counts are zero', () => {
assert.deepEqual(core.countTasks([]), { active: 0, total: 0 });
});
test('count all tasks without deduplicating equal titles', () => {
const tasks = [
{ id: 'a', title: 'Read', completed: false },
{ id: 'b', title: 'Read', completed: true },
{ id: 'c', title: 'Build', completed: false },
];
assert.deepEqual(core.countTasks(tasks), { active: 2, total: 3 });
});
test('counting preserves frozen task data and storage compatibility', () => {
const task = Object.freeze({ id: 'a', title: 'Read', completed: true });
const tasks = Object.freeze([task]);
const before = core.encodeTasks(tasks);
assert.deepEqual(core.countTasks(tasks), { active: 0, total: 1 });
assert.equal(core.encodeTasks(tasks), before);
assert.deepEqual(core.decodeTasks(before), tasks);
});
node --test core.test.mjs maintenance.test.mjs
手順4:実装して差分を見る
Add countTasks(tasks) to core.mjs, returning {active, total} for the full list.
Use it in app.js when updating #count; keep the existing visible text.
Preserve storage format, key, IDs, task behavior and original tests.
Do not edit index.html, style.css or the new test expectations.
Run node --test core.test.mjs maintenance.test.mjs.
Report changed files, test results and remaining browser verification.
完了後は6試験合格です。参考関数は下記で、app.js が import して render 内の tasks を数え、元と同じ文字を作ります。絞込済み shown を渡すと Completed の総数が誤るため特に確認します。git diff や編集差分で元試験・HTML・CSS・保存処理が不変か見ます。純関数の合格だけでは画面との接続確認を代替しません。
export function countTasks(tasks) {
return {
active: tasks.filter((task) => !task.completed).length,
total: tasks.length,
};
}
app.js の既存 import に countTasks を加え、元の六関数を残します。render 内の #count.textContent 代入行だけを二つ目の断片へ置き換えます。先の shown 絞込みを含む他の render は保持します。指定位置の断片であり、完全な app.js ではありません。
import { countTasks, addTask, toggleTask, removeTask, visibleTasks, decodeTasks, encodeTasks } from "./core.mjs";
const counts = countTasks(tasks);
document.querySelector("#count").textContent = `${counts.active} active / ${counts.total} total`;
引数が tasks か確認します。Read 完了、Build 未完了なら Completed の shown は一件です。shown を渡すと本来の 1 active / 2 total でなく 0 active / 1 total になります。六つのコアテストは関数契約だけを検査するため成功し得ます。接続と画面の別検証を残します。
手順5:画面と保存資料の回帰確認
変更前と同じ練習サーバーが動いていれば、その URL を再読込して使い、二つ目を起動しません。停止済みの場合だけ次のコマンドを使います。同じ場所で Windows は py -3 -m http.server 4173 --bind 127.0.0.1、macOS/Linux は python3 -m http.server 4173 --bind 127.0.0.1 を使い、同じ http://127.0.0.1:4173 を開きます。占用なら停止前に既存サービスを確認します。前後で同じ origin・架空タスクを使い、ポート違いの空 localStorage を資料消失と混同しません。変更前の Read・Build をリセットも再追加もせず保持し、保存した ID と完了状態を基準と照合してから、All tasks・Active・Completed 全てで1 active / 2 totalを確認します。
再読込で2件・ID・完了状態の保持を確認します。同じ2件で先に390pxとデスクトップ幅の両方のフィルターと統計を確認します。その後 All tasks を選んで Read を一度だけ削除し、1 active / 1 total と Tab の可視フォーカスを検証します。回帰確認なので新しい設計図は不要です。絞込で数が変われば app.js 引数、関数自体が誤れば新試験の失敗から調べます。実観察後だけブラウザー合格とし、未操作 OS は別記します。
復元と引継ぎ
撤回は差分保存後、今回の core.mjs・app.js だけを復元し、自分の新 maintenance.test.mjs を別保存します。元3試験と統計画面で基準に戻ったか確認し、プロジェクト全体の強制リセットで他者の編集を消しません。引き継ぎには基準、抽出責務、不変契約、6試験、実画面検証、復元場所を記し、未実行を合格にしません。次の保守はコンテキストの引き継ぎコンテキストと作業の引き継ぎ長い作業には判断と証拠を残します。README は使い方、設計書は理由、引き継ぎは進捗、AGENTS.md は継続する規則に分けます。記事全文を読むで別範囲とし、保存層や framework 置換をついでに加えません。 確認後は自分のプレビュー端末で Ctrl+C を押して今回のサーバーを止め、基準 JSON と検証記録を保持します。
Codex 学習目次に戻るCodex 学習ガイド:全記事の目次導入と最初のタスクから MD の指示、高度な連携まで、60 レッスン・十単元を予定しています。習熟度、環境、目的、コマンドで次の記事を探せます。未公開の記事には状態を表示します。記事全文を読む
詳しい説明を読む
Three numbered stages: identify the starting point, perform the exercise, and verify the result. Original illustration, not a product screenshot.
同じテーマの記事
ライフスタイル
Codex 学習ガイド:全記事の目次
導入と最初のタスクから MD の指示、高度な連携まで、60 レッスン・十単元を予定しています。習熟度、環境、目的、コマンドで次の記事を探せます。未公開の記事には状態を表示します。
ライフスタイル
Worktree とタスクの分離
Worktree は一つの Git リポジトリに別ブランチの作業場所を作ります。ファイルは分かれても DB、ポート、外部サービスは共有される場合があります。
ライフスタイル
実践:小さな Web サイトを作る
brief.md から Small Steps のタスクサイトを計画・制作し、追加、完了、削除、絞り込み、ローカル保存を実装します。HTML、CSS、データ関数、画面イベント、テストを分け、Node とブラウザーで検証して再起動・復元の手順を残します。
ライフスタイル
使用量と効率:やり直しを減らす
条件、モデル設定、時間、成果を記録し、不要な再試行と過剰な文脈を減らします。
この記事を引用している記事
最新の旅の情報・ガイド

ガイド東京
東京ではどのエリアに泊まる?新宿・上野・東京駅・渋谷・浅草・池袋・銀座の七エリア比較。空港アクセス、宿泊税、荷物配送も解説
東京ではどのエリアに泊まる?新宿、上野、東京駅、渋谷、浅草、池袋、銀座の七エリアを同じ基準で比較。成田・羽田空港からのアクセス、利用できる路線、周辺にあるもの、街の雰囲気、向いている人を、比較表と山手線の概略図とともに紹介します。2026年9月に確認した東京都の宿泊税(2027年4月から3%)と、空港宅急便で荷物を送る際のルールも解説します。
- 予算
- ホテル

ガイド東京
東京の交通パスの選び方:Suica/Welcome Suica、Tokyo Subway Ticket、JR Passは買うべき?
初めての東京では、まず一人一枚ICカードで都度払い(Welcome Suicaはデポジット不要、有効期間28日)。一日に地下鉄へ4回以上乗るならTokyo Subway Ticketの72時間券2,000円を追加し、関西へ行かず東京だけならJR Passは必ず割高です。TOURIST PASMO、iPhoneのSuica、東京メトロ一日乗車券で乗れる路線・乗れない路線を決定チャートで比較。価格は2026年9月に確認。
- 交通
- 予算

ガイド東京
東京ディズニーランド・シー攻略:チケット料金、ファンタジースプリングス、ディズニー・プレミアアクセス(DPA)とスタンバイパスの使い方、初めてならどちらを選ぶ?
東京ディズニーの一日パスポートは変動価格制で、2026 年 9 月は平日の多くが 9,900 円、週末が 10,900 円。公式サイトでは毎日 14:00 に二か月後の同日分を発売します。無料のプライオリティパスは公式サイトのサービス一覧に載っておらず、待ち時間を短縮できるのは有料のディズニー・プレミアアクセス(一人一回 1,000~3,500 円)のみ。運営時間、25 周年イベント、スタンバイパス、エントリー受付、ファンタジースプリングスの利用方法、初回にランドとシーのどちらを選ぶかも解説。2026 年 9 月に公式サイトで確認しました。
- モデルコース
- 家族向け
出典
- Codex prompting · 確認日:
- Git worktree guidance · 確認日: